@specforge/cli 0.1.0 → 0.2.5
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/dist/cli/commands/debug/register.js +1 -1
- package/dist/cli/commands/debug/register.js.map +1 -1
- package/dist/cli/commands/debug/types.d.ts.map +1 -1
- package/dist/cli/commands/debug/types.js +4 -2
- package/dist/cli/commands/debug/types.js.map +1 -1
- package/dist/cli/commands/init.types.d.ts +4 -4
- package/dist/cli/commands/init.types.d.ts.map +1 -1
- package/dist/cli/commands/init.types.js.map +1 -1
- package/dist/cli/commands/scaffold/agent-types.js +1 -1
- package/dist/cli/commands/scaffold/agent-types.js.map +1 -1
- package/dist/cli/config/agent-teams.types.d.ts +35 -12
- package/dist/cli/config/agent-teams.types.d.ts.map +1 -1
- package/dist/cli/config/agent-teams.types.js.map +1 -1
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts +21 -3
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts.map +1 -1
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.js +114 -48
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.js.map +1 -1
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts.map +1 -1
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.js +124 -83
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.js.map +1 -1
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts +22 -3
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts.map +1 -1
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js +225 -160
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js.map +1 -1
- package/dist/cli/templates/agents/content/core/sfag-work-resolver.d.ts +16 -0
- package/dist/cli/templates/agents/content/core/sfag-work-resolver.d.ts.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-work-resolver.js +199 -0
- package/dist/cli/templates/agents/content/core/sfag-work-resolver.js.map +1 -0
- package/dist/cli/templates/agents/index.d.ts.map +1 -1
- package/dist/cli/templates/agents/index.js +2 -0
- package/dist/cli/templates/agents/index.js.map +1 -1
- package/dist/cli/templates/content/sf-commit.d.ts +1 -1
- package/dist/cli/templates/content/sf-commit.d.ts.map +1 -1
- package/dist/cli/templates/content/sf-commit.js +2 -2
- package/dist/cli/templates/content/sf-commit.js.map +1 -1
- package/dist/cli/templates/content/sf-reset.d.ts +5 -2
- package/dist/cli/templates/content/sf-reset.d.ts.map +1 -1
- package/dist/cli/templates/content/sf-reset.js +41 -27
- package/dist/cli/templates/content/sf-reset.js.map +1 -1
- package/dist/lib/prompt-generator.d.ts +15 -3
- package/dist/lib/prompt-generator.d.ts.map +1 -1
- package/dist/lib/prompt-generator.js +14 -6
- package/dist/lib/prompt-generator.js.map +1 -1
- package/dist/lib/workflow-definitions.js +2 -2
- package/dist/lib/workflow-definitions.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/__tests__/complete-planning-double-call.test.d.ts +2 -0
- package/dist/tools/__tests__/complete-planning-double-call.test.d.ts.map +1 -0
- package/dist/tools/core/__tests__/file-existence-injection.test.d.ts +2 -0
- package/dist/tools/core/__tests__/file-existence-injection.test.d.ts.map +1 -0
- package/dist/tools/core/__tests__/git-injection.test.d.ts +2 -0
- package/dist/tools/core/__tests__/git-injection.test.d.ts.map +1 -0
- package/dist/tools/core/file-existence-injection.d.ts +22 -0
- package/dist/tools/core/file-existence-injection.d.ts.map +1 -0
- package/dist/tools/core/file-existence-injection.js +49 -0
- package/dist/tools/core/file-existence-injection.js.map +1 -0
- package/dist/tools/core/git-injection.d.ts +58 -0
- package/dist/tools/core/git-injection.d.ts.map +1 -0
- package/dist/tools/core/git-injection.js +79 -0
- package/dist/tools/core/git-injection.js.map +1 -0
- package/dist/tools/core/index.d.ts +1 -0
- package/dist/tools/core/index.d.ts.map +1 -1
- package/dist/tools/core/index.js +1 -0
- package/dist/tools/core/index.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +358 -440
- package/dist/tools/index.js.map +1 -1
- package/dist/transport/__tests__/remote.test.d.ts +2 -0
- package/dist/transport/__tests__/remote.test.d.ts.map +1 -0
- package/dist/transport/remote.d.ts.map +1 -1
- package/dist/transport/remote.js +23 -4
- package/dist/transport/remote.js.map +1 -1
- package/dist/types/index.d.ts +12 -32
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +0 -15
- package/dist/validation/index.js.map +1 -1
- package/node_modules/@specforge/api-types/README.md +38 -0
- package/node_modules/@specforge/api-types/dist/client/appsync-client.d.ts +21 -0
- package/node_modules/@specforge/api-types/dist/client/appsync-client.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/client/appsync-client.js +2 -0
- package/node_modules/@specforge/api-types/dist/client/appsync-client.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/client/index.d.ts +2 -0
- package/node_modules/@specforge/api-types/dist/client/index.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/client/index.js +2 -0
- package/node_modules/@specforge/api-types/dist/client/index.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/index.d.ts +5 -0
- package/node_modules/@specforge/api-types/dist/index.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/index.js +9 -0
- package/node_modules/@specforge/api-types/dist/index.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/mcp/error-guidance.d.ts +74 -0
- package/node_modules/@specforge/api-types/dist/mcp/error-guidance.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/mcp/error-guidance.js +21 -0
- package/node_modules/@specforge/api-types/dist/mcp/error-guidance.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/mcp/index.d.ts +4 -0
- package/node_modules/@specforge/api-types/dist/mcp/index.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/mcp/index.js +8 -0
- package/node_modules/@specforge/api-types/dist/mcp/index.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/mcp/lifecycle-envelope.d.ts +18 -0
- package/node_modules/@specforge/api-types/dist/mcp/lifecycle-envelope.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/mcp/lifecycle-envelope.js +2 -0
- package/node_modules/@specforge/api-types/dist/mcp/lifecycle-envelope.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/mcp/standard-envelope.d.ts +39 -0
- package/node_modules/@specforge/api-types/dist/mcp/standard-envelope.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/mcp/standard-envelope.js +2 -0
- package/node_modules/@specforge/api-types/dist/mcp/standard-envelope.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/billing-record.d.ts +18 -0
- package/node_modules/@specforge/api-types/dist/runtime/billing-record.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/billing-record.js +7 -0
- package/node_modules/@specforge/api-types/dist/runtime/billing-record.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/blueprint-record.d.ts +40 -0
- package/node_modules/@specforge/api-types/dist/runtime/blueprint-record.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/blueprint-record.js +19 -0
- package/node_modules/@specforge/api-types/dist/runtime/blueprint-record.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/dependency-tree.d.ts +96 -0
- package/node_modules/@specforge/api-types/dist/runtime/dependency-tree.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/dependency-tree.js +23 -0
- package/node_modules/@specforge/api-types/dist/runtime/dependency-tree.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/epic-record.d.ts +117 -0
- package/node_modules/@specforge/api-types/dist/runtime/epic-record.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/epic-record.js +13 -0
- package/node_modules/@specforge/api-types/dist/runtime/epic-record.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/feedback-record.d.ts +27 -0
- package/node_modules/@specforge/api-types/dist/runtime/feedback-record.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/feedback-record.js +7 -0
- package/node_modules/@specforge/api-types/dist/runtime/feedback-record.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/fields.d.ts +31 -0
- package/node_modules/@specforge/api-types/dist/runtime/fields.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/fields.js +156 -0
- package/node_modules/@specforge/api-types/dist/runtime/fields.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/index.d.ts +18 -0
- package/node_modules/@specforge/api-types/dist/runtime/index.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/index.js +18 -0
- package/node_modules/@specforge/api-types/dist/runtime/index.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/pagination.d.ts +38 -0
- package/node_modules/@specforge/api-types/dist/runtime/pagination.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/pagination.js +54 -0
- package/node_modules/@specforge/api-types/dist/runtime/pagination.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-invitation.d.ts +14 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-invitation.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-invitation.js +2 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-invitation.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-member.d.ts +13 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-member.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-member.js +2 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-member.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-validation.d.ts +26 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-validation.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-validation.js +5 -0
- package/node_modules/@specforge/api-types/dist/runtime/project-validation.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/project.d.ts +55 -0
- package/node_modules/@specforge/api-types/dist/runtime/project.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/project.js +10 -0
- package/node_modules/@specforge/api-types/dist/runtime/project.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/response.d.ts +22 -0
- package/node_modules/@specforge/api-types/dist/runtime/response.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/response.js +14 -0
- package/node_modules/@specforge/api-types/dist/runtime/response.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/specification-record.d.ts +90 -0
- package/node_modules/@specforge/api-types/dist/runtime/specification-record.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/specification-record.js +11 -0
- package/node_modules/@specforge/api-types/dist/runtime/specification-record.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/status.d.ts +26 -0
- package/node_modules/@specforge/api-types/dist/runtime/status.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/status.js +56 -0
- package/node_modules/@specforge/api-types/dist/runtime/status.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/summary.d.ts +58 -0
- package/node_modules/@specforge/api-types/dist/runtime/summary.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/summary.js +42 -0
- package/node_modules/@specforge/api-types/dist/runtime/summary.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/ticket-record.d.ts +212 -0
- package/node_modules/@specforge/api-types/dist/runtime/ticket-record.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/ticket-record.js +18 -0
- package/node_modules/@specforge/api-types/dist/runtime/ticket-record.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/user.d.ts +13 -0
- package/node_modules/@specforge/api-types/dist/runtime/user.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/runtime/user.js +9 -0
- package/node_modules/@specforge/api-types/dist/runtime/user.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-billing-store.d.ts +17 -0
- package/node_modules/@specforge/api-types/dist/stores/i-billing-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-billing-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-billing-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-blueprint-store.d.ts +59 -0
- package/node_modules/@specforge/api-types/dist/stores/i-blueprint-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-blueprint-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-blueprint-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-epic-store.d.ts +120 -0
- package/node_modules/@specforge/api-types/dist/stores/i-epic-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-epic-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-epic-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-feedback-store.d.ts +13 -0
- package/node_modules/@specforge/api-types/dist/stores/i-feedback-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-feedback-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-feedback-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-project-store.d.ts +48 -0
- package/node_modules/@specforge/api-types/dist/stores/i-project-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-project-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-project-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-sharing-store.d.ts +37 -0
- package/node_modules/@specforge/api-types/dist/stores/i-sharing-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-sharing-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-sharing-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-spec-store.d.ts +159 -0
- package/node_modules/@specforge/api-types/dist/stores/i-spec-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-spec-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-spec-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-ticket-dependency-store.d.ts +87 -0
- package/node_modules/@specforge/api-types/dist/stores/i-ticket-dependency-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-ticket-dependency-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-ticket-dependency-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-ticket-store.d.ts +347 -0
- package/node_modules/@specforge/api-types/dist/stores/i-ticket-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-ticket-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-ticket-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-user-store.d.ts +5 -0
- package/node_modules/@specforge/api-types/dist/stores/i-user-store.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/i-user-store.js +2 -0
- package/node_modules/@specforge/api-types/dist/stores/i-user-store.js.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/index.d.ts +11 -0
- package/node_modules/@specforge/api-types/dist/stores/index.d.ts.map +1 -0
- package/node_modules/@specforge/api-types/dist/stores/index.js +11 -0
- package/node_modules/@specforge/api-types/dist/stores/index.js.map +1 -0
- package/node_modules/@specforge/api-types/package.json +43 -0
- package/node_modules/@specforge/report-types/README.md +11 -0
- package/node_modules/@specforge/report-types/dist/index.d.ts +2 -0
- package/node_modules/@specforge/report-types/dist/index.d.ts.map +1 -0
- package/node_modules/@specforge/report-types/dist/index.js +2 -0
- package/node_modules/@specforge/report-types/dist/index.js.map +1 -0
- package/node_modules/@specforge/report-types/dist/reports.d.ts +90 -0
- package/node_modules/@specforge/report-types/dist/reports.d.ts.map +1 -0
- package/node_modules/@specforge/report-types/dist/reports.js +15 -0
- package/node_modules/@specforge/report-types/dist/reports.js.map +1 -0
- package/node_modules/@specforge/report-types/package.json +40 -0
- package/node_modules/@specforge/session-types/CHANGELOG.md +56 -0
- package/node_modules/@specforge/session-types/README.md +18 -0
- package/node_modules/@specforge/session-types/dist/index.d.ts +47 -0
- package/node_modules/@specforge/session-types/dist/index.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/index.js +47 -0
- package/node_modules/@specforge/session-types/dist/index.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/aggregator-input.d.ts +46 -0
- package/node_modules/@specforge/session-types/dist/runtime/aggregator-input.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/aggregator-input.js +41 -0
- package/node_modules/@specforge/session-types/dist/runtime/aggregator-input.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/discovery.d.ts +9 -0
- package/node_modules/@specforge/session-types/dist/runtime/discovery.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/discovery.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/discovery.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/enums.d.ts +51 -0
- package/node_modules/@specforge/session-types/dist/runtime/enums.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/enums.js +161 -0
- package/node_modules/@specforge/session-types/dist/runtime/enums.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-config.d.ts +177 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-config.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-config.js +96 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-config.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-record-event.d.ts +8 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-record-event.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-record-event.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-record-event.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-session-aggregate.d.ts +489 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-session-aggregate.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-session-aggregate.js +152 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-session-aggregate.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-session.d.ts +8 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-session.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-session.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/implementation-session.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/lifecycle-contract.d.ts +319 -0
- package/node_modules/@specforge/session-types/dist/runtime/lifecycle-contract.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/lifecycle-contract.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/lifecycle-contract.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/lifecycle-planning-guidance.d.ts +128 -0
- package/node_modules/@specforge/session-types/dist/runtime/lifecycle-planning-guidance.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/lifecycle-planning-guidance.js +30 -0
- package/node_modules/@specforge/session-types/dist/runtime/lifecycle-planning-guidance.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/parsed-git-evidence.d.ts +4 -0
- package/node_modules/@specforge/session-types/dist/runtime/parsed-git-evidence.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/parsed-git-evidence.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/parsed-git-evidence.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-config.d.ts +82 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-config.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-config.js +61 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-config.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-entity-score-datapoint.d.ts +34 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-entity-score-datapoint.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-entity-score-datapoint.js +14 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-entity-score-datapoint.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-operations.d.ts +6 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-operations.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-operations.js +65 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-operations.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-phase-transition.d.ts +34 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-phase-transition.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-phase-transition.js +22 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-phase-transition.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session-action.d.ts +73 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session-action.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session-action.js +61 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session-action.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session-aggregate.d.ts +249 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session-aggregate.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session-aggregate.js +96 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session-aggregate.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session.d.ts +574 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session.js +40 -0
- package/node_modules/@specforge/session-types/dist/runtime/planning-session.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/process-guidance.d.ts +221 -0
- package/node_modules/@specforge/session-types/dist/runtime/process-guidance.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/process-guidance.js +41 -0
- package/node_modules/@specforge/session-types/dist/runtime/process-guidance.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-acceptance-check.d.ts +4 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-acceptance-check.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-acceptance-check.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-acceptance-check.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-action.d.ts +9 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-action.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-action.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-action.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-file-change.d.ts +4 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-file-change.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-file-change.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-file-change.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-impl-step-completion.d.ts +4 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-impl-step-completion.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-impl-step-completion.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-impl-step-completion.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-resolution.d.ts +4 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-resolution.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-resolution.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-resolution.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-test-result.d.ts +4 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-test-result.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-test-result.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session-test-result.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session.d.ts +4 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/work-session.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/working-context.d.ts +43 -0
- package/node_modules/@specforge/session-types/dist/runtime/working-context.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/working-context.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/working-context.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/write-plan.d.ts +146 -0
- package/node_modules/@specforge/session-types/dist/runtime/write-plan.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/runtime/write-plan.js +2 -0
- package/node_modules/@specforge/session-types/dist/runtime/write-plan.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/discovery.d.ts +76 -0
- package/node_modules/@specforge/session-types/dist/schema/discovery.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/discovery.js +42 -0
- package/node_modules/@specforge/session-types/dist/schema/discovery.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/implementation-record-event.d.ts +48 -0
- package/node_modules/@specforge/session-types/dist/schema/implementation-record-event.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/implementation-record-event.js +28 -0
- package/node_modules/@specforge/session-types/dist/schema/implementation-record-event.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/implementation-session.d.ts +37 -0
- package/node_modules/@specforge/session-types/dist/schema/implementation-session.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/implementation-session.js +24 -0
- package/node_modules/@specforge/session-types/dist/schema/implementation-session.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/index.d.ts +12 -0
- package/node_modules/@specforge/session-types/dist/schema/index.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/index.js +12 -0
- package/node_modules/@specforge/session-types/dist/schema/index.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/parsed-git-evidence.d.ts +74 -0
- package/node_modules/@specforge/session-types/dist/schema/parsed-git-evidence.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/parsed-git-evidence.js +31 -0
- package/node_modules/@specforge/session-types/dist/schema/parsed-git-evidence.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-acceptance-check.d.ts +27 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-acceptance-check.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-acceptance-check.js +11 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-acceptance-check.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-action.d.ts +94 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-action.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-action.js +76 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-action.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-file-change.d.ts +42 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-file-change.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-file-change.js +25 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-file-change.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-impl-step-completion.d.ts +27 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-impl-step-completion.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-impl-step-completion.js +11 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-impl-step-completion.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-resolution.d.ts +42 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-resolution.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-resolution.js +28 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-resolution.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-test-result.d.ts +72 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-test-result.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-test-result.js +43 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session-test-result.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session.d.ts +203 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session.js +86 -0
- package/node_modules/@specforge/session-types/dist/schema/work-session.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/config-store-interface.d.ts +17 -0
- package/node_modules/@specforge/session-types/dist/stores/config-store-interface.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/config-store-interface.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/config-store-interface.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/discovery-store.d.ts +31 -0
- package/node_modules/@specforge/session-types/dist/stores/discovery-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/discovery-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/discovery-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-record-event-store.d.ts +19 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-record-event-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-record-event-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-record-event-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-session-aggregate-store.d.ts +16 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-session-aggregate-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-session-aggregate-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-session-aggregate-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-session-store.d.ts +28 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-session-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-session-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/implementation-session-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-entity-score-datapoint-store.d.ts +12 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-entity-score-datapoint-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-entity-score-datapoint-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-entity-score-datapoint-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-phase-transition-store.d.ts +10 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-phase-transition-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-phase-transition-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-phase-transition-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-action-store.d.ts +13 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-action-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-action-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-action-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-aggregate-store.d.ts +10 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-aggregate-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-aggregate-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-aggregate-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-store.d.ts +20 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/planning-session-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-acceptance-check-store.d.ts +15 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-acceptance-check-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-acceptance-check-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-acceptance-check-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-action-store.d.ts +29 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-action-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-action-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-action-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-file-change-store.d.ts +9 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-file-change-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-file-change-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-file-change-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-impl-step-completion-store.d.ts +9 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-impl-step-completion-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-impl-step-completion-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-impl-step-completion-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-resolution-store.d.ts +10 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-resolution-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-resolution-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-resolution-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-store.d.ts +23 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-test-result-store.d.ts +8 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-test-result-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-test-result-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/work-session-test-result-store.js.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/working-context-store.d.ts +27 -0
- package/node_modules/@specforge/session-types/dist/stores/working-context-store.d.ts.map +1 -0
- package/node_modules/@specforge/session-types/dist/stores/working-context-store.js +2 -0
- package/node_modules/@specforge/session-types/dist/stores/working-context-store.js.map +1 -0
- package/node_modules/@specforge/session-types/package.json +43 -0
- package/node_modules/@specforge/spec-types/README.md +28 -0
- package/node_modules/@specforge/spec-types/dist/index.d.ts +4 -0
- package/node_modules/@specforge/spec-types/dist/index.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/index.js +6 -0
- package/node_modules/@specforge/spec-types/dist/index.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/json-schema/v1.1/openspec.schema.json +1129 -0
- package/node_modules/@specforge/spec-types/dist/openspec-schema.d.ts +4 -0
- package/node_modules/@specforge/spec-types/dist/openspec-schema.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/openspec-schema.js +77 -0
- package/node_modules/@specforge/spec-types/dist/openspec-schema.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/auxiliary.d.ts +14 -0
- package/node_modules/@specforge/spec-types/dist/runtime/auxiliary.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/auxiliary.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/auxiliary.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/blueprint.d.ts +7 -0
- package/node_modules/@specforge/spec-types/dist/runtime/blueprint.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/blueprint.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/blueprint.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/epic.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/epic.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/epic.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/epic.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/index.d.ts +7 -0
- package/node_modules/@specforge/spec-types/dist/runtime/index.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/index.js +7 -0
- package/node_modules/@specforge/spec-types/dist/runtime/index.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/api-contract.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/api-contract.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/api-contract.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/api-contract.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/goal.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/goal.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/goal.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/goal.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/guardrail.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/guardrail.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/guardrail.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/guardrail.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/index.d.ts +10 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/index.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/index.js +10 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/index.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/nfr.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/nfr.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/nfr.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/nfr.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/requirement.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/requirement.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/requirement.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/requirement.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/scope.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/scope.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/scope.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/scope.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/shared-pattern.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/shared-pattern.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/shared-pattern.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/shared-pattern.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/structure-item.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/structure-item.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/structure-item.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/structure-item.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/tech-stack.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/tech-stack.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/tech-stack.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/planning/tech-stack.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/specification.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/specification.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/specification.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/specification.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/ticket.d.ts +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/ticket.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/runtime/ticket.js +2 -0
- package/node_modules/@specforge/spec-types/dist/runtime/ticket.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/auxiliary.d.ts +266 -0
- package/node_modules/@specforge/spec-types/dist/schema/auxiliary.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/auxiliary.js +143 -0
- package/node_modules/@specforge/spec-types/dist/schema/auxiliary.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/blueprint.d.ts +47 -0
- package/node_modules/@specforge/spec-types/dist/schema/blueprint.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/blueprint.js +33 -0
- package/node_modules/@specforge/spec-types/dist/schema/blueprint.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/entity-field-schemas.d.ts +33 -0
- package/node_modules/@specforge/spec-types/dist/schema/entity-field-schemas.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/entity-field-schemas.js +181 -0
- package/node_modules/@specforge/spec-types/dist/schema/entity-field-schemas.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/epic.d.ts +955 -0
- package/node_modules/@specforge/spec-types/dist/schema/epic.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/epic.js +33 -0
- package/node_modules/@specforge/spec-types/dist/schema/epic.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/index.d.ts +12 -0
- package/node_modules/@specforge/spec-types/dist/schema/index.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/index.js +25 -0
- package/node_modules/@specforge/spec-types/dist/schema/index.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/node-verb-steps.d.ts +174 -0
- package/node_modules/@specforge/spec-types/dist/schema/node-verb-steps.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/node-verb-steps.js +317 -0
- package/node_modules/@specforge/spec-types/dist/schema/node-verb-steps.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/patterns.d.ts +274 -0
- package/node_modules/@specforge/spec-types/dist/schema/patterns.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/patterns.js +106 -0
- package/node_modules/@specforge/spec-types/dist/schema/patterns.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/api-contract.d.ts +44 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/api-contract.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/api-contract.js +13 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/api-contract.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/epic-category.d.ts +21 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/epic-category.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/epic-category.js +14 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/epic-category.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/goal.d.ts +27 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/goal.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/goal.js +13 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/goal.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/guardrail.d.ts +29 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/guardrail.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/guardrail.js +14 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/guardrail.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/index.d.ts +12 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/index.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/index.js +12 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/index.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/nfr.d.ts +27 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/nfr.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/nfr.js +15 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/nfr.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/planning-type.d.ts +17 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/planning-type.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/planning-type.js +16 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/planning-type.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/requirement.d.ts +63 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/requirement.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/requirement.js +16 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/requirement.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/scope.d.ts +19 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/scope.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/scope.js +8 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/scope.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/shared-pattern.d.ts +51 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/shared-pattern.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/shared-pattern.js +16 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/shared-pattern.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/structure-item.d.ts +19 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/structure-item.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/structure-item.js +8 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/structure-item.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/tech-stack.d.ts +27 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/tech-stack.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/tech-stack.js +14 -0
- package/node_modules/@specforge/spec-types/dist/schema/planning/tech-stack.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/specification.d.ts +1839 -0
- package/node_modules/@specforge/spec-types/dist/schema/specification.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/specification.js +43 -0
- package/node_modules/@specforge/spec-types/dist/schema/specification.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/step-link-coverage.d.ts +58 -0
- package/node_modules/@specforge/spec-types/dist/schema/step-link-coverage.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/step-link-coverage.js +73 -0
- package/node_modules/@specforge/spec-types/dist/schema/step-link-coverage.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/step-link-ids.d.ts +71 -0
- package/node_modules/@specforge/spec-types/dist/schema/step-link-ids.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/step-link-ids.js +96 -0
- package/node_modules/@specforge/spec-types/dist/schema/step-link-ids.js.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/ticket.d.ts +444 -0
- package/node_modules/@specforge/spec-types/dist/schema/ticket.d.ts.map +1 -0
- package/node_modules/@specforge/spec-types/dist/schema/ticket.js +49 -0
- package/node_modules/@specforge/spec-types/dist/schema/ticket.js.map +1 -0
- package/node_modules/@specforge/spec-types/package.json +41 -0
- package/package.json +40 -25
- package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +135 -51
- package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +124 -83
- package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +247 -163
- package/src/cli/templates/agents/content/core/sfag-work-resolver.ts +211 -0
- package/src/cli/templates/agents/index.ts +2 -0
- package/src/cli/templates/content/sf-commit.ts +2 -2
- package/src/cli/templates/content/sf-reset.ts +45 -28
- package/src/cli/templates/skills/specforge-orchestrator.md +15 -10
- package/src/cli/templates/skills/specforge-worker.md +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/prompt-generator.ts"],"sourcesContent":["/**\n * Workspace-Scoped Worker Prompt Generator\n *\n * Generates context-rich prompts for Agent Teams workers and validators.\n * Follows the Worker Initial Prompt and Validation Watcher Prompt templates\n * from the design doc.\n *\n * Prompts are kept concise (~2000-4000 tokens) for worker context efficiency.\n * Sections with no data are omitted entirely.\n */\n\n// ---------------------------------------------------------------------------\n// Input types\n// ---------------------------------------------------------------------------\n\nexport interface TicketContext {\n id: string;\n ticketNumber: number;\n title: string;\n description: string;\n implementation?: {\n steps?: string[];\n filesToCreate?: string[];\n filesToModify?: string[];\n } | null;\n acceptanceCriteria?: Array<{ description: string }> | null;\n technicalDetails?: Record<string, unknown> | null;\n}\n\nexport interface EpicContext {\n title: string;\n objective?: string | null;\n}\n\nexport interface SpecContext {\n title: string;\n techStack?: string[] | null;\n codeStandards?: string | null;\n}\n\nexport interface WorkspaceContext {\n /** Relative path from project root (e.g., \"apps/web\") */\n path: string;\n /** Detected framework (e.g., \"Next.js\", \"Express\") */\n framework?: string | null;\n /** Package name from package.json */\n name?: string | null;\n /** Key dependency names */\n dependencies?: string[] | null;\n}\n\nexport interface ConventionsContext {\n /** Free-form conventions text (e.g., from CLAUDE.md) */\n content?: string | null;\n}\n\nexport interface ValidationCommands {\n test?: string | null;\n lint?: string | null;\n typeCheck?: string | null;\n build?: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Worker prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a context-rich prompt for an Agent Teams worker.\n *\n * Omits entire sections when the corresponding data is missing.\n */\nexport function generateWorkerPrompt(\n ticket: TicketContext,\n epic: EpicContext,\n spec: SpecContext,\n workspace?: WorkspaceContext | null,\n conventions?: ConventionsContext | null,\n): string {\n const sections: string[] = [];\n\n // Header\n sections.push(\n `# SpecForge Worker: Implementing E-T${ticket.ticketNumber}`,\n '',\n `**Epic:** ${epic.title}`,\n `**Spec:** ${spec.title}`,\n '',\n );\n\n // Ticket details\n sections.push(`## Ticket: ${ticket.title}`, '');\n sections.push('### Description', ticket.description, '');\n\n // Implementation guide\n const impl = ticket.implementation;\n if (impl) {\n const hasSteps = impl.steps && impl.steps.length > 0;\n const hasCreate = impl.filesToCreate && impl.filesToCreate.length > 0;\n const hasModify = impl.filesToModify && impl.filesToModify.length > 0;\n\n if (hasSteps || hasCreate || hasModify) {\n sections.push('### Implementation Guide', '');\n\n if (hasSteps) {\n sections.push(\n ...impl.steps!.map((step, i) => `${i + 1}. ${step}`),\n '',\n );\n }\n\n if (hasCreate) {\n sections.push('**Files to create:**');\n sections.push(...impl.filesToCreate!.map(f => `- \\`${f}\\``), '');\n }\n\n if (hasModify) {\n sections.push('**Files to modify:**');\n sections.push(...impl.filesToModify!.map(f => `- \\`${f}\\``), '');\n }\n }\n }\n\n // Acceptance criteria\n if (ticket.acceptanceCriteria && ticket.acceptanceCriteria.length > 0) {\n sections.push('### Acceptance Criteria');\n sections.push(\n ...ticket.acceptanceCriteria.map(ac => `- [ ] ${ac.description}`),\n '',\n );\n }\n\n // Technical details\n if (ticket.technicalDetails && Object.keys(ticket.technicalDetails).length > 0) {\n sections.push('### Technical Details');\n sections.push(formatTechnicalDetails(ticket.technicalDetails), '');\n }\n\n // Tech stack from spec\n if (spec.techStack && spec.techStack.length > 0) {\n sections.push('### Tech Stack');\n sections.push(spec.techStack.join(', '), '');\n }\n\n // Workspace info (monorepo)\n if (workspace) {\n sections.push('### Workspace');\n sections.push(`- **Path:** ${workspace.path}`);\n if (workspace.name) {\n sections.push(`- **Package:** ${workspace.name}`);\n }\n if (workspace.framework) {\n sections.push(`- **Framework:** ${workspace.framework}`);\n }\n if (workspace.dependencies && workspace.dependencies.length > 0) {\n sections.push(`- **Key dependencies:** ${workspace.dependencies.join(', ')}`);\n }\n sections.push('');\n }\n\n // Conventions\n if (conventions?.content) {\n sections.push('### Conventions', conventions.content, '');\n }\n\n // Code standards from spec\n if (spec.codeStandards) {\n sections.push('### Code Standards', spec.codeStandards, '');\n }\n\n // Rules\n sections.push('### Rules');\n const rules = [\n 'Only modify files listed in the implementation guide unless necessary',\n \"Follow the project's coding conventions\",\n 'Write tests for new functionality',\n 'BEFORE starting implementation: call `start_work_session` with the ticketId to mark it active',\n 'AFTER completing implementation and tests: call `complete_work_session` with ticketId, summary of work done, filesCreated, filesModified, filesDeleted, and validated: true',\n 'If blocked: call `pause_work_session` to pause work and notify the team lead',\n 'Report any blockers or discoveries to team-lead immediately',\n ];\n\n if (workspace) {\n rules.unshift(\n `Only modify files within \\`${workspace.path}/\\` unless the ticket explicitly requires cross-workspace changes`,\n );\n }\n\n sections.push(...rules.map(r => `- ${r}`), '');\n\n return sections.join('\\n').trimEnd();\n}\n\n// ---------------------------------------------------------------------------\n// Validator prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a prompt for an Agent Teams validation watcher.\n */\nexport function generateValidatorPrompt(\n epic: EpicContext,\n validationCommands?: ValidationCommands | null,\n workspace?: WorkspaceContext | null,\n): string {\n const sections: string[] = [];\n\n sections.push(`# SpecForge Validator: ${epic.title}`, '');\n\n sections.push('## Your Role');\n sections.push(\n 'You are the validation watcher for this epic.',\n 'After each teammate reports a ticket as complete:',\n '',\n );\n\n // Validation commands\n const steps: string[] = [];\n steps.push('1. Pull their changes');\n\n if (validationCommands?.test) {\n steps.push(`2. Run tests: \\`${validationCommands.test}\\``);\n }\n if (validationCommands?.lint) {\n steps.push(`${steps.length + 1}. Run lint: \\`${validationCommands.lint}\\``);\n }\n if (validationCommands?.typeCheck) {\n steps.push(`${steps.length + 1}. Run type check: \\`${validationCommands.typeCheck}\\``);\n }\n if (validationCommands?.build) {\n steps.push(`${steps.length + 1}. Run build: \\`${validationCommands.build}\\``);\n }\n\n steps.push(`${steps.length + 1}. Report results to team-lead`);\n sections.push(...steps, '');\n\n // Workspace scope\n if (workspace) {\n sections.push('## Workspace');\n sections.push(`- **Path:** ${workspace.path}`);\n if (workspace.framework) {\n sections.push(`- **Framework:** ${workspace.framework}`);\n }\n sections.push('');\n }\n\n // Rules\n sections.push('## Rules');\n sections.push(\n '- Do NOT modify code yourself',\n '- If tests fail, message the worker with specific errors and file:line references',\n '- If all checks pass, confirm to team-lead',\n '- Run validations in the correct workspace directory',\n '',\n );\n\n // Reporting format\n sections.push('## Reporting Format');\n sections.push(\n '**On success:**',\n '> Ticket E-T{n} validated. All checks passed.',\n '',\n '**On failure:**',\n '> Ticket E-T{n} failed validation:',\n '> - {check}: {error message} ({file}:{line})',\n '',\n );\n\n return sections.join('\\n').trimEnd();\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format technical details as a readable key-value list.\n * Handles nested objects and arrays.\n */\nfunction formatTechnicalDetails(details: Record<string, unknown>): string {\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(details)) {\n if (value === null || value === undefined) continue;\n\n const label = key.replace(/([A-Z])/g, ' $1').replace(/^./, s => s.toUpperCase());\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n lines.push(`- **${label}:** ${value.join(', ')}`);\n }\n } else if (typeof value === 'object') {\n lines.push(`- **${label}:** ${JSON.stringify(value)}`);\n } else {\n lines.push(`- **${label}:** ${String(value)}`);\n }\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/prompt-generator.ts"],"sourcesContent":["/**\n * Workspace-Scoped Worker Prompt Generator\n *\n * Generates context-rich prompts for Agent Teams workers and validators in the\n * AUTONOMOUS MULTI-AGENT work model (M23.5):\n *\n * - A worker is an autonomous sfag-ticket-implementer. It runs the whole work\n * lifecycle for its ticket — start_work_session (git-clean precondition) →\n * action_work_session (record steps/tests/files/AC through the assay) →\n * complete_work_session — with no human in the loop. N concurrent workers\n * open N WorkSessions under ONE spec-wide ImplementationSession (the first\n * SWS creates it, first-write-wins).\n * - Blockers are RECORDED via create_discovery (blocking: true) — that IS the\n * block; the worker moves on. Resolution is the human's resolve_discovery\n * (web app) plus the sfag-work-resolver agent. There is no pause/reset verb.\n * - The validator is an out-of-band build/test gate — it does NOT drive the\n * work lifecycle and does NOT review/dismiss work (the review lifecycle is\n * dormant).\n *\n * Prompts are kept concise (~2000-4000 tokens) for worker context efficiency.\n * Sections with no data are omitted entirely.\n */\n\n// ---------------------------------------------------------------------------\n// Input types\n// ---------------------------------------------------------------------------\n\nexport interface TicketContext {\n id: string;\n ticketNumber: number;\n title: string;\n description: string;\n implementation?: {\n steps?: string[];\n filesToCreate?: string[];\n filesToModify?: string[];\n } | null;\n acceptanceCriteria?: Array<{ description: string }> | null;\n technicalDetails?: Record<string, unknown> | null;\n}\n\nexport interface EpicContext {\n title: string;\n objective?: string | null;\n}\n\nexport interface SpecContext {\n title: string;\n techStack?: string[] | null;\n codeStandards?: string | null;\n}\n\nexport interface WorkspaceContext {\n /** Relative path from project root (e.g., \"apps/web\") */\n path: string;\n /** Detected framework (e.g., \"Next.js\", \"Express\") */\n framework?: string | null;\n /** Package name from package.json */\n name?: string | null;\n /** Key dependency names */\n dependencies?: string[] | null;\n}\n\nexport interface ConventionsContext {\n /** Free-form conventions text (e.g., from CLAUDE.md) */\n content?: string | null;\n}\n\nexport interface ValidationCommands {\n test?: string | null;\n lint?: string | null;\n typeCheck?: string | null;\n build?: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Worker prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a context-rich prompt for an Agent Teams worker.\n *\n * Omits entire sections when the corresponding data is missing.\n */\nexport function generateWorkerPrompt(\n ticket: TicketContext,\n epic: EpicContext,\n spec: SpecContext,\n workspace?: WorkspaceContext | null,\n conventions?: ConventionsContext | null,\n): string {\n const sections: string[] = [];\n\n // Header\n sections.push(\n `# SpecForge Worker: Implementing E-T${ticket.ticketNumber}`,\n '',\n `**Epic:** ${epic.title}`,\n `**Spec:** ${spec.title}`,\n '',\n );\n\n // Ticket details\n sections.push(`## Ticket: ${ticket.title}`, '');\n sections.push('### Description', ticket.description, '');\n\n // Implementation guide\n const impl = ticket.implementation;\n if (impl) {\n const hasSteps = impl.steps && impl.steps.length > 0;\n const hasCreate = impl.filesToCreate && impl.filesToCreate.length > 0;\n const hasModify = impl.filesToModify && impl.filesToModify.length > 0;\n\n if (hasSteps || hasCreate || hasModify) {\n sections.push('### Implementation Guide', '');\n\n if (hasSteps) {\n sections.push(\n ...impl.steps!.map((step, i) => `${i + 1}. ${step}`),\n '',\n );\n }\n\n if (hasCreate) {\n sections.push('**Files to create:**');\n sections.push(...impl.filesToCreate!.map(f => `- \\`${f}\\``), '');\n }\n\n if (hasModify) {\n sections.push('**Files to modify:**');\n sections.push(...impl.filesToModify!.map(f => `- \\`${f}\\``), '');\n }\n }\n }\n\n // Acceptance criteria\n if (ticket.acceptanceCriteria && ticket.acceptanceCriteria.length > 0) {\n sections.push('### Acceptance Criteria');\n sections.push(\n ...ticket.acceptanceCriteria.map(ac => `- [ ] ${ac.description}`),\n '',\n );\n }\n\n // Technical details\n if (ticket.technicalDetails && Object.keys(ticket.technicalDetails).length > 0) {\n sections.push('### Technical Details');\n sections.push(formatTechnicalDetails(ticket.technicalDetails), '');\n }\n\n // Tech stack from spec\n if (spec.techStack && spec.techStack.length > 0) {\n sections.push('### Tech Stack');\n sections.push(spec.techStack.join(', '), '');\n }\n\n // Workspace info (monorepo)\n if (workspace) {\n sections.push('### Workspace');\n sections.push(`- **Path:** ${workspace.path}`);\n if (workspace.name) {\n sections.push(`- **Package:** ${workspace.name}`);\n }\n if (workspace.framework) {\n sections.push(`- **Framework:** ${workspace.framework}`);\n }\n if (workspace.dependencies && workspace.dependencies.length > 0) {\n sections.push(`- **Key dependencies:** ${workspace.dependencies.join(', ')}`);\n }\n sections.push('');\n }\n\n // Conventions\n if (conventions?.content) {\n sections.push('### Conventions', conventions.content, '');\n }\n\n // Code standards from spec\n if (spec.codeStandards) {\n sections.push('### Code Standards', spec.codeStandards, '');\n }\n\n // Rules — the autonomous work lifecycle (SWS → AWS → CWS)\n sections.push('### Rules');\n const rules = [\n 'Only modify files listed in the implementation guide unless necessary',\n \"Follow the project's coding conventions\",\n 'Write tests for new functionality',\n 'BEFORE starting: ensure the worktree is clean (commit or stash prior work), then call `start_work_session` with the ticketId — a dirty worktree denies the session (`git_dirty`). SWS flips the ticket `ready → active`, opens your WorkSession under the spec-wide ImplementationSession, and returns your full orientation',\n 'DURING work: record every dimension with `action_work_session` in the assay order — Implementation steps → Tests → Files → Acceptance criteria (mark_implementation_step_completion, record_test_result, record_file_change, mark_acceptance_check); justify any skipped test or divergent file so coherence holds',\n 'AFTER the code, tests, files, and acceptance criteria are recorded AND your work is committed: call `complete_work_session` with the ticketId and a summary of the work done. CWS runs the completion gates and finalizes the ticket `active → done`',\n 'If blocked: record it with `create_discovery` (`blocking: true`) — that IS the block (the ticket → blocked, your session pauses). Do NOT wait and do NOT unblock it yourself; move on to the next ready ticket',\n 'Report any blockers or discoveries to team-lead immediately; the human + sfag-work-resolver resolve them (`resolve_discovery` in the web app). There is no pause/reset verb and no clear_ticket_block',\n ];\n\n if (workspace) {\n rules.unshift(\n `Only modify files within \\`${workspace.path}/\\` unless the ticket explicitly requires cross-workspace changes`,\n );\n }\n\n sections.push(...rules.map(r => `- ${r}`), '');\n\n return sections.join('\\n').trimEnd();\n}\n\n// ---------------------------------------------------------------------------\n// Validator prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a prompt for an Agent Teams validation watcher.\n */\nexport function generateValidatorPrompt(\n epic: EpicContext,\n validationCommands?: ValidationCommands | null,\n workspace?: WorkspaceContext | null,\n): string {\n const sections: string[] = [];\n\n sections.push(`# SpecForge Validator: ${epic.title}`, '');\n\n sections.push('## Your Role');\n sections.push(\n 'You are the validation watcher for this epic in the autonomous multi-agent work model.',\n 'Workers implement tickets independently — each opens its own WorkSession, records',\n 'steps/tests/files/acceptance criteria through the assay, and finalizes with',\n 'complete_work_session. You are an out-of-band verification gate: you do NOT drive the',\n 'work lifecycle verbs and you do NOT review or dismiss work (the review lifecycle is',\n 'dormant). After a worker commits a ticket and completes its work session:',\n '',\n );\n\n // Validation commands\n const steps: string[] = [];\n steps.push('1. Pull their changes');\n\n if (validationCommands?.test) {\n steps.push(`2. Run tests: \\`${validationCommands.test}\\``);\n }\n if (validationCommands?.lint) {\n steps.push(`${steps.length + 1}. Run lint: \\`${validationCommands.lint}\\``);\n }\n if (validationCommands?.typeCheck) {\n steps.push(`${steps.length + 1}. Run type check: \\`${validationCommands.typeCheck}\\``);\n }\n if (validationCommands?.build) {\n steps.push(`${steps.length + 1}. Run build: \\`${validationCommands.build}\\``);\n }\n\n steps.push(`${steps.length + 1}. Report results to team-lead`);\n sections.push(...steps, '');\n\n // Workspace scope\n if (workspace) {\n sections.push('## Workspace');\n sections.push(`- **Path:** ${workspace.path}`);\n if (workspace.framework) {\n sections.push(`- **Framework:** ${workspace.framework}`);\n }\n sections.push('');\n }\n\n // Rules\n sections.push('## Rules');\n sections.push(\n '- Do NOT modify code yourself',\n '- Do NOT call the work lifecycle verbs (start/action/complete_work_session) — that is the worker',\n '- Do NOT review, approve, or dismiss work — the review lifecycle is dormant; you only run checks and report',\n '- If tests fail, message the worker with specific errors and file:line references',\n '- If all checks pass, confirm to team-lead',\n '- If you find a genuine cross-ticket blocker, flag it to team-lead so it goes to sfag-work-resolver — do not fix it yourself',\n '- Run validations in the correct workspace directory',\n '',\n );\n\n // Reporting format\n sections.push('## Reporting Format');\n sections.push(\n '**On success:**',\n '> Ticket E-T{n} validated. All checks passed.',\n '',\n '**On failure:**',\n '> Ticket E-T{n} failed validation:',\n '> - {check}: {error message} ({file}:{line})',\n '',\n );\n\n return sections.join('\\n').trimEnd();\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format technical details as a readable key-value list.\n * Handles nested objects and arrays.\n */\nfunction formatTechnicalDetails(details: Record<string, unknown>): string {\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(details)) {\n if (value === null || value === undefined) continue;\n\n const label = key.replace(/([A-Z])/g, ' $1').replace(/^./, s => s.toUpperCase());\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n lines.push(`- **${label}:** ${value.join(', ')}`);\n }\n } else if (typeof value === 'object') {\n lines.push(`- **${label}:** ${JSON.stringify(value)}`);\n } else {\n lines.push(`- **${label}:** ${String(value)}`);\n }\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":[]}
|
|
@@ -82,7 +82,7 @@ const CREATION_WORKFLOW = {
|
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
84
|
step: 7,
|
|
85
|
-
name: "
|
|
85
|
+
name: "create_dependencies",
|
|
86
86
|
description: "Link ticket to its dependencies",
|
|
87
87
|
tools: ["dependency.add"],
|
|
88
88
|
tips: [
|
|
@@ -344,7 +344,7 @@ const REVIEW_WORKFLOW = {
|
|
|
344
344
|
},
|
|
345
345
|
{
|
|
346
346
|
step: 6,
|
|
347
|
-
name: "
|
|
347
|
+
name: "ticket_criteria_actions",
|
|
348
348
|
description: "Add findings to ticket notes or update acceptance criteria",
|
|
349
349
|
tools: ["ticket.update"],
|
|
350
350
|
tips: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/workflow-definitions.ts"],"sourcesContent":["// mcp/src/lib/workflow-definitions.ts\n/**\n * Workflow Definitions\n *\n * Contains the workflow definitions as data structures for guiding AI agents\n * through SpecForge workflows.\n */\n\nexport interface WorkflowStep {\n step: number;\n name: string;\n description: string;\n tools: string[];\n tips: string[];\n}\n\nexport interface WorkflowDefinition {\n name: string;\n description: string;\n philosophy: string[];\n steps: WorkflowStep[];\n antiPatterns: string[];\n}\n\nexport interface ReviewChecklistItem {\n name: string;\n description: string;\n}\n\nexport interface ReviewWorkflowDefinition extends WorkflowDefinition {\n checklist: ReviewChecklistItem[];\n}\n\nexport interface FinalizeWorkflowDefinition extends WorkflowDefinition {\n prerequisites: string[];\n}\n\nexport const CREATION_WORKFLOW: WorkflowDefinition = {\n name: 'creation',\n description: 'Create specifications, epics, and tickets with rich context',\n philosophy: [\n 'One entity at a time - never bulk create',\n 'More context = better AI implementation',\n 'When in doubt, ask the user',\n 'Invest in planning for first-run success',\n ],\n steps: [\n {\n step: 1,\n name: 'understand_requirements',\n description: 'Gather comprehensive requirements from user',\n tools: [],\n tips: [\n 'Ask about the problem being solved',\n 'Understand the target users',\n 'Clarify scope boundaries',\n 'Identify constraints and risks',\n ],\n },\n {\n step: 2,\n name: 'create_specification',\n description: 'Create specification with full context',\n tools: ['specification.create'],\n tips: [\n 'Include background and goals',\n 'Define guardrails (what NOT to do)',\n 'Set codeStandards for consistency',\n 'Add architecture overview',\n ],\n },\n {\n step: 3,\n name: 'plan_epics',\n description: 'Identify logical phases/groupings, discuss with user',\n tools: [],\n tips: [\n 'Break work into cohesive units',\n 'Consider dependencies between phases',\n 'Discuss timeline and priority with user',\n 'Keep epic count manageable (3-7 typical)',\n ],\n },\n {\n step: 4,\n name: 'create_epic',\n description: 'Create ONE epic with full context',\n tools: ['epic.create'],\n tips: [\n 'Define clear objective',\n 'Set scope boundaries',\n 'Include sharedPatterns for consistency',\n 'Add any epic-specific guardrails',\n ],\n },\n {\n step: 5,\n name: 'plan_tickets',\n description: 'Break epic into tickets, discuss dependencies with user',\n tools: [],\n tips: [\n 'Keep tickets small and focused',\n 'Identify clear acceptance criteria',\n 'Map out dependencies before creating',\n 'Discuss complexity with user',\n ],\n },\n {\n step: 6,\n name: 'create_ticket',\n description: 'Create ONE ticket with full details',\n tools: ['ticket.create'],\n tips: [\n 'Write detailed acceptanceCriteria',\n 'Include implementation hints',\n 'Add technicalDetails for complex logic',\n 'Specify files to modify if known',\n ],\n },\n {\n step: 7,\n name: 'add_dependencies',\n description: 'Link ticket to its dependencies',\n tools: ['dependency.add'],\n tips: [\n 'Only add true blocking dependencies',\n 'Avoid circular dependency chains',\n 'Keep dependency graph shallow when possible',\n ],\n },\n {\n step: 8,\n name: 'repeat',\n description: 'Continue tickets for current epic, then next epic',\n tools: [],\n tips: [\n 'Complete all tickets for an epic before moving on',\n 'Review epic completion before starting next',\n 'Adjust estimates as you learn more',\n ],\n },\n ],\n antiPatterns: [\n 'NEVER use bulk creation - always one at a time',\n 'NEVER skip asking user when details are unclear',\n 'NEVER create tickets without acceptance criteria',\n 'NEVER proceed without understanding dependencies',\n ],\n};\n\nexport const IMPLEMENTATION_WORKFLOW: WorkflowDefinition = {\n name: 'implementation',\n description: 'Implement tickets with session management',\n philosophy: [\n 'Always get full context before starting',\n 'Start session before making changes',\n 'Report progress during implementation',\n 'Validate before completing',\n ],\n steps: [\n {\n step: 1,\n name: 'get_context',\n description: 'Understand current working context',\n tools: ['context.working'],\n tips: [\n 'Check for active sessions',\n 'Note the current specification/epic focus',\n 'Understand what has already been done',\n ],\n },\n {\n step: 2,\n name: 'check_session',\n description: 'Check if spec has an open session',\n tools: ['context.working'],\n tips: [\n 'If session exists, continue with that session ID',\n 'If no session, will start new one after selecting ticket',\n 'Only ONE session per spec at a time',\n ],\n },\n {\n step: 3,\n name: 'find_work',\n description: 'Find tickets ready to work on',\n tools: ['workflow.next_actionable'],\n tips: [\n 'Focus on unblocked tickets',\n 'Consider priority and complexity',\n 'Check if any tickets are already in progress',\n ],\n },\n {\n step: 4,\n name: 'review_ticket',\n description: 'Get full implementation context',\n tools: ['context.implementation'],\n tips: [\n 'Use depth=full for rich context',\n 'Read all related patterns',\n 'Understand acceptance criteria',\n ],\n },\n {\n step: 5,\n name: 'clarify',\n description: 'Ask user about unclear requirements',\n tools: [],\n tips: [\n 'ASK THE USER before proceeding if unclear',\n 'Confirm test environment preference',\n 'Verify any assumptions',\n ],\n },\n {\n step: 6,\n name: 'start_session',\n description: 'Start or continue implementation session',\n tools: ['session.start'],\n tips: [\n 'Session locks the specification',\n 'Prevents concurrent work conflicts',\n 'Tracks your progress and changes',\n ],\n },\n {\n step: 7,\n name: 'implement',\n description: 'Do the work, report progress',\n tools: ['session.progress'],\n tips: [\n 'Follow the patterns from context',\n 'Report meaningful progress updates',\n 'Commit logically grouped changes',\n ],\n },\n {\n step: 8,\n name: 'validate',\n description: 'Run tests, lint, typecheck',\n tools: [],\n tips: [\n 'Run validation as specified in ticket',\n 'Fix any failing tests before completing',\n 'Ensure no regressions',\n ],\n },\n {\n step: 9,\n name: 'complete_ticket',\n description: 'Complete the ticket with summary',\n tools: ['session.complete'],\n tips: [\n 'Include summary of what was done',\n 'Report validation results',\n 'Note any follow-up items',\n ],\n },\n {\n step: 10,\n name: 'repeat_tickets',\n description: 'Continue with next ticket in epic',\n tools: ['workflow.next_actionable'],\n tips: [\n 'Check what tickets are now unblocked',\n 'Continue until epic is complete',\n 'Then proceed to epic completion',\n ],\n },\n {\n step: 11,\n name: 'epic_review',\n description: 'Review all changes made in epic',\n tools: ['epic.get'],\n tips: [\n 'Check all tickets are done',\n 'Review integration between tickets',\n 'Run full test suite for epic scope',\n 'Check for regressions',\n ],\n },\n {\n step: 12,\n name: 'epic_commit',\n description: 'Create commit for the epic',\n tools: [],\n tips: [\n 'Stage all changes from epic tickets',\n 'Write descriptive commit message referencing epic',\n 'Include ticket numbers in commit',\n ],\n },\n {\n step: 13,\n name: 'next_epic',\n description: 'Move to next epic',\n tools: ['epic.list', 'workflow.next_actionable'],\n tips: [\n 'Find the next epic to work on',\n 'Repeat from step 3 (find_work)',\n ],\n },\n ],\n antiPatterns: [\n 'NEVER implement without reading full ticket context',\n 'NEVER skip session.start - it tracks your work',\n 'NEVER complete without running validation',\n 'NEVER assume - ask the user if unclear',\n ],\n};\n\nexport const REVIEW_WORKFLOW: ReviewWorkflowDefinition = {\n name: 'review',\n description: 'Review tickets for completeness and consistency before implementation',\n philosophy: [\n 'Catch issues before implementation, not during',\n 'Consistency across all layers (DB, API, types)',\n 'Always ask about test environment preference',\n 'Document findings in ticket notes',\n ],\n checklist: [\n { name: 'missing_points', description: 'Acceptance criteria complete? Edge cases?' },\n { name: 'blind_spots', description: 'Security implications? What could go wrong?' },\n { name: 'auth_patterns', description: 'Token handling? Permission checks?' },\n { name: 'db_permissions', description: 'Row-level security? Audit requirements?' },\n { name: 'field_naming', description: 'DB (snake_case) <-> API (camelCase) <-> Types match?' },\n { name: 'documentation', description: 'API docs? README? Architecture docs need update?' },\n { name: 'test_environment', description: 'ASK USER: Sandbox or local mocks?' },\n ],\n steps: [\n {\n step: 1,\n name: 'select_ticket',\n description: 'Choose ticket to review',\n tools: ['ticket.get', 'workflow.next_actionable'],\n tips: [\n 'Review tickets before they are implemented',\n 'Can review all pending tickets in an epic',\n ],\n },\n {\n step: 2,\n name: 'load_context',\n description: 'Get full implementation context with patterns',\n tools: ['context.implementation'],\n tips: [\n 'Use depth=full for comprehensive review',\n 'Understand the broader context',\n ],\n },\n {\n step: 3,\n name: 'run_checklist',\n description: 'Go through each review point systematically',\n tools: [],\n tips: [\n 'Check each item in the review checklist',\n 'Be thorough - issues found now save time later',\n ],\n },\n {\n step: 4,\n name: 'identify_gaps',\n description: 'List missing items, inconsistencies, concerns',\n tools: [],\n tips: [\n 'Document all findings',\n 'Prioritize by impact',\n 'Note any blocking issues',\n ],\n },\n {\n step: 5,\n name: 'ask_user',\n description: 'Clarify test environment preference',\n tools: [],\n tips: [\n 'ALWAYS ask about test environment',\n 'Sandbox (real services) vs local mocks',\n 'Document the decision',\n ],\n },\n {\n step: 6,\n name: 'update_ticket',\n description: 'Add findings to ticket notes or update acceptance criteria',\n tools: ['ticket.update'],\n tips: [\n 'Add findings to notes field',\n 'Update acceptance criteria if needed',\n 'Mark items that need user input',\n ],\n },\n {\n step: 7,\n name: 'repeat',\n description: 'Review next ticket',\n tools: [],\n tips: [\n 'Continue until all relevant tickets reviewed',\n 'Consider reviewing related tickets together',\n ],\n },\n ],\n antiPatterns: [\n 'NEVER skip the review checklist',\n 'NEVER assume test environment - always ask user',\n 'NEVER ignore field naming mismatches',\n 'NEVER proceed if auth patterns are unclear',\n ],\n};\n\nexport const FINALIZE_WORKFLOW: FinalizeWorkflowDefinition = {\n name: 'finalize',\n description: 'Verify implementation, mark spec done, and create PR',\n philosophy: [\n 'All epics must be complete before finalizing',\n 'Run full validation suite before PR',\n 'PR description should tell the full story',\n 'End session cleanly after PR creation',\n ],\n prerequisites: [\n 'All epics in specification are done',\n 'All tickets are completed',\n 'All epic commits have been made',\n ],\n steps: [\n {\n step: 1,\n name: 'verify_completion',\n description: 'Check all epics and tickets are done',\n tools: ['specification.get', 'epic.list'],\n tips: [\n 'Verify all epics are marked done',\n 'Check all tickets are completed',\n 'Look for any pending dependencies',\n ],\n },\n {\n step: 2,\n name: 'full_validation',\n description: 'Run complete test suite',\n tools: [],\n tips: [\n 'Run: npm test (or equivalent)',\n 'Run: npm run lint',\n 'Run: npm run build',\n 'All must pass before proceeding',\n ],\n },\n {\n step: 3,\n name: 'integration_review',\n description: 'Review cross-epic integration',\n tools: [],\n tips: [\n 'Check APIs work together',\n 'Verify data flows correctly',\n 'Look for regressions from epic interactions',\n ],\n },\n {\n step: 4,\n name: 'documentation_check',\n description: 'Verify all docs are updated',\n tools: [],\n tips: [\n 'API documentation updated',\n 'README changes if needed',\n 'Architecture docs if changed',\n ],\n },\n {\n step: 5,\n name: 'final_commit',\n description: 'Commit any cleanup changes',\n tools: [],\n tips: [\n 'Stage final changes',\n 'Commit with spec reference',\n 'Only if cleanup needed',\n ],\n },\n {\n step: 6,\n name: 'mark_spec_done',\n description: 'Update specification status',\n tools: ['specification.update'],\n tips: [\n 'Set status to done',\n 'This marks the specification complete',\n ],\n },\n {\n step: 7,\n name: 'create_pr',\n description: 'Create pull request with full context',\n tools: ['link.pull_request'],\n tips: [\n 'Title references specification',\n 'Description includes all epics and key tickets',\n 'Link to specification for context',\n 'Request reviewers if configured',\n ],\n },\n ],\n antiPatterns: [\n 'NEVER create PR with failing tests',\n 'NEVER skip documentation check',\n 'NEVER forget to link PR to specification',\n ],\n};\n\n/**\n * Get a workflow definition by type\n */\nexport function getWorkflowDefinition(\n workflowType: string\n): WorkflowDefinition | ReviewWorkflowDefinition | FinalizeWorkflowDefinition | null {\n switch (workflowType) {\n case 'creation':\n return CREATION_WORKFLOW;\n case 'implementation':\n return IMPLEMENTATION_WORKFLOW;\n case 'review':\n return REVIEW_WORKFLOW;\n case 'finalize':\n return FINALIZE_WORKFLOW;\n default:\n return null;\n }\n}\n\nexport const WORKFLOW_TYPES = ['creation', 'implementation', 'review', 'finalize'] as const;\nexport type WorkflowType = (typeof WORKFLOW_TYPES)[number];\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/workflow-definitions.ts"],"sourcesContent":["// mcp/src/lib/workflow-definitions.ts\n/**\n * Workflow Definitions\n *\n * Contains the workflow definitions as data structures for guiding AI agents\n * through SpecForge workflows.\n */\n\nexport interface WorkflowStep {\n step: number;\n name: string;\n description: string;\n tools: string[];\n tips: string[];\n}\n\nexport interface WorkflowDefinition {\n name: string;\n description: string;\n philosophy: string[];\n steps: WorkflowStep[];\n antiPatterns: string[];\n}\n\nexport interface ReviewChecklistItem {\n name: string;\n description: string;\n}\n\nexport interface ReviewWorkflowDefinition extends WorkflowDefinition {\n checklist: ReviewChecklistItem[];\n}\n\nexport interface FinalizeWorkflowDefinition extends WorkflowDefinition {\n prerequisites: string[];\n}\n\nexport const CREATION_WORKFLOW: WorkflowDefinition = {\n name: 'creation',\n description: 'Create specifications, epics, and tickets with rich context',\n philosophy: [\n 'One entity at a time - never bulk create',\n 'More context = better AI implementation',\n 'When in doubt, ask the user',\n 'Invest in planning for first-run success',\n ],\n steps: [\n {\n step: 1,\n name: 'understand_requirements',\n description: 'Gather comprehensive requirements from user',\n tools: [],\n tips: [\n 'Ask about the problem being solved',\n 'Understand the target users',\n 'Clarify scope boundaries',\n 'Identify constraints and risks',\n ],\n },\n {\n step: 2,\n name: 'create_specification',\n description: 'Create specification with full context',\n tools: ['specification.create'],\n tips: [\n 'Include background and goals',\n 'Define guardrails (what NOT to do)',\n 'Set codeStandards for consistency',\n 'Add architecture overview',\n ],\n },\n {\n step: 3,\n name: 'plan_epics',\n description: 'Identify logical phases/groupings, discuss with user',\n tools: [],\n tips: [\n 'Break work into cohesive units',\n 'Consider dependencies between phases',\n 'Discuss timeline and priority with user',\n 'Keep epic count manageable (3-7 typical)',\n ],\n },\n {\n step: 4,\n name: 'create_epic',\n description: 'Create ONE epic with full context',\n tools: ['epic.create'],\n tips: [\n 'Define clear objective',\n 'Set scope boundaries',\n 'Include sharedPatterns for consistency',\n 'Add any epic-specific guardrails',\n ],\n },\n {\n step: 5,\n name: 'plan_tickets',\n description: 'Break epic into tickets, discuss dependencies with user',\n tools: [],\n tips: [\n 'Keep tickets small and focused',\n 'Identify clear acceptance criteria',\n 'Map out dependencies before creating',\n 'Discuss complexity with user',\n ],\n },\n {\n step: 6,\n name: 'create_ticket',\n description: 'Create ONE ticket with full details',\n tools: ['ticket.create'],\n tips: [\n 'Write detailed acceptanceCriteria',\n 'Include implementation hints',\n 'Add technicalDetails for complex logic',\n 'Specify files to modify if known',\n ],\n },\n {\n step: 7,\n name: 'create_dependencies',\n description: 'Link ticket to its dependencies',\n tools: ['dependency.add'],\n tips: [\n 'Only add true blocking dependencies',\n 'Avoid circular dependency chains',\n 'Keep dependency graph shallow when possible',\n ],\n },\n {\n step: 8,\n name: 'repeat',\n description: 'Continue tickets for current epic, then next epic',\n tools: [],\n tips: [\n 'Complete all tickets for an epic before moving on',\n 'Review epic completion before starting next',\n 'Adjust estimates as you learn more',\n ],\n },\n ],\n antiPatterns: [\n 'NEVER use bulk creation - always one at a time',\n 'NEVER skip asking user when details are unclear',\n 'NEVER create tickets without acceptance criteria',\n 'NEVER proceed without understanding dependencies',\n ],\n};\n\nexport const IMPLEMENTATION_WORKFLOW: WorkflowDefinition = {\n name: 'implementation',\n description: 'Implement tickets with session management',\n philosophy: [\n 'Always get full context before starting',\n 'Start session before making changes',\n 'Report progress during implementation',\n 'Validate before completing',\n ],\n steps: [\n {\n step: 1,\n name: 'get_context',\n description: 'Understand current working context',\n tools: ['context.working'],\n tips: [\n 'Check for active sessions',\n 'Note the current specification/epic focus',\n 'Understand what has already been done',\n ],\n },\n {\n step: 2,\n name: 'check_session',\n description: 'Check if spec has an open session',\n tools: ['context.working'],\n tips: [\n 'If session exists, continue with that session ID',\n 'If no session, will start new one after selecting ticket',\n 'Only ONE session per spec at a time',\n ],\n },\n {\n step: 3,\n name: 'find_work',\n description: 'Find tickets ready to work on',\n tools: ['workflow.next_actionable'],\n tips: [\n 'Focus on unblocked tickets',\n 'Consider priority and complexity',\n 'Check if any tickets are already in progress',\n ],\n },\n {\n step: 4,\n name: 'review_ticket',\n description: 'Get full implementation context',\n tools: ['context.implementation'],\n tips: [\n 'Use depth=full for rich context',\n 'Read all related patterns',\n 'Understand acceptance criteria',\n ],\n },\n {\n step: 5,\n name: 'clarify',\n description: 'Ask user about unclear requirements',\n tools: [],\n tips: [\n 'ASK THE USER before proceeding if unclear',\n 'Confirm test environment preference',\n 'Verify any assumptions',\n ],\n },\n {\n step: 6,\n name: 'start_session',\n description: 'Start or continue implementation session',\n tools: ['session.start'],\n tips: [\n 'Session locks the specification',\n 'Prevents concurrent work conflicts',\n 'Tracks your progress and changes',\n ],\n },\n {\n step: 7,\n name: 'implement',\n description: 'Do the work, report progress',\n tools: ['session.progress'],\n tips: [\n 'Follow the patterns from context',\n 'Report meaningful progress updates',\n 'Commit logically grouped changes',\n ],\n },\n {\n step: 8,\n name: 'validate',\n description: 'Run tests, lint, typecheck',\n tools: [],\n tips: [\n 'Run validation as specified in ticket',\n 'Fix any failing tests before completing',\n 'Ensure no regressions',\n ],\n },\n {\n step: 9,\n name: 'complete_ticket',\n description: 'Complete the ticket with summary',\n tools: ['session.complete'],\n tips: [\n 'Include summary of what was done',\n 'Report validation results',\n 'Note any follow-up items',\n ],\n },\n {\n step: 10,\n name: 'repeat_tickets',\n description: 'Continue with next ticket in epic',\n tools: ['workflow.next_actionable'],\n tips: [\n 'Check what tickets are now unblocked',\n 'Continue until epic is complete',\n 'Then proceed to epic completion',\n ],\n },\n {\n step: 11,\n name: 'epic_review',\n description: 'Review all changes made in epic',\n tools: ['epic.get'],\n tips: [\n 'Check all tickets are done',\n 'Review integration between tickets',\n 'Run full test suite for epic scope',\n 'Check for regressions',\n ],\n },\n {\n step: 12,\n name: 'epic_commit',\n description: 'Create commit for the epic',\n tools: [],\n tips: [\n 'Stage all changes from epic tickets',\n 'Write descriptive commit message referencing epic',\n 'Include ticket numbers in commit',\n ],\n },\n {\n step: 13,\n name: 'next_epic',\n description: 'Move to next epic',\n tools: ['epic.list', 'workflow.next_actionable'],\n tips: [\n 'Find the next epic to work on',\n 'Repeat from step 3 (find_work)',\n ],\n },\n ],\n antiPatterns: [\n 'NEVER implement without reading full ticket context',\n 'NEVER skip session.start - it tracks your work',\n 'NEVER complete without running validation',\n 'NEVER assume - ask the user if unclear',\n ],\n};\n\nexport const REVIEW_WORKFLOW: ReviewWorkflowDefinition = {\n name: 'review',\n description: 'Review tickets for completeness and consistency before implementation',\n philosophy: [\n 'Catch issues before implementation, not during',\n 'Consistency across all layers (DB, API, types)',\n 'Always ask about test environment preference',\n 'Document findings in ticket notes',\n ],\n checklist: [\n { name: 'missing_points', description: 'Acceptance criteria complete? Edge cases?' },\n { name: 'blind_spots', description: 'Security implications? What could go wrong?' },\n { name: 'auth_patterns', description: 'Token handling? Permission checks?' },\n { name: 'db_permissions', description: 'Row-level security? Audit requirements?' },\n { name: 'field_naming', description: 'DB (snake_case) <-> API (camelCase) <-> Types match?' },\n { name: 'documentation', description: 'API docs? README? Architecture docs need update?' },\n { name: 'test_environment', description: 'ASK USER: Sandbox or local mocks?' },\n ],\n steps: [\n {\n step: 1,\n name: 'select_ticket',\n description: 'Choose ticket to review',\n tools: ['ticket.get', 'workflow.next_actionable'],\n tips: [\n 'Review tickets before they are implemented',\n 'Can review all pending tickets in an epic',\n ],\n },\n {\n step: 2,\n name: 'load_context',\n description: 'Get full implementation context with patterns',\n tools: ['context.implementation'],\n tips: [\n 'Use depth=full for comprehensive review',\n 'Understand the broader context',\n ],\n },\n {\n step: 3,\n name: 'run_checklist',\n description: 'Go through each review point systematically',\n tools: [],\n tips: [\n 'Check each item in the review checklist',\n 'Be thorough - issues found now save time later',\n ],\n },\n {\n step: 4,\n name: 'identify_gaps',\n description: 'List missing items, inconsistencies, concerns',\n tools: [],\n tips: [\n 'Document all findings',\n 'Prioritize by impact',\n 'Note any blocking issues',\n ],\n },\n {\n step: 5,\n name: 'ask_user',\n description: 'Clarify test environment preference',\n tools: [],\n tips: [\n 'ALWAYS ask about test environment',\n 'Sandbox (real services) vs local mocks',\n 'Document the decision',\n ],\n },\n {\n step: 6,\n name: 'ticket_criteria_actions',\n description: 'Add findings to ticket notes or update acceptance criteria',\n tools: ['ticket.update'],\n tips: [\n 'Add findings to notes field',\n 'Update acceptance criteria if needed',\n 'Mark items that need user input',\n ],\n },\n {\n step: 7,\n name: 'repeat',\n description: 'Review next ticket',\n tools: [],\n tips: [\n 'Continue until all relevant tickets reviewed',\n 'Consider reviewing related tickets together',\n ],\n },\n ],\n antiPatterns: [\n 'NEVER skip the review checklist',\n 'NEVER assume test environment - always ask user',\n 'NEVER ignore field naming mismatches',\n 'NEVER proceed if auth patterns are unclear',\n ],\n};\n\nexport const FINALIZE_WORKFLOW: FinalizeWorkflowDefinition = {\n name: 'finalize',\n description: 'Verify implementation, mark spec done, and create PR',\n philosophy: [\n 'All epics must be complete before finalizing',\n 'Run full validation suite before PR',\n 'PR description should tell the full story',\n 'End session cleanly after PR creation',\n ],\n prerequisites: [\n 'All epics in specification are done',\n 'All tickets are completed',\n 'All epic commits have been made',\n ],\n steps: [\n {\n step: 1,\n name: 'verify_completion',\n description: 'Check all epics and tickets are done',\n tools: ['specification.get', 'epic.list'],\n tips: [\n 'Verify all epics are marked done',\n 'Check all tickets are completed',\n 'Look for any pending dependencies',\n ],\n },\n {\n step: 2,\n name: 'full_validation',\n description: 'Run complete test suite',\n tools: [],\n tips: [\n 'Run: npm test (or equivalent)',\n 'Run: npm run lint',\n 'Run: npm run build',\n 'All must pass before proceeding',\n ],\n },\n {\n step: 3,\n name: 'integration_review',\n description: 'Review cross-epic integration',\n tools: [],\n tips: [\n 'Check APIs work together',\n 'Verify data flows correctly',\n 'Look for regressions from epic interactions',\n ],\n },\n {\n step: 4,\n name: 'documentation_check',\n description: 'Verify all docs are updated',\n tools: [],\n tips: [\n 'API documentation updated',\n 'README changes if needed',\n 'Architecture docs if changed',\n ],\n },\n {\n step: 5,\n name: 'final_commit',\n description: 'Commit any cleanup changes',\n tools: [],\n tips: [\n 'Stage final changes',\n 'Commit with spec reference',\n 'Only if cleanup needed',\n ],\n },\n {\n step: 6,\n name: 'mark_spec_done',\n description: 'Update specification status',\n tools: ['specification.update'],\n tips: [\n 'Set status to done',\n 'This marks the specification complete',\n ],\n },\n {\n step: 7,\n name: 'create_pr',\n description: 'Create pull request with full context',\n tools: ['link.pull_request'],\n tips: [\n 'Title references specification',\n 'Description includes all epics and key tickets',\n 'Link to specification for context',\n 'Request reviewers if configured',\n ],\n },\n ],\n antiPatterns: [\n 'NEVER create PR with failing tests',\n 'NEVER skip documentation check',\n 'NEVER forget to link PR to specification',\n ],\n};\n\n/**\n * Get a workflow definition by type\n */\nexport function getWorkflowDefinition(\n workflowType: string\n): WorkflowDefinition | ReviewWorkflowDefinition | FinalizeWorkflowDefinition | null {\n switch (workflowType) {\n case 'creation':\n return CREATION_WORKFLOW;\n case 'implementation':\n return IMPLEMENTATION_WORKFLOW;\n case 'review':\n return REVIEW_WORKFLOW;\n case 'finalize':\n return FINALIZE_WORKFLOW;\n default:\n return null;\n }\n}\n\nexport const WORKFLOW_TYPES = ['creation', 'implementation', 'review', 'finalize'] as const;\nexport type WorkflowType = (typeof WORKFLOW_TYPES)[number];\n"],"mappings":"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","names":[]}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAMnE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAY1D;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,YAAqB,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAgBhF;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAMnE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAY1D;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,YAAqB,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAgBhF;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CA0DrE;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B/D"}
|
package/dist/server.js
CHANGED
|
@@ -51,7 +51,8 @@ async function createServer(config) {
|
|
|
51
51
|
}
|
|
52
52
|
return { tools };
|
|
53
53
|
});
|
|
54
|
-
server.setRequestHandler(
|
|
54
|
+
const registerCallTool = server.setRequestHandler.bind(server);
|
|
55
|
+
registerCallTool(CallToolRequestSchema, async (request) => {
|
|
55
56
|
const { name, arguments: args } = request.params;
|
|
56
57
|
const argsRecord = args || {};
|
|
57
58
|
if (config.debug) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts"],"sourcesContent":["/**\n * SpecForge MCP Server\n *\n * MCP (Model Context Protocol) server implementation using stdio transport.\n * Provides tools for AI agents to interact with SpecForge projects.\n *\n * M9: the boot-time `set_working_context` mechanism was removed — that backend\n * op no longer exists. Project/spec/session identity is injected per-call from\n * `.specforge/config.json` by the tool handlers (M9.6b), and the agent reads\n * the M8 envelope (interpreted in `handleToolCall`), TOON-encoded on the wire.\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { ApiClient } from './client/api-client.js';\nimport { McpConfig } from './config/index.js';\nimport { getTools, handleToolCall } from './tools/index.js';\nimport { formatToon } from './lib/format.js';\nimport type { OutputFormat } from './cli/config/types.js';\n\n/** Encode an MCP result for the wire per the resolved `mcpOutputFormat`. */\nfunction encodeMcp(value: unknown, format: OutputFormat): string {\n return format === 'json' ? JSON.stringify(value, null, 2) : formatToon(value);\n}\n\n/**\n * Package version - should match package.json\n */\nconst VERSION = '1.0.0';\n\n/**\n * Dispatch a tool call and frame the result for the MCP wire.\n *\n * The wire encoding follows the resolved `mcpOutputFormat` (M9.6c) — TOON by\n * default, JSON when the project/global/env config selects it — on both the\n * success and error paths. Exposed for direct testing without spinning up the\n * full MCP transport.\n */\nexport async function dispatchToolCall(\n apiClient: ApiClient,\n toolName: string,\n args: Record<string, unknown>,\n debug: boolean,\n format: OutputFormat = 'toon'\n): Promise<{ content: Array<{ type: 'text'; text: string }>; isError?: boolean }> {\n try {\n const result = await handleToolCall(apiClient, toolName, args, debug);\n return {\n content: [{ type: 'text', text: encodeMcp(result, format) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (debug) {\n console.error(`[DEBUG] Tool ${toolName} failed:`, message);\n }\n return {\n content: [{ type: 'text', text: encodeMcp({ error: message }, format) }],\n isError: true,\n };\n }\n}\n\n/**\n * Create and configure the MCP server\n *\n * @param config - Configuration for the server\n * @returns Configured MCP Server instance\n */\nexport async function createServer(config: McpConfig): Promise<Server> {\n const apiClient = new ApiClient(config);\n\n const server = new Server(\n {\n name: 'specforge',\n version: VERSION,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Handle ListTools requests - return available tools\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n if (config.debug) {\n console.error('[DEBUG] ListTools request received');\n }\n\n const tools = getTools();\n\n if (config.debug) {\n console.error(`[DEBUG] Returning ${tools.length} tools`);\n }\n\n return { tools };\n });\n\n // Handle CallTool requests - execute the requested tool\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const argsRecord = (args || {}) as Record<string, unknown>;\n\n if (config.debug) {\n console.error('[DEBUG] CallTool request:', {\n name,\n args: JSON.stringify(args),\n });\n }\n\n return dispatchToolCall(apiClient, name, argsRecord, config.debug, config.mcpOutputFormat ?? 'toon');\n });\n\n return server;\n}\n\n/**\n * Start the MCP server with stdio transport\n *\n * @param server - The MCP server instance\n */\nexport async function startServer(server: Server): Promise<void> {\n const transport = new StdioServerTransport();\n\n // Handle graceful shutdown\n const shutdown = async () => {\n console.error('[INFO] Shutting down MCP server...');\n await server.close();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n // Handle uncaught errors\n process.on('uncaughtException', (error) => {\n console.error('[ERROR] Uncaught exception:', error);\n process.exit(1);\n });\n\n process.on('unhandledRejection', (reason) => {\n console.error('[ERROR] Unhandled rejection:', reason);\n process.exit(1);\n });\n\n // Connect to transport\n await server.connect(transport);\n}\n"],"mappings":"AAYA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAE1B,SAAS,UAAU,sBAAsB;AACzC,SAAS,kBAAkB;AAI3B,SAAS,UAAU,OAAgB,QAA8B;AAC/D,SAAO,WAAW,SAAS,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,WAAW,KAAK;AAC9E;AAKA,MAAM,UAAU;AAUhB,eAAsB,iBACpB,WACA,UACA,MACA,OACA,SAAuB,QACyD;AAChF,MAAI;AACF,UAAM,SAAS,MAAM,eAAe,WAAW,UAAU,MAAM,KAAK;AACpE,WAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,QAAQ,MAAM,EAAE,CAAC;AAAA,IAC7D;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,QAAI,OAAO;AACT,cAAQ,MAAM,gBAAgB,QAAQ,YAAY,OAAO;AAAA,IAC3D;AACA,WAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,EAAE,OAAO,QAAQ,GAAG,MAAM,EAAE,CAAC;AAAA,MACvE,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAQA,eAAsB,aAAa,QAAoC;AACrE,QAAM,YAAY,IAAI,UAAU,MAAM;AAEtC,QAAM,SAAS,IAAI;AAAA,IACjB;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,cAAc;AAAA,QACZ,OAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAGA,SAAO,kBAAkB,wBAAwB,YAAY;AAC3D,QAAI,OAAO,OAAO;AAChB,cAAQ,MAAM,oCAAoC;AAAA,IACpD;AAEA,UAAM,QAAQ,SAAS;AAEvB,QAAI,OAAO,OAAO;AAChB,cAAQ,MAAM,qBAAqB,MAAM,MAAM,QAAQ;AAAA,IACzD;AAEA,WAAO,EAAE,MAAM;AAAA,EACjB,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/server.ts"],"sourcesContent":["/**\n * SpecForge MCP Server\n *\n * MCP (Model Context Protocol) server implementation using stdio transport.\n * Provides tools for AI agents to interact with SpecForge projects.\n *\n * M9: the boot-time `set_working_context` mechanism was removed — that backend\n * op no longer exists. Project/spec/session identity is injected per-call from\n * `.specforge/config.json` by the tool handlers (M9.6b), and the agent reads\n * the M8 envelope (interpreted in `handleToolCall`), TOON-encoded on the wire.\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { ApiClient } from './client/api-client.js';\nimport { McpConfig } from './config/index.js';\nimport { getTools, handleToolCall } from './tools/index.js';\nimport { formatToon } from './lib/format.js';\nimport type { OutputFormat } from './cli/config/types.js';\n\n/** Encode an MCP result for the wire per the resolved `mcpOutputFormat`. */\nfunction encodeMcp(value: unknown, format: OutputFormat): string {\n return format === 'json' ? JSON.stringify(value, null, 2) : formatToon(value);\n}\n\n/**\n * Package version - should match package.json\n */\nconst VERSION = '1.0.0';\n\n/**\n * Dispatch a tool call and frame the result for the MCP wire.\n *\n * The wire encoding follows the resolved `mcpOutputFormat` (M9.6c) — TOON by\n * default, JSON when the project/global/env config selects it — on both the\n * success and error paths. Exposed for direct testing without spinning up the\n * full MCP transport.\n */\nexport async function dispatchToolCall(\n apiClient: ApiClient,\n toolName: string,\n args: Record<string, unknown>,\n debug: boolean,\n format: OutputFormat = 'toon'\n): Promise<{ content: Array<{ type: 'text'; text: string }>; isError?: boolean }> {\n try {\n const result = await handleToolCall(apiClient, toolName, args, debug);\n return {\n content: [{ type: 'text', text: encodeMcp(result, format) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (debug) {\n console.error(`[DEBUG] Tool ${toolName} failed:`, message);\n }\n return {\n content: [{ type: 'text', text: encodeMcp({ error: message }, format) }],\n isError: true,\n };\n }\n}\n\n/**\n * Create and configure the MCP server\n *\n * @param config - Configuration for the server\n * @returns Configured MCP Server instance\n */\nexport async function createServer(config: McpConfig): Promise<Server> {\n const apiClient = new ApiClient(config);\n\n const server = new Server(\n {\n name: 'specforge',\n version: VERSION,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Handle ListTools requests - return available tools\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n if (config.debug) {\n console.error('[DEBUG] ListTools request received');\n }\n\n const tools = getTools();\n\n if (config.debug) {\n console.error(`[DEBUG] Returning ${tools.length} tools`);\n }\n\n return { tools };\n });\n\n // Handle CallTool requests - execute the requested tool.\n // M26: after the CLI re-pointed onto the zod-schema type packages\n // (spec-types/api-types/report-types), the SDK's GENERIC `setRequestHandler`\n // instantiation over the CallTool request/result zod schemas trips TS2589\n // (\"excessively deep\") during declaration emit (tsup passes; only\n // `tsc --emitDeclarationOnly` fails). Invoke it through a NON-generic signature so\n // tsc never instantiates the generic; the runtime call + validation are unchanged.\n type CallToolReq = { params: { name: string; arguments?: Record<string, unknown> } };\n type CallToolRes = { content: Array<{ type: 'text'; text: string }>; isError?: boolean };\n const registerCallTool = server.setRequestHandler.bind(server) as unknown as (\n schema: typeof CallToolRequestSchema,\n handler: (request: CallToolReq) => Promise<CallToolRes>,\n ) => void;\n registerCallTool(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const argsRecord = (args || {}) as Record<string, unknown>;\n\n if (config.debug) {\n console.error('[DEBUG] CallTool request:', {\n name,\n args: JSON.stringify(args),\n });\n }\n\n return dispatchToolCall(apiClient, name, argsRecord, config.debug, config.mcpOutputFormat ?? 'toon');\n });\n\n return server;\n}\n\n/**\n * Start the MCP server with stdio transport\n *\n * @param server - The MCP server instance\n */\nexport async function startServer(server: Server): Promise<void> {\n const transport = new StdioServerTransport();\n\n // Handle graceful shutdown\n const shutdown = async () => {\n console.error('[INFO] Shutting down MCP server...');\n await server.close();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n // Handle uncaught errors\n process.on('uncaughtException', (error) => {\n console.error('[ERROR] Uncaught exception:', error);\n process.exit(1);\n });\n\n process.on('unhandledRejection', (reason) => {\n console.error('[ERROR] Unhandled rejection:', reason);\n process.exit(1);\n });\n\n // Connect to transport\n await server.connect(transport);\n}\n"],"mappings":"AAYA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAE1B,SAAS,UAAU,sBAAsB;AACzC,SAAS,kBAAkB;AAI3B,SAAS,UAAU,OAAgB,QAA8B;AAC/D,SAAO,WAAW,SAAS,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,WAAW,KAAK;AAC9E;AAKA,MAAM,UAAU;AAUhB,eAAsB,iBACpB,WACA,UACA,MACA,OACA,SAAuB,QACyD;AAChF,MAAI;AACF,UAAM,SAAS,MAAM,eAAe,WAAW,UAAU,MAAM,KAAK;AACpE,WAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,QAAQ,MAAM,EAAE,CAAC;AAAA,IAC7D;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,QAAI,OAAO;AACT,cAAQ,MAAM,gBAAgB,QAAQ,YAAY,OAAO;AAAA,IAC3D;AACA,WAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,EAAE,OAAO,QAAQ,GAAG,MAAM,EAAE,CAAC;AAAA,MACvE,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAQA,eAAsB,aAAa,QAAoC;AACrE,QAAM,YAAY,IAAI,UAAU,MAAM;AAEtC,QAAM,SAAS,IAAI;AAAA,IACjB;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,cAAc;AAAA,QACZ,OAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAGA,SAAO,kBAAkB,wBAAwB,YAAY;AAC3D,QAAI,OAAO,OAAO;AAChB,cAAQ,MAAM,oCAAoC;AAAA,IACpD;AAEA,UAAM,QAAQ,SAAS;AAEvB,QAAI,OAAO,OAAO;AAChB,cAAQ,MAAM,qBAAqB,MAAM,MAAM,QAAQ;AAAA,IACzD;AAEA,WAAO,EAAE,MAAM;AAAA,EACjB,CAAC;AAWD,QAAM,mBAAmB,OAAO,kBAAkB,KAAK,MAAM;AAI7D,mBAAiB,uBAAuB,OAAO,YAAY;AACzD,UAAM,EAAE,MAAM,WAAW,KAAK,IAAI,QAAQ;AAC1C,UAAM,aAAc,QAAQ,CAAC;AAE7B,QAAI,OAAO,OAAO;AAChB,cAAQ,MAAM,6BAA6B;AAAA,QACzC;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B,CAAC;AAAA,IACH;AAEA,WAAO,iBAAiB,WAAW,MAAM,YAAY,OAAO,OAAO,OAAO,mBAAmB,MAAM;AAAA,EACrG,CAAC;AAED,SAAO;AACT;AAOA,eAAsB,YAAY,QAA+B;AAC/D,QAAM,YAAY,IAAI,qBAAqB;AAG3C,QAAM,WAAW,YAAY;AAC3B,YAAQ,MAAM,oCAAoC;AAClD,UAAM,OAAO,MAAM;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAG9B,UAAQ,GAAG,qBAAqB,CAAC,UAAU;AACzC,YAAQ,MAAM,+BAA+B,KAAK;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,UAAQ,GAAG,sBAAsB,CAAC,WAAW;AAC3C,YAAQ,MAAM,gCAAgC,MAAM;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAGD,QAAM,OAAO,QAAQ,SAAS;AAChC;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete-planning-double-call.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/complete-planning-double-call.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-existence-injection.test.d.ts","sourceRoot":"","sources":["../../../../src/tools/core/__tests__/file-existence-injection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-injection.test.d.ts","sourceRoot":"","sources":["../../../../src/tools/core/__tests__/git-injection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Runs a `git` sub-command; returns trimmed stdout, or `null` on any failure. */
|
|
2
|
+
export type GitRunner = (args: string[]) => string | null;
|
|
3
|
+
/** On-disk existence predicate (absolute path). Injectable for unit tests. */
|
|
4
|
+
export type FileExists = (absPath: string) => boolean;
|
|
5
|
+
/** Probes a set of repo-relative paths; returns the subset that exist. */
|
|
6
|
+
export type FileProbe = (paths: string[]) => string[];
|
|
7
|
+
/** Default runner: spawn `git`, return trimmed stdout, `null` on any failure. */
|
|
8
|
+
export declare const defaultGitRunner: GitRunner;
|
|
9
|
+
export interface FileProbeDeps {
|
|
10
|
+
/** git sub-command runner (defaults to a real, non-throwing `git` spawn). */
|
|
11
|
+
run?: GitRunner;
|
|
12
|
+
/** on-disk existence predicate (defaults to non-throwing `fs.existsSync`). */
|
|
13
|
+
exists?: FileExists;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the worktree root via `git rev-parse --show-toplevel`, then report the
|
|
17
|
+
* subset of `paths` that exist in the repo: on-disk (`fs.existsSync`, tracked OR
|
|
18
|
+
* untracked) ∪ tracked-but-not-on-disk (`git ls-files --error-unmatch`, the rare
|
|
19
|
+
* staged-delete case). Returns `[]` when not inside a worktree. Never throws.
|
|
20
|
+
*/
|
|
21
|
+
export declare function probeExistingFiles(paths: string[], deps?: FileProbeDeps): string[];
|
|
22
|
+
//# sourceMappingURL=file-existence-injection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-existence-injection.d.ts","sourceRoot":"","sources":["../../../src/tools/core/file-existence-injection.ts"],"names":[],"mappings":"AAiCA,kFAAkF;AAClF,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC;AAE1D,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;AAEtD,0EAA0E;AAC1E,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;AAEtD,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,EAAE,SAU9B,CAAC;AAWF,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,EAAE,CA4BtF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { isAbsolute, join } from "node:path";
|
|
4
|
+
const defaultGitRunner = (args) => {
|
|
5
|
+
try {
|
|
6
|
+
const out = execFileSync("git", args, {
|
|
7
|
+
encoding: "utf8",
|
|
8
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
9
|
+
});
|
|
10
|
+
return out.trim();
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const defaultFileExists = (absPath) => {
|
|
16
|
+
try {
|
|
17
|
+
return existsSync(absPath);
|
|
18
|
+
} catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
function probeExistingFiles(paths, deps = {}) {
|
|
23
|
+
try {
|
|
24
|
+
if (!Array.isArray(paths) || paths.length === 0) return [];
|
|
25
|
+
const run = deps.run ?? defaultGitRunner;
|
|
26
|
+
const exists = deps.exists ?? defaultFileExists;
|
|
27
|
+
const root = run(["rev-parse", "--show-toplevel"]);
|
|
28
|
+
if (root === null || root === "") return [];
|
|
29
|
+
const present = [];
|
|
30
|
+
for (const p of paths) {
|
|
31
|
+
if (typeof p !== "string" || p === "") continue;
|
|
32
|
+
const abs = isAbsolute(p) ? p : join(root, p);
|
|
33
|
+
if (exists(abs)) {
|
|
34
|
+
present.push(p);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const tracked = run(["ls-files", "--error-unmatch", "--", abs]);
|
|
38
|
+
if (tracked !== null && tracked !== "") present.push(p);
|
|
39
|
+
}
|
|
40
|
+
return present;
|
|
41
|
+
} catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
defaultGitRunner,
|
|
47
|
+
probeExistingFiles
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=file-existence-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/core/file-existence-injection.ts"],"sourcesContent":["/**\n * MCP-local file-existence injection (MB.10.5).\n *\n * The planning cross_validation gate's file-provenance model needs the real-repo\n * file set `E` (grep evidence) to resolve brownfield files a plan references but\n * no ticket creates, and to catch a `filesToBeCreated` path that ALREADY exists\n * (a modify mislabelled as create). Only the MCP-LOCAL — this CLI, running on the\n * agent's machine — can observe the worktree; the deployed Lambda has none.\n *\n * Mechanic (a REACTIVE double-call, mirroring the assay's `git-injection.ts`):\n * `complete_planning_session` first calls CPS with NO evidence. In\n * cross_validation the server replies `outcome: 'evidence_required'` carrying a\n * `grepRequest: { paths }` — the exact paths it cannot resolve spec-internally.\n * The CLI probes JUST those paths here and re-calls CPS with the existing subset\n * injected as `existingFiles` (pass-2, the committing verdict). From the agent's\n * view it stays ONE tool call.\n *\n * Trust / scope: the injected set is TRUSTED (the planning agent is cooperative,\n * unlike the assay's coherence-integrity concern) and the probe is SCOPED to\n * exactly `grepRequest.paths` — never a repo-wide scan. Paths are repo-relative\n * (as declared in the spec) and resolved against the worktree root.\n *\n * Degradation: outside a git worktree (or if `git` is unavailable) the probe\n * returns `[]`. The CLI then re-calls with `existingFiles: []` — the \"probed\"\n * marker is the PRESENCE of the field, not its contents — so pass-2 runs the\n * strict spec-internal verdict (`E = createdPaths`). A repo-less caller is never\n * blocked from completing; strict is deterministic + correct for greenfield. The\n * probe is NON-THROWING by construction.\n */\nimport { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { isAbsolute, join } from 'node:path';\n\n/** Runs a `git` sub-command; returns trimmed stdout, or `null` on any failure. */\nexport type GitRunner = (args: string[]) => string | null;\n\n/** On-disk existence predicate (absolute path). Injectable for unit tests. */\nexport type FileExists = (absPath: string) => boolean;\n\n/** Probes a set of repo-relative paths; returns the subset that exist. */\nexport type FileProbe = (paths: string[]) => string[];\n\n/** Default runner: spawn `git`, return trimmed stdout, `null` on any failure. */\nexport const defaultGitRunner: GitRunner = (args) => {\n try {\n const out = execFileSync('git', args, {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return out.trim();\n } catch {\n return null;\n }\n};\n\n/** Default on-disk check: non-throwing `fs.existsSync`. */\nconst defaultFileExists: FileExists = (absPath) => {\n try {\n return existsSync(absPath);\n } catch {\n return false;\n }\n};\n\nexport interface FileProbeDeps {\n /** git sub-command runner (defaults to a real, non-throwing `git` spawn). */\n run?: GitRunner;\n /** on-disk existence predicate (defaults to non-throwing `fs.existsSync`). */\n exists?: FileExists;\n}\n\n/**\n * Resolve the worktree root via `git rev-parse --show-toplevel`, then report the\n * subset of `paths` that exist in the repo: on-disk (`fs.existsSync`, tracked OR\n * untracked) ∪ tracked-but-not-on-disk (`git ls-files --error-unmatch`, the rare\n * staged-delete case). Returns `[]` when not inside a worktree. Never throws.\n */\nexport function probeExistingFiles(paths: string[], deps: FileProbeDeps = {}): string[] {\n try {\n if (!Array.isArray(paths) || paths.length === 0) return [];\n const run = deps.run ?? defaultGitRunner;\n const exists = deps.exists ?? defaultFileExists;\n\n const root = run(['rev-parse', '--show-toplevel']);\n if (root === null || root === '') return []; // not inside a git worktree\n\n const present: string[] = [];\n for (const p of paths) {\n if (typeof p !== 'string' || p === '') continue;\n const abs = isAbsolute(p) ? p : join(root, p);\n // Primary signal: on-disk (covers both tracked and brand-new untracked).\n if (exists(abs)) {\n present.push(p);\n continue;\n }\n // Secondary: tracked-but-not-on-disk (a staged delete). `--error-unmatch`\n // makes git exit non-zero (→ `null`) when the path is not tracked.\n const tracked = run(['ls-files', '--error-unmatch', '--', abs]);\n if (tracked !== null && tracked !== '') present.push(p);\n }\n return present;\n } catch {\n // Never throw inside a tool handler — degrade to \"no evidence\" (strict gate).\n return [];\n }\n}\n"],"mappings":"AA6BA,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,YAAY,YAAY;AAY1B,MAAM,mBAA8B,CAAC,SAAS;AACnD,MAAI;AACF,UAAM,MAAM,aAAa,OAAO,MAAM;AAAA,MACpC,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC;AACD,WAAO,IAAI,KAAK;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,MAAM,oBAAgC,CAAC,YAAY;AACjD,MAAI;AACF,WAAO,WAAW,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAeO,SAAS,mBAAmB,OAAiB,OAAsB,CAAC,GAAa;AACtF,MAAI;AACF,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG,QAAO,CAAC;AACzD,UAAM,MAAM,KAAK,OAAO;AACxB,UAAM,SAAS,KAAK,UAAU;AAE9B,UAAM,OAAO,IAAI,CAAC,aAAa,iBAAiB,CAAC;AACjD,QAAI,SAAS,QAAQ,SAAS,GAAI,QAAO,CAAC;AAE1C,UAAM,UAAoB,CAAC;AAC3B,eAAW,KAAK,OAAO;AACrB,UAAI,OAAO,MAAM,YAAY,MAAM,GAAI;AACvC,YAAM,MAAM,WAAW,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC;AAE5C,UAAI,OAAO,GAAG,GAAG;AACf,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF;AAGA,YAAM,UAAU,IAAI,CAAC,YAAY,mBAAmB,MAAM,GAAG,CAAC;AAC9D,UAAI,YAAY,QAAQ,YAAY,GAAI,SAAQ,KAAK,CAAC;AAAA,IACxD;AACA,WAAO;AAAA,EACT,QAAQ;AAEN,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** Runs a `git` sub-command; returns trimmed stdout, or `null` on any failure. */
|
|
2
|
+
export type GitRunner = (args: string[]) => string | null;
|
|
3
|
+
/** Default runner: spawn `git`, return trimmed stdout, `null` on any failure. */
|
|
4
|
+
export declare const defaultGitRunner: GitRunner;
|
|
5
|
+
export interface WorktreeGitEvidence {
|
|
6
|
+
/**
|
|
7
|
+
* `true` when the worktree has no uncommitted changes — OR when the caller is
|
|
8
|
+
* not inside a git repo (a non-git caller is never "dirty", so SWS still runs).
|
|
9
|
+
*/
|
|
10
|
+
gitClean: boolean;
|
|
11
|
+
/** Worktree root (`git rev-parse --show-toplevel`); `null` when not in a worktree. */
|
|
12
|
+
worktreePath: string | null;
|
|
13
|
+
/** Current branch (`git rev-parse --abbrev-ref HEAD`); `null` when not in a worktree. */
|
|
14
|
+
branch: string | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* SWS git evidence — the clean-status precondition input + the worktree
|
|
18
|
+
* provenance (M23.2). Emits `null` provenance (and `gitClean: true`) when the
|
|
19
|
+
* agent is not inside a git worktree, so SWS still records the WorkSession.
|
|
20
|
+
*/
|
|
21
|
+
export declare function readWorktreeGitEvidence(run?: GitRunner): WorktreeGitEvidence;
|
|
22
|
+
/**
|
|
23
|
+
* The worktree HEAD commit hash (`git rev-parse HEAD`), or `null` when not inside a
|
|
24
|
+
* git worktree or the repo has no commit yet. The MCP-local reads this on
|
|
25
|
+
* `complete_work_session` and binds it as `WorkSession.commitSha` — the per-session
|
|
26
|
+
* commit proof the CWS git-evidence gate requires to finalize (M23.2). The deployed
|
|
27
|
+
* Lambda has no worktree, so only this CLI can observe it.
|
|
28
|
+
*/
|
|
29
|
+
export declare function readHeadCommitSha(run?: GitRunner): string | null;
|
|
30
|
+
/** One injected file-change action (a subset of the AWS `record_file_change` payload). */
|
|
31
|
+
export interface LocalFileChangeAction {
|
|
32
|
+
action: 'record_file_change';
|
|
33
|
+
workSessionId: string;
|
|
34
|
+
ticketId: string;
|
|
35
|
+
expectedPath: string;
|
|
36
|
+
expectedAction: 'create' | 'modify' | 'delete';
|
|
37
|
+
actualAction: 'created' | 'modified' | 'deleted';
|
|
38
|
+
status: 'matched';
|
|
39
|
+
}
|
|
40
|
+
interface DeriveCtx {
|
|
41
|
+
workSessionId: string;
|
|
42
|
+
ticketId: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parse `git status --porcelain` into the `record_file_change` set the MCP-local
|
|
46
|
+
* injects in `validateFiles: 'local'` mode — one action per created/modified/
|
|
47
|
+
* deleted path (the agent reports the `referenced` files itself). A rename (`R`)
|
|
48
|
+
* surfaces as a create of the new path.
|
|
49
|
+
*/
|
|
50
|
+
export declare function deriveLocalFileChanges(statusPorcelain: string | null, ctx: DeriveCtx): LocalFileChangeAction[];
|
|
51
|
+
/**
|
|
52
|
+
* Read the worktree's changed-file set (`git status --porcelain`) and map it to
|
|
53
|
+
* the `record_file_change` actions the MCP-local injects (AWS `validateFiles:
|
|
54
|
+
* 'local'`). Empty when not inside a git worktree.
|
|
55
|
+
*/
|
|
56
|
+
export declare function readLocalFileChanges(ctx: DeriveCtx, run?: GitRunner): LocalFileChangeAction[];
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=git-injection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-injection.d.ts","sourceRoot":"","sources":["../../../src/tools/core/git-injection.ts"],"names":[],"mappings":"AA2BA,kFAAkF;AAClF,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC;AAE1D,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,EAAE,SAU9B,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,sFAAsF;IACtF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,yFAAyF;IACzF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,SAA4B,GAAG,mBAAmB,CAc9F;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,SAA4B,GAAG,MAAM,GAAG,IAAI,CAGlF;AAED,0FAA0F;AAC1F,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/C,YAAY,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IACjD,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,UAAU,SAAS;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,GAAG,EAAE,SAAS,GACb,qBAAqB,EAAE,CA4BzB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,GAAE,SAA4B,GAAG,qBAAqB,EAAE,CAE/G"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
const defaultGitRunner = (args) => {
|
|
3
|
+
try {
|
|
4
|
+
const out = execFileSync("git", args, {
|
|
5
|
+
encoding: "utf8",
|
|
6
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
7
|
+
});
|
|
8
|
+
return out.trim();
|
|
9
|
+
} catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
function readWorktreeGitEvidence(run = defaultGitRunner) {
|
|
14
|
+
const worktreePath = run(["rev-parse", "--show-toplevel"]);
|
|
15
|
+
if (worktreePath === null || worktreePath === "") {
|
|
16
|
+
return { gitClean: true, worktreePath: null, branch: null };
|
|
17
|
+
}
|
|
18
|
+
const branch = run(["rev-parse", "--abbrev-ref", "HEAD"]);
|
|
19
|
+
const status = run(["status", "--porcelain"]);
|
|
20
|
+
return {
|
|
21
|
+
// A failed `git status` (null) must not block SWS → treat as clean.
|
|
22
|
+
gitClean: status === null ? true : status.trim() === "",
|
|
23
|
+
worktreePath,
|
|
24
|
+
branch: branch === null || branch === "" ? null : branch
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function readHeadCommitSha(run = defaultGitRunner) {
|
|
28
|
+
const sha = run(["rev-parse", "HEAD"]);
|
|
29
|
+
return sha === null || sha === "" ? null : sha;
|
|
30
|
+
}
|
|
31
|
+
function deriveLocalFileChanges(statusPorcelain, ctx) {
|
|
32
|
+
if (!statusPorcelain) return [];
|
|
33
|
+
const actions = [];
|
|
34
|
+
for (const raw of statusPorcelain.split("\n")) {
|
|
35
|
+
const line = raw.replace(/\r$/, "");
|
|
36
|
+
if (line.trim() === "") continue;
|
|
37
|
+
const xy = line.slice(0, 2);
|
|
38
|
+
let path = line.slice(3).trim();
|
|
39
|
+
const arrow = path.indexOf(" -> ");
|
|
40
|
+
if (arrow >= 0) path = path.slice(arrow + 4).trim();
|
|
41
|
+
if (path.startsWith('"') && path.endsWith('"')) path = path.slice(1, -1);
|
|
42
|
+
if (path === "") continue;
|
|
43
|
+
const kind = classifyPorcelain(xy);
|
|
44
|
+
if (!kind) continue;
|
|
45
|
+
actions.push({
|
|
46
|
+
action: "record_file_change",
|
|
47
|
+
workSessionId: ctx.workSessionId,
|
|
48
|
+
ticketId: ctx.ticketId,
|
|
49
|
+
expectedPath: path,
|
|
50
|
+
expectedAction: kind.expected,
|
|
51
|
+
actualAction: kind.actual,
|
|
52
|
+
status: "matched"
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return actions;
|
|
56
|
+
}
|
|
57
|
+
function readLocalFileChanges(ctx, run = defaultGitRunner) {
|
|
58
|
+
return deriveLocalFileChanges(run(["status", "--porcelain"]), ctx);
|
|
59
|
+
}
|
|
60
|
+
function classifyPorcelain(xy) {
|
|
61
|
+
const s = xy.trim();
|
|
62
|
+
if (s === "") return null;
|
|
63
|
+
if (s === "??" || s.includes("A") || s.includes("R") || s.includes("C")) {
|
|
64
|
+
return { expected: "create", actual: "created" };
|
|
65
|
+
}
|
|
66
|
+
if (s.includes("D")) return { expected: "delete", actual: "deleted" };
|
|
67
|
+
if (s.includes("M") || s.includes("T") || s.includes("U")) {
|
|
68
|
+
return { expected: "modify", actual: "modified" };
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
defaultGitRunner,
|
|
74
|
+
deriveLocalFileChanges,
|
|
75
|
+
readHeadCommitSha,
|
|
76
|
+
readLocalFileChanges,
|
|
77
|
+
readWorktreeGitEvidence
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=git-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/core/git-injection.ts"],"sourcesContent":["/**\n * MCP-local git-evidence injection (M23.2).\n *\n * The work lifecycle's SWS/AWS verbs need worktree git evidence that only the\n * MCP-LOCAL (this CLI, running on the agent's machine — the deployed Lambda has\n * NO worktree) can observe. Per `docs/architecture/work-lifecycle-flow.md` §0 +\n * [[project_coherence_score]]:\n *\n * - **SWS** (`start_work_session`): runs `git status` for the clean-workspace\n * precondition (`gitClean`) and reports the worktree provenance —\n * `worktreePath` via `git rev-parse --show-toplevel` + `branch` via\n * `git rev-parse --abbrev-ref HEAD` — so SWS persists\n * `WorkSession.worktreePath`/`branch` (M16.2). When the agent is NOT inside a\n * git worktree (\"caso esteja em uma\") the provenance is `null` (SWS still\n * records the WorkSession) and `gitClean` defaults to `true` (a non-git caller\n * is never \"dirty\" — it must not be blocked by the precondition).\n * - **AWS** (`action_work_session`, `validateFiles: 'local'`): runs\n * `git status --porcelain` and injects one `record_file_change` action per\n * created/modified/deleted file (the agent only reports the `referenced`\n * files git cannot see).\n *\n * The git commands run through an injectable `GitRunner` (defaults to a real,\n * non-throwing `git` spawn) so the layer is unit-testable without a live repo and\n * never throws inside a tool handler.\n */\nimport { execFileSync } from 'node:child_process';\n\n/** Runs a `git` sub-command; returns trimmed stdout, or `null` on any failure. */\nexport type GitRunner = (args: string[]) => string | null;\n\n/** Default runner: spawn `git`, return trimmed stdout, `null` on any failure. */\nexport const defaultGitRunner: GitRunner = (args) => {\n try {\n const out = execFileSync('git', args, {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return out.trim();\n } catch {\n return null;\n }\n};\n\nexport interface WorktreeGitEvidence {\n /**\n * `true` when the worktree has no uncommitted changes — OR when the caller is\n * not inside a git repo (a non-git caller is never \"dirty\", so SWS still runs).\n */\n gitClean: boolean;\n /** Worktree root (`git rev-parse --show-toplevel`); `null` when not in a worktree. */\n worktreePath: string | null;\n /** Current branch (`git rev-parse --abbrev-ref HEAD`); `null` when not in a worktree. */\n branch: string | null;\n}\n\n/**\n * SWS git evidence — the clean-status precondition input + the worktree\n * provenance (M23.2). Emits `null` provenance (and `gitClean: true`) when the\n * agent is not inside a git worktree, so SWS still records the WorkSession.\n */\nexport function readWorktreeGitEvidence(run: GitRunner = defaultGitRunner): WorktreeGitEvidence {\n const worktreePath = run(['rev-parse', '--show-toplevel']);\n if (worktreePath === null || worktreePath === '') {\n // Not inside a git worktree — SWS still records the WorkSession.\n return { gitClean: true, worktreePath: null, branch: null };\n }\n const branch = run(['rev-parse', '--abbrev-ref', 'HEAD']);\n const status = run(['status', '--porcelain']);\n return {\n // A failed `git status` (null) must not block SWS → treat as clean.\n gitClean: status === null ? true : status.trim() === '',\n worktreePath,\n branch: branch === null || branch === '' ? null : branch,\n };\n}\n\n/**\n * The worktree HEAD commit hash (`git rev-parse HEAD`), or `null` when not inside a\n * git worktree or the repo has no commit yet. The MCP-local reads this on\n * `complete_work_session` and binds it as `WorkSession.commitSha` — the per-session\n * commit proof the CWS git-evidence gate requires to finalize (M23.2). The deployed\n * Lambda has no worktree, so only this CLI can observe it.\n */\nexport function readHeadCommitSha(run: GitRunner = defaultGitRunner): string | null {\n const sha = run(['rev-parse', 'HEAD']);\n return sha === null || sha === '' ? null : sha;\n}\n\n/** One injected file-change action (a subset of the AWS `record_file_change` payload). */\nexport interface LocalFileChangeAction {\n action: 'record_file_change';\n workSessionId: string;\n ticketId: string;\n expectedPath: string;\n expectedAction: 'create' | 'modify' | 'delete';\n actualAction: 'created' | 'modified' | 'deleted';\n status: 'matched';\n}\n\ninterface DeriveCtx {\n workSessionId: string;\n ticketId: string;\n}\n\n/**\n * Parse `git status --porcelain` into the `record_file_change` set the MCP-local\n * injects in `validateFiles: 'local'` mode — one action per created/modified/\n * deleted path (the agent reports the `referenced` files itself). A rename (`R`)\n * surfaces as a create of the new path.\n */\nexport function deriveLocalFileChanges(\n statusPorcelain: string | null,\n ctx: DeriveCtx,\n): LocalFileChangeAction[] {\n if (!statusPorcelain) return [];\n const actions: LocalFileChangeAction[] = [];\n for (const raw of statusPorcelain.split('\\n')) {\n const line = raw.replace(/\\r$/, '');\n if (line.trim() === '') continue;\n // porcelain v1: `XY<space>path` — XY is the 2-char status, path starts at col 3.\n const xy = line.slice(0, 2);\n let path = line.slice(3).trim();\n // Rename/copy renders as `old -> new`; record the new path.\n const arrow = path.indexOf(' -> ');\n if (arrow >= 0) path = path.slice(arrow + 4).trim();\n // git quotes paths with special chars.\n if (path.startsWith('\"') && path.endsWith('\"')) path = path.slice(1, -1);\n if (path === '') continue;\n const kind = classifyPorcelain(xy);\n if (!kind) continue;\n actions.push({\n action: 'record_file_change',\n workSessionId: ctx.workSessionId,\n ticketId: ctx.ticketId,\n expectedPath: path,\n expectedAction: kind.expected,\n actualAction: kind.actual,\n status: 'matched',\n });\n }\n return actions;\n}\n\n/**\n * Read the worktree's changed-file set (`git status --porcelain`) and map it to\n * the `record_file_change` actions the MCP-local injects (AWS `validateFiles:\n * 'local'`). Empty when not inside a git worktree.\n */\nexport function readLocalFileChanges(ctx: DeriveCtx, run: GitRunner = defaultGitRunner): LocalFileChangeAction[] {\n return deriveLocalFileChanges(run(['status', '--porcelain']), ctx);\n}\n\nfunction classifyPorcelain(\n xy: string,\n): { expected: 'create' | 'modify' | 'delete'; actual: 'created' | 'modified' | 'deleted' } | null {\n const s = xy.trim();\n if (s === '') return null;\n // Untracked / added / renamed / copied → a new (created) file.\n if (s === '??' || s.includes('A') || s.includes('R') || s.includes('C')) {\n return { expected: 'create', actual: 'created' };\n }\n if (s.includes('D')) return { expected: 'delete', actual: 'deleted' };\n if (s.includes('M') || s.includes('T') || s.includes('U')) {\n return { expected: 'modify', actual: 'modified' };\n }\n return null;\n}\n"],"mappings":"AAyBA,SAAS,oBAAoB;AAMtB,MAAM,mBAA8B,CAAC,SAAS;AACnD,MAAI;AACF,UAAM,MAAM,aAAa,OAAO,MAAM;AAAA,MACpC,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC;AACD,WAAO,IAAI,KAAK;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAmBO,SAAS,wBAAwB,MAAiB,kBAAuC;AAC9F,QAAM,eAAe,IAAI,CAAC,aAAa,iBAAiB,CAAC;AACzD,MAAI,iBAAiB,QAAQ,iBAAiB,IAAI;AAEhD,WAAO,EAAE,UAAU,MAAM,cAAc,MAAM,QAAQ,KAAK;AAAA,EAC5D;AACA,QAAM,SAAS,IAAI,CAAC,aAAa,gBAAgB,MAAM,CAAC;AACxD,QAAM,SAAS,IAAI,CAAC,UAAU,aAAa,CAAC;AAC5C,SAAO;AAAA;AAAA,IAEL,UAAU,WAAW,OAAO,OAAO,OAAO,KAAK,MAAM;AAAA,IACrD;AAAA,IACA,QAAQ,WAAW,QAAQ,WAAW,KAAK,OAAO;AAAA,EACpD;AACF;AASO,SAAS,kBAAkB,MAAiB,kBAAiC;AAClF,QAAM,MAAM,IAAI,CAAC,aAAa,MAAM,CAAC;AACrC,SAAO,QAAQ,QAAQ,QAAQ,KAAK,OAAO;AAC7C;AAwBO,SAAS,uBACd,iBACA,KACyB;AACzB,MAAI,CAAC,gBAAiB,QAAO,CAAC;AAC9B,QAAM,UAAmC,CAAC;AAC1C,aAAW,OAAO,gBAAgB,MAAM,IAAI,GAAG;AAC7C,UAAM,OAAO,IAAI,QAAQ,OAAO,EAAE;AAClC,QAAI,KAAK,KAAK,MAAM,GAAI;AAExB,UAAM,KAAK,KAAK,MAAM,GAAG,CAAC;AAC1B,QAAI,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAE9B,UAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,QAAI,SAAS,EAAG,QAAO,KAAK,MAAM,QAAQ,CAAC,EAAE,KAAK;AAElD,QAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,EAAG,QAAO,KAAK,MAAM,GAAG,EAAE;AACvE,QAAI,SAAS,GAAI;AACjB,UAAM,OAAO,kBAAkB,EAAE;AACjC,QAAI,CAAC,KAAM;AACX,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,eAAe,IAAI;AAAA,MACnB,UAAU,IAAI;AAAA,MACd,cAAc;AAAA,MACd,gBAAgB,KAAK;AAAA,MACrB,cAAc,KAAK;AAAA,MACnB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAOO,SAAS,qBAAqB,KAAgB,MAAiB,kBAA2C;AAC/G,SAAO,uBAAuB,IAAI,CAAC,UAAU,aAAa,CAAC,GAAG,GAAG;AACnE;AAEA,SAAS,kBACP,IACiG;AACjG,QAAM,IAAI,GAAG,KAAK;AAClB,MAAI,MAAM,GAAI,QAAO;AAErB,MAAI,MAAM,QAAQ,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG,GAAG;AACvE,WAAO,EAAE,UAAU,UAAU,QAAQ,UAAU;AAAA,EACjD;AACA,MAAI,EAAE,SAAS,GAAG,EAAG,QAAO,EAAE,UAAU,UAAU,QAAQ,UAAU;AACpE,MAAI,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG,GAAG;AACzD,WAAO,EAAE,UAAU,UAAU,QAAQ,WAAW;AAAA,EAClD;AACA,SAAO;AACT;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/core/index.ts"],"names":[],"mappings":"AAEA,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/core/index.ts"],"names":[],"mappings":"AAEA,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC"}
|
package/dist/tools/core/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/tools/core/index.ts"],"sourcesContent":["// mcp/src/tools/core/index.ts\n\nexport * from './context-helper.js';\n"],"mappings":"AAEA,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/core/index.ts"],"sourcesContent":["// mcp/src/tools/core/index.ts\n\nexport * from './context-helper.js';\nexport * from './file-existence-injection.js';\n"],"mappings":"AAEA,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAML,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAUhC;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,IAAI,IAAI,EAAE,CAshCjC;AAED;;GAEG;AACH,KAAK,WAAW,GAAG,CACjB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;AA6EtB;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,GACnB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA8S7B;AAiBD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,OAAO,CAAC,CA4DlB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,OAAO,GAAG,gBAAgB,CAAC,CAOrC;AAGD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC"}
|