maestro-flow 0.3.10 → 0.3.12
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.
- package/.claude/agents/conceptual-planning-agent.md +1 -0
- package/.claude/agents/workflow-analyzer.md +114 -114
- package/.claude/agents/workflow-collab-planner.md +144 -144
- package/.claude/agents/workflow-debugger.md +102 -103
- package/.claude/agents/workflow-executor.md +127 -128
- package/.claude/agents/workflow-integration-checker.md +82 -82
- package/.claude/agents/workflow-nyquist-auditor.md +85 -84
- package/.claude/agents/workflow-phase-researcher.md +85 -85
- package/.claude/agents/workflow-plan-checker.md +90 -90
- package/.claude/agents/workflow-planner.md +178 -178
- package/.claude/agents/workflow-roadmapper.md +81 -83
- package/.claude/agents/workflow-verifier.md +119 -119
- package/.claude/commands/learn-decompose.md +176 -176
- package/.claude/commands/learn-follow.md +167 -167
- package/.claude/commands/learn-retro.md +3 -3
- package/.claude/commands/learn-second-opinion.md +2 -2
- package/.claude/commands/maestro-brainstorm.md +1 -0
- package/.claude/commands/maestro-coordinate.md +1 -3
- package/.claude/commands/maestro-fork.md +133 -111
- package/.claude/commands/maestro-merge.md +85 -77
- package/.claude/commands/maestro-plan.md +88 -2
- package/.claude/commands/maestro-roadmap.md +113 -2
- package/.claude/commands/maestro.md +1 -0
- package/.claude/commands/manage-harvest.md +131 -131
- package/.claude/commands/manage-issue.md +2 -2
- package/.claude/commands/quality-business-test.md +5 -5
- package/.claude/commands/quality-debug.md +3 -2
- package/.claude/commands/quality-retrospective.md +6 -4
- package/.claude/commands/quality-review.md +1 -1
- package/.claude/commands/quality-test-gen.md +5 -4
- package/.claude/commands/spec-add.md +67 -56
- package/.claude/commands/spec-load.md +66 -64
- package/.claude/commands/spec-setup.md +5 -9
- package/.codex/skills/learn-decompose/SKILL.md +119 -0
- package/.codex/skills/learn-follow/SKILL.md +83 -0
- package/.codex/skills/learn-investigate/SKILL.md +83 -0
- package/.codex/skills/learn-retro/SKILL.md +83 -0
- package/.codex/skills/learn-second-opinion/SKILL.md +86 -0
- package/.codex/skills/maestro/SKILL.md +151 -279
- package/.codex/skills/maestro-analyze/SKILL.md +59 -71
- package/.codex/skills/maestro-brainstorm/SKILL.md +452 -463
- package/.codex/skills/maestro-chain/SKILL.md +95 -110
- package/.codex/skills/maestro-coordinate/SKILL.md +68 -234
- package/.codex/skills/maestro-execute/SKILL.md +435 -446
- package/.codex/skills/maestro-fork/SKILL.md +98 -0
- package/.codex/skills/maestro-init/SKILL.md +172 -167
- package/.codex/skills/maestro-learn/SKILL.md +80 -0
- package/.codex/skills/maestro-link-coordinate/SKILL.md +224 -220
- package/.codex/skills/maestro-merge/SKILL.md +69 -0
- package/.codex/skills/maestro-milestone-audit/SKILL.md +108 -103
- package/.codex/skills/maestro-milestone-complete/SKILL.md +155 -149
- package/.codex/skills/maestro-milestone-release/SKILL.md +70 -0
- package/.codex/skills/maestro-overlay/SKILL.md +188 -185
- package/.codex/skills/maestro-plan/SKILL.md +58 -69
- package/.codex/skills/maestro-quick/SKILL.md +26 -23
- package/.codex/skills/maestro-roadmap/SKILL.md +65 -73
- package/.codex/skills/maestro-spec-generate/SKILL.md +66 -74
- package/.codex/skills/maestro-ui-design/SKILL.md +35 -32
- package/.codex/skills/maestro-verify/SKILL.md +556 -566
- package/.codex/skills/manage-codebase-rebuild/SKILL.md +397 -405
- package/.codex/skills/manage-codebase-refresh/SKILL.md +93 -82
- package/.codex/skills/manage-harvest/SKILL.md +82 -0
- package/.codex/skills/manage-issue/SKILL.md +80 -65
- package/.codex/skills/manage-issue-discover/SKILL.md +491 -503
- package/.codex/skills/manage-learn/SKILL.md +190 -186
- package/.codex/skills/manage-memory/SKILL.md +95 -72
- package/.codex/skills/manage-memory-capture/SKILL.md +99 -86
- package/.codex/skills/manage-status/SKILL.md +102 -89
- package/.codex/skills/quality-business-test/SKILL.md +228 -223
- package/.codex/skills/quality-debug/SKILL.md +54 -66
- package/.codex/skills/quality-integration-test/SKILL.md +532 -544
- package/.codex/skills/quality-refactor/SKILL.md +197 -191
- package/.codex/skills/quality-retrospective/SKILL.md +512 -505
- package/.codex/skills/quality-review/SKILL.md +95 -107
- package/.codex/skills/quality-sync/SKILL.md +101 -89
- package/.codex/skills/quality-test/SKILL.md +202 -198
- package/.codex/skills/quality-test-gen/SKILL.md +94 -105
- package/.codex/skills/spec-add/SKILL.md +58 -39
- package/.codex/skills/spec-load/SKILL.md +45 -40
- package/.codex/skills/spec-map/SKILL.md +180 -182
- package/.codex/skills/spec-setup/SKILL.md +94 -76
- package/.codex/skills/team-coordinate/SKILL.md +346 -357
- package/.codex/skills/team-executor/SKILL.md +70 -112
- package/.codex/skills/team-lifecycle-v4/SKILL.md +311 -299
- package/.codex/skills/team-quality-assurance/SKILL.md +234 -227
- package/.codex/skills/team-review/SKILL.md +232 -225
- package/.codex/skills/team-tech-debt/SKILL.md +78 -100
- package/.codex/skills/team-testing/SKILL.md +242 -235
- package/.codex/skills/wiki-connect/SKILL.md +75 -0
- package/.codex/skills/wiki-digest/SKILL.md +87 -0
- package/README.md +9 -4
- package/README.zh-CN.md +9 -4
- package/dashboard/dist/assets/{ArtifactsPage-DZNCi6tn.js → ArtifactsPage-CUrrDGgN.js} +1 -1
- package/dashboard/dist/assets/ChatInput-pUOLJIKE.js +49 -0
- package/dashboard/dist/assets/ChatPage-B8Xqkt0v.js +27 -0
- package/dashboard/dist/assets/{CollabPage-B4NAHXS2.js → CollabPage-DIUXeazv.js} +1 -1
- package/dashboard/dist/assets/{ExecutionPanel-CFt4LJyq.js → ExecutionPanel-VmYeADFj.js} +1 -1
- package/dashboard/dist/assets/KanbanPage-DLq8v7hg.js +21 -0
- package/dashboard/dist/assets/{MarkdownRenderer-X4af_WNb.js → MarkdownRenderer-D7AehrnR.js} +1 -1
- package/dashboard/dist/assets/{McpPage-BKfCVIyU.js → McpPage-BY0SjTgw.js} +2 -2
- package/dashboard/dist/assets/{OutputPanel-BlBQFJSW.js → OutputPanel-B-Rjwgmv.js} +1 -1
- package/dashboard/dist/assets/{ProblemsPanel-De3DLvoI.js → ProblemsPanel-GEpF-oi4.js} +1 -1
- package/dashboard/dist/assets/RequirementBoardPage-xs8uDM7I.js +6 -0
- package/dashboard/dist/assets/{RequirementPage-Bllxe2XI.js → RequirementPage-BKDSFwjA.js} +5 -10
- package/dashboard/dist/assets/SpecsPage-DLFb9ZH0.js +36 -0
- package/dashboard/dist/assets/SupervisorPage-SOki_kgz.js +6 -0
- package/dashboard/dist/assets/TeamsPage-BO2kP70F.js +11 -0
- package/dashboard/dist/assets/{TreeBrowser-Q12qobZs.js → TreeBrowser-B9DHdULE.js} +1 -1
- package/dashboard/dist/assets/{WorkflowPage-D_Fzdy3_.js → WorkflowPage-C8hWbYim.js} +1 -1
- package/dashboard/dist/assets/{check-u6fGOwQO.js → check-DJDk3A2a.js} +1 -1
- package/dashboard/dist/assets/{chevron-right-Csu22t58.js → chevron-right-C7bVDreZ.js} +1 -1
- package/dashboard/dist/assets/{circle-CMrkbRNg.js → circle-Qfgy4LB_.js} +1 -1
- package/dashboard/dist/assets/{circle-alert-c3tH1P4z.js → circle-alert-Na1vf6qQ.js} +1 -1
- package/dashboard/dist/assets/{circle-check-gYxxSYuH.js → circle-check-CEGgy3NV.js} +1 -1
- package/dashboard/dist/assets/{circle-check-big-TDSeWstm.js → circle-check-big-3JB8zRYj.js} +1 -1
- package/dashboard/dist/assets/{code-CFN2uX9V.js → code-Ble63Idz.js} +1 -1
- package/dashboard/dist/assets/{columns-3-38xIDlzy.js → columns-3-BUcKlxve.js} +1 -1
- package/dashboard/dist/assets/{download-DC7KkKyP.js → download-CMqkfn8x.js} +1 -1
- package/dashboard/dist/assets/{folder-CWq_lAnf.js → folder-B9ewx9LL.js} +1 -1
- package/dashboard/dist/assets/index-C2Mcb4TJ.js +231 -0
- package/dashboard/dist/assets/index-DyBbPc18.css +1 -0
- package/dashboard/dist/assets/{index-Do71weNR.js → index-JTmGteaT.js} +1 -1
- package/dashboard/dist/assets/{list-CgIP_2A-.js → list-DI8Wn2aT.js} +1 -1
- package/dashboard/dist/assets/loader-B5F6PzFT.js +11 -0
- package/dashboard/dist/assets/{minus-DYoN5UGk.js → minus-Lp_BfctG.js} +1 -1
- package/dashboard/dist/assets/{pen-line-Bh_WKYHm.js → pen-line-Ch7sphzZ.js} +1 -1
- package/dashboard/dist/assets/pencil-_yRMHmGT.js +6 -0
- package/dashboard/dist/assets/{proxy-BKxDAKTj.js → proxy-D72Y8a4Y.js} +1 -1
- package/dashboard/dist/assets/{search-SieXnOgr.js → search-BS6fI6Bg.js} +1 -1
- package/dashboard/dist/assets/{shallow-Bme1JY57.js → shallow-BXasQBvr.js} +1 -1
- package/dashboard/dist/assets/table-CeGlFjlP.js +6 -0
- package/dashboard/dist/assets/{terminal-BB3Xfuv5.js → terminal-BJic2yW-.js} +1 -1
- package/dashboard/dist/assets/{trash-2-C8f4vFFM.js → trash-2-Czz4X8Fb.js} +1 -1
- package/dashboard/dist/assets/{zap-4uwlzVm0.js → zap-C3H0jVFA.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js +16 -1
- package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/delegate-broker-monitor.js +1 -2
- package/dashboard/dist-server/dashboard/src/server/agents/delegate-broker-monitor.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/commander/commander-prompts.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/commander/commander-prompts.js +2 -1
- package/dashboard/dist-server/dashboard/src/server/commander/commander-prompts.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/index.js +3 -0
- package/dashboard/dist-server/dashboard/src/server/index.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/collab.js +124 -0
- package/dashboard/dist-server/dashboard/src/server/routes/collab.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/specs.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js +75 -30
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.d.ts +5 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js +5 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/team-handler.d.ts +10 -0
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/team-handler.js +73 -0
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/team-handler.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/shared/collab-types.d.ts +31 -0
- package/dashboard/dist-server/dashboard/src/shared/collab-types.js +28 -0
- package/dashboard/dist-server/dashboard/src/shared/collab-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js +10 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/coordinate-types.d.ts +22 -0
- package/dashboard/dist-server/dashboard/src/shared/issue-types.d.ts +12 -0
- package/dashboard/dist-server/dashboard/src/shared/issue-types.js +12 -0
- package/dashboard/dist-server/dashboard/src/shared/issue-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +22 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.js +7 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/types.d.ts +3 -2
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.d.ts +28 -2
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
- package/dashboard/dist-server/shared/agent-types.d.ts +4 -0
- package/dashboard/dist-server/src/hooks/constants.d.ts +3 -1
- package/dashboard/dist-server/src/hooks/constants.js +4 -2
- package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
- package/dist/shared/agent-types.d.ts +4 -0
- package/dist/shared/agent-types.d.ts.map +1 -1
- package/dist/src/commands/collab.js +4 -4
- package/dist/src/commands/collab.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +66 -1
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/install-backend.d.ts.map +1 -1
- package/dist/src/commands/install-backend.js +29 -18
- package/dist/src/commands/install-backend.js.map +1 -1
- package/dist/src/commands/spec.d.ts.map +1 -1
- package/dist/src/commands/spec.js +7 -2
- package/dist/src/commands/spec.js.map +1 -1
- package/dist/src/hooks/__tests__/statusline-visual-test.js +23 -1
- package/dist/src/hooks/__tests__/statusline-visual-test.js.map +1 -1
- package/dist/src/hooks/constants.d.ts +3 -1
- package/dist/src/hooks/constants.d.ts.map +1 -1
- package/dist/src/hooks/constants.js +4 -2
- package/dist/src/hooks/constants.js.map +1 -1
- package/dist/src/hooks/guards/index.d.ts +1 -0
- package/dist/src/hooks/guards/index.d.ts.map +1 -1
- package/dist/src/hooks/guards/index.js +1 -0
- package/dist/src/hooks/guards/index.js.map +1 -1
- package/dist/src/hooks/guards/spec-validator.d.ts +25 -0
- package/dist/src/hooks/guards/spec-validator.d.ts.map +1 -0
- package/dist/src/hooks/guards/spec-validator.js +66 -0
- package/dist/src/hooks/guards/spec-validator.js.map +1 -0
- package/dist/src/hooks/keyword-spec-injector.d.ts +21 -0
- package/dist/src/hooks/keyword-spec-injector.d.ts.map +1 -0
- package/dist/src/hooks/keyword-spec-injector.js +96 -0
- package/dist/src/hooks/keyword-spec-injector.js.map +1 -0
- package/dist/src/hooks/plugins/spec-injection-plugin.d.ts +2 -1
- package/dist/src/hooks/plugins/spec-injection-plugin.d.ts.map +1 -1
- package/dist/src/hooks/plugins/spec-injection-plugin.js +21 -12
- package/dist/src/hooks/plugins/spec-injection-plugin.js.map +1 -1
- package/dist/src/hooks/skill-context.d.ts +3 -0
- package/dist/src/hooks/skill-context.d.ts.map +1 -1
- package/dist/src/hooks/skill-context.js +95 -9
- package/dist/src/hooks/skill-context.js.map +1 -1
- package/dist/src/hooks/spec-bridge.d.ts +40 -0
- package/dist/src/hooks/spec-bridge.d.ts.map +1 -0
- package/dist/src/hooks/spec-bridge.js +97 -0
- package/dist/src/hooks/spec-bridge.js.map +1 -0
- package/dist/src/hooks/spec-injector.d.ts.map +1 -1
- package/dist/src/hooks/spec-injector.js +18 -12
- package/dist/src/hooks/spec-injector.js.map +1 -1
- package/dist/src/hooks/statusline.d.ts.map +1 -1
- package/dist/src/hooks/statusline.js +6 -3
- package/dist/src/hooks/statusline.js.map +1 -1
- package/dist/src/team/phase-orchestrator.d.ts +52 -0
- package/dist/src/team/phase-orchestrator.d.ts.map +1 -0
- package/dist/src/team/phase-orchestrator.js +165 -0
- package/dist/src/team/phase-orchestrator.js.map +1 -0
- package/dist/src/team/phase-types.d.ts +51 -0
- package/dist/src/team/phase-types.d.ts.map +1 -0
- package/dist/src/team/phase-types.js +41 -0
- package/dist/src/team/phase-types.js.map +1 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +6 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/merge-validator.d.ts.map +1 -1
- package/dist/src/tools/merge-validator.js +114 -16
- package/dist/src/tools/merge-validator.js.map +1 -1
- package/dist/src/tools/spec-entry-parser.d.ts +56 -0
- package/dist/src/tools/spec-entry-parser.d.ts.map +1 -0
- package/dist/src/tools/spec-entry-parser.js +196 -0
- package/dist/src/tools/spec-entry-parser.js.map +1 -0
- package/dist/src/tools/spec-init.d.ts.map +1 -1
- package/dist/src/tools/spec-init.js +66 -92
- package/dist/src/tools/spec-init.js.map +1 -1
- package/dist/src/tools/spec-keyword-index.d.ts +30 -0
- package/dist/src/tools/spec-keyword-index.d.ts.map +1 -0
- package/dist/src/tools/spec-keyword-index.js +101 -0
- package/dist/src/tools/spec-keyword-index.js.map +1 -0
- package/dist/src/tools/spec-loader.d.ts +3 -3
- package/dist/src/tools/spec-loader.d.ts.map +1 -1
- package/dist/src/tools/spec-loader.js +49 -23
- package/dist/src/tools/spec-loader.js.map +1 -1
- package/dist/src/tools/team-agents.d.ts +27 -0
- package/dist/src/tools/team-agents.d.ts.map +1 -0
- package/dist/src/tools/team-agents.js +362 -0
- package/dist/src/tools/team-agents.js.map +1 -0
- package/dist/src/tools/team-mailbox.d.ts +40 -0
- package/dist/src/tools/team-mailbox.d.ts.map +1 -0
- package/dist/src/tools/team-mailbox.js +384 -0
- package/dist/src/tools/team-mailbox.js.map +1 -0
- package/dist/src/tools/team-msg.d.ts +17 -8
- package/dist/src/tools/team-msg.d.ts.map +1 -1
- package/dist/src/tools/team-msg.js +110 -13
- package/dist/src/tools/team-msg.js.map +1 -1
- package/dist/src/tools/team-tasks-mcp.d.ts +27 -0
- package/dist/src/tools/team-tasks-mcp.d.ts.map +1 -0
- package/dist/src/tools/team-tasks-mcp.js +408 -0
- package/dist/src/tools/team-tasks-mcp.js.map +1 -0
- package/package.json +2 -1
- package/shared/agent-types.ts +4 -0
- package/templates/worktree-scope.json +9 -10
- package/templates/worktrees.json +26 -27
- package/workflows/analyze.md +816 -816
- package/workflows/brainstorm.md +480 -471
- package/workflows/codebase-rebuild.md +332 -332
- package/workflows/codebase-refresh.md +240 -240
- package/workflows/debug.md +16 -6
- package/workflows/execute.md +1 -1
- package/workflows/fork.md +100 -36
- package/workflows/harvest.md +420 -420
- package/workflows/integration-test.md +355 -343
- package/workflows/issue-discover.md +414 -414
- package/workflows/issue.md +14 -4
- package/workflows/learn.md +19 -5
- package/workflows/maestro.md +1 -0
- package/workflows/map.md +111 -111
- package/workflows/merge.md +113 -55
- package/workflows/milestone-complete.md +176 -176
- package/workflows/plan.md +1 -1
- package/workflows/quick.md +497 -497
- package/workflows/refactor.md +300 -300
- package/workflows/retrospective.md +61 -22
- package/workflows/review.md +17 -4
- package/workflows/roadmap.md +335 -335
- package/workflows/spec-generate.md +640 -640
- package/workflows/specs-add.md +46 -81
- package/workflows/specs-load.md +15 -17
- package/workflows/specs-setup.md +40 -161
- package/workflows/test.md +12 -2
- package/workflows/ui-style.md +9 -2
- package/dashboard/dist/assets/ChatInput-Bvr-FeEq.js +0 -49
- package/dashboard/dist/assets/ChatPage-D9zTkJZo.js +0 -22
- package/dashboard/dist/assets/KanbanPage-C8USth6H.js +0 -21
- package/dashboard/dist/assets/RequirementBoardPage-Bf1trzqs.js +0 -11
- package/dashboard/dist/assets/SpecsPage-9lwxKT27.js +0 -36
- package/dashboard/dist/assets/SupervisorPage-SusdfHFq.js +0 -6
- package/dashboard/dist/assets/TeamsPage-DsuM6OwC.js +0 -6
- package/dashboard/dist/assets/arrow-left-Bqtb2hle.js +0 -6
- package/dashboard/dist/assets/index-DWG-WrzT.js +0 -231
- package/dashboard/dist/assets/index-GUNJodSR.css +0 -1
- package/dashboard/dist/assets/table-llyEtj-7.js +0 -6
package/workflows/harvest.md
CHANGED
|
@@ -1,420 +1,420 @@
|
|
|
1
|
-
# Harvest Workflow
|
|
2
|
-
|
|
3
|
-
Extract knowledge from workflow artifacts and route into wiki / spec / issue stores.
|
|
4
|
-
|
|
5
|
-
Unlike `retrospective.md` which is phase-scoped and post-execution, harvest operates on **any workflow session artifact** — analysis results, brainstorm outputs, debug sessions, lite-plan/fix results, scratchpad notes, and completed workflow sessions.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Prerequisites
|
|
10
|
-
|
|
11
|
-
- `.workflow/` initialized (`.workflow/state.json` exists)
|
|
12
|
-
- At least one artifact source present (analysis, brainstorm, debug, lite-plan, lite-fix, scratchpad, or active session)
|
|
13
|
-
- For wiki routing: `maestro wiki` CLI available
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Argument Shape
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
/manage-harvest → scan all sources, interactive selection
|
|
21
|
-
/manage-harvest <session-id> → harvest specific session (ANL-*, WFS-*, etc.)
|
|
22
|
-
/manage-harvest <path> → harvest from explicit directory or file
|
|
23
|
-
/manage-harvest --recent 7 → harvest from artifacts updated in last 7 days
|
|
24
|
-
/manage-harvest --source analysis → harvest only from analysis sessions
|
|
25
|
-
/manage-harvest <target> --to wiki → force all findings to wiki
|
|
26
|
-
/manage-harvest <target> --to spec → force all findings to spec
|
|
27
|
-
/manage-harvest <target> --to issue → force all findings to issue
|
|
28
|
-
/manage-harvest <target> --to auto → auto-classify routing (default)
|
|
29
|
-
/manage-harvest <target> --dry-run → preview without writing
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
| Flag | Effect |
|
|
33
|
-
|------|--------|
|
|
34
|
-
| `--to <target>` | Force routing target: `wiki`, `spec`, `issue`, `auto` (default: auto) |
|
|
35
|
-
| `--source <type>` | Filter by source type: `analysis`, `brainstorm`, `debug`, `lite-plan`, `lite-fix`, `scratchpad`, `session`, `all` |
|
|
36
|
-
| `--recent N` | Only scan artifacts updated within last N days (default: 30) |
|
|
37
|
-
| `--dry-run` | Preview extracted items without writing to any store |
|
|
38
|
-
| `-y` / `--yes` | Skip confirmation prompts, accept all routing |
|
|
39
|
-
| `--min-confidence N` | Minimum extraction confidence 0.0-1.0 (default: 0.5) |
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Stage 1: parse_input
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
1. Verify .workflow/ exists; else error E001.
|
|
47
|
-
2. Tokenize $ARGUMENTS:
|
|
48
|
-
- First non-flag token: session ID, path, or empty (scan mode)
|
|
49
|
-
- Flags: --to, --source, --recent, --dry-run, -y, --min-confidence
|
|
50
|
-
3. Build:
|
|
51
|
-
mode = "scan" | "session" | "path"
|
|
52
|
-
target_filter = "auto" | "wiki" | "spec" | "issue"
|
|
53
|
-
source_filter = "all" | specific source type
|
|
54
|
-
recent_days = 30 (or --recent value)
|
|
55
|
-
dry_run = false
|
|
56
|
-
auto_yes = false
|
|
57
|
-
min_confidence = 0.5
|
|
58
|
-
4. Validate --to value. Unknown target → error E002.
|
|
59
|
-
5. Validate --source value. Unknown source → error E003.
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## Stage 2: discover_artifacts
|
|
65
|
-
|
|
66
|
-
Scan `.workflow/` for harvestable artifacts. Each source type has a known structure:
|
|
67
|
-
|
|
68
|
-
### Source Registry
|
|
69
|
-
|
|
70
|
-
| Source Type | Scan Path | Key Files | ID Pattern |
|
|
71
|
-
|-------------|-----------|-----------|------------|
|
|
72
|
-
| `analysis` | `.workflow/.analysis/ANL-*/` | `conclusions.json`, `*.md` | `ANL-*` |
|
|
73
|
-
| `brainstorm` | `.workflow/scratch/brainstorm-*/` | `guidance-specification.md`, `brainstorm-*.md` | directory name |
|
|
74
|
-
| `lite-plan` | `.workflow/.lite-plan/*/` | `plan.json`, `plan-overview.md` | directory name |
|
|
75
|
-
| `lite-fix` | `.workflow/.lite-fix/*/` | `fix-plan.json` | directory name |
|
|
76
|
-
| `debug` | `.workflow/.debug/*/` | `debug-log.md`, `hypothesis-*.md` | directory name |
|
|
77
|
-
| `scratchpad` | `.workflow/.scratchpad/` | `*.md`, `*.json` | filename |
|
|
78
|
-
| `session` | `.workflow/active/WFS-*/` | `workflow-session.json` | `WFS-*` |
|
|
79
|
-
| `learning` | `.workflow/learning/` | `lessons.jsonl`, `digest-*.md`, `*.md` | filename |
|
|
80
|
-
|
|
81
|
-
```
|
|
82
|
-
candidates = []
|
|
83
|
-
FOR each source_type in source_registry:
|
|
84
|
-
IF source_filter != "all" AND source_filter != source_type: SKIP
|
|
85
|
-
Glob for directories/files matching scan_path
|
|
86
|
-
FOR each match:
|
|
87
|
-
stat = file modification time
|
|
88
|
-
IF stat.mtime < (now - recent_days): SKIP
|
|
89
|
-
Read key files, extract:
|
|
90
|
-
- session_id or directory name
|
|
91
|
-
- title (from JSON title field or markdown H1)
|
|
92
|
-
- created_at / updated_at
|
|
93
|
-
- summary (first paragraph or JSON summary field)
|
|
94
|
-
- file_count (number of artifact files)
|
|
95
|
-
candidates.push({ source_type, id, path, title, updated_at, summary, file_count })
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Display candidates
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
=== HARVESTABLE ARTIFACTS ===
|
|
102
|
-
|
|
103
|
-
# Source ID Title Updated Files
|
|
104
|
-
─ ────────── ──────────────────── ─────────────────────── ──────────── ─────
|
|
105
|
-
1 analysis ANL-auth-20260410 Auth vulnerability scan 2026-04-10 4
|
|
106
|
-
2 brainstorm brainstorm-cache Cache strategy options 2026-04-08 3
|
|
107
|
-
3 lite-fix rate-limit-20260405 Rate limiter edge case 2026-04-05 2
|
|
108
|
-
4 debug debug-memory-leak Memory leak in worker 2026-04-03 5
|
|
109
|
-
|
|
110
|
-
Found: 4 artifacts (filtered by: last 30 days)
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Selection logic
|
|
114
|
-
|
|
115
|
-
| Mode | Action |
|
|
116
|
-
|------|--------|
|
|
117
|
-
| `scan`, 0 candidates | Print "No harvestable artifacts found", exit 0 |
|
|
118
|
-
| `scan`, ≥1 candidates | AskUserQuestion: select one, multiple (comma-separated), or "all" |
|
|
119
|
-
| `session` | Find matching session ID in candidates; error E004 if not found |
|
|
120
|
-
| `path` | Validate path exists; auto-detect source type from structure |
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## Stage 3: load_and_extract (per selected artifact)
|
|
125
|
-
|
|
126
|
-
For each selected artifact, load all files and extract knowledge fragments.
|
|
127
|
-
|
|
128
|
-
### 3a. Load artifact content
|
|
129
|
-
|
|
130
|
-
Read all relevant files in the artifact directory. Build a content bundle:
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
bundle = {
|
|
134
|
-
source_type: "analysis" | "brainstorm" | ...,
|
|
135
|
-
id: session_id,
|
|
136
|
-
path: artifact_directory,
|
|
137
|
-
files: [{ name, content, type: "json"|"md" }],
|
|
138
|
-
metadata: extracted from key files (conclusions.json, plan.json, etc.)
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### 3b. Extract knowledge fragments
|
|
143
|
-
|
|
144
|
-
Parse content to identify discrete knowledge items. Each source type has specific extraction patterns:
|
|
145
|
-
|
|
146
|
-
**Analysis (`conclusions.json` + markdown):**
|
|
147
|
-
- `findings[]` → each finding is a fragment
|
|
148
|
-
- `recommendations[]` → each recommendation is a fragment
|
|
149
|
-
- `risks[]` → each risk is a fragment
|
|
150
|
-
- Markdown sections with `## ` headings → section-level fragments
|
|
151
|
-
|
|
152
|
-
**Brainstorm (`guidance-specification.md` + notes):**
|
|
153
|
-
- `## Options` or `## Approaches` → each option is a fragment
|
|
154
|
-
- `## Decision` or `## Recommendation` → decision fragment
|
|
155
|
-
- `## Trade-offs` → trade-off fragments
|
|
156
|
-
- Action items (lines starting with `- [ ]` or `TODO`) → task fragments
|
|
157
|
-
|
|
158
|
-
**Lite-plan (`plan.json`):**
|
|
159
|
-
- `tasks[]` → each with rationale → decision fragments
|
|
160
|
-
- `dependencies[]` → architectural constraint fragments
|
|
161
|
-
- `risks[]` → risk fragments
|
|
162
|
-
|
|
163
|
-
**Lite-fix (`fix-plan.json`):**
|
|
164
|
-
- `root_cause` → bug fragment
|
|
165
|
-
- `fix_strategy` → pattern fragment
|
|
166
|
-
- `verification` → test/validation fragment
|
|
167
|
-
|
|
168
|
-
**Debug (`debug-log.md`, `hypothesis-*.md`):**
|
|
169
|
-
- Final diagnosis → bug fragment
|
|
170
|
-
- Verified hypothesis → pattern/lesson fragment
|
|
171
|
-
- Rejected hypotheses with reasoning → lesson fragment
|
|
172
|
-
|
|
173
|
-
**Scratchpad (*.md):**
|
|
174
|
-
- Markdown sections → generic fragments
|
|
175
|
-
- Code blocks with explanations → pattern fragments
|
|
176
|
-
|
|
177
|
-
**Session (`workflow-session.json`):**
|
|
178
|
-
- `completed_tasks[].summary` → pattern/decision fragments
|
|
179
|
-
- `key_decisions[]` → decision fragments
|
|
180
|
-
- `deferred_items[]` → issue fragments
|
|
181
|
-
|
|
182
|
-
**Learning (`lessons.jsonl`):**
|
|
183
|
-
- Each lesson line → lesson fragment (check if already routed to wiki/spec/issue)
|
|
184
|
-
|
|
185
|
-
Each fragment gets:
|
|
186
|
-
```
|
|
187
|
-
fragment = {
|
|
188
|
-
id: "HRV-{8 hex}" from hash(source_id + content_hash),
|
|
189
|
-
source_type: ...,
|
|
190
|
-
source_id: ...,
|
|
191
|
-
title: extracted or inferred,
|
|
192
|
-
content: raw text,
|
|
193
|
-
tags: extracted from context,
|
|
194
|
-
category: "finding" | "decision" | "pattern" | "bug" | "risk" | "task" | "lesson" | "recommendation",
|
|
195
|
-
confidence: 0.0-1.0 (based on specificity and actionability)
|
|
196
|
-
}
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
Filter by `--min-confidence`.
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
## Stage 4: classify_routing
|
|
204
|
-
|
|
205
|
-
For each fragment, determine the best routing target (unless `--to` forces a specific target).
|
|
206
|
-
|
|
207
|
-
### Classification Rules
|
|
208
|
-
|
|
209
|
-
| Category | Default Target | Rationale |
|
|
210
|
-
|----------|---------------|-----------|
|
|
211
|
-
| `finding` | wiki (note) | Observations go to knowledge graph |
|
|
212
|
-
| `decision` | wiki (spec) or spec (decision) | Architectural decisions → spec ADR or wiki spec entry |
|
|
213
|
-
| `pattern` | spec (pattern) | Reusable code patterns → coding conventions |
|
|
214
|
-
| `bug` | issue or spec (bug) | Active bugs → issue; fixed bugs → spec learnings |
|
|
215
|
-
| `risk` | issue | Unmitigated risks → trackable issues |
|
|
216
|
-
| `task` | issue | Unfinished work → trackable issues |
|
|
217
|
-
| `lesson` | wiki (lesson) | Generalizable insights → wiki knowledge |
|
|
218
|
-
| `recommendation` | wiki (note) or issue | Actionable recommendations → issue; informational → wiki |
|
|
219
|
-
|
|
220
|
-
### Override with `--to`
|
|
221
|
-
|
|
222
|
-
If `--to wiki`: all fragments → wiki entries
|
|
223
|
-
If `--to spec`: all fragments → spec entries
|
|
224
|
-
If `--to issue`: all fragments → issue entries
|
|
225
|
-
If `--to auto`: use classification rules above
|
|
226
|
-
|
|
227
|
-
### Build routing plan
|
|
228
|
-
|
|
229
|
-
```
|
|
230
|
-
routing_plan = {
|
|
231
|
-
wiki: [{ fragment, wiki_type, slug, title, tags, body }],
|
|
232
|
-
spec: [{ fragment, spec_type, content }],
|
|
233
|
-
issue: [{ fragment, title, severity, description }]
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## Stage 5: preview_and_confirm
|
|
240
|
-
|
|
241
|
-
Display the routing plan:
|
|
242
|
-
|
|
243
|
-
```
|
|
244
|
-
=== HARVEST PLAN ===
|
|
245
|
-
Source: ANL-auth-20260410 (analysis)
|
|
246
|
-
Fragments extracted: 8 (filtered from 12 by confidence ≥ 0.5)
|
|
247
|
-
|
|
248
|
-
→ Wiki (3 entries):
|
|
249
|
-
[note] "SQL injection vector in user input" tags: security, sql
|
|
250
|
-
[lesson] "Parameterized queries prevent injection" tags: security, pattern
|
|
251
|
-
[spec] "Auth token rotation policy" tags: auth, security
|
|
252
|
-
|
|
253
|
-
→ Spec (2 entries):
|
|
254
|
-
[pattern] "Always use parameterized queries for user input"
|
|
255
|
-
[decision] "JWT refresh tokens over session cookies"
|
|
256
|
-
|
|
257
|
-
→ Issue (3 entries):
|
|
258
|
-
[high] "Unvalidated redirect in OAuth callback"
|
|
259
|
-
[medium] "Missing rate limit on token refresh endpoint"
|
|
260
|
-
[low] "Inconsistent error messages leak internal state"
|
|
261
|
-
|
|
262
|
-
Total: 3 wiki + 2 spec + 3 issue = 8 routed items
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
If `--dry-run`: display and exit.
|
|
266
|
-
If NOT `--dry-run` AND NOT `-y`:
|
|
267
|
-
AskUserQuestion: "Apply this routing plan? (yes/edit/skip)" with options.
|
|
268
|
-
- `edit`: re-display with per-item accept/reject
|
|
269
|
-
- `skip`: exit without writing
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
## Stage 6: route_outputs
|
|
274
|
-
|
|
275
|
-
Execute the routing plan. Each target uses existing infrastructure:
|
|
276
|
-
|
|
277
|
-
### 6a. Wiki routing
|
|
278
|
-
|
|
279
|
-
For each wiki item:
|
|
280
|
-
```bash
|
|
281
|
-
maestro wiki create --type <wiki_type> --slug harvest-<source_type>-<short_id> \
|
|
282
|
-
--title "<title>" --tags "<tags>" --body "<body>"
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
Wiki types mapping:
|
|
286
|
-
- `note` → `--type note`
|
|
287
|
-
- `lesson` → `--type lesson`
|
|
288
|
-
- `spec` → `--type spec`
|
|
289
|
-
|
|
290
|
-
If `maestro wiki create` fails, fall back to writing `.workflow/harvest/wiki-pending-{id}.md` with frontmatter.
|
|
291
|
-
|
|
292
|
-
### 6b. Spec routing
|
|
293
|
-
|
|
294
|
-
For each spec item, use the same mechanism as `quality-retrospective` Stage 6:
|
|
295
|
-
|
|
296
|
-
```
|
|
297
|
-
Skill({ skill: "spec-add", args: "<spec_type> <content>" })
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
Where `spec_type` maps from fragment category:
|
|
301
|
-
- `pattern` → `pattern`
|
|
302
|
-
- `decision` → `decision`
|
|
303
|
-
- `bug` → `bug`
|
|
304
|
-
- `lesson` → `rule` (if it prescribes a rule)
|
|
305
|
-
|
|
306
|
-
### 6c. Issue routing
|
|
307
|
-
|
|
308
|
-
For each issue item, append to `.workflow/issues/issues.jsonl` using the canonical schema from `workflows/issue.md`:
|
|
309
|
-
|
|
310
|
-
```json
|
|
311
|
-
{
|
|
312
|
-
"id": "ISS-{YYYYMMDD}-{NNN}",
|
|
313
|
-
"title": "<title>",
|
|
314
|
-
"description": "<description>",
|
|
315
|
-
"severity": "<high|medium|low>",
|
|
316
|
-
"status": "open",
|
|
317
|
-
"source": "harvest",
|
|
318
|
-
"source_ref": "<source_id>",
|
|
319
|
-
"tags": [],
|
|
320
|
-
"created_at": "<ISO timestamp>",
|
|
321
|
-
"issue_history": [{ "action": "created", "timestamp": "<ISO>", "by": "harvest", "detail": "Extracted from <source_type> <source_id>" }]
|
|
322
|
-
}
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
### 6d. Track harvest provenance
|
|
326
|
-
|
|
327
|
-
For each routed item, record in `.workflow/harvest/harvest-log.jsonl`:
|
|
328
|
-
|
|
329
|
-
```json
|
|
330
|
-
{
|
|
331
|
-
"fragment_id": "HRV-...",
|
|
332
|
-
"source_type": "analysis",
|
|
333
|
-
"source_id": "ANL-auth-20260410",
|
|
334
|
-
"routed_to": "wiki|spec|issue",
|
|
335
|
-
"target_id": "note-harvest-analysis-abc123|ISS-20260413-001|...",
|
|
336
|
-
"timestamp": "<ISO>",
|
|
337
|
-
"title": "<title>",
|
|
338
|
-
"confidence": 0.85
|
|
339
|
-
}
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
This log prevents duplicate harvesting in future runs.
|
|
343
|
-
|
|
344
|
-
---
|
|
345
|
-
|
|
346
|
-
## Stage 7: dedup_check
|
|
347
|
-
|
|
348
|
-
Before writing any item in Stage 6, check for duplicates:
|
|
349
|
-
|
|
350
|
-
1. **harvest-log.jsonl**: Has this fragment_id already been routed?
|
|
351
|
-
2. **Wiki**: `maestro wiki search "<title>"` — does a similar entry exist?
|
|
352
|
-
3. **Issues**: Search `issues.jsonl` for matching title/description
|
|
353
|
-
4. **Specs**: Search `learnings.md` for similar content
|
|
354
|
-
|
|
355
|
-
If duplicate found:
|
|
356
|
-
- Skip with `[SKIP-DUP]` marker
|
|
357
|
-
- Log to harvest report
|
|
358
|
-
|
|
359
|
-
---
|
|
360
|
-
|
|
361
|
-
## Stage 8: report
|
|
362
|
-
|
|
363
|
-
Write `.workflow/harvest/harvest-report-{date}.md`:
|
|
364
|
-
|
|
365
|
-
```markdown
|
|
366
|
-
# Harvest Report — {date}
|
|
367
|
-
|
|
368
|
-
## Source
|
|
369
|
-
- Type: {source_type}
|
|
370
|
-
- ID: {source_id}
|
|
371
|
-
- Path: {path}
|
|
372
|
-
|
|
373
|
-
## Extraction Summary
|
|
374
|
-
- Fragments found: {total}
|
|
375
|
-
- Filtered by confidence: {filtered_count}
|
|
376
|
-
- Duplicates skipped: {dup_count}
|
|
377
|
-
|
|
378
|
-
## Routing Results
|
|
379
|
-
|
|
380
|
-
### Wiki ({N} entries)
|
|
381
|
-
| # | Type | Slug | Title | Status |
|
|
382
|
-
|---|------|------|-------|--------|
|
|
383
|
-
| 1 | note | harvest-analysis-abc | SQL injection vector | CREATED |
|
|
384
|
-
| 2 | lesson | harvest-analysis-def | Parameterized queries | CREATED |
|
|
385
|
-
|
|
386
|
-
### Spec ({N} entries)
|
|
387
|
-
| # | Type | Content (truncated) | Status |
|
|
388
|
-
|---|------|---------------------|--------|
|
|
389
|
-
| 1 | pattern | Always use parameterized queries... | ADDED |
|
|
390
|
-
|
|
391
|
-
### Issue ({N} entries)
|
|
392
|
-
| # | Severity | Title | ID | Status |
|
|
393
|
-
|---|----------|-------|-----|--------|
|
|
394
|
-
| 1 | high | Unvalidated redirect in OAuth... | ISS-20260413-001 | CREATED |
|
|
395
|
-
|
|
396
|
-
## Skipped
|
|
397
|
-
| Fragment | Reason |
|
|
398
|
-
|----------|--------|
|
|
399
|
-
| HRV-abc123 | Duplicate: existing wiki entry note-sql-injection |
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
Display summary:
|
|
403
|
-
|
|
404
|
-
```
|
|
405
|
-
=== HARVEST COMPLETE ===
|
|
406
|
-
Source: ANL-auth-20260410 (analysis)
|
|
407
|
-
|
|
408
|
-
Wiki: 3 created, 0 skipped
|
|
409
|
-
Spec: 2 added, 0 skipped
|
|
410
|
-
Issue: 3 created, 1 skipped (dup)
|
|
411
|
-
|
|
412
|
-
Report: .workflow/harvest/harvest-report-2026-04-13.md
|
|
413
|
-
Log: .workflow/harvest/harvest-log.jsonl
|
|
414
|
-
|
|
415
|
-
Next:
|
|
416
|
-
→ Review wiki entries: maestro wiki list --type note
|
|
417
|
-
→ Triage issues: Skill({ skill: "manage-issue", args: "list --source harvest" })
|
|
418
|
-
→ Connect wiki graph: Skill({ skill: "wiki-connect", args: "--fix" })
|
|
419
|
-
→ View specs: Skill({ skill: "spec-load", args: "--category
|
|
420
|
-
```
|
|
1
|
+
# Harvest Workflow
|
|
2
|
+
|
|
3
|
+
Extract knowledge from workflow artifacts and route into wiki / spec / issue stores.
|
|
4
|
+
|
|
5
|
+
Unlike `retrospective.md` which is phase-scoped and post-execution, harvest operates on **any workflow session artifact** — analysis results, brainstorm outputs, debug sessions, lite-plan/fix results, scratchpad notes, and completed workflow sessions.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
- `.workflow/` initialized (`.workflow/state.json` exists)
|
|
12
|
+
- At least one artifact source present (analysis, brainstorm, debug, lite-plan, lite-fix, scratchpad, or active session)
|
|
13
|
+
- For wiki routing: `maestro wiki` CLI available
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Argument Shape
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
/manage-harvest → scan all sources, interactive selection
|
|
21
|
+
/manage-harvest <session-id> → harvest specific session (ANL-*, WFS-*, etc.)
|
|
22
|
+
/manage-harvest <path> → harvest from explicit directory or file
|
|
23
|
+
/manage-harvest --recent 7 → harvest from artifacts updated in last 7 days
|
|
24
|
+
/manage-harvest --source analysis → harvest only from analysis sessions
|
|
25
|
+
/manage-harvest <target> --to wiki → force all findings to wiki
|
|
26
|
+
/manage-harvest <target> --to spec → force all findings to spec
|
|
27
|
+
/manage-harvest <target> --to issue → force all findings to issue
|
|
28
|
+
/manage-harvest <target> --to auto → auto-classify routing (default)
|
|
29
|
+
/manage-harvest <target> --dry-run → preview without writing
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
| Flag | Effect |
|
|
33
|
+
|------|--------|
|
|
34
|
+
| `--to <target>` | Force routing target: `wiki`, `spec`, `issue`, `auto` (default: auto) |
|
|
35
|
+
| `--source <type>` | Filter by source type: `analysis`, `brainstorm`, `debug`, `lite-plan`, `lite-fix`, `scratchpad`, `session`, `all` |
|
|
36
|
+
| `--recent N` | Only scan artifacts updated within last N days (default: 30) |
|
|
37
|
+
| `--dry-run` | Preview extracted items without writing to any store |
|
|
38
|
+
| `-y` / `--yes` | Skip confirmation prompts, accept all routing |
|
|
39
|
+
| `--min-confidence N` | Minimum extraction confidence 0.0-1.0 (default: 0.5) |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Stage 1: parse_input
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
1. Verify .workflow/ exists; else error E001.
|
|
47
|
+
2. Tokenize $ARGUMENTS:
|
|
48
|
+
- First non-flag token: session ID, path, or empty (scan mode)
|
|
49
|
+
- Flags: --to, --source, --recent, --dry-run, -y, --min-confidence
|
|
50
|
+
3. Build:
|
|
51
|
+
mode = "scan" | "session" | "path"
|
|
52
|
+
target_filter = "auto" | "wiki" | "spec" | "issue"
|
|
53
|
+
source_filter = "all" | specific source type
|
|
54
|
+
recent_days = 30 (or --recent value)
|
|
55
|
+
dry_run = false
|
|
56
|
+
auto_yes = false
|
|
57
|
+
min_confidence = 0.5
|
|
58
|
+
4. Validate --to value. Unknown target → error E002.
|
|
59
|
+
5. Validate --source value. Unknown source → error E003.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Stage 2: discover_artifacts
|
|
65
|
+
|
|
66
|
+
Scan `.workflow/` for harvestable artifacts. Each source type has a known structure:
|
|
67
|
+
|
|
68
|
+
### Source Registry
|
|
69
|
+
|
|
70
|
+
| Source Type | Scan Path | Key Files | ID Pattern |
|
|
71
|
+
|-------------|-----------|-----------|------------|
|
|
72
|
+
| `analysis` | `.workflow/.analysis/ANL-*/` | `conclusions.json`, `*.md` | `ANL-*` |
|
|
73
|
+
| `brainstorm` | `.workflow/scratch/brainstorm-*/` | `guidance-specification.md`, `brainstorm-*.md` | directory name |
|
|
74
|
+
| `lite-plan` | `.workflow/.lite-plan/*/` | `plan.json`, `plan-overview.md` | directory name |
|
|
75
|
+
| `lite-fix` | `.workflow/.lite-fix/*/` | `fix-plan.json` | directory name |
|
|
76
|
+
| `debug` | `.workflow/.debug/*/` | `debug-log.md`, `hypothesis-*.md` | directory name |
|
|
77
|
+
| `scratchpad` | `.workflow/.scratchpad/` | `*.md`, `*.json` | filename |
|
|
78
|
+
| `session` | `.workflow/active/WFS-*/` | `workflow-session.json` | `WFS-*` |
|
|
79
|
+
| `learning` | `.workflow/learning/` | `lessons.jsonl`, `digest-*.md`, `*.md` | filename |
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
candidates = []
|
|
83
|
+
FOR each source_type in source_registry:
|
|
84
|
+
IF source_filter != "all" AND source_filter != source_type: SKIP
|
|
85
|
+
Glob for directories/files matching scan_path
|
|
86
|
+
FOR each match:
|
|
87
|
+
stat = file modification time
|
|
88
|
+
IF stat.mtime < (now - recent_days): SKIP
|
|
89
|
+
Read key files, extract:
|
|
90
|
+
- session_id or directory name
|
|
91
|
+
- title (from JSON title field or markdown H1)
|
|
92
|
+
- created_at / updated_at
|
|
93
|
+
- summary (first paragraph or JSON summary field)
|
|
94
|
+
- file_count (number of artifact files)
|
|
95
|
+
candidates.push({ source_type, id, path, title, updated_at, summary, file_count })
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Display candidates
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
=== HARVESTABLE ARTIFACTS ===
|
|
102
|
+
|
|
103
|
+
# Source ID Title Updated Files
|
|
104
|
+
─ ────────── ──────────────────── ─────────────────────── ──────────── ─────
|
|
105
|
+
1 analysis ANL-auth-20260410 Auth vulnerability scan 2026-04-10 4
|
|
106
|
+
2 brainstorm brainstorm-cache Cache strategy options 2026-04-08 3
|
|
107
|
+
3 lite-fix rate-limit-20260405 Rate limiter edge case 2026-04-05 2
|
|
108
|
+
4 debug debug-memory-leak Memory leak in worker 2026-04-03 5
|
|
109
|
+
|
|
110
|
+
Found: 4 artifacts (filtered by: last 30 days)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Selection logic
|
|
114
|
+
|
|
115
|
+
| Mode | Action |
|
|
116
|
+
|------|--------|
|
|
117
|
+
| `scan`, 0 candidates | Print "No harvestable artifacts found", exit 0 |
|
|
118
|
+
| `scan`, ≥1 candidates | AskUserQuestion: select one, multiple (comma-separated), or "all" |
|
|
119
|
+
| `session` | Find matching session ID in candidates; error E004 if not found |
|
|
120
|
+
| `path` | Validate path exists; auto-detect source type from structure |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Stage 3: load_and_extract (per selected artifact)
|
|
125
|
+
|
|
126
|
+
For each selected artifact, load all files and extract knowledge fragments.
|
|
127
|
+
|
|
128
|
+
### 3a. Load artifact content
|
|
129
|
+
|
|
130
|
+
Read all relevant files in the artifact directory. Build a content bundle:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
bundle = {
|
|
134
|
+
source_type: "analysis" | "brainstorm" | ...,
|
|
135
|
+
id: session_id,
|
|
136
|
+
path: artifact_directory,
|
|
137
|
+
files: [{ name, content, type: "json"|"md" }],
|
|
138
|
+
metadata: extracted from key files (conclusions.json, plan.json, etc.)
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 3b. Extract knowledge fragments
|
|
143
|
+
|
|
144
|
+
Parse content to identify discrete knowledge items. Each source type has specific extraction patterns:
|
|
145
|
+
|
|
146
|
+
**Analysis (`conclusions.json` + markdown):**
|
|
147
|
+
- `findings[]` → each finding is a fragment
|
|
148
|
+
- `recommendations[]` → each recommendation is a fragment
|
|
149
|
+
- `risks[]` → each risk is a fragment
|
|
150
|
+
- Markdown sections with `## ` headings → section-level fragments
|
|
151
|
+
|
|
152
|
+
**Brainstorm (`guidance-specification.md` + notes):**
|
|
153
|
+
- `## Options` or `## Approaches` → each option is a fragment
|
|
154
|
+
- `## Decision` or `## Recommendation` → decision fragment
|
|
155
|
+
- `## Trade-offs` → trade-off fragments
|
|
156
|
+
- Action items (lines starting with `- [ ]` or `TODO`) → task fragments
|
|
157
|
+
|
|
158
|
+
**Lite-plan (`plan.json`):**
|
|
159
|
+
- `tasks[]` → each with rationale → decision fragments
|
|
160
|
+
- `dependencies[]` → architectural constraint fragments
|
|
161
|
+
- `risks[]` → risk fragments
|
|
162
|
+
|
|
163
|
+
**Lite-fix (`fix-plan.json`):**
|
|
164
|
+
- `root_cause` → bug fragment
|
|
165
|
+
- `fix_strategy` → pattern fragment
|
|
166
|
+
- `verification` → test/validation fragment
|
|
167
|
+
|
|
168
|
+
**Debug (`debug-log.md`, `hypothesis-*.md`):**
|
|
169
|
+
- Final diagnosis → bug fragment
|
|
170
|
+
- Verified hypothesis → pattern/lesson fragment
|
|
171
|
+
- Rejected hypotheses with reasoning → lesson fragment
|
|
172
|
+
|
|
173
|
+
**Scratchpad (*.md):**
|
|
174
|
+
- Markdown sections → generic fragments
|
|
175
|
+
- Code blocks with explanations → pattern fragments
|
|
176
|
+
|
|
177
|
+
**Session (`workflow-session.json`):**
|
|
178
|
+
- `completed_tasks[].summary` → pattern/decision fragments
|
|
179
|
+
- `key_decisions[]` → decision fragments
|
|
180
|
+
- `deferred_items[]` → issue fragments
|
|
181
|
+
|
|
182
|
+
**Learning (`lessons.jsonl`):**
|
|
183
|
+
- Each lesson line → lesson fragment (check if already routed to wiki/spec/issue)
|
|
184
|
+
|
|
185
|
+
Each fragment gets:
|
|
186
|
+
```
|
|
187
|
+
fragment = {
|
|
188
|
+
id: "HRV-{8 hex}" from hash(source_id + content_hash),
|
|
189
|
+
source_type: ...,
|
|
190
|
+
source_id: ...,
|
|
191
|
+
title: extracted or inferred,
|
|
192
|
+
content: raw text,
|
|
193
|
+
tags: extracted from context,
|
|
194
|
+
category: "finding" | "decision" | "pattern" | "bug" | "risk" | "task" | "lesson" | "recommendation",
|
|
195
|
+
confidence: 0.0-1.0 (based on specificity and actionability)
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Filter by `--min-confidence`.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Stage 4: classify_routing
|
|
204
|
+
|
|
205
|
+
For each fragment, determine the best routing target (unless `--to` forces a specific target).
|
|
206
|
+
|
|
207
|
+
### Classification Rules
|
|
208
|
+
|
|
209
|
+
| Category | Default Target | Rationale |
|
|
210
|
+
|----------|---------------|-----------|
|
|
211
|
+
| `finding` | wiki (note) | Observations go to knowledge graph |
|
|
212
|
+
| `decision` | wiki (spec) or spec (decision) | Architectural decisions → spec ADR or wiki spec entry |
|
|
213
|
+
| `pattern` | spec (pattern) | Reusable code patterns → coding conventions |
|
|
214
|
+
| `bug` | issue or spec (bug) | Active bugs → issue; fixed bugs → spec learnings |
|
|
215
|
+
| `risk` | issue | Unmitigated risks → trackable issues |
|
|
216
|
+
| `task` | issue | Unfinished work → trackable issues |
|
|
217
|
+
| `lesson` | wiki (lesson) | Generalizable insights → wiki knowledge |
|
|
218
|
+
| `recommendation` | wiki (note) or issue | Actionable recommendations → issue; informational → wiki |
|
|
219
|
+
|
|
220
|
+
### Override with `--to`
|
|
221
|
+
|
|
222
|
+
If `--to wiki`: all fragments → wiki entries
|
|
223
|
+
If `--to spec`: all fragments → spec entries
|
|
224
|
+
If `--to issue`: all fragments → issue entries
|
|
225
|
+
If `--to auto`: use classification rules above
|
|
226
|
+
|
|
227
|
+
### Build routing plan
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
routing_plan = {
|
|
231
|
+
wiki: [{ fragment, wiki_type, slug, title, tags, body }],
|
|
232
|
+
spec: [{ fragment, spec_type, content }],
|
|
233
|
+
issue: [{ fragment, title, severity, description }]
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Stage 5: preview_and_confirm
|
|
240
|
+
|
|
241
|
+
Display the routing plan:
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
=== HARVEST PLAN ===
|
|
245
|
+
Source: ANL-auth-20260410 (analysis)
|
|
246
|
+
Fragments extracted: 8 (filtered from 12 by confidence ≥ 0.5)
|
|
247
|
+
|
|
248
|
+
→ Wiki (3 entries):
|
|
249
|
+
[note] "SQL injection vector in user input" tags: security, sql
|
|
250
|
+
[lesson] "Parameterized queries prevent injection" tags: security, pattern
|
|
251
|
+
[spec] "Auth token rotation policy" tags: auth, security
|
|
252
|
+
|
|
253
|
+
→ Spec (2 entries):
|
|
254
|
+
[pattern] "Always use parameterized queries for user input"
|
|
255
|
+
[decision] "JWT refresh tokens over session cookies"
|
|
256
|
+
|
|
257
|
+
→ Issue (3 entries):
|
|
258
|
+
[high] "Unvalidated redirect in OAuth callback"
|
|
259
|
+
[medium] "Missing rate limit on token refresh endpoint"
|
|
260
|
+
[low] "Inconsistent error messages leak internal state"
|
|
261
|
+
|
|
262
|
+
Total: 3 wiki + 2 spec + 3 issue = 8 routed items
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
If `--dry-run`: display and exit.
|
|
266
|
+
If NOT `--dry-run` AND NOT `-y`:
|
|
267
|
+
AskUserQuestion: "Apply this routing plan? (yes/edit/skip)" with options.
|
|
268
|
+
- `edit`: re-display with per-item accept/reject
|
|
269
|
+
- `skip`: exit without writing
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Stage 6: route_outputs
|
|
274
|
+
|
|
275
|
+
Execute the routing plan. Each target uses existing infrastructure:
|
|
276
|
+
|
|
277
|
+
### 6a. Wiki routing
|
|
278
|
+
|
|
279
|
+
For each wiki item:
|
|
280
|
+
```bash
|
|
281
|
+
maestro wiki create --type <wiki_type> --slug harvest-<source_type>-<short_id> \
|
|
282
|
+
--title "<title>" --tags "<tags>" --body "<body>"
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Wiki types mapping:
|
|
286
|
+
- `note` → `--type note`
|
|
287
|
+
- `lesson` → `--type lesson`
|
|
288
|
+
- `spec` → `--type spec`
|
|
289
|
+
|
|
290
|
+
If `maestro wiki create` fails, fall back to writing `.workflow/harvest/wiki-pending-{id}.md` with frontmatter.
|
|
291
|
+
|
|
292
|
+
### 6b. Spec routing
|
|
293
|
+
|
|
294
|
+
For each spec item, use the same mechanism as `quality-retrospective` Stage 6:
|
|
295
|
+
|
|
296
|
+
```
|
|
297
|
+
Skill({ skill: "spec-add", args: "<spec_type> <content>" })
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
Where `spec_type` maps from fragment category:
|
|
301
|
+
- `pattern` → `pattern`
|
|
302
|
+
- `decision` → `decision`
|
|
303
|
+
- `bug` → `bug`
|
|
304
|
+
- `lesson` → `rule` (if it prescribes a rule)
|
|
305
|
+
|
|
306
|
+
### 6c. Issue routing
|
|
307
|
+
|
|
308
|
+
For each issue item, append to `.workflow/issues/issues.jsonl` using the canonical schema from `workflows/issue.md`:
|
|
309
|
+
|
|
310
|
+
```json
|
|
311
|
+
{
|
|
312
|
+
"id": "ISS-{YYYYMMDD}-{NNN}",
|
|
313
|
+
"title": "<title>",
|
|
314
|
+
"description": "<description>",
|
|
315
|
+
"severity": "<high|medium|low>",
|
|
316
|
+
"status": "open",
|
|
317
|
+
"source": "harvest",
|
|
318
|
+
"source_ref": "<source_id>",
|
|
319
|
+
"tags": [],
|
|
320
|
+
"created_at": "<ISO timestamp>",
|
|
321
|
+
"issue_history": [{ "action": "created", "timestamp": "<ISO>", "by": "harvest", "detail": "Extracted from <source_type> <source_id>" }]
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### 6d. Track harvest provenance
|
|
326
|
+
|
|
327
|
+
For each routed item, record in `.workflow/harvest/harvest-log.jsonl`:
|
|
328
|
+
|
|
329
|
+
```json
|
|
330
|
+
{
|
|
331
|
+
"fragment_id": "HRV-...",
|
|
332
|
+
"source_type": "analysis",
|
|
333
|
+
"source_id": "ANL-auth-20260410",
|
|
334
|
+
"routed_to": "wiki|spec|issue",
|
|
335
|
+
"target_id": "note-harvest-analysis-abc123|ISS-20260413-001|...",
|
|
336
|
+
"timestamp": "<ISO>",
|
|
337
|
+
"title": "<title>",
|
|
338
|
+
"confidence": 0.85
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
This log prevents duplicate harvesting in future runs.
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Stage 7: dedup_check
|
|
347
|
+
|
|
348
|
+
Before writing any item in Stage 6, check for duplicates:
|
|
349
|
+
|
|
350
|
+
1. **harvest-log.jsonl**: Has this fragment_id already been routed?
|
|
351
|
+
2. **Wiki**: `maestro wiki search "<title>"` — does a similar entry exist?
|
|
352
|
+
3. **Issues**: Search `issues.jsonl` for matching title/description
|
|
353
|
+
4. **Specs**: Search `learnings.md` for similar content
|
|
354
|
+
|
|
355
|
+
If duplicate found:
|
|
356
|
+
- Skip with `[SKIP-DUP]` marker
|
|
357
|
+
- Log to harvest report
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## Stage 8: report
|
|
362
|
+
|
|
363
|
+
Write `.workflow/harvest/harvest-report-{date}.md`:
|
|
364
|
+
|
|
365
|
+
```markdown
|
|
366
|
+
# Harvest Report — {date}
|
|
367
|
+
|
|
368
|
+
## Source
|
|
369
|
+
- Type: {source_type}
|
|
370
|
+
- ID: {source_id}
|
|
371
|
+
- Path: {path}
|
|
372
|
+
|
|
373
|
+
## Extraction Summary
|
|
374
|
+
- Fragments found: {total}
|
|
375
|
+
- Filtered by confidence: {filtered_count}
|
|
376
|
+
- Duplicates skipped: {dup_count}
|
|
377
|
+
|
|
378
|
+
## Routing Results
|
|
379
|
+
|
|
380
|
+
### Wiki ({N} entries)
|
|
381
|
+
| # | Type | Slug | Title | Status |
|
|
382
|
+
|---|------|------|-------|--------|
|
|
383
|
+
| 1 | note | harvest-analysis-abc | SQL injection vector | CREATED |
|
|
384
|
+
| 2 | lesson | harvest-analysis-def | Parameterized queries | CREATED |
|
|
385
|
+
|
|
386
|
+
### Spec ({N} entries)
|
|
387
|
+
| # | Type | Content (truncated) | Status |
|
|
388
|
+
|---|------|---------------------|--------|
|
|
389
|
+
| 1 | pattern | Always use parameterized queries... | ADDED |
|
|
390
|
+
|
|
391
|
+
### Issue ({N} entries)
|
|
392
|
+
| # | Severity | Title | ID | Status |
|
|
393
|
+
|---|----------|-------|-----|--------|
|
|
394
|
+
| 1 | high | Unvalidated redirect in OAuth... | ISS-20260413-001 | CREATED |
|
|
395
|
+
|
|
396
|
+
## Skipped
|
|
397
|
+
| Fragment | Reason |
|
|
398
|
+
|----------|--------|
|
|
399
|
+
| HRV-abc123 | Duplicate: existing wiki entry note-sql-injection |
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
Display summary:
|
|
403
|
+
|
|
404
|
+
```
|
|
405
|
+
=== HARVEST COMPLETE ===
|
|
406
|
+
Source: ANL-auth-20260410 (analysis)
|
|
407
|
+
|
|
408
|
+
Wiki: 3 created, 0 skipped
|
|
409
|
+
Spec: 2 added, 0 skipped
|
|
410
|
+
Issue: 3 created, 1 skipped (dup)
|
|
411
|
+
|
|
412
|
+
Report: .workflow/harvest/harvest-report-2026-04-13.md
|
|
413
|
+
Log: .workflow/harvest/harvest-log.jsonl
|
|
414
|
+
|
|
415
|
+
Next:
|
|
416
|
+
→ Review wiki entries: maestro wiki list --type note
|
|
417
|
+
→ Triage issues: Skill({ skill: "manage-issue", args: "list --source harvest" })
|
|
418
|
+
→ Connect wiki graph: Skill({ skill: "wiki-connect", args: "--fix" })
|
|
419
|
+
→ View specs: Skill({ skill: "spec-load", args: "--category learning" })
|
|
420
|
+
```
|