@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,302 @@
|
|
|
1
|
+
import { join, normalize, sep, resolve, posix } from 'path';
|
|
2
|
+
import { access, stat, mkdir } from 'fs/promises';
|
|
3
|
+
import { constants } from 'fs';
|
|
4
|
+
export class PathUtils {
|
|
5
|
+
/** macOS and Windows are case-insensitive filesystems */
|
|
6
|
+
static IS_CASE_INSENSITIVE = process.platform === 'darwin' || process.platform === 'win32';
|
|
7
|
+
/** Cached path configuration (undefined = not checked, null = invalid/missing) */
|
|
8
|
+
static pathConfig;
|
|
9
|
+
/**
|
|
10
|
+
* Get cached path configuration from environment variables.
|
|
11
|
+
* Caches result to prevent race conditions from env var changes mid-operation.
|
|
12
|
+
*/
|
|
13
|
+
static getPathConfig() {
|
|
14
|
+
if (this.pathConfig !== undefined) {
|
|
15
|
+
return this.pathConfig;
|
|
16
|
+
}
|
|
17
|
+
const hostPrefix = process.env.SPEC_WORKFLOW_HOST_PATH_PREFIX?.trim();
|
|
18
|
+
const containerPrefix = process.env.SPEC_WORKFLOW_CONTAINER_PATH_PREFIX?.trim();
|
|
19
|
+
if (!hostPrefix || !containerPrefix) {
|
|
20
|
+
this.pathConfig = null;
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
// Validate absolute paths
|
|
24
|
+
if (!this.isAbsolutePath(hostPrefix) || !this.isAbsolutePath(containerPrefix)) {
|
|
25
|
+
console.error('[PathUtils] Path prefixes must be absolute paths');
|
|
26
|
+
this.pathConfig = null;
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
// Security: Reject prefixes containing directory traversal
|
|
30
|
+
if (hostPrefix.includes('..') || containerPrefix.includes('..')) {
|
|
31
|
+
console.error('[PathUtils] Path prefixes must not contain directory traversal (..)');
|
|
32
|
+
this.pathConfig = null;
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
this.pathConfig = { hostPrefix, containerPrefix };
|
|
36
|
+
return this.pathConfig;
|
|
37
|
+
}
|
|
38
|
+
/** Check if path is absolute (Unix or Windows style) */
|
|
39
|
+
static isAbsolutePath(path) {
|
|
40
|
+
return path.startsWith('/') || /^[A-Za-z]:[\\/]/.test(path);
|
|
41
|
+
}
|
|
42
|
+
/** Reset cached config (for testing) */
|
|
43
|
+
static resetPathConfig() {
|
|
44
|
+
this.pathConfig = undefined;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Normalize path for cross-platform comparison using built-in path.posix.
|
|
48
|
+
* Converts backslashes to forward slashes, removes trailing slashes.
|
|
49
|
+
*/
|
|
50
|
+
static normalizeForComparison(p) {
|
|
51
|
+
// Convert to Unix-style, then use built-in posix.normalize
|
|
52
|
+
const unixStyle = p.replace(/\\/g, '/');
|
|
53
|
+
// posix.normalize handles /./, /../, and // but keeps trailing slash
|
|
54
|
+
const normalized = posix.normalize(unixStyle);
|
|
55
|
+
// Remove trailing slash for consistent comparison (except for root "/")
|
|
56
|
+
return normalized.endsWith('/') && normalized.length > 1
|
|
57
|
+
? normalized.slice(0, -1)
|
|
58
|
+
: normalized;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if a path matches a prefix with proper boundary checking.
|
|
62
|
+
* - Prevents partial matches like "/Users/dev" matching "/Users/developer"
|
|
63
|
+
* - Handles case-insensitivity on macOS/Windows
|
|
64
|
+
* - Normalizes path separators for cross-platform support
|
|
65
|
+
*/
|
|
66
|
+
static pathMatchesPrefix(path, prefix) {
|
|
67
|
+
let normalizedPath = this.normalizeForComparison(path);
|
|
68
|
+
let normalizedPrefix = this.normalizeForComparison(prefix);
|
|
69
|
+
if (this.IS_CASE_INSENSITIVE) {
|
|
70
|
+
normalizedPath = normalizedPath.toLowerCase();
|
|
71
|
+
normalizedPrefix = normalizedPrefix.toLowerCase();
|
|
72
|
+
}
|
|
73
|
+
if (normalizedPath === normalizedPrefix)
|
|
74
|
+
return true;
|
|
75
|
+
// Special case: root prefix "/" matches any absolute path
|
|
76
|
+
if (normalizedPrefix === '/') {
|
|
77
|
+
return normalizedPath.startsWith('/');
|
|
78
|
+
}
|
|
79
|
+
return normalizedPath.startsWith(normalizedPrefix + '/');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Translate a host path to container path if running in Docker with path mapping configured.
|
|
83
|
+
*
|
|
84
|
+
* Environment variables:
|
|
85
|
+
* - SPEC_WORKFLOW_HOST_PATH_PREFIX: Path prefix on the host (e.g., /Users/username)
|
|
86
|
+
* - SPEC_WORKFLOW_CONTAINER_PATH_PREFIX: Corresponding path in container (e.g., /projects)
|
|
87
|
+
*
|
|
88
|
+
* Example: If host prefix is "/Users/dev" and container prefix is "/projects",
|
|
89
|
+
* then "/Users/dev/myapp" becomes "/projects/myapp"
|
|
90
|
+
*/
|
|
91
|
+
static translatePath(hostPath) {
|
|
92
|
+
const config = this.getPathConfig();
|
|
93
|
+
if (!config)
|
|
94
|
+
return hostPath;
|
|
95
|
+
if (this.pathMatchesPrefix(hostPath, config.hostPrefix)) {
|
|
96
|
+
const normalizedHostPrefix = this.normalizeForComparison(config.hostPrefix);
|
|
97
|
+
const normalizedPath = this.normalizeForComparison(hostPath);
|
|
98
|
+
const normalizedContainerPrefix = this.normalizeForComparison(config.containerPrefix);
|
|
99
|
+
// Get relative path preserving structure
|
|
100
|
+
let relativePath = normalizedPath.substring(normalizedHostPrefix.length);
|
|
101
|
+
// Ensure relative path starts with separator (needed for root prefix case)
|
|
102
|
+
if (relativePath && !relativePath.startsWith('/')) {
|
|
103
|
+
relativePath = '/' + relativePath;
|
|
104
|
+
}
|
|
105
|
+
const result = normalizedContainerPrefix + relativePath;
|
|
106
|
+
// Security: Validate no directory traversal in result
|
|
107
|
+
if (result.includes('/../') || result.endsWith('/..')) {
|
|
108
|
+
throw new Error('Path translation resulted in directory traversal attempt');
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
return hostPath;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Reverse translation: container path back to host path (for display/registry)
|
|
116
|
+
*/
|
|
117
|
+
static reverseTranslatePath(containerPath) {
|
|
118
|
+
const config = this.getPathConfig();
|
|
119
|
+
if (!config)
|
|
120
|
+
return containerPath;
|
|
121
|
+
if (this.pathMatchesPrefix(containerPath, config.containerPrefix)) {
|
|
122
|
+
const normalizedContainerPrefix = this.normalizeForComparison(config.containerPrefix);
|
|
123
|
+
const normalizedPath = this.normalizeForComparison(containerPath);
|
|
124
|
+
const normalizedHostPrefix = this.normalizeForComparison(config.hostPrefix);
|
|
125
|
+
// Get relative path preserving structure
|
|
126
|
+
let relativePath = normalizedPath.substring(normalizedContainerPrefix.length);
|
|
127
|
+
// Ensure relative path starts with separator (needed for root prefix case)
|
|
128
|
+
if (relativePath && !relativePath.startsWith('/')) {
|
|
129
|
+
relativePath = '/' + relativePath;
|
|
130
|
+
}
|
|
131
|
+
const result = normalizedHostPrefix + relativePath;
|
|
132
|
+
// Security: Validate no directory traversal in result
|
|
133
|
+
if (result.includes('/../') || result.endsWith('/..')) {
|
|
134
|
+
throw new Error('Path translation resulted in directory traversal attempt');
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
return containerPath;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Validate that a resolved absolute path is within at least one of the given base directories.
|
|
142
|
+
* Throws if the path escapes all bases.
|
|
143
|
+
*/
|
|
144
|
+
static validatePathWithinBases(resolvedPath, basePaths) {
|
|
145
|
+
const normalizedResolved = resolve(resolvedPath);
|
|
146
|
+
for (const base of basePaths) {
|
|
147
|
+
const normalizedBase = resolve(base);
|
|
148
|
+
if (normalizedResolved === normalizedBase || normalizedResolved.startsWith(normalizedBase + sep)) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
throw new Error(`Path traversal detected: path escapes allowed directories`);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Safely join paths ensuring no directory traversal
|
|
156
|
+
*/
|
|
157
|
+
static safeJoin(basePath, ...paths) {
|
|
158
|
+
// Validate base path
|
|
159
|
+
if (!basePath || typeof basePath !== 'string') {
|
|
160
|
+
throw new Error('Invalid base path');
|
|
161
|
+
}
|
|
162
|
+
// Check each path segment for traversal attempts
|
|
163
|
+
for (const pathSegment of paths) {
|
|
164
|
+
if (pathSegment && (pathSegment.includes('..') || pathSegment.startsWith('/'))) {
|
|
165
|
+
throw new Error(`Invalid path segment: ${pathSegment}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const joined = normalize(join(basePath, ...paths));
|
|
169
|
+
const resolvedBase = resolve(basePath);
|
|
170
|
+
const resolvedJoined = resolve(joined);
|
|
171
|
+
// Ensure the joined path is within the base path
|
|
172
|
+
if (!resolvedJoined.startsWith(resolvedBase)) {
|
|
173
|
+
throw new Error('Path traversal detected in join operation');
|
|
174
|
+
}
|
|
175
|
+
return joined;
|
|
176
|
+
}
|
|
177
|
+
static getWorkflowRoot(projectPath) {
|
|
178
|
+
return this.safeJoin(projectPath, '.spec-workflow');
|
|
179
|
+
}
|
|
180
|
+
static getSpecPath(projectPath, specName) {
|
|
181
|
+
return this.safeJoin(projectPath, '.spec-workflow', 'specs', specName);
|
|
182
|
+
}
|
|
183
|
+
static getArchiveSpecPath(projectPath, specName) {
|
|
184
|
+
return this.safeJoin(projectPath, '.spec-workflow', 'archive', 'specs', specName);
|
|
185
|
+
}
|
|
186
|
+
static getArchiveSpecsPath(projectPath) {
|
|
187
|
+
return this.safeJoin(projectPath, '.spec-workflow', 'archive', 'specs');
|
|
188
|
+
}
|
|
189
|
+
static getSteeringPath(projectPath) {
|
|
190
|
+
return this.safeJoin(projectPath, '.spec-workflow', 'steering');
|
|
191
|
+
}
|
|
192
|
+
static getTemplatesPath(projectPath) {
|
|
193
|
+
return this.safeJoin(projectPath, '.spec-workflow', 'templates');
|
|
194
|
+
}
|
|
195
|
+
static getAgentsPath(projectPath) {
|
|
196
|
+
return this.safeJoin(projectPath, '.spec-workflow', 'agents');
|
|
197
|
+
}
|
|
198
|
+
static getCommandsPath(projectPath) {
|
|
199
|
+
return this.safeJoin(projectPath, '.spec-workflow', 'commands');
|
|
200
|
+
}
|
|
201
|
+
static getApprovalsPath(projectPath) {
|
|
202
|
+
return this.safeJoin(projectPath, '.spec-workflow', 'approvals');
|
|
203
|
+
}
|
|
204
|
+
static getSpecApprovalPath(projectPath, specName) {
|
|
205
|
+
return this.safeJoin(projectPath, '.spec-workflow', 'approvals', specName);
|
|
206
|
+
}
|
|
207
|
+
// Ensure paths work across Windows, macOS, Linux
|
|
208
|
+
static toPlatformPath(path) {
|
|
209
|
+
return path.split('/').join(sep);
|
|
210
|
+
}
|
|
211
|
+
static toUnixPath(path) {
|
|
212
|
+
return path.split(sep).join('/');
|
|
213
|
+
}
|
|
214
|
+
// Get relative path from project root
|
|
215
|
+
static getRelativePath(projectPath, fullPath) {
|
|
216
|
+
const normalizedProject = normalize(projectPath);
|
|
217
|
+
const normalizedFull = normalize(fullPath);
|
|
218
|
+
if (normalizedFull.startsWith(normalizedProject)) {
|
|
219
|
+
return normalizedFull.slice(normalizedProject.length + 1);
|
|
220
|
+
}
|
|
221
|
+
return normalizedFull;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
export async function validateProjectPath(projectPath) {
|
|
225
|
+
try {
|
|
226
|
+
// Validate input
|
|
227
|
+
if (!projectPath || typeof projectPath !== 'string') {
|
|
228
|
+
throw new Error('Invalid project path: path must be a non-empty string');
|
|
229
|
+
}
|
|
230
|
+
// Check for dangerous path patterns before resolving
|
|
231
|
+
if (projectPath.includes('..') || projectPath.includes('~')) {
|
|
232
|
+
// Normalize the path first to check if it's actually traversing
|
|
233
|
+
const normalized = normalize(projectPath);
|
|
234
|
+
const resolved = resolve(normalized);
|
|
235
|
+
// Get the current working directory for comparison
|
|
236
|
+
const cwd = process.cwd();
|
|
237
|
+
// Additional check: ensure the resolved path doesn't contain parent directory references
|
|
238
|
+
if (normalized.includes('..') && !resolved.startsWith(cwd)) {
|
|
239
|
+
throw new Error(`Path traversal detected: ${projectPath}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Resolve to absolute path
|
|
243
|
+
const absolutePath = resolve(projectPath);
|
|
244
|
+
// Security check: Ensure the path doesn't escape to system directories
|
|
245
|
+
const systemPaths = ['/etc', '/usr', '/bin', '/sbin', '/var', '/sys', '/proc'];
|
|
246
|
+
const windowsSystemPaths = ['C:\\Windows', 'C:\\Program Files', 'C:\\Program Files (x86)'];
|
|
247
|
+
const allSystemPaths = process.platform === 'win32' ? windowsSystemPaths : systemPaths;
|
|
248
|
+
for (const sysPath of allSystemPaths) {
|
|
249
|
+
if (absolutePath.toLowerCase().startsWith(sysPath.toLowerCase())) {
|
|
250
|
+
throw new Error(`Access to system directory not allowed: ${absolutePath}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Check if path exists
|
|
254
|
+
await access(absolutePath, constants.F_OK);
|
|
255
|
+
// Ensure it's a directory
|
|
256
|
+
const stats = await stat(absolutePath);
|
|
257
|
+
if (!stats.isDirectory()) {
|
|
258
|
+
throw new Error(`Project path is not a directory: ${absolutePath}`);
|
|
259
|
+
}
|
|
260
|
+
// Final security check: ensure we can actually access this directory
|
|
261
|
+
await access(absolutePath, constants.R_OK | constants.W_OK);
|
|
262
|
+
return absolutePath;
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
if (error instanceof Error) {
|
|
266
|
+
if (error.code === 'ENOENT') {
|
|
267
|
+
throw new Error(`Project path does not exist: ${projectPath}`);
|
|
268
|
+
}
|
|
269
|
+
else if (error.code === 'EACCES') {
|
|
270
|
+
throw new Error(`Permission denied accessing project path: ${projectPath}`);
|
|
271
|
+
}
|
|
272
|
+
throw error;
|
|
273
|
+
}
|
|
274
|
+
throw new Error(`Unknown error validating project path: ${String(error)}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
export async function ensureDirectoryExists(dirPath) {
|
|
278
|
+
try {
|
|
279
|
+
await access(dirPath, constants.F_OK);
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
await mkdir(dirPath, { recursive: true });
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
export async function ensureWorkflowDirectory(projectPath) {
|
|
286
|
+
const workflowRoot = PathUtils.getWorkflowRoot(projectPath);
|
|
287
|
+
// Create all necessary subdirectories (approvals created on-demand)
|
|
288
|
+
const directories = [
|
|
289
|
+
workflowRoot,
|
|
290
|
+
PathUtils.getSpecPath(projectPath, ''),
|
|
291
|
+
PathUtils.getArchiveSpecsPath(projectPath),
|
|
292
|
+
PathUtils.getSteeringPath(projectPath),
|
|
293
|
+
PathUtils.getTemplatesPath(projectPath),
|
|
294
|
+
PathUtils.getAgentsPath(projectPath),
|
|
295
|
+
PathUtils.getCommandsPath(projectPath)
|
|
296
|
+
];
|
|
297
|
+
for (const dir of directories) {
|
|
298
|
+
await ensureDirectoryExists(dir);
|
|
299
|
+
}
|
|
300
|
+
return workflowRoot;
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=path-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/core/path-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export interface ProjectInstance {
|
|
2
|
+
pid: number;
|
|
3
|
+
registeredAt: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ProjectRegistryEntry {
|
|
6
|
+
projectId: string;
|
|
7
|
+
projectPath: string;
|
|
8
|
+
workflowRootPath: string;
|
|
9
|
+
projectName: string;
|
|
10
|
+
instances: ProjectInstance[];
|
|
11
|
+
}
|
|
12
|
+
export interface RegisterProjectOptions {
|
|
13
|
+
workflowRootPath?: string;
|
|
14
|
+
projectName?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate a stable projectId from an absolute path
|
|
18
|
+
* Uses SHA-1 hash encoded as base64url
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateProjectId(absolutePath: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Build display name for a workspace.
|
|
23
|
+
* - Main repo: "repo"
|
|
24
|
+
* - Worktree: "repo · worktree"
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateProjectDisplayName(workspacePath: string, workflowRootPath: string): string;
|
|
27
|
+
export declare class ProjectRegistry {
|
|
28
|
+
private registryPath;
|
|
29
|
+
private registryDir;
|
|
30
|
+
private needsInitialization;
|
|
31
|
+
constructor();
|
|
32
|
+
/**
|
|
33
|
+
* Ensure the registry directory exists
|
|
34
|
+
*/
|
|
35
|
+
private ensureRegistryDir;
|
|
36
|
+
/**
|
|
37
|
+
* Read the registry file with atomic operations
|
|
38
|
+
* Returns a map keyed by projectId
|
|
39
|
+
*/
|
|
40
|
+
private readRegistry;
|
|
41
|
+
/**
|
|
42
|
+
* Write the registry file atomically
|
|
43
|
+
*/
|
|
44
|
+
private writeRegistry;
|
|
45
|
+
/**
|
|
46
|
+
* Check if a process is still running
|
|
47
|
+
* Note: When running in Docker with path translation, we can't check host PIDs,
|
|
48
|
+
* so we assume processes are alive if path translation is enabled.
|
|
49
|
+
*/
|
|
50
|
+
private isProcessAlive;
|
|
51
|
+
/**
|
|
52
|
+
* Register a project in the global registry
|
|
53
|
+
* Self-healing: If a project exists with dead PIDs, cleans them up and adds new PID
|
|
54
|
+
* Multi-instance: Allows unlimited MCP server instances per project
|
|
55
|
+
*/
|
|
56
|
+
registerProject(projectPath: string, pid: number, options?: RegisterProjectOptions): Promise<string>;
|
|
57
|
+
/**
|
|
58
|
+
* Unregister a project from the global registry by path
|
|
59
|
+
* If pid is provided, only removes that specific instance
|
|
60
|
+
* If no pid provided, removes the entire project (backwards compat)
|
|
61
|
+
*/
|
|
62
|
+
unregisterProject(projectPath: string, pid?: number): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Unregister a project by projectId
|
|
65
|
+
*/
|
|
66
|
+
unregisterProjectById(projectId: string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Get all active projects from the registry
|
|
69
|
+
*/
|
|
70
|
+
getAllProjects(): Promise<ProjectRegistryEntry[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Get a specific project by path
|
|
73
|
+
*/
|
|
74
|
+
getProject(projectPath: string): Promise<ProjectRegistryEntry | null>;
|
|
75
|
+
/**
|
|
76
|
+
* Get a specific project by projectId
|
|
77
|
+
*/
|
|
78
|
+
getProjectById(projectId: string): Promise<ProjectRegistryEntry | null>;
|
|
79
|
+
/**
|
|
80
|
+
* Clean up stale instances (where the process is no longer running)
|
|
81
|
+
* Projects with no live instances are removed entirely
|
|
82
|
+
* Returns the count of removed instances
|
|
83
|
+
*/
|
|
84
|
+
cleanupStaleProjects(): Promise<number>;
|
|
85
|
+
/**
|
|
86
|
+
* Check if a project is registered by path
|
|
87
|
+
*/
|
|
88
|
+
isProjectRegistered(projectPath: string): Promise<boolean>;
|
|
89
|
+
/**
|
|
90
|
+
* Get the registry file path for watching
|
|
91
|
+
*/
|
|
92
|
+
getRegistryPath(): string;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=project-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-registry.d.ts","sourceRoot":"","sources":["../../src/core/project-registry.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CASlG;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,mBAAmB,CAAkB;;IAO7C;;OAEG;YACW,iBAAiB;IAkB/B;;;OAGG;YACW,YAAY;IA0D1B;;OAEG;YACW,aAAa;IAY3B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAkBtB;;;;OAIG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,MAAM,CAAC;IAyC9G;;;;OAIG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBzE;;OAEG;IACG,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAKvD;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAO3E;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAK7E;;;;OAIG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAgC7C;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOhE;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B"}
|