@specpow/framework 0.2.0
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/CHANGELOG.md +307 -0
- package/LICENSE +21 -0
- package/README.md +557 -0
- package/agents/controller/sdd-controller.md +55 -0
- package/agents/execution/java-codegen-agent.md +39 -0
- package/agents/execution/ui-codegen-agent.md +32 -0
- package/agents/ops/deploy-agent.md +181 -0
- package/agents/planning/db-designer-agent.md +30 -0
- package/agents/planning/prd-agent.md +31 -0
- package/agents/quality/review-agent.md +36 -0
- package/agents/quality/test-agent.md +33 -0
- package/bin/specpow.js +10 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +444 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/apply.d.ts +14 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +195 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/archive.d.ts +30 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +141 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/channel.d.ts +61 -0
- package/dist/commands/channel.d.ts.map +1 -0
- package/dist/commands/channel.js +613 -0
- package/dist/commands/channel.js.map +1 -0
- package/dist/commands/config.d.ts +40 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +130 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/debug.d.ts +45 -0
- package/dist/commands/debug.d.ts.map +1 -0
- package/dist/commands/debug.js +167 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/doctor.d.ts +20 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +121 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/execute.d.ts +25 -0
- package/dist/commands/execute.d.ts.map +1 -0
- package/dist/commands/execute.js +120 -0
- package/dist/commands/execute.js.map +1 -0
- package/dist/commands/explore.d.ts +71 -0
- package/dist/commands/explore.d.ts.map +1 -0
- package/dist/commands/explore.js +481 -0
- package/dist/commands/explore.js.map +1 -0
- package/dist/commands/init.d.ts +20 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +146 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/memory.d.ts +32 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +455 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/propose.d.ts +13 -0
- package/dist/commands/propose.d.ts.map +1 -0
- package/dist/commands/propose.js +193 -0
- package/dist/commands/propose.js.map +1 -0
- package/dist/commands/review.d.ts +50 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +198 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/schema.d.ts +22 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +79 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +130 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/store.d.ts +31 -0
- package/dist/commands/store.d.ts.map +1 -0
- package/dist/commands/store.js +109 -0
- package/dist/commands/store.js.map +1 -0
- package/dist/commands/update.d.ts +42 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +239 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +39 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +386 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/workflow/index.d.ts +12 -0
- package/dist/commands/workflow/index.d.ts.map +1 -0
- package/dist/commands/workflow/index.js +435 -0
- package/dist/commands/workflow/index.js.map +1 -0
- package/dist/core/agent-contract.d.ts +133 -0
- package/dist/core/agent-contract.d.ts.map +1 -0
- package/dist/core/agent-contract.js +71 -0
- package/dist/core/agent-contract.js.map +1 -0
- package/dist/core/archive/delta-merger.d.ts +101 -0
- package/dist/core/archive/delta-merger.d.ts.map +1 -0
- package/dist/core/archive/delta-merger.js +398 -0
- package/dist/core/archive/delta-merger.js.map +1 -0
- package/dist/core/archive/delta-parser.d.ts +48 -0
- package/dist/core/archive/delta-parser.d.ts.map +1 -0
- package/dist/core/archive/delta-parser.js +193 -0
- package/dist/core/archive/delta-parser.js.map +1 -0
- package/dist/core/archive/engine.d.ts +136 -0
- package/dist/core/archive/engine.d.ts.map +1 -0
- package/dist/core/archive/engine.js +506 -0
- package/dist/core/archive/engine.js.map +1 -0
- package/dist/core/archive/index.d.ts +11 -0
- package/dist/core/archive/index.d.ts.map +1 -0
- package/dist/core/archive/index.js +9 -0
- package/dist/core/archive/index.js.map +1 -0
- package/dist/core/artifact-graph/graph.d.ts +48 -0
- package/dist/core/artifact-graph/graph.d.ts.map +1 -0
- package/dist/core/artifact-graph/graph.js +170 -0
- package/dist/core/artifact-graph/graph.js.map +1 -0
- package/dist/core/artifact-graph/index.d.ts +13 -0
- package/dist/core/artifact-graph/index.d.ts.map +1 -0
- package/dist/core/artifact-graph/index.js +12 -0
- package/dist/core/artifact-graph/index.js.map +1 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +60 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
- package/dist/core/artifact-graph/instruction-loader.js +166 -0
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
- package/dist/core/artifact-graph/outputs.d.ts +17 -0
- package/dist/core/artifact-graph/outputs.d.ts.map +1 -0
- package/dist/core/artifact-graph/outputs.js +27 -0
- package/dist/core/artifact-graph/outputs.js.map +1 -0
- package/dist/core/artifact-graph/resolver.d.ts +34 -0
- package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
- package/dist/core/artifact-graph/resolver.js +99 -0
- package/dist/core/artifact-graph/resolver.js.map +1 -0
- package/dist/core/artifact-graph/state.d.ts +54 -0
- package/dist/core/artifact-graph/state.d.ts.map +1 -0
- package/dist/core/artifact-graph/state.js +149 -0
- package/dist/core/artifact-graph/state.js.map +1 -0
- package/dist/core/artifact-graph/types.d.ts +151 -0
- package/dist/core/artifact-graph/types.d.ts.map +1 -0
- package/dist/core/artifact-graph/types.js +44 -0
- package/dist/core/artifact-graph/types.js.map +1 -0
- package/dist/core/channel/channel-event-log.d.ts +81 -0
- package/dist/core/channel/channel-event-log.d.ts.map +1 -0
- package/dist/core/channel/channel-event-log.js +177 -0
- package/dist/core/channel/channel-event-log.js.map +1 -0
- package/dist/core/channel/channel-inbox.d.ts +70 -0
- package/dist/core/channel/channel-inbox.d.ts.map +1 -0
- package/dist/core/channel/channel-inbox.js +122 -0
- package/dist/core/channel/channel-inbox.js.map +1 -0
- package/dist/core/channel/channel-runtime.d.ts +81 -0
- package/dist/core/channel/channel-runtime.d.ts.map +1 -0
- package/dist/core/channel/channel-runtime.js +291 -0
- package/dist/core/channel/channel-runtime.js.map +1 -0
- package/dist/core/channel/channel-supervisor.d.ts +72 -0
- package/dist/core/channel/channel-supervisor.d.ts.map +1 -0
- package/dist/core/channel/channel-supervisor.js +189 -0
- package/dist/core/channel/channel-supervisor.js.map +1 -0
- package/dist/core/channel/channel-types.d.ts +169 -0
- package/dist/core/channel/channel-types.d.ts.map +1 -0
- package/dist/core/channel/channel-types.js +26 -0
- package/dist/core/channel/channel-types.js.map +1 -0
- package/dist/core/channel/index.d.ts +21 -0
- package/dist/core/channel/index.d.ts.map +1 -0
- package/dist/core/channel/index.js +23 -0
- package/dist/core/channel/index.js.map +1 -0
- package/dist/core/command-generation/index.d.ts +225 -0
- package/dist/core/command-generation/index.d.ts.map +1 -0
- package/dist/core/command-generation/index.js +462 -0
- package/dist/core/command-generation/index.js.map +1 -0
- package/dist/core/config/config-schema.d.ts +745 -0
- package/dist/core/config/config-schema.d.ts.map +1 -0
- package/dist/core/config/config-schema.js +108 -0
- package/dist/core/config/config-schema.js.map +1 -0
- package/dist/core/config/global-config.d.ts +73 -0
- package/dist/core/config/global-config.d.ts.map +1 -0
- package/dist/core/config/global-config.js +225 -0
- package/dist/core/config/global-config.js.map +1 -0
- package/dist/core/config/index.d.ts +8 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +8 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/hooks/hook-registry.d.ts +55 -0
- package/dist/core/hooks/hook-registry.d.ts.map +1 -0
- package/dist/core/hooks/hook-registry.js +172 -0
- package/dist/core/hooks/hook-registry.js.map +1 -0
- package/dist/core/hooks/hook-types.d.ts +87 -0
- package/dist/core/hooks/hook-types.d.ts.map +1 -0
- package/dist/core/hooks/hook-types.js +11 -0
- package/dist/core/hooks/hook-types.js.map +1 -0
- package/dist/core/hooks/index.d.ts +28 -0
- package/dist/core/hooks/index.d.ts.map +1 -0
- package/dist/core/hooks/index.js +28 -0
- package/dist/core/hooks/index.js.map +1 -0
- package/dist/core/hooks/post-tool-call-hook.d.ts +21 -0
- package/dist/core/hooks/post-tool-call-hook.d.ts.map +1 -0
- package/dist/core/hooks/post-tool-call-hook.js +191 -0
- package/dist/core/hooks/post-tool-call-hook.js.map +1 -0
- package/dist/core/hooks/pre-tool-call-hook.d.ts +31 -0
- package/dist/core/hooks/pre-tool-call-hook.d.ts.map +1 -0
- package/dist/core/hooks/pre-tool-call-hook.js +122 -0
- package/dist/core/hooks/pre-tool-call-hook.js.map +1 -0
- package/dist/core/hooks/session-start-hook.d.ts +25 -0
- package/dist/core/hooks/session-start-hook.d.ts.map +1 -0
- package/dist/core/hooks/session-start-hook.js +226 -0
- package/dist/core/hooks/session-start-hook.js.map +1 -0
- package/dist/core/hooks/workflow-state-hook.d.ts +18 -0
- package/dist/core/hooks/workflow-state-hook.d.ts.map +1 -0
- package/dist/core/hooks/workflow-state-hook.js +181 -0
- package/dist/core/hooks/workflow-state-hook.js.map +1 -0
- package/dist/core/init/engine.d.ts +69 -0
- package/dist/core/init/engine.d.ts.map +1 -0
- package/dist/core/init/engine.js +211 -0
- package/dist/core/init/engine.js.map +1 -0
- package/dist/core/init/template-hash.d.ts +86 -0
- package/dist/core/init/template-hash.d.ts.map +1 -0
- package/dist/core/init/template-hash.js +228 -0
- package/dist/core/init/template-hash.js.map +1 -0
- package/dist/core/memory/adapters/json-adapter.d.ts +50 -0
- package/dist/core/memory/adapters/json-adapter.d.ts.map +1 -0
- package/dist/core/memory/adapters/json-adapter.js +273 -0
- package/dist/core/memory/adapters/json-adapter.js.map +1 -0
- package/dist/core/memory/adapters/sqlite-adapter.d.ts +26 -0
- package/dist/core/memory/adapters/sqlite-adapter.d.ts.map +1 -0
- package/dist/core/memory/adapters/sqlite-adapter.js +230 -0
- package/dist/core/memory/adapters/sqlite-adapter.js.map +1 -0
- package/dist/core/memory/index.d.ts +38 -0
- package/dist/core/memory/index.d.ts.map +1 -0
- package/dist/core/memory/index.js +40 -0
- package/dist/core/memory/index.js.map +1 -0
- package/dist/core/memory/memory-indexer.d.ts +39 -0
- package/dist/core/memory/memory-indexer.d.ts.map +1 -0
- package/dist/core/memory/memory-indexer.js +213 -0
- package/dist/core/memory/memory-indexer.js.map +1 -0
- package/dist/core/memory/memory-manager.d.ts +59 -0
- package/dist/core/memory/memory-manager.d.ts.map +1 -0
- package/dist/core/memory/memory-manager.js +194 -0
- package/dist/core/memory/memory-manager.js.map +1 -0
- package/dist/core/memory/memory-store.d.ts +31 -0
- package/dist/core/memory/memory-store.d.ts.map +1 -0
- package/dist/core/memory/memory-store.js +148 -0
- package/dist/core/memory/memory-store.js.map +1 -0
- package/dist/core/memory/memory-types.d.ts +154 -0
- package/dist/core/memory/memory-types.d.ts.map +1 -0
- package/dist/core/memory/memory-types.js +13 -0
- package/dist/core/memory/memory-types.js.map +1 -0
- package/dist/core/migration/index.d.ts +80 -0
- package/dist/core/migration/index.d.ts.map +1 -0
- package/dist/core/migration/index.js +361 -0
- package/dist/core/migration/index.js.map +1 -0
- package/dist/core/parsers/index.d.ts +95 -0
- package/dist/core/parsers/index.d.ts.map +1 -0
- package/dist/core/parsers/index.js +367 -0
- package/dist/core/parsers/index.js.map +1 -0
- package/dist/core/sdd-engine/ai-caller.d.ts +118 -0
- package/dist/core/sdd-engine/ai-caller.d.ts.map +1 -0
- package/dist/core/sdd-engine/ai-caller.js +624 -0
- package/dist/core/sdd-engine/ai-caller.js.map +1 -0
- package/dist/core/sdd-engine/controller.d.ts +107 -0
- package/dist/core/sdd-engine/controller.d.ts.map +1 -0
- package/dist/core/sdd-engine/controller.js +357 -0
- package/dist/core/sdd-engine/controller.js.map +1 -0
- package/dist/core/sdd-engine/dispatcher.d.ts +69 -0
- package/dist/core/sdd-engine/dispatcher.d.ts.map +1 -0
- package/dist/core/sdd-engine/dispatcher.js +146 -0
- package/dist/core/sdd-engine/dispatcher.js.map +1 -0
- package/dist/core/sdd-engine/git-ops.d.ts +73 -0
- package/dist/core/sdd-engine/git-ops.d.ts.map +1 -0
- package/dist/core/sdd-engine/git-ops.js +326 -0
- package/dist/core/sdd-engine/git-ops.js.map +1 -0
- package/dist/core/sdd-engine/index.d.ts +17 -0
- package/dist/core/sdd-engine/index.d.ts.map +1 -0
- package/dist/core/sdd-engine/index.js +15 -0
- package/dist/core/sdd-engine/index.js.map +1 -0
- package/dist/core/sdd-engine/ledger.d.ts +92 -0
- package/dist/core/sdd-engine/ledger.d.ts.map +1 -0
- package/dist/core/sdd-engine/ledger.js +273 -0
- package/dist/core/sdd-engine/ledger.js.map +1 -0
- package/dist/core/sdd-engine/model-selector.d.ts +49 -0
- package/dist/core/sdd-engine/model-selector.d.ts.map +1 -0
- package/dist/core/sdd-engine/model-selector.js +76 -0
- package/dist/core/sdd-engine/model-selector.js.map +1 -0
- package/dist/core/sdd-engine/parallel-dispatcher.d.ts +99 -0
- package/dist/core/sdd-engine/parallel-dispatcher.d.ts.map +1 -0
- package/dist/core/sdd-engine/parallel-dispatcher.js +350 -0
- package/dist/core/sdd-engine/parallel-dispatcher.js.map +1 -0
- package/dist/core/sdd-engine/review-loop.d.ts +61 -0
- package/dist/core/sdd-engine/review-loop.d.ts.map +1 -0
- package/dist/core/sdd-engine/review-loop.js +139 -0
- package/dist/core/sdd-engine/review-loop.js.map +1 -0
- package/dist/core/sdd-engine/types.d.ts +104 -0
- package/dist/core/sdd-engine/types.d.ts.map +1 -0
- package/dist/core/sdd-engine/types.js +7 -0
- package/dist/core/sdd-engine/types.js.map +1 -0
- package/dist/core/store/index.d.ts +78 -0
- package/dist/core/store/index.d.ts.map +1 -0
- package/dist/core/store/index.js +182 -0
- package/dist/core/store/index.js.map +1 -0
- package/dist/core/templates/index.d.ts +58 -0
- package/dist/core/templates/index.d.ts.map +1 -0
- package/dist/core/templates/index.js +158 -0
- package/dist/core/templates/index.js.map +1 -0
- package/dist/core/validation/index.d.ts +34 -0
- package/dist/core/validation/index.d.ts.map +1 -0
- package/dist/core/validation/index.js +153 -0
- package/dist/core/validation/index.js.map +1 -0
- package/dist/core/workflow-state.d.ts +96 -0
- package/dist/core/workflow-state.d.ts.map +1 -0
- package/dist/core/workflow-state.js +284 -0
- package/dist/core/workflow-state.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/index.d.ts +48 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +119 -0
- package/dist/utils/index.js.map +1 -0
- package/hooks/hooks.json +30 -0
- package/hooks/run-hook.cmd +19 -0
- package/hooks/session-start +62 -0
- package/hooks/workflow-state +150 -0
- package/package.json +122 -0
- package/schemas/bug-fix/schema.yaml +64 -0
- package/schemas/bug-fix/templates/analysis.md +43 -0
- package/schemas/bug-fix/templates/fix-plan.md +19 -0
- package/schemas/bug-fix/templates/proposal.md +30 -0
- package/schemas/crud-module/schema.yaml +65 -0
- package/schemas/crud-module/templates/design.md +36 -0
- package/schemas/crud-module/templates/proposal.md +30 -0
- package/schemas/crud-module/templates/spec.md +33 -0
- package/schemas/crud-module/templates/tasks.md +57 -0
- package/schemas/spec-driven/schema.yaml +87 -0
- package/schemas/spec-driven/templates/design.md +54 -0
- package/schemas/spec-driven/templates/proposal.md +31 -0
- package/schemas/spec-driven/templates/spec.md +44 -0
- package/schemas/spec-driven/templates/tasks.md +98 -0
- package/skills/business-code-review/SKILL.md +78 -0
- package/skills/business-db-design/SKILL.md +74 -0
- package/skills/business-deploy-check/SKILL.md +72 -0
- package/skills/business-doc-sync/SKILL.md +72 -0
- package/skills/business-java-codegen/SKILL.md +97 -0
- package/skills/business-menu-register/SKILL.md +63 -0
- package/skills/business-prd-writer/SKILL.md +80 -0
- package/skills/business-test-gen/SKILL.md +82 -0
- package/skills/business-ui-codegen/SKILL.md +104 -0
- package/skills/execution-finish-branch/SKILL.md +58 -0
- package/skills/execution-git-worktrees/SKILL.md +48 -0
- package/skills/execution-parallel-agents/SKILL.md +51 -0
- package/skills/execution-receiving-review/SKILL.md +47 -0
- package/skills/execution-requesting-review/SKILL.md +51 -0
- package/skills/execution-subagent-driven-dev/SKILL.md +148 -0
- package/skills/execution-systematic-debugging/SKILL.md +95 -0
- package/skills/execution-tdd/SKILL.md +74 -0
- package/skills/execution-verification-before-completion/SKILL.md +75 -0
- package/skills/meta-create-skill/SKILL.md +374 -0
- package/skills/meta-using-skills/SKILL.md +97 -0
- package/skills/meta-writing-skills/SKILL.md +66 -0
- package/skills/planning-apply-change/SKILL.md +199 -0
- package/skills/planning-archive-change/SKILL.md +43 -0
- package/skills/planning-explore/SKILL.md +108 -0
- package/skills/planning-onboard/SKILL.md +60 -0
- package/skills/planning-propose/SKILL.md +145 -0
- package/skills/planning-update-change/SKILL.md +45 -0
- package/skills/planning-verify-change/SKILL.md +58 -0
- package/skills/planning-write-design/SKILL.md +59 -0
- package/skills/planning-write-plans/SKILL.md +55 -0
- package/skills/planning-write-specs/SKILL.md +73 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 验证模块 — 工件完整性校验
|
|
3
|
+
*
|
|
4
|
+
* 职责:
|
|
5
|
+
* 1. 验证 Schema YAML 格式正确性
|
|
6
|
+
* 2. 验证工件依赖关系无环
|
|
7
|
+
* 3. 验证模板文件存在且格式合法
|
|
8
|
+
* 4. 验证输出路径可写
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import { parse as parseYaml } from 'yaml';
|
|
13
|
+
import { SchemaYamlSchema } from '../artifact-graph/types.js';
|
|
14
|
+
/**
|
|
15
|
+
* 验证 Schema YAML
|
|
16
|
+
*/
|
|
17
|
+
export function validateSchema(schemaPath) {
|
|
18
|
+
const result = { valid: true, errors: [], warnings: [] };
|
|
19
|
+
if (!fs.existsSync(schemaPath)) {
|
|
20
|
+
result.valid = false;
|
|
21
|
+
result.errors.push({
|
|
22
|
+
code: 'SCHEMA_NOT_FOUND',
|
|
23
|
+
message: `Schema 文件不存在: ${schemaPath}`,
|
|
24
|
+
});
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const content = fs.readFileSync(schemaPath, 'utf-8');
|
|
29
|
+
const parsed = parseYaml(content);
|
|
30
|
+
// Zod 验证
|
|
31
|
+
const parseResult = SchemaYamlSchema.safeParse(parsed);
|
|
32
|
+
if (!parseResult.success) {
|
|
33
|
+
result.valid = false;
|
|
34
|
+
for (const issue of parseResult.error.issues) {
|
|
35
|
+
result.errors.push({
|
|
36
|
+
code: 'SCHEMA_VALIDATION',
|
|
37
|
+
message: `${issue.path.join('.')}: ${issue.message}`,
|
|
38
|
+
file: schemaPath,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
const schema = parseResult.data;
|
|
44
|
+
// 检查工件依赖无环
|
|
45
|
+
const cycleResult = checkDependencyCycles(schema);
|
|
46
|
+
if (cycleResult.hasCycle) {
|
|
47
|
+
result.valid = false;
|
|
48
|
+
result.errors.push({
|
|
49
|
+
code: 'DEPENDENCY_CYCLE',
|
|
50
|
+
message: `工件依赖存在环: ${cycleResult.cycle.join(' → ')}`,
|
|
51
|
+
file: schemaPath,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// 检查模板文件存在性
|
|
55
|
+
const schemaDir = path.dirname(schemaPath);
|
|
56
|
+
for (const artifact of schema.artifacts) {
|
|
57
|
+
if (artifact.template) {
|
|
58
|
+
const templatePath = path.join(schemaDir, artifact.template);
|
|
59
|
+
if (!fs.existsSync(templatePath)) {
|
|
60
|
+
result.warnings.push({
|
|
61
|
+
code: 'TEMPLATE_MISSING',
|
|
62
|
+
message: `模板文件不存在: ${artifact.template} (工件: ${artifact.id})`,
|
|
63
|
+
file: templatePath,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
result.valid = false;
|
|
71
|
+
result.errors.push({
|
|
72
|
+
code: 'SCHEMA_PARSE_ERROR',
|
|
73
|
+
message: `Schema 解析失败: ${err.message}`,
|
|
74
|
+
file: schemaPath,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 检查工件依赖是否有环
|
|
81
|
+
*/
|
|
82
|
+
function checkDependencyCycles(schema) {
|
|
83
|
+
const graph = new Map();
|
|
84
|
+
for (const artifact of schema.artifacts) {
|
|
85
|
+
graph.set(artifact.id, artifact.requires || []);
|
|
86
|
+
}
|
|
87
|
+
const visited = new Set();
|
|
88
|
+
const inStack = new Set();
|
|
89
|
+
function dfs(node, pathSoFar) {
|
|
90
|
+
if (inStack.has(node)) {
|
|
91
|
+
const cycleStart = pathSoFar.indexOf(node);
|
|
92
|
+
return { hasCycle: true, cycle: [...pathSoFar.slice(cycleStart), node] };
|
|
93
|
+
}
|
|
94
|
+
if (visited.has(node))
|
|
95
|
+
return { hasCycle: false, cycle: [] };
|
|
96
|
+
visited.add(node);
|
|
97
|
+
inStack.add(node);
|
|
98
|
+
const deps = graph.get(node) || [];
|
|
99
|
+
for (const dep of deps) {
|
|
100
|
+
const result = dfs(dep, [...pathSoFar, node]);
|
|
101
|
+
if (result.hasCycle)
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
inStack.delete(node);
|
|
105
|
+
return { hasCycle: false, cycle: [] };
|
|
106
|
+
}
|
|
107
|
+
for (const nodeId of graph.keys()) {
|
|
108
|
+
const result = dfs(nodeId, []);
|
|
109
|
+
if (result.hasCycle)
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
return { hasCycle: false, cycle: [] };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 验证变更目录结构
|
|
116
|
+
*/
|
|
117
|
+
export function validateChangeDir(changeDir) {
|
|
118
|
+
const result = { valid: true, errors: [], warnings: [] };
|
|
119
|
+
if (!fs.existsSync(changeDir)) {
|
|
120
|
+
result.valid = false;
|
|
121
|
+
result.errors.push({
|
|
122
|
+
code: 'CHANGE_DIR_NOT_FOUND',
|
|
123
|
+
message: `变更目录不存在: ${changeDir}`,
|
|
124
|
+
});
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
// 检查必要文件
|
|
128
|
+
const requiredFiles = ['proposal.md'];
|
|
129
|
+
const optionalFiles = ['specs/spec.md', 'design.md', 'tasks.md'];
|
|
130
|
+
for (const file of requiredFiles) {
|
|
131
|
+
const filePath = path.join(changeDir, file);
|
|
132
|
+
if (!fs.existsSync(filePath)) {
|
|
133
|
+
result.valid = false;
|
|
134
|
+
result.errors.push({
|
|
135
|
+
code: 'REQUIRED_FILE_MISSING',
|
|
136
|
+
message: `缺少必要文件: ${file}`,
|
|
137
|
+
file: filePath,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
for (const file of optionalFiles) {
|
|
142
|
+
const filePath = path.join(changeDir, file);
|
|
143
|
+
if (!fs.existsSync(filePath)) {
|
|
144
|
+
result.warnings.push({
|
|
145
|
+
code: 'OPTIONAL_FILE_MISSING',
|
|
146
|
+
message: `缺少可选文件: ${file}`,
|
|
147
|
+
file: filePath,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/validation/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工作流状态标签
|
|
3
|
+
*
|
|
4
|
+
* P2-14: 借鉴 Trellis 的 [workflow-state:xxx] 标签
|
|
5
|
+
*
|
|
6
|
+
* 功能:
|
|
7
|
+
* - 解析工作流状态标签
|
|
8
|
+
* - 生成状态标签
|
|
9
|
+
* - 状态标签格式化
|
|
10
|
+
*/
|
|
11
|
+
export type WorkflowStage = 'explore' | 'propose' | 'apply' | 'verify' | 'archive' | 'idle';
|
|
12
|
+
export interface WorkflowState {
|
|
13
|
+
/** 当前阶段 */
|
|
14
|
+
stage: WorkflowStage;
|
|
15
|
+
/** 变更名称(如果有) */
|
|
16
|
+
changeName?: string;
|
|
17
|
+
/** 任务进度(如果有) */
|
|
18
|
+
taskProgress?: {
|
|
19
|
+
current: number;
|
|
20
|
+
total: number;
|
|
21
|
+
};
|
|
22
|
+
/** 阻塞原因(如果有) */
|
|
23
|
+
blocked?: string;
|
|
24
|
+
/** 最后更新时间 */
|
|
25
|
+
updatedAt: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 解析工作流状态标签
|
|
29
|
+
*
|
|
30
|
+
* 格式: [workflow-state:stage] 或 [workflow-state:stage:details]
|
|
31
|
+
*
|
|
32
|
+
* 示例:
|
|
33
|
+
* - [workflow-state:explore]
|
|
34
|
+
* - [workflow-state:apply:task-3-of-5]
|
|
35
|
+
* - [workflow-state:verify:blocked]
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseWorkflowStateTag(text: string): WorkflowState | null;
|
|
38
|
+
/**
|
|
39
|
+
* 生成工作流状态标签
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateWorkflowStateTag(state: WorkflowState): string;
|
|
42
|
+
/**
|
|
43
|
+
* 从阶段生成简单的状态标签
|
|
44
|
+
*/
|
|
45
|
+
export declare function stageToTag(stage: WorkflowStage): string;
|
|
46
|
+
/**
|
|
47
|
+
* 从文本中提取所有工作流状态标签
|
|
48
|
+
*/
|
|
49
|
+
export declare function extractWorkflowStateTags(text: string): WorkflowState[];
|
|
50
|
+
/**
|
|
51
|
+
* 检查文本是否包含工作流状态标签
|
|
52
|
+
*/
|
|
53
|
+
export declare function hasWorkflowStateTag(text: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* 移除文本中的工作流状态标签
|
|
56
|
+
*/
|
|
57
|
+
export declare function removeWorkflowStateTags(text: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* 获取阶段的图标
|
|
60
|
+
*/
|
|
61
|
+
export declare function getStageIcon(stage: WorkflowStage): string;
|
|
62
|
+
/**
|
|
63
|
+
* 获取阶段的描述
|
|
64
|
+
*/
|
|
65
|
+
export declare function getStageDescription(stage: WorkflowStage): string;
|
|
66
|
+
/**
|
|
67
|
+
* 生成带图标的阶段标签
|
|
68
|
+
*/
|
|
69
|
+
export declare function formatStageLabel(stage: WorkflowStage): string;
|
|
70
|
+
/**
|
|
71
|
+
* 从文件路径推断工作流阶段
|
|
72
|
+
*/
|
|
73
|
+
export declare function inferStageFromPath(filePath: string): WorkflowStage | null;
|
|
74
|
+
/**
|
|
75
|
+
* 从内容推断工作流阶段
|
|
76
|
+
*/
|
|
77
|
+
export declare function inferStageFromContent(content: string): WorkflowStage | null;
|
|
78
|
+
/**
|
|
79
|
+
* 检测当前工作流阶段(共享函数)
|
|
80
|
+
*
|
|
81
|
+
* 基于 openspec/changes 目录结构推断当前阶段
|
|
82
|
+
*/
|
|
83
|
+
export declare function detectCurrentStage(projectRoot: string): WorkflowStage;
|
|
84
|
+
/**
|
|
85
|
+
* 保存工作流状态到持久化文件
|
|
86
|
+
*/
|
|
87
|
+
export declare function saveWorkflowState(projectRoot: string, state: WorkflowState): void;
|
|
88
|
+
/**
|
|
89
|
+
* 加载持久化的工作流状态
|
|
90
|
+
*/
|
|
91
|
+
export declare function loadWorkflowState(projectRoot: string): WorkflowState | null;
|
|
92
|
+
/**
|
|
93
|
+
* 清除持久化的工作流状态
|
|
94
|
+
*/
|
|
95
|
+
export declare function clearWorkflowState(projectRoot: string): void;
|
|
96
|
+
//# sourceMappingURL=workflow-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-state.d.ts","sourceRoot":"","sources":["../../src/core/workflow-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,SAAS,GACT,OAAO,GACP,QAAQ,GACR,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,KAAK,EAAE,aAAa,CAAC;IACrB,gBAAgB;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB;IAChB,YAAY,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA6CxE;AAeD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAwBrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAEvD;AAID;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAatE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAID;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAUzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAUhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAE7D;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAgBzE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAgB3E;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAgCrE;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAajF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAa3E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAU5D"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工作流状态标签
|
|
3
|
+
*
|
|
4
|
+
* P2-14: 借鉴 Trellis 的 [workflow-state:xxx] 标签
|
|
5
|
+
*
|
|
6
|
+
* 功能:
|
|
7
|
+
* - 解析工作流状态标签
|
|
8
|
+
* - 生成状态标签
|
|
9
|
+
* - 状态标签格式化
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readdirSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'fs';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
// ─── 状态标签解析 ───────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* 解析工作流状态标签
|
|
16
|
+
*
|
|
17
|
+
* 格式: [workflow-state:stage] 或 [workflow-state:stage:details]
|
|
18
|
+
*
|
|
19
|
+
* 示例:
|
|
20
|
+
* - [workflow-state:explore]
|
|
21
|
+
* - [workflow-state:apply:task-3-of-5]
|
|
22
|
+
* - [workflow-state:verify:blocked]
|
|
23
|
+
*/
|
|
24
|
+
export function parseWorkflowStateTag(text) {
|
|
25
|
+
// 匹配 [workflow-state:stage] 或 [workflow-state:stage:details]
|
|
26
|
+
const match = text.match(/\[workflow-state:([a-z]+)(?::([^\]]+))?\]/i);
|
|
27
|
+
if (!match) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const stageStr = match[1].toLowerCase();
|
|
31
|
+
const details = match[2];
|
|
32
|
+
const stage = parseStage(stageStr);
|
|
33
|
+
if (!stage) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const state = {
|
|
37
|
+
stage,
|
|
38
|
+
updatedAt: Date.now(),
|
|
39
|
+
};
|
|
40
|
+
// 解析详情
|
|
41
|
+
if (details) {
|
|
42
|
+
// 解析任务进度: task-3-of-5
|
|
43
|
+
const taskMatch = details.match(/task-(\d+)-of-(\d+)/);
|
|
44
|
+
if (taskMatch) {
|
|
45
|
+
state.taskProgress = {
|
|
46
|
+
current: parseInt(taskMatch[1]),
|
|
47
|
+
total: parseInt(taskMatch[2]),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// 解析阻塞: blocked:reason
|
|
51
|
+
if (details.startsWith('blocked')) {
|
|
52
|
+
const reasonMatch = details.match(/blocked:(.+)/);
|
|
53
|
+
state.blocked = reasonMatch ? reasonMatch[1] : 'unknown';
|
|
54
|
+
}
|
|
55
|
+
// 解析变更名称: change:name
|
|
56
|
+
const changeMatch = details.match(/change:([^\s]+)/);
|
|
57
|
+
if (changeMatch) {
|
|
58
|
+
state.changeName = changeMatch[1];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return state;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 解析阶段字符串
|
|
65
|
+
*/
|
|
66
|
+
function parseStage(stageStr) {
|
|
67
|
+
const validStages = ['explore', 'propose', 'apply', 'verify', 'archive', 'idle'];
|
|
68
|
+
if (validStages.includes(stageStr)) {
|
|
69
|
+
return stageStr;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
// ─── 状态标签生成 ───────────────────────────────────────────
|
|
74
|
+
/**
|
|
75
|
+
* 生成工作流状态标签
|
|
76
|
+
*/
|
|
77
|
+
export function generateWorkflowStateTag(state) {
|
|
78
|
+
let tag = `[workflow-state:${state.stage}`;
|
|
79
|
+
// 添加详情
|
|
80
|
+
const details = [];
|
|
81
|
+
if (state.changeName) {
|
|
82
|
+
details.push(`change:${state.changeName}`);
|
|
83
|
+
}
|
|
84
|
+
if (state.taskProgress) {
|
|
85
|
+
details.push(`task-${state.taskProgress.current}-of-${state.taskProgress.total}`);
|
|
86
|
+
}
|
|
87
|
+
if (state.blocked) {
|
|
88
|
+
details.push(`blocked:${state.blocked}`);
|
|
89
|
+
}
|
|
90
|
+
if (details.length > 0) {
|
|
91
|
+
tag += `:${details.join(',')}`;
|
|
92
|
+
}
|
|
93
|
+
tag += ']';
|
|
94
|
+
return tag;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 从阶段生成简单的状态标签
|
|
98
|
+
*/
|
|
99
|
+
export function stageToTag(stage) {
|
|
100
|
+
return `[workflow-state:${stage}]`;
|
|
101
|
+
}
|
|
102
|
+
// ─── 状态标签提取 ───────────────────────────────────────────
|
|
103
|
+
/**
|
|
104
|
+
* 从文本中提取所有工作流状态标签
|
|
105
|
+
*/
|
|
106
|
+
export function extractWorkflowStateTags(text) {
|
|
107
|
+
const tags = [];
|
|
108
|
+
const regex = /\[workflow-state:[^\]]+\]/gi;
|
|
109
|
+
const matches = text.match(regex) || [];
|
|
110
|
+
for (const match of matches) {
|
|
111
|
+
const state = parseWorkflowStateTag(match);
|
|
112
|
+
if (state) {
|
|
113
|
+
tags.push(state);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return tags;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 检查文本是否包含工作流状态标签
|
|
120
|
+
*/
|
|
121
|
+
export function hasWorkflowStateTag(text) {
|
|
122
|
+
return /\[workflow-state:[^\]]+\]/i.test(text);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 移除文本中的工作流状态标签
|
|
126
|
+
*/
|
|
127
|
+
export function removeWorkflowStateTags(text) {
|
|
128
|
+
return text.replace(/\[workflow-state:[^\]]+\]\s*/gi, '').trim();
|
|
129
|
+
}
|
|
130
|
+
// ─── 阶段图标 ───────────────────────────────────────────────
|
|
131
|
+
/**
|
|
132
|
+
* 获取阶段的图标
|
|
133
|
+
*/
|
|
134
|
+
export function getStageIcon(stage) {
|
|
135
|
+
const icons = {
|
|
136
|
+
explore: '🔍',
|
|
137
|
+
propose: '📝',
|
|
138
|
+
apply: '⚙️',
|
|
139
|
+
verify: '✅',
|
|
140
|
+
archive: '📦',
|
|
141
|
+
idle: '💤',
|
|
142
|
+
};
|
|
143
|
+
return icons[stage] || '❓';
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 获取阶段的描述
|
|
147
|
+
*/
|
|
148
|
+
export function getStageDescription(stage) {
|
|
149
|
+
const descriptions = {
|
|
150
|
+
explore: '探索需求,理解问题',
|
|
151
|
+
propose: '创建变更提案',
|
|
152
|
+
apply: '实现代码',
|
|
153
|
+
verify: '验证实现',
|
|
154
|
+
archive: '归档变更',
|
|
155
|
+
idle: '空闲状态',
|
|
156
|
+
};
|
|
157
|
+
return descriptions[stage] || '未知阶段';
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 生成带图标的阶段标签
|
|
161
|
+
*/
|
|
162
|
+
export function formatStageLabel(stage) {
|
|
163
|
+
return `${getStageIcon(stage)} ${stage.toUpperCase()}`;
|
|
164
|
+
}
|
|
165
|
+
// ─── 状态推断 ───────────────────────────────────────────────
|
|
166
|
+
/**
|
|
167
|
+
* 从文件路径推断工作流阶段
|
|
168
|
+
*/
|
|
169
|
+
export function inferStageFromPath(filePath) {
|
|
170
|
+
const patterns = [
|
|
171
|
+
{ pattern: /explore|探索/i, stage: 'explore' },
|
|
172
|
+
{ pattern: /propose|提案|proposal/i, stage: 'propose' },
|
|
173
|
+
{ pattern: /apply|实现|implementation/i, stage: 'apply' },
|
|
174
|
+
{ pattern: /verify|验证|verification/i, stage: 'verify' },
|
|
175
|
+
{ pattern: /archive|归档/i, stage: 'archive' },
|
|
176
|
+
];
|
|
177
|
+
for (const { pattern, stage } of patterns) {
|
|
178
|
+
if (pattern.test(filePath)) {
|
|
179
|
+
return stage;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 从内容推断工作流阶段
|
|
186
|
+
*/
|
|
187
|
+
export function inferStageFromContent(content) {
|
|
188
|
+
const patterns = [
|
|
189
|
+
{ pattern: /探索|理解|分析|调研|explore/i, stage: 'explore' },
|
|
190
|
+
{ pattern: /提案|proposal| propose/i, stage: 'propose' },
|
|
191
|
+
{ pattern: /实现|apply|执行|开发|编码/i, stage: 'apply' },
|
|
192
|
+
{ pattern: /验证|verify|测试|检查/i, stage: 'verify' },
|
|
193
|
+
{ pattern: /归档|archive|合并|merge/i, stage: 'archive' },
|
|
194
|
+
];
|
|
195
|
+
for (const { pattern, stage } of patterns) {
|
|
196
|
+
if (pattern.test(content)) {
|
|
197
|
+
return stage;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
// ─── 共享阶段检测 ───────────────────────────────────────────
|
|
203
|
+
/**
|
|
204
|
+
* 检测当前工作流阶段(共享函数)
|
|
205
|
+
*
|
|
206
|
+
* 基于 openspec/changes 目录结构推断当前阶段
|
|
207
|
+
*/
|
|
208
|
+
export function detectCurrentStage(projectRoot) {
|
|
209
|
+
const changesDir = join(projectRoot, 'openspec', 'changes');
|
|
210
|
+
if (!existsSync(changesDir)) {
|
|
211
|
+
return 'idle';
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
const entries = readdirSync(changesDir, { withFileTypes: true });
|
|
215
|
+
const changeDirs = entries.filter((e) => e.isDirectory() && e.name !== 'archive');
|
|
216
|
+
if (changeDirs.length === 0) {
|
|
217
|
+
return 'idle';
|
|
218
|
+
}
|
|
219
|
+
const changeDir = join(changesDir, changeDirs[0].name);
|
|
220
|
+
const files = readdirSync(changeDir);
|
|
221
|
+
// 推断阶段
|
|
222
|
+
if (files.some((f) => f.includes('verify') || f.includes('review'))) {
|
|
223
|
+
return 'verify';
|
|
224
|
+
}
|
|
225
|
+
if (files.some((f) => f.includes('tasks'))) {
|
|
226
|
+
return 'apply';
|
|
227
|
+
}
|
|
228
|
+
if (files.some((f) => f.includes('spec') || f.includes('design'))) {
|
|
229
|
+
return 'propose';
|
|
230
|
+
}
|
|
231
|
+
return 'explore';
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return 'idle';
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// ─── 工作流状态持久化 ───────────────────────────────────────
|
|
238
|
+
/**
|
|
239
|
+
* 保存工作流状态到持久化文件
|
|
240
|
+
*/
|
|
241
|
+
export function saveWorkflowState(projectRoot, state) {
|
|
242
|
+
const stateDir = join(projectRoot, '.specpow', 'state');
|
|
243
|
+
try {
|
|
244
|
+
if (!existsSync(stateDir)) {
|
|
245
|
+
mkdirSync(stateDir, { recursive: true });
|
|
246
|
+
}
|
|
247
|
+
const stateFile = join(stateDir, 'workflow-state.json');
|
|
248
|
+
writeFileSync(stateFile, JSON.stringify(state, null, 2), 'utf-8');
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// 静默失败
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* 加载持久化的工作流状态
|
|
256
|
+
*/
|
|
257
|
+
export function loadWorkflowState(projectRoot) {
|
|
258
|
+
const stateFile = join(projectRoot, '.specpow', 'state', 'workflow-state.json');
|
|
259
|
+
if (!existsSync(stateFile)) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
try {
|
|
263
|
+
const content = readFileSync(stateFile, 'utf-8');
|
|
264
|
+
return JSON.parse(content);
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* 清除持久化的工作流状态
|
|
272
|
+
*/
|
|
273
|
+
export function clearWorkflowState(projectRoot) {
|
|
274
|
+
const stateFile = join(projectRoot, '.specpow', 'state', 'workflow-state.json');
|
|
275
|
+
try {
|
|
276
|
+
if (existsSync(stateFile)) {
|
|
277
|
+
unlinkSync(stateFile);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// 静默失败
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=workflow-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../src/core/workflow-state.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecPow Framework - 主入口
|
|
3
|
+
*
|
|
4
|
+
* 融合 OpenSpec 规范驱动 + Superpowers 执行引擎
|
|
5
|
+
*/
|
|
6
|
+
export { runCli } from './cli/index.js';
|
|
7
|
+
export * as artifactGraph from './core/artifact-graph/index.js';
|
|
8
|
+
export * as sddEngine from './core/sdd-engine/index.js';
|
|
9
|
+
export * as commandGeneration from './core/command-generation/index.js';
|
|
10
|
+
export * as store from './core/store/index.js';
|
|
11
|
+
export * as parsers from './core/parsers/index.js';
|
|
12
|
+
export * as validation from './core/validation/index.js';
|
|
13
|
+
export * as templates from './core/templates/index.js';
|
|
14
|
+
export * as hooks from './core/hooks/index.js';
|
|
15
|
+
export * as memory from './core/memory/index.js';
|
|
16
|
+
export * as channel from './core/channel/index.js';
|
|
17
|
+
export * as workflowState from './core/workflow-state.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,OAAO,KAAK,aAAa,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,iBAAiB,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AAGnD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecPow Framework - 主入口
|
|
3
|
+
*
|
|
4
|
+
* 融合 OpenSpec 规范驱动 + Superpowers 执行引擎
|
|
5
|
+
*/
|
|
6
|
+
// CLI 模块
|
|
7
|
+
export { runCli } from './cli/index.js';
|
|
8
|
+
// 核心模块
|
|
9
|
+
export * as artifactGraph from './core/artifact-graph/index.js';
|
|
10
|
+
export * as sddEngine from './core/sdd-engine/index.js';
|
|
11
|
+
export * as commandGeneration from './core/command-generation/index.js';
|
|
12
|
+
export * as store from './core/store/index.js';
|
|
13
|
+
export * as parsers from './core/parsers/index.js';
|
|
14
|
+
export * as validation from './core/validation/index.js';
|
|
15
|
+
export * as templates from './core/templates/index.js';
|
|
16
|
+
export * as hooks from './core/hooks/index.js';
|
|
17
|
+
export * as memory from './core/memory/index.js';
|
|
18
|
+
export * as channel from './core/channel/index.js';
|
|
19
|
+
// 工作流状态
|
|
20
|
+
export * as workflowState from './core/workflow-state.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO;AACP,OAAO,KAAK,aAAa,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,iBAAiB,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AAEnD,QAAQ;AACR,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 通用工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 查找项目根目录(包含 package.json 或 .git 的最近父目录)
|
|
6
|
+
*/
|
|
7
|
+
export declare function findProjectRoot(startDir?: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* 安全读取 JSON 文件
|
|
10
|
+
*/
|
|
11
|
+
export declare function readJsonSafe<T>(filePath: string): T | null;
|
|
12
|
+
/**
|
|
13
|
+
* 确保目录存在
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensureDir(dirPath: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* 复制目录(递归)
|
|
18
|
+
*/
|
|
19
|
+
export declare function copyDir(src: string, dest: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* 列出目录下所有文件(递归)
|
|
22
|
+
*/
|
|
23
|
+
export declare function listFilesRecursive(dir: string, pattern?: RegExp): string[];
|
|
24
|
+
/**
|
|
25
|
+
* 生成变更 ID(基于标题的 slug)
|
|
26
|
+
*/
|
|
27
|
+
export declare function generateChangeId(title: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* 格式化时间戳
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatTimestamp(date?: Date): string;
|
|
32
|
+
/**
|
|
33
|
+
* 打印成功消息
|
|
34
|
+
*/
|
|
35
|
+
export declare function success(msg: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* 打印错误消息
|
|
38
|
+
*/
|
|
39
|
+
export declare function error(msg: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* 打印警告消息
|
|
42
|
+
*/
|
|
43
|
+
export declare function warn(msg: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* 打印信息消息
|
|
46
|
+
*/
|
|
47
|
+
export declare function info(msg: string): void;
|
|
48
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAYxE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAO1D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAYvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAc1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC"}
|