@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,180 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { promises as fs } from 'fs';
|
|
3
|
+
import { getGlobalDir, getPermissionErrorHelp } from '../core/global-dir.js';
|
|
4
|
+
export class SettingsManager {
|
|
5
|
+
settingsPath;
|
|
6
|
+
settingsDir;
|
|
7
|
+
constructor() {
|
|
8
|
+
this.settingsDir = getGlobalDir();
|
|
9
|
+
this.settingsPath = join(this.settingsDir, 'settings.json');
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Ensure the settings directory exists
|
|
13
|
+
*/
|
|
14
|
+
async ensureSettingsDir() {
|
|
15
|
+
try {
|
|
16
|
+
await fs.mkdir(this.settingsDir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
// Directory might already exist, ignore EEXIST errors
|
|
20
|
+
if (error.code === 'EEXIST') {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// For permission errors, provide helpful guidance
|
|
24
|
+
if (error.code === 'EACCES' || error.code === 'EPERM') {
|
|
25
|
+
console.error(getPermissionErrorHelp('create directory', this.settingsDir));
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
// Re-throw other errors
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Load global settings from file
|
|
34
|
+
*/
|
|
35
|
+
async loadSettings() {
|
|
36
|
+
await this.ensureSettingsDir();
|
|
37
|
+
try {
|
|
38
|
+
const content = await fs.readFile(this.settingsPath, 'utf-8');
|
|
39
|
+
// Handle empty or whitespace-only files
|
|
40
|
+
const trimmedContent = content.trim();
|
|
41
|
+
if (!trimmedContent) {
|
|
42
|
+
console.error(`[SettingsManager] Warning: ${this.settingsPath} is empty, using default settings`);
|
|
43
|
+
const defaultSettings = {
|
|
44
|
+
automationJobs: [],
|
|
45
|
+
createdAt: new Date().toISOString(),
|
|
46
|
+
lastModified: new Date().toISOString()
|
|
47
|
+
};
|
|
48
|
+
// Write default settings to file
|
|
49
|
+
await this.saveSettings(defaultSettings);
|
|
50
|
+
return defaultSettings;
|
|
51
|
+
}
|
|
52
|
+
const parsed = JSON.parse(trimmedContent);
|
|
53
|
+
// Ensure backward compatibility: add default automationJobs array if missing (older format)
|
|
54
|
+
if (!Array.isArray(parsed.automationJobs)) {
|
|
55
|
+
parsed.automationJobs = [];
|
|
56
|
+
}
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (error.code === 'ENOENT') {
|
|
61
|
+
// File doesn't exist yet, create it with default settings
|
|
62
|
+
const defaultSettings = {
|
|
63
|
+
automationJobs: [],
|
|
64
|
+
createdAt: new Date().toISOString(),
|
|
65
|
+
lastModified: new Date().toISOString()
|
|
66
|
+
};
|
|
67
|
+
await this.saveSettings(defaultSettings);
|
|
68
|
+
return defaultSettings;
|
|
69
|
+
}
|
|
70
|
+
if (error instanceof SyntaxError) {
|
|
71
|
+
// JSON parsing error - file is corrupted or invalid
|
|
72
|
+
console.error(`[SettingsManager] Error: Failed to parse ${this.settingsPath}: ${error.message}`);
|
|
73
|
+
console.error(`[SettingsManager] The file may be corrupted. Using default settings.`);
|
|
74
|
+
// Back up the corrupted file
|
|
75
|
+
try {
|
|
76
|
+
const backupPath = `${this.settingsPath}.corrupted.${Date.now()}`;
|
|
77
|
+
await fs.copyFile(this.settingsPath, backupPath);
|
|
78
|
+
console.error(`[SettingsManager] Corrupted file backed up to: ${backupPath}`);
|
|
79
|
+
}
|
|
80
|
+
catch (backupError) {
|
|
81
|
+
// Ignore backup errors
|
|
82
|
+
}
|
|
83
|
+
const defaultSettings = {
|
|
84
|
+
automationJobs: [],
|
|
85
|
+
createdAt: new Date().toISOString(),
|
|
86
|
+
lastModified: new Date().toISOString()
|
|
87
|
+
};
|
|
88
|
+
// Write default settings to file
|
|
89
|
+
await this.saveSettings(defaultSettings);
|
|
90
|
+
return defaultSettings;
|
|
91
|
+
}
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Save global settings to file atomically
|
|
97
|
+
*/
|
|
98
|
+
async saveSettings(settings) {
|
|
99
|
+
await this.ensureSettingsDir();
|
|
100
|
+
// Update modification timestamp
|
|
101
|
+
settings.lastModified = new Date().toISOString();
|
|
102
|
+
if (!settings.createdAt) {
|
|
103
|
+
settings.createdAt = new Date().toISOString();
|
|
104
|
+
}
|
|
105
|
+
const content = JSON.stringify(settings, null, 2);
|
|
106
|
+
// Write to temporary file first, then rename for atomic operation
|
|
107
|
+
const tempPath = `${this.settingsPath}.tmp`;
|
|
108
|
+
await fs.writeFile(tempPath, content, 'utf-8');
|
|
109
|
+
await fs.rename(tempPath, this.settingsPath);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get a specific automation job by ID
|
|
113
|
+
*/
|
|
114
|
+
async getJob(jobId) {
|
|
115
|
+
const settings = await this.loadSettings();
|
|
116
|
+
return settings.automationJobs.find(job => job.id === jobId) || null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get all automation jobs
|
|
120
|
+
*/
|
|
121
|
+
async getAllJobs() {
|
|
122
|
+
const settings = await this.loadSettings();
|
|
123
|
+
return settings.automationJobs;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Add a new automation job
|
|
127
|
+
*/
|
|
128
|
+
async addJob(job) {
|
|
129
|
+
const settings = await this.loadSettings();
|
|
130
|
+
// Check for duplicate ID
|
|
131
|
+
if (settings.automationJobs.some(j => j.id === job.id)) {
|
|
132
|
+
throw new Error(`Job with ID ${job.id} already exists`);
|
|
133
|
+
}
|
|
134
|
+
settings.automationJobs.push(job);
|
|
135
|
+
await this.saveSettings(settings);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Update an existing automation job
|
|
139
|
+
*/
|
|
140
|
+
async updateJob(jobId, updates) {
|
|
141
|
+
const settings = await this.loadSettings();
|
|
142
|
+
const jobIndex = settings.automationJobs.findIndex(j => j.id === jobId);
|
|
143
|
+
if (jobIndex === -1) {
|
|
144
|
+
throw new Error(`Job with ID ${jobId} not found`);
|
|
145
|
+
}
|
|
146
|
+
// Merge updates, but don't allow changing ID or type
|
|
147
|
+
settings.automationJobs[jobIndex] = {
|
|
148
|
+
...settings.automationJobs[jobIndex],
|
|
149
|
+
...updates,
|
|
150
|
+
id: settings.automationJobs[jobIndex].id,
|
|
151
|
+
type: settings.automationJobs[jobIndex].type
|
|
152
|
+
};
|
|
153
|
+
await this.saveSettings(settings);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Delete an automation job
|
|
157
|
+
*/
|
|
158
|
+
async deleteJob(jobId) {
|
|
159
|
+
const settings = await this.loadSettings();
|
|
160
|
+
const originalLength = settings.automationJobs.length;
|
|
161
|
+
settings.automationJobs = settings.automationJobs.filter(j => j.id !== jobId);
|
|
162
|
+
if (settings.automationJobs.length === originalLength) {
|
|
163
|
+
throw new Error(`Job with ID ${jobId} not found`);
|
|
164
|
+
}
|
|
165
|
+
await this.saveSettings(settings);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get the settings file path
|
|
169
|
+
*/
|
|
170
|
+
getSettingsPath() {
|
|
171
|
+
return this.settingsPath;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get the settings directory path
|
|
175
|
+
*/
|
|
176
|
+
getSettingsDir() {
|
|
177
|
+
return this.settingsDir;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=settings-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/dashboard/settings-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const DASHBOARD_TEST_MESSAGE = "MCP Workflow Dashboard Online!";
|
|
2
|
+
/**
|
|
3
|
+
* Find an available ephemeral port in the range 49152-65535 on the specified host
|
|
4
|
+
* NOTE: This function is not used in the current implementation.
|
|
5
|
+
* @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
|
|
6
|
+
* @returns Promise<number> the available port
|
|
7
|
+
*/
|
|
8
|
+
export declare function findAvailablePort(host: string): Promise<number>;
|
|
9
|
+
/**
|
|
10
|
+
* Check if a specific port is available for use on the specified host
|
|
11
|
+
* @param port The port number to check
|
|
12
|
+
* @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
|
|
13
|
+
* @returns Promise<boolean> true if port is available, false otherwise
|
|
14
|
+
*/
|
|
15
|
+
export declare function isSpecificPortAvailable(port: number, host: string): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if an existing dashboard is running on the specified port and host
|
|
18
|
+
* @param port The port number to check
|
|
19
|
+
* @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
|
|
20
|
+
* @returns Promise<boolean> true if a dashboard is running on the specified port and host, false otherwise
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkExistingDashboard(port: number, host: string): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* Validate a port number and check if it's available on the specified host
|
|
25
|
+
* @param port The port number to validate and check
|
|
26
|
+
* @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
|
|
27
|
+
* @param skipDashboardCheck Optional flag to skip checking for existing dashboard
|
|
28
|
+
* @returns Promise<void> throws error if invalid or unavailable
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateAndCheckPort(port: number, host: string, skipDashboardCheck?: boolean): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/dashboard/utils.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,mCAAmC,CAAC;AAmBvE;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBrE;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1F;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBzF;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzH"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { createServer } from 'net';
|
|
2
|
+
// Dashboard constants
|
|
3
|
+
export const DASHBOARD_TEST_MESSAGE = 'MCP Workflow Dashboard Online!';
|
|
4
|
+
async function isPortAvailable(port, host) {
|
|
5
|
+
return new Promise((resolve) => {
|
|
6
|
+
const server = createServer();
|
|
7
|
+
server.listen(port, host, () => {
|
|
8
|
+
server.once('close', () => {
|
|
9
|
+
resolve(true);
|
|
10
|
+
});
|
|
11
|
+
server.close();
|
|
12
|
+
});
|
|
13
|
+
server.on('error', () => {
|
|
14
|
+
resolve(false);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Find an available ephemeral port in the range 49152-65535 on the specified host
|
|
20
|
+
* NOTE: This function is not used in the current implementation.
|
|
21
|
+
* @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
|
|
22
|
+
* @returns Promise<number> the available port
|
|
23
|
+
*/
|
|
24
|
+
export async function findAvailablePort(host) {
|
|
25
|
+
// Use industry standard ephemeral port range (49152-65535)
|
|
26
|
+
const ephemeralStart = 49152;
|
|
27
|
+
const ephemeralEnd = 65535;
|
|
28
|
+
// Generate a random starting point to avoid always using the same ports
|
|
29
|
+
const randomStart = ephemeralStart + Math.floor(Math.random() * 1000);
|
|
30
|
+
for (let port = randomStart; port <= ephemeralEnd; port++) {
|
|
31
|
+
if (await isPortAvailable(port, host)) {
|
|
32
|
+
return port;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// If we didn't find one from random start to end, try from beginning to random start
|
|
36
|
+
for (let port = ephemeralStart; port < randomStart; port++) {
|
|
37
|
+
if (await isPortAvailable(port, host)) {
|
|
38
|
+
return port;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`No available ephemeral port found in range ${ephemeralStart}-${ephemeralEnd} on ${host}`);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if a specific port is available for use on the specified host
|
|
45
|
+
* @param port The port number to check
|
|
46
|
+
* @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
|
|
47
|
+
* @returns Promise<boolean> true if port is available, false otherwise
|
|
48
|
+
*/
|
|
49
|
+
export async function isSpecificPortAvailable(port, host) {
|
|
50
|
+
return isPortAvailable(port, host);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if an existing dashboard is running on the specified port and host
|
|
54
|
+
* @param port The port number to check
|
|
55
|
+
* @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
|
|
56
|
+
* @returns Promise<boolean> true if a dashboard is running on the specified port and host, false otherwise
|
|
57
|
+
*/
|
|
58
|
+
export async function checkExistingDashboard(port, host) {
|
|
59
|
+
try {
|
|
60
|
+
const response = await fetch(`http://${host}:${port}/api/test`, {
|
|
61
|
+
method: 'GET',
|
|
62
|
+
signal: AbortSignal.timeout(1000) // 1 second timeout
|
|
63
|
+
});
|
|
64
|
+
if (response.ok) {
|
|
65
|
+
const data = await response.json();
|
|
66
|
+
// Check if it's actually our dashboard
|
|
67
|
+
return data.message === DASHBOARD_TEST_MESSAGE;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Connection failed or timeout - no dashboard running
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validate a port number and check if it's available on the specified host
|
|
78
|
+
* @param port The port number to validate and check
|
|
79
|
+
* @param host The host/IP address to check (e.g., '127.0.0.1', '0.0.0.0')
|
|
80
|
+
* @param skipDashboardCheck Optional flag to skip checking for existing dashboard
|
|
81
|
+
* @returns Promise<void> throws error if invalid or unavailable
|
|
82
|
+
*/
|
|
83
|
+
export async function validateAndCheckPort(port, host, skipDashboardCheck = false) {
|
|
84
|
+
// Validate port range first
|
|
85
|
+
if (port < 1024 || port > 65535) {
|
|
86
|
+
throw new Error(`Port ${port} is out of range. Port must be between 1024 and 65535.`);
|
|
87
|
+
}
|
|
88
|
+
// Check if it's our dashboard first (more efficient when dashboard exists)
|
|
89
|
+
if (!skipDashboardCheck) {
|
|
90
|
+
const isDashboard = await checkExistingDashboard(port, host);
|
|
91
|
+
if (isDashboard) {
|
|
92
|
+
// Let caller handle existing dashboard scenario
|
|
93
|
+
throw new Error(`Port ${port} is already in use on ${host} by an existing dashboard instance.`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Only check general port availability if it's not our dashboard
|
|
97
|
+
const available = await isSpecificPortAvailable(port, host);
|
|
98
|
+
if (!available) {
|
|
99
|
+
throw new Error(`Port ${port} is already in use on ${host}. Please choose a different port or omit --port to use an ephemeral port.`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/dashboard/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { SpecParser, ParsedSpec } from './parser.js';
|
|
3
|
+
export interface SpecChangeEvent {
|
|
4
|
+
type: 'spec' | 'steering';
|
|
5
|
+
action: 'created' | 'updated' | 'deleted';
|
|
6
|
+
name: string;
|
|
7
|
+
data?: ParsedSpec | any;
|
|
8
|
+
}
|
|
9
|
+
export declare class SpecWatcher extends EventEmitter {
|
|
10
|
+
private projectPath;
|
|
11
|
+
private parser;
|
|
12
|
+
private watcher?;
|
|
13
|
+
private pendingChanges;
|
|
14
|
+
private readonly DEBOUNCE_MS;
|
|
15
|
+
constructor(projectPath: string, parser: SpecParser);
|
|
16
|
+
start(): Promise<void>;
|
|
17
|
+
stop(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Schedule a debounced file change event
|
|
20
|
+
* Coalesces rapid changes to the same file
|
|
21
|
+
*/
|
|
22
|
+
private scheduleFileChange;
|
|
23
|
+
/**
|
|
24
|
+
* Wait for file size to stabilize before processing
|
|
25
|
+
* Returns true if file is stable, false if file doesn't exist or timeout reached
|
|
26
|
+
*/
|
|
27
|
+
private waitForFileStability;
|
|
28
|
+
private handleFileChange;
|
|
29
|
+
private handleSpecChange;
|
|
30
|
+
private handleSteeringChange;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/dashboard/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC;CACzB;AAED,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,cAAc,CAAgG;IACtH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;gBAEvB,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAO7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;;OAGG;YACW,oBAAoB;YA6BpB,gBAAgB;YA0BhB,gBAAgB;YAmChB,oBAAoB;CAiBnC"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import chokidar from 'chokidar';
|
|
3
|
+
import { stat } from 'fs/promises';
|
|
4
|
+
import { PathUtils } from '../core/path-utils.js';
|
|
5
|
+
export class SpecWatcher extends EventEmitter {
|
|
6
|
+
projectPath;
|
|
7
|
+
parser;
|
|
8
|
+
watcher;
|
|
9
|
+
pendingChanges = new Map();
|
|
10
|
+
DEBOUNCE_MS = 500;
|
|
11
|
+
constructor(projectPath, parser) {
|
|
12
|
+
super();
|
|
13
|
+
// Path should already be translated by caller (ProjectManager)
|
|
14
|
+
this.projectPath = projectPath;
|
|
15
|
+
this.parser = parser;
|
|
16
|
+
}
|
|
17
|
+
async start() {
|
|
18
|
+
const workflowRoot = PathUtils.getWorkflowRoot(this.projectPath);
|
|
19
|
+
const specsPath = PathUtils.getSpecPath(this.projectPath, '');
|
|
20
|
+
const steeringPath = PathUtils.getSteeringPath(this.projectPath);
|
|
21
|
+
// Watch for changes in specs and steering directories
|
|
22
|
+
this.watcher = chokidar.watch([
|
|
23
|
+
`${specsPath}/**/*.md`,
|
|
24
|
+
`${steeringPath}/*.md`
|
|
25
|
+
], {
|
|
26
|
+
ignoreInitial: true,
|
|
27
|
+
persistent: true,
|
|
28
|
+
ignorePermissionErrors: true
|
|
29
|
+
});
|
|
30
|
+
this.watcher.on('add', (filePath) => this.scheduleFileChange('created', filePath));
|
|
31
|
+
this.watcher.on('change', (filePath) => this.scheduleFileChange('updated', filePath));
|
|
32
|
+
this.watcher.on('unlink', (filePath) => this.scheduleFileChange('deleted', filePath));
|
|
33
|
+
// Add error handler to prevent watcher crashes
|
|
34
|
+
this.watcher.on('error', (error) => {
|
|
35
|
+
console.error('File watcher error:', error);
|
|
36
|
+
// Don't propagate error to prevent system crash
|
|
37
|
+
});
|
|
38
|
+
// File watcher started for workflow directories
|
|
39
|
+
}
|
|
40
|
+
async stop() {
|
|
41
|
+
// Clear all pending debounced changes
|
|
42
|
+
for (const { timer } of this.pendingChanges.values()) {
|
|
43
|
+
clearTimeout(timer);
|
|
44
|
+
}
|
|
45
|
+
this.pendingChanges.clear();
|
|
46
|
+
if (this.watcher) {
|
|
47
|
+
// Remove all listeners before closing to prevent memory leaks
|
|
48
|
+
this.watcher.removeAllListeners();
|
|
49
|
+
await this.watcher.close();
|
|
50
|
+
this.watcher = undefined;
|
|
51
|
+
// File watcher stopped
|
|
52
|
+
}
|
|
53
|
+
// Clean up EventEmitter listeners
|
|
54
|
+
this.removeAllListeners();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Schedule a debounced file change event
|
|
58
|
+
* Coalesces rapid changes to the same file
|
|
59
|
+
*/
|
|
60
|
+
scheduleFileChange(action, filePath) {
|
|
61
|
+
const existing = this.pendingChanges.get(filePath);
|
|
62
|
+
if (existing) {
|
|
63
|
+
clearTimeout(existing.timer);
|
|
64
|
+
}
|
|
65
|
+
// Use latest action, but preserve 'created' if that was the first action
|
|
66
|
+
const finalAction = action === 'deleted' ? 'deleted' : (existing?.action === 'created' ? 'created' : action);
|
|
67
|
+
const timer = setTimeout(() => {
|
|
68
|
+
this.pendingChanges.delete(filePath);
|
|
69
|
+
this.handleFileChange(finalAction, filePath);
|
|
70
|
+
}, this.DEBOUNCE_MS);
|
|
71
|
+
this.pendingChanges.set(filePath, { action: finalAction, timer });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Wait for file size to stabilize before processing
|
|
75
|
+
* Returns true if file is stable, false if file doesn't exist or timeout reached
|
|
76
|
+
*/
|
|
77
|
+
async waitForFileStability(filePath, maxWaitMs = 2000) {
|
|
78
|
+
const checkInterval = 100;
|
|
79
|
+
let lastSize = -1;
|
|
80
|
+
let stableCount = 0;
|
|
81
|
+
const requiredStableChecks = 3; // File must be stable for 300ms
|
|
82
|
+
for (let waited = 0; waited < maxWaitMs; waited += checkInterval) {
|
|
83
|
+
try {
|
|
84
|
+
const stats = await stat(filePath);
|
|
85
|
+
if (stats.size === lastSize) {
|
|
86
|
+
stableCount++;
|
|
87
|
+
if (stableCount >= requiredStableChecks) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
stableCount = 0;
|
|
93
|
+
lastSize = stats.size;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// File might be deleted or in transition
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
await new Promise(resolve => setTimeout(resolve, checkInterval));
|
|
101
|
+
}
|
|
102
|
+
// Return true if we had at least one stable check (file exists and has content)
|
|
103
|
+
return stableCount >= 1;
|
|
104
|
+
}
|
|
105
|
+
async handleFileChange(action, filePath) {
|
|
106
|
+
try {
|
|
107
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
108
|
+
// Wait for file stability for creation/updates to ensure file is fully written
|
|
109
|
+
if (action === 'created' || action === 'updated') {
|
|
110
|
+
const isStable = await this.waitForFileStability(filePath);
|
|
111
|
+
if (!isStable) {
|
|
112
|
+
// File may have been deleted or is still being written, skip this update
|
|
113
|
+
console.error(`File not stable, skipping: ${filePath}`);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Determine if this is a spec or steering change
|
|
118
|
+
if (normalizedPath.includes('/specs/')) {
|
|
119
|
+
await this.handleSpecChange(action, normalizedPath);
|
|
120
|
+
}
|
|
121
|
+
else if (normalizedPath.includes('/steering/')) {
|
|
122
|
+
await this.handleSteeringChange(action, normalizedPath);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error(`Error handling file change for ${filePath}:`, error);
|
|
127
|
+
// Don't propagate error to prevent watcher crash
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async handleSpecChange(action, filePath) {
|
|
131
|
+
// Extract spec name from path like: /path/to/.spec-workflow/specs/user-auth/requirements.md
|
|
132
|
+
const pathParts = filePath.split('/');
|
|
133
|
+
const specsIndex = pathParts.findIndex(part => part === 'specs');
|
|
134
|
+
if (specsIndex === -1 || specsIndex + 1 >= pathParts.length)
|
|
135
|
+
return;
|
|
136
|
+
const specName = pathParts[specsIndex + 1];
|
|
137
|
+
const document = pathParts[specsIndex + 2]?.replace('.md', '');
|
|
138
|
+
let specData = null;
|
|
139
|
+
if (action !== 'deleted') {
|
|
140
|
+
specData = await this.parser.getSpec(specName);
|
|
141
|
+
}
|
|
142
|
+
const event = {
|
|
143
|
+
type: 'spec',
|
|
144
|
+
action,
|
|
145
|
+
name: specName,
|
|
146
|
+
data: specData
|
|
147
|
+
};
|
|
148
|
+
// Spec change detected
|
|
149
|
+
this.emit('change', event);
|
|
150
|
+
// Emit specific task update event if this was a tasks.md file
|
|
151
|
+
if (document === 'tasks') {
|
|
152
|
+
this.emit('task-update', {
|
|
153
|
+
specName,
|
|
154
|
+
action
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async handleSteeringChange(action, filePath) {
|
|
159
|
+
// Extract document name from path like: /path/to/.spec-workflow/steering/tech.md
|
|
160
|
+
const pathParts = filePath.split('/');
|
|
161
|
+
const document = pathParts[pathParts.length - 1]?.replace('.md', '');
|
|
162
|
+
const steeringStatus = await this.parser.getProjectSteeringStatus();
|
|
163
|
+
const event = {
|
|
164
|
+
type: 'steering',
|
|
165
|
+
action,
|
|
166
|
+
name: document,
|
|
167
|
+
steeringStatus
|
|
168
|
+
};
|
|
169
|
+
// Steering change detected
|
|
170
|
+
this.emit('steering-change', event);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/dashboard/watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export declare function parseArguments(args: string[]): {
|
|
3
|
+
workspacePath: string;
|
|
4
|
+
workflowRootPath: string;
|
|
5
|
+
expandedPath: string;
|
|
6
|
+
isDashboardMode: boolean;
|
|
7
|
+
noSharedWorktreeSpecs: boolean;
|
|
8
|
+
port?: number;
|
|
9
|
+
lang?: string;
|
|
10
|
+
noOpen?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function resolveEntrypoint(pathValue: string | undefined): string | undefined;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAkGA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CA2FA;AAoMD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQnF"}
|