maestro-flow 0.4.24 → 0.4.26

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 (136) hide show
  1. package/.agents/skills/maestro-impeccable/SKILL.md +5 -1
  2. package/.agents/skills/maestro-next/SKILL.md +7 -1
  3. package/.agents/skills/maestro-player/SKILL.md +9 -2
  4. package/.agents/skills/maestro-tools-execute/SKILL.md +4 -4
  5. package/.agents/skills/spec-load/SKILL.md +11 -4
  6. package/.agy/skills/maestro-impeccable/SKILL.md +5 -1
  7. package/.agy/skills/maestro-next/SKILL.md +7 -1
  8. package/.agy/skills/maestro-player/SKILL.md +9 -2
  9. package/.agy/skills/maestro-tools-execute/SKILL.md +4 -4
  10. package/.agy/skills/spec-load/SKILL.md +11 -4
  11. package/.claude/commands/maestro-impeccable.md +5 -1
  12. package/.claude/commands/maestro-next.md +7 -1
  13. package/.claude/commands/maestro-player.md +9 -2
  14. package/.claude/commands/maestro-tools-execute.md +4 -4
  15. package/.claude/commands/spec-load.md +11 -4
  16. package/.codex/skills/learn-second-opinion/SKILL.md +1 -1
  17. package/.codex/skills/maestro-milestone-audit/SKILL.md +11 -9
  18. package/.codex/skills/maestro-ui-codify/SKILL.md +3 -3
  19. package/.codex/skills/quality-debug/SKILL.md +31 -25
  20. package/.codex/skills/security-audit/SKILL.md +17 -1
  21. package/.codex/skills/team-review/SKILL.md +2 -2
  22. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js +9 -1
  23. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js.map +1 -1
  24. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.test.d.ts +1 -0
  25. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.test.js +346 -0
  26. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.test.js.map +1 -0
  27. package/dashboard/dist-server/dashboard/src/server/routes/specs.js +96 -25
  28. package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
  29. package/dashboard/dist-server/dashboard/src/shared/constants.d.ts +1 -0
  30. package/dashboard/dist-server/dashboard/src/shared/constants.js +1 -0
  31. package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
  32. package/dashboard/dist-server/src/graph/types.d.ts +98 -0
  33. package/dashboard/dist-server/src/graph/types.js +19 -1
  34. package/dashboard/dist-server/src/graph/types.js.map +1 -1
  35. package/dist/src/agents/cli-agent-runner.d.ts +2 -0
  36. package/dist/src/agents/cli-agent-runner.d.ts.map +1 -1
  37. package/dist/src/agents/cli-agent-runner.js +3 -0
  38. package/dist/src/agents/cli-agent-runner.js.map +1 -1
  39. package/dist/src/commands/delegate.d.ts +2 -0
  40. package/dist/src/commands/delegate.d.ts.map +1 -1
  41. package/dist/src/commands/delegate.js +3 -1
  42. package/dist/src/commands/delegate.js.map +1 -1
  43. package/dist/src/commands/kg.d.ts.map +1 -1
  44. package/dist/src/commands/kg.js +345 -2
  45. package/dist/src/commands/kg.js.map +1 -1
  46. package/dist/src/commands/spec.d.ts.map +1 -1
  47. package/dist/src/commands/spec.js +177 -38
  48. package/dist/src/commands/spec.js.map +1 -1
  49. package/dist/src/commands/wiki.d.ts.map +1 -1
  50. package/dist/src/commands/wiki.js +51 -9
  51. package/dist/src/commands/wiki.js.map +1 -1
  52. package/dist/src/config/cli-tools-config.d.ts +18 -0
  53. package/dist/src/config/cli-tools-config.d.ts.map +1 -1
  54. package/dist/src/config/cli-tools-config.js +31 -0
  55. package/dist/src/config/cli-tools-config.js.map +1 -1
  56. package/dist/src/graph/db/connection.d.ts +22 -0
  57. package/dist/src/graph/db/connection.d.ts.map +1 -0
  58. package/dist/src/graph/db/connection.js +113 -0
  59. package/dist/src/graph/db/connection.js.map +1 -0
  60. package/dist/src/graph/db/index.d.ts +4 -0
  61. package/dist/src/graph/db/index.d.ts.map +1 -0
  62. package/dist/src/graph/db/index.js +4 -0
  63. package/dist/src/graph/db/index.js.map +1 -0
  64. package/dist/src/graph/db/migrations.d.ts +5 -0
  65. package/dist/src/graph/db/migrations.d.ts.map +1 -0
  66. package/dist/src/graph/db/migrations.js +18 -0
  67. package/dist/src/graph/db/migrations.js.map +1 -0
  68. package/dist/src/graph/db/queries.d.ts +50 -0
  69. package/dist/src/graph/db/queries.d.ts.map +1 -0
  70. package/dist/src/graph/db/queries.js +313 -0
  71. package/dist/src/graph/db/queries.js.map +1 -0
  72. package/dist/src/graph/db/schema.sql +131 -0
  73. package/dist/src/graph/facade.d.ts +53 -0
  74. package/dist/src/graph/facade.d.ts.map +1 -0
  75. package/dist/src/graph/facade.js +172 -0
  76. package/dist/src/graph/facade.js.map +1 -0
  77. package/dist/src/graph/graph-queries.d.ts +24 -0
  78. package/dist/src/graph/graph-queries.d.ts.map +1 -0
  79. package/dist/src/graph/graph-queries.js +173 -0
  80. package/dist/src/graph/graph-queries.js.map +1 -0
  81. package/dist/src/graph/index.d.ts +8 -0
  82. package/dist/src/graph/index.d.ts.map +1 -1
  83. package/dist/src/graph/index.js +9 -0
  84. package/dist/src/graph/index.js.map +1 -1
  85. package/dist/src/graph/loader.d.ts +8 -0
  86. package/dist/src/graph/loader.d.ts.map +1 -1
  87. package/dist/src/graph/loader.js +20 -0
  88. package/dist/src/graph/loader.js.map +1 -1
  89. package/dist/src/graph/migration.d.ts +8 -0
  90. package/dist/src/graph/migration.d.ts.map +1 -0
  91. package/dist/src/graph/migration.js +134 -0
  92. package/dist/src/graph/migration.js.map +1 -0
  93. package/dist/src/graph/search/index.d.ts +4 -0
  94. package/dist/src/graph/search/index.d.ts.map +1 -0
  95. package/dist/src/graph/search/index.js +3 -0
  96. package/dist/src/graph/search/index.js.map +1 -0
  97. package/dist/src/graph/search/query-parser.d.ts +11 -0
  98. package/dist/src/graph/search/query-parser.d.ts.map +1 -0
  99. package/dist/src/graph/search/query-parser.js +111 -0
  100. package/dist/src/graph/search/query-parser.js.map +1 -0
  101. package/dist/src/graph/search/query-utils.d.ts +12 -0
  102. package/dist/src/graph/search/query-utils.d.ts.map +1 -0
  103. package/dist/src/graph/search/query-utils.js +184 -0
  104. package/dist/src/graph/search/query-utils.js.map +1 -0
  105. package/dist/src/graph/sync/content-hash.d.ts +7 -0
  106. package/dist/src/graph/sync/content-hash.d.ts.map +1 -0
  107. package/dist/src/graph/sync/content-hash.js +33 -0
  108. package/dist/src/graph/sync/content-hash.js.map +1 -0
  109. package/dist/src/graph/sync/incremental-sync.d.ts +23 -0
  110. package/dist/src/graph/sync/incremental-sync.d.ts.map +1 -0
  111. package/dist/src/graph/sync/incremental-sync.js +338 -0
  112. package/dist/src/graph/sync/incremental-sync.js.map +1 -0
  113. package/dist/src/graph/sync/index.d.ts +7 -0
  114. package/dist/src/graph/sync/index.d.ts.map +1 -0
  115. package/dist/src/graph/sync/index.js +5 -0
  116. package/dist/src/graph/sync/index.js.map +1 -0
  117. package/dist/src/graph/sync/watch-policy.d.ts +2 -0
  118. package/dist/src/graph/sync/watch-policy.d.ts.map +1 -0
  119. package/dist/src/graph/sync/watch-policy.js +38 -0
  120. package/dist/src/graph/sync/watch-policy.js.map +1 -0
  121. package/dist/src/graph/sync/watcher.d.ts +44 -0
  122. package/dist/src/graph/sync/watcher.d.ts.map +1 -0
  123. package/dist/src/graph/sync/watcher.js +153 -0
  124. package/dist/src/graph/sync/watcher.js.map +1 -0
  125. package/dist/src/graph/traversal.d.ts +37 -0
  126. package/dist/src/graph/traversal.d.ts.map +1 -0
  127. package/dist/src/graph/traversal.js +335 -0
  128. package/dist/src/graph/traversal.js.map +1 -0
  129. package/dist/src/graph/types.d.ts +98 -0
  130. package/dist/src/graph/types.d.ts.map +1 -1
  131. package/dist/src/graph/types.js +19 -1
  132. package/dist/src/graph/types.js.map +1 -1
  133. package/dist/src/utils/update-notices.js +21 -0
  134. package/dist/src/utils/update-notices.js.map +1 -1
  135. package/package.json +4 -2
  136. package/workflows/analyze.md +19 -13
@@ -147,7 +147,11 @@ Layer 1 did not match. Check for chain-level keywords — even if the prompt als
147
147
  | design system, tokens, design foundation, design infrastructure | foundation |
148
148
  | real-time, live, browser | live |
149
149
 
150
- Ambiguous + no `-y` → ask_user.
150
+ Ambiguous + no `-y`:
151
+
152
+ ask_user (single-select, header: "意图确认"):
153
+ - Options: top 2-3 matched chains from Layer 2 table, each with label = chain name, description = matched keywords
154
+ - Last option: **"直接构建"** — skip chain, route to Layer 3 craft
151
155
 
152
156
  ### Layer 3: Concrete build task → Direct craft
153
157
 
@@ -220,7 +220,13 @@ brainstorm → blueprint → init → analyze-macro → roadmap
220
220
  执行参数: <args>
221
221
  ```
222
222
 
223
- `--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则 ask_user 提供:执行 top pick / 选备选 / 修改参数 / 取消。
223
+ `--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则:
224
+
225
+ ask_user (single-select, header: "执行确认"):
226
+ - **执行推荐** (Recommended) — run top pick with shown args
227
+ - **选择备选** — pick from alternative commands
228
+ - **修改参数** — adjust args before executing
229
+ - **取消** — do nothing
224
230
 
225
231
  </presentation>
226
232
 
@@ -147,13 +147,20 @@ S_COMPLETE:
147
147
  - **skill/command**: `invoke_skill(skill, resolved_args)` → extract session_id, output_path, artifacts
148
148
  - **cli**: `shell(run_in_background: true)` → STOP, wait for callback → `maestro delegate output <id>`
149
149
  - **agent**: `delegate_subagent(subagent_type, resolved_args)`
150
- - **checkpoint**: write checkpoint snapshot. If auto_continue==false: ask_user (Continue/Pause/Abort)
150
+ - **checkpoint**: write checkpoint snapshot. If auto_continue==false:
151
+ ask_user (single-select, header: "Checkpoint"):
152
+ - **Continue** — proceed to next step
153
+ - **Pause** — save progress, exit (resume with `-c`)
154
+ - **Abort** — stop workflow
151
155
  4. Set step status="completed" (or "skipped"/"failed"), write status.json
152
156
 
153
157
  ### A_COMPLETE_SESSION
154
158
 
155
159
  Set status="completed", completed_at. Display summary: session, template, steps completed, context, per-step results, artifacts, session dir.
156
- ask_user: Keep session / Run again / Done.
160
+ ask_user (single-select, header: "完成"):
161
+ - **Keep session** — preserve artifacts for reference
162
+ - **Run again** — re-execute with same template
163
+ - **Done** — clean up and exit
157
164
 
158
165
  </actions>
159
166
 
@@ -73,10 +73,10 @@ maestro wiki load <knowhow-id>
73
73
 
74
74
  ### Step 3: Confirm Execution
75
75
 
76
- Ask user:
77
- - Execute steps as-is?
78
- - Adjust parameters/scope?
79
- - View only, do not execute?
76
+ ask_user (single-select, header: "执行方式"):
77
+ - **Execute as-is** (Recommended) — run all steps with current parameters
78
+ - **Adjust parameters** — modify scope or parameters before executing
79
+ - **View only** display steps without executing
80
80
 
81
81
  ### Step 4: Step-by-Step Execution
82
82
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: spec-load
3
3
  description: Load specs and lessons for current context
4
- argument-hint: "[--category <category>] [--keyword <word>]"
4
+ argument-hint: "[--scope <scope>] [--category <category>] [--keyword <word>]"
5
5
  allowed-tools:
6
6
  - read_file
7
7
  - shell
@@ -11,8 +11,9 @@ allowed-tools:
11
11
  <!-- Open-standard mirror generated by scripts/build-agents-standard.mjs — do not edit; re-run after editing .claude/ source. -->
12
12
 
13
13
  <purpose>
14
- Load relevant specs filtered by category (file-level) and/or keyword (entry-level).
14
+ Load relevant specs filtered by scope, category (file-level) and/or keyword (entry-level).
15
15
  Category-based loading: loads the category's primary doc in full + matching entries from other files.
16
+ By default, loads from both global (~/.maestro/specs/) and project (.workflow/specs/) layers.
16
17
  </purpose>
17
18
 
18
19
  <required_reading>
@@ -23,6 +24,11 @@ Category-based loading: loads the category's primary doc in full + matching entr
23
24
  $ARGUMENTS -- optional flags and keyword
24
25
 
25
26
  **Flags:**
27
+ - `--scope <scope>` — Load scope (default: global + project merged):
28
+ - `project`: project baseline only (.workflow/specs/)
29
+ - `global`: global + project merged (~/.maestro/specs/ + .workflow/specs/)
30
+ - `team`: project + team shared (.workflow/collab/specs/)
31
+ - `personal`: project + team + personal (requires uid)
26
32
  - `--category <category>` — Load by category: primary category doc (full) + cross-file entries with matching category attr. Categories: coding, arch, test, review, debug, learning, ui.
27
33
  - `--keyword <word>` — Filter by keyword within entries
28
34
 
@@ -40,7 +46,8 @@ $ARGUMENTS -- optional flags and keyword
40
46
 
41
47
  **Examples:**
42
48
  ```
43
- /spec-load --category coding # coding全文 + 跨文件coding条目
49
+ /spec-load --category coding # coding全文 + 跨文件coding条目 (global + project)
50
+ /spec-load --scope global --category arch # 明确包含全局 arch 规范
44
51
  /spec-load --category review # review-standards + quality-rules + 跨文件review条目
45
52
  /spec-load --category coding --keyword auth
46
53
  /spec-load --keyword auth
@@ -59,7 +66,7 @@ Follow '~/.maestro/workflows/specs-load.md' completely.
59
66
  <error_codes>
60
67
  | Code | Severity | Description | Stage |
61
68
  |------|----------|-------------|-------|
62
- | E001 | fatal | `.workflow/specs/` not initialized -- run `/spec-setup` first | detect_context |
69
+ | E001 | warning | `.workflow/specs/` not initialized -- run `/spec-setup` first (global specs still available) | detect_context |
63
70
  | W001 | warning | No matching specs found for keyword -- showing all specs in category instead | load_specs |
64
71
  </error_codes>
65
72
 
@@ -146,7 +146,11 @@ Layer 1 did not match. Check for chain-level keywords — even if the prompt als
146
146
  | design system, tokens, design foundation, design infrastructure | foundation |
147
147
  | real-time, live, browser | live |
148
148
 
149
- Ambiguous + no `-y` → ask_question.
149
+ Ambiguous + no `-y`:
150
+
151
+ ask_question (single-select, header: "意图确认"):
152
+ - Options: top 2-3 matched chains from Layer 2 table, each with label = chain name, description = matched keywords
153
+ - Last option: **"直接构建"** — skip chain, route to Layer 3 craft
150
154
 
151
155
  ### Layer 3: Concrete build task → Direct craft
152
156
 
@@ -216,7 +216,13 @@ brainstorm → blueprint → init → analyze-macro → roadmap
216
216
  执行参数: <args>
217
217
  ```
218
218
 
219
- `--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则 ask_question 提供:执行 top pick / 选备选 / 修改参数 / 取消。
219
+ `--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则:
220
+
221
+ ask_question (single-select, header: "执行确认"):
222
+ - **执行推荐** (Recommended) — run top pick with shown args
223
+ - **选择备选** — pick from alternative commands
224
+ - **修改参数** — adjust args before executing
225
+ - **取消** — do nothing
220
226
 
221
227
  </presentation>
222
228
 
@@ -146,13 +146,20 @@ S_COMPLETE:
146
146
  - **skill/command**: `Skill(skill, resolved_args)` → extract session_id, output_path, artifacts
147
147
  - **cli**: `run_command(run_in_background: true)` → STOP, wait for callback → `maestro delegate output <id>`
148
148
  - **agent**: `invoke_subagent([{ TypeName: "<TypeName>", Role: "<Role>", Prompt: "<Prompt>", Workspace: "inherit" }])`
149
- - **checkpoint**: write checkpoint snapshot. If auto_continue==false: ask_question (Continue/Pause/Abort)
149
+ - **checkpoint**: write checkpoint snapshot. If auto_continue==false:
150
+ ask_question (single-select, header: "Checkpoint"):
151
+ - **Continue** — proceed to next step
152
+ - **Pause** — save progress, exit (resume with `-c`)
153
+ - **Abort** — stop workflow
150
154
  4. Set step status="completed" (or "skipped"/"failed"), write status.json
151
155
 
152
156
  ### A_COMPLETE_SESSION
153
157
 
154
158
  Set status="completed", completed_at. Display summary: session, template, steps completed, context, per-step results, artifacts, session dir.
155
- ask_question: Keep session / Run again / Done.
159
+ ask_question (single-select, header: "完成"):
160
+ - **Keep session** — preserve artifacts for reference
161
+ - **Run again** — re-execute with same template
162
+ - **Done** — clean up and exit
156
163
 
157
164
  </actions>
158
165
 
@@ -73,10 +73,10 @@ maestro wiki load <knowhow-id>
73
73
 
74
74
  ### Step 3: Confirm Execution
75
75
 
76
- Ask user:
77
- - Execute steps as-is?
78
- - Adjust parameters/scope?
79
- - View only, do not execute?
76
+ ask_question (single-select, header: "执行方式"):
77
+ - **Execute as-is** (Recommended) — run all steps with current parameters
78
+ - **Adjust parameters** — modify scope or parameters before executing
79
+ - **View only** display steps without executing
80
80
 
81
81
  ### Step 4: Step-by-Step Execution
82
82
 
@@ -1,15 +1,16 @@
1
1
  ---
2
2
  name: spec-load
3
3
  description: Load specs and lessons for current context
4
- argument-hint: [--category <category>] [--keyword <word>]
4
+ argument-hint: [--scope <scope>] [--category <category>] [--keyword <word>]
5
5
  allowed-tools:
6
6
  - grep_search
7
7
  - run_command
8
8
  - view_file
9
9
  ---
10
10
  <purpose>
11
- Load relevant specs filtered by category (file-level) and/or keyword (entry-level).
11
+ Load relevant specs filtered by scope, category (file-level) and/or keyword (entry-level).
12
12
  Category-based loading: loads the category's primary doc in full + matching entries from other files.
13
+ By default, loads from both global (~/.maestro/specs/) and project (.workflow/specs/) layers.
13
14
  </purpose>
14
15
 
15
16
  <required_reading>
@@ -20,6 +21,11 @@ Category-based loading: loads the category's primary doc in full + matching entr
20
21
  $ARGUMENTS -- optional flags and keyword
21
22
 
22
23
  **Flags:**
24
+ - `--scope <scope>` — Load scope (default: global + project merged):
25
+ - `project`: project baseline only (.workflow/specs/)
26
+ - `global`: global + project merged (~/.maestro/specs/ + .workflow/specs/)
27
+ - `team`: project + team shared (.workflow/collab/specs/)
28
+ - `personal`: project + team + personal (requires uid)
23
29
  - `--category <category>` — Load by category: primary category doc (full) + cross-file entries with matching category attr. Categories: coding, arch, test, review, debug, learning, ui.
24
30
  - `--keyword <word>` — Filter by keyword within entries
25
31
 
@@ -37,7 +43,8 @@ $ARGUMENTS -- optional flags and keyword
37
43
 
38
44
  **Examples:**
39
45
  ```
40
- /spec-load --category coding # coding全文 + 跨文件coding条目
46
+ /spec-load --category coding # coding全文 + 跨文件coding条目 (global + project)
47
+ /spec-load --scope global --category arch # 明确包含全局 arch 规范
41
48
  /spec-load --category review # review-standards + quality-rules + 跨文件review条目
42
49
  /spec-load --category coding --keyword auth
43
50
  /spec-load --keyword auth
@@ -56,7 +63,7 @@ Follow '~/.maestro/workflows/specs-load.md' completely.
56
63
  <error_codes>
57
64
  | Code | Severity | Description | Stage |
58
65
  |------|----------|-------------|-------|
59
- | E001 | fatal | `.workflow/specs/` not initialized -- run `/spec-setup` first | detect_context |
66
+ | E001 | warning | `.workflow/specs/` not initialized -- run `/spec-setup` first (global specs still available) | detect_context |
60
67
  | W001 | warning | No matching specs found for keyword -- showing all specs in category instead | load_specs |
61
68
  </error_codes>
62
69
 
@@ -145,7 +145,11 @@ Layer 1 did not match. Check for chain-level keywords — even if the prompt als
145
145
  | design system, tokens, design foundation, design infrastructure | foundation |
146
146
  | real-time, live, browser | live |
147
147
 
148
- Ambiguous + no `-y` → AskUserQuestion.
148
+ Ambiguous + no `-y`:
149
+
150
+ AskUserQuestion (single-select, header: "意图确认"):
151
+ - Options: top 2-3 matched chains from Layer 2 table, each with label = chain name, description = matched keywords
152
+ - Last option: **"直接构建"** — skip chain, route to Layer 3 craft
149
153
 
150
154
  ### Layer 3: Concrete build task → Direct craft
151
155
 
@@ -218,7 +218,13 @@ brainstorm → blueprint → init → analyze-macro → roadmap
218
218
  执行参数: <args>
219
219
  ```
220
220
 
221
- `--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则 AskUserQuestion 提供:执行 top pick / 选备选 / 修改参数 / 取消。
221
+ `--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则:
222
+
223
+ AskUserQuestion (single-select, header: "执行确认"):
224
+ - **执行推荐** (Recommended) — run top pick with shown args
225
+ - **选择备选** — pick from alternative commands
226
+ - **修改参数** — adjust args before executing
227
+ - **取消** — do nothing
222
228
 
223
229
  </presentation>
224
230
 
@@ -145,13 +145,20 @@ S_COMPLETE:
145
145
  - **skill/command**: `Skill(skill, resolved_args)` → extract session_id, output_path, artifacts
146
146
  - **cli**: `Bash(run_in_background: true)` → STOP, wait for callback → `maestro delegate output <id>`
147
147
  - **agent**: `Agent(subagent_type, resolved_args)`
148
- - **checkpoint**: write checkpoint snapshot. If auto_continue==false: AskUserQuestion (Continue/Pause/Abort)
148
+ - **checkpoint**: write checkpoint snapshot. If auto_continue==false:
149
+ AskUserQuestion (single-select, header: "Checkpoint"):
150
+ - **Continue** — proceed to next step
151
+ - **Pause** — save progress, exit (resume with `-c`)
152
+ - **Abort** — stop workflow
149
153
  4. Set step status="completed" (or "skipped"/"failed"), write status.json
150
154
 
151
155
  ### A_COMPLETE_SESSION
152
156
 
153
157
  Set status="completed", completed_at. Display summary: session, template, steps completed, context, per-step results, artifacts, session dir.
154
- AskUserQuestion: Keep session / Run again / Done.
158
+ AskUserQuestion (single-select, header: "完成"):
159
+ - **Keep session** — preserve artifacts for reference
160
+ - **Run again** — re-execute with same template
161
+ - **Done** — clean up and exit
155
162
 
156
163
  </actions>
157
164
 
@@ -71,10 +71,10 @@ maestro wiki load <knowhow-id>
71
71
 
72
72
  ### Step 3: Confirm Execution
73
73
 
74
- Ask user:
75
- - Execute steps as-is?
76
- - Adjust parameters/scope?
77
- - View only, do not execute?
74
+ AskUserQuestion (single-select, header: "执行方式"):
75
+ - **Execute as-is** (Recommended) — run all steps with current parameters
76
+ - **Adjust parameters** — modify scope or parameters before executing
77
+ - **View only** display steps without executing
78
78
 
79
79
  ### Step 4: Step-by-Step Execution
80
80
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: spec-load
3
3
  description: Load specs and lessons for current context
4
- argument-hint: "[--category <category>] [--keyword <word>]"
4
+ argument-hint: "[--scope <scope>] [--category <category>] [--keyword <word>]"
5
5
  allowed-tools:
6
6
  - Read
7
7
  - Bash
@@ -9,8 +9,9 @@ allowed-tools:
9
9
  - Grep
10
10
  ---
11
11
  <purpose>
12
- Load relevant specs filtered by category (file-level) and/or keyword (entry-level).
12
+ Load relevant specs filtered by scope, category (file-level) and/or keyword (entry-level).
13
13
  Category-based loading: loads the category's primary doc in full + matching entries from other files.
14
+ By default, loads from both global (~/.maestro/specs/) and project (.workflow/specs/) layers.
14
15
  </purpose>
15
16
 
16
17
  <required_reading>
@@ -21,6 +22,11 @@ Category-based loading: loads the category's primary doc in full + matching entr
21
22
  $ARGUMENTS -- optional flags and keyword
22
23
 
23
24
  **Flags:**
25
+ - `--scope <scope>` — Load scope (default: global + project merged):
26
+ - `project`: project baseline only (.workflow/specs/)
27
+ - `global`: global + project merged (~/.maestro/specs/ + .workflow/specs/)
28
+ - `team`: project + team shared (.workflow/collab/specs/)
29
+ - `personal`: project + team + personal (requires uid)
24
30
  - `--category <category>` — Load by category: primary category doc (full) + cross-file entries with matching category attr. Categories: coding, arch, test, review, debug, learning, ui.
25
31
  - `--keyword <word>` — Filter by keyword within entries
26
32
 
@@ -38,7 +44,8 @@ $ARGUMENTS -- optional flags and keyword
38
44
 
39
45
  **Examples:**
40
46
  ```
41
- /spec-load --category coding # coding全文 + 跨文件coding条目
47
+ /spec-load --category coding # coding全文 + 跨文件coding条目 (global + project)
48
+ /spec-load --scope global --category arch # 明确包含全局 arch 规范
42
49
  /spec-load --category review # review-standards + quality-rules + 跨文件review条目
43
50
  /spec-load --category coding --keyword auth
44
51
  /spec-load --keyword auth
@@ -57,7 +64,7 @@ Follow '~/.maestro/workflows/specs-load.md' completely.
57
64
  <error_codes>
58
65
  | Code | Severity | Description | Stage |
59
66
  |------|----------|-------------|-------|
60
- | E001 | fatal | `.workflow/specs/` not initialized -- run `/spec-setup` first | detect_context |
67
+ | E001 | warning | `.workflow/specs/` not initialized -- run `/spec-setup` first (global specs still available) | detect_context |
61
68
  | W001 | warning | No matching specs found for keyword -- showing all specs in category instead | load_specs |
62
69
  </error_codes>
63
70
 
@@ -64,7 +64,7 @@ Wave 1: 3 persona agents in parallel (filter `wave==1 AND status=="pending"`). W
64
64
  "summary": { "type": "string", "maxLength": 500 },
65
65
  "error": { "type": "string" }
66
66
  },
67
- "required": ["id", "result_status", "summary"]
67
+ "required": ["id", "result_status", "findings", "summary"]
68
68
  }
69
69
  ```
70
70
 
@@ -44,7 +44,7 @@ id,title,description,scope,check_targets,deps,wave,status,findings,gaps_found,se
44
44
  | `check_targets` | Input | Specific verification commands/grep patterns |
45
45
  | `deps` | Input | Dependencies (empty — all wave 1) |
46
46
  | `wave` | Computed | Wave number (always 1 — single parallel wave) |
47
- | `status` | Lifecycle | `pending` (initial) → `pass`/`fail`/`warning`/`failed` (set by merge step from worker's `result_status`) |
47
+ | `status` | Lifecycle | `pending` (initial) → `completed`/`failed` (set by merge step from worker's `result_status`) |
48
48
  | `findings` | Lifecycle | Detailed findings per dimension (max 500 chars; merged) |
49
49
  | `gaps_found` | Lifecycle | Semicolon-separated list of integration gaps (merged) |
50
50
  | `severity` | Lifecycle | `critical` / `warning` / `info` per gap (merged) |
@@ -105,18 +105,19 @@ spawn_agents_on_csv({
105
105
  type: "object",
106
106
  properties: {
107
107
  id: { type: "string" },
108
- result_status: { type: "string", enum: ["pass", "fail", "warning", "failed"] },
108
+ result_status: { type: "string", enum: ["completed", "failed"] },
109
+ audit_verdict: { type: "string", enum: ["pass", "fail", "warning"], description: "Audit check outcome" },
109
110
  findings: { type: "string", maxLength: 500 },
110
111
  gaps_found: { type: "string", description: "Semicolon-separated list of gaps" },
111
112
  severity: { type: "string", enum: ["critical", "warning", "info", ""] },
112
113
  error: { type: "string" }
113
114
  },
114
- required: ["id", "result_status", "findings", "severity"]
115
+ required: ["id", "result_status", "audit_verdict", "findings", "severity"]
115
116
  }
116
117
  })
117
118
  ```
118
119
 
119
- 4. Merge results into master `tasks.csv`: map `result_status` → master `status` column, copy `findings`, `gaps_found`, `severity`, `error`. Delete temporary files (`wave-1.csv`, `wave-1-results.csv`) after merge.
120
+ 4. Merge results into master `tasks.csv`: map `result_status` → master `status` column, copy `audit_verdict`, `findings`, `gaps_found`, `severity`, `error`. Delete temporary files (`wave-1.csv`, `wave-1-results.csv`) after merge.
120
121
 
121
122
  #### Integration Checker Worker Contract (AUDIT_INTEGRATION_INSTRUCTION)
122
123
 
@@ -134,9 +135,9 @@ REQUIRED STEPS:
134
135
  5. Call report_agent_job_result EXACTLY ONCE
135
136
 
136
137
  TERMINATION CONTRACT (mandatory — NO worker may end without calling report_agent_job_result):
137
- - Pass path → no gaps found → result_status=pass, severity="info"
138
- - Warning path → minor gaps → result_status=warning, severity="warning"
139
- - Fail path → critical contract drift or broken dependencies → result_status=fail, severity="critical"
138
+ - Pass path → no gaps found → result_status=completed, audit_verdict=pass, severity="info"
139
+ - Warning path → minor gaps → result_status=completed, audit_verdict=warning, severity="warning"
140
+ - Fail path → critical contract drift or broken dependencies → result_status=completed, audit_verdict=fail, severity="critical"
140
141
  - Failure path → cannot read scope, tool error → result_status=failed with error message
141
142
  - Timeout path → near 600s, finalize current findings → report with what was collected
142
143
  - NEVER skip report_agent_job_result.
@@ -144,7 +145,8 @@ TERMINATION CONTRACT (mandatory — NO worker may end without calling report_age
144
145
  OUTPUT (must match output_schema):
145
146
  {
146
147
  "id": "<your row id>",
147
- "result_status": "pass" | "warning" | "fail" | "failed",
148
+ "result_status": "completed" | "failed",
149
+ "audit_verdict": "pass" | "warning" | "fail",
148
150
  "findings": "<one-sentence summary, max 500 chars>",
149
151
  "gaps_found": "<semicolon-separated list of gaps, each with file:line; empty if pass>",
150
152
  "severity": "critical" | "warning" | "info" | "",
@@ -157,7 +159,7 @@ CONSTRAINTS:
157
159
  - Do NOT call spawn_agents_on_csv (no recursion).
158
160
  ```
159
161
  5. Parse `gaps_found` from all workers — aggregate into `.workflow/milestones/{milestone}/audit-report.md`
160
- 6. Any worker with `result_status == fail` and `severity == critical` → milestone verdict = FAIL
162
+ 6. Any worker with `audit_verdict == fail` and `severity == critical` → milestone verdict = FAIL
161
163
 
162
164
  ### Step 6: Verdict
163
165
 
@@ -90,9 +90,9 @@ id,wave,title,description,agent_type,deps
90
90
  | `agent_type` | Input | Agent type: discover/extract-style/extract-animation/extract-layout/package/knowhow |
91
91
  | `deps` | Input | Semicolon-separated dependency task IDs |
92
92
  | `result_status` | Output | `completed` / `failed` (returned via output_schema) |
93
- | `findings` | Output | Key findings summary (max 500 chars) |
94
- | `output_path` | Output | Path to generated artifact |
95
- | `error` | Output | Error message if failed |
93
+ | `findings` | Output | Key findings summary (max 500 chars, via output_schema) |
94
+ | `output_path` | Output | Path to generated artifact (via output_schema) |
95
+ | `error` | Output | Error message if failed (via output_schema) |
96
96
 
97
97
  ### Session Structure
98
98
 
@@ -110,7 +110,9 @@ id,title,description,hypothesis,deps,context_from,wave,status,findings,evidence_
110
110
  | `deps` | Input | Semicolon-separated dependency task IDs (wave 2 depends on wave 1) |
111
111
  | `context_from` | Input | Semicolon-separated task IDs whose findings this task needs |
112
112
  | `wave` | Input | Wave number (1 = investigation, 2 = fix attempt) |
113
- | `status` | Lifecycle | `pending` (initial) → `confirmed`/`refuted`/`inconclusive`/`fixed`/`fix_failed`/`failed`/`skipped` (set by merge step from worker's `result_status`) |
113
+ | `status` | Lifecycle | `pending` (initial) → `completed`/`failed`/`skipped` (set by merge step from worker's `result_status`) |
114
+ | `hypothesis_verdict` | Lifecycle | Wave 1 only: `confirmed`/`refuted`/`inconclusive` (merged from worker output) |
115
+ | `fix_result` | Lifecycle | Wave 2 only: `fixed`/`fix_failed` (merged from worker output) |
114
116
  | `findings` | Lifecycle | Key findings summary (max 500 chars; merged from worker output) |
115
117
  | `evidence_for` | Lifecycle | Evidence supporting the hypothesis (wave 1; merged) |
116
118
  | `evidence_against` | Lifecycle | Evidence refuting the hypothesis (wave 1; merged) |
@@ -250,21 +252,22 @@ spawn_agents_on_csv({
250
252
  output_schema: {
251
253
  type: "object",
252
254
  properties: {
253
- id: { type: "string" },
254
- result_status: { type: "string", enum: ["confirmed", "refuted", "inconclusive", "failed"] },
255
- findings: { type: "string", maxLength: 500 },
256
- evidence_for: { type: "string" },
257
- evidence_against: { type: "string" },
258
- error: { type: "string" }
255
+ id: { type: "string" },
256
+ result_status: { type: "string", enum: ["completed", "failed"] },
257
+ hypothesis_verdict: { type: "string", enum: ["confirmed", "refuted", "inconclusive"], description: "Investigation outcome" },
258
+ findings: { type: "string", maxLength: 500 },
259
+ evidence_for: { type: "string" },
260
+ evidence_against: { type: "string" },
261
+ error: { type: "string" }
259
262
  },
260
- required: ["id", "result_status", "findings"]
263
+ required: ["id", "result_status", "hypothesis_verdict", "findings"]
261
264
  }
262
265
  })
263
266
  ```
264
267
 
265
- 3. **Merge**: for each row in `wave-1-results.csv`, look up master row by `id` and write `master.status = result_status`, then copy `findings`, `evidence_for`, `evidence_against`, `error`. Delete `wave-1.csv` and `wave-1-results.csv`.
268
+ 3. **Merge**: for each row in `wave-1-results.csv`, look up master row by `id` and write `master.status = result_status`, then copy `hypothesis_verdict`, `findings`, `evidence_for`, `evidence_against`, `error`. Delete `wave-1.csv` and `wave-1-results.csv`.
266
269
  4. **Wave 2 gating** (read from MASTER `tasks.csv` after merge, NOT from wave-1-results.csv):
267
- - For each `FIX-H{N}` row: read its `context_from` hypothesis ID (e.g., `H{N}`) from master; if master `H{N}.status != "confirmed"`, set `FIX-H{N}.status = "skipped"` (with findings = "upstream {H{N}.status}").
270
+ - For each `FIX-H{N}` row: read its `context_from` hypothesis ID (e.g., `H{N}`) from master; if master `H{N}.hypothesis_verdict != "confirmed"`, set `FIX-H{N}.status = "skipped"` (with findings = "upstream hypothesis_verdict={H{N}.hypothesis_verdict}").
268
271
  - Only rows where `status == "pending"` proceed to wave 2.
269
272
 
270
273
  #### Wave 1 Worker Contract (WAVE1_INVESTIGATION_INSTRUCTION)
@@ -281,23 +284,24 @@ REQUIRED STEPS:
281
284
  1. Read shared discoveries: {sessionFolder}/discoveries.ndjson (may be empty)
282
285
  2. Scan codebase for evidence using Read/Grep/Glob (read-only investigation)
283
286
  3. Classify the hypothesis based on evidence collected:
284
- - confirmed → strong evidence supports the hypothesis (file:line proof)
285
- - refuted → strong evidence contradicts the hypothesis
286
- - inconclusive → insufficient evidence within time budget; do NOT guess
287
- - failed → tool error / cannot read files / blocked by environment
287
+ - confirmed → strong evidence supports the hypothesis (file:line proof) → result_status=completed, hypothesis_verdict=confirmed
288
+ - refuted → strong evidence contradicts the hypothesis → result_status=completed, hypothesis_verdict=refuted
289
+ - inconclusive → insufficient evidence within time budget; do NOT guess → result_status=completed, hypothesis_verdict=inconclusive
290
+ - failed → tool error / cannot read files / blocked by environment → result_status=failed
288
291
  4. Append discoveries to {sessionFolder}/discoveries.ndjson if reusable (root_cause / hypothesis_evidence types)
289
292
  5. Call report_agent_job_result EXACTLY ONCE with the verdict
290
293
 
291
294
  TERMINATION CONTRACT (mandatory — NO worker may end without calling report_agent_job_result):
292
- - Success path → result_status = confirmed | refuted, with evidence
293
- - Timeout path → if approaching {max_runtime_seconds}, STOP investigation and report inconclusive
294
- - Failure path → on any unrecoverable error, report failed with error message
295
+ - Success path → result_status=completed, hypothesis_verdict = confirmed | refuted, with evidence
296
+ - Timeout path → if approaching {max_runtime_seconds}, STOP investigation and report result_status=completed, hypothesis_verdict=inconclusive
297
+ - Failure path → on any unrecoverable error, result_status=failed with error message
295
298
  - NEVER continue indefinitely. NEVER exit silently. NEVER omit the call.
296
299
 
297
300
  OUTPUT (return via report_agent_job_result; must match output_schema):
298
301
  {
299
302
  "id": "<your row id>",
300
- "result_status": "confirmed" | "refuted" | "inconclusive" | "failed",
303
+ "result_status": "completed" | "failed",
304
+ "hypothesis_verdict": "confirmed" | "refuted" | "inconclusive",
301
305
  "findings": "<one-sentence summary, max 500 chars>",
302
306
  "evidence_for": "<bullet list of file:line refs supporting, or empty>",
303
307
  "evidence_against": "<bullet list of file:line refs refuting, or empty>",
@@ -328,18 +332,19 @@ spawn_agents_on_csv({
328
332
  type: "object",
329
333
  properties: {
330
334
  id: { type: "string" },
331
- result_status: { type: "string", enum: ["fixed", "fix_failed", "failed"] },
335
+ result_status: { type: "string", enum: ["completed", "failed"] },
336
+ fix_result: { type: "string", enum: ["fixed", "fix_failed"], description: "Fix attempt outcome" },
332
337
  findings: { type: "string", maxLength: 500 },
333
338
  fix_applied: { type: "string" },
334
339
  verified: { type: "string", enum: ["true", "false"] },
335
340
  error: { type: "string" }
336
341
  },
337
- required: ["id", "result_status", "findings", "verified"]
342
+ required: ["id", "result_status", "fix_result", "findings", "verified"]
338
343
  }
339
344
  })
340
345
  ```
341
346
 
342
- 4. **Merge**: write `master.status = result_status`, copy `findings`, `fix_applied`, `verified`, `error`. Delete `wave-2.csv` and `wave-2-results.csv`.
347
+ 4. **Merge**: write `master.status = result_status`, copy `fix_result`, `findings`, `fix_applied`, `verified`, `error`. Delete `wave-2.csv` and `wave-2-results.csv`.
343
348
 
344
349
  #### Wave 2 Worker Contract (WAVE2_FIX_INSTRUCTION)
345
350
 
@@ -359,16 +364,17 @@ REQUIRED STEPS:
359
364
  5. Call report_agent_job_result EXACTLY ONCE
360
365
 
361
366
  TERMINATION CONTRACT (mandatory):
362
- - Success path → fix applied AND verified → result_status=fixed, verified="true"
363
- - Partial path → fix applied but verification failed → result_status=fix_failed, verified="false"
364
- - Timeout path → approaching {max_runtime_seconds} with no fix applied → result_status=fix_failed with error="timeout"
367
+ - Success path → fix applied AND verified → result_status=completed, fix_result=fixed, verified="true"
368
+ - Partial path → fix applied but verification failed → result_status=completed, fix_result=fix_failed, verified="false"
369
+ - Timeout path → approaching {max_runtime_seconds} with no fix applied → result_status=completed, fix_result=fix_failed with error="timeout"
365
370
  - Failure path → cannot apply fix (file missing, parse error, etc.) → result_status=failed
366
371
  - NEVER continue indefinitely. NEVER exit silently. NEVER omit the call.
367
372
 
368
373
  OUTPUT (return via report_agent_job_result; must match output_schema):
369
374
  {
370
375
  "id": "<your row id>",
371
- "result_status": "fixed" | "fix_failed" | "failed",
376
+ "result_status": "completed" | "failed",
377
+ "fix_result": "fixed" | "fix_failed",
372
378
  "findings": "<one-sentence summary of what was changed, max 500 chars>",
373
379
  "fix_applied": "<file:line description of the change>",
374
380
  "verified": "true" | "false",
@@ -141,7 +141,23 @@ one agent per module. Use `request_user_input` to confirm critical module list b
141
141
 
142
142
  **STRIDE spawn contract**:
143
143
  - CSV columns: `id, module_path, threats_to_assess, deps, wave, status` (initial `status="pending"`); filter `wave==2 AND status=="pending"`.
144
- - Same `output_schema` as the OWASP spawn above, but `top_issues` JSON items use shape `{stride_category, threat, severity, file:line, mitigation}`.
144
+ - `output_schema`:
145
+
146
+ ```json
147
+ {
148
+ "type": "object",
149
+ "properties": {
150
+ "id": { "type": "string" },
151
+ "result_status": { "type": "string", "enum": ["completed", "failed"] },
152
+ "findings": { "type": "string", "maxLength": 500 },
153
+ "severity_counts": { "type": "string", "description": "JSON: {critical, high, medium, low}" },
154
+ "top_issues": { "type": "string", "description": "JSON array: [{stride_category, threat, severity, file:line, mitigation}]" },
155
+ "error": { "type": "string" }
156
+ },
157
+ "required": ["id", "result_status", "findings"]
158
+ }
159
+ ```
160
+
145
161
  - Same termination contract as the OWASP spawn above (mandatory `report_agent_job_result`, read-only, no recursion, timeout → partial findings, etc.).
146
162
  - Merge: `result_status` → master `status`; copy `findings`, `severity_counts`, `top_issues`, `error`.
147
163
 
@@ -187,7 +187,7 @@ You MUST call report_agent_job_result EXACTLY ONCE before exiting. NO exceptions
187
187
  "findings": "<key findings, max 500 chars>",
188
188
  "files_modified": "<semicolon-separated paths or empty>",
189
189
  "finding_count": "<integer or empty>",
190
- "verdict": "PASS" | "WARN" | "BLOCK" | "" (REV only),
190
+ "verdict": "APPROVE" | "CONDITIONAL" | "BLOCK" | "" (REV only),
191
191
  "error": "<message if not completed>"
192
192
  }
193
193
 
@@ -207,7 +207,7 @@ You MUST call report_agent_job_result EXACTLY ONCE before exiting. NO exceptions
207
207
  "findings": { "type": "string", "maxLength": 500 },
208
208
  "files_modified": { "type": "string" },
209
209
  "finding_count": { "type": "string" },
210
- "verdict": { "type": "string", "enum": ["PASS", "WARN", "BLOCK", ""] },
210
+ "verdict": { "type": "string", "enum": ["APPROVE", "CONDITIONAL", "BLOCK", ""] },
211
211
  "error": { "type": "string" }
212
212
  },
213
213
  "required": ["id", "result_status", "findings"]