@manehorizons/cadence-core 1.1.1
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/LICENSE +21 -0
- package/README.md +5 -0
- package/bin/cadence.cjs +4 -0
- package/dist/build/record.d.ts +16 -0
- package/dist/build/record.d.ts.map +1 -0
- package/dist/build/record.js +33 -0
- package/dist/build/record.js.map +1 -0
- package/dist/checks/boundary.d.ts +35 -0
- package/dist/checks/boundary.d.ts.map +1 -0
- package/dist/checks/boundary.js +29 -0
- package/dist/checks/boundary.js.map +1 -0
- package/dist/checks/skill-audit.d.ts +29 -0
- package/dist/checks/skill-audit.d.ts.map +1 -0
- package/dist/checks/skill-audit.js +57 -0
- package/dist/checks/skill-audit.js.map +1 -0
- package/dist/classify/tier.d.ts +9 -0
- package/dist/classify/tier.d.ts.map +1 -0
- package/dist/classify/tier.js +15 -0
- package/dist/classify/tier.js.map +1 -0
- package/dist/cli/commands/assumption.d.ts +3 -0
- package/dist/cli/commands/assumption.d.ts.map +1 -0
- package/dist/cli/commands/assumption.js +313 -0
- package/dist/cli/commands/assumption.js.map +1 -0
- package/dist/cli/commands/block.d.ts +3 -0
- package/dist/cli/commands/block.d.ts.map +1 -0
- package/dist/cli/commands/block.js +23 -0
- package/dist/cli/commands/block.js.map +1 -0
- package/dist/cli/commands/build.d.ts +3 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +89 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +91 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/context.d.ts +3 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +31 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/decision.d.ts +3 -0
- package/dist/cli/commands/decision.d.ts.map +1 -0
- package/dist/cli/commands/decision.js +390 -0
- package/dist/cli/commands/decision.js.map +1 -0
- package/dist/cli/commands/done.d.ts +3 -0
- package/dist/cli/commands/done.d.ts.map +1 -0
- package/dist/cli/commands/done.js +23 -0
- package/dist/cli/commands/done.js.map +1 -0
- package/dist/cli/commands/draft-new.d.ts +4 -0
- package/dist/cli/commands/draft-new.d.ts.map +1 -0
- package/dist/cli/commands/draft-new.js +108 -0
- package/dist/cli/commands/draft-new.js.map +1 -0
- package/dist/cli/commands/draft.d.ts +4 -0
- package/dist/cli/commands/draft.d.ts.map +1 -0
- package/dist/cli/commands/draft.js +125 -0
- package/dist/cli/commands/draft.js.map +1 -0
- package/dist/cli/commands/hook.d.ts +3 -0
- package/dist/cli/commands/hook.d.ts.map +1 -0
- package/dist/cli/commands/hook.js +50 -0
- package/dist/cli/commands/hook.js.map +1 -0
- package/dist/cli/commands/init.d.ts +21 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +255 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +3 -0
- package/dist/cli/commands/inspect.d.ts.map +1 -0
- package/dist/cli/commands/inspect.js +24 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/intelligence.d.ts +3 -0
- package/dist/cli/commands/intelligence.d.ts.map +1 -0
- package/dist/cli/commands/intelligence.js +173 -0
- package/dist/cli/commands/intelligence.js.map +1 -0
- package/dist/cli/commands/milestone.d.ts +3 -0
- package/dist/cli/commands/milestone.d.ts.map +1 -0
- package/dist/cli/commands/milestone.js +119 -0
- package/dist/cli/commands/milestone.js.map +1 -0
- package/dist/cli/commands/needs-context.d.ts +3 -0
- package/dist/cli/commands/needs-context.d.ts.map +1 -0
- package/dist/cli/commands/needs-context.js +23 -0
- package/dist/cli/commands/needs-context.js.map +1 -0
- package/dist/cli/commands/progress.d.ts +3 -0
- package/dist/cli/commands/progress.d.ts.map +1 -0
- package/dist/cli/commands/progress.js +21 -0
- package/dist/cli/commands/progress.js.map +1 -0
- package/dist/cli/commands/recommend.d.ts +3 -0
- package/dist/cli/commands/recommend.d.ts.map +1 -0
- package/dist/cli/commands/recommend.js +24 -0
- package/dist/cli/commands/recommend.js.map +1 -0
- package/dist/cli/commands/recommendation.d.ts +3 -0
- package/dist/cli/commands/recommendation.d.ts.map +1 -0
- package/dist/cli/commands/recommendation.js +360 -0
- package/dist/cli/commands/recommendation.js.map +1 -0
- package/dist/cli/commands/settle.d.ts +3 -0
- package/dist/cli/commands/settle.d.ts.map +1 -0
- package/dist/cli/commands/settle.js +453 -0
- package/dist/cli/commands/settle.js.map +1 -0
- package/dist/cli/commands/spec.d.ts +10 -0
- package/dist/cli/commands/spec.d.ts.map +1 -0
- package/dist/cli/commands/spec.js +246 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/commands/status.d.ts +11 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +211 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/register.d.ts +3 -0
- package/dist/cli/register.d.ts.map +1 -0
- package/dist/cli/register.js +43 -0
- package/dist/cli/register.js.map +1 -0
- package/dist/coherence/check.d.ts +11 -0
- package/dist/coherence/check.d.ts.map +1 -0
- package/dist/coherence/check.js +34 -0
- package/dist/coherence/check.js.map +1 -0
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +40 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +31 -0
- package/dist/errors.js.map +1 -0
- package/dist/gates/approve.d.ts +20 -0
- package/dist/gates/approve.d.ts.map +1 -0
- package/dist/gates/approve.js +55 -0
- package/dist/gates/approve.js.map +1 -0
- package/dist/gates/build-context.d.ts +17 -0
- package/dist/gates/build-context.d.ts.map +1 -0
- package/dist/gates/build-context.js +81 -0
- package/dist/gates/build-context.js.map +1 -0
- package/dist/gates/build-test-must-pass.d.ts +12 -0
- package/dist/gates/build-test-must-pass.d.ts.map +1 -0
- package/dist/gates/build-test-must-pass.js +23 -0
- package/dist/gates/build-test-must-pass.js.map +1 -0
- package/dist/gates/build-types.d.ts +54 -0
- package/dist/gates/build-types.d.ts.map +1 -0
- package/dist/gates/build-types.js +2 -0
- package/dist/gates/build-types.js.map +1 -0
- package/dist/gates/code-review.d.ts +20 -0
- package/dist/gates/code-review.d.ts.map +1 -0
- package/dist/gates/code-review.js +137 -0
- package/dist/gates/code-review.js.map +1 -0
- package/dist/gates/coherence.d.ts +26 -0
- package/dist/gates/coherence.d.ts.map +1 -0
- package/dist/gates/coherence.js +59 -0
- package/dist/gates/coherence.js.map +1 -0
- package/dist/gates/coverage.d.ts +8 -0
- package/dist/gates/coverage.d.ts.map +1 -0
- package/dist/gates/coverage.js +26 -0
- package/dist/gates/coverage.js.map +1 -0
- package/dist/gates/deep-verify.d.ts +7 -0
- package/dist/gates/deep-verify.d.ts.map +1 -0
- package/dist/gates/deep-verify.js +77 -0
- package/dist/gates/deep-verify.js.map +1 -0
- package/dist/gates/draft-context.d.ts +20 -0
- package/dist/gates/draft-context.d.ts.map +1 -0
- package/dist/gates/draft-context.js +87 -0
- package/dist/gates/draft-context.js.map +1 -0
- package/dist/gates/draft-read.d.ts +10 -0
- package/dist/gates/draft-read.d.ts.map +1 -0
- package/dist/gates/draft-read.js +24 -0
- package/dist/gates/draft-read.js.map +1 -0
- package/dist/gates/draft-types.d.ts +75 -0
- package/dist/gates/draft-types.d.ts.map +1 -0
- package/dist/gates/draft-types.js +2 -0
- package/dist/gates/draft-types.js.map +1 -0
- package/dist/gates/engine.d.ts +21 -0
- package/dist/gates/engine.d.ts.map +1 -0
- package/dist/gates/engine.js +98 -0
- package/dist/gates/engine.js.map +1 -0
- package/dist/gates/interactive.d.ts +11 -0
- package/dist/gates/interactive.d.ts.map +1 -0
- package/dist/gates/interactive.js +55 -0
- package/dist/gates/interactive.js.map +1 -0
- package/dist/gates/per-task-verify.d.ts +12 -0
- package/dist/gates/per-task-verify.d.ts.map +1 -0
- package/dist/gates/per-task-verify.js +52 -0
- package/dist/gates/per-task-verify.js.map +1 -0
- package/dist/gates/plan-review.d.ts +13 -0
- package/dist/gates/plan-review.d.ts.map +1 -0
- package/dist/gates/plan-review.js +98 -0
- package/dist/gates/plan-review.js.map +1 -0
- package/dist/gates/registry.d.ts +53 -0
- package/dist/gates/registry.d.ts.map +1 -0
- package/dist/gates/registry.js +66 -0
- package/dist/gates/registry.js.map +1 -0
- package/dist/gates/security-audit.d.ts +11 -0
- package/dist/gates/security-audit.d.ts.map +1 -0
- package/dist/gates/security-audit.js +40 -0
- package/dist/gates/security-audit.js.map +1 -0
- package/dist/gates/structural-verifier.d.ts +8 -0
- package/dist/gates/structural-verifier.d.ts.map +1 -0
- package/dist/gates/structural-verifier.js +25 -0
- package/dist/gates/structural-verifier.js.map +1 -0
- package/dist/gates/types.d.ts +202 -0
- package/dist/gates/types.d.ts.map +1 -0
- package/dist/gates/types.js +12 -0
- package/dist/gates/types.js.map +1 -0
- package/dist/hooks/dispatcher.d.ts +8 -0
- package/dist/hooks/dispatcher.d.ts.map +1 -0
- package/dist/hooks/dispatcher.js +31 -0
- package/dist/hooks/dispatcher.js.map +1 -0
- package/dist/hooks/handlers.d.ts +21 -0
- package/dist/hooks/handlers.d.ts.map +1 -0
- package/dist/hooks/handlers.js +121 -0
- package/dist/hooks/handlers.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/init/claude-md-template.d.ts +34 -0
- package/dist/init/claude-md-template.d.ts.map +1 -0
- package/dist/init/claude-md-template.js +72 -0
- package/dist/init/claude-md-template.js.map +1 -0
- package/dist/intelligence/backend/cadence.d.ts +21 -0
- package/dist/intelligence/backend/cadence.d.ts.map +1 -0
- package/dist/intelligence/backend/cadence.js +127 -0
- package/dist/intelligence/backend/cadence.js.map +1 -0
- package/dist/intelligence/context.d.ts +11 -0
- package/dist/intelligence/context.d.ts.map +1 -0
- package/dist/intelligence/context.js +197 -0
- package/dist/intelligence/context.js.map +1 -0
- package/dist/intelligence/graph-decision.d.ts +9 -0
- package/dist/intelligence/graph-decision.d.ts.map +1 -0
- package/dist/intelligence/graph-decision.js +55 -0
- package/dist/intelligence/graph-decision.js.map +1 -0
- package/dist/intelligence/inspect.d.ts +9 -0
- package/dist/intelligence/inspect.d.ts.map +1 -0
- package/dist/intelligence/inspect.js +93 -0
- package/dist/intelligence/inspect.js.map +1 -0
- package/dist/intelligence/milestone.d.ts +40 -0
- package/dist/intelligence/milestone.d.ts.map +1 -0
- package/dist/intelligence/milestone.js +312 -0
- package/dist/intelligence/milestone.js.map +1 -0
- package/dist/intelligence/recommend.d.ts +20 -0
- package/dist/intelligence/recommend.d.ts.map +1 -0
- package/dist/intelligence/recommend.js +185 -0
- package/dist/intelligence/recommend.js.map +1 -0
- package/dist/intelligence/render-assumption-detail.d.ts +3 -0
- package/dist/intelligence/render-assumption-detail.d.ts.map +1 -0
- package/dist/intelligence/render-assumption-detail.js +16 -0
- package/dist/intelligence/render-assumption-detail.js.map +1 -0
- package/dist/intelligence/render-assumption.d.ts +3 -0
- package/dist/intelligence/render-assumption.d.ts.map +1 -0
- package/dist/intelligence/render-assumption.js +37 -0
- package/dist/intelligence/render-assumption.js.map +1 -0
- package/dist/intelligence/render-context.d.ts +3 -0
- package/dist/intelligence/render-context.d.ts.map +1 -0
- package/dist/intelligence/render-context.js +92 -0
- package/dist/intelligence/render-context.js.map +1 -0
- package/dist/intelligence/render-decision-detail.d.ts +3 -0
- package/dist/intelligence/render-decision-detail.d.ts.map +1 -0
- package/dist/intelligence/render-decision-detail.js +30 -0
- package/dist/intelligence/render-decision-detail.js.map +1 -0
- package/dist/intelligence/render-decision-graph.d.ts +3 -0
- package/dist/intelligence/render-decision-graph.d.ts.map +1 -0
- package/dist/intelligence/render-decision-graph.js +49 -0
- package/dist/intelligence/render-decision-graph.js.map +1 -0
- package/dist/intelligence/render-decision.d.ts +3 -0
- package/dist/intelligence/render-decision.d.ts.map +1 -0
- package/dist/intelligence/render-decision.js +45 -0
- package/dist/intelligence/render-decision.js.map +1 -0
- package/dist/intelligence/render-inspection.d.ts +3 -0
- package/dist/intelligence/render-inspection.d.ts.map +1 -0
- package/dist/intelligence/render-inspection.js +69 -0
- package/dist/intelligence/render-inspection.js.map +1 -0
- package/dist/intelligence/render-intelligence-audit.d.ts +5 -0
- package/dist/intelligence/render-intelligence-audit.d.ts.map +1 -0
- package/dist/intelligence/render-intelligence-audit.js +93 -0
- package/dist/intelligence/render-intelligence-audit.js.map +1 -0
- package/dist/intelligence/render-intelligence-stats.d.ts +6 -0
- package/dist/intelligence/render-intelligence-stats.d.ts.map +1 -0
- package/dist/intelligence/render-intelligence-stats.js +76 -0
- package/dist/intelligence/render-intelligence-stats.js.map +1 -0
- package/dist/intelligence/render-milestone.d.ts +3 -0
- package/dist/intelligence/render-milestone.d.ts.map +1 -0
- package/dist/intelligence/render-milestone.js +80 -0
- package/dist/intelligence/render-milestone.js.map +1 -0
- package/dist/intelligence/render-recommend.d.ts +3 -0
- package/dist/intelligence/render-recommend.d.ts.map +1 -0
- package/dist/intelligence/render-recommend.js +62 -0
- package/dist/intelligence/render-recommend.js.map +1 -0
- package/dist/intelligence/render-recommendation-detail.d.ts +7 -0
- package/dist/intelligence/render-recommendation-detail.d.ts.map +1 -0
- package/dist/intelligence/render-recommendation-detail.js +93 -0
- package/dist/intelligence/render-recommendation-detail.js.map +1 -0
- package/dist/intelligence/render.d.ts +3 -0
- package/dist/intelligence/render.d.ts.map +1 -0
- package/dist/intelligence/render.js +57 -0
- package/dist/intelligence/render.js.map +1 -0
- package/dist/intelligence/scan.d.ts +3 -0
- package/dist/intelligence/scan.d.ts.map +1 -0
- package/dist/intelligence/scan.js +103 -0
- package/dist/intelligence/scan.js.map +1 -0
- package/dist/intelligence/store.d.ts +143 -0
- package/dist/intelligence/store.d.ts.map +1 -0
- package/dist/intelligence/store.js +701 -0
- package/dist/intelligence/store.js.map +1 -0
- package/dist/notify/code-review.d.ts +34 -0
- package/dist/notify/code-review.d.ts.map +1 -0
- package/dist/notify/code-review.js +56 -0
- package/dist/notify/code-review.js.map +1 -0
- package/dist/notify/collect.d.ts +31 -0
- package/dist/notify/collect.d.ts.map +1 -0
- package/dist/notify/collect.js +127 -0
- package/dist/notify/collect.js.map +1 -0
- package/dist/notify/emit-unconverged.d.ts +26 -0
- package/dist/notify/emit-unconverged.d.ts.map +1 -0
- package/dist/notify/emit-unconverged.js +31 -0
- package/dist/notify/emit-unconverged.js.map +1 -0
- package/dist/notify/factory.d.ts +12 -0
- package/dist/notify/factory.d.ts.map +1 -0
- package/dist/notify/factory.js +29 -0
- package/dist/notify/factory.js.map +1 -0
- package/dist/notify/file.d.ts +13 -0
- package/dist/notify/file.d.ts.map +1 -0
- package/dist/notify/file.js +21 -0
- package/dist/notify/file.js.map +1 -0
- package/dist/notify/loop-violation.d.ts +10 -0
- package/dist/notify/loop-violation.d.ts.map +1 -0
- package/dist/notify/loop-violation.js +46 -0
- package/dist/notify/loop-violation.js.map +1 -0
- package/dist/notify/notifier.d.ts +13 -0
- package/dist/notify/notifier.d.ts.map +1 -0
- package/dist/notify/notifier.js +2 -0
- package/dist/notify/notifier.js.map +1 -0
- package/dist/notify/null.d.ts +11 -0
- package/dist/notify/null.d.ts.map +1 -0
- package/dist/notify/null.js +11 -0
- package/dist/notify/null.js.map +1 -0
- package/dist/notify/plan-review.d.ts +20 -0
- package/dist/notify/plan-review.d.ts.map +1 -0
- package/dist/notify/plan-review.js +15 -0
- package/dist/notify/plan-review.js.map +1 -0
- package/dist/notify/skill-audit.d.ts +18 -0
- package/dist/notify/skill-audit.d.ts.map +1 -0
- package/dist/notify/skill-audit.js +33 -0
- package/dist/notify/skill-audit.js.map +1 -0
- package/dist/notify/spec-review.d.ts +20 -0
- package/dist/notify/spec-review.d.ts.map +1 -0
- package/dist/notify/spec-review.js +15 -0
- package/dist/notify/spec-review.js.map +1 -0
- package/dist/notify/stderr.d.ts +17 -0
- package/dist/notify/stderr.d.ts.map +1 -0
- package/dist/notify/stderr.js +17 -0
- package/dist/notify/stderr.js.map +1 -0
- package/dist/notify/webhook.d.ts +33 -0
- package/dist/notify/webhook.d.ts.map +1 -0
- package/dist/notify/webhook.js +55 -0
- package/dist/notify/webhook.js.map +1 -0
- package/dist/parse/draft-parser.d.ts +3 -0
- package/dist/parse/draft-parser.d.ts.map +1 -0
- package/dist/parse/draft-parser.js +99 -0
- package/dist/parse/draft-parser.js.map +1 -0
- package/dist/parse/draft-scaffold.d.ts +14 -0
- package/dist/parse/draft-scaffold.d.ts.map +1 -0
- package/dist/parse/draft-scaffold.js +31 -0
- package/dist/parse/draft-scaffold.js.map +1 -0
- package/dist/parse/spec-parser.d.ts +3 -0
- package/dist/parse/spec-parser.d.ts.map +1 -0
- package/dist/parse/spec-parser.js +68 -0
- package/dist/parse/spec-parser.js.map +1 -0
- package/dist/parse/summary-writer.d.ts +3 -0
- package/dist/parse/summary-writer.d.ts.map +1 -0
- package/dist/parse/summary-writer.js +41 -0
- package/dist/parse/summary-writer.js.map +1 -0
- package/dist/progress.d.ts +7 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +37 -0
- package/dist/progress.js.map +1 -0
- package/dist/render/state-md.d.ts +3 -0
- package/dist/render/state-md.d.ts.map +1 -0
- package/dist/render/state-md.js +33 -0
- package/dist/render/state-md.js.map +1 -0
- package/dist/state/atomic-write.d.ts +3 -0
- package/dist/state/atomic-write.d.ts.map +1 -0
- package/dist/state/atomic-write.js +52 -0
- package/dist/state/atomic-write.js.map +1 -0
- package/dist/state/backend.d.ts +13 -0
- package/dist/state/backend.d.ts.map +1 -0
- package/dist/state/backend.js +2 -0
- package/dist/state/backend.js.map +1 -0
- package/dist/state/simple.d.ts +18 -0
- package/dist/state/simple.d.ts.map +1 -0
- package/dist/state/simple.js +67 -0
- package/dist/state/simple.js.map +1 -0
- package/dist/status.d.ts +47 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +209 -0
- package/dist/status.js.map +1 -0
- package/dist/verify/anthropic-verifier.d.ts +28 -0
- package/dist/verify/anthropic-verifier.d.ts.map +1 -0
- package/dist/verify/anthropic-verifier.js +109 -0
- package/dist/verify/anthropic-verifier.js.map +1 -0
- package/dist/verify/code-review-factory.d.ts +103 -0
- package/dist/verify/code-review-factory.d.ts.map +1 -0
- package/dist/verify/code-review-factory.js +11 -0
- package/dist/verify/code-review-factory.js.map +1 -0
- package/dist/verify/code-review.d.ts +65 -0
- package/dist/verify/code-review.d.ts.map +1 -0
- package/dist/verify/code-review.js +189 -0
- package/dist/verify/code-review.js.map +1 -0
- package/dist/verify/converge.d.ts +14 -0
- package/dist/verify/converge.d.ts.map +1 -0
- package/dist/verify/converge.js +17 -0
- package/dist/verify/converge.js.map +1 -0
- package/dist/verify/coverage.d.ts +31 -0
- package/dist/verify/coverage.d.ts.map +1 -0
- package/dist/verify/coverage.js +125 -0
- package/dist/verify/coverage.js.map +1 -0
- package/dist/verify/factory.d.ts +107 -0
- package/dist/verify/factory.d.ts.map +1 -0
- package/dist/verify/factory.js +17 -0
- package/dist/verify/factory.js.map +1 -0
- package/dist/verify/interactive.d.ts +22 -0
- package/dist/verify/interactive.d.ts.map +1 -0
- package/dist/verify/interactive.js +61 -0
- package/dist/verify/interactive.js.map +1 -0
- package/dist/verify/local-client.d.ts +13 -0
- package/dist/verify/local-client.d.ts.map +1 -0
- package/dist/verify/local-client.js +73 -0
- package/dist/verify/local-client.js.map +1 -0
- package/dist/verify/mock-verifier.d.ts +16 -0
- package/dist/verify/mock-verifier.d.ts.map +1 -0
- package/dist/verify/mock-verifier.js +30 -0
- package/dist/verify/mock-verifier.js.map +1 -0
- package/dist/verify/per-task-factory.d.ts +103 -0
- package/dist/verify/per-task-factory.d.ts.map +1 -0
- package/dist/verify/per-task-factory.js +11 -0
- package/dist/verify/per-task-factory.js.map +1 -0
- package/dist/verify/per-task.d.ts +69 -0
- package/dist/verify/per-task.d.ts.map +1 -0
- package/dist/verify/per-task.js +154 -0
- package/dist/verify/per-task.js.map +1 -0
- package/dist/verify/plan-review-factory.d.ts +103 -0
- package/dist/verify/plan-review-factory.d.ts.map +1 -0
- package/dist/verify/plan-review-factory.js +11 -0
- package/dist/verify/plan-review-factory.js.map +1 -0
- package/dist/verify/plan-review.d.ts +67 -0
- package/dist/verify/plan-review.d.ts.map +1 -0
- package/dist/verify/plan-review.js +196 -0
- package/dist/verify/plan-review.js.map +1 -0
- package/dist/verify/prompter.d.ts +40 -0
- package/dist/verify/prompter.d.ts.map +1 -0
- package/dist/verify/prompter.js +48 -0
- package/dist/verify/prompter.js.map +1 -0
- package/dist/verify/security-audit-factory.d.ts +103 -0
- package/dist/verify/security-audit-factory.d.ts.map +1 -0
- package/dist/verify/security-audit-factory.js +11 -0
- package/dist/verify/security-audit-factory.js.map +1 -0
- package/dist/verify/security-audit.d.ts +63 -0
- package/dist/verify/security-audit.d.ts.map +1 -0
- package/dist/verify/security-audit.js +196 -0
- package/dist/verify/security-audit.js.map +1 -0
- package/dist/verify/skill-match.d.ts +10 -0
- package/dist/verify/skill-match.d.ts.map +1 -0
- package/dist/verify/skill-match.js +15 -0
- package/dist/verify/skill-match.js.map +1 -0
- package/dist/verify/spec-review-factory.d.ts +103 -0
- package/dist/verify/spec-review-factory.d.ts.map +1 -0
- package/dist/verify/spec-review-factory.js +11 -0
- package/dist/verify/spec-review-factory.js.map +1 -0
- package/dist/verify/spec-review.d.ts +63 -0
- package/dist/verify/spec-review.d.ts.map +1 -0
- package/dist/verify/spec-review.js +182 -0
- package/dist/verify/spec-review.js.map +1 -0
- package/dist/verify/verifier-factory.d.ts +45 -0
- package/dist/verify/verifier-factory.d.ts.map +1 -0
- package/dist/verify/verifier-factory.js +38 -0
- package/dist/verify/verifier-factory.js.map +1 -0
- package/dist/verify/verifier.d.ts +63 -0
- package/dist/verify/verifier.d.ts.map +1 -0
- package/dist/verify/verifier.js +32 -0
- package/dist/verify/verifier.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"null.js","sourceRoot":"","sources":["../../src/notify/null.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,MAAM,CAAC,OAAuB;QAClC,oBAAoB;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { selectNotifier } from './factory.js';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 35.1 — emits a single `plan-review-unconverged` anomaly when
|
|
4
|
+
* plan-review fails to converge after maxAttempts. UNCONDITIONAL by design
|
|
5
|
+
* (mirrors emitSkillAuditMiss): plan-review fires only `strict×complex`, and
|
|
6
|
+
* strict cells carry NO `anomaly-notify` gate — a hard human-escalation must
|
|
7
|
+
* still leave an audit trail, so the caller does NOT gate this on
|
|
8
|
+
* `anomaly-notify`. Phase 42.1 — transport/ts-stamp/degrade live in the shared
|
|
9
|
+
* `emitUnconverged` spine; this is now just the payload builder.
|
|
10
|
+
*/
|
|
11
|
+
export declare function emitPlanReviewUnconverged(notifier: ReturnType<typeof selectNotifier>, ctx: {
|
|
12
|
+
draftId: string;
|
|
13
|
+
attempts: number;
|
|
14
|
+
maxAttempts: number;
|
|
15
|
+
findings: number;
|
|
16
|
+
provider: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
bypassed?: boolean;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=plan-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-review.d.ts","sourceRoot":"","sources":["../../src/notify/plan-review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EAC3C,GAAG,EAAE;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GACA,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { emitUnconverged } from './emit-unconverged.js';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 35.1 — emits a single `plan-review-unconverged` anomaly when
|
|
4
|
+
* plan-review fails to converge after maxAttempts. UNCONDITIONAL by design
|
|
5
|
+
* (mirrors emitSkillAuditMiss): plan-review fires only `strict×complex`, and
|
|
6
|
+
* strict cells carry NO `anomaly-notify` gate — a hard human-escalation must
|
|
7
|
+
* still leave an audit trail, so the caller does NOT gate this on
|
|
8
|
+
* `anomaly-notify`. Phase 42.1 — transport/ts-stamp/degrade live in the shared
|
|
9
|
+
* `emitUnconverged` spine; this is now just the payload builder.
|
|
10
|
+
*/
|
|
11
|
+
export function emitPlanReviewUnconverged(notifier, ctx) {
|
|
12
|
+
const { draftId, ...rest } = ctx;
|
|
13
|
+
return emitUnconverged(notifier, 'plan-review', { entityId: draftId, ...rest });
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=plan-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-review.js","sourceRoot":"","sources":["../../src/notify/plan-review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAA2C,EAC3C,GAQC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IACjC,OAAO,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { selectNotifier } from './factory.js';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 34.1 — emits a single `skill-audit-miss` anomaly. UNCONDITIONAL by
|
|
4
|
+
* design: unlike `emitCodeReviewHigh`/`emitLoopViolation` the caller does NOT
|
|
5
|
+
* gate this on the `anomaly-notify` gate (strict cells lack it; a strict
|
|
6
|
+
* phase that fails the skill requirement must still leave an audit trail).
|
|
7
|
+
* Transport failure → one stderr warning, never throws (refusal is computed
|
|
8
|
+
* independently of whether the anomaly write succeeded).
|
|
9
|
+
*/
|
|
10
|
+
export declare function emitSkillAuditMiss(notifier: ReturnType<typeof selectNotifier>, ctx: {
|
|
11
|
+
required: string[];
|
|
12
|
+
invoked: string[];
|
|
13
|
+
missing: string[];
|
|
14
|
+
severity: 'warn' | 'error';
|
|
15
|
+
bypassed?: boolean;
|
|
16
|
+
unenforceable?: boolean;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=skill-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-audit.d.ts","sourceRoot":"","sources":["../../src/notify/skill-audit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EAC3C,GAAG,EAAE;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACA,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 34.1 — emits a single `skill-audit-miss` anomaly. UNCONDITIONAL by
|
|
3
|
+
* design: unlike `emitCodeReviewHigh`/`emitLoopViolation` the caller does NOT
|
|
4
|
+
* gate this on the `anomaly-notify` gate (strict cells lack it; a strict
|
|
5
|
+
* phase that fails the skill requirement must still leave an audit trail).
|
|
6
|
+
* Transport failure → one stderr warning, never throws (refusal is computed
|
|
7
|
+
* independently of whether the anomaly write succeeded).
|
|
8
|
+
*/
|
|
9
|
+
export async function emitSkillAuditMiss(notifier, ctx) {
|
|
10
|
+
const event = {
|
|
11
|
+
type: 'skill-audit-miss',
|
|
12
|
+
severity: ctx.severity,
|
|
13
|
+
message: ctx.unenforceable === true
|
|
14
|
+
? `skill-audit unenforceable — telemetry.skillInvocations disabled; required [${ctx.required.join(', ')}] not verified`
|
|
15
|
+
: `skill-audit miss — required skill(s) not invoked: ${ctx.missing.join(', ')}`,
|
|
16
|
+
context: {
|
|
17
|
+
required: ctx.required,
|
|
18
|
+
invoked: ctx.invoked,
|
|
19
|
+
missing: ctx.missing,
|
|
20
|
+
...(ctx.bypassed !== undefined ? { bypassed: ctx.bypassed } : {}),
|
|
21
|
+
...(ctx.unenforceable !== undefined ? { unenforceable: ctx.unenforceable } : {}),
|
|
22
|
+
},
|
|
23
|
+
ts: new Date().toISOString(),
|
|
24
|
+
};
|
|
25
|
+
try {
|
|
26
|
+
await notifier.notify([event]);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
30
|
+
process.stderr.write(`cadence-notify: ${notifier.name} transport failed — ${msg} (continuing)\n`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=skill-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-audit.js","sourceRoot":"","sources":["../../src/notify/skill-audit.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAA2C,EAC3C,GAOC;IAED,MAAM,KAAK,GAAiB;QAC1B,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,OAAO,EACL,GAAG,CAAC,aAAa,KAAK,IAAI;YACxB,CAAC,CAAC,8EAA8E,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACvH,CAAC,CAAC,qDAAqD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnF,OAAO,EAAE;YACP,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjF;QACD,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC7B,CAAC;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mBAAmB,QAAQ,CAAC,IAAI,uBAAuB,GAAG,iBAAiB,CAC5E,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { selectNotifier } from './factory.js';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 36.1 — emits a single `spec-review-unconverged` anomaly when
|
|
4
|
+
* spec-review fails to converge after maxAttempts. UNCONDITIONAL by design
|
|
5
|
+
* (mirrors emitPlanReviewUnconverged / emitSkillAuditMiss): spec-review is
|
|
6
|
+
* not a gate-matrix cell at all, so there is no `anomaly-notify` gate to key
|
|
7
|
+
* off, and a hard human-escalation must still leave an audit trail. Phase 42.1
|
|
8
|
+
* — transport/ts-stamp/degrade live in the shared `emitUnconverged` spine;
|
|
9
|
+
* this is now just the payload builder.
|
|
10
|
+
*/
|
|
11
|
+
export declare function emitSpecReviewUnconverged(notifier: ReturnType<typeof selectNotifier>, ctx: {
|
|
12
|
+
specId: string;
|
|
13
|
+
attempts: number;
|
|
14
|
+
maxAttempts: number;
|
|
15
|
+
findings: number;
|
|
16
|
+
provider: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
bypassed?: boolean;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=spec-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-review.d.ts","sourceRoot":"","sources":["../../src/notify/spec-review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EAC3C,GAAG,EAAE;IACH,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GACA,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { emitUnconverged } from './emit-unconverged.js';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 36.1 — emits a single `spec-review-unconverged` anomaly when
|
|
4
|
+
* spec-review fails to converge after maxAttempts. UNCONDITIONAL by design
|
|
5
|
+
* (mirrors emitPlanReviewUnconverged / emitSkillAuditMiss): spec-review is
|
|
6
|
+
* not a gate-matrix cell at all, so there is no `anomaly-notify` gate to key
|
|
7
|
+
* off, and a hard human-escalation must still leave an audit trail. Phase 42.1
|
|
8
|
+
* — transport/ts-stamp/degrade live in the shared `emitUnconverged` spine;
|
|
9
|
+
* this is now just the payload builder.
|
|
10
|
+
*/
|
|
11
|
+
export function emitSpecReviewUnconverged(notifier, ctx) {
|
|
12
|
+
const { specId, ...rest } = ctx;
|
|
13
|
+
return emitUnconverged(notifier, 'spec-review', { entityId: specId, ...rest });
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=spec-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-review.js","sourceRoot":"","sources":["../../src/notify/spec-review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAA2C,EAC3C,GAQC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IAChC,OAAO,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AnomalyEvent } from '@manehorizons/cadence-types';
|
|
2
|
+
import type { Notifier } from './notifier.js';
|
|
3
|
+
export interface StderrNotifierOptions {
|
|
4
|
+
/** Test seam: stand in for `process.stderr.write`. */
|
|
5
|
+
write?: (chunk: string) => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Renders one line per event to stderr (or an injected writer) in the form:
|
|
9
|
+
* `cadence anomaly [severity] type: message`
|
|
10
|
+
*/
|
|
11
|
+
export declare class StderrNotifier implements Notifier {
|
|
12
|
+
readonly name = "stderr";
|
|
13
|
+
private readonly write;
|
|
14
|
+
constructor(opts?: StderrNotifierOptions);
|
|
15
|
+
notify(events: AnomalyEvent[]): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=stderr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stderr.d.ts","sourceRoot":"","sources":["../../src/notify/stderr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;gBAEpC,IAAI,GAAE,qBAA0B;IAItC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAKpD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders one line per event to stderr (or an injected writer) in the form:
|
|
3
|
+
* `cadence anomaly [severity] type: message`
|
|
4
|
+
*/
|
|
5
|
+
export class StderrNotifier {
|
|
6
|
+
name = 'stderr';
|
|
7
|
+
write;
|
|
8
|
+
constructor(opts = {}) {
|
|
9
|
+
this.write = opts.write ?? ((c) => process.stderr.write(c));
|
|
10
|
+
}
|
|
11
|
+
async notify(events) {
|
|
12
|
+
for (const e of events) {
|
|
13
|
+
this.write(`cadence anomaly [${e.severity}] ${e.type}: ${e.message}\n`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=stderr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stderr.js","sourceRoot":"","sources":["../../src/notify/stderr.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IACR,KAAK,CAA0B;IAEhD,YAAY,OAA8B,EAAE;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAsB;QACjC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AnomalyEvent } from '@manehorizons/cadence-types';
|
|
2
|
+
import type { Notifier } from './notifier.js';
|
|
3
|
+
export interface WebhookNotifierOptions {
|
|
4
|
+
url: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
/** Per-request timeout in ms. Defaults to 5000. */
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
/** Test seam: stand in for `process.stderr.write`. */
|
|
9
|
+
stderrWrite?: (chunk: string) => void;
|
|
10
|
+
/** Test seam: stand in for global `fetch`. */
|
|
11
|
+
fetchImpl?: typeof fetch;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* POSTs the batched anomaly events to a user-provided URL as
|
|
15
|
+
* `{events: AnomalyEvent[]}` JSON. Phase 19.1 generic webhook primitive —
|
|
16
|
+
* bring your own bridge (Slack incoming, Discord webhook, Zapier catch,
|
|
17
|
+
* n8n hook, continuity-runtime ingester, etc.). On any transport failure
|
|
18
|
+
* (network / non-2xx / timeout) the notifier writes one stderr warning and
|
|
19
|
+
* resolves — settle never breaks on transport errors. The URL is sensitive
|
|
20
|
+
* (may carry a token) and is NEVER included in the failure message.
|
|
21
|
+
*/
|
|
22
|
+
export declare class WebhookNotifier implements Notifier {
|
|
23
|
+
readonly name = "webhook";
|
|
24
|
+
private readonly url;
|
|
25
|
+
private readonly headers;
|
|
26
|
+
private readonly timeoutMs;
|
|
27
|
+
private readonly stderrWrite;
|
|
28
|
+
private readonly fetchImpl;
|
|
29
|
+
constructor(opts: WebhookNotifierOptions);
|
|
30
|
+
notify(events: AnomalyEvent[]): Promise<void>;
|
|
31
|
+
private warn;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/notify/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAID;;;;;;;;GAQG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,IAAI,EAAE,sBAAsB;IAQlC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnD,OAAO,CAAC,IAAI;CAIb"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const DEFAULT_TIMEOUT_MS = 5000;
|
|
2
|
+
/**
|
|
3
|
+
* POSTs the batched anomaly events to a user-provided URL as
|
|
4
|
+
* `{events: AnomalyEvent[]}` JSON. Phase 19.1 generic webhook primitive —
|
|
5
|
+
* bring your own bridge (Slack incoming, Discord webhook, Zapier catch,
|
|
6
|
+
* n8n hook, continuity-runtime ingester, etc.). On any transport failure
|
|
7
|
+
* (network / non-2xx / timeout) the notifier writes one stderr warning and
|
|
8
|
+
* resolves — settle never breaks on transport errors. The URL is sensitive
|
|
9
|
+
* (may carry a token) and is NEVER included in the failure message.
|
|
10
|
+
*/
|
|
11
|
+
export class WebhookNotifier {
|
|
12
|
+
name = 'webhook';
|
|
13
|
+
url;
|
|
14
|
+
headers;
|
|
15
|
+
timeoutMs;
|
|
16
|
+
stderrWrite;
|
|
17
|
+
fetchImpl;
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
this.url = opts.url;
|
|
20
|
+
this.headers = opts.headers ?? {};
|
|
21
|
+
this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
22
|
+
this.stderrWrite = opts.stderrWrite ?? ((c) => process.stderr.write(c));
|
|
23
|
+
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
24
|
+
}
|
|
25
|
+
async notify(events) {
|
|
26
|
+
if (events.length === 0)
|
|
27
|
+
return;
|
|
28
|
+
const body = JSON.stringify({ events });
|
|
29
|
+
const headers = {
|
|
30
|
+
...this.headers,
|
|
31
|
+
// Content-Type is fixed — overlaying caller headers ensures application/json wins.
|
|
32
|
+
'Content-Type': 'application/json',
|
|
33
|
+
};
|
|
34
|
+
try {
|
|
35
|
+
const res = await this.fetchImpl(this.url, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers,
|
|
38
|
+
body,
|
|
39
|
+
signal: AbortSignal.timeout(this.timeoutMs),
|
|
40
|
+
});
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
this.warn(`HTTP ${res.status} ${res.statusText}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
47
|
+
this.warn(msg);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
warn(message) {
|
|
51
|
+
// Intentionally never log the URL or headers (URL may carry a secret).
|
|
52
|
+
this.stderrWrite(`cadence-notify: webhook transport failed — ${message} (continuing)\n`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/notify/webhook.ts"],"names":[],"mappings":"AAcA,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,SAAS,CAAC;IACT,GAAG,CAAS;IACZ,OAAO,CAAyB;IAChC,SAAS,CAAS;IAClB,WAAW,CAA0B;IACrC,SAAS,CAAe;IAEzC,YAAY,IAA4B;QACtC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAsB;QACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,MAAM,OAAO,GAA2B;YACtC,GAAG,IAAI,CAAC,OAAO;YACf,mFAAmF;YACnF,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;gBACzC,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI;gBACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;aAC5C,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,OAAe;QAC1B,uEAAuE;QACvE,IAAI,CAAC,WAAW,CAAC,8CAA8C,OAAO,iBAAiB,CAAC,CAAC;IAC3F,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-parser.d.ts","sourceRoot":"","sources":["../../src/parse/draft-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,KAAK,EAAE,MAAM,6BAA6B,CAAC;AA4EjE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CA2B/C"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { DraftZ } from '@manehorizons/cadence-types';
|
|
2
|
+
import { CadenceError } from '../errors.js';
|
|
3
|
+
const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n/;
|
|
4
|
+
function parseFrontmatter(raw) {
|
|
5
|
+
const m = FRONTMATTER_RE.exec(raw);
|
|
6
|
+
if (!m)
|
|
7
|
+
throw new CadenceError('DRAFT.md missing frontmatter');
|
|
8
|
+
const out = {};
|
|
9
|
+
for (const line of m[1].split('\n')) {
|
|
10
|
+
const [k, ...rest] = line.split(':');
|
|
11
|
+
if (k && rest.length > 0)
|
|
12
|
+
out[k.trim()] = rest.join(':').trim();
|
|
13
|
+
}
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
16
|
+
function stripFrontmatter(raw) {
|
|
17
|
+
return raw.replace(FRONTMATTER_RE, '');
|
|
18
|
+
}
|
|
19
|
+
function extractSection(body, heading) {
|
|
20
|
+
const re = new RegExp(`(^|\\n)## ${heading}\\s*\\n([\\s\\S]*?)(?=\\n## |$)`);
|
|
21
|
+
const m = re.exec(body);
|
|
22
|
+
return m ? m[2].trim() : '';
|
|
23
|
+
}
|
|
24
|
+
function parseAcceptanceCriteria(section) {
|
|
25
|
+
const out = [];
|
|
26
|
+
const blocks = section.split(/\n(?=### AC-)/);
|
|
27
|
+
for (const block of blocks) {
|
|
28
|
+
const head = /^### (AC-\d+):\s*(.*)$/m.exec(block);
|
|
29
|
+
if (!head)
|
|
30
|
+
continue;
|
|
31
|
+
const id = head[1];
|
|
32
|
+
const name = head[2]?.trim() ?? '';
|
|
33
|
+
const given = /Given\s+(.+)/.exec(block)?.[1]?.trim() ?? '';
|
|
34
|
+
const when = /When\s+(.+)/.exec(block)?.[1]?.trim() ?? '';
|
|
35
|
+
const then = /Then\s+(.+)/.exec(block)?.[1]?.trim() ?? '';
|
|
36
|
+
out.push({ id, name, given, when, then });
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
function parseTasks(section) {
|
|
41
|
+
const out = [];
|
|
42
|
+
const blocks = section.split(/\n(?=### )/);
|
|
43
|
+
for (const block of blocks) {
|
|
44
|
+
const head = /^### (T\d+):\s*(.*)$/m.exec(block);
|
|
45
|
+
if (!head)
|
|
46
|
+
continue;
|
|
47
|
+
const id = head[1];
|
|
48
|
+
const name = head[2].trim();
|
|
49
|
+
const filesLine = /-\s*files:\s*(.+)/.exec(block)?.[1] ?? '';
|
|
50
|
+
const files = [...filesLine.matchAll(/`([^`]+)`/g)].map((m) => m[1]);
|
|
51
|
+
const action = /-\s*action:\s*(.+)/.exec(block)?.[1]?.trim() ?? '';
|
|
52
|
+
const verify = /-\s*verify:\s*(.+)/.exec(block)?.[1]?.trim() ?? '';
|
|
53
|
+
const done = /-\s*done:\s*(.+)/.exec(block)?.[1]?.trim() ?? '';
|
|
54
|
+
out.push({ id, name, files, action, verify, done });
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
function parseBoundaries(section) {
|
|
59
|
+
return section
|
|
60
|
+
.split('\n')
|
|
61
|
+
.map((l) => l.replace(/^-\s*/, '').trim())
|
|
62
|
+
.filter((l) => l.length > 0);
|
|
63
|
+
}
|
|
64
|
+
/** `requiredSkills: a, b` or `["a", , b]` → ['a','b'] (bracket/quote tolerant). */
|
|
65
|
+
function parseSkillList(v) {
|
|
66
|
+
return v
|
|
67
|
+
.replace(/^\[|\]$/g, '')
|
|
68
|
+
.split(',')
|
|
69
|
+
.map((s) => s.replace(/['"]/g, '').trim())
|
|
70
|
+
.filter((s) => s.length > 0);
|
|
71
|
+
}
|
|
72
|
+
export function parseDraftMd(raw) {
|
|
73
|
+
const fm = parseFrontmatter(raw);
|
|
74
|
+
const body = stripFrontmatter(raw);
|
|
75
|
+
const titleMatch = /^#\s+\S+\s+—\s+(.+)$/m.exec(body);
|
|
76
|
+
const title = titleMatch ? titleMatch[1].trim() : (fm.id ?? 'untitled');
|
|
77
|
+
const objective = extractSection(body, 'Objective').split('\n')[0] ?? '';
|
|
78
|
+
const acceptanceCriteria = parseAcceptanceCriteria(extractSection(body, 'Acceptance Criteria'));
|
|
79
|
+
const tasks = parseTasks(extractSection(body, 'Tasks'));
|
|
80
|
+
const boundaries = parseBoundaries(extractSection(body, 'Boundaries'));
|
|
81
|
+
const draft = {
|
|
82
|
+
schemaVersion: 1,
|
|
83
|
+
id: fm.id ?? '',
|
|
84
|
+
phase: fm.phase ?? '',
|
|
85
|
+
tier: fm.tier ?? 'standard',
|
|
86
|
+
title,
|
|
87
|
+
objective,
|
|
88
|
+
acceptanceCriteria,
|
|
89
|
+
tasks,
|
|
90
|
+
boundaries,
|
|
91
|
+
status: fm.status ?? 'PENDING',
|
|
92
|
+
...(fm.profile !== undefined ? { profile: fm.profile } : {}),
|
|
93
|
+
...(fm.requiredSkills !== undefined
|
|
94
|
+
? { requiredSkills: parseSkillList(fm.requiredSkills) }
|
|
95
|
+
: {}),
|
|
96
|
+
};
|
|
97
|
+
return DraftZ.parse(draft);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=draft-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-parser.js","sourceRoot":"","sources":["../../src/parse/draft-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Spec } from '@manehorizons/cadence-types';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 38.1 (#1b) — pure DRAFT.md body renderer. The `spec`-absent branch is
|
|
4
|
+
* a VERBATIM lift of the pre-#1b inline scaffold (was `draft.ts`'s
|
|
5
|
+
* `const body = \`…\``) and MUST stay byte-identical (existing `draft new` /
|
|
6
|
+
* `draft check` / draft-parser round-trips depend on the exact bytes — the
|
|
7
|
+
* unit test locks this). With a `spec`, only `## Objective` and the
|
|
8
|
+
* `## Acceptance Criteria` block are seeded; Tasks/Boundaries stay placeholder
|
|
9
|
+
* and the title is always the caller's arg (never the SPEC title).
|
|
10
|
+
*/
|
|
11
|
+
export declare function renderDraftBody(phase: string, id: string, tier: string, title: string, spec?: Spec): string;
|
|
12
|
+
/** First-frontmatter-block `status:` value, trimmed; undefined if absent. */
|
|
13
|
+
export declare function frontmatterStatus(raw: string): string | undefined;
|
|
14
|
+
//# sourceMappingURL=draft-scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-scaffold.d.ts","sourceRoot":"","sources":["../../src/parse/draft-scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAExD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,IAAI,GACV,MAAM,CAkBR;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIjE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 38.1 (#1b) — pure DRAFT.md body renderer. The `spec`-absent branch is
|
|
3
|
+
* a VERBATIM lift of the pre-#1b inline scaffold (was `draft.ts`'s
|
|
4
|
+
* `const body = \`…\``) and MUST stay byte-identical (existing `draft new` /
|
|
5
|
+
* `draft check` / draft-parser round-trips depend on the exact bytes — the
|
|
6
|
+
* unit test locks this). With a `spec`, only `## Objective` and the
|
|
7
|
+
* `## Acceptance Criteria` block are seeded; Tasks/Boundaries stay placeholder
|
|
8
|
+
* and the title is always the caller's arg (never the SPEC title).
|
|
9
|
+
*/
|
|
10
|
+
export function renderDraftBody(phase, id, tier, title, spec) {
|
|
11
|
+
const objective = spec ? spec.objective : '_(one sentence)_';
|
|
12
|
+
const acBlock = spec
|
|
13
|
+
? spec.acceptanceCriteria
|
|
14
|
+
.map((ac) => `### ${ac.id}: ${ac.name}\nGiven ${ac.given}\nWhen ${ac.when}\nThen ${ac.then}`)
|
|
15
|
+
.join('\n\n')
|
|
16
|
+
: '### AC-1: _(name)_\nGiven _(precondition)_\nWhen _(action)_\nThen _(outcome)_';
|
|
17
|
+
return (`---\nphase: ${phase}\nid: ${id}\ntier: ${tier}\nstatus: PENDING\n---\n\n` +
|
|
18
|
+
`# ${id} — ${title}\n\n` +
|
|
19
|
+
`## Objective\n\n${objective}\n\n` +
|
|
20
|
+
`## Acceptance Criteria\n\n${acBlock}\n\n` +
|
|
21
|
+
`## Tasks\n\n### T1: _(task name)_\n- files: \`path/to/file.ts\`\n- action: _(what to do)_\n- verify: _(how to verify)_\n- done: AC-1\n\n` +
|
|
22
|
+
`## Boundaries\n\n- _(DO NOT change …)_\n`);
|
|
23
|
+
}
|
|
24
|
+
/** First-frontmatter-block `status:` value, trimmed; undefined if absent. */
|
|
25
|
+
export function frontmatterStatus(raw) {
|
|
26
|
+
const fm = /^---\n([\s\S]*?)\n---/.exec(raw);
|
|
27
|
+
if (!fm)
|
|
28
|
+
return undefined;
|
|
29
|
+
return /(^|\n)status:\s*(.+)/.exec(fm[1])?.[2]?.trim();
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=draft-scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-scaffold.js","sourceRoot":"","sources":["../../src/parse/draft-scaffold.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAa,EACb,EAAU,EACV,IAAY,EACZ,KAAa,EACb,IAAW;IAEX,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC,IAAI,CAAC,kBAAkB;aACpB,GAAG,CACF,CAAC,EAAE,EAAE,EAAE,CACL,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,KAAK,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,EAAE,CAClF;aACA,IAAI,CAAC,MAAM,CAAC;QACjB,CAAC,CAAC,+EAA+E,CAAC;IACpF,OAAO,CACL,eAAe,KAAK,SAAS,EAAE,WAAW,IAAI,4BAA4B;QAC1E,KAAK,EAAE,MAAM,KAAK,MAAM;QACxB,mBAAmB,SAAS,MAAM;QAClC,6BAA6B,OAAO,MAAM;QAC1C,0IAA0I;QAC1I,0CAA0C,CAC3C,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,EAAE,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-parser.d.ts","sourceRoot":"","sources":["../../src/parse/spec-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAqD/D,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAkB7C"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { SpecZ } from '@manehorizons/cadence-types';
|
|
2
|
+
import { CadenceError } from '../errors.js';
|
|
3
|
+
// Helpers reproduced verbatim from draft-parser.ts (those are module-private
|
|
4
|
+
// there — not exported; copying is the only path, no shared refactor).
|
|
5
|
+
const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n/;
|
|
6
|
+
function parseFrontmatter(raw) {
|
|
7
|
+
const m = FRONTMATTER_RE.exec(raw);
|
|
8
|
+
if (!m)
|
|
9
|
+
throw new CadenceError('SPEC.md missing frontmatter');
|
|
10
|
+
const out = {};
|
|
11
|
+
for (const line of m[1].split('\n')) {
|
|
12
|
+
const [k, ...rest] = line.split(':');
|
|
13
|
+
if (k && rest.length > 0)
|
|
14
|
+
out[k.trim()] = rest.join(':').trim();
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
function stripFrontmatter(raw) {
|
|
19
|
+
return raw.replace(FRONTMATTER_RE, '');
|
|
20
|
+
}
|
|
21
|
+
function extractSection(body, heading) {
|
|
22
|
+
const re = new RegExp(`(^|\\n)## ${heading}\\s*\\n([\\s\\S]*?)(?=\\n## |$)`);
|
|
23
|
+
const m = re.exec(body);
|
|
24
|
+
return m ? m[2].trim() : '';
|
|
25
|
+
}
|
|
26
|
+
function parseAcceptanceCriteria(section) {
|
|
27
|
+
const out = [];
|
|
28
|
+
const blocks = section.split(/\n(?=### AC-)/);
|
|
29
|
+
for (const block of blocks) {
|
|
30
|
+
const head = /^### (AC-\d+):\s*(.*)$/m.exec(block);
|
|
31
|
+
if (!head)
|
|
32
|
+
continue;
|
|
33
|
+
const id = head[1];
|
|
34
|
+
const name = head[2]?.trim() ?? '';
|
|
35
|
+
const given = /Given\s+(.+)/.exec(block)?.[1]?.trim() ?? '';
|
|
36
|
+
const when = /When\s+(.+)/.exec(block)?.[1]?.trim() ?? '';
|
|
37
|
+
const then = /Then\s+(.+)/.exec(block)?.[1]?.trim() ?? '';
|
|
38
|
+
out.push({ id, name, given, when, then });
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
/** Generic `- ` bullet list (identical to draft-parser's parseBoundaries). */
|
|
43
|
+
function parseBulletList(section) {
|
|
44
|
+
return section
|
|
45
|
+
.split('\n')
|
|
46
|
+
.map((l) => l.replace(/^-\s*/, '').trim())
|
|
47
|
+
.filter((l) => l.length > 0);
|
|
48
|
+
}
|
|
49
|
+
export function parseSpecMd(raw) {
|
|
50
|
+
const fm = parseFrontmatter(raw);
|
|
51
|
+
const body = stripFrontmatter(raw);
|
|
52
|
+
const objective = extractSection(body, 'Objective').split('\n')[0] ?? '';
|
|
53
|
+
const acceptanceCriteria = parseAcceptanceCriteria(extractSection(body, 'Acceptance Criteria'));
|
|
54
|
+
const constraints = parseBulletList(extractSection(body, 'Constraints'));
|
|
55
|
+
const openQuestions = parseBulletList(extractSection(body, 'Open Questions'));
|
|
56
|
+
const spec = {
|
|
57
|
+
schemaVersion: 1,
|
|
58
|
+
id: fm.id ?? '',
|
|
59
|
+
phase: fm.phase ?? '',
|
|
60
|
+
objective,
|
|
61
|
+
acceptanceCriteria,
|
|
62
|
+
constraints,
|
|
63
|
+
openQuestions,
|
|
64
|
+
status: fm.status ?? 'PENDING',
|
|
65
|
+
};
|
|
66
|
+
return SpecZ.parse(spec);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=spec-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-parser.js","sourceRoot":"","sources":["../../src/parse/spec-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary-writer.d.ts","sourceRoot":"","sources":["../../src/parse/summary-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAE3D,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAoClD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function renderSummaryMd(s) {
|
|
2
|
+
const lines = [
|
|
3
|
+
`# SETTLE Summary — ${s.draftId}`,
|
|
4
|
+
'',
|
|
5
|
+
`**Completed:** ${s.completedAt}`,
|
|
6
|
+
'',
|
|
7
|
+
'## Acceptance Criteria',
|
|
8
|
+
'',
|
|
9
|
+
];
|
|
10
|
+
for (const ac of s.acResults) {
|
|
11
|
+
const badge = ac.pass ? 'PASS' : 'FAIL';
|
|
12
|
+
lines.push(`- ${ac.id}: ${badge}${ac.note ? ` — ${ac.note}` : ''}`);
|
|
13
|
+
}
|
|
14
|
+
lines.push('', '## Tasks', '');
|
|
15
|
+
for (const t of s.taskResults) {
|
|
16
|
+
lines.push(`- ${t.id}: ${t.status}${t.notes ? ` — ${t.notes}` : ''}`);
|
|
17
|
+
}
|
|
18
|
+
lines.push('', '## Decisions', '');
|
|
19
|
+
if (s.decisions.length === 0)
|
|
20
|
+
lines.push('_(none)_');
|
|
21
|
+
for (const d of s.decisions) {
|
|
22
|
+
lines.push(`- ${d.id} (${d.phase}): ${d.title}`);
|
|
23
|
+
}
|
|
24
|
+
lines.push('', '## Deferred', '');
|
|
25
|
+
if (s.deferred.length === 0)
|
|
26
|
+
lines.push('_(none)_');
|
|
27
|
+
for (const d of s.deferred) {
|
|
28
|
+
lines.push(`- ${d.id} (from ${d.from}): ${d.title}`);
|
|
29
|
+
}
|
|
30
|
+
lines.push('', '## Skill audit', '');
|
|
31
|
+
const required = new Set(s.skillAudit.required);
|
|
32
|
+
const invoked = new Set(s.skillAudit.invoked);
|
|
33
|
+
for (const r of required) {
|
|
34
|
+
lines.push(`- ${r}: ${invoked.has(r) ? 'invoked' : 'NOT INVOKED'}`);
|
|
35
|
+
}
|
|
36
|
+
if (required.size === 0)
|
|
37
|
+
lines.push('_(none)_');
|
|
38
|
+
lines.push('');
|
|
39
|
+
return lines.join('\n');
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=summary-writer.js.map
|