@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
package/dist/index.js
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { SpecWorkflowMCPServer } from './server.js';
|
|
3
|
+
import { MultiProjectDashboardServer } from './dashboard/multi-server.js';
|
|
4
|
+
import { DashboardSessionManager } from './core/dashboard-session.js';
|
|
5
|
+
import { homedir } from 'os';
|
|
6
|
+
import { resolveGitRoot, resolveGitWorkspaceRoot } from './core/git-utils.js';
|
|
7
|
+
import { resolve } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { realpathSync } from 'fs';
|
|
10
|
+
// Default dashboard port
|
|
11
|
+
const DEFAULT_DASHBOARD_PORT = 5000;
|
|
12
|
+
function showHelp() {
|
|
13
|
+
console.error(`
|
|
14
|
+
Spec Workflow MCP Server - A Model Context Protocol server for spec-driven development
|
|
15
|
+
|
|
16
|
+
USAGE:
|
|
17
|
+
spec-workflow-mcp [path] [options]
|
|
18
|
+
|
|
19
|
+
ARGUMENTS:
|
|
20
|
+
path Project path (defaults to current directory)
|
|
21
|
+
Supports ~ for home directory
|
|
22
|
+
|
|
23
|
+
OPTIONS:
|
|
24
|
+
--help Show this help message
|
|
25
|
+
--dashboard Run dashboard-only mode (no MCP server)
|
|
26
|
+
--port <number> Specify dashboard port (1024-65535)
|
|
27
|
+
Default: 5000
|
|
28
|
+
Only use if port 5000 is unavailable
|
|
29
|
+
--no-open Don't automatically open browser when starting dashboard
|
|
30
|
+
Useful in restricted environments where browser launch is blocked
|
|
31
|
+
--no-shared-worktree-specs
|
|
32
|
+
Disable shared .spec-workflow in git worktrees
|
|
33
|
+
Use workspace-local .spec-workflow instead of main repo
|
|
34
|
+
|
|
35
|
+
IMPORTANT:
|
|
36
|
+
Only ONE dashboard instance runs at a time. All MCP servers connect to the
|
|
37
|
+
same dashboard. The dashboard runs on port 5000 by default.
|
|
38
|
+
|
|
39
|
+
MODES OF OPERATION:
|
|
40
|
+
|
|
41
|
+
1. MCP Server Only (default):
|
|
42
|
+
spec-workflow-mcp
|
|
43
|
+
spec-workflow-mcp ~/my-project
|
|
44
|
+
|
|
45
|
+
Starts MCP server without dashboard. Dashboard can be started separately.
|
|
46
|
+
|
|
47
|
+
2. Dashboard Only Mode:
|
|
48
|
+
spec-workflow-mcp --dashboard
|
|
49
|
+
spec-workflow-mcp --dashboard --port 8080
|
|
50
|
+
spec-workflow-mcp --dashboard --no-open
|
|
51
|
+
|
|
52
|
+
Runs only the web dashboard without MCP server (default port: 5000).
|
|
53
|
+
Projects will automatically appear in the dashboard as MCP servers register.
|
|
54
|
+
Only one dashboard instance is needed for all your projects.
|
|
55
|
+
Use --no-open to prevent automatic browser launch (useful in restricted environments).
|
|
56
|
+
|
|
57
|
+
EXAMPLES:
|
|
58
|
+
# Start MCP server in current directory (no dashboard)
|
|
59
|
+
spec-workflow-mcp
|
|
60
|
+
|
|
61
|
+
# Start MCP server in a specific project directory
|
|
62
|
+
spec-workflow-mcp ~/projects/my-app
|
|
63
|
+
|
|
64
|
+
# Run dashboard (default port 5000) - START THIS FIRST
|
|
65
|
+
spec-workflow-mcp --dashboard
|
|
66
|
+
|
|
67
|
+
# Run dashboard on custom port (if 5000 is unavailable)
|
|
68
|
+
spec-workflow-mcp --dashboard --port 8080
|
|
69
|
+
|
|
70
|
+
TYPICAL WORKFLOW:
|
|
71
|
+
1. Start the dashboard once:
|
|
72
|
+
spec-workflow-mcp --dashboard
|
|
73
|
+
|
|
74
|
+
2. Start MCP servers for your projects (in separate terminals):
|
|
75
|
+
spec-workflow-mcp ~/project1
|
|
76
|
+
spec-workflow-mcp ~/project2
|
|
77
|
+
spec-workflow-mcp ~/project3
|
|
78
|
+
|
|
79
|
+
All projects will appear in the same dashboard at http://localhost:5000
|
|
80
|
+
|
|
81
|
+
PARAMETER FORMATS:
|
|
82
|
+
--port 3456 Space-separated format
|
|
83
|
+
--port=3456 Equals format
|
|
84
|
+
|
|
85
|
+
For more information, visit: https://github.com/arimakouyou/spec-workflow-mcp
|
|
86
|
+
`);
|
|
87
|
+
}
|
|
88
|
+
function expandTildePath(path) {
|
|
89
|
+
if (path.startsWith('~/') || path === '~') {
|
|
90
|
+
return path.replace('~', homedir());
|
|
91
|
+
}
|
|
92
|
+
return path;
|
|
93
|
+
}
|
|
94
|
+
export function parseArguments(args) {
|
|
95
|
+
const isDashboardMode = args.includes('--dashboard');
|
|
96
|
+
const noOpen = args.includes('--no-open');
|
|
97
|
+
const noSharedWorktreeSpecs = args.includes('--no-shared-worktree-specs');
|
|
98
|
+
let customPort;
|
|
99
|
+
// Check for invalid flags
|
|
100
|
+
const validFlags = ['--dashboard', '--port', '--help', '-h', '--no-open', '--no-shared-worktree-specs'];
|
|
101
|
+
for (const arg of args) {
|
|
102
|
+
if (arg.startsWith('--') && !arg.includes('=')) {
|
|
103
|
+
if (!validFlags.includes(arg)) {
|
|
104
|
+
throw new Error(`Unknown option: ${arg}\nUse --help to see available options.`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (arg.startsWith('--') && arg.includes('=')) {
|
|
108
|
+
const flagName = arg.split('=')[0];
|
|
109
|
+
if (!validFlags.includes(flagName)) {
|
|
110
|
+
throw new Error(`Unknown option: ${flagName}\nUse --help to see available options.`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Parse --port parameter (supports --port 3000 and --port=3000 formats)
|
|
115
|
+
for (let i = 0; i < args.length; i++) {
|
|
116
|
+
const arg = args[i];
|
|
117
|
+
if (arg.startsWith('--port=')) {
|
|
118
|
+
// Handle --port=3000 format
|
|
119
|
+
const portStr = arg.split('=')[1];
|
|
120
|
+
if (portStr) {
|
|
121
|
+
const parsed = parseInt(portStr, 10);
|
|
122
|
+
if (isNaN(parsed)) {
|
|
123
|
+
throw new Error(`Invalid port number: ${portStr}. Port must be a number.`);
|
|
124
|
+
}
|
|
125
|
+
if (parsed < 1024 || parsed > 65535) {
|
|
126
|
+
throw new Error(`Port ${parsed} is out of range. Port must be between 1024 and 65535.`);
|
|
127
|
+
}
|
|
128
|
+
customPort = parsed;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
throw new Error('--port parameter requires a value (e.g., --port=3000)');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else if (arg === '--port' && i + 1 < args.length) {
|
|
135
|
+
// Handle --port 3000 format
|
|
136
|
+
const portStr = args[i + 1];
|
|
137
|
+
const parsed = parseInt(portStr, 10);
|
|
138
|
+
if (isNaN(parsed)) {
|
|
139
|
+
throw new Error(`Invalid port number: ${portStr}. Port must be a number.`);
|
|
140
|
+
}
|
|
141
|
+
if (parsed < 1024 || parsed > 65535) {
|
|
142
|
+
throw new Error(`Port ${parsed} is out of range. Port must be between 1024 and 65535.`);
|
|
143
|
+
}
|
|
144
|
+
customPort = parsed;
|
|
145
|
+
i++; // Skip the next argument as it's the port value
|
|
146
|
+
}
|
|
147
|
+
else if (arg === '--port') {
|
|
148
|
+
throw new Error('--port parameter requires a value (e.g., --port 3000)');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Get project path (filter out flags and their values)
|
|
152
|
+
const filteredArgs = args.filter((arg, index) => {
|
|
153
|
+
if (arg === '--dashboard')
|
|
154
|
+
return false;
|
|
155
|
+
if (arg.startsWith('--port='))
|
|
156
|
+
return false;
|
|
157
|
+
if (arg === '--port')
|
|
158
|
+
return false;
|
|
159
|
+
if (arg === '--no-open')
|
|
160
|
+
return false;
|
|
161
|
+
if (arg === '--no-shared-worktree-specs')
|
|
162
|
+
return false;
|
|
163
|
+
// Check if this arg is a value following --port
|
|
164
|
+
if (index > 0 && args[index - 1] === '--port')
|
|
165
|
+
return false;
|
|
166
|
+
return true;
|
|
167
|
+
});
|
|
168
|
+
// For dashboard-only mode, use cwd as default (dashboard doesn't need it)
|
|
169
|
+
const rawProjectPath = filteredArgs[0] || process.cwd();
|
|
170
|
+
const expandedPath = expandTildePath(rawProjectPath);
|
|
171
|
+
const workspacePath = resolveGitWorkspaceRoot(expandedPath);
|
|
172
|
+
const workflowRootPath = noSharedWorktreeSpecs ? workspacePath : resolveGitRoot(workspacePath);
|
|
173
|
+
// Warn if no explicit path was provided and we're using cwd (but only for MCP server mode)
|
|
174
|
+
if (!filteredArgs[0] && !isDashboardMode) {
|
|
175
|
+
console.warn(`Warning: No project path specified, using current directory: ${workspacePath}`);
|
|
176
|
+
console.warn('Consider specifying an explicit path for better clarity.');
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
workspacePath,
|
|
180
|
+
workflowRootPath,
|
|
181
|
+
expandedPath,
|
|
182
|
+
isDashboardMode,
|
|
183
|
+
noSharedWorktreeSpecs,
|
|
184
|
+
port: customPort,
|
|
185
|
+
lang: undefined,
|
|
186
|
+
noOpen
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async function main() {
|
|
190
|
+
try {
|
|
191
|
+
const args = process.argv.slice(2);
|
|
192
|
+
// Check for help flag
|
|
193
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
194
|
+
showHelp();
|
|
195
|
+
process.exit(0);
|
|
196
|
+
}
|
|
197
|
+
// Parse command-line arguments
|
|
198
|
+
const cliArgs = parseArguments(args);
|
|
199
|
+
const workspacePath = cliArgs.workspacePath;
|
|
200
|
+
const workflowRootPath = cliArgs.workflowRootPath;
|
|
201
|
+
const noSharedWorktreeSpecs = cliArgs.noSharedWorktreeSpecs;
|
|
202
|
+
// Log worktree details when workspace and shared workflow roots differ
|
|
203
|
+
if (workspacePath !== workflowRootPath) {
|
|
204
|
+
console.error('Git worktree detected.');
|
|
205
|
+
console.error(`workspacePath=${workspacePath}`);
|
|
206
|
+
console.error(`workflowRootPath=${workflowRootPath}`);
|
|
207
|
+
}
|
|
208
|
+
else if (noSharedWorktreeSpecs) {
|
|
209
|
+
console.error('Shared worktree specs disabled. Using workspace-local .spec-workflow.');
|
|
210
|
+
console.error(`workspacePath=${workspacePath}`);
|
|
211
|
+
}
|
|
212
|
+
// Apply configuration from CLI args
|
|
213
|
+
const isDashboardMode = cliArgs.isDashboardMode || false;
|
|
214
|
+
const port = cliArgs.port;
|
|
215
|
+
const lang = cliArgs.lang;
|
|
216
|
+
const noOpen = cliArgs.noOpen || false;
|
|
217
|
+
if (isDashboardMode) {
|
|
218
|
+
// Check if a dashboard is already running (always check, regardless of port)
|
|
219
|
+
const sessionManager = new DashboardSessionManager();
|
|
220
|
+
const existingSession = await sessionManager.getDashboardSession();
|
|
221
|
+
if (existingSession) {
|
|
222
|
+
console.error(`Dashboard is already running at: ${existingSession.url}`);
|
|
223
|
+
console.error('');
|
|
224
|
+
console.error('You can:');
|
|
225
|
+
console.error(` 1. Use the existing dashboard at: ${existingSession.url}`);
|
|
226
|
+
console.error(` 2. Stop it first (Ctrl+C or kill ${existingSession.pid}), then start a new one`);
|
|
227
|
+
console.error('');
|
|
228
|
+
console.error('Note: Only one dashboard instance is needed for all your projects.');
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
// Use specified port or default
|
|
232
|
+
const dashboardPort = port || DEFAULT_DASHBOARD_PORT;
|
|
233
|
+
// Dashboard only mode - use new multi-project dashboard
|
|
234
|
+
console.error(`Starting Unified Multi-Project Dashboard`);
|
|
235
|
+
if (port) {
|
|
236
|
+
console.error(`Using custom port: ${port}`);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
console.error(`Using default port: ${DEFAULT_DASHBOARD_PORT}`);
|
|
240
|
+
}
|
|
241
|
+
if (noOpen) {
|
|
242
|
+
console.error(`Browser auto-open disabled (--no-open)`);
|
|
243
|
+
}
|
|
244
|
+
// Load configuration from environment variables
|
|
245
|
+
let bindAddress;
|
|
246
|
+
let allowExternalAccess;
|
|
247
|
+
const securityConfig = {};
|
|
248
|
+
// Network binding configuration
|
|
249
|
+
if (process.env.SPEC_WORKFLOW_BIND_ADDRESS) {
|
|
250
|
+
bindAddress = process.env.SPEC_WORKFLOW_BIND_ADDRESS;
|
|
251
|
+
}
|
|
252
|
+
// External access opt-in (only override if explicitly set to true or false)
|
|
253
|
+
if (process.env.SPEC_WORKFLOW_ALLOW_EXTERNAL_ACCESS !== undefined) {
|
|
254
|
+
const allowExternal = process.env.SPEC_WORKFLOW_ALLOW_EXTERNAL_ACCESS.toLowerCase();
|
|
255
|
+
if (allowExternal === 'true') {
|
|
256
|
+
allowExternalAccess = true;
|
|
257
|
+
}
|
|
258
|
+
else if (allowExternal === 'false') {
|
|
259
|
+
allowExternalAccess = false;
|
|
260
|
+
}
|
|
261
|
+
// If invalid value, ignore and use default
|
|
262
|
+
}
|
|
263
|
+
// Security features configuration
|
|
264
|
+
// Rate limiting toggle (only override if explicitly set to true or false)
|
|
265
|
+
if (process.env.SPEC_WORKFLOW_RATE_LIMIT_ENABLED !== undefined) {
|
|
266
|
+
const rateLimitEnabled = process.env.SPEC_WORKFLOW_RATE_LIMIT_ENABLED.toLowerCase();
|
|
267
|
+
if (rateLimitEnabled === 'true') {
|
|
268
|
+
securityConfig.rateLimitEnabled = true;
|
|
269
|
+
}
|
|
270
|
+
else if (rateLimitEnabled === 'false') {
|
|
271
|
+
securityConfig.rateLimitEnabled = false;
|
|
272
|
+
}
|
|
273
|
+
// If invalid value, ignore and use default
|
|
274
|
+
}
|
|
275
|
+
// CORS toggle (only override if explicitly set to true or false)
|
|
276
|
+
if (process.env.SPEC_WORKFLOW_CORS_ENABLED !== undefined) {
|
|
277
|
+
const corsEnabled = process.env.SPEC_WORKFLOW_CORS_ENABLED.toLowerCase();
|
|
278
|
+
if (corsEnabled === 'true') {
|
|
279
|
+
securityConfig.corsEnabled = true;
|
|
280
|
+
}
|
|
281
|
+
else if (corsEnabled === 'false') {
|
|
282
|
+
securityConfig.corsEnabled = false;
|
|
283
|
+
}
|
|
284
|
+
// If invalid value, ignore and use default
|
|
285
|
+
}
|
|
286
|
+
// Create dashboard server (network binding validation happens in constructor)
|
|
287
|
+
let dashboardServer;
|
|
288
|
+
try {
|
|
289
|
+
dashboardServer = new MultiProjectDashboardServer({
|
|
290
|
+
autoOpen: !noOpen,
|
|
291
|
+
port: dashboardPort,
|
|
292
|
+
bindAddress,
|
|
293
|
+
allowExternalAccess,
|
|
294
|
+
security: securityConfig
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
// Provide user-friendly error message with environment variable names
|
|
299
|
+
if (error.message.includes('SECURITY ERROR') || error.message.includes('non-localhost')) {
|
|
300
|
+
console.error('');
|
|
301
|
+
console.error('❌ Security Configuration Error:');
|
|
302
|
+
console.error(error.message);
|
|
303
|
+
console.error('');
|
|
304
|
+
console.error('To fix this, either:');
|
|
305
|
+
console.error(' 1. Use localhost binding (secure):');
|
|
306
|
+
console.error(' export SPEC_WORKFLOW_BIND_ADDRESS=127.0.0.1');
|
|
307
|
+
console.error('');
|
|
308
|
+
console.error(' 2. Explicitly allow external access (insecure):');
|
|
309
|
+
console.error(' export SPEC_WORKFLOW_ALLOW_EXTERNAL_ACCESS=true');
|
|
310
|
+
console.error('');
|
|
311
|
+
process.exit(1);
|
|
312
|
+
}
|
|
313
|
+
throw error; // Re-throw other errors
|
|
314
|
+
}
|
|
315
|
+
try {
|
|
316
|
+
const dashboardUrl = await dashboardServer.start();
|
|
317
|
+
console.error(`Dashboard started at: ${dashboardUrl}`);
|
|
318
|
+
console.error('Projects will automatically appear as MCP servers register.');
|
|
319
|
+
console.error('Press Ctrl+C to stop the dashboard');
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
console.error(`Failed to start dashboard: ${error.message}`);
|
|
323
|
+
process.exit(1);
|
|
324
|
+
}
|
|
325
|
+
// Handle graceful shutdown
|
|
326
|
+
const shutdown = async () => {
|
|
327
|
+
console.error('\nShutting down dashboard...');
|
|
328
|
+
await dashboardServer.stop();
|
|
329
|
+
process.exit(0);
|
|
330
|
+
};
|
|
331
|
+
process.on('SIGINT', shutdown);
|
|
332
|
+
process.on('SIGTERM', shutdown);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
// MCP server mode
|
|
336
|
+
console.error(`Starting Spec Workflow MCP Server for project: ${workflowRootPath}`);
|
|
337
|
+
console.error(`Workspace path: ${workspacePath}`);
|
|
338
|
+
console.error(`Working directory: ${process.cwd()}`);
|
|
339
|
+
const server = new SpecWorkflowMCPServer();
|
|
340
|
+
await server.initialize(workflowRootPath, workspacePath, lang);
|
|
341
|
+
// Handle graceful shutdown
|
|
342
|
+
process.on('SIGINT', async () => {
|
|
343
|
+
await server.stop();
|
|
344
|
+
process.exit(0);
|
|
345
|
+
});
|
|
346
|
+
process.on('SIGTERM', async () => {
|
|
347
|
+
await server.stop();
|
|
348
|
+
process.exit(0);
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
console.error('Error:', error.message);
|
|
354
|
+
// Provide additional context for common path-related issues
|
|
355
|
+
if (error.message.includes('ENOENT') || error.message.includes('path') || error.message.includes('directory')) {
|
|
356
|
+
console.error('\nProject path troubleshooting:');
|
|
357
|
+
console.error('- Verify the project path exists and is accessible');
|
|
358
|
+
console.error('- For Claude CLI users, ensure you used: claude mcp add spec-workflow npx -y @arimakouyou/spec-workflow-mcp@latest -- /path/to/your/project');
|
|
359
|
+
console.error('- Check that the path doesn\'t contain special characters that need escaping');
|
|
360
|
+
console.error(`- Current working directory: ${process.cwd()}`);
|
|
361
|
+
}
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
export function resolveEntrypoint(pathValue) {
|
|
366
|
+
if (!pathValue)
|
|
367
|
+
return undefined;
|
|
368
|
+
try {
|
|
369
|
+
return realpathSync(pathValue);
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return resolve(pathValue);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
const entrypoint = resolveEntrypoint(process.argv[1]);
|
|
376
|
+
const currentFile = resolveEntrypoint(fileURLToPath(import.meta.url));
|
|
377
|
+
if (entrypoint && currentFile && currentFile === entrypoint) {
|
|
378
|
+
main().catch(() => process.exit(1));
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,yBAAyB;AACzB,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,SAAS,QAAQ;IACf,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEf,CAAC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAc;IAU3C,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,qBAAqB,GAAG,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IAC1E,IAAI,UAA8B,CAAC;IAEnC,0BAA0B;IAC1B,MAAM,UAAU,GAAG,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4BAA4B,CAAC,CAAC;IACxG,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,wCAAwC,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,wCAAwC,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,4BAA4B;YAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACrC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,0BAA0B,CAAC,CAAC;gBAC7E,CAAC;gBACD,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,wDAAwD,CAAC,CAAC;gBAC1F,CAAC;gBACD,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACnD,4BAA4B;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,0BAA0B,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,wDAAwD,CAAC,CAAC;YAC1F,CAAC;YACD,UAAU,GAAG,MAAM,CAAC;YACpB,CAAC,EAAE,CAAC,CAAC,gDAAgD;QACvD,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC9C,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,GAAG,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,GAAG,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,GAAG,KAAK,4BAA4B;YAAE,OAAO,KAAK,CAAC;QACvD,gDAAgD;QAChD,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAE/F,2FAA2F;IAC3F,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,gEAAgE,aAAa,EAAE,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,aAAa;QACb,gBAAgB;QAChB,YAAY;QACZ,eAAe;QACf,qBAAqB;QACrB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,MAAM;KACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEnC,sBAAsB;QACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,QAAQ,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,+BAA+B;QAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAClD,MAAM,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;QAE5D,uEAAuE;QACvE,IAAI,aAAa,KAAK,gBAAgB,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,iBAAiB,aAAa,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,oBAAoB,gBAAgB,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,qBAAqB,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;YACvF,OAAO,CAAC,KAAK,CAAC,iBAAiB,aAAa,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,oCAAoC;QACpC,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QAEvC,IAAI,eAAe,EAAE,CAAC;YACpB,6EAA6E;YAC7E,MAAM,cAAc,GAAG,IAAI,uBAAuB,EAAE,CAAC;YACrD,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,mBAAmB,EAAE,CAAC;YAEnE,IAAI,eAAe,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,oCAAoC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC;gBACzE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC1B,OAAO,CAAC,KAAK,CAAC,uCAAuC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC5E,OAAO,CAAC,KAAK,CAAC,sCAAsC,eAAe,CAAC,GAAG,yBAAyB,CAAC,CAAC;gBAClG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,gCAAgC;YAChC,MAAM,aAAa,GAAG,IAAI,IAAI,sBAAsB,CAAC;YAErD,wDAAwD;YACxD,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC1D,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,uBAAuB,sBAAsB,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC1D,CAAC;YAED,gDAAgD;YAChD,IAAI,WAA+B,CAAC;YACpC,IAAI,mBAAwC,CAAC;YAC7C,MAAM,cAAc,GAAQ,EAAE,CAAC;YAE/B,gCAAgC;YAChC,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC;gBAC3C,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;YACvD,CAAC;YAED,4EAA4E;YAC5E,IAAI,OAAO,CAAC,GAAG,CAAC,mCAAmC,KAAK,SAAS,EAAE,CAAC;gBAClE,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,WAAW,EAAE,CAAC;gBACpF,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;oBAC7B,mBAAmB,GAAG,IAAI,CAAC;gBAC7B,CAAC;qBAAM,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;oBACrC,mBAAmB,GAAG,KAAK,CAAC;gBAC9B,CAAC;gBACD,2CAA2C;YAC7C,CAAC;YAED,kCAAkC;YAElC,0EAA0E;YAC1E,IAAI,OAAO,CAAC,GAAG,CAAC,gCAAgC,KAAK,SAAS,EAAE,CAAC;gBAC/D,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,WAAW,EAAE,CAAC;gBACpF,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;oBAChC,cAAc,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBACzC,CAAC;qBAAM,IAAI,gBAAgB,KAAK,OAAO,EAAE,CAAC;oBACxC,cAAc,CAAC,gBAAgB,GAAG,KAAK,CAAC;gBAC1C,CAAC;gBACD,2CAA2C;YAC7C,CAAC;YAED,iEAAiE;YACjE,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,SAAS,EAAE,CAAC;gBACzD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,WAAW,EAAE,CAAC;gBACzE,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;oBAC3B,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC;gBACpC,CAAC;qBAAM,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;oBACnC,cAAc,CAAC,WAAW,GAAG,KAAK,CAAC;gBACrC,CAAC;gBACD,2CAA2C;YAC7C,CAAC;YAED,8EAA8E;YAC9E,IAAI,eAA4C,CAAC;YACjD,IAAI,CAAC;gBACH,eAAe,GAAG,IAAI,2BAA2B,CAAC;oBAChD,QAAQ,EAAE,CAAC,MAAM;oBACjB,IAAI,EAAE,aAAa;oBACnB,WAAW;oBACX,mBAAmB;oBACnB,QAAQ,EAAE,cAAc;iBACzB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,sEAAsE;gBACtE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;oBACxF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;oBACjD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC7B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;oBACtC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;oBACtD,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;oBAClE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;oBACnE,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;oBACtE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,KAAK,CAAC,CAAC,wBAAwB;YACvC,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;gBACnD,OAAO,CAAC,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;gBACvD,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;gBAC7E,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;gBAC1B,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAElC,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,OAAO,CAAC,KAAK,CAAC,kDAAkD,gBAAgB,EAAE,CAAC,CAAC;YACpF,OAAO,CAAC,KAAK,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAErD,MAAM,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;YAE3C,MAAM,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;YAE/D,2BAA2B;YAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;gBAC9B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;gBAC/B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC;IAEH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAEvC,4DAA4D;QAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9G,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,6IAA6I,CAAC,CAAC;YAC7J,OAAO,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;YAC9F,OAAO,CAAC,KAAK,CAAC,gCAAgC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA6B;IAC7D,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtE,IAAI,UAAU,IAAI,WAAW,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;IAC5D,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Design Document
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
[High-level description of the feature and its place in the overall system]
|
|
6
|
+
|
|
7
|
+
## Steering Document Alignment
|
|
8
|
+
|
|
9
|
+
### Technical Standards (tech.md)
|
|
10
|
+
[How the design follows documented technical patterns and standards]
|
|
11
|
+
|
|
12
|
+
### Project Structure (structure.md)
|
|
13
|
+
[How the implementation will follow project organization conventions]
|
|
14
|
+
|
|
15
|
+
## Code Reuse Analysis
|
|
16
|
+
[What existing code will be leveraged, extended, or integrated with this feature]
|
|
17
|
+
|
|
18
|
+
### Existing Components to Leverage
|
|
19
|
+
- **[Component/Utility Name]**: [How it will be used]
|
|
20
|
+
- **[Service/Helper Name]**: [How it will be extended]
|
|
21
|
+
|
|
22
|
+
### Integration Points
|
|
23
|
+
- **[Existing System/API]**: [How the new feature will integrate]
|
|
24
|
+
- **[Database/Storage]**: [How data will connect to existing schemas]
|
|
25
|
+
|
|
26
|
+
## Architecture
|
|
27
|
+
|
|
28
|
+
[Describe the overall architecture and design patterns used]
|
|
29
|
+
|
|
30
|
+
### Modular Design Principles
|
|
31
|
+
- **Single File Responsibility**: Each file should handle one specific concern or domain
|
|
32
|
+
- **Component Isolation**: Create small, focused components rather than large monolithic files
|
|
33
|
+
- **Service Layer Separation**: Separate data access, business logic, and presentation layers
|
|
34
|
+
- **Utility Modularity**: Break utilities into focused, single-purpose modules
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
graph TD
|
|
38
|
+
A[Component A] --> B[Component B]
|
|
39
|
+
B --> C[Component C]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Components and Interfaces
|
|
43
|
+
|
|
44
|
+
### Component 1
|
|
45
|
+
- **Purpose:** [What this component does]
|
|
46
|
+
- **Interfaces:** [Public methods/APIs]
|
|
47
|
+
- **Dependencies:** [What it depends on]
|
|
48
|
+
- **Reuses:** [Existing components/utilities it builds upon]
|
|
49
|
+
|
|
50
|
+
### Component 2
|
|
51
|
+
- **Purpose:** [What this component does]
|
|
52
|
+
- **Interfaces:** [Public methods/APIs]
|
|
53
|
+
- **Dependencies:** [What it depends on]
|
|
54
|
+
- **Reuses:** [Existing components/utilities it builds upon]
|
|
55
|
+
|
|
56
|
+
## Data Models
|
|
57
|
+
|
|
58
|
+
### Model 1
|
|
59
|
+
```
|
|
60
|
+
[Define the structure of Model1 in your language]
|
|
61
|
+
- id: [unique identifier type]
|
|
62
|
+
- name: [string/text type]
|
|
63
|
+
- [Additional properties as needed]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Model 2
|
|
67
|
+
```
|
|
68
|
+
[Define the structure of Model2 in your language]
|
|
69
|
+
- id: [unique identifier type]
|
|
70
|
+
- [Additional properties as needed]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Error Handling
|
|
74
|
+
|
|
75
|
+
### Error Scenarios
|
|
76
|
+
1. **Scenario 1:** [Description]
|
|
77
|
+
- **Handling:** [How to handle]
|
|
78
|
+
- **User Impact:** [What user sees]
|
|
79
|
+
|
|
80
|
+
2. **Scenario 2:** [Description]
|
|
81
|
+
- **Handling:** [How to handle]
|
|
82
|
+
- **User Impact:** [What user sees]
|
|
83
|
+
|
|
84
|
+
## Container Architecture
|
|
85
|
+
|
|
86
|
+
### Application Container
|
|
87
|
+
- **Base Image:** [例: rust:1.82-slim, node:22-alpine]
|
|
88
|
+
- **Build Strategy:** [multi-stage build / single stage]
|
|
89
|
+
- **Exposed Ports:** [例: 3000 (API), 3001 (frontend)]
|
|
90
|
+
|
|
91
|
+
### Service Dependencies
|
|
92
|
+
|
|
93
|
+
| Service | Image | Port | Purpose |
|
|
94
|
+
|---------|-------|------|---------|
|
|
95
|
+
| [DB] | [例: postgres:16-alpine] | [例: 5432] | [Primary database] |
|
|
96
|
+
| [Cache] | [例: valkey/valkey:8-alpine] | [例: 6379] | [Cache/Session] |
|
|
97
|
+
|
|
98
|
+
### docker-compose Structure
|
|
99
|
+
[開発用 docker-compose.yml の構成概要。サービス間のネットワーク、ボリューム、環境変数]
|
|
100
|
+
|
|
101
|
+
### Test Container Strategy
|
|
102
|
+
|
|
103
|
+
| Service | Strategy | Notes |
|
|
104
|
+
|---------|----------|-------|
|
|
105
|
+
| DB | testcontainers / docker-compose.test.yml | テストごとにクリーンな DB |
|
|
106
|
+
| Cache | testcontainers / in-memory stub | |
|
|
107
|
+
| External API | mock server container / trait DI | |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Testing Strategy
|
|
112
|
+
|
|
113
|
+
> 詳細なテスト仕様(テストケースレベル)は test-design.md に定義する。
|
|
114
|
+
> このセクションはテスト戦略の概要のみを記載する。
|
|
115
|
+
|
|
116
|
+
### Unit Testing
|
|
117
|
+
- [ユニットテスト方針の概要]
|
|
118
|
+
- [テスト対象の主要コンポーネント]
|
|
119
|
+
|
|
120
|
+
### Integration Testing
|
|
121
|
+
- [統合テスト方針の概要]
|
|
122
|
+
- [テスト対象の主要フロー]
|
|
123
|
+
|
|
124
|
+
### End-to-End Testing
|
|
125
|
+
- [E2Eテスト方針の概要]
|
|
126
|
+
- [テスト対象のユーザーシナリオ]
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Product Overview
|
|
2
|
+
|
|
3
|
+
## Product Purpose
|
|
4
|
+
[Describe the core purpose of this product/project. What problem does it solve?]
|
|
5
|
+
|
|
6
|
+
## Target Users
|
|
7
|
+
[Who are the primary users of this product? What are their needs and pain points?]
|
|
8
|
+
|
|
9
|
+
## Key Features
|
|
10
|
+
[List the main features that deliver value to users]
|
|
11
|
+
|
|
12
|
+
1. **Feature 1**: [Description]
|
|
13
|
+
2. **Feature 2**: [Description]
|
|
14
|
+
3. **Feature 3**: [Description]
|
|
15
|
+
|
|
16
|
+
## Business Objectives
|
|
17
|
+
[What are the business goals this product aims to achieve?]
|
|
18
|
+
|
|
19
|
+
- [Objective 1]
|
|
20
|
+
- [Objective 2]
|
|
21
|
+
- [Objective 3]
|
|
22
|
+
|
|
23
|
+
## Success Metrics
|
|
24
|
+
[How will we measure the success of this product?]
|
|
25
|
+
|
|
26
|
+
- [Metric 1]: [Target]
|
|
27
|
+
- [Metric 2]: [Target]
|
|
28
|
+
- [Metric 3]: [Target]
|
|
29
|
+
|
|
30
|
+
## Product Principles
|
|
31
|
+
[Core principles that guide product decisions]
|
|
32
|
+
|
|
33
|
+
1. **[Principle 1]**: [Explanation]
|
|
34
|
+
2. **[Principle 2]**: [Explanation]
|
|
35
|
+
3. **[Principle 3]**: [Explanation]
|
|
36
|
+
|
|
37
|
+
## Monitoring & Visibility (if applicable)
|
|
38
|
+
[How do users track progress and monitor the system?]
|
|
39
|
+
|
|
40
|
+
- **Dashboard Type**: [e.g., Web-based, CLI, Desktop app]
|
|
41
|
+
- **Real-time Updates**: [e.g., WebSocket, polling, push notifications]
|
|
42
|
+
- **Key Metrics Displayed**: [What information is most important to surface]
|
|
43
|
+
- **Sharing Capabilities**: [e.g., read-only links, exports, reports]
|
|
44
|
+
|
|
45
|
+
## Future Vision
|
|
46
|
+
[Where do we see this product evolving in the future?]
|
|
47
|
+
|
|
48
|
+
### Potential Enhancements
|
|
49
|
+
- **Remote Access**: [e.g., Tunnel features for sharing dashboards with stakeholders]
|
|
50
|
+
- **Analytics**: [e.g., Historical trends, performance metrics]
|
|
51
|
+
- **Collaboration**: [e.g., Multi-user support, commenting]
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Requirements Document
|
|
2
|
+
|
|
3
|
+
## Introduction
|
|
4
|
+
|
|
5
|
+
[Provide a brief overview of the feature, its purpose, and its value to users]
|
|
6
|
+
|
|
7
|
+
## Alignment with Product Vision
|
|
8
|
+
|
|
9
|
+
[Explain how this feature supports the goals outlined in product.md]
|
|
10
|
+
|
|
11
|
+
## Requirements
|
|
12
|
+
|
|
13
|
+
### Requirement 1
|
|
14
|
+
|
|
15
|
+
**User Story:** As a [role], I want [feature], so that [benefit]
|
|
16
|
+
|
|
17
|
+
#### Acceptance Criteria
|
|
18
|
+
|
|
19
|
+
1. WHEN [event] THEN [system] SHALL [response]
|
|
20
|
+
2. IF [precondition] THEN [system] SHALL [response]
|
|
21
|
+
3. WHEN [event] AND [condition] THEN [system] SHALL [response]
|
|
22
|
+
|
|
23
|
+
### Requirement 2
|
|
24
|
+
|
|
25
|
+
**User Story:** As a [role], I want [feature], so that [benefit]
|
|
26
|
+
|
|
27
|
+
#### Acceptance Criteria
|
|
28
|
+
|
|
29
|
+
1. WHEN [event] THEN [system] SHALL [response]
|
|
30
|
+
2. IF [precondition] THEN [system] SHALL [response]
|
|
31
|
+
|
|
32
|
+
## Non-Functional Requirements
|
|
33
|
+
|
|
34
|
+
### Code Architecture and Modularity
|
|
35
|
+
- **Single Responsibility Principle**: Each file should have a single, well-defined purpose
|
|
36
|
+
- **Modular Design**: Components, utilities, and services should be isolated and reusable
|
|
37
|
+
- **Dependency Management**: Minimize interdependencies between modules
|
|
38
|
+
- **Clear Interfaces**: Define clean contracts between components and layers
|
|
39
|
+
|
|
40
|
+
### Performance
|
|
41
|
+
- [Performance requirements]
|
|
42
|
+
|
|
43
|
+
### Security
|
|
44
|
+
- [Security requirements]
|
|
45
|
+
|
|
46
|
+
### Reliability
|
|
47
|
+
- [Reliability requirements]
|
|
48
|
+
|
|
49
|
+
### Usability
|
|
50
|
+
- [Usability requirements]
|