@s_s/harmonia 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +396 -2
  2. package/build/cli/setup.d.ts +21 -0
  3. package/build/cli/setup.js +71 -0
  4. package/build/cli/setup.js.map +1 -0
  5. package/build/core/dispatch.d.ts +10 -0
  6. package/build/core/dispatch.js +21 -0
  7. package/build/core/dispatch.js.map +1 -1
  8. package/build/core/docs.d.ts +13 -0
  9. package/build/core/docs.js +32 -0
  10. package/build/core/docs.js.map +1 -1
  11. package/build/core/registry.d.ts +1 -1
  12. package/build/core/registry.js +5 -16
  13. package/build/core/registry.js.map +1 -1
  14. package/build/core/schema.d.ts +38 -0
  15. package/build/core/schema.js +187 -0
  16. package/build/core/schema.js.map +1 -0
  17. package/build/core/state.d.ts +11 -1
  18. package/build/core/state.js +23 -2
  19. package/build/core/state.js.map +1 -1
  20. package/build/core/steps.d.ts +34 -0
  21. package/build/core/steps.js +113 -0
  22. package/build/core/steps.js.map +1 -0
  23. package/build/core/types.d.ts +81 -4
  24. package/build/core/workflow.d.ts +26 -6
  25. package/build/core/workflow.js +88 -11
  26. package/build/core/workflow.js.map +1 -1
  27. package/build/hooks/claude-code.d.ts +20 -0
  28. package/build/hooks/claude-code.js +218 -0
  29. package/build/hooks/claude-code.js.map +1 -0
  30. package/build/hooks/content.d.ts +43 -0
  31. package/build/hooks/content.js +109 -0
  32. package/build/hooks/content.js.map +1 -0
  33. package/build/hooks/install.d.ts +40 -0
  34. package/build/hooks/install.js +63 -0
  35. package/build/hooks/install.js.map +1 -0
  36. package/build/hooks/openclaw.d.ts +24 -0
  37. package/build/hooks/openclaw.js +219 -0
  38. package/build/hooks/openclaw.js.map +1 -0
  39. package/build/hooks/opencode.d.ts +29 -0
  40. package/build/hooks/opencode.js +226 -0
  41. package/build/hooks/opencode.js.map +1 -0
  42. package/build/index.d.ts +4 -7
  43. package/build/index.js +80 -42
  44. package/build/index.js.map +1 -1
  45. package/build/setup/inject.d.ts +22 -18
  46. package/build/setup/inject.js +42 -93
  47. package/build/setup/inject.js.map +1 -1
  48. package/build/setup/templates.d.ts +12 -16
  49. package/build/setup/templates.js +52 -69
  50. package/build/setup/templates.js.map +1 -1
  51. package/build/tools/approve-doc.d.ts +1 -1
  52. package/build/tools/approve-doc.js +4 -4
  53. package/build/tools/approve-doc.js.map +1 -1
  54. package/build/tools/dispatch-role.d.ts +2 -2
  55. package/build/tools/dispatch-role.js +41 -11
  56. package/build/tools/dispatch-role.js.map +1 -1
  57. package/build/tools/doc-tools.d.ts +11 -3
  58. package/build/tools/doc-tools.js +257 -13
  59. package/build/tools/doc-tools.js.map +1 -1
  60. package/build/tools/get-project-status.d.ts +4 -2
  61. package/build/tools/get-project-status.js +165 -50
  62. package/build/tools/get-project-status.js.map +1 -1
  63. package/build/tools/get-role-prompt.d.ts +2 -2
  64. package/build/tools/get-role-prompt.js +4 -4
  65. package/build/tools/get-role-prompt.js.map +1 -1
  66. package/build/tools/override-tools.d.ts +1 -1
  67. package/build/tools/override-tools.js +4 -4
  68. package/build/tools/override-tools.js.map +1 -1
  69. package/build/tools/project-init.d.ts +5 -1
  70. package/build/tools/project-init.js +92 -32
  71. package/build/tools/project-init.js.map +1 -1
  72. package/build/tools/report-dispatch.d.ts +6 -3
  73. package/build/tools/report-dispatch.js +45 -8
  74. package/build/tools/report-dispatch.js.map +1 -1
  75. package/build/tools/set-scale.d.ts +6 -0
  76. package/build/tools/set-scale.js +92 -0
  77. package/build/tools/set-scale.js.map +1 -0
  78. package/build/tools/setup-project.d.ts +1 -1
  79. package/build/tools/setup-project.js +33 -5
  80. package/build/tools/setup-project.js.map +1 -1
  81. package/build/tools/update-phase.d.ts +8 -3
  82. package/build/tools/update-phase.js +85 -20
  83. package/build/tools/update-phase.js.map +1 -1
  84. package/package.json +2 -1
  85. package/workflows/dev/roles/architect.md +1 -1
  86. package/workflows/dev/roles/pm.md +5 -5
  87. package/workflows/dev/roles/tester.md +1 -1
  88. package/workflows/dev/schemas/api-design.json +25 -0
  89. package/workflows/dev/schemas/data-model.json +20 -0
  90. package/workflows/dev/schemas/deploy.json +20 -0
  91. package/workflows/dev/schemas/fsd.json +25 -0
  92. package/workflows/dev/schemas/prd.completeness-check.json +24 -0
  93. package/workflows/dev/schemas/prd.draft.json +15 -0
  94. package/workflows/dev/schemas/prd.final.json +30 -0
  95. package/workflows/dev/schemas/prd.json +30 -0
  96. package/workflows/dev/schemas/prd.requirements.json +25 -0
  97. package/workflows/dev/schemas/project-plan.json +20 -0
  98. package/workflows/dev/schemas/prototype.json +4 -0
  99. package/workflows/dev/schemas/retrospective.json +20 -0
  100. package/workflows/dev/schemas/risk-assessment.json +15 -0
  101. package/workflows/dev/schemas/task-breakdown.coarse.json +15 -0
  102. package/workflows/dev/schemas/task-breakdown.dependencies.json +20 -0
  103. package/workflows/dev/schemas/task-breakdown.detailed.json +10 -0
  104. package/workflows/dev/schemas/task-breakdown.final.json +10 -0
  105. package/workflows/dev/schemas/task-breakdown.json +10 -0
  106. package/workflows/dev/schemas/tech-design.analysis.json +25 -0
  107. package/workflows/dev/schemas/tech-design.api-contract.json +20 -0
  108. package/workflows/dev/schemas/tech-design.draft.json +15 -0
  109. package/workflows/dev/schemas/tech-design.final.json +30 -0
  110. package/workflows/dev/schemas/tech-design.json +30 -0
  111. package/workflows/dev/schemas/test-plan.json +20 -0
  112. package/workflows/dev/schemas/test-report.json +25 -0
  113. package/workflows/dev/schemas/user-stories.json +10 -0
  114. package/workflows/dev/workflow.json +85 -5
package/README.md CHANGED
@@ -1,3 +1,397 @@
1
- # harmonia
1
+ # Harmonia
2
2
 
3
- 让不同角色和谐协作
3
+ > _众声喧哗之中,和谐不是沉默,而是各得其所。_
4
+
5
+ Multi-agent orchestration MCP server with pluggable workflows.
6
+
7
+ Harmonia 是一个基于 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 的智能体编排服务器。它为 AI 编程助手(Claude Code、OpenCode、OpenClaw、Codex)提供项目管理工具,让多个 AI agent 在预定义的工作流中按角色协作完成软件开发任务。
8
+
9
+ ## 核心理念
10
+
11
+ - **角色分离** — PM、架构师、开发者、测试各司其职,通过文档交接而非直接对话
12
+ - **流程驱动** — 预定义的阶段和文档类型确保不跳步骤
13
+ - **数据隔离** — 所有项目数据存储在平台数据目录(非项目源码目录),不污染代码仓库
14
+ - **可插拔工作流** — 工作流定义为 JSON,可扩展自定义
15
+
16
+ ## 特性
17
+
18
+ ### 工作流编排
19
+
20
+ - 5 个阶段:需求澄清 → 方案设计 → 开发 → 测试 → 交付验收
21
+ - 4 个角色:PM / 架构师 / 开发者 / 测试
22
+ - 15 种文档类型,按项目规模(small / medium / large)自动调整必选/可选
23
+ - 项目规模延迟设定 — PRD 审批后由 PM 设定,设定后不可更改
24
+ - 角色调度与报告机制(`role_dispatch` / `dispatch_report`)
25
+
26
+ ### 文档结构校验
27
+
28
+ 对文档内容进行结构化校验,包括 Markdown 标题结构和 JSON 字段/类型验证。每次 `doc_write` 时自动执行,确保产出物符合预期格式。
29
+
30
+ ### 工具访问控制
31
+
32
+ 基于 MCP tool 级别的硬性约束。为每个角色定义允许使用的工具白名单/黑名单,在 agent 层面强制执行,防止角色越权操作。
33
+
34
+ ### 覆盖配置体系(overrides.json)
35
+
36
+ 三层合并的配置覆盖系统,优先级:**项目级 > 全局级 > 工作流默认值**。
37
+
38
+ ```
39
+ <data_dir>/harmonia/overrides.json # 全局覆盖
40
+ <data_dir>/harmonia/<project_name>/overrides.json # 项目级覆盖
41
+ ```
42
+
43
+ 支持覆盖的配置项:
44
+
45
+ - **审批规则** — 控制哪些文档需要审批(review)
46
+ - `review: true` — 全局开启所有文档审批
47
+ - `review: { "prd": true, "tech-design": false }` — 按文档类型逐一配置
48
+ - 通过 `review_set_rule` 工具设置
49
+ - **角色配置** — 为每个角色指定 agent 类型和模型
50
+ - `agent` — 执行角色的 agent 类型(opencode / claude-code / openclaw / codex)
51
+ - `model` — 模型覆盖(如使用不同能力级别的模型)
52
+ - 通过 `guard_set` 工具设置
53
+ - **能力映射** — 将角色的抽象能力映射到具体工具
54
+ - `capabilities.{capId}` — 指定工具类型(skill / mcp)、工具名、服务器名、静态参数
55
+ - 通过 `guard_set` 工具设置
56
+
57
+ 示例 `overrides.json`:
58
+
59
+ ```json
60
+ {
61
+ "review": { "prd": true },
62
+ "roles": {
63
+ "developer": {
64
+ "agent": "opencode",
65
+ "model": "claude-sonnet-4-20250514",
66
+ "capabilities": {
67
+ "read_file": {
68
+ "type": "mcp",
69
+ "tool": "read_file",
70
+ "server": "filesystem"
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ ```
77
+
78
+ ### 跨 Agent 边界守卫
79
+
80
+ 为 AI 编程助手安装 hook 脚本,在工具调用前拦截越界操作:
81
+
82
+ - **Claude Code / Codex** — Shell hook,通过 exit code 阻断
83
+ - **OpenCode** — TypeScript plugin hook
84
+ - **OpenClaw** — handler.ts hook
85
+
86
+ 同时提供主动提醒机制,在角色提示词中注入当前约束上下文。
87
+
88
+ ### 逐步文档写入
89
+
90
+ 大型文档拆分为多个步骤(steps),每步独立写入并校验。支持:
91
+
92
+ - 每步独立的 JSON Schema 校验
93
+ - 步骤回滚(重写某步时自动清除后续步骤记录)
94
+ - `project_status` 中展示步骤进度
95
+
96
+ ## MCP 工具一览
97
+
98
+ | 工具 | 说明 |
99
+ | ------------------- | -------------------------------------------------- |
100
+ | `project_init` | 注册项目,创建数据目录,初始化工作流 |
101
+ | `project_set_scale` | 设定项目规模(PRD 审批后,不可更改) |
102
+ | `project_status` | 查看项目状态(无参数返回项目列表,有参数返回详情) |
103
+ | `phase_update` | 推进项目阶段 |
104
+ | `doc_write` | 写入文档(自动 schema 校验,支持逐步写入) |
105
+ | `doc_read` | 读取文档内容 |
106
+ | `doc_list` | 列出项目所有文档 |
107
+ | `doc_approve` | 审批需要 review 的文档(如 PRD) |
108
+ | `review_list` | 列出待审批的文档 |
109
+ | `review_set_rule` | 设置审批规则覆盖 |
110
+ | `role_prompt` | 获取角色提示词(含约束上下文注入) |
111
+ | `role_dispatch` | 调度角色执行任务 |
112
+ | `dispatch_report` | 角色报告任务完成状态 |
113
+ | `guard_set` | 设置角色的工具白名单/黑名单 |
114
+ | `guard_get` | 查看当前工具约束配置 |
115
+
116
+ ## 工作流结构
117
+
118
+ Harmonia 使用声明式工作流定义。内置的 `dev` 工作流(软件开发流程):
119
+
120
+ ```
121
+ clarify (需求澄清) → PM 产出 PRD、用户故事
122
+
123
+ design (方案设计) → 架构师产出技术方案、任务拆解
124
+
125
+ develop (开发) → 开发者按任务拆解编码实现
126
+
127
+ test (测试) → 测试编写测试、输出测试报告
128
+
129
+ deliver (交付验收) → PM 验收成果、输出复盘记录
130
+ ```
131
+
132
+ 每个文档类型可定义 **steps**(步骤),例如 PRD 的写入流程:
133
+
134
+ 1. `requirements` — 需求结构化(JSON)
135
+ 2. `completeness-check` — 完整性校验(JSON)
136
+ 3. `draft` — PRD 草稿(Markdown)
137
+ 4. `final` — PRD 最终版(Markdown)
138
+
139
+ ## 安装
140
+
141
+ ```bash
142
+ npm install -g @s_s/harmonia
143
+ ```
144
+
145
+ ## 快速开始
146
+
147
+ ```bash
148
+ harmonia setup --agent openclaw
149
+ ```
150
+
151
+ `harmonia setup` 一键完成:
152
+
153
+ 1. 注入 PM 提示词到 agent 配置文件(AGENTS.md / CLAUDE.md)
154
+ 2. 安装 agent hook 脚本(边界守卫 + 主动提醒)
155
+
156
+ 之后启动你的 AI 编程助手,PM 会自动通过 `project_init` 注册项目,通过 `project_status` 获取项目信息。
157
+
158
+ ### CLI 命令
159
+
160
+ ```
161
+ harmonia 启动 MCP stdio 服务器(供 agent 调用)
162
+ harmonia setup 初始化 agent 配置(注入提示词 + 安装 hook)
163
+ harmonia --help 显示帮助信息
164
+ harmonia --version 显示版本号
165
+ ```
166
+
167
+ `setup` 选项:
168
+
169
+ | 选项 | 说明 | 默认值 |
170
+ | ---------------- | ------------------------------------------------------------- | ---------------------------------------------------------- |
171
+ | `--agent <type>` | agent 类型:`opencode` / `claude-code` / `codex` / `openclaw` | 建议显式指定。省略时通过 cwd 和 `~` 下的配置文件自动检测。 |
172
+
173
+ ## 配置
174
+
175
+ 将 Harmonia 注册为 MCP 服务器。
176
+
177
+ <details>
178
+ <summary><strong>Claude Code</strong></summary>
179
+
180
+ 通过命令行:
181
+
182
+ ```bash
183
+ claude mcp add --transport stdio harmonia -- harmonia
184
+ ```
185
+
186
+ 或添加到 `.mcp.json`:
187
+
188
+ ```json
189
+ {
190
+ "mcpServers": {
191
+ "harmonia": {
192
+ "command": "harmonia"
193
+ }
194
+ }
195
+ }
196
+ ```
197
+
198
+ </details>
199
+
200
+ <details>
201
+ <summary><strong>OpenCode</strong></summary>
202
+
203
+ 添加到 `opencode.json`:
204
+
205
+ ```json
206
+ {
207
+ "mcp": {
208
+ "harmonia": {
209
+ "type": "local",
210
+ "command": ["harmonia"]
211
+ }
212
+ }
213
+ }
214
+ ```
215
+
216
+ </details>
217
+
218
+ <details>
219
+ <summary><strong>Codex</strong></summary>
220
+
221
+ 通过命令行:
222
+
223
+ ```bash
224
+ codex mcp add harmonia -- harmonia
225
+ ```
226
+
227
+ 或添加到 `~/.codex/config.toml`:
228
+
229
+ ```toml
230
+ [mcp_servers.harmonia]
231
+ command = "harmonia"
232
+ ```
233
+
234
+ </details>
235
+
236
+ <details>
237
+ <summary><strong>OpenClaw</strong>(通过 mcporter)</summary>
238
+
239
+ 添加到 `config/mcporter.json`(全局配置用 `~/.mcporter/mcporter.json`):
240
+
241
+ ```json
242
+ {
243
+ "mcpServers": {
244
+ "harmonia": {
245
+ "command": "harmonia"
246
+ }
247
+ }
248
+ }
249
+ ```
250
+
251
+ 或通过 mcporter 命令行:
252
+
253
+ ```bash
254
+ mcporter config add harmonia --command harmonia --scope home
255
+ ```
256
+
257
+ </details>
258
+
259
+ ## 全局目录
260
+
261
+ Harmonia 的所有项目数据存储在平台特定的数据目录中(通过 [agent-kit](https://github.com/anthropics/agent-kit) 管理),**不会在项目源码目录中创建任何文件**。
262
+
263
+ 全局目录结构:
264
+
265
+ ```
266
+ <data_dir>/harmonia/
267
+ ├── overrides.json # 全局覆盖配置
268
+ ├── .workflows/ # 自定义工作流目录
269
+ │ └── <workflow_name>/
270
+ │ ├── workflow.json
271
+ │ ├── roles/
272
+ │ └── schemas/
273
+ ├── <project_name>/
274
+ │ ├── state.json # 项目状态(当前阶段、规模等)
275
+ │ ├── steps.json # 文档步骤进度
276
+ │ ├── overrides.json # 项目级覆盖配置
277
+ │ ├── docs/ # 文档产出物
278
+ │ │ ├── prd.md
279
+ │ │ ├── prd.requirements.json # 步骤产出物
280
+ │ │ ├── tech-design.md
281
+ │ │ └── ...
282
+ │ ├── reviews/ # 审批记录
283
+ │ └── dispatch/ # 调度记录
284
+ └── <other_project>/
285
+ └── ...
286
+ ```
287
+
288
+ ## 自定义工作流
289
+
290
+ Harmonia 使用两层工作流查找机制:
291
+
292
+ 1. **自定义目录**(高优先级):`<data_dir>/harmonia/.workflows/<name>/`
293
+ 2. **内置目录**(回退):`<package>/workflows/<name>/`
294
+
295
+ 自定义工作流会覆盖同名的内置工作流。内置工作流随包版本自动更新,零维护。
296
+
297
+ ### 创建自定义工作流
298
+
299
+ 在全局数据目录下创建 `.workflows/<name>/` 目录:
300
+
301
+ ```
302
+ <data_dir>/harmonia/.workflows/
303
+ └── my-workflow/
304
+ ├── workflow.json # 工作流定义(阶段、角色、文档类型)
305
+ ├── roles/ # 角色提示词
306
+ │ ├── pm.md
307
+ │ └── ...
308
+ └── schemas/ # 文档 Schema(可选)
309
+ ├── prd.json
310
+ ├── prd.requirements.json # 步骤 Schema
311
+ └── ...
312
+ ```
313
+
314
+ ### workflow.json 格式
315
+
316
+ ```json
317
+ {
318
+ "name": "my-workflow",
319
+ "description": "自定义工作流描述",
320
+ "version": "1.0.0",
321
+ "author": "your-name",
322
+ "phases": [ ... ],
323
+ "docs": { ... }
324
+ }
325
+ ```
326
+
327
+ 可参考内置 `dev` 工作流(`node_modules/@s_s/harmonia/workflows/dev/`)作为模板。
328
+
329
+ ### project_init 工作流选择
330
+
331
+ - 只有一个可用工作流时自动选中
332
+ - 多个可用工作流时,需在 `project_init` 中指定 `workflow` 参数
333
+ - 示例:`project_init(project_name="my-app", project_dir="/path/to/src", workflow="my-workflow")`
334
+
335
+ ## 项目结构
336
+
337
+ ```
338
+ harmonia/
339
+ ├── src/
340
+ │ ├── index.ts # 入口,注册所有 MCP 工具
341
+ │ ├── cli/
342
+ │ │ └── setup.ts # CLI setup 命令
343
+ │ ├── core/
344
+ │ │ ├── types.ts # 核心类型定义
345
+ │ │ ├── state.ts # 项目状态管理
346
+ │ │ ├── docs.ts # 文档读写
347
+ │ │ ├── schema.ts # P0 Schema 校验引擎
348
+ │ │ ├── steps.ts # P3 步骤管理
349
+ │ │ ├── dispatch.ts # 角色调度
350
+ │ │ ├── registry.ts # 项目注册表
351
+ │ │ ├── workflow.ts # 工作流加载
352
+ │ │ ├── overrides.ts # 工具约束管理
353
+ │ │ └── reviews.ts # 文档审批
354
+ │ ├── tools/ # 11 个 MCP 工具注册
355
+ │ ├── hooks/ # P2 Agent Hook 系统
356
+ │ │ ├── content.ts # Hook 内容生成
357
+ │ │ ├── install.ts # Hook 安装逻辑
358
+ │ │ ├── claude-code.ts # Claude Code hook 适配
359
+ │ │ ├── opencode.ts # OpenCode hook 适配
360
+ │ │ └── openclaw.ts # OpenClaw hook 适配
361
+ │ └── setup/ # 项目初始化设置
362
+ │ ├── inject.ts # 配置注入
363
+ │ └── templates.ts # 模板管理
364
+ ├── workflows/
365
+ │ └── dev/
366
+ │ ├── workflow.json # 工作流定义
367
+ │ ├── roles/ # 角色提示词 (pm.md, architect.md, ...)
368
+ │ └── schemas/ # 文档 + 步骤 Schema
369
+ ├── tests/ # 测试 (261 tests, 13 files)
370
+ └── .dev-logs/ # 开发日志
371
+ ```
372
+
373
+ ## 开发
374
+
375
+ ```bash
376
+ # 安装依赖
377
+ npm install
378
+
379
+ # 构建
380
+ npm run build
381
+
382
+ # 开发模式(watch)
383
+ npm run dev
384
+
385
+ # 运行测试
386
+ npm test
387
+
388
+ # 运行测试(watch 模式)
389
+ npm run test:watch
390
+
391
+ # 代码格式化
392
+ npm run prettier:fix
393
+ ```
394
+
395
+ ## License
396
+
397
+ MIT
@@ -0,0 +1,21 @@
1
+ /**
2
+ * CLI command: harmonia setup
3
+ *
4
+ * Prompt injection + hook installation only.
5
+ * No project registration, no state init — PM does that at runtime via MCP tools.
6
+ *
7
+ * Usage:
8
+ * harmonia setup [options]
9
+ *
10
+ * Options:
11
+ * --agent <type> Agent type: opencode | claude-code | codex | openclaw (default: auto-detect)
12
+ */
13
+ import type { AgentType } from '@s_s/agent-kit';
14
+ interface SetupOptions {
15
+ agent?: AgentType;
16
+ }
17
+ /** Parse CLI flags from argv (starting after 'setup'). */
18
+ export declare function parseSetupArgs(args: string[]): SetupOptions;
19
+ /** Execute the setup command. */
20
+ export declare function runSetup(opts: SetupOptions): Promise<void>;
21
+ export {};
@@ -0,0 +1,71 @@
1
+ /**
2
+ * CLI command: harmonia setup
3
+ *
4
+ * Prompt injection + hook installation only.
5
+ * No project registration, no state init — PM does that at runtime via MCP tools.
6
+ *
7
+ * Usage:
8
+ * harmonia setup [options]
9
+ *
10
+ * Options:
11
+ * --agent <type> Agent type: opencode | claude-code | codex | openclaw (default: auto-detect)
12
+ */
13
+ import { resolve } from 'node:path';
14
+ import { detectHostAgent, injectPrompt } from '../setup/inject.js';
15
+ import { installHooks } from '../hooks/install.js';
16
+ import { getGlobalDir } from '../core/registry.js';
17
+ const VALID_AGENTS = ['opencode', 'claude-code', 'codex', 'openclaw'];
18
+ /** Parse CLI flags from argv (starting after 'setup'). */
19
+ export function parseSetupArgs(args) {
20
+ const opts = {};
21
+ for (let i = 0; i < args.length; i++) {
22
+ const arg = args[i];
23
+ const next = args[i + 1];
24
+ switch (arg) {
25
+ case '--agent':
26
+ if (!next || !VALID_AGENTS.includes(next)) {
27
+ throw new Error(`--agent must be one of: ${VALID_AGENTS.join(', ')}`);
28
+ }
29
+ opts.agent = next;
30
+ i++;
31
+ break;
32
+ default:
33
+ throw new Error(`Unknown option: ${arg}\n\nUsage: harmonia setup [--agent opencode|claude-code|codex|openclaw]`);
34
+ }
35
+ }
36
+ return opts;
37
+ }
38
+ /** Execute the setup command. */
39
+ export async function runSetup(opts) {
40
+ const projectDir = resolve(process.cwd());
41
+ console.log(`\nHarmonia Setup`);
42
+ console.log(`──────────────────────────────`);
43
+ // 1. Detect agent
44
+ const agentType = opts.agent ?? (await detectHostAgent(projectDir));
45
+ console.log(` Agent: ${agentType}`);
46
+ // 2. Inject prompt (global scope — project-agnostic)
47
+ const result = await injectPrompt(agentType);
48
+ const action = result.created ? 'Created' : result.replaced ? 'Updated' : 'Appended to';
49
+ console.log(` [done] ${action} ${result.filePath}`);
50
+ // 3. Install hooks
51
+ try {
52
+ const hookResult = await installHooks(agentType, {
53
+ dataDir: getGlobalDir(),
54
+ });
55
+ if (hookResult.success) {
56
+ console.log(` [done] Hooks installed (${hookResult.filesWritten.length} files)`);
57
+ for (const w of hookResult.warnings) {
58
+ console.log(` [warn] ${w}`);
59
+ }
60
+ }
61
+ else {
62
+ console.log(` [fail] Hook install failed: ${hookResult.error ?? 'unknown'}`);
63
+ }
64
+ }
65
+ catch (err) {
66
+ console.log(` [fail] Hook install error: ${err instanceof Error ? err.message : String(err)}`);
67
+ }
68
+ // 4. Summary
69
+ console.log(`\n Ready. Run your agent and call project_status() to begin.\n`);
70
+ }
71
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -36,3 +36,13 @@ export declare function updateDispatch(projectName: string, dispatchId: string,
36
36
  * Get a single dispatch record by ID.
37
37
  */
38
38
  export declare function getDispatch(projectName: string, dispatchId: string): Promise<DispatchRecord | null>;
39
+ /** Valid state transitions for dispatch status. */
40
+ export declare const DISPATCH_TRANSITIONS: Record<DispatchStatus, DispatchStatus[]>;
41
+ /**
42
+ * Check if a dispatch status transition is valid.
43
+ */
44
+ export declare function isValidTransition(from: DispatchStatus, to: DispatchStatus): boolean;
45
+ /**
46
+ * Check if a dispatch status is terminal (no further transitions allowed).
47
+ */
48
+ export declare function isTerminalStatus(status: DispatchStatus): boolean;
@@ -153,4 +153,25 @@ export async function getDispatch(projectName, dispatchId) {
153
153
  const dispatches = await readDispatches(projectName);
154
154
  return dispatches.find((d) => d.id === dispatchId) ?? null;
155
155
  }
156
+ // ─── Dispatch State Machine ───
157
+ /** Valid state transitions for dispatch status. */
158
+ export const DISPATCH_TRANSITIONS = {
159
+ dispatched: ['running', 'cancelled'],
160
+ running: ['completed', 'failed', 'cancelled'],
161
+ completed: [],
162
+ failed: [],
163
+ cancelled: [],
164
+ };
165
+ /**
166
+ * Check if a dispatch status transition is valid.
167
+ */
168
+ export function isValidTransition(from, to) {
169
+ return DISPATCH_TRANSITIONS[from].includes(to);
170
+ }
171
+ /**
172
+ * Check if a dispatch status is terminal (no further transitions allowed).
173
+ */
174
+ export function isTerminalStatus(status) {
175
+ return DISPATCH_TRANSITIONS[status].length === 0;
176
+ }
156
177
  //# sourceMappingURL=dispatch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/core/dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/core/dispatch.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  * Document management — read/write files under <data_dir>/<project_name>/docs/
3
3
  *
4
4
  * Supports both .md and .html files based on doc format configuration.
5
+ * Also supports step artifact files for sequential mode (e.g. prd.requirements.json).
5
6
  */
6
7
  import type { DocDefinition } from './types.js';
7
8
  /**
@@ -17,3 +18,15 @@ export declare function readDoc(projectName: string, docId: string): Promise<str
17
18
  * List all documents in <data_dir>/<project_name>/docs/
18
19
  */
19
20
  export declare function listDocs(projectName: string): Promise<string[]>;
21
+ /**
22
+ * Write a step artifact to <data_dir>/<project_name>/docs/<docId>.<stepId>.<ext>
23
+ *
24
+ * @param format - "json" or "md" (determines file extension)
25
+ * @returns The file path written
26
+ */
27
+ export declare function writeStepArtifact(projectName: string, docId: string, stepId: string, content: string, format: 'json' | 'md'): Promise<string>;
28
+ /**
29
+ * Read a step artifact from <data_dir>/<project_name>/docs/<docId>.<stepId>.<ext>
30
+ * Tries .json first, then .md.
31
+ */
32
+ export declare function readStepArtifact(projectName: string, docId: string, stepId: string): Promise<string>;
@@ -2,6 +2,7 @@
2
2
  * Document management — read/write files under <data_dir>/<project_name>/docs/
3
3
  *
4
4
  * Supports both .md and .html files based on doc format configuration.
5
+ * Also supports step artifact files for sequential mode (e.g. prd.requirements.json).
5
6
  */
6
7
  import { mkdir, readFile, writeFile, readdir } from 'node:fs/promises';
7
8
  import { join } from 'node:path';
@@ -56,4 +57,35 @@ export async function listDocs(projectName) {
56
57
  return [];
57
58
  }
58
59
  }
60
+ // ─── Step Artifact I/O ───
61
+ /**
62
+ * Write a step artifact to <data_dir>/<project_name>/docs/<docId>.<stepId>.<ext>
63
+ *
64
+ * @param format - "json" or "md" (determines file extension)
65
+ * @returns The file path written
66
+ */
67
+ export async function writeStepArtifact(projectName, docId, stepId, content, format) {
68
+ const dir = docsDir(projectName);
69
+ await mkdir(dir, { recursive: true });
70
+ const ext = format === 'json' ? '.json' : '.md';
71
+ const filePath = join(dir, `${docId}.${stepId}${ext}`);
72
+ await writeFile(filePath, content, 'utf-8');
73
+ return filePath;
74
+ }
75
+ /**
76
+ * Read a step artifact from <data_dir>/<project_name>/docs/<docId>.<stepId>.<ext>
77
+ * Tries .json first, then .md.
78
+ */
79
+ export async function readStepArtifact(projectName, docId, stepId) {
80
+ const dir = docsDir(projectName);
81
+ for (const ext of ['.json', '.md']) {
82
+ try {
83
+ return await readFile(join(dir, `${docId}.${stepId}${ext}`), 'utf-8');
84
+ }
85
+ catch {
86
+ // try next extension
87
+ }
88
+ }
89
+ throw new Error(`Step artifact "${docId}.${stepId}" not found`);
90
+ }
59
91
  //# sourceMappingURL=docs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/core/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,SAAS,OAAO,CAAC,WAAmB;IAChC,OAAO,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAsB;IAC3C,OAAO,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC1B,WAAmB,EACnB,KAAa,EACb,OAAe,EACf,MAAsB;IAEtB,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,WAAmB,EAAE,KAAa;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEjC,4BAA4B;IAC5B,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACD,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACL,qBAAqB;QACzB,CAAC;IACL,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,aAAa,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,WAAmB;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;IACnH,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/core/docs.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,7 @@ export interface Registry {
34
34
  /**
35
35
  * Get the global Harmonia data directory, following system conventions.
36
36
  *
37
- * Resolution order:
37
+ * Delegates to @s_s/agent-kit which handles:
38
38
  * 1. HARMONIA_DATA_DIR env var (explicit override)
39
39
  * 2. Platform default:
40
40
  * - macOS: ~/Library/Application Support/harmonia