maestro-flow 0.3.9 → 0.3.11
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/workflow-collab-planner.md +1 -1
- package/.claude/agents/workflow-executor.md +1 -1
- package/.claude/agents/workflow-plan-checker.md +1 -1
- package/.claude/agents/workflow-planner.md +1 -1
- package/.claude/commands/learn-decompose.md +176 -176
- package/.claude/commands/learn-follow.md +167 -167
- package/.claude/commands/learn-retro.md +1 -1
- package/.claude/commands/maestro-analyze.md +46 -3
- package/.claude/commands/maestro-coordinate.md +1 -3
- package/.claude/commands/maestro-execute.md +14 -0
- package/.claude/commands/maestro-plan.md +16 -0
- package/.claude/commands/manage-harvest.md +131 -131
- package/.claude/commands/manage-issue-discover.md +2 -2
- package/.claude/commands/manage-issue.md +5 -5
- 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 +335 -0
- package/.codex/skills/maestro-analyze/SKILL.md +84 -75
- package/.codex/skills/maestro-brainstorm/SKILL.md +452 -463
- package/.codex/skills/maestro-chain/SKILL.md +233 -0
- package/.codex/skills/maestro-coordinate/SKILL.md +167 -278
- package/.codex/skills/maestro-execute/SKILL.md +435 -438
- package/.codex/skills/maestro-fork/SKILL.md +68 -0
- package/.codex/skills/maestro-init/SKILL.md +171 -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 +62 -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 +66 -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 +34 -31
- 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 +93 -105
- 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 +93 -104
- 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 +14 -11
- package/README.zh-CN.md +14 -11
- package/chains/issue-lifecycle.json +13 -13
- package/chains/singles/issue-analyze.json +3 -3
- package/chains/singles/issue-execute.json +3 -3
- package/chains/singles/issue-plan.json +3 -3
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.js +2 -2
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js +3 -3
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/issues.js +34 -0
- package/dashboard/dist-server/dashboard/src/server/routes/issues.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/execution-handler.js +2 -3
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/execution-handler.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js +5 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/issue-types.d.ts +5 -0
- package/dashboard/dist-server/dashboard/src/shared/issue-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/normalize-task.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/shared/normalize-task.js +75 -0
- package/dashboard/dist-server/dashboard/src/shared/normalize-task.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +21 -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 +1 -1
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
- package/dashboard/dist-server/src/hooks/constants.d.ts +92 -12
- package/dashboard/dist-server/src/hooks/constants.js +151 -16
- package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
- package/dashboard/dist-server/src/types/index.d.ts +5 -0
- package/dist/src/commands/collab.d.ts +1 -34
- package/dist/src/commands/collab.d.ts.map +1 -1
- package/dist/src/commands/collab.js +8 -76
- package/dist/src/commands/collab.js.map +1 -1
- package/dist/src/commands/hooks.d.ts +5 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +115 -10
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/install-ui/InstallConfirm.d.ts +3 -1
- package/dist/src/commands/install-ui/InstallConfirm.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallConfirm.js +3 -1
- package/dist/src/commands/install-ui/InstallConfirm.js.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.js +5 -1
- package/dist/src/commands/install-ui/InstallExecution.js.map +1 -1
- package/dist/src/commands/install-ui/InstallFlow.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallFlow.js +7 -3
- package/dist/src/commands/install-ui/InstallFlow.js.map +1 -1
- package/dist/src/commands/install-ui/StatuslineConfig.d.ts +6 -1
- package/dist/src/commands/install-ui/StatuslineConfig.d.ts.map +1 -1
- package/dist/src/commands/install-ui/StatuslineConfig.js +27 -5
- package/dist/src/commands/install-ui/StatuslineConfig.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.d.ts +7 -0
- package/dist/src/hooks/__tests__/statusline-visual-test.d.ts.map +1 -0
- package/dist/src/hooks/__tests__/statusline-visual-test.js +236 -0
- package/dist/src/hooks/__tests__/statusline-visual-test.js.map +1 -0
- package/dist/src/hooks/constants.d.ts +92 -12
- package/dist/src/hooks/constants.d.ts.map +1 -1
- package/dist/src/hooks/constants.js +151 -16
- package/dist/src/hooks/constants.js.map +1 -1
- package/dist/src/hooks/guards/index.d.ts +2 -0
- package/dist/src/hooks/guards/index.d.ts.map +1 -1
- package/dist/src/hooks/guards/index.js +2 -0
- package/dist/src/hooks/guards/index.js.map +1 -1
- package/dist/src/hooks/guards/preflight-guard.d.ts +29 -0
- package/dist/src/hooks/guards/preflight-guard.d.ts.map +1 -0
- package/dist/src/hooks/guards/preflight-guard.js +95 -0
- package/dist/src/hooks/guards/preflight-guard.js.map +1 -0
- 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/index.d.ts +1 -0
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +1 -0
- package/dist/src/hooks/index.js.map +1 -1
- 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/preflight-core.d.ts +37 -0
- package/dist/src/hooks/preflight-core.d.ts.map +1 -0
- package/dist/src/hooks/preflight-core.js +86 -0
- package/dist/src/hooks/preflight-core.js.map +1 -0
- 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 +8 -17
- package/dist/src/hooks/statusline.d.ts.map +1 -1
- package/dist/src/hooks/statusline.js +269 -112
- package/dist/src/hooks/statusline.js.map +1 -1
- package/dist/src/i18n/locales/en.d.ts.map +1 -1
- package/dist/src/i18n/locales/en.js +5 -0
- package/dist/src/i18n/locales/en.js.map +1 -1
- package/dist/src/i18n/locales/zh.d.ts.map +1 -1
- package/dist/src/i18n/locales/zh.js +5 -0
- package/dist/src/i18n/locales/zh.js.map +1 -1
- package/dist/src/i18n/types.d.ts +5 -0
- package/dist/src/i18n/types.d.ts.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/collab-adapter.d.ts +17 -0
- package/dist/src/tools/collab-adapter.d.ts.map +1 -1
- package/dist/src/tools/collab-adapter.js +138 -0
- package/dist/src/tools/collab-adapter.js.map +1 -1
- 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 +24 -0
- package/dist/src/tools/merge-validator.d.ts.map +1 -0
- package/dist/src/tools/merge-validator.js +220 -0
- package/dist/src/tools/merge-validator.js.map +1 -0
- 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/dist/src/types/index.d.ts +5 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/templates/cli/prompts/workflow-skill-conflict-patterns.txt +3 -3
- package/templates/cli/prompts/workflow-skill-lessons-learned.txt +3 -3
- package/templates/search-tools.md +1 -1
- package/workflows/analyze.md +816 -816
- package/workflows/brainstorm.md +471 -471
- package/workflows/cli-tools-usage.md +44 -27
- package/workflows/codebase-rebuild.md +332 -332
- package/workflows/codebase-refresh.md +240 -240
- package/workflows/delegate-usage.md +3 -3
- package/workflows/execute.md +1 -1
- package/workflows/harvest.md +420 -420
- package/workflows/integration-test.md +343 -343
- package/workflows/issue-analyze.md +6 -2
- package/workflows/issue-discover.md +414 -414
- package/workflows/issue-execute.md +6 -3
- package/workflows/issue-plan.md +5 -2
- package/workflows/maestro-coordinate.codex.md +281 -470
- package/workflows/maestro-coordinate.md +14 -14
- package/workflows/maestro-link-coordinate.md +2 -2
- package/workflows/maestro.codex.md +710 -0
- package/workflows/maestro.md +10 -11
- package/workflows/map.md +111 -111
- 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 +1 -1
- 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/.claude/commands/manage-issue-analyze.md +0 -62
- package/.claude/commands/manage-issue-execute.md +0 -73
- package/.claude/commands/manage-issue-plan.md +0 -62
- package/.codex/skills/manage-issue-analyze/SKILL.md +0 -207
- package/.codex/skills/manage-issue-execute/SKILL.md +0 -200
- package/.codex/skills/manage-issue-plan/SKILL.md +0 -186
|
@@ -16,21 +16,21 @@ const SEED_DOCS = [
|
|
|
16
16
|
title: 'Coding Conventions',
|
|
17
17
|
readMode: 'required',
|
|
18
18
|
priority: 'high',
|
|
19
|
-
category: '
|
|
19
|
+
category: 'coding',
|
|
20
20
|
keywords: ['style', 'naming', 'import', 'pattern', 'convention', 'formatting'],
|
|
21
21
|
},
|
|
22
|
-
body: `# Coding Conventions
|
|
23
|
-
|
|
24
|
-
## Formatting
|
|
25
|
-
|
|
26
|
-
## Naming
|
|
27
|
-
|
|
28
|
-
## Imports
|
|
29
|
-
|
|
30
|
-
## Patterns
|
|
31
|
-
|
|
32
|
-
##
|
|
33
|
-
|
|
22
|
+
body: `# Coding Conventions
|
|
23
|
+
|
|
24
|
+
## Formatting
|
|
25
|
+
|
|
26
|
+
## Naming
|
|
27
|
+
|
|
28
|
+
## Imports
|
|
29
|
+
|
|
30
|
+
## Patterns
|
|
31
|
+
|
|
32
|
+
## Entries
|
|
33
|
+
|
|
34
34
|
`,
|
|
35
35
|
},
|
|
36
36
|
{
|
|
@@ -39,53 +39,53 @@ const SEED_DOCS = [
|
|
|
39
39
|
title: 'Architecture Constraints',
|
|
40
40
|
readMode: 'required',
|
|
41
41
|
priority: 'high',
|
|
42
|
-
category: '
|
|
42
|
+
category: 'arch',
|
|
43
43
|
keywords: ['architecture', 'module', 'layer', 'boundary', 'dependency', 'structure'],
|
|
44
44
|
},
|
|
45
|
-
body: `# Architecture Constraints
|
|
46
|
-
|
|
47
|
-
## Module Structure
|
|
48
|
-
|
|
49
|
-
## Layer Boundaries
|
|
50
|
-
|
|
51
|
-
## Dependency Rules
|
|
52
|
-
|
|
53
|
-
## Technology Constraints
|
|
54
|
-
|
|
55
|
-
##
|
|
56
|
-
|
|
45
|
+
body: `# Architecture Constraints
|
|
46
|
+
|
|
47
|
+
## Module Structure
|
|
48
|
+
|
|
49
|
+
## Layer Boundaries
|
|
50
|
+
|
|
51
|
+
## Dependency Rules
|
|
52
|
+
|
|
53
|
+
## Technology Constraints
|
|
54
|
+
|
|
55
|
+
## Entries
|
|
56
|
+
|
|
57
57
|
`,
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
|
-
filename: '
|
|
60
|
+
filename: 'learnings.md',
|
|
61
61
|
frontmatter: {
|
|
62
|
-
title: '
|
|
63
|
-
readMode: '
|
|
62
|
+
title: 'Learnings',
|
|
63
|
+
readMode: 'optional',
|
|
64
64
|
priority: 'medium',
|
|
65
|
-
category: '
|
|
66
|
-
keywords: ['
|
|
65
|
+
category: 'learning',
|
|
66
|
+
keywords: ['bug', 'lesson', 'gotcha', 'learning'],
|
|
67
67
|
},
|
|
68
|
-
body: `#
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
##
|
|
73
|
-
|
|
68
|
+
body: `# Learnings
|
|
69
|
+
|
|
70
|
+
Add entries with: \`/spec-add learning <description>\`
|
|
71
|
+
|
|
72
|
+
## Entries
|
|
73
|
+
|
|
74
74
|
`,
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
|
-
filename: '
|
|
77
|
+
filename: 'quality-rules.md',
|
|
78
78
|
frontmatter: {
|
|
79
|
-
title: '
|
|
80
|
-
readMode: '
|
|
79
|
+
title: 'Quality Rules',
|
|
80
|
+
readMode: 'required',
|
|
81
81
|
priority: 'medium',
|
|
82
|
-
category: '
|
|
83
|
-
keywords: ['
|
|
82
|
+
category: 'quality',
|
|
83
|
+
keywords: ['quality', 'lint', 'rule', 'enforcement'],
|
|
84
84
|
},
|
|
85
|
-
body: `#
|
|
86
|
-
|
|
87
|
-
## Entries
|
|
88
|
-
|
|
85
|
+
body: `# Quality Rules
|
|
86
|
+
|
|
87
|
+
## Entries
|
|
88
|
+
|
|
89
89
|
`,
|
|
90
90
|
},
|
|
91
91
|
{
|
|
@@ -97,13 +97,10 @@ const SEED_DOCS = [
|
|
|
97
97
|
category: 'debug',
|
|
98
98
|
keywords: ['debug', 'issue', 'workaround', 'root-cause', 'gotcha'],
|
|
99
99
|
},
|
|
100
|
-
body: `# Debug Notes
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
## Entries
|
|
106
|
-
|
|
100
|
+
body: `# Debug Notes
|
|
101
|
+
|
|
102
|
+
## Entries
|
|
103
|
+
|
|
107
104
|
`,
|
|
108
105
|
},
|
|
109
106
|
{
|
|
@@ -115,18 +112,18 @@ Add entries with: \`/spec-add debug <description>\`
|
|
|
115
112
|
category: 'test',
|
|
116
113
|
keywords: ['test', 'coverage', 'mock', 'fixture', 'assertion', 'framework'],
|
|
117
114
|
},
|
|
118
|
-
body: `# Test Conventions
|
|
119
|
-
|
|
120
|
-
## Framework
|
|
121
|
-
|
|
122
|
-
## Directory Structure
|
|
123
|
-
|
|
124
|
-
## Naming Conventions
|
|
125
|
-
|
|
126
|
-
## Patterns
|
|
127
|
-
|
|
128
|
-
##
|
|
129
|
-
|
|
115
|
+
body: `# Test Conventions
|
|
116
|
+
|
|
117
|
+
## Framework
|
|
118
|
+
|
|
119
|
+
## Directory Structure
|
|
120
|
+
|
|
121
|
+
## Naming Conventions
|
|
122
|
+
|
|
123
|
+
## Patterns
|
|
124
|
+
|
|
125
|
+
## Entries
|
|
126
|
+
|
|
130
127
|
`,
|
|
131
128
|
},
|
|
132
129
|
{
|
|
@@ -138,33 +135,10 @@ Add entries with: \`/spec-add debug <description>\`
|
|
|
138
135
|
category: 'review',
|
|
139
136
|
keywords: ['review', 'checklist', 'gate', 'approval', 'standard'],
|
|
140
137
|
},
|
|
141
|
-
body: `# Review Standards
|
|
142
|
-
|
|
143
|
-
##
|
|
144
|
-
|
|
145
|
-
## Quality Gates
|
|
146
|
-
|
|
147
|
-
## Manual Additions
|
|
148
|
-
|
|
149
|
-
`,
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
filename: 'validation-rules.md',
|
|
153
|
-
frontmatter: {
|
|
154
|
-
title: 'Validation Rules',
|
|
155
|
-
readMode: 'required',
|
|
156
|
-
priority: 'high',
|
|
157
|
-
category: 'validation',
|
|
158
|
-
keywords: ['validation', 'verification', 'acceptance', 'criteria', 'check'],
|
|
159
|
-
},
|
|
160
|
-
body: `# Validation Rules
|
|
161
|
-
|
|
162
|
-
## Verification Criteria
|
|
163
|
-
|
|
164
|
-
## Acceptance Standards
|
|
165
|
-
|
|
166
|
-
## Manual Additions
|
|
167
|
-
|
|
138
|
+
body: `# Review Standards
|
|
139
|
+
|
|
140
|
+
## Entries
|
|
141
|
+
|
|
168
142
|
`,
|
|
169
143
|
},
|
|
170
144
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-init.js","sourceRoot":"","sources":["../../../src/tools/spec-init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAwBjC,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,SAAS,GAAc;IAC3B;QACE,QAAQ,EAAE,uBAAuB;QACjC,WAAW,EAAE;YACX,KAAK,EAAE,oBAAoB;YAC3B,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"spec-init.js","sourceRoot":"","sources":["../../../src/tools/spec-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Keyword Index
|
|
3
|
+
*
|
|
4
|
+
* Builds an inverted index from keyword → spec entries.
|
|
5
|
+
* Scans all `.workflow/specs/*.md` files, parses <spec-entry> tags,
|
|
6
|
+
* and indexes by keyword for fast lookup.
|
|
7
|
+
*/
|
|
8
|
+
export interface IndexedEntry {
|
|
9
|
+
file: string;
|
|
10
|
+
category: string;
|
|
11
|
+
keywords: string[];
|
|
12
|
+
content: string;
|
|
13
|
+
title: string;
|
|
14
|
+
id: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build a keyword → entries inverted index from all spec files.
|
|
18
|
+
* Each keyword maps to an array of matching entries.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildKeywordIndex(projectPath: string): Map<string, IndexedEntry[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Look up entries matching a keyword.
|
|
23
|
+
*/
|
|
24
|
+
export declare function lookupKeyword(index: Map<string, IndexedEntry[]>, keyword: string): IndexedEntry[];
|
|
25
|
+
/**
|
|
26
|
+
* Look up entries matching any of the given keywords.
|
|
27
|
+
* Returns deduplicated entries (by id).
|
|
28
|
+
*/
|
|
29
|
+
export declare function lookupKeywords(index: Map<string, IndexedEntry[]>, keywords: string[]): IndexedEntry[];
|
|
30
|
+
//# sourceMappingURL=spec-keyword-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-keyword-index.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-keyword-index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAgDlF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAEjG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAerG"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Keyword Index
|
|
3
|
+
*
|
|
4
|
+
* Builds an inverted index from keyword → spec entries.
|
|
5
|
+
* Scans all `.workflow/specs/*.md` files, parses <spec-entry> tags,
|
|
6
|
+
* and indexes by keyword for fast lookup.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { parseSpecEntries } from './spec-entry-parser.js';
|
|
11
|
+
import { CATEGORY_MAP } from './spec-loader.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Public API
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Build a keyword → entries inverted index from all spec files.
|
|
17
|
+
* Each keyword maps to an array of matching entries.
|
|
18
|
+
*/
|
|
19
|
+
export function buildKeywordIndex(projectPath) {
|
|
20
|
+
const index = new Map();
|
|
21
|
+
const specsDir = join(projectPath, '.workflow', 'specs');
|
|
22
|
+
if (!existsSync(specsDir))
|
|
23
|
+
return index;
|
|
24
|
+
let files;
|
|
25
|
+
try {
|
|
26
|
+
files = readdirSync(specsDir).filter(f => f.endsWith('.md'));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return index;
|
|
30
|
+
}
|
|
31
|
+
for (const file of files) {
|
|
32
|
+
const filePath = join(specsDir, file);
|
|
33
|
+
let raw;
|
|
34
|
+
try {
|
|
35
|
+
raw = readFileSync(filePath, 'utf-8');
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const body = stripFrontmatter(raw);
|
|
41
|
+
const { entries } = parseSpecEntries(body);
|
|
42
|
+
const fileCategory = CATEGORY_MAP[file] ?? 'learning';
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
const indexed = {
|
|
45
|
+
file,
|
|
46
|
+
category: entry.category || fileCategory,
|
|
47
|
+
keywords: entry.keywords,
|
|
48
|
+
content: entry.content,
|
|
49
|
+
title: entry.title,
|
|
50
|
+
id: `${file}:${entry.lineStart}`,
|
|
51
|
+
};
|
|
52
|
+
for (const kw of entry.keywords) {
|
|
53
|
+
const list = index.get(kw);
|
|
54
|
+
if (list) {
|
|
55
|
+
list.push(indexed);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
index.set(kw, [indexed]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return index;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Look up entries matching a keyword.
|
|
67
|
+
*/
|
|
68
|
+
export function lookupKeyword(index, keyword) {
|
|
69
|
+
return index.get(keyword.toLowerCase()) ?? [];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Look up entries matching any of the given keywords.
|
|
73
|
+
* Returns deduplicated entries (by id).
|
|
74
|
+
*/
|
|
75
|
+
export function lookupKeywords(index, keywords) {
|
|
76
|
+
const seen = new Set();
|
|
77
|
+
const results = [];
|
|
78
|
+
for (const kw of keywords) {
|
|
79
|
+
const entries = index.get(kw.toLowerCase()) ?? [];
|
|
80
|
+
for (const entry of entries) {
|
|
81
|
+
if (!seen.has(entry.id)) {
|
|
82
|
+
seen.add(entry.id);
|
|
83
|
+
results.push(entry);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
// ============================================================================
|
|
90
|
+
// Internal
|
|
91
|
+
// ============================================================================
|
|
92
|
+
function stripFrontmatter(raw) {
|
|
93
|
+
const trimmed = raw.trimStart();
|
|
94
|
+
if (!trimmed.startsWith('---'))
|
|
95
|
+
return raw;
|
|
96
|
+
const endIdx = trimmed.indexOf('\n---', 3);
|
|
97
|
+
if (endIdx === -1)
|
|
98
|
+
return raw;
|
|
99
|
+
return trimmed.substring(endIdx + 4).trim();
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=spec-keyword-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-keyword-index.js","sourceRoot":"","sources":["../../../src/tools/spec-keyword-index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAwB,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAehD,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAEzD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC;QAEtD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAiB;gBAC5B,IAAI;gBACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,YAAY;gBACxC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE;aACjC,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3B,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrB,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAkC,EAAE,OAAe;IAC/E,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAkC,EAAE,QAAkB;IACnF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAC9B,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
* Reads .workflow/specs/*.md, filters by category via static mapping,
|
|
6
6
|
* returns concatenated content.
|
|
7
7
|
*/
|
|
8
|
-
export type SpecCategory = '
|
|
8
|
+
export type SpecCategory = 'coding' | 'arch' | 'quality' | 'debug' | 'test' | 'review' | 'learning';
|
|
9
9
|
export interface SpecLoadResult {
|
|
10
10
|
content: string;
|
|
11
11
|
matchedSpecs: string[];
|
|
12
12
|
totalLoaded: number;
|
|
13
13
|
}
|
|
14
|
-
export declare const CATEGORY_MAP: Record<string, SpecCategory
|
|
14
|
+
export declare const CATEGORY_MAP: Record<string, SpecCategory>;
|
|
15
15
|
export declare const TEAM_SPECS_DIR = ".workflow/collab/specs";
|
|
16
16
|
/**
|
|
17
17
|
* Load spec files from one or more directories.
|
|
@@ -27,5 +27,5 @@ export declare const TEAM_SPECS_DIR = ".workflow/collab/specs";
|
|
|
27
27
|
* When `uid` is absent, only the baseline directory is scanned — identical
|
|
28
28
|
* to the original single-directory behavior.
|
|
29
29
|
*/
|
|
30
|
-
export declare function loadSpecs(projectPath: string, category?: SpecCategory, uid?: string): SpecLoadResult;
|
|
30
|
+
export declare function loadSpecs(projectPath: string, category?: SpecCategory, uid?: string, keyword?: string): SpecLoadResult;
|
|
31
31
|
//# sourceMappingURL=spec-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-loader.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"spec-loader.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEpG,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAQrD,CAAC;AAGF,eAAO,MAAM,cAAc,2BAA2B,CAAC;AAavD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CA6BtH"}
|
|
@@ -7,21 +7,19 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
|
+
import { parseSpecEntries, formatSpecEntries } from './spec-entry-parser.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Filename → Category mapping (single source of truth)
|
|
12
13
|
// ============================================================================
|
|
13
14
|
export const CATEGORY_MAP = {
|
|
14
|
-
'coding-conventions.md':
|
|
15
|
-
'architecture-constraints.md':
|
|
16
|
-
'quality-rules.md':
|
|
17
|
-
'debug-notes.md':
|
|
18
|
-
'test-conventions.md':
|
|
19
|
-
'review-standards.md':
|
|
20
|
-
'
|
|
21
|
-
'learnings.md': ['general'],
|
|
15
|
+
'coding-conventions.md': 'coding',
|
|
16
|
+
'architecture-constraints.md': 'arch',
|
|
17
|
+
'quality-rules.md': 'quality',
|
|
18
|
+
'debug-notes.md': 'debug',
|
|
19
|
+
'test-conventions.md': 'test',
|
|
20
|
+
'review-standards.md': 'review',
|
|
21
|
+
'learnings.md': 'learning',
|
|
22
22
|
};
|
|
23
|
-
// learnings.md is always included regardless of category filter
|
|
24
|
-
const ALWAYS_INCLUDE = 'learnings.md';
|
|
25
23
|
const SPECS_DIR = '.workflow/specs';
|
|
26
24
|
export const TEAM_SPECS_DIR = '.workflow/collab/specs';
|
|
27
25
|
/** Layer labels used as section headers when multi-directory scanning is active. */
|
|
@@ -47,14 +45,14 @@ const LAYER_LABELS = {
|
|
|
47
45
|
* When `uid` is absent, only the baseline directory is scanned — identical
|
|
48
46
|
* to the original single-directory behavior.
|
|
49
47
|
*/
|
|
50
|
-
export function loadSpecs(projectPath, category, uid) {
|
|
48
|
+
export function loadSpecs(projectPath, category, uid, keyword) {
|
|
51
49
|
// Build ordered list of (directory, label) pairs to scan
|
|
52
50
|
const layers = buildLayers(projectPath, uid);
|
|
53
51
|
const allSections = [];
|
|
54
52
|
const allMatched = [];
|
|
55
53
|
let totalCount = 0;
|
|
56
54
|
for (const { dir, label } of layers) {
|
|
57
|
-
const { sections, matched } = loadFromDir(dir, category);
|
|
55
|
+
const { sections, matched } = loadFromDir(dir, category, keyword);
|
|
58
56
|
if (sections.length === 0)
|
|
59
57
|
continue;
|
|
60
58
|
// Only add layer headers when multi-layer mode is active (uid provided)
|
|
@@ -92,7 +90,7 @@ function buildLayers(projectPath, uid) {
|
|
|
92
90
|
* Load spec files from a single directory. Returns empty arrays if the
|
|
93
91
|
* directory does not exist or is unreadable.
|
|
94
92
|
*/
|
|
95
|
-
function loadFromDir(specsDir, category) {
|
|
93
|
+
function loadFromDir(specsDir, category, keyword) {
|
|
96
94
|
if (!existsSync(specsDir))
|
|
97
95
|
return { sections: [], matched: [] };
|
|
98
96
|
let files;
|
|
@@ -118,8 +116,18 @@ function loadFromDir(specsDir, category) {
|
|
|
118
116
|
const body = stripFrontmatter(raw).trim();
|
|
119
117
|
if (!body)
|
|
120
118
|
continue;
|
|
121
|
-
|
|
122
|
-
|
|
119
|
+
if (keyword) {
|
|
120
|
+
// Entry-level keyword filtering
|
|
121
|
+
const filtered = filterByKeyword(body, keyword);
|
|
122
|
+
if (filtered) {
|
|
123
|
+
sections.push(filtered);
|
|
124
|
+
matched.push(file);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
sections.push(body);
|
|
129
|
+
matched.push(file);
|
|
130
|
+
}
|
|
123
131
|
}
|
|
124
132
|
return { sections, matched };
|
|
125
133
|
}
|
|
@@ -130,14 +138,32 @@ function shouldInclude(filename, category) {
|
|
|
130
138
|
// No category filter → load all
|
|
131
139
|
if (!category)
|
|
132
140
|
return true;
|
|
133
|
-
|
|
134
|
-
if (
|
|
135
|
-
return
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
+
const cat = CATEGORY_MAP[filename];
|
|
142
|
+
if (cat)
|
|
143
|
+
return cat === category;
|
|
144
|
+
// Unknown files: include only when no category filter
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Filter file content by keyword. Returns matched entry content or null.
|
|
149
|
+
* Handles both <spec-entry> tags (keyword attribute match) and legacy entries (text grep).
|
|
150
|
+
*/
|
|
151
|
+
function filterByKeyword(body, keyword) {
|
|
152
|
+
const kw = keyword.toLowerCase();
|
|
153
|
+
const { entries, legacy } = parseSpecEntries(body);
|
|
154
|
+
const matchedSections = [];
|
|
155
|
+
// New-format: match by keywords attribute
|
|
156
|
+
const matchedEntries = entries.filter(e => e.keywords.includes(kw));
|
|
157
|
+
if (matchedEntries.length > 0) {
|
|
158
|
+
matchedSections.push(formatSpecEntries(matchedEntries));
|
|
159
|
+
}
|
|
160
|
+
// Legacy: grep text match
|
|
161
|
+
for (const leg of legacy) {
|
|
162
|
+
if (leg.content.toLowerCase().includes(kw)) {
|
|
163
|
+
matchedSections.push(leg.content);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return matchedSections.length > 0 ? matchedSections.join('\n\n---\n\n') : null;
|
|
141
167
|
}
|
|
142
168
|
function stripFrontmatter(raw) {
|
|
143
169
|
const trimmed = raw.trimStart();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-loader.js","sourceRoot":"","sources":["../../../src/tools/spec-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"spec-loader.js","sourceRoot":"","sources":["../../../src/tools/spec-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Agents - MCP tools for agent lifecycle management via delegate broker
|
|
3
|
+
*
|
|
4
|
+
* Tools:
|
|
5
|
+
* - team_spawn_agent: Spawn a new agent (register session + create job)
|
|
6
|
+
* - team_shutdown_agent: Cancel a running agent's delegate job
|
|
7
|
+
* - team_remove_agent: Remove agent from team config
|
|
8
|
+
* - team_members: List team members with live status from broker
|
|
9
|
+
*
|
|
10
|
+
* Storage: .workflow/.team/{session-id}/members.json
|
|
11
|
+
*
|
|
12
|
+
* Integration:
|
|
13
|
+
* - Delegate broker for job lifecycle (registerSession, publishEvent, requestCancel)
|
|
14
|
+
* - Team config (members.json) for persistent member registry
|
|
15
|
+
*/
|
|
16
|
+
import type { ToolSchema, CcwToolResult } from '../types/tool-schema.js';
|
|
17
|
+
export interface TeamMember {
|
|
18
|
+
role: string;
|
|
19
|
+
tool: string;
|
|
20
|
+
prompt: string;
|
|
21
|
+
job_id: string;
|
|
22
|
+
exec_id: string;
|
|
23
|
+
spawned_at: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const schema: ToolSchema;
|
|
26
|
+
export declare function handler(params: Record<string, unknown>): Promise<CcwToolResult>;
|
|
27
|
+
//# sourceMappingURL=team-agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-agents.d.ts","sourceRoot":"","sources":["../../../src/tools/team-agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAezE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAiTD,eAAO,MAAM,MAAM,EAAE,UAoDpB,CAAC;AAMF,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,aAAa,CAAC,CAuCxB"}
|