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
package/dist/src/tools/index.js
CHANGED
|
@@ -5,7 +5,10 @@ import * as writeFileTool from './write-file.js';
|
|
|
5
5
|
import * as readFileTool from './read-file.js';
|
|
6
6
|
import * as readManyFilesTool from './read-many-files.js';
|
|
7
7
|
import * as teamMsgTool from './team-msg.js';
|
|
8
|
+
import * as teamMailboxTool from './team-mailbox.js';
|
|
8
9
|
import * as coreMemoryTool from './core-memory.js';
|
|
10
|
+
import * as teamTasksMcpTool from './team-tasks-mcp.js';
|
|
11
|
+
import * as teamAgentsTool from './team-agents.js';
|
|
9
12
|
/**
|
|
10
13
|
* Register a CCW-style tool (with schema + handler exports) into the maestro registry.
|
|
11
14
|
* Adapts CCW's { success, result, error } format to maestro's { content, isError } format.
|
|
@@ -27,6 +30,9 @@ export function registerBuiltinTools(registry) {
|
|
|
27
30
|
registerCcwTool(registry, readFileTool);
|
|
28
31
|
registerCcwTool(registry, readManyFilesTool);
|
|
29
32
|
registerCcwTool(registry, teamMsgTool);
|
|
33
|
+
registerCcwTool(registry, teamMailboxTool);
|
|
30
34
|
registerCcwTool(registry, coreMemoryTool);
|
|
35
|
+
registerCcwTool(registry, teamTasksMcpTool);
|
|
36
|
+
registerCcwTool(registry, teamAgentsTool);
|
|
31
37
|
}
|
|
32
38
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,oDAAoD;AACpD,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,iBAAiB,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAC;AAEnD;;;GAGG;AACH,SAAS,eAAe,CACtB,QAAsB,EACtB,GAAwJ;IAExJ,QAAQ,CAAC,QAAQ,CAAC;QAChB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;QACrB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW;QACnC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW;QACnC,KAAK,CAAC,OAAO,CAAC,KAA8B;YAC1C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxC,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACzC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxC,eAAe,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC7C,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACvC,eAAe,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC5C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,oDAAoD;AACpD,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,iBAAiB,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,eAAe,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAC;AAEnD;;;GAGG;AACH,SAAS,eAAe,CACtB,QAAsB,EACtB,GAAwJ;IAExJ,QAAQ,CAAC,QAAQ,CAAC;QAChB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;QACrB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW;QACnC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW;QACnC,KAAK,CAAC,OAAO,CAAC,KAA8B;YAC1C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxC,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACzC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxC,eAAe,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC7C,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACvC,eAAe,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC3C,eAAe,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC1C,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC5C,eAAe,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface MergeValidation {
|
|
2
|
+
phase_completeness: boolean;
|
|
3
|
+
state_consistency: boolean;
|
|
4
|
+
artifact_integrity: boolean;
|
|
5
|
+
dependency_check: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface MergeValidationResult {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
checks: MergeValidation;
|
|
10
|
+
errors: string[];
|
|
11
|
+
warnings: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validate that a worktree is ready to merge back to main.
|
|
15
|
+
*
|
|
16
|
+
* @param worktreePath Absolute path to the worktree root
|
|
17
|
+
* @param mainPath Absolute path to the main worktree root
|
|
18
|
+
* @param milestoneNum Milestone number being merged
|
|
19
|
+
* @param opts Options (force skips completeness check)
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateMergeReadiness(worktreePath: string, mainPath: string, milestoneNum: number, opts?: {
|
|
22
|
+
force?: boolean;
|
|
23
|
+
}): MergeValidationResult;
|
|
24
|
+
//# sourceMappingURL=merge-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-validator.d.ts","sourceRoot":"","sources":["../../../src/tools/merge-validator.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA0BD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB,qBAAqB,CA8DvB"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Merge Validator — Pre-merge integrity checks for worktree → main merges.
|
|
3
|
+
//
|
|
4
|
+
// Pure functions — no side effects, no git operations. Takes paths and returns
|
|
5
|
+
// validation results. Called by the maestro-merge workflow before Phase 1.
|
|
6
|
+
//
|
|
7
|
+
// Checks:
|
|
8
|
+
// 1. Phase completeness: all owned phases must be "completed"
|
|
9
|
+
// 2. State consistency: worktree state.json fields don't conflict with main
|
|
10
|
+
// 3. Artifact integrity: every owned phase has a valid index.json
|
|
11
|
+
// 4. Dependency check: dependency phases still exist in main
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Main validation entry point
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Validate that a worktree is ready to merge back to main.
|
|
20
|
+
*
|
|
21
|
+
* @param worktreePath Absolute path to the worktree root
|
|
22
|
+
* @param mainPath Absolute path to the main worktree root
|
|
23
|
+
* @param milestoneNum Milestone number being merged
|
|
24
|
+
* @param opts Options (force skips completeness check)
|
|
25
|
+
*/
|
|
26
|
+
export function validateMergeReadiness(worktreePath, mainPath, milestoneNum, opts) {
|
|
27
|
+
const errors = [];
|
|
28
|
+
const warnings = [];
|
|
29
|
+
// Load worktree-scope.json
|
|
30
|
+
const scope = loadWorktreeScope(worktreePath);
|
|
31
|
+
if (!scope) {
|
|
32
|
+
return {
|
|
33
|
+
valid: false,
|
|
34
|
+
checks: { phase_completeness: false, state_consistency: false, artifact_integrity: false, dependency_check: false },
|
|
35
|
+
errors: ['Cannot read .workflow/worktree-scope.json in worktree'],
|
|
36
|
+
warnings: [],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (scope.milestone_num !== milestoneNum) {
|
|
40
|
+
errors.push(`Milestone mismatch: worktree owns M${scope.milestone_num} but merge requested for M${milestoneNum}`);
|
|
41
|
+
}
|
|
42
|
+
// Check 1: Phase completeness
|
|
43
|
+
const completeness = checkPhaseCompleteness(worktreePath, scope.owned_phases, opts?.force);
|
|
44
|
+
if (!completeness.passed) {
|
|
45
|
+
if (opts?.force) {
|
|
46
|
+
warnings.push(...completeness.messages.map(m => `[force] ${m}`));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
errors.push(...completeness.messages);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Check 2: State consistency
|
|
53
|
+
const consistency = checkStateConsistency(worktreePath, mainPath);
|
|
54
|
+
if (!consistency.passed) {
|
|
55
|
+
errors.push(...consistency.messages);
|
|
56
|
+
}
|
|
57
|
+
// Check 3: Artifact integrity
|
|
58
|
+
const integrity = checkArtifactIntegrity(worktreePath, scope.owned_phases);
|
|
59
|
+
if (!integrity.passed) {
|
|
60
|
+
errors.push(...integrity.messages);
|
|
61
|
+
}
|
|
62
|
+
// Check 4: Dependency check
|
|
63
|
+
const deps = checkDependencies(worktreePath, mainPath, scope.owned_phases);
|
|
64
|
+
if (!deps.passed) {
|
|
65
|
+
warnings.push(...deps.messages);
|
|
66
|
+
}
|
|
67
|
+
const checks = {
|
|
68
|
+
phase_completeness: completeness.passed || (opts?.force === true),
|
|
69
|
+
state_consistency: consistency.passed,
|
|
70
|
+
artifact_integrity: integrity.passed,
|
|
71
|
+
dependency_check: deps.passed,
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
valid: errors.length === 0,
|
|
75
|
+
checks,
|
|
76
|
+
errors,
|
|
77
|
+
warnings,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function checkPhaseCompleteness(worktreePath, ownedPhases, force) {
|
|
81
|
+
const messages = [];
|
|
82
|
+
const phasesDir = join(worktreePath, '.workflow', 'phases');
|
|
83
|
+
if (!existsSync(phasesDir)) {
|
|
84
|
+
return { passed: false, messages: ['No .workflow/phases/ directory in worktree'] };
|
|
85
|
+
}
|
|
86
|
+
for (const phaseNum of ownedPhases) {
|
|
87
|
+
const index = findPhaseIndex(phasesDir, phaseNum);
|
|
88
|
+
if (!index) {
|
|
89
|
+
messages.push(`Phase ${phaseNum}: index.json not found`);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (index.status !== 'completed') {
|
|
93
|
+
messages.push(`Phase ${phaseNum} (${index.title ?? index.slug ?? '?'}): status is "${index.status}", expected "completed"`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { passed: messages.length === 0, messages };
|
|
97
|
+
}
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Check 2: State Consistency
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
function checkStateConsistency(worktreePath, mainPath) {
|
|
102
|
+
const messages = [];
|
|
103
|
+
const wtStatePath = join(worktreePath, '.workflow', 'state.json');
|
|
104
|
+
const mainStatePath = join(mainPath, '.workflow', 'state.json');
|
|
105
|
+
const wtState = loadJson(wtStatePath);
|
|
106
|
+
const mainState = loadJson(mainStatePath);
|
|
107
|
+
if (!wtState) {
|
|
108
|
+
messages.push('Cannot read .workflow/state.json in worktree');
|
|
109
|
+
return { passed: false, messages };
|
|
110
|
+
}
|
|
111
|
+
if (!mainState) {
|
|
112
|
+
messages.push('Cannot read .workflow/state.json in main');
|
|
113
|
+
return { passed: false, messages };
|
|
114
|
+
}
|
|
115
|
+
// Check that project-level fields haven't diverged
|
|
116
|
+
if (wtState.project_name && mainState.project_name &&
|
|
117
|
+
wtState.project_name !== mainState.project_name) {
|
|
118
|
+
messages.push(`project_name diverged: worktree="${wtState.project_name}" vs main="${mainState.project_name}"`);
|
|
119
|
+
}
|
|
120
|
+
// Check milestones array length consistency
|
|
121
|
+
const wtMilestones = Array.isArray(wtState.milestones) ? wtState.milestones.length : 0;
|
|
122
|
+
const mainMilestones = Array.isArray(mainState.milestones) ? mainState.milestones.length : 0;
|
|
123
|
+
if (wtMilestones !== mainMilestones && wtMilestones > 0 && mainMilestones > 0) {
|
|
124
|
+
messages.push(`milestones array length differs: worktree=${wtMilestones} vs main=${mainMilestones}`);
|
|
125
|
+
}
|
|
126
|
+
return { passed: messages.length === 0, messages };
|
|
127
|
+
}
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
// Check 3: Artifact Integrity
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
function checkArtifactIntegrity(worktreePath, ownedPhases) {
|
|
132
|
+
const messages = [];
|
|
133
|
+
const phasesDir = join(worktreePath, '.workflow', 'phases');
|
|
134
|
+
for (const phaseNum of ownedPhases) {
|
|
135
|
+
const index = findPhaseIndex(phasesDir, phaseNum);
|
|
136
|
+
if (!index) {
|
|
137
|
+
messages.push(`Phase ${phaseNum}: missing index.json`);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
// Validate required fields
|
|
141
|
+
if (typeof index.phase !== 'number') {
|
|
142
|
+
messages.push(`Phase ${phaseNum}: index.json missing "phase" field`);
|
|
143
|
+
}
|
|
144
|
+
if (typeof index.status !== 'string') {
|
|
145
|
+
messages.push(`Phase ${phaseNum}: index.json missing "status" field`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { passed: messages.length === 0, messages };
|
|
149
|
+
}
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// Check 4: Dependency Check
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
function checkDependencies(worktreePath, mainPath, ownedPhases) {
|
|
154
|
+
const messages = [];
|
|
155
|
+
const wtPhasesDir = join(worktreePath, '.workflow', 'phases');
|
|
156
|
+
const mainPhasesDir = join(mainPath, '.workflow', 'phases');
|
|
157
|
+
// Collect all dependencies from owned phases
|
|
158
|
+
const allDeps = new Set();
|
|
159
|
+
for (const phaseNum of ownedPhases) {
|
|
160
|
+
const index = findPhaseIndex(wtPhasesDir, phaseNum);
|
|
161
|
+
if (index?.depends_on) {
|
|
162
|
+
for (const dep of index.depends_on) {
|
|
163
|
+
if (!ownedPhases.includes(dep)) {
|
|
164
|
+
allDeps.add(dep);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Verify each dependency still exists in main
|
|
170
|
+
for (const dep of allDeps) {
|
|
171
|
+
const mainIndex = findPhaseIndex(mainPhasesDir, dep);
|
|
172
|
+
if (!mainIndex) {
|
|
173
|
+
messages.push(`Dependency phase ${dep} not found in main .workflow/phases/`);
|
|
174
|
+
}
|
|
175
|
+
else if (mainIndex.status !== 'completed') {
|
|
176
|
+
messages.push(`Dependency phase ${dep} in main has status "${mainIndex.status}" (expected "completed")`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return { passed: messages.length === 0, messages };
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// Helpers
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
function loadWorktreeScope(worktreePath) {
|
|
185
|
+
const scopePath = join(worktreePath, '.workflow', 'worktree-scope.json');
|
|
186
|
+
return loadJson(scopePath);
|
|
187
|
+
}
|
|
188
|
+
function loadJson(filePath) {
|
|
189
|
+
try {
|
|
190
|
+
if (!existsSync(filePath))
|
|
191
|
+
return null;
|
|
192
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Find a phase's index.json by phase number. Phases are stored as
|
|
200
|
+
* `{NN}-{slug}/index.json` where NN is zero-padded.
|
|
201
|
+
*/
|
|
202
|
+
function findPhaseIndex(phasesDir, phaseNum) {
|
|
203
|
+
if (!existsSync(phasesDir))
|
|
204
|
+
return null;
|
|
205
|
+
const prefix = String(phaseNum).padStart(2, '0') + '-';
|
|
206
|
+
try {
|
|
207
|
+
const entries = readdirSync(phasesDir);
|
|
208
|
+
const match = entries.find(e => e.startsWith(prefix));
|
|
209
|
+
if (!match)
|
|
210
|
+
return null;
|
|
211
|
+
const indexPath = join(phasesDir, match, 'index.json');
|
|
212
|
+
if (!existsSync(indexPath))
|
|
213
|
+
return null;
|
|
214
|
+
return JSON.parse(readFileSync(indexPath, 'utf-8'));
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=merge-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-validator.js","sourceRoot":"","sources":["../../../src/tools/merge-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Entry Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses `<spec-entry>` closed-tag blocks from spec markdown files.
|
|
5
|
+
* Supports dual-format: new `<spec-entry>` tags + legacy heading-based entries.
|
|
6
|
+
*/
|
|
7
|
+
export interface SpecEntryParsed {
|
|
8
|
+
category: string;
|
|
9
|
+
keywords: string[];
|
|
10
|
+
date: string;
|
|
11
|
+
source?: string;
|
|
12
|
+
title: string;
|
|
13
|
+
content: string;
|
|
14
|
+
lineStart: number;
|
|
15
|
+
lineEnd: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ParseResult {
|
|
18
|
+
entries: SpecEntryParsed[];
|
|
19
|
+
legacy: LegacyEntry[];
|
|
20
|
+
errors: ParseError[];
|
|
21
|
+
}
|
|
22
|
+
export interface LegacyEntry {
|
|
23
|
+
title: string;
|
|
24
|
+
content: string;
|
|
25
|
+
lineStart: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ParseError {
|
|
28
|
+
line: number;
|
|
29
|
+
message: string;
|
|
30
|
+
}
|
|
31
|
+
export declare const VALID_CATEGORIES: readonly ["coding", "arch", "quality", "debug", "test", "review", "learning"];
|
|
32
|
+
export type ValidCategory = (typeof VALID_CATEGORIES)[number];
|
|
33
|
+
/**
|
|
34
|
+
* Parse spec file content into structured entries.
|
|
35
|
+
* Returns new-format `<spec-entry>` entries, legacy heading entries, and any errors.
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseSpecEntries(content: string): ParseResult;
|
|
38
|
+
/**
|
|
39
|
+
* Validate a single parsed entry. Returns array of error messages (empty = valid).
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateSpecEntry(entry: SpecEntryParsed): string[];
|
|
42
|
+
/**
|
|
43
|
+
* Validate that entry category matches the expected file category.
|
|
44
|
+
*/
|
|
45
|
+
export declare function validateCategoryMatch(entry: SpecEntryParsed, fileCategory: string): string | null;
|
|
46
|
+
/**
|
|
47
|
+
* Format parsed entries for display output.
|
|
48
|
+
* Strips `<spec-entry>` tags, shows clean content.
|
|
49
|
+
* If keyword provided, highlights matched entries.
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatSpecEntries(entries: SpecEntryParsed[], keyword?: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Format a single entry for writing to a spec file.
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatNewEntry(category: string, keywords: string[], date: string, title: string, content: string, source?: string): string;
|
|
56
|
+
//# sourceMappingURL=spec-entry-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-entry-parser.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-entry-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,eAAO,MAAM,gBAAgB,+EAAgF,CAAC;AAC9G,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAyB9D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAqD7D;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,CAoBlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKjG;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAQtF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAIR"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Entry Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses `<spec-entry>` closed-tag blocks from spec markdown files.
|
|
5
|
+
* Supports dual-format: new `<spec-entry>` tags + legacy heading-based entries.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Valid categories (shared with spec-loader)
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export const VALID_CATEGORIES = ['coding', 'arch', 'quality', 'debug', 'test', 'review', 'learning'];
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Core regex
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/** Matches `<spec-entry ...attributes...>...content...</spec-entry>` across lines */
|
|
15
|
+
const SPEC_ENTRY_RE = /<spec-entry\s+([^>]+)>([\s\S]*?)<\/spec-entry>/g;
|
|
16
|
+
/** Extracts key="value" attribute pairs */
|
|
17
|
+
const ATTR_RE = /([\w-]+)="([^"]*)"/g;
|
|
18
|
+
/** Matches ### heading inside entry content */
|
|
19
|
+
const HEADING_RE = /^###\s+(.+)$/m;
|
|
20
|
+
/** Legacy format: ### [category] [date] title OR ### [date] type: title */
|
|
21
|
+
const LEGACY_HEADING_RE = /^###\s+(?:\[[\w-]+\]\s+)?\[(\d{4}-\d{2}-\d{2}(?:\s[\d:]+)?)\]\s*(.+)$/;
|
|
22
|
+
/** Date validation */
|
|
23
|
+
const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Parser
|
|
26
|
+
// ============================================================================
|
|
27
|
+
/**
|
|
28
|
+
* Parse spec file content into structured entries.
|
|
29
|
+
* Returns new-format `<spec-entry>` entries, legacy heading entries, and any errors.
|
|
30
|
+
*/
|
|
31
|
+
export function parseSpecEntries(content) {
|
|
32
|
+
const entries = [];
|
|
33
|
+
const errors = [];
|
|
34
|
+
// Track which character ranges are consumed by <spec-entry> blocks
|
|
35
|
+
const consumed = [];
|
|
36
|
+
// Pass 1: Extract <spec-entry> blocks
|
|
37
|
+
let match;
|
|
38
|
+
SPEC_ENTRY_RE.lastIndex = 0;
|
|
39
|
+
while ((match = SPEC_ENTRY_RE.exec(content)) !== null) {
|
|
40
|
+
const attrStr = match[1];
|
|
41
|
+
const body = match[2];
|
|
42
|
+
const blockStart = match.index;
|
|
43
|
+
const blockEnd = blockStart + match[0].length;
|
|
44
|
+
const lineStart = lineNumber(content, blockStart);
|
|
45
|
+
const lineEnd = lineNumber(content, blockEnd);
|
|
46
|
+
consumed.push({ start: blockStart, end: blockEnd });
|
|
47
|
+
// Parse attributes
|
|
48
|
+
const attrs = parseAttributes(attrStr);
|
|
49
|
+
// Extract title from first ### heading
|
|
50
|
+
const titleMatch = body.match(HEADING_RE);
|
|
51
|
+
const title = titleMatch ? titleMatch[1].trim() : '';
|
|
52
|
+
// Validate and build entry
|
|
53
|
+
const entry = {
|
|
54
|
+
category: attrs.category ?? '',
|
|
55
|
+
keywords: attrs.keywords ? attrs.keywords.split(',').map(k => k.trim().toLowerCase()).filter(Boolean) : [],
|
|
56
|
+
date: attrs.date ?? '',
|
|
57
|
+
source: attrs.source,
|
|
58
|
+
title,
|
|
59
|
+
content: body.trim(),
|
|
60
|
+
lineStart,
|
|
61
|
+
lineEnd,
|
|
62
|
+
};
|
|
63
|
+
entries.push(entry);
|
|
64
|
+
// Collect validation errors
|
|
65
|
+
const validationErrors = validateSpecEntry(entry);
|
|
66
|
+
for (const msg of validationErrors) {
|
|
67
|
+
errors.push({ line: lineStart, message: msg });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Pass 2: Extract legacy entries from remaining text
|
|
71
|
+
const legacy = parseLegacyEntries(content, consumed);
|
|
72
|
+
return { entries, legacy, errors };
|
|
73
|
+
}
|
|
74
|
+
// ============================================================================
|
|
75
|
+
// Validation
|
|
76
|
+
// ============================================================================
|
|
77
|
+
/**
|
|
78
|
+
* Validate a single parsed entry. Returns array of error messages (empty = valid).
|
|
79
|
+
*/
|
|
80
|
+
export function validateSpecEntry(entry) {
|
|
81
|
+
const errors = [];
|
|
82
|
+
if (!entry.category) {
|
|
83
|
+
errors.push('Missing required attribute: category');
|
|
84
|
+
}
|
|
85
|
+
else if (!VALID_CATEGORIES.includes(entry.category)) {
|
|
86
|
+
errors.push(`Invalid category "${entry.category}". Must be one of: ${VALID_CATEGORIES.join(', ')}`);
|
|
87
|
+
}
|
|
88
|
+
if (entry.keywords.length === 0) {
|
|
89
|
+
errors.push('Missing required attribute: keywords (need at least 1)');
|
|
90
|
+
}
|
|
91
|
+
if (!entry.date) {
|
|
92
|
+
errors.push('Missing required attribute: date');
|
|
93
|
+
}
|
|
94
|
+
else if (!DATE_RE.test(entry.date)) {
|
|
95
|
+
errors.push(`Invalid date format "${entry.date}". Expected YYYY-MM-DD`);
|
|
96
|
+
}
|
|
97
|
+
return errors;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validate that entry category matches the expected file category.
|
|
101
|
+
*/
|
|
102
|
+
export function validateCategoryMatch(entry, fileCategory) {
|
|
103
|
+
if (entry.category && entry.category !== fileCategory) {
|
|
104
|
+
return `Entry category "${entry.category}" does not match file category "${fileCategory}"`;
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
// ============================================================================
|
|
109
|
+
// Formatting
|
|
110
|
+
// ============================================================================
|
|
111
|
+
/**
|
|
112
|
+
* Format parsed entries for display output.
|
|
113
|
+
* Strips `<spec-entry>` tags, shows clean content.
|
|
114
|
+
* If keyword provided, highlights matched entries.
|
|
115
|
+
*/
|
|
116
|
+
export function formatSpecEntries(entries, keyword) {
|
|
117
|
+
const filtered = keyword
|
|
118
|
+
? entries.filter(e => e.keywords.includes(keyword.toLowerCase()))
|
|
119
|
+
: entries;
|
|
120
|
+
if (filtered.length === 0)
|
|
121
|
+
return '';
|
|
122
|
+
return filtered.map(e => e.content).join('\n\n---\n\n');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Format a single entry for writing to a spec file.
|
|
126
|
+
*/
|
|
127
|
+
export function formatNewEntry(category, keywords, date, title, content, source) {
|
|
128
|
+
const kwStr = keywords.map(k => k.toLowerCase().trim()).filter(Boolean).join(',');
|
|
129
|
+
const sourceAttr = source ? ` source="${source}"` : '';
|
|
130
|
+
return `<spec-entry category="${category}" keywords="${kwStr}" date="${date}"${sourceAttr}>\n\n### ${title}\n\n${content}\n\n</spec-entry>`;
|
|
131
|
+
}
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// Internal helpers
|
|
134
|
+
// ============================================================================
|
|
135
|
+
function parseAttributes(attrStr) {
|
|
136
|
+
const attrs = {};
|
|
137
|
+
let m;
|
|
138
|
+
ATTR_RE.lastIndex = 0;
|
|
139
|
+
while ((m = ATTR_RE.exec(attrStr)) !== null) {
|
|
140
|
+
attrs[m[1]] = m[2];
|
|
141
|
+
}
|
|
142
|
+
return attrs;
|
|
143
|
+
}
|
|
144
|
+
function lineNumber(content, charIndex) {
|
|
145
|
+
let line = 1;
|
|
146
|
+
for (let i = 0; i < charIndex && i < content.length; i++) {
|
|
147
|
+
if (content[i] === '\n')
|
|
148
|
+
line++;
|
|
149
|
+
}
|
|
150
|
+
return line;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Parse legacy heading-based entries from text not consumed by <spec-entry> blocks.
|
|
154
|
+
*/
|
|
155
|
+
function parseLegacyEntries(content, consumed) {
|
|
156
|
+
const lines = content.split('\n');
|
|
157
|
+
const legacy = [];
|
|
158
|
+
let currentOffset = 0;
|
|
159
|
+
// Build a set of line numbers that are inside <spec-entry> blocks
|
|
160
|
+
const consumedLines = new Set();
|
|
161
|
+
for (const range of consumed) {
|
|
162
|
+
const startLine = lineNumber(content, range.start);
|
|
163
|
+
const endLine = lineNumber(content, range.end);
|
|
164
|
+
for (let i = startLine; i <= endLine; i++) {
|
|
165
|
+
consumedLines.add(i);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
let current = null;
|
|
169
|
+
for (let i = 0; i < lines.length; i++) {
|
|
170
|
+
const lineNum = i + 1;
|
|
171
|
+
if (consumedLines.has(lineNum))
|
|
172
|
+
continue;
|
|
173
|
+
const line = lines[i];
|
|
174
|
+
const m = line.match(LEGACY_HEADING_RE);
|
|
175
|
+
if (m) {
|
|
176
|
+
if (current) {
|
|
177
|
+
const body = current.bodyLines.join('\n').trim();
|
|
178
|
+
if (body) {
|
|
179
|
+
legacy.push({ title: current.title, content: `### ${current.title}\n\n${body}`, lineStart: current.lineStart });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
current = { title: m[2].trim(), bodyLines: [], lineStart: lineNum };
|
|
183
|
+
}
|
|
184
|
+
else if (current) {
|
|
185
|
+
current.bodyLines.push(line);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (current) {
|
|
189
|
+
const body = current.bodyLines.join('\n').trim();
|
|
190
|
+
if (body) {
|
|
191
|
+
legacy.push({ title: current.title, content: `### ${current.title}\n\n${body}`, lineStart: current.lineStart });
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return legacy;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=spec-entry-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-entry-parser.js","sourceRoot":"","sources":["../../../src/tools/spec-entry-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-init.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"spec-init.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AA8KD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CA0B9D"}
|