@clawplays/ospec-cli 0.1.1
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/.ospec/templates/hooks/post-merge +8 -0
- package/.ospec/templates/hooks/pre-commit +8 -0
- package/LICENSE +21 -0
- package/README.md +549 -0
- package/README.zh-CN.md +549 -0
- package/assets/for-ai/en-US/ai-guide.md +98 -0
- package/assets/for-ai/en-US/execution-protocol.md +64 -0
- package/assets/for-ai/zh-CN/ai-guide.md +102 -0
- package/assets/for-ai/zh-CN/execution-protocol.md +68 -0
- package/assets/git-hooks/post-merge +12 -0
- package/assets/git-hooks/pre-commit +12 -0
- package/assets/global-skills/claude/ospec-change/SKILL.md +116 -0
- package/assets/global-skills/codex/ospec-change/SKILL.md +117 -0
- package/assets/global-skills/codex/ospec-change/agents/openai.yaml +7 -0
- package/assets/global-skills/codex/ospec-change/skill.yaml +19 -0
- package/assets/project-conventions/en-US/development-guide.md +32 -0
- package/assets/project-conventions/en-US/naming-conventions.md +51 -0
- package/assets/project-conventions/en-US/skill-conventions.md +40 -0
- package/assets/project-conventions/en-US/workflow-conventions.md +70 -0
- package/assets/project-conventions/zh-CN/development-guide.md +32 -0
- package/assets/project-conventions/zh-CN/naming-conventions.md +51 -0
- package/assets/project-conventions/zh-CN/skill-conventions.md +40 -0
- package/assets/project-conventions/zh-CN/workflow-conventions.md +74 -0
- package/dist/adapters/codex-stitch-adapter.js +420 -0
- package/dist/adapters/gemini-stitch-adapter.js +408 -0
- package/dist/adapters/playwright-checkpoint-adapter.js +2260 -0
- package/dist/advanced/BatchOperations.d.ts +36 -0
- package/dist/advanced/BatchOperations.js +159 -0
- package/dist/advanced/CachingLayer.d.ts +66 -0
- package/dist/advanced/CachingLayer.js +136 -0
- package/dist/advanced/FeatureUpdater.d.ts +46 -0
- package/dist/advanced/FeatureUpdater.js +151 -0
- package/dist/advanced/PerformanceMonitor.d.ts +52 -0
- package/dist/advanced/PerformanceMonitor.js +129 -0
- package/dist/advanced/StatePersistence.d.ts +61 -0
- package/dist/advanced/StatePersistence.js +168 -0
- package/dist/advanced/index.d.ts +14 -0
- package/dist/advanced/index.js +22 -0
- package/dist/cli/commands/config.d.ts +5 -0
- package/dist/cli/commands/config.js +6 -0
- package/dist/cli/commands/feature.d.ts +5 -0
- package/dist/cli/commands/feature.js +6 -0
- package/dist/cli/commands/index.d.ts +5 -0
- package/dist/cli/commands/index.js +6 -0
- package/dist/cli/commands/project.d.ts +5 -0
- package/dist/cli/commands/project.js +6 -0
- package/dist/cli/commands/validate.d.ts +5 -0
- package/dist/cli/commands/validate.js +6 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +1007 -0
- package/dist/commands/ArchiveCommand.d.ts +14 -0
- package/dist/commands/ArchiveCommand.js +241 -0
- package/dist/commands/BaseCommand.d.ts +33 -0
- package/dist/commands/BaseCommand.js +46 -0
- package/dist/commands/BatchCommand.d.ts +5 -0
- package/dist/commands/BatchCommand.js +42 -0
- package/dist/commands/ChangesCommand.d.ts +3 -0
- package/dist/commands/ChangesCommand.js +71 -0
- package/dist/commands/DocsCommand.d.ts +5 -0
- package/dist/commands/DocsCommand.js +118 -0
- package/dist/commands/FinalizeCommand.d.ts +3 -0
- package/dist/commands/FinalizeCommand.js +24 -0
- package/dist/commands/IndexCommand.d.ts +5 -0
- package/dist/commands/IndexCommand.js +57 -0
- package/dist/commands/InitCommand.d.ts +5 -0
- package/dist/commands/InitCommand.js +65 -0
- package/dist/commands/NewCommand.d.ts +11 -0
- package/dist/commands/NewCommand.js +262 -0
- package/dist/commands/PluginsCommand.d.ts +58 -0
- package/dist/commands/PluginsCommand.js +2491 -0
- package/dist/commands/ProgressCommand.d.ts +5 -0
- package/dist/commands/ProgressCommand.js +103 -0
- package/dist/commands/QueueCommand.d.ts +10 -0
- package/dist/commands/QueueCommand.js +147 -0
- package/dist/commands/RunCommand.d.ts +13 -0
- package/dist/commands/RunCommand.js +200 -0
- package/dist/commands/SkillCommand.d.ts +31 -0
- package/dist/commands/SkillCommand.js +1216 -0
- package/dist/commands/SkillsCommand.d.ts +5 -0
- package/dist/commands/SkillsCommand.js +68 -0
- package/dist/commands/StatusCommand.d.ts +6 -0
- package/dist/commands/StatusCommand.js +140 -0
- package/dist/commands/UpdateCommand.d.ts +8 -0
- package/dist/commands/UpdateCommand.js +251 -0
- package/dist/commands/VerifyCommand.d.ts +5 -0
- package/dist/commands/VerifyCommand.js +278 -0
- package/dist/commands/WorkflowCommand.d.ts +12 -0
- package/dist/commands/WorkflowCommand.js +150 -0
- package/dist/commands/index.d.ts +43 -0
- package/dist/commands/index.js +85 -0
- package/dist/core/constants.d.ts +41 -0
- package/dist/core/constants.js +73 -0
- package/dist/core/errors.d.ts +36 -0
- package/dist/core/errors.js +72 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.js +23 -0
- package/dist/core/types.d.ts +369 -0
- package/dist/core/types.js +3 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +27 -0
- package/dist/presets/ProjectPresets.d.ts +41 -0
- package/dist/presets/ProjectPresets.js +190 -0
- package/dist/scaffolds/ProjectScaffoldPresets.d.ts +20 -0
- package/dist/scaffolds/ProjectScaffoldPresets.js +151 -0
- package/dist/services/ConfigManager.d.ts +14 -0
- package/dist/services/ConfigManager.js +386 -0
- package/dist/services/FeatureManager.d.ts +5 -0
- package/dist/services/FeatureManager.js +6 -0
- package/dist/services/FileService.d.ts +21 -0
- package/dist/services/FileService.js +152 -0
- package/dist/services/IndexBuilder.d.ts +12 -0
- package/dist/services/IndexBuilder.js +130 -0
- package/dist/services/Logger.d.ts +20 -0
- package/dist/services/Logger.js +48 -0
- package/dist/services/ProjectAssetRegistry.d.ts +12 -0
- package/dist/services/ProjectAssetRegistry.js +96 -0
- package/dist/services/ProjectAssetService.d.ts +49 -0
- package/dist/services/ProjectAssetService.js +223 -0
- package/dist/services/ProjectScaffoldCommandService.d.ts +73 -0
- package/dist/services/ProjectScaffoldCommandService.js +159 -0
- package/dist/services/ProjectScaffoldService.d.ts +44 -0
- package/dist/services/ProjectScaffoldService.js +507 -0
- package/dist/services/ProjectService.d.ts +209 -0
- package/dist/services/ProjectService.js +13239 -0
- package/dist/services/QueueService.d.ts +17 -0
- package/dist/services/QueueService.js +142 -0
- package/dist/services/RunService.d.ts +40 -0
- package/dist/services/RunService.js +420 -0
- package/dist/services/SkillParser.d.ts +30 -0
- package/dist/services/SkillParser.js +88 -0
- package/dist/services/StateManager.d.ts +16 -0
- package/dist/services/StateManager.js +127 -0
- package/dist/services/TemplateEngine.d.ts +43 -0
- package/dist/services/TemplateEngine.js +119 -0
- package/dist/services/TemplateGenerator.d.ts +40 -0
- package/dist/services/TemplateGenerator.js +273 -0
- package/dist/services/ValidationService.d.ts +19 -0
- package/dist/services/ValidationService.js +44 -0
- package/dist/services/Validator.d.ts +5 -0
- package/dist/services/Validator.js +6 -0
- package/dist/services/index.d.ts +52 -0
- package/dist/services/index.js +91 -0
- package/dist/services/templates/ExecutionTemplateBuilder.d.ts +12 -0
- package/dist/services/templates/ExecutionTemplateBuilder.js +300 -0
- package/dist/services/templates/ProjectTemplateBuilder.d.ts +38 -0
- package/dist/services/templates/ProjectTemplateBuilder.js +1897 -0
- package/dist/services/templates/TemplateBuilderBase.d.ts +19 -0
- package/dist/services/templates/TemplateBuilderBase.js +60 -0
- package/dist/services/templates/TemplateInputFactory.d.ts +16 -0
- package/dist/services/templates/TemplateInputFactory.js +298 -0
- package/dist/services/templates/templateTypes.d.ts +90 -0
- package/dist/services/templates/templateTypes.js +3 -0
- package/dist/tools/build-index.js +632 -0
- package/dist/utils/DateUtils.d.ts +18 -0
- package/dist/utils/DateUtils.js +40 -0
- package/dist/utils/PathUtils.d.ts +9 -0
- package/dist/utils/PathUtils.js +66 -0
- package/dist/utils/StringUtils.d.ts +26 -0
- package/dist/utils/StringUtils.js +47 -0
- package/dist/utils/helpers.d.ts +5 -0
- package/dist/utils/helpers.js +6 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.js +23 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +6 -0
- package/dist/utils/path.d.ts +5 -0
- package/dist/utils/path.js +6 -0
- package/dist/utils/subcommandHelp.d.ts +11 -0
- package/dist/utils/subcommandHelp.js +119 -0
- package/dist/workflow/ArchiveGate.d.ts +30 -0
- package/dist/workflow/ArchiveGate.js +93 -0
- package/dist/workflow/ConfigurableWorkflow.d.ts +89 -0
- package/dist/workflow/ConfigurableWorkflow.js +186 -0
- package/dist/workflow/HookSystem.d.ts +38 -0
- package/dist/workflow/HookSystem.js +66 -0
- package/dist/workflow/IndexRegenerator.d.ts +49 -0
- package/dist/workflow/IndexRegenerator.js +147 -0
- package/dist/workflow/PluginWorkflowComposer.d.ts +138 -0
- package/dist/workflow/PluginWorkflowComposer.js +239 -0
- package/dist/workflow/SkillUpdateEngine.d.ts +26 -0
- package/dist/workflow/SkillUpdateEngine.js +113 -0
- package/dist/workflow/VerificationSystem.d.ts +24 -0
- package/dist/workflow/VerificationSystem.js +116 -0
- package/dist/workflow/WorkflowEngine.d.ts +15 -0
- package/dist/workflow/WorkflowEngine.js +57 -0
- package/dist/workflow/index.d.ts +19 -0
- package/dist/workflow/index.js +32 -0
- package/package.json +78 -0
- package/scripts/postinstall.js +43 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.VerifyCommand = void 0;
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
42
|
+
const constants_1 = require("../core/constants");
|
|
43
|
+
const services_1 = require("../services");
|
|
44
|
+
const PluginWorkflowComposer_1 = require("../workflow/PluginWorkflowComposer");
|
|
45
|
+
const BaseCommand_1 = require("./BaseCommand");
|
|
46
|
+
class VerifyCommand extends BaseCommand_1.BaseCommand {
|
|
47
|
+
async execute(featurePath) {
|
|
48
|
+
try {
|
|
49
|
+
const targetPath = featurePath || process.cwd();
|
|
50
|
+
this.logger.info(`Verifying change at ${targetPath}`);
|
|
51
|
+
const statePath = path.join(targetPath, constants_1.FILE_NAMES.STATE);
|
|
52
|
+
const proposalPath = path.join(targetPath, constants_1.FILE_NAMES.PROPOSAL);
|
|
53
|
+
const tasksPath = path.join(targetPath, constants_1.FILE_NAMES.TASKS);
|
|
54
|
+
const verificationPath = path.join(targetPath, constants_1.FILE_NAMES.VERIFICATION);
|
|
55
|
+
const [stateExists, proposalExists, tasksExists, verificationExists] = await Promise.all([
|
|
56
|
+
services_1.services.fileService.exists(statePath),
|
|
57
|
+
services_1.services.fileService.exists(proposalPath),
|
|
58
|
+
services_1.services.fileService.exists(tasksPath),
|
|
59
|
+
services_1.services.fileService.exists(verificationPath),
|
|
60
|
+
]);
|
|
61
|
+
if (!stateExists) {
|
|
62
|
+
throw new Error('Change state file not found. Expected changes/active/<change>/state.json');
|
|
63
|
+
}
|
|
64
|
+
const featureState = await services_1.services.fileService.readJSON(statePath);
|
|
65
|
+
const projectRoot = path.resolve(targetPath, '..', '..', '..');
|
|
66
|
+
const config = await services_1.services.configManager.loadConfig(projectRoot);
|
|
67
|
+
const workflow = new PluginWorkflowComposer_1.PluginWorkflowComposer(config);
|
|
68
|
+
const checks = [
|
|
69
|
+
{
|
|
70
|
+
name: 'proposal.md',
|
|
71
|
+
status: proposalExists ? 'pass' : 'fail',
|
|
72
|
+
message: proposalExists ? 'Proposal file exists' : 'proposal.md is missing',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'tasks.md',
|
|
76
|
+
status: tasksExists ? 'pass' : 'fail',
|
|
77
|
+
message: tasksExists ? 'Tasks file exists' : 'tasks.md is missing',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'verification.md',
|
|
81
|
+
status: verificationExists ? 'pass' : 'fail',
|
|
82
|
+
message: verificationExists
|
|
83
|
+
? 'Verification file exists'
|
|
84
|
+
: 'verification.md is missing',
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
let activatedSteps = [];
|
|
88
|
+
if (proposalExists) {
|
|
89
|
+
const proposal = (0, gray_matter_1.default)(await services_1.services.fileService.readFile(proposalPath));
|
|
90
|
+
const flags = Array.isArray(proposal.data.flags) ? proposal.data.flags : [];
|
|
91
|
+
activatedSteps = workflow.getActivatedSteps(flags);
|
|
92
|
+
checks.push({
|
|
93
|
+
name: 'proposal.flags',
|
|
94
|
+
status: 'pass',
|
|
95
|
+
message: activatedSteps.length > 0
|
|
96
|
+
? `Activated optional steps: ${activatedSteps.join(', ')}`
|
|
97
|
+
: 'No optional steps activated',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (tasksExists) {
|
|
101
|
+
const tasksContent = await services_1.services.fileService.readFile(tasksPath);
|
|
102
|
+
const tasks = (0, gray_matter_1.default)(tasksContent);
|
|
103
|
+
const optionalSteps = Array.isArray(tasks.data.optional_steps)
|
|
104
|
+
? tasks.data.optional_steps
|
|
105
|
+
: [];
|
|
106
|
+
const missing = activatedSteps.filter(step => !optionalSteps.includes(step));
|
|
107
|
+
checks.push({
|
|
108
|
+
name: 'tasks.optional_steps',
|
|
109
|
+
status: missing.length === 0 ? 'pass' : 'fail',
|
|
110
|
+
message: missing.length === 0
|
|
111
|
+
? 'All activated optional steps are present in tasks.md'
|
|
112
|
+
: `Missing optional steps in tasks.md: ${missing.join(', ')}`,
|
|
113
|
+
});
|
|
114
|
+
checks.push({
|
|
115
|
+
name: 'tasks checklist',
|
|
116
|
+
status: /- \[ \]/.test(tasksContent) ? 'warn' : 'pass',
|
|
117
|
+
message: /- \[ \]/.test(tasksContent)
|
|
118
|
+
? 'tasks.md still has unchecked items'
|
|
119
|
+
: 'tasks.md checklist is complete',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (verificationExists) {
|
|
123
|
+
const verificationContent = await services_1.services.fileService.readFile(verificationPath);
|
|
124
|
+
const verification = (0, gray_matter_1.default)(verificationContent);
|
|
125
|
+
const optionalSteps = Array.isArray(verification.data.optional_steps)
|
|
126
|
+
? verification.data.optional_steps
|
|
127
|
+
: [];
|
|
128
|
+
const missing = activatedSteps.filter(step => !optionalSteps.includes(step));
|
|
129
|
+
checks.push({
|
|
130
|
+
name: 'verification.optional_steps',
|
|
131
|
+
status: missing.length === 0 ? 'pass' : 'fail',
|
|
132
|
+
message: missing.length === 0
|
|
133
|
+
? 'All activated optional steps are present in verification.md'
|
|
134
|
+
: `Missing optional steps in verification.md: ${missing.join(', ')}`,
|
|
135
|
+
});
|
|
136
|
+
checks.push({
|
|
137
|
+
name: 'verification checklist',
|
|
138
|
+
status: /- \[ \]/.test(verificationContent) ? 'warn' : 'pass',
|
|
139
|
+
message: /- \[ \]/.test(verificationContent)
|
|
140
|
+
? 'verification.md still has unchecked items'
|
|
141
|
+
: 'verification.md checklist is complete',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (activatedSteps.includes('stitch_design_review')) {
|
|
145
|
+
const approvalPath = path.join(targetPath, 'artifacts', 'stitch', 'approval.json');
|
|
146
|
+
const approvalExists = await services_1.services.fileService.exists(approvalPath);
|
|
147
|
+
checks.push({
|
|
148
|
+
name: 'stitch.approval',
|
|
149
|
+
status: approvalExists ? 'pass' : 'fail',
|
|
150
|
+
message: approvalExists
|
|
151
|
+
? 'Stitch approval artifact exists'
|
|
152
|
+
: 'artifacts/stitch/approval.json is missing',
|
|
153
|
+
});
|
|
154
|
+
if (approvalExists) {
|
|
155
|
+
const approval = await services_1.services.fileService.readJSON(approvalPath);
|
|
156
|
+
const approvalStatus = typeof approval.status === 'string' ? approval.status : 'pending';
|
|
157
|
+
const validStep = approval.step === 'stitch_design_review';
|
|
158
|
+
const hasPreviewUrl = typeof approval.preview_url === 'string' && approval.preview_url.trim().length > 0;
|
|
159
|
+
const hasSubmittedAt = typeof approval.submitted_at === 'string' && approval.submitted_at.trim().length > 0;
|
|
160
|
+
checks.push({
|
|
161
|
+
name: 'stitch.approval.step',
|
|
162
|
+
status: validStep ? 'pass' : 'fail',
|
|
163
|
+
message: validStep
|
|
164
|
+
? 'Stitch approval step matches stitch_design_review'
|
|
165
|
+
: 'Stitch approval step does not match stitch_design_review',
|
|
166
|
+
});
|
|
167
|
+
checks.push({
|
|
168
|
+
name: 'stitch.approval.preview_url',
|
|
169
|
+
status: hasPreviewUrl ? 'pass' : 'fail',
|
|
170
|
+
message: hasPreviewUrl
|
|
171
|
+
? 'Stitch preview URL is recorded'
|
|
172
|
+
: 'Stitch preview URL is missing',
|
|
173
|
+
});
|
|
174
|
+
checks.push({
|
|
175
|
+
name: 'stitch.approval.submitted_at',
|
|
176
|
+
status: hasSubmittedAt ? 'pass' : 'fail',
|
|
177
|
+
message: hasSubmittedAt
|
|
178
|
+
? 'Stitch submission timestamp is recorded'
|
|
179
|
+
: 'Stitch submission timestamp is missing',
|
|
180
|
+
});
|
|
181
|
+
checks.push({
|
|
182
|
+
name: 'stitch.approval.status',
|
|
183
|
+
status: approvalStatus === 'approved' ? 'pass' : 'fail',
|
|
184
|
+
message: approvalStatus === 'approved'
|
|
185
|
+
? 'Stitch design review approved'
|
|
186
|
+
: `Stitch design review is ${approvalStatus}`,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const activeCheckpointSteps = activatedSteps.filter(step => step === 'checkpoint_ui_review' || step === 'checkpoint_flow_check');
|
|
191
|
+
if (activeCheckpointSteps.length > 0) {
|
|
192
|
+
const checkpointDir = path.join(targetPath, 'artifacts', 'checkpoint');
|
|
193
|
+
const gatePath = path.join(checkpointDir, 'gate.json');
|
|
194
|
+
const resultPath = path.join(checkpointDir, 'result.json');
|
|
195
|
+
const summaryPath = path.join(checkpointDir, 'summary.md');
|
|
196
|
+
const gateExists = await services_1.services.fileService.exists(gatePath);
|
|
197
|
+
checks.push({
|
|
198
|
+
name: 'checkpoint.gate',
|
|
199
|
+
status: gateExists ? 'pass' : 'fail',
|
|
200
|
+
message: gateExists
|
|
201
|
+
? 'Checkpoint gate artifact exists'
|
|
202
|
+
: 'artifacts/checkpoint/gate.json is missing',
|
|
203
|
+
});
|
|
204
|
+
if (gateExists) {
|
|
205
|
+
const gate = await services_1.services.fileService.readJSON(gatePath);
|
|
206
|
+
checks.push({
|
|
207
|
+
name: 'checkpoint.gate.plugin',
|
|
208
|
+
status: gate.plugin === 'checkpoint' ? 'pass' : 'fail',
|
|
209
|
+
message: gate.plugin === 'checkpoint'
|
|
210
|
+
? 'Checkpoint gate plugin matches checkpoint'
|
|
211
|
+
: `Checkpoint gate plugin is ${gate.plugin || '(missing)'}`,
|
|
212
|
+
});
|
|
213
|
+
checks.push({
|
|
214
|
+
name: 'checkpoint.gate.status',
|
|
215
|
+
status: gate.status === 'passed' ? 'pass' : 'fail',
|
|
216
|
+
message: gate.status === 'passed'
|
|
217
|
+
? 'Checkpoint gate passed'
|
|
218
|
+
: `Checkpoint gate status is ${gate.status || '(missing)'}`,
|
|
219
|
+
});
|
|
220
|
+
for (const stepName of activeCheckpointSteps) {
|
|
221
|
+
const stepStatus = gate.steps?.[stepName]?.status || 'missing';
|
|
222
|
+
checks.push({
|
|
223
|
+
name: `checkpoint.${stepName}`,
|
|
224
|
+
status: stepStatus === 'passed' ? 'pass' : 'fail',
|
|
225
|
+
message: stepStatus === 'passed'
|
|
226
|
+
? `${stepName} passed`
|
|
227
|
+
: `${stepName} status is ${stepStatus}`,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const resultExists = await services_1.services.fileService.exists(resultPath);
|
|
232
|
+
const summaryExists = await services_1.services.fileService.exists(summaryPath);
|
|
233
|
+
checks.push({
|
|
234
|
+
name: 'checkpoint.artifacts',
|
|
235
|
+
status: resultExists || summaryExists ? 'pass' : 'fail',
|
|
236
|
+
message: resultExists || summaryExists
|
|
237
|
+
? `Checkpoint artifacts present${resultExists && summaryExists ? ' (result.json and summary.md)' : resultExists ? ' (result.json)' : ' (summary.md)'}`
|
|
238
|
+
: 'Checkpoint result.json or summary.md is required',
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
checks.push({
|
|
242
|
+
name: 'state.json',
|
|
243
|
+
status: 'pass',
|
|
244
|
+
message: `Status is ${featureState.status}, current step is ${featureState.current_step}`,
|
|
245
|
+
});
|
|
246
|
+
const failCount = checks.filter(check => check.status === 'fail').length;
|
|
247
|
+
const warnCount = checks.filter(check => check.status === 'warn').length;
|
|
248
|
+
const passed = failCount === 0;
|
|
249
|
+
const summary = failCount > 0
|
|
250
|
+
? `${failCount} verification(s) failed`
|
|
251
|
+
: warnCount > 0
|
|
252
|
+
? `${warnCount} warning(s) found`
|
|
253
|
+
: 'All verifications passed';
|
|
254
|
+
console.log('\nChange Verification Results:');
|
|
255
|
+
console.log('====================\n');
|
|
256
|
+
for (const check of checks) {
|
|
257
|
+
const icon = check.status === 'pass' ? 'PASS' : check.status === 'warn' ? 'WARN' : 'FAIL';
|
|
258
|
+
console.log(`${icon} ${check.name}: ${check.message}`);
|
|
259
|
+
}
|
|
260
|
+
console.log('\n' + '='.repeat(24));
|
|
261
|
+
console.log(`Summary: ${summary}`);
|
|
262
|
+
console.log('='.repeat(24) + '\n');
|
|
263
|
+
if (passed) {
|
|
264
|
+
this.success('All verifications passed');
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
this.warn('Some verifications failed');
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
this.error(`Verification failed: ${error}`);
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
exports.VerifyCommand = VerifyCommand;
|
|
278
|
+
//# sourceMappingURL=VerifyCommand.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工作流命令
|
|
3
|
+
* 显示和管理工作流配置
|
|
4
|
+
*/
|
|
5
|
+
import { BaseCommand } from './BaseCommand';
|
|
6
|
+
export declare class WorkflowCommand extends BaseCommand {
|
|
7
|
+
execute(action: string, ...args: string[]): Promise<void>;
|
|
8
|
+
private showWorkflow;
|
|
9
|
+
private listSupportedFlags;
|
|
10
|
+
private setMode;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=WorkflowCommand.d.ts.map
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 工作流命令
|
|
4
|
+
* 显示和管理工作流配置
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.WorkflowCommand = void 0;
|
|
8
|
+
const BaseCommand_1 = require("./BaseCommand");
|
|
9
|
+
const services_1 = require("../services");
|
|
10
|
+
const subcommandHelp_1 = require("../utils/subcommandHelp");
|
|
11
|
+
const workflow_1 = require("../workflow");
|
|
12
|
+
class WorkflowCommand extends BaseCommand_1.BaseCommand {
|
|
13
|
+
async execute(action, ...args) {
|
|
14
|
+
try {
|
|
15
|
+
if ((0, subcommandHelp_1.isHelpAction)(action)) {
|
|
16
|
+
this.info((0, subcommandHelp_1.getWorkflowHelpText)());
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
switch (action) {
|
|
20
|
+
case 'show': {
|
|
21
|
+
await this.showWorkflow(args[0] || process.cwd());
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
case 'list-flags': {
|
|
25
|
+
await this.listSupportedFlags(args[0] || process.cwd());
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
case 'set-mode': {
|
|
29
|
+
if (args.length === 0) {
|
|
30
|
+
console.error('Usage: ospec workflow set-mode <lite|standard|full> [path]');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
await this.setMode(args[0], args[1] || process.cwd());
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case 'simulate': {
|
|
37
|
+
// 需要传入 mode 和 flags
|
|
38
|
+
console.error('Usage: ospec workflow simulate <mode> <flags...>');
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
default:
|
|
42
|
+
this.info((0, subcommandHelp_1.getWorkflowHelpText)());
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.error(`Workflow command failed: ${error}`);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async showWorkflow(projectPath) {
|
|
51
|
+
try {
|
|
52
|
+
// ?????????
|
|
53
|
+
const config = await services_1.services.configManager.loadConfig(projectPath);
|
|
54
|
+
const mode = config.mode;
|
|
55
|
+
const workflow = new workflow_1.ConfigurableWorkflow(mode);
|
|
56
|
+
const composer = new workflow_1.PluginWorkflowComposer(config);
|
|
57
|
+
console.log('\n?? Workflow Configuration:');
|
|
58
|
+
console.log('=========================\n');
|
|
59
|
+
console.log(`Mode: ${mode.toUpperCase()}\n`);
|
|
60
|
+
console.log('Core Steps (Required):');
|
|
61
|
+
const coreSteps = composer.getCoreSteps();
|
|
62
|
+
coreSteps.forEach((step, i) => {
|
|
63
|
+
console.log(` ${i + 1}. ${step}`);
|
|
64
|
+
});
|
|
65
|
+
console.log('\nOptional Steps:');
|
|
66
|
+
const optionalSteps = config.workflow?.optional_steps || workflow.getConfig().optional_steps;
|
|
67
|
+
for (const [name, config] of Object.entries(optionalSteps)) {
|
|
68
|
+
if (config.enabled) {
|
|
69
|
+
console.log(` ? ${name}`);
|
|
70
|
+
console.log(` Triggers: ${config.when.join(', ')}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
console.log('\nEnabled Plugins:');
|
|
74
|
+
const enabledPlugins = composer.getEnabledPlugins();
|
|
75
|
+
if (enabledPlugins.length === 0) {
|
|
76
|
+
console.log(' (none)');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
enabledPlugins.forEach(plugin => {
|
|
80
|
+
console.log(` ? ${plugin.name}${plugin.blocking ? ' (blocking)' : ''}`);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const pluginCapabilities = composer.getPluginCapabilities();
|
|
84
|
+
if (pluginCapabilities.length > 0) {
|
|
85
|
+
console.log('\nPlugin-Contributed Steps:');
|
|
86
|
+
pluginCapabilities.forEach(capability => {
|
|
87
|
+
console.log(` ? ${capability.step}`);
|
|
88
|
+
console.log(` Plugin: ${capability.plugin}`);
|
|
89
|
+
console.log(` Capability: ${capability.capability}`);
|
|
90
|
+
console.log(` Triggers: ${capability.activateWhenFlags.join(', ')}`);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
console.log('\nSupported Workflow Flags:');
|
|
94
|
+
const flags = composer.getSupportedFlags();
|
|
95
|
+
flags.forEach((flag, i) => {
|
|
96
|
+
if ((i + 1) % 3 === 0) {
|
|
97
|
+
console.log(` ${flag}`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
process.stdout.write(` ${flag}\n`);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
console.log('\n' + '='.repeat(25) + '\n');
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
this.error(`Failed to show workflow: ${error}`);
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async listSupportedFlags(projectPath) {
|
|
111
|
+
try {
|
|
112
|
+
const config = await services_1.services.configManager.loadConfig(projectPath);
|
|
113
|
+
const composer = new workflow_1.PluginWorkflowComposer(config);
|
|
114
|
+
const flags = composer.getSupportedFlags();
|
|
115
|
+
console.log('\n???? Supported Workflow Flags:');
|
|
116
|
+
console.log('===========================\n');
|
|
117
|
+
flags.forEach(flag => {
|
|
118
|
+
console.log(` ? ${flag}`);
|
|
119
|
+
});
|
|
120
|
+
console.log('\n' + '='.repeat(27) + '\n');
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
this.error(`Failed to list flags: ${error}`);
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async setMode(mode, projectPath) {
|
|
128
|
+
try {
|
|
129
|
+
const supportedModes = new Set(['lite', 'standard', 'full']);
|
|
130
|
+
if (!supportedModes.has(mode)) {
|
|
131
|
+
throw new Error(`Unsupported workflow mode: ${mode}`);
|
|
132
|
+
}
|
|
133
|
+
const config = await services_1.services.configManager.loadConfig(projectPath);
|
|
134
|
+
const nextConfig = {
|
|
135
|
+
...config,
|
|
136
|
+
mode,
|
|
137
|
+
workflow: JSON.parse(JSON.stringify(workflow_1.WORKFLOW_PRESETS[mode])),
|
|
138
|
+
};
|
|
139
|
+
await services_1.services.configManager.saveConfig(projectPath, nextConfig);
|
|
140
|
+
this.success(`Workflow mode set to ${mode.toUpperCase()} for ${projectPath}`);
|
|
141
|
+
this.info(' Updated .skillrc mode and workflow preset');
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
this.error(`Failed to set workflow mode: ${error}`);
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.WorkflowCommand = WorkflowCommand;
|
|
150
|
+
//# sourceMappingURL=WorkflowCommand.js.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
|
|
3
|
+
* 命令导出
|
|
4
|
+
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export { BaseCommand } from './BaseCommand';
|
|
8
|
+
|
|
9
|
+
export { InitCommand } from './InitCommand';
|
|
10
|
+
|
|
11
|
+
export { NewCommand } from './NewCommand';
|
|
12
|
+
|
|
13
|
+
export { VerifyCommand } from './VerifyCommand';
|
|
14
|
+
|
|
15
|
+
export { ProgressCommand } from './ProgressCommand';
|
|
16
|
+
|
|
17
|
+
export { ArchiveCommand } from './ArchiveCommand';
|
|
18
|
+
|
|
19
|
+
export { FinalizeCommand } from './FinalizeCommand';
|
|
20
|
+
|
|
21
|
+
export { StatusCommand } from './StatusCommand';
|
|
22
|
+
|
|
23
|
+
export { BatchCommand } from './BatchCommand';
|
|
24
|
+
|
|
25
|
+
export { WorkflowCommand } from './WorkflowCommand';
|
|
26
|
+
|
|
27
|
+
export { DocsCommand } from './DocsCommand';
|
|
28
|
+
|
|
29
|
+
export { SkillCommand } from './SkillCommand';
|
|
30
|
+
|
|
31
|
+
export { SkillsCommand } from './SkillsCommand';
|
|
32
|
+
|
|
33
|
+
export { PluginsCommand } from './PluginsCommand';
|
|
34
|
+
|
|
35
|
+
export { IndexCommand } from './IndexCommand';
|
|
36
|
+
|
|
37
|
+
export { QueueCommand } from './QueueCommand';
|
|
38
|
+
|
|
39
|
+
export { RunCommand } from './RunCommand';
|
|
40
|
+
|
|
41
|
+
export { UpdateCommand } from './UpdateCommand';
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
|
|
5
|
+
* 命令导出
|
|
6
|
+
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
|
|
11
|
+
exports.UpdateCommand = exports.RunCommand = exports.QueueCommand = exports.IndexCommand = exports.PluginsCommand = exports.SkillsCommand = exports.SkillCommand = exports.DocsCommand = exports.WorkflowCommand = exports.BatchCommand = exports.StatusCommand = exports.FinalizeCommand = exports.ArchiveCommand = exports.ProgressCommand = exports.VerifyCommand = exports.NewCommand = exports.InitCommand = exports.BaseCommand = void 0;
|
|
12
|
+
|
|
13
|
+
var BaseCommand_1 = require("./BaseCommand");
|
|
14
|
+
|
|
15
|
+
Object.defineProperty(exports, "BaseCommand", { enumerable: true, get: function () { return BaseCommand_1.BaseCommand; } });
|
|
16
|
+
|
|
17
|
+
var InitCommand_1 = require("./InitCommand");
|
|
18
|
+
|
|
19
|
+
Object.defineProperty(exports, "InitCommand", { enumerable: true, get: function () { return InitCommand_1.InitCommand; } });
|
|
20
|
+
|
|
21
|
+
var NewCommand_1 = require("./NewCommand");
|
|
22
|
+
|
|
23
|
+
Object.defineProperty(exports, "NewCommand", { enumerable: true, get: function () { return NewCommand_1.NewCommand; } });
|
|
24
|
+
|
|
25
|
+
var VerifyCommand_1 = require("./VerifyCommand");
|
|
26
|
+
|
|
27
|
+
Object.defineProperty(exports, "VerifyCommand", { enumerable: true, get: function () { return VerifyCommand_1.VerifyCommand; } });
|
|
28
|
+
|
|
29
|
+
var ProgressCommand_1 = require("./ProgressCommand");
|
|
30
|
+
|
|
31
|
+
Object.defineProperty(exports, "ProgressCommand", { enumerable: true, get: function () { return ProgressCommand_1.ProgressCommand; } });
|
|
32
|
+
|
|
33
|
+
var ArchiveCommand_1 = require("./ArchiveCommand");
|
|
34
|
+
|
|
35
|
+
Object.defineProperty(exports, "ArchiveCommand", { enumerable: true, get: function () { return ArchiveCommand_1.ArchiveCommand; } });
|
|
36
|
+
|
|
37
|
+
var FinalizeCommand_1 = require("./FinalizeCommand");
|
|
38
|
+
|
|
39
|
+
Object.defineProperty(exports, "FinalizeCommand", { enumerable: true, get: function () { return FinalizeCommand_1.FinalizeCommand; } });
|
|
40
|
+
|
|
41
|
+
var StatusCommand_1 = require("./StatusCommand");
|
|
42
|
+
|
|
43
|
+
Object.defineProperty(exports, "StatusCommand", { enumerable: true, get: function () { return StatusCommand_1.StatusCommand; } });
|
|
44
|
+
|
|
45
|
+
var BatchCommand_1 = require("./BatchCommand");
|
|
46
|
+
|
|
47
|
+
Object.defineProperty(exports, "BatchCommand", { enumerable: true, get: function () { return BatchCommand_1.BatchCommand; } });
|
|
48
|
+
|
|
49
|
+
var WorkflowCommand_1 = require("./WorkflowCommand");
|
|
50
|
+
|
|
51
|
+
Object.defineProperty(exports, "WorkflowCommand", { enumerable: true, get: function () { return WorkflowCommand_1.WorkflowCommand; } });
|
|
52
|
+
|
|
53
|
+
var DocsCommand_1 = require("./DocsCommand");
|
|
54
|
+
|
|
55
|
+
Object.defineProperty(exports, "DocsCommand", { enumerable: true, get: function () { return DocsCommand_1.DocsCommand; } });
|
|
56
|
+
|
|
57
|
+
var SkillCommand_1 = require("./SkillCommand");
|
|
58
|
+
|
|
59
|
+
Object.defineProperty(exports, "SkillCommand", { enumerable: true, get: function () { return SkillCommand_1.SkillCommand; } });
|
|
60
|
+
|
|
61
|
+
var SkillsCommand_1 = require("./SkillsCommand");
|
|
62
|
+
|
|
63
|
+
Object.defineProperty(exports, "SkillsCommand", { enumerable: true, get: function () { return SkillsCommand_1.SkillsCommand; } });
|
|
64
|
+
|
|
65
|
+
var PluginsCommand_1 = require("./PluginsCommand");
|
|
66
|
+
|
|
67
|
+
Object.defineProperty(exports, "PluginsCommand", { enumerable: true, get: function () { return PluginsCommand_1.PluginsCommand; } });
|
|
68
|
+
|
|
69
|
+
var IndexCommand_1 = require("./IndexCommand");
|
|
70
|
+
|
|
71
|
+
Object.defineProperty(exports, "IndexCommand", { enumerable: true, get: function () { return IndexCommand_1.IndexCommand; } });
|
|
72
|
+
|
|
73
|
+
var QueueCommand_1 = require("./QueueCommand");
|
|
74
|
+
|
|
75
|
+
Object.defineProperty(exports, "QueueCommand", { enumerable: true, get: function () { return QueueCommand_1.QueueCommand; } });
|
|
76
|
+
|
|
77
|
+
var RunCommand_1 = require("./RunCommand");
|
|
78
|
+
|
|
79
|
+
Object.defineProperty(exports, "RunCommand", { enumerable: true, get: function () { return RunCommand_1.RunCommand; } });
|
|
80
|
+
|
|
81
|
+
var UpdateCommand_1 = require("./UpdateCommand");
|
|
82
|
+
|
|
83
|
+
Object.defineProperty(exports, "UpdateCommand", { enumerable: true, get: function () { return UpdateCommand_1.UpdateCommand; } });
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export declare const STATE_TRANSITIONS: Record<string, string[]>;
|
|
2
|
+
export declare const CORE_REQUIRED_STEPS: string[];
|
|
3
|
+
export declare const FILE_NAMES: {
|
|
4
|
+
SKILLRC: string;
|
|
5
|
+
SKILL_MD: string;
|
|
6
|
+
SKILL_INDEX: string;
|
|
7
|
+
README: string;
|
|
8
|
+
BUILD_INDEX_SCRIPT: string;
|
|
9
|
+
AI_GUIDE: string;
|
|
10
|
+
EXECUTION_PROTOCOL: string;
|
|
11
|
+
PROPOSAL: string;
|
|
12
|
+
TASKS: string;
|
|
13
|
+
VERIFICATION: string;
|
|
14
|
+
STATE: string;
|
|
15
|
+
REVIEW: string;
|
|
16
|
+
INDEX: string;
|
|
17
|
+
};
|
|
18
|
+
export declare const DIR_NAMES: {
|
|
19
|
+
CHANGES: string;
|
|
20
|
+
ACTIVE: string;
|
|
21
|
+
ARCHIVED: string;
|
|
22
|
+
FOR_AI: string;
|
|
23
|
+
DOCS: string;
|
|
24
|
+
PROJECT: string;
|
|
25
|
+
DESIGN: string;
|
|
26
|
+
PLANNING: string;
|
|
27
|
+
API: string;
|
|
28
|
+
SRC: string;
|
|
29
|
+
MODULES: string;
|
|
30
|
+
CORE: string;
|
|
31
|
+
TESTS: string;
|
|
32
|
+
DIST: string;
|
|
33
|
+
};
|
|
34
|
+
export declare const NAMING_RULES: {
|
|
35
|
+
FEATURE_NAME: RegExp;
|
|
36
|
+
ARCHIVED_DIR: RegExp;
|
|
37
|
+
};
|
|
38
|
+
export declare const DATE_FORMAT = "YYYY-MM-DD";
|
|
39
|
+
export declare const DATETIME_FORMAT = "YYYY-MM-DDTHH:mm:ssZ";
|
|
40
|
+
export declare const WORKFLOW_STEPS: readonly ["proposal_complete", "tasks_complete", "implementation_complete", "skill_updated", "index_regenerated", "tests_passed", "verification_passed", "archived"];
|
|
41
|
+
//# sourceMappingURL=constants.d.ts.map
|