@arimakouyou/spec-workflow-mcp 2.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/.mcp.json +8 -0
- package/.claude-plugin/agents/code-simplifier.md +80 -0
- package/.claude-plugin/agents/integ-test-auditor.md +91 -0
- package/.claude-plugin/agents/integ-test-worker.md +73 -0
- package/.claude-plugin/agents/parallel-worker.md +136 -0
- package/.claude-plugin/agents/review-worker.md +279 -0
- package/.claude-plugin/agents/unit-test-engineer.md +148 -0
- package/.claude-plugin/agents/wave-harness-worker.md +158 -0
- package/.claude-plugin/hooks/hooks.json +16 -0
- package/.claude-plugin/hooks/tasks-read-guard.sh +17 -0
- package/.claude-plugin/marketplace.json +33 -0
- package/.claude-plugin/plugin.json +11 -0
- package/.claude-plugin/rules/axum.md +154 -0
- package/.claude-plugin/rules/cargo-toml.md +63 -0
- package/.claude-plugin/rules/context7.md +17 -0
- package/.claude-plugin/rules/design-conformance.md +82 -0
- package/.claude-plugin/rules/design-principles.md +53 -0
- package/.claude-plugin/rules/diesel.md +176 -0
- package/.claude-plugin/rules/feedback-loop.md +33 -0
- package/.claude-plugin/rules/leptos.md +319 -0
- package/.claude-plugin/rules/project-architecture.md +134 -0
- package/.claude-plugin/rules/quality-checks.md +265 -0
- package/.claude-plugin/rules/rust-style.md +242 -0
- package/.claude-plugin/rules/security.md +67 -0
- package/.claude-plugin/rules/spec-workflow-enforcement.md +47 -0
- package/.claude-plugin/rules/valkey.md +167 -0
- package/.claude-plugin/skills/integration-test/SKILL.md +230 -0
- package/.claude-plugin/skills/integration-test/references/auditor-prompt.md +78 -0
- package/.claude-plugin/skills/integration-test/references/external-api-mock.md +98 -0
- package/.claude-plugin/skills/integration-test/references/fixture-catalog.md +155 -0
- package/.claude-plugin/skills/integration-test/references/parallel-execution.md +124 -0
- package/.claude-plugin/skills/integration-test/references/quality-gate.md +80 -0
- package/.claude-plugin/skills/integration-test/references/test-case-design.md +88 -0
- package/.claude-plugin/skills/integration-test/references/test-patterns.md +215 -0
- package/.claude-plugin/skills/integration-test/references/whiteboard-template.md +81 -0
- package/.claude-plugin/skills/integration-test/references/worker-prompt.md +70 -0
- package/.claude-plugin/skills/knowhow-capture/SKILL.md +143 -0
- package/.claude-plugin/skills/phase-review-team/SKILL.md +380 -0
- package/.claude-plugin/skills/spec-design/SKILL.md +282 -0
- package/.claude-plugin/skills/spec-e2e-implement/SKILL.md +259 -0
- package/.claude-plugin/skills/spec-impl-code/SKILL.md +101 -0
- package/.claude-plugin/skills/spec-impl-review/SKILL.md +115 -0
- package/.claude-plugin/skills/spec-impl-test-run/SKILL.md +98 -0
- package/.claude-plugin/skills/spec-impl-test-write/SKILL.md +121 -0
- package/.claude-plugin/skills/spec-implement/SKILL.md +822 -0
- package/.claude-plugin/skills/spec-requirements/SKILL.md +130 -0
- package/.claude-plugin/skills/spec-review/SKILL.md +274 -0
- package/.claude-plugin/skills/spec-tasks/SKILL.md +372 -0
- package/.claude-plugin/skills/spec-test-design/SKILL.md +233 -0
- package/.claude-plugin/skills/tdd-skills/SKILL.md +95 -0
- package/.claude-plugin/skills/tdd-skills/references/advanced-techniques.md +49 -0
- package/.claude-plugin/skills/tdd-skills/references/green-strategies.md +70 -0
- package/.claude-plugin/skills/tdd-skills/references/tdd-and-design.md +48 -0
- package/.claude-plugin/skills/tdd-skills/references/test-design.md +43 -0
- package/.claude-plugin/skills/tdd-skills/references/test-doubles.md +53 -0
- package/.claude-plugin/skills/tdd-skills/references/test-patterns.md +40 -0
- package/.claude-plugin/skills/tdd-skills-rust/SKILL.md +128 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/advanced-techniques.md +205 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/green-strategies.md +166 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/tdd-and-design.md +215 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/test-design.md +128 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/test-doubles.md +208 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/test-patterns.md +223 -0
- package/.claude-plugin/with-dashboard/.mcp.json +8 -0
- package/.claude-plugin/with-dashboard/plugin.json +10 -0
- package/CHANGELOG.md +1007 -0
- package/LICENSE +674 -0
- package/README.ja.md +380 -0
- package/README.md +437 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +264 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/index-args.test.d.ts +2 -0
- package/dist/__tests__/index-args.test.d.ts.map +1 -0
- package/dist/__tests__/index-args.test.js +43 -0
- package/dist/__tests__/index-args.test.js.map +1 -0
- package/dist/__tests__/index-entrypoint.test.d.ts +2 -0
- package/dist/__tests__/index-entrypoint.test.d.ts.map +1 -0
- package/dist/__tests__/index-entrypoint.test.js +23 -0
- package/dist/__tests__/index-entrypoint.test.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +188 -0
- package/dist/config.js.map +1 -0
- package/dist/core/__tests__/git-utils.test.d.ts +2 -0
- package/dist/core/__tests__/git-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/git-utils.test.js +179 -0
- package/dist/core/__tests__/git-utils.test.js.map +1 -0
- package/dist/core/__tests__/mdx-validator.test.d.ts +2 -0
- package/dist/core/__tests__/mdx-validator.test.d.ts.map +1 -0
- package/dist/core/__tests__/mdx-validator.test.js +42 -0
- package/dist/core/__tests__/mdx-validator.test.js.map +1 -0
- package/dist/core/__tests__/path-utils.test.d.ts +2 -0
- package/dist/core/__tests__/path-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/path-utils.test.js +342 -0
- package/dist/core/__tests__/path-utils.test.js.map +1 -0
- package/dist/core/__tests__/project-registry.test.d.ts +2 -0
- package/dist/core/__tests__/project-registry.test.d.ts.map +1 -0
- package/dist/core/__tests__/project-registry.test.js +62 -0
- package/dist/core/__tests__/project-registry.test.js.map +1 -0
- package/dist/core/__tests__/security-utils.test.d.ts +2 -0
- package/dist/core/__tests__/security-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/security-utils.test.js +657 -0
- package/dist/core/__tests__/security-utils.test.js.map +1 -0
- package/dist/core/__tests__/task-parser.test.d.ts +2 -0
- package/dist/core/__tests__/task-parser.test.d.ts.map +1 -0
- package/dist/core/__tests__/task-parser.test.js +222 -0
- package/dist/core/__tests__/task-parser.test.js.map +1 -0
- package/dist/core/__tests__/task-validator.test.d.ts +2 -0
- package/dist/core/__tests__/task-validator.test.d.ts.map +1 -0
- package/dist/core/__tests__/task-validator.test.js +308 -0
- package/dist/core/__tests__/task-validator.test.js.map +1 -0
- package/dist/core/archive-service.d.ts +10 -0
- package/dist/core/archive-service.d.ts.map +1 -0
- package/dist/core/archive-service.js +99 -0
- package/dist/core/archive-service.js.map +1 -0
- package/dist/core/dashboard-session.d.ts +49 -0
- package/dist/core/dashboard-session.d.ts.map +1 -0
- package/dist/core/dashboard-session.js +132 -0
- package/dist/core/dashboard-session.js.map +1 -0
- package/dist/core/git-utils.d.ts +25 -0
- package/dist/core/git-utils.d.ts.map +1 -0
- package/dist/core/git-utils.js +87 -0
- package/dist/core/git-utils.js.map +1 -0
- package/dist/core/global-dir.d.ts +44 -0
- package/dist/core/global-dir.d.ts.map +1 -0
- package/dist/core/global-dir.js +74 -0
- package/dist/core/global-dir.js.map +1 -0
- package/dist/core/implementation-log-migrator.d.ts +41 -0
- package/dist/core/implementation-log-migrator.d.ts.map +1 -0
- package/dist/core/implementation-log-migrator.js +258 -0
- package/dist/core/implementation-log-migrator.js.map +1 -0
- package/dist/core/mdx-validator.d.ts +14 -0
- package/dist/core/mdx-validator.d.ts.map +1 -0
- package/dist/core/mdx-validator.js +34 -0
- package/dist/core/mdx-validator.js.map +1 -0
- package/dist/core/parser.d.ts +11 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +128 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/path-utils.d.ts +68 -0
- package/dist/core/path-utils.d.ts.map +1 -0
- package/dist/core/path-utils.js +302 -0
- package/dist/core/path-utils.js.map +1 -0
- package/dist/core/project-registry.d.ts +94 -0
- package/dist/core/project-registry.d.ts.map +1 -0
- package/dist/core/project-registry.js +297 -0
- package/dist/core/project-registry.js.map +1 -0
- package/dist/core/security-utils.d.ts +99 -0
- package/dist/core/security-utils.d.ts.map +1 -0
- package/dist/core/security-utils.js +275 -0
- package/dist/core/security-utils.js.map +1 -0
- package/dist/core/task-parser.d.ts +90 -0
- package/dist/core/task-parser.d.ts.map +1 -0
- package/dist/core/task-parser.js +477 -0
- package/dist/core/task-parser.js.map +1 -0
- package/dist/core/task-validator.d.ts +37 -0
- package/dist/core/task-validator.d.ts.map +1 -0
- package/dist/core/task-validator.js +499 -0
- package/dist/core/task-validator.js.map +1 -0
- package/dist/core/workspace-initializer.d.ts +16 -0
- package/dist/core/workspace-initializer.d.ts.map +1 -0
- package/dist/core/workspace-initializer.js +168 -0
- package/dist/core/workspace-initializer.js.map +1 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts +2 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js +78 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js.map +1 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts +2 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +115 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts +2 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.js +118 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.js.map +1 -0
- package/dist/dashboard/approval-storage.d.ts +139 -0
- package/dist/dashboard/approval-storage.d.ts.map +1 -0
- package/dist/dashboard/approval-storage.js +608 -0
- package/dist/dashboard/approval-storage.js.map +1 -0
- package/dist/dashboard/execution-history-manager.d.ts +52 -0
- package/dist/dashboard/execution-history-manager.d.ts.map +1 -0
- package/dist/dashboard/execution-history-manager.js +161 -0
- package/dist/dashboard/execution-history-manager.js.map +1 -0
- package/dist/dashboard/implementation-log-manager.d.ts +97 -0
- package/dist/dashboard/implementation-log-manager.d.ts.map +1 -0
- package/dist/dashboard/implementation-log-manager.js +617 -0
- package/dist/dashboard/implementation-log-manager.js.map +1 -0
- package/dist/dashboard/job-scheduler.d.ts +91 -0
- package/dist/dashboard/job-scheduler.d.ts.map +1 -0
- package/dist/dashboard/job-scheduler.js +321 -0
- package/dist/dashboard/job-scheduler.js.map +1 -0
- package/dist/dashboard/multi-server.d.ts +42 -0
- package/dist/dashboard/multi-server.d.ts.map +1 -0
- package/dist/dashboard/multi-server.js +1460 -0
- package/dist/dashboard/multi-server.js.map +1 -0
- package/dist/dashboard/parser.d.ts +18 -0
- package/dist/dashboard/parser.d.ts.map +1 -0
- package/dist/dashboard/parser.js +269 -0
- package/dist/dashboard/parser.js.map +1 -0
- package/dist/dashboard/project-manager.d.ts +82 -0
- package/dist/dashboard/project-manager.d.ts.map +1 -0
- package/dist/dashboard/project-manager.js +257 -0
- package/dist/dashboard/project-manager.js.map +1 -0
- package/dist/dashboard/public/assets/Inter-Bold-CD3Pr7BX.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-Medium-B_8v_WHh.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-Regular-DRVdRqcI.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-SemiBold-CtskMddL.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Bold-D4WEaHbo.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Medium-3S3k2nMz.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Regular-BQaDgvhP.woff2 +0 -0
- package/dist/dashboard/public/assets/Tableau10-B-NsZVaP.js +1 -0
- package/dist/dashboard/public/assets/apl-B4CMkyY2.js +1 -0
- package/dist/dashboard/public/assets/arc-a5wW942W.js +1 -0
- package/dist/dashboard/public/assets/array-BKyUJesY.js +1 -0
- package/dist/dashboard/public/assets/asciiarmor-Df11BRmG.js +1 -0
- package/dist/dashboard/public/assets/asn1-EdZsLKOL.js +1 -0
- package/dist/dashboard/public/assets/asterisk-B-8jnY81.js +1 -0
- package/dist/dashboard/public/assets/blockDiagram-c4efeb88-CvjTuK-w.js +118 -0
- package/dist/dashboard/public/assets/brainfuck-C4LP7Hcl.js +1 -0
- package/dist/dashboard/public/assets/c4Diagram-c83219d4-NwVQo5kf.js +10 -0
- package/dist/dashboard/public/assets/channel-Bi16YZhk.js +1 -0
- package/dist/dashboard/public/assets/classDiagram-beda092f-BmSeXDdU.js +2 -0
- package/dist/dashboard/public/assets/classDiagram-v2-2358418a-D7GvvuPr.js +2 -0
- package/dist/dashboard/public/assets/clike-B9uivgTg.js +1 -0
- package/dist/dashboard/public/assets/clojure-BMjYHr_A.js +1 -0
- package/dist/dashboard/public/assets/clone-BpKTiq7P.js +1 -0
- package/dist/dashboard/public/assets/cmake-BQqOBYOt.js +1 -0
- package/dist/dashboard/public/assets/cobol-CWcv1MsR.js +1 -0
- package/dist/dashboard/public/assets/coffeescript-S37ZYGWr.js +1 -0
- package/dist/dashboard/public/assets/commonlisp-DBKNyK5s.js +1 -0
- package/dist/dashboard/public/assets/createText-1719965b-qASbqHUP.js +7 -0
- package/dist/dashboard/public/assets/crystal-SjHAIU92.js +1 -0
- package/dist/dashboard/public/assets/css-BnMrqG3P.js +1 -0
- package/dist/dashboard/public/assets/cypher-C_CwsFkJ.js +1 -0
- package/dist/dashboard/public/assets/d-pRatUO7H.js +1 -0
- package/dist/dashboard/public/assets/diff-DbItnlRl.js +1 -0
- package/dist/dashboard/public/assets/dockerfile-BKs6k2Af.js +1 -0
- package/dist/dashboard/public/assets/dtd-DF_7sFjM.js +1 -0
- package/dist/dashboard/public/assets/dylan-DwRh75JA.js +1 -0
- package/dist/dashboard/public/assets/ebnf-CDyGwa7X.js +1 -0
- package/dist/dashboard/public/assets/ecl-Cabwm37j.js +1 -0
- package/dist/dashboard/public/assets/edges-96097737-BItTSnH7.js +4 -0
- package/dist/dashboard/public/assets/eiffel-CnydiIhH.js +1 -0
- package/dist/dashboard/public/assets/elm-vLlmbW-K.js +1 -0
- package/dist/dashboard/public/assets/erDiagram-0228fc6a-DT224olg.js +51 -0
- package/dist/dashboard/public/assets/erlang-BNw1qcRV.js +1 -0
- package/dist/dashboard/public/assets/factor-kuTfRLto.js +1 -0
- package/dist/dashboard/public/assets/fcl-Kvtd6kyn.js +1 -0
- package/dist/dashboard/public/assets/flowDb-c6c81e3f-D9_ukKtv.js +10 -0
- package/dist/dashboard/public/assets/flowDiagram-50d868cf-CylE8siG.js +4 -0
- package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-B2O3JN7Y.js +1 -0
- package/dist/dashboard/public/assets/flowchart-elk-definition-6af322e1-BCaqFKf3.js +139 -0
- package/dist/dashboard/public/assets/forth-Ffai-XNe.js +1 -0
- package/dist/dashboard/public/assets/fortran-DYz_wnZ1.js +1 -0
- package/dist/dashboard/public/assets/ganttDiagram-a2739b55-WQUL1QW_.js +257 -0
- package/dist/dashboard/public/assets/gas-Bneqetm1.js +1 -0
- package/dist/dashboard/public/assets/gherkin-heZmZLOM.js +1 -0
- package/dist/dashboard/public/assets/gitGraphDiagram-82fe8481-CttZrdmr.js +70 -0
- package/dist/dashboard/public/assets/graph-Ch-rVueN.js +1 -0
- package/dist/dashboard/public/assets/groovy-D9Dt4D0W.js +1 -0
- package/dist/dashboard/public/assets/haskell-Cw1EW3IL.js +1 -0
- package/dist/dashboard/public/assets/haxe-H-WmDvRZ.js +1 -0
- package/dist/dashboard/public/assets/http-DBlCnlav.js +1 -0
- package/dist/dashboard/public/assets/idl-BEugSyMb.js +1 -0
- package/dist/dashboard/public/assets/index--kbPpDKv.js +1 -0
- package/dist/dashboard/public/assets/index-3scDwWm6.js +1 -0
- package/dist/dashboard/public/assets/index-5325376f-BL2zVOJU.js +1 -0
- package/dist/dashboard/public/assets/index-BZdjbO25.js +1 -0
- package/dist/dashboard/public/assets/index-BmA_batZ.js +1 -0
- package/dist/dashboard/public/assets/index-Bu0u99kF.js +2 -0
- package/dist/dashboard/public/assets/index-Ch-lr7F4.js +1 -0
- package/dist/dashboard/public/assets/index-ClgWbdoq.js +1 -0
- package/dist/dashboard/public/assets/index-CzLwOMQ_.js +3 -0
- package/dist/dashboard/public/assets/index-DAOEjGO7.js +1 -0
- package/dist/dashboard/public/assets/index-DXqf0B9c.js +1 -0
- package/dist/dashboard/public/assets/index-DegWdR16.js +1 -0
- package/dist/dashboard/public/assets/index-DiHyYGim.js +1 -0
- package/dist/dashboard/public/assets/index-DlZtG7I5.js +1 -0
- package/dist/dashboard/public/assets/index-DmhGE2M8.js +1 -0
- package/dist/dashboard/public/assets/index-QEGvld4x.js +1 -0
- package/dist/dashboard/public/assets/index-RfZPGAJu.js +1 -0
- package/dist/dashboard/public/assets/index-UybBj_7u.js +319 -0
- package/dist/dashboard/public/assets/index-bVekzPnl.js +7 -0
- package/dist/dashboard/public/assets/index-f5bysQzW.css +1 -0
- package/dist/dashboard/public/assets/infoDiagram-8eee0895-DjzkkE3o.js +7 -0
- package/dist/dashboard/public/assets/init-Gi6I4Gst.js +1 -0
- package/dist/dashboard/public/assets/javascript-iXu5QeM3.js +1 -0
- package/dist/dashboard/public/assets/journeyDiagram-c64418c1-CxPZkNdB.js +139 -0
- package/dist/dashboard/public/assets/julia-DuME0IfC.js +1 -0
- package/dist/dashboard/public/assets/katex-XbL3y5x-.js +261 -0
- package/dist/dashboard/public/assets/layout-DX7DNTRm.js +1 -0
- package/dist/dashboard/public/assets/line-DfvpmKOn.js +1 -0
- package/dist/dashboard/public/assets/linear-gQbBPHO5.js +1 -0
- package/dist/dashboard/public/assets/livescript-BwQOo05w.js +1 -0
- package/dist/dashboard/public/assets/lua-BgMRiT3U.js +1 -0
- package/dist/dashboard/public/assets/mathematica-DTrFuWx2.js +1 -0
- package/dist/dashboard/public/assets/mbox-CNhZ1qSd.js +1 -0
- package/dist/dashboard/public/assets/mindmap-definition-8da855dc-CNxmpyG6.js +415 -0
- package/dist/dashboard/public/assets/mirc-CjQqDB4T.js +1 -0
- package/dist/dashboard/public/assets/mllike-CXdrOF99.js +1 -0
- package/dist/dashboard/public/assets/modelica-Dc1JOy9r.js +1 -0
- package/dist/dashboard/public/assets/mscgen-BA5vi2Kp.js +1 -0
- package/dist/dashboard/public/assets/mumps-BT43cFF4.js +1 -0
- package/dist/dashboard/public/assets/nginx-DdIZxoE0.js +1 -0
- package/dist/dashboard/public/assets/nsis-LdVXkNf5.js +1 -0
- package/dist/dashboard/public/assets/ntriples-BfvgReVJ.js +1 -0
- package/dist/dashboard/public/assets/octave-Ck1zUtKM.js +1 -0
- package/dist/dashboard/public/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/dashboard/public/assets/oz-BzwKVEFT.js +1 -0
- package/dist/dashboard/public/assets/pascal--L3eBynH.js +1 -0
- package/dist/dashboard/public/assets/path-CbwjOpE9.js +1 -0
- package/dist/dashboard/public/assets/perl-CdXCOZ3F.js +1 -0
- package/dist/dashboard/public/assets/pieDiagram-a8764435-D-xy_NSA.js +35 -0
- package/dist/dashboard/public/assets/pig-CevX1Tat.js +1 -0
- package/dist/dashboard/public/assets/powershell-CFHJl5sT.js +1 -0
- package/dist/dashboard/public/assets/properties-C78fOPTZ.js +1 -0
- package/dist/dashboard/public/assets/protobuf-ChK-085T.js +1 -0
- package/dist/dashboard/public/assets/pug-DeIclll2.js +1 -0
- package/dist/dashboard/public/assets/puppet-DMA9R1ak.js +1 -0
- package/dist/dashboard/public/assets/python-BuPzkPfP.js +1 -0
- package/dist/dashboard/public/assets/q-pXgVlZs6.js +1 -0
- package/dist/dashboard/public/assets/quadrantDiagram-1e28029f-BoL2wzz0.js +7 -0
- package/dist/dashboard/public/assets/r-B6wPVr8A.js +1 -0
- package/dist/dashboard/public/assets/requirementDiagram-08caed73-BujFz0q1.js +52 -0
- package/dist/dashboard/public/assets/rpm-CTu-6PCP.js +1 -0
- package/dist/dashboard/public/assets/ruby-B2Rjki9n.js +1 -0
- package/dist/dashboard/public/assets/sankeyDiagram-a04cb91d-D03_NARm.js +8 -0
- package/dist/dashboard/public/assets/sas-B4kiWyti.js +1 -0
- package/dist/dashboard/public/assets/scheme-C41bIUwD.js +1 -0
- package/dist/dashboard/public/assets/sequenceDiagram-c5b8d532-B65eFcaT.js +122 -0
- package/dist/dashboard/public/assets/shell-CjFT_Tl9.js +1 -0
- package/dist/dashboard/public/assets/sieve-C3Gn_uJK.js +1 -0
- package/dist/dashboard/public/assets/simple-mode-GW_nhZxv.js +1 -0
- package/dist/dashboard/public/assets/smalltalk-CnHTOXQT.js +1 -0
- package/dist/dashboard/public/assets/solr-DehyRSwq.js +1 -0
- package/dist/dashboard/public/assets/sparql-DkYu6x3z.js +1 -0
- package/dist/dashboard/public/assets/spreadsheet-BCZA_wO0.js +1 -0
- package/dist/dashboard/public/assets/sql-D0XecflT.js +1 -0
- package/dist/dashboard/public/assets/stateDiagram-1ecb1508-BDbqu0Vl.js +1 -0
- package/dist/dashboard/public/assets/stateDiagram-v2-c2b004d7-CBHvk4b8.js +1 -0
- package/dist/dashboard/public/assets/stex-C3f8Ysf7.js +1 -0
- package/dist/dashboard/public/assets/styles-b4e223ce-CELsPqaO.js +160 -0
- package/dist/dashboard/public/assets/styles-ca3715f6-BRqMqT6F.js +207 -0
- package/dist/dashboard/public/assets/styles-d45a18b0-e8N-oLPy.js +116 -0
- package/dist/dashboard/public/assets/stylus-B533Al4x.js +1 -0
- package/dist/dashboard/public/assets/svgDrawCommon-b86b1483-vNDtmQc-.js +1 -0
- package/dist/dashboard/public/assets/swift-BzpIVaGY.js +1 -0
- package/dist/dashboard/public/assets/tcl-DVfN8rqt.js +1 -0
- package/dist/dashboard/public/assets/textile-CnDTJFAw.js +1 -0
- package/dist/dashboard/public/assets/tiddlywiki-DO-Gjzrf.js +1 -0
- package/dist/dashboard/public/assets/tiki-DGYXhP31.js +1 -0
- package/dist/dashboard/public/assets/timeline-definition-faaaa080-Dh2_A5VU.js +61 -0
- package/dist/dashboard/public/assets/toml-Bm5Em-hy.js +1 -0
- package/dist/dashboard/public/assets/troff-wAsdV37c.js +1 -0
- package/dist/dashboard/public/assets/ttcn-CfJYG6tj.js +1 -0
- package/dist/dashboard/public/assets/ttcn-cfg-B9xdYoR4.js +1 -0
- package/dist/dashboard/public/assets/turtle-B1tBg_DP.js +1 -0
- package/dist/dashboard/public/assets/vb-CmGdzxic.js +1 -0
- package/dist/dashboard/public/assets/vbscript-BuJXcnF6.js +1 -0
- package/dist/dashboard/public/assets/velocity-D8B20fx6.js +1 -0
- package/dist/dashboard/public/assets/verilog-C6RDOZhf.js +1 -0
- package/dist/dashboard/public/assets/vhdl-lSbBsy5d.js +1 -0
- package/dist/dashboard/public/assets/webidl-ZXfAyPTL.js +1 -0
- package/dist/dashboard/public/assets/xquery-DzFWVndE.js +1 -0
- package/dist/dashboard/public/assets/xychartDiagram-f5964ef8-B76v1AVF.js +7 -0
- package/dist/dashboard/public/assets/yacas-BJ4BC0dw.js +1 -0
- package/dist/dashboard/public/assets/z80-Hz9HOZM7.js +1 -0
- package/dist/dashboard/public/claude-icon-dark.svg +1 -0
- package/dist/dashboard/public/claude-icon.svg +1 -0
- package/dist/dashboard/public/index.html +16 -0
- package/dist/dashboard/settings-manager.d.ts +47 -0
- package/dist/dashboard/settings-manager.d.ts.map +1 -0
- package/dist/dashboard/settings-manager.js +180 -0
- package/dist/dashboard/settings-manager.js.map +1 -0
- package/dist/dashboard/utils.d.ts +31 -0
- package/dist/dashboard/utils.d.ts.map +1 -0
- package/dist/dashboard/utils.js +102 -0
- package/dist/dashboard/utils.js.map +1 -0
- package/dist/dashboard/watcher.d.ts +32 -0
- package/dist/dashboard/watcher.d.ts.map +1 -0
- package/dist/dashboard/watcher.js +173 -0
- package/dist/dashboard/watcher.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +380 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/templates/design-template.md +126 -0
- package/dist/markdown/templates/product-template.md +51 -0
- package/dist/markdown/templates/requirements-template.md +50 -0
- package/dist/markdown/templates/structure-template.md +145 -0
- package/dist/markdown/templates/tasks-template.md +100 -0
- package/dist/markdown/templates/tech-template.md +99 -0
- package/dist/markdown/templates/test-design-template.md +221 -0
- package/dist/prompts/create-spec.d.ts +3 -0
- package/dist/prompts/create-spec.d.ts.map +1 -0
- package/dist/prompts/create-spec.js +97 -0
- package/dist/prompts/create-spec.js.map +1 -0
- package/dist/prompts/create-steering-doc.d.ts +3 -0
- package/dist/prompts/create-steering-doc.d.ts.map +1 -0
- package/dist/prompts/create-steering-doc.js +75 -0
- package/dist/prompts/create-steering-doc.js.map +1 -0
- package/dist/prompts/implement-task.d.ts +3 -0
- package/dist/prompts/implement-task.d.ts.map +1 -0
- package/dist/prompts/implement-task.js +174 -0
- package/dist/prompts/implement-task.js.map +1 -0
- package/dist/prompts/index.d.ts +20 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +103 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/inject-spec-workflow-guide.d.ts +3 -0
- package/dist/prompts/inject-spec-workflow-guide.d.ts.map +1 -0
- package/dist/prompts/inject-spec-workflow-guide.js +60 -0
- package/dist/prompts/inject-spec-workflow-guide.js.map +1 -0
- package/dist/prompts/inject-steering-guide.d.ts +3 -0
- package/dist/prompts/inject-steering-guide.d.ts.map +1 -0
- package/dist/prompts/inject-steering-guide.js +64 -0
- package/dist/prompts/inject-steering-guide.js.map +1 -0
- package/dist/prompts/refresh-tasks.d.ts +3 -0
- package/dist/prompts/refresh-tasks.d.ts.map +1 -0
- package/dist/prompts/refresh-tasks.js +237 -0
- package/dist/prompts/refresh-tasks.js.map +1 -0
- package/dist/prompts/spec-status.d.ts +3 -0
- package/dist/prompts/spec-status.d.ts.map +1 -0
- package/dist/prompts/spec-status.js +77 -0
- package/dist/prompts/spec-status.js.map +1 -0
- package/dist/prompts/types.d.ts +13 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +2 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +175 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.d.ts +2 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.d.ts.map +1 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.js +190 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.js.map +1 -0
- package/dist/tools/__tests__/projectPath.test.d.ts +2 -0
- package/dist/tools/__tests__/projectPath.test.d.ts.map +1 -0
- package/dist/tools/__tests__/projectPath.test.js +187 -0
- package/dist/tools/__tests__/projectPath.test.js.map +1 -0
- package/dist/tools/approvals.d.ts +14 -0
- package/dist/tools/approvals.d.ts.map +1 -0
- package/dist/tools/approvals.js +505 -0
- package/dist/tools/approvals.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/log-implementation.d.ts +5 -0
- package/dist/tools/log-implementation.d.ts.map +1 -0
- package/dist/tools/log-implementation.js +498 -0
- package/dist/tools/log-implementation.js.map +1 -0
- package/dist/tools/spec-status.d.ts +5 -0
- package/dist/tools/spec-status.d.ts.map +1 -0
- package/dist/tools/spec-status.js +192 -0
- package/dist/tools/spec-status.js.map +1 -0
- package/dist/tools/spec-workflow-guide.d.ts +5 -0
- package/dist/tools/spec-workflow-guide.d.ts.map +1 -0
- package/dist/tools/spec-workflow-guide.js +116 -0
- package/dist/tools/spec-workflow-guide.js.map +1 -0
- package/dist/tools/steering-guide.d.ts +5 -0
- package/dist/tools/steering-guide.d.ts.map +1 -0
- package/dist/tools/steering-guide.js +192 -0
- package/dist/tools/steering-guide.js.map +1 -0
- package/dist/types.d.ts +183 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { promises as fs } from 'fs';
|
|
3
|
+
import { join, isAbsolute, resolve, basename } from 'path';
|
|
4
|
+
import chokidar from 'chokidar';
|
|
5
|
+
import { diffLines } from 'diff';
|
|
6
|
+
import { PathUtils } from '../core/path-utils.js';
|
|
7
|
+
export class ApprovalStorage extends EventEmitter {
|
|
8
|
+
projectPath; // Workflow root path (.spec-workflow location)
|
|
9
|
+
originalProjectPath; // Original workflow root path for display/registry
|
|
10
|
+
fileResolutionPath; // Base path for resolving approval filePath artifacts
|
|
11
|
+
approvalsDir;
|
|
12
|
+
watcher;
|
|
13
|
+
pendingEmit = null;
|
|
14
|
+
DEBOUNCE_MS = 500;
|
|
15
|
+
constructor(translatedPath, options = {}) {
|
|
16
|
+
super();
|
|
17
|
+
// Validate project path
|
|
18
|
+
if (!translatedPath || translatedPath.trim() === '') {
|
|
19
|
+
throw new Error('Project path cannot be empty');
|
|
20
|
+
}
|
|
21
|
+
// Resolve to absolute path (already translated by caller)
|
|
22
|
+
const resolvedPath = resolve(translatedPath);
|
|
23
|
+
// Prevent root directory usage which causes permission errors
|
|
24
|
+
if (resolvedPath === '/' || resolvedPath === '\\' || resolvedPath.match(/^[A-Z]:\\?$/)) {
|
|
25
|
+
throw new Error(`Invalid project path: ${resolvedPath}. Cannot use root directory for spec workflow.`);
|
|
26
|
+
}
|
|
27
|
+
this.projectPath = resolvedPath;
|
|
28
|
+
// Store original path for display/registry (fall back to translated if not provided)
|
|
29
|
+
this.originalProjectPath = resolve(options.originalPath ?? translatedPath);
|
|
30
|
+
// Relative approval file paths are resolved against workspace path by default.
|
|
31
|
+
// Falls back to workflow root path when files only exist in shared .spec-workflow root.
|
|
32
|
+
this.fileResolutionPath = resolve(options.fileResolutionPath ?? translatedPath);
|
|
33
|
+
this.approvalsDir = PathUtils.getApprovalsPath(resolvedPath);
|
|
34
|
+
}
|
|
35
|
+
async start() {
|
|
36
|
+
// Create the approvals directory (empty) so watcher can establish properly
|
|
37
|
+
await fs.mkdir(this.approvalsDir, { recursive: true });
|
|
38
|
+
// Set up file watcher for approval directory and all subdirectories
|
|
39
|
+
// This will catch new directories and files created dynamically
|
|
40
|
+
this.watcher = chokidar.watch(`${this.approvalsDir}/**/*.json`, {
|
|
41
|
+
ignoreInitial: false,
|
|
42
|
+
persistent: true,
|
|
43
|
+
ignorePermissionErrors: true
|
|
44
|
+
});
|
|
45
|
+
this.watcher.on('add', () => this.scheduleApprovalChangeEmit());
|
|
46
|
+
this.watcher.on('change', () => this.scheduleApprovalChangeEmit());
|
|
47
|
+
this.watcher.on('unlink', () => this.scheduleApprovalChangeEmit());
|
|
48
|
+
// Add error handler to prevent watcher crashes
|
|
49
|
+
this.watcher.on('error', (error) => {
|
|
50
|
+
console.error('Approval watcher error:', error);
|
|
51
|
+
// Don't propagate error to prevent system crash
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Schedule a debounced approval-change event emission
|
|
56
|
+
* Coalesces rapid changes to prevent event flooding
|
|
57
|
+
*/
|
|
58
|
+
scheduleApprovalChangeEmit() {
|
|
59
|
+
if (this.pendingEmit) {
|
|
60
|
+
clearTimeout(this.pendingEmit);
|
|
61
|
+
}
|
|
62
|
+
this.pendingEmit = setTimeout(() => {
|
|
63
|
+
this.pendingEmit = null;
|
|
64
|
+
this.emit('approval-change');
|
|
65
|
+
}, this.DEBOUNCE_MS);
|
|
66
|
+
}
|
|
67
|
+
async stop() {
|
|
68
|
+
// Clear pending debounced emit
|
|
69
|
+
if (this.pendingEmit) {
|
|
70
|
+
clearTimeout(this.pendingEmit);
|
|
71
|
+
this.pendingEmit = null;
|
|
72
|
+
}
|
|
73
|
+
if (this.watcher) {
|
|
74
|
+
// Remove all listeners before closing to prevent memory leaks
|
|
75
|
+
this.watcher.removeAllListeners();
|
|
76
|
+
await this.watcher.close();
|
|
77
|
+
this.watcher = undefined;
|
|
78
|
+
}
|
|
79
|
+
// Clean up EventEmitter listeners
|
|
80
|
+
this.removeAllListeners();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Candidate resolution order for relative approval file paths:
|
|
84
|
+
* 1) Workspace/worktree base (fileResolutionPath)
|
|
85
|
+
* 2) Shared workflow root (projectPath)
|
|
86
|
+
*/
|
|
87
|
+
getFilePathCandidates(filePath) {
|
|
88
|
+
// Security: reject absolute paths and path traversal
|
|
89
|
+
if (isAbsolute(filePath)) {
|
|
90
|
+
throw new Error('Security error: absolute paths are not allowed for filePath');
|
|
91
|
+
}
|
|
92
|
+
if (filePath.includes('..')) {
|
|
93
|
+
throw new Error('Security error: path traversal (..) is not allowed in filePath');
|
|
94
|
+
}
|
|
95
|
+
const candidates = [
|
|
96
|
+
PathUtils.safeJoin(this.fileResolutionPath, filePath),
|
|
97
|
+
PathUtils.safeJoin(this.projectPath, filePath)
|
|
98
|
+
];
|
|
99
|
+
// Verify resolved paths stay within allowed directories
|
|
100
|
+
for (const candidate of candidates) {
|
|
101
|
+
PathUtils.validatePathWithinBases(resolve(candidate), [
|
|
102
|
+
resolve(this.fileResolutionPath),
|
|
103
|
+
resolve(this.projectPath)
|
|
104
|
+
]);
|
|
105
|
+
}
|
|
106
|
+
return Array.from(new Set(candidates));
|
|
107
|
+
}
|
|
108
|
+
async resolveExistingFilePath(filePath) {
|
|
109
|
+
const candidates = this.getFilePathCandidates(filePath);
|
|
110
|
+
for (const candidate of candidates) {
|
|
111
|
+
try {
|
|
112
|
+
await fs.access(candidate);
|
|
113
|
+
return candidate;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Try next candidate
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
async resolveFilePathForWrite(filePath) {
|
|
122
|
+
// Security: reject absolute paths and path traversal
|
|
123
|
+
if (isAbsolute(filePath)) {
|
|
124
|
+
throw new Error('Security error: absolute paths are not allowed for filePath');
|
|
125
|
+
}
|
|
126
|
+
if (filePath.includes('..')) {
|
|
127
|
+
throw new Error('Security error: path traversal (..) is not allowed in filePath');
|
|
128
|
+
}
|
|
129
|
+
const existingPath = await this.resolveExistingFilePath(filePath);
|
|
130
|
+
if (existingPath) {
|
|
131
|
+
return existingPath;
|
|
132
|
+
}
|
|
133
|
+
return PathUtils.safeJoin(this.fileResolutionPath, filePath);
|
|
134
|
+
}
|
|
135
|
+
async createApproval(title, filePath, category, categoryName, type = 'document', metadata) {
|
|
136
|
+
// Security: validate filePath before storing
|
|
137
|
+
if (isAbsolute(filePath)) {
|
|
138
|
+
throw new Error('Security error: absolute paths are not allowed for filePath');
|
|
139
|
+
}
|
|
140
|
+
if (filePath.includes('..')) {
|
|
141
|
+
throw new Error('Security error: path traversal (..) is not allowed in filePath');
|
|
142
|
+
}
|
|
143
|
+
const id = this.generateId();
|
|
144
|
+
const approval = {
|
|
145
|
+
id,
|
|
146
|
+
title,
|
|
147
|
+
filePath,
|
|
148
|
+
type,
|
|
149
|
+
status: 'pending',
|
|
150
|
+
createdAt: new Date().toISOString(),
|
|
151
|
+
metadata,
|
|
152
|
+
category,
|
|
153
|
+
categoryName
|
|
154
|
+
};
|
|
155
|
+
// Create category directory if it doesn't exist
|
|
156
|
+
const categoryDir = join(this.approvalsDir, categoryName);
|
|
157
|
+
await fs.mkdir(categoryDir, { recursive: true });
|
|
158
|
+
const approvalFilePath = join(categoryDir, `${id}.json`);
|
|
159
|
+
await fs.writeFile(approvalFilePath, JSON.stringify(approval, null, 2), 'utf-8');
|
|
160
|
+
// Capture initial snapshot
|
|
161
|
+
try {
|
|
162
|
+
await this.captureSnapshot(id, 'initial');
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
// Log error but don't fail the approval creation
|
|
166
|
+
console.warn(`Failed to capture initial snapshot for approval ${id}:`, error);
|
|
167
|
+
}
|
|
168
|
+
return id;
|
|
169
|
+
}
|
|
170
|
+
async getApproval(id) {
|
|
171
|
+
// Search across all categories and names
|
|
172
|
+
try {
|
|
173
|
+
const approvalPath = await this.findApprovalPath(id);
|
|
174
|
+
if (!approvalPath)
|
|
175
|
+
return null;
|
|
176
|
+
const content = await fs.readFile(approvalPath, 'utf-8');
|
|
177
|
+
return JSON.parse(content);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async findApprovalPath(id) {
|
|
184
|
+
// Search in approvals directory directly (no 'specs' subfolder)
|
|
185
|
+
try {
|
|
186
|
+
const categoryNames = await fs.readdir(this.approvalsDir, { withFileTypes: true });
|
|
187
|
+
for (const categoryName of categoryNames) {
|
|
188
|
+
if (categoryName.isDirectory()) {
|
|
189
|
+
const approvalPath = join(this.approvalsDir, categoryName.name, `${id}.json`);
|
|
190
|
+
try {
|
|
191
|
+
await fs.access(approvalPath);
|
|
192
|
+
return approvalPath;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// File doesn't exist in this location, continue searching
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// Approvals directory doesn't exist
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
async updateApproval(id, status, response, annotations, comments) {
|
|
206
|
+
const approval = await this.getApproval(id);
|
|
207
|
+
if (!approval) {
|
|
208
|
+
throw new Error(`Approval ${id} not found`);
|
|
209
|
+
}
|
|
210
|
+
// Capture snapshot before status change for certain transitions
|
|
211
|
+
if (status === 'needs-revision') {
|
|
212
|
+
try {
|
|
213
|
+
await this.captureSnapshot(id, 'revision_requested');
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
console.warn(`Failed to capture revision snapshot for approval ${id}:`, error);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else if (status === 'approved') {
|
|
220
|
+
try {
|
|
221
|
+
await this.captureSnapshot(id, 'approved');
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
console.warn(`Failed to capture approval snapshot for approval ${id}:`, error);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
approval.status = status;
|
|
228
|
+
approval.response = response;
|
|
229
|
+
approval.annotations = annotations;
|
|
230
|
+
approval.respondedAt = new Date().toISOString();
|
|
231
|
+
if (comments) {
|
|
232
|
+
approval.comments = comments;
|
|
233
|
+
}
|
|
234
|
+
const filePath = await this.findApprovalPath(id);
|
|
235
|
+
if (!filePath) {
|
|
236
|
+
throw new Error(`Approval ${id} file not found`);
|
|
237
|
+
}
|
|
238
|
+
await fs.writeFile(filePath, JSON.stringify(approval, null, 2), 'utf-8');
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Revert an approval back to pending status, clearing response and timestamp
|
|
242
|
+
* Used for undo operations after batch approvals/rejections
|
|
243
|
+
*/
|
|
244
|
+
async revertToPending(id) {
|
|
245
|
+
const approval = await this.getApproval(id);
|
|
246
|
+
if (!approval) {
|
|
247
|
+
throw new Error(`Approval ${id} not found`);
|
|
248
|
+
}
|
|
249
|
+
// Revert to pending state
|
|
250
|
+
approval.status = 'pending';
|
|
251
|
+
// Clear response fields
|
|
252
|
+
delete approval.response;
|
|
253
|
+
delete approval.respondedAt;
|
|
254
|
+
delete approval.annotations;
|
|
255
|
+
delete approval.comments;
|
|
256
|
+
const filePath = await this.findApprovalPath(id);
|
|
257
|
+
if (!filePath) {
|
|
258
|
+
throw new Error(`Approval ${id} file not found`);
|
|
259
|
+
}
|
|
260
|
+
await fs.writeFile(filePath, JSON.stringify(approval, null, 2), 'utf-8');
|
|
261
|
+
}
|
|
262
|
+
async createRevision(originalId, newContent, reason) {
|
|
263
|
+
const originalApproval = await this.getApproval(originalId);
|
|
264
|
+
if (!originalApproval) {
|
|
265
|
+
throw new Error(`Original approval ${originalId} not found`);
|
|
266
|
+
}
|
|
267
|
+
if (!originalApproval.filePath) {
|
|
268
|
+
throw new Error(`Approval ${originalId} has no file path for revision`);
|
|
269
|
+
}
|
|
270
|
+
// Resolve target file path (workspace first, workflow root fallback)
|
|
271
|
+
const existingFilePath = await this.resolveExistingFilePath(originalApproval.filePath);
|
|
272
|
+
const filePath = existingFilePath || await this.resolveFilePathForWrite(originalApproval.filePath);
|
|
273
|
+
let currentContent = '';
|
|
274
|
+
try {
|
|
275
|
+
currentContent = await fs.readFile(filePath, 'utf-8');
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
// Could not read file for revision history
|
|
279
|
+
}
|
|
280
|
+
// Add to revision history
|
|
281
|
+
if (!originalApproval.revisionHistory) {
|
|
282
|
+
originalApproval.revisionHistory = [];
|
|
283
|
+
}
|
|
284
|
+
const version = (originalApproval.revisionHistory.length || 0) + 1;
|
|
285
|
+
originalApproval.revisionHistory.push({
|
|
286
|
+
version: version - 1,
|
|
287
|
+
content: currentContent,
|
|
288
|
+
timestamp: originalApproval.respondedAt || originalApproval.createdAt,
|
|
289
|
+
reason: reason
|
|
290
|
+
});
|
|
291
|
+
// Write the new content to the file
|
|
292
|
+
await fs.writeFile(filePath, newContent, 'utf-8');
|
|
293
|
+
// Reset approval status for re-review
|
|
294
|
+
originalApproval.status = 'pending';
|
|
295
|
+
originalApproval.response = undefined;
|
|
296
|
+
originalApproval.annotations = undefined;
|
|
297
|
+
originalApproval.comments = undefined;
|
|
298
|
+
originalApproval.respondedAt = undefined;
|
|
299
|
+
const approvalFilePath = await this.findApprovalPath(originalId);
|
|
300
|
+
if (!approvalFilePath) {
|
|
301
|
+
throw new Error(`Approval ${originalId} file not found`);
|
|
302
|
+
}
|
|
303
|
+
await fs.writeFile(approvalFilePath, JSON.stringify(originalApproval, null, 2), 'utf-8');
|
|
304
|
+
return originalId;
|
|
305
|
+
}
|
|
306
|
+
async getAllPendingApprovals() {
|
|
307
|
+
const allApprovals = await this.getAllApprovals();
|
|
308
|
+
return allApprovals.filter(approval => approval.status === 'pending');
|
|
309
|
+
}
|
|
310
|
+
async getAllApprovals() {
|
|
311
|
+
try {
|
|
312
|
+
const approvals = [];
|
|
313
|
+
try {
|
|
314
|
+
const categoryNames = await fs.readdir(this.approvalsDir, { withFileTypes: true });
|
|
315
|
+
for (const categoryName of categoryNames) {
|
|
316
|
+
if (categoryName.isDirectory()) {
|
|
317
|
+
const categoryPath = join(this.approvalsDir, categoryName.name);
|
|
318
|
+
try {
|
|
319
|
+
const approvalFiles = await fs.readdir(categoryPath);
|
|
320
|
+
for (const file of approvalFiles) {
|
|
321
|
+
if (file.endsWith('.json')) {
|
|
322
|
+
try {
|
|
323
|
+
const content = await fs.readFile(join(categoryPath, file), 'utf-8');
|
|
324
|
+
const approval = JSON.parse(content);
|
|
325
|
+
approvals.push(approval);
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
// Error reading approval file
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
// Error reading category directory
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
// Approvals directory doesn't exist
|
|
341
|
+
}
|
|
342
|
+
// Sort by creation date (newest first)
|
|
343
|
+
return approvals.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
return [];
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
async deleteApproval(id) {
|
|
350
|
+
try {
|
|
351
|
+
const approvalPath = await this.findApprovalPath(id);
|
|
352
|
+
if (!approvalPath)
|
|
353
|
+
return false;
|
|
354
|
+
// Delete the approval file
|
|
355
|
+
await fs.unlink(approvalPath);
|
|
356
|
+
// NOTE: We DO NOT delete snapshots since they are now shared across approvals for the same file
|
|
357
|
+
// Snapshots are stored in .snapshots/{filename}/ and should persist across approval cycles
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
async cleanupOldApprovals(maxAgeDays = 7) {
|
|
365
|
+
const cutoffDate = new Date();
|
|
366
|
+
cutoffDate.setDate(cutoffDate.getDate() - maxAgeDays);
|
|
367
|
+
try {
|
|
368
|
+
const files = await fs.readdir(this.approvalsDir);
|
|
369
|
+
for (const file of files) {
|
|
370
|
+
if (file.endsWith('.json')) {
|
|
371
|
+
try {
|
|
372
|
+
const content = await fs.readFile(join(this.approvalsDir, file), 'utf-8');
|
|
373
|
+
const approval = JSON.parse(content);
|
|
374
|
+
const createdAt = new Date(approval.createdAt);
|
|
375
|
+
if (createdAt < cutoffDate && approval.status !== 'pending') {
|
|
376
|
+
await fs.unlink(join(this.approvalsDir, file));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
catch (error) {
|
|
380
|
+
// Error processing approval file
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
// Error cleaning up old approvals
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
// Snapshot Management Methods
|
|
390
|
+
async captureSnapshot(approvalId, trigger) {
|
|
391
|
+
const approval = await this.getApproval(approvalId);
|
|
392
|
+
if (!approval || !approval.filePath) {
|
|
393
|
+
throw new Error(`Approval ${approvalId} not found or has no file path`);
|
|
394
|
+
}
|
|
395
|
+
// Read current file content (workspace first, workflow root fallback)
|
|
396
|
+
const filePath = await this.resolveExistingFilePath(approval.filePath);
|
|
397
|
+
if (!filePath) {
|
|
398
|
+
throw new Error(`Failed to read file for snapshot: file does not exist for ${approval.filePath}`);
|
|
399
|
+
}
|
|
400
|
+
let content;
|
|
401
|
+
let stats;
|
|
402
|
+
try {
|
|
403
|
+
content = await fs.readFile(filePath, 'utf-8');
|
|
404
|
+
stats = await fs.stat(filePath);
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
throw new Error(`Failed to read file for snapshot: ${error instanceof Error ? error.message : String(error)}`);
|
|
408
|
+
}
|
|
409
|
+
// Create file-based snapshots directory
|
|
410
|
+
const categoryDir = join(this.approvalsDir, approval.categoryName || 'default');
|
|
411
|
+
const snapshotsDir = join(categoryDir, '.snapshots', basename(approval.filePath));
|
|
412
|
+
await fs.mkdir(snapshotsDir, { recursive: true });
|
|
413
|
+
// Load or create metadata
|
|
414
|
+
const metadataPath = join(snapshotsDir, 'metadata.json');
|
|
415
|
+
let metadata;
|
|
416
|
+
try {
|
|
417
|
+
const metadataContent = await fs.readFile(metadataPath, 'utf-8');
|
|
418
|
+
metadata = JSON.parse(metadataContent);
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
metadata = {
|
|
422
|
+
filePath: approval.filePath,
|
|
423
|
+
currentVersion: 0,
|
|
424
|
+
snapshots: []
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
// Check for duplicate initial snapshots (per approval, not per file)
|
|
428
|
+
if (trigger === 'initial') {
|
|
429
|
+
const existingInitial = metadata.snapshots.find(s => s.trigger === 'initial' && s.approvalId === approvalId);
|
|
430
|
+
if (existingInitial) {
|
|
431
|
+
console.error(`Initial snapshot already exists for approval ${approvalId}, skipping creation`);
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// Create new snapshot
|
|
436
|
+
const version = metadata.currentVersion + 1;
|
|
437
|
+
const snapshotId = `snapshot-${version.toString().padStart(3, '0')}`;
|
|
438
|
+
const timestamp = new Date().toISOString();
|
|
439
|
+
const snapshot = {
|
|
440
|
+
id: this.generateSnapshotId(),
|
|
441
|
+
approvalId,
|
|
442
|
+
approvalTitle: approval.title,
|
|
443
|
+
version,
|
|
444
|
+
timestamp,
|
|
445
|
+
trigger,
|
|
446
|
+
status: approval.status,
|
|
447
|
+
content,
|
|
448
|
+
fileStats: {
|
|
449
|
+
size: stats.size,
|
|
450
|
+
lines: content.split('\n').length,
|
|
451
|
+
lastModified: stats.mtime.toISOString()
|
|
452
|
+
},
|
|
453
|
+
comments: approval.comments || [],
|
|
454
|
+
annotations: approval.annotations || undefined
|
|
455
|
+
};
|
|
456
|
+
// Write snapshot to disk
|
|
457
|
+
const snapshotPath = join(snapshotsDir, `${snapshotId}.json`);
|
|
458
|
+
await fs.writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');
|
|
459
|
+
// Update metadata
|
|
460
|
+
metadata.currentVersion = version;
|
|
461
|
+
metadata.snapshots.push({
|
|
462
|
+
version,
|
|
463
|
+
filename: `${snapshotId}.json`,
|
|
464
|
+
timestamp,
|
|
465
|
+
trigger,
|
|
466
|
+
approvalId,
|
|
467
|
+
approvalTitle: approval.title
|
|
468
|
+
});
|
|
469
|
+
await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
470
|
+
}
|
|
471
|
+
async getSnapshots(approvalId) {
|
|
472
|
+
const approval = await this.getApproval(approvalId);
|
|
473
|
+
if (!approval || !approval.filePath)
|
|
474
|
+
return [];
|
|
475
|
+
// Get snapshots based on file path, not approval ID
|
|
476
|
+
const categoryDir = join(this.approvalsDir, approval.categoryName || 'default');
|
|
477
|
+
const snapshotsDir = join(categoryDir, '.snapshots', basename(approval.filePath));
|
|
478
|
+
const metadataPath = join(snapshotsDir, 'metadata.json');
|
|
479
|
+
try {
|
|
480
|
+
const metadataContent = await fs.readFile(metadataPath, 'utf-8');
|
|
481
|
+
const metadata = JSON.parse(metadataContent);
|
|
482
|
+
const snapshots = [];
|
|
483
|
+
for (const snapMeta of metadata.snapshots) {
|
|
484
|
+
const snapPath = join(snapshotsDir, snapMeta.filename);
|
|
485
|
+
const snapshotContent = await fs.readFile(snapPath, 'utf-8');
|
|
486
|
+
const snapshot = JSON.parse(snapshotContent);
|
|
487
|
+
snapshots.push(snapshot);
|
|
488
|
+
}
|
|
489
|
+
return snapshots.sort((a, b) => a.version - b.version);
|
|
490
|
+
}
|
|
491
|
+
catch {
|
|
492
|
+
return [];
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
async getSnapshot(approvalId, version) {
|
|
496
|
+
const snapshots = await this.getSnapshots(approvalId);
|
|
497
|
+
return snapshots.find(s => s.version === version) || null;
|
|
498
|
+
}
|
|
499
|
+
async getCurrentFileContent(approvalId) {
|
|
500
|
+
const approval = await this.getApproval(approvalId);
|
|
501
|
+
if (!approval || !approval.filePath)
|
|
502
|
+
return null;
|
|
503
|
+
const filePath = await this.resolveExistingFilePath(approval.filePath);
|
|
504
|
+
if (!filePath) {
|
|
505
|
+
return null;
|
|
506
|
+
}
|
|
507
|
+
try {
|
|
508
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
509
|
+
}
|
|
510
|
+
catch {
|
|
511
|
+
return null;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
async compareSnapshots(approvalId, fromVersion, toVersion) {
|
|
515
|
+
let fromContent;
|
|
516
|
+
let toContent;
|
|
517
|
+
if (fromVersion === 0) {
|
|
518
|
+
fromContent = '';
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
const fromSnapshot = await this.getSnapshot(approvalId, fromVersion);
|
|
522
|
+
if (!fromSnapshot) {
|
|
523
|
+
throw new Error(`Snapshot version ${fromVersion} not found`);
|
|
524
|
+
}
|
|
525
|
+
fromContent = fromSnapshot.content;
|
|
526
|
+
}
|
|
527
|
+
if (toVersion === 'current') {
|
|
528
|
+
const currentContent = await this.getCurrentFileContent(approvalId);
|
|
529
|
+
if (currentContent === null) {
|
|
530
|
+
throw new Error(`Could not read current file content for approval ${approvalId}`);
|
|
531
|
+
}
|
|
532
|
+
toContent = currentContent;
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
const toSnapshot = await this.getSnapshot(approvalId, toVersion);
|
|
536
|
+
if (!toSnapshot) {
|
|
537
|
+
throw new Error(`Snapshot version ${toVersion} not found`);
|
|
538
|
+
}
|
|
539
|
+
toContent = toSnapshot.content;
|
|
540
|
+
}
|
|
541
|
+
const changes = diffLines(fromContent, toContent);
|
|
542
|
+
const resultLines = [];
|
|
543
|
+
let additions = 0;
|
|
544
|
+
let deletions = 0;
|
|
545
|
+
let oldLineNum = 1;
|
|
546
|
+
let newLineNum = 1;
|
|
547
|
+
for (const change of changes) {
|
|
548
|
+
// Split the change value into lines, handling the trailing newline properly
|
|
549
|
+
const lines = change.value.split('\n');
|
|
550
|
+
// Remove the last empty element if the value ended with a newline
|
|
551
|
+
if (lines.length > 0 && lines[lines.length - 1] === '') {
|
|
552
|
+
lines.pop();
|
|
553
|
+
}
|
|
554
|
+
for (const line of lines) {
|
|
555
|
+
if (change.added) {
|
|
556
|
+
additions++;
|
|
557
|
+
resultLines.push({
|
|
558
|
+
type: 'add',
|
|
559
|
+
newLineNumber: newLineNum++,
|
|
560
|
+
content: line
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
else if (change.removed) {
|
|
564
|
+
deletions++;
|
|
565
|
+
resultLines.push({
|
|
566
|
+
type: 'delete',
|
|
567
|
+
oldLineNumber: oldLineNum++,
|
|
568
|
+
content: line
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
// Unchanged line
|
|
573
|
+
resultLines.push({
|
|
574
|
+
type: 'normal',
|
|
575
|
+
oldLineNumber: oldLineNum++,
|
|
576
|
+
newLineNumber: newLineNum++,
|
|
577
|
+
content: line
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
// Count actual lines processed (matching the diff loop's handling of trailing newlines)
|
|
583
|
+
// We use the line number counters which were incremented for each actual line processed
|
|
584
|
+
const fromLineCount = oldLineNum - 1;
|
|
585
|
+
const toLineCount = newLineNum - 1;
|
|
586
|
+
return {
|
|
587
|
+
additions,
|
|
588
|
+
deletions,
|
|
589
|
+
// changes represents in-place modifications; diffLines only produces additions/deletions
|
|
590
|
+
// so changes is always 0 (the frontend calculates totalChanges = additions + deletions + changes)
|
|
591
|
+
changes: 0,
|
|
592
|
+
chunks: [{
|
|
593
|
+
oldStart: 1,
|
|
594
|
+
oldLines: fromLineCount,
|
|
595
|
+
newStart: 1,
|
|
596
|
+
newLines: toLineCount,
|
|
597
|
+
lines: resultLines
|
|
598
|
+
}]
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
generateSnapshotId() {
|
|
602
|
+
return `snapshot_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
603
|
+
}
|
|
604
|
+
generateId() {
|
|
605
|
+
return `approval_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
//# sourceMappingURL=approval-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-storage.js","sourceRoot":"","sources":["../../src/dashboard/approval-storage.ts"],"names":[],"mappings":"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"}
|