@codewalla_india/openspec 1.3.1 → 1.3.3
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/LICENSE +22 -22
- package/README.md +214 -133
- package/bin/openspec.js +5 -5
- package/dist/cli/index.js +99 -62
- package/dist/commands/change.d.ts +0 -2
- package/dist/commands/change.js +107 -86
- package/dist/commands/config.js +14 -16
- package/dist/commands/doctor.js +9 -4
- package/dist/commands/feedback.js +79 -30
- package/dist/commands/modify.d.ts +26 -0
- package/dist/commands/modify.js +147 -0
- package/dist/commands/schema.js +170 -91
- package/dist/commands/show.js +5 -2
- package/dist/commands/spec.js +49 -29
- package/dist/commands/store.js +15 -21
- package/dist/commands/validate.d.ts +8 -0
- package/dist/commands/validate.js +43 -20
- package/dist/commands/workflow/index.d.ts +2 -2
- package/dist/commands/workflow/index.js +1 -1
- package/dist/commands/workflow/instructions.d.ts +6 -26
- package/dist/commands/workflow/instructions.js +183 -376
- package/dist/commands/workflow/new-change.d.ts +0 -4
- package/dist/commands/workflow/new-change.js +10 -28
- package/dist/commands/workflow/shared.d.ts +34 -19
- package/dist/commands/workflow/shared.js +34 -4
- package/dist/commands/workflow/status.js +10 -32
- package/dist/commands/workflow/templates.js +15 -5
- package/dist/commands/workset.d.ts +2 -2
- package/dist/commands/workset.js +19 -22
- package/dist/comprehension-quiz/fingerprint.d.ts +39 -0
- package/dist/comprehension-quiz/fingerprint.js +84 -0
- package/dist/comprehension-quiz/index.d.ts +42 -0
- package/dist/comprehension-quiz/index.js +47 -0
- package/dist/comprehension-quiz/pass-record.d.ts +44 -0
- package/dist/comprehension-quiz/pass-record.js +98 -0
- package/dist/comprehension-quiz/providers/anthropic.d.ts +35 -0
- package/dist/comprehension-quiz/providers/anthropic.js +69 -0
- package/dist/comprehension-quiz/providers/factory.d.ts +44 -0
- package/dist/comprehension-quiz/providers/factory.js +174 -0
- package/dist/comprehension-quiz/providers/interface.d.ts +98 -0
- package/dist/comprehension-quiz/providers/interface.js +150 -0
- package/dist/comprehension-quiz/providers/local.d.ts +35 -0
- package/dist/comprehension-quiz/providers/local.js +69 -0
- package/dist/comprehension-quiz/providers/ollama.d.ts +35 -0
- package/dist/comprehension-quiz/providers/ollama.js +69 -0
- package/dist/comprehension-quiz/providers/openai.d.ts +35 -0
- package/dist/comprehension-quiz/providers/openai.js +72 -0
- package/dist/comprehension-quiz/question-generator.d.ts +117 -0
- package/dist/comprehension-quiz/question-generator.js +203 -0
- package/dist/comprehension-quiz/quiz-executor.d.ts +75 -0
- package/dist/comprehension-quiz/quiz-executor.js +181 -0
- package/dist/comprehension-quiz/types.d.ts +137 -0
- package/dist/comprehension-quiz/types.js +11 -0
- package/dist/core/archive.d.ts +14 -1
- package/dist/core/archive.js +1350 -190
- package/dist/core/artifact-graph/graph.d.ts +28 -9
- package/dist/core/artifact-graph/graph.js +94 -43
- package/dist/core/artifact-graph/index.d.ts +1 -1
- package/dist/core/artifact-graph/index.js +1 -1
- package/dist/core/artifact-graph/instruction-loader.d.ts +30 -3
- package/dist/core/artifact-graph/instruction-loader.js +70 -12
- package/dist/core/artifact-graph/outputs.d.ts +1 -0
- package/dist/core/artifact-graph/outputs.js +67 -5
- package/dist/core/artifact-graph/resolver.d.ts +14 -0
- package/dist/core/artifact-graph/resolver.js +69 -15
- package/dist/core/artifact-graph/types.js +21 -3
- package/dist/core/available-tools.d.ts +2 -2
- package/dist/core/available-tools.js +14 -3
- package/dist/core/change-metadata/schema.d.ts +2 -0
- package/dist/core/change-metadata/schema.js +13 -0
- package/dist/core/change-status-policy.d.ts +10 -1
- package/dist/core/change-status-policy.js +30 -2
- package/dist/core/command-generation/adapters/amazon-q.d.ts +4 -0
- package/dist/core/command-generation/adapters/amazon-q.js +11 -5
- package/dist/core/command-generation/adapters/antigravity.js +6 -5
- package/dist/core/command-generation/adapters/auggie.js +7 -6
- package/dist/core/command-generation/adapters/bob.d.ts +5 -1
- package/dist/core/command-generation/adapters/bob.js +11 -10
- package/dist/core/command-generation/adapters/claude.d.ts +1 -1
- package/dist/core/command-generation/adapters/claude.js +12 -17
- package/dist/core/command-generation/adapters/cline.js +5 -5
- package/dist/core/command-generation/adapters/codebuddy.js +8 -7
- package/dist/core/command-generation/adapters/continue.js +8 -7
- package/dist/core/command-generation/adapters/costrict.js +7 -6
- package/dist/core/command-generation/adapters/crush.js +9 -9
- package/dist/core/command-generation/adapters/cursor.js +8 -8
- package/dist/core/command-generation/adapters/devin.d.ts +19 -0
- package/dist/core/command-generation/adapters/devin.js +36 -0
- package/dist/core/command-generation/adapters/factory.js +7 -6
- package/dist/core/command-generation/adapters/gemini.js +40 -5
- package/dist/core/command-generation/adapters/github-copilot.js +6 -5
- package/dist/core/command-generation/adapters/iflow.js +9 -8
- package/dist/core/command-generation/adapters/index.d.ts +4 -2
- package/dist/core/command-generation/adapters/index.js +4 -2
- package/dist/core/command-generation/adapters/junie.js +6 -5
- package/dist/core/command-generation/adapters/kilocode.js +1 -1
- package/dist/core/command-generation/adapters/kiro.js +6 -5
- package/dist/core/command-generation/adapters/lingma.js +9 -9
- package/dist/core/command-generation/adapters/oh-my-pi.d.ts +21 -0
- package/dist/core/command-generation/adapters/oh-my-pi.js +42 -0
- package/dist/core/command-generation/adapters/opencode.js +6 -8
- package/dist/core/command-generation/adapters/pi.d.ts +2 -2
- package/dist/core/command-generation/adapters/pi.js +7 -10
- package/dist/core/command-generation/adapters/qoder.js +9 -9
- package/dist/core/command-generation/adapters/qwen.d.ts +7 -3
- package/dist/core/command-generation/adapters/qwen.js +14 -9
- package/dist/core/command-generation/adapters/roocode.d.ts +4 -4
- package/dist/core/command-generation/adapters/roocode.js +9 -9
- package/dist/core/command-generation/adapters/trae.d.ts +13 -0
- package/dist/core/command-generation/adapters/trae.js +28 -0
- package/dist/core/command-generation/adapters/zcode.d.ts +16 -0
- package/dist/core/command-generation/adapters/zcode.js +33 -0
- package/dist/core/command-generation/generator.d.ts +8 -0
- package/dist/core/command-generation/generator.js +15 -1
- package/dist/core/command-generation/index.d.ts +1 -1
- package/dist/core/command-generation/index.js +1 -1
- package/dist/core/command-generation/invocation.d.ts +73 -0
- package/dist/core/command-generation/invocation.js +77 -0
- package/dist/core/command-generation/registry.js +8 -4
- package/dist/core/command-generation/types.d.ts +9 -2
- package/dist/core/command-generation/yaml.d.ts +20 -6
- package/dist/core/command-generation/yaml.js +31 -21
- package/dist/core/command-surface.d.ts +15 -0
- package/dist/core/command-surface.js +33 -0
- package/dist/core/completions/command-registry.js +16 -61
- package/dist/core/completions/generators/bash-generator.js +41 -41
- package/dist/core/completions/generators/fish-generator.js +7 -7
- package/dist/core/completions/generators/powershell-generator.js +44 -37
- package/dist/core/completions/generators/zsh-generator.js +33 -33
- package/dist/core/completions/installers/zsh-installer.d.ts +9 -0
- package/dist/core/completions/installers/zsh-installer.js +20 -4
- package/dist/core/completions/templates/bash-templates.js +24 -24
- package/dist/core/completions/templates/fish-templates.js +38 -38
- package/dist/core/completions/templates/powershell-templates.js +28 -28
- package/dist/core/completions/templates/zsh-templates.js +39 -39
- package/dist/core/config-prompts.d.ts +1 -1
- package/dist/core/config-prompts.js +14 -1
- package/dist/core/config-schema.d.ts +10 -1
- package/dist/core/config-schema.js +67 -1
- package/dist/core/config.d.ts +15 -0
- package/dist/core/config.js +46 -5
- package/dist/core/file-state.js +56 -24
- package/dist/core/github-copilot/cloud-agent.d.ts +95 -0
- package/dist/core/github-copilot/cloud-agent.js +497 -0
- package/dist/core/global-config.d.ts +16 -0
- package/dist/core/init.d.ts +58 -0
- package/dist/core/init.js +474 -73
- package/dist/core/legacy-cleanup.d.ts +59 -0
- package/dist/core/legacy-cleanup.js +253 -24
- package/dist/core/list.js +23 -16
- package/dist/core/migration.d.ts +73 -1
- package/dist/core/migration.js +360 -11
- package/dist/core/modify/conflict-detector.d.ts +26 -0
- package/dist/core/modify/conflict-detector.js +62 -0
- package/dist/core/modify/dependency-propagator.d.ts +38 -0
- package/dist/core/modify/dependency-propagator.js +103 -0
- package/dist/core/modify/history-tracker.d.ts +34 -0
- package/dist/core/modify/history-tracker.js +114 -0
- package/dist/core/modify/index.d.ts +7 -0
- package/dist/core/modify/index.js +7 -0
- package/dist/core/onboarding-commands.d.ts +30 -0
- package/dist/core/onboarding-commands.js +38 -0
- package/dist/core/openspec-root.js +18 -15
- package/dist/core/parsers/change-parser.d.ts +17 -2
- package/dist/core/parsers/change-parser.js +35 -21
- package/dist/core/parsers/code-fence.d.ts +15 -0
- package/dist/core/parsers/code-fence.js +49 -0
- package/dist/core/parsers/markdown-parser.d.ts +0 -3
- package/dist/core/parsers/markdown-parser.js +7 -60
- package/dist/core/parsers/requirement-blocks.d.ts +29 -0
- package/dist/core/parsers/requirement-blocks.js +150 -31
- package/dist/core/parsers/requirement-text.d.ts +48 -0
- package/dist/core/parsers/requirement-text.js +98 -0
- package/dist/core/parsers/spec-structure.d.ts +1 -1
- package/dist/core/parsers/spec-structure.js +20 -30
- package/dist/core/profile-sync-drift.d.ts +0 -8
- package/dist/core/profile-sync-drift.js +49 -50
- package/dist/core/profiles.d.ts +2 -2
- package/dist/core/profiles.js +2 -2
- package/dist/core/project-config.d.ts +27 -18
- package/dist/core/project-config.js +101 -34
- package/dist/core/references.js +42 -4
- package/dist/core/relationship-health.d.ts +8 -0
- package/dist/core/relationship-health.js +13 -0
- package/dist/core/root-selection.d.ts +9 -6
- package/dist/core/root-selection.js +42 -5
- package/dist/core/schemas/base.schema.js +7 -2
- package/dist/core/shared/allowed-tools.d.ts +12 -0
- package/dist/core/shared/allowed-tools.js +12 -0
- package/dist/core/shared/index.d.ts +1 -0
- package/dist/core/shared/index.js +1 -0
- package/dist/core/shared/skill-content-equivalence.d.ts +7 -0
- package/dist/core/shared/skill-content-equivalence.js +41 -0
- package/dist/core/shared/skill-generation.js +17 -13
- package/dist/core/shared/skill-paths.d.ts +13 -0
- package/dist/core/shared/skill-paths.js +23 -0
- package/dist/core/shared/tool-detection.d.ts +27 -7
- package/dist/core/shared/tool-detection.js +167 -37
- package/dist/core/shared-skill-target.d.ts +16 -0
- package/dist/core/shared-skill-target.js +156 -0
- package/dist/core/specs-apply.d.ts +80 -33
- package/dist/core/specs-apply.js +667 -145
- package/dist/core/store/git.d.ts +13 -0
- package/dist/core/store/git.js +24 -0
- package/dist/core/store/operations.js +20 -0
- package/dist/core/templates/skill-templates.d.ts +3 -2
- package/dist/core/templates/skill-templates.js +3 -2
- package/dist/core/templates/workflows/apply-change.d.ts +10 -0
- package/dist/core/templates/workflows/apply-change.js +186 -224
- package/dist/core/templates/workflows/archive-change.js +387 -260
- package/dist/core/templates/workflows/bulk-archive-change.js +655 -475
- package/dist/core/templates/workflows/continue-change.js +210 -219
- package/dist/core/templates/workflows/explore.js +479 -443
- package/dist/core/templates/workflows/feedback.js +97 -97
- package/dist/core/templates/workflows/ff-change.js +200 -191
- package/dist/core/templates/workflows/modify-change.d.ts +4 -1
- package/dist/core/templates/workflows/modify-change.js +193 -71
- package/dist/core/templates/workflows/new-change.js +127 -134
- package/dist/core/templates/workflows/onboard.js +548 -542
- package/dist/core/templates/workflows/propose.js +273 -217
- package/dist/core/templates/workflows/store-selection.d.ts +1 -1
- package/dist/core/templates/workflows/store-selection.js +1 -1
- package/dist/core/templates/workflows/sync-specs.js +500 -273
- package/dist/core/templates/workflows/update-change.d.ts +10 -0
- package/dist/core/templates/workflows/update-change.js +177 -0
- package/dist/core/templates/workflows/verify-change.js +324 -326
- package/dist/core/update.d.ts +40 -5
- package/dist/core/update.js +411 -96
- package/dist/core/validation/constants.d.ts +4 -1
- package/dist/core/validation/constants.js +4 -1
- package/dist/core/validation/plan-validator.d.ts +8 -0
- package/dist/core/validation/plan-validator.js +45 -0
- package/dist/core/validation/task-numbering.d.ts +16 -0
- package/dist/core/validation/task-numbering.js +57 -0
- package/dist/core/validation/validator.d.ts +27 -3
- package/dist/core/validation/validator.js +337 -48
- package/dist/core/version-check.d.ts +152 -0
- package/dist/core/version-check.js +731 -0
- package/dist/core/view.js +13 -18
- package/dist/prompts/searchable-multi-select.js +1 -1
- package/dist/telemetry/caller-detection.d.ts +27 -0
- package/dist/telemetry/caller-detection.js +85 -0
- package/dist/telemetry/caller-detection.test.d.ts +5 -0
- package/dist/telemetry/config.d.ts +48 -2
- package/dist/telemetry/config.js +113 -11
- package/dist/telemetry/config.test.d.ts +5 -0
- package/dist/telemetry/deduplication.d.ts +35 -0
- package/dist/telemetry/deduplication.js +82 -0
- package/dist/telemetry/deduplication.test.d.ts +5 -0
- package/dist/telemetry/identity.d.ts +62 -22
- package/dist/telemetry/identity.js +147 -102
- package/dist/telemetry/index.d.ts +126 -15
- package/dist/telemetry/index.js +569 -37
- package/dist/telemetry/sanitization.d.ts +40 -0
- package/dist/telemetry/sanitization.js +114 -0
- package/dist/telemetry/sanitization.test.d.ts +5 -0
- package/dist/telemetry/throttling.d.ts +20 -0
- package/dist/telemetry/throttling.js +70 -0
- package/dist/ui/welcome-screen.d.ts +9 -1
- package/dist/ui/welcome-screen.js +91 -38
- package/dist/utils/change-metadata.d.ts +43 -0
- package/dist/utils/change-metadata.js +123 -7
- package/dist/utils/change-utils.d.ts +10 -4
- package/dist/utils/change-utils.js +20 -13
- package/dist/utils/ci.d.ts +12 -0
- package/dist/utils/ci.js +16 -0
- package/dist/utils/command-references.d.ts +92 -6
- package/dist/utils/command-references.js +180 -7
- package/dist/utils/date.d.ts +8 -0
- package/dist/utils/date.js +13 -0
- package/dist/utils/file-system.d.ts +10 -0
- package/dist/utils/file-system.js +70 -0
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/interactive.d.ts +23 -0
- package/dist/utils/interactive.js +32 -0
- package/dist/utils/item-discovery.d.ts +19 -0
- package/dist/utils/item-discovery.js +30 -48
- package/dist/utils/shell-detection.d.ts +1 -1
- package/dist/utils/shell-detection.js +64 -11
- package/dist/utils/spec-discovery.d.ts +40 -0
- package/dist/utils/spec-discovery.js +115 -0
- package/dist/utils/task-progress.d.ts +29 -1
- package/dist/utils/task-progress.js +109 -15
- package/package.json +96 -84
- package/schemas/spec-driven/schema.yaml +252 -184
- package/schemas/spec-driven/templates/design.md +19 -19
- package/schemas/spec-driven/templates/plan-template.md +91 -0
- package/schemas/spec-driven/templates/proposal.md +29 -24
- package/schemas/spec-driven/templates/spec.md +11 -8
- package/schemas/spec-driven/templates/tasks.md +9 -9
- package/scripts/postinstall.js +83 -83
- package/dist/core/command-generation/adapters/codex.d.ts +0 -16
- package/dist/core/command-generation/adapters/codex.js +0 -39
- package/dist/core/command-generation/adapters/windsurf.d.ts +0 -14
- package/dist/core/command-generation/adapters/windsurf.js +0 -38
- package/dist/core/comprehension/config.d.ts +0 -20
- package/dist/core/comprehension/config.js +0 -23
- package/dist/core/comprehension/fingerprint.d.ts +0 -14
- package/dist/core/comprehension/fingerprint.js +0 -33
- package/dist/core/comprehension/index.d.ts +0 -57
- package/dist/core/comprehension/index.js +0 -87
- package/dist/core/comprehension/pass-record.d.ts +0 -29
- package/dist/core/comprehension/pass-record.js +0 -64
- package/dist/core/comprehension/stats.d.ts +0 -35
- package/dist/core/comprehension/stats.js +0 -133
- package/dist/core/templates/workflows/comprehension-guidance.d.ts +0 -9
- package/dist/core/templates/workflows/comprehension-guidance.js +0 -73
- package/dist/core/templates/workflows/mcp-guidance.d.ts +0 -13
- package/dist/core/templates/workflows/mcp-guidance.js +0 -131
- package/dist/core/templates/workflows/user-prompt-guidance.d.ts +0 -16
- package/dist/core/templates/workflows/user-prompt-guidance.js +0 -48
- package/dist/telemetry/caller.d.ts +0 -5
- package/dist/telemetry/caller.js +0 -29
- package/dist/telemetry/client.d.ts +0 -27
- package/dist/telemetry/client.js +0 -127
- package/dist/telemetry/command-context.d.ts +0 -13
- package/dist/telemetry/command-context.js +0 -59
- package/dist/telemetry/comprehension.d.ts +0 -44
- package/dist/telemetry/comprehension.js +0 -105
- package/dist/telemetry/content.d.ts +0 -10
- package/dist/telemetry/content.js +0 -56
- package/dist/telemetry/git-stats.d.ts +0 -12
- package/dist/telemetry/git-stats.js +0 -69
- package/dist/telemetry/identify-cache.d.ts +0 -7
- package/dist/telemetry/identify-cache.js +0 -47
- package/dist/telemetry/input.d.ts +0 -17
- package/dist/telemetry/input.js +0 -68
- package/dist/telemetry/marker.d.ts +0 -37
- package/dist/telemetry/marker.js +0 -67
- package/dist/telemetry/workflow.d.ts +0 -85
- package/dist/telemetry/workflow.js +0 -318
- package/schemas/spec-driven/templates/plan.md +0 -19
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import ora from 'ora';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import { trackEvent } from '../telemetry/index.js';
|
|
4
3
|
import { Validator } from '../core/validation/validator.js';
|
|
4
|
+
import { VALIDATION_MESSAGES } from '../core/validation/constants.js';
|
|
5
5
|
import { resolveRootForCommand, toRootOutput, withStoreFlag, isStoreSelectedRoot, } from '../core/root-selection.js';
|
|
6
6
|
import { isInteractive, resolveNoInteractive } from '../utils/interactive.js';
|
|
7
|
-
import {
|
|
7
|
+
import { getSpecIds } from '../utils/item-discovery.js';
|
|
8
|
+
import { getAvailableChanges } from './workflow/shared.js';
|
|
8
9
|
import { nearestMatches } from '../utils/match.js';
|
|
9
10
|
export class ValidateCommand {
|
|
10
11
|
async execute(itemName, options = {}) {
|
|
@@ -43,6 +44,17 @@ export class ValidateCommand {
|
|
|
43
44
|
return v;
|
|
44
45
|
return undefined;
|
|
45
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve change IDs by directory existence within the resolved root — the
|
|
49
|
+
* same rule `openspec status`/`instructions` use (`getAvailableChanges`) —
|
|
50
|
+
* rather than requiring `proposal.md`. This lets `validate` resolve a
|
|
51
|
+
* scaffolded or still-authoring change that the sibling commands already
|
|
52
|
+
* resolve (#1182). Sorted to preserve the prior `getActiveChangeIds` ordering.
|
|
53
|
+
*/
|
|
54
|
+
async listChangeIds(root) {
|
|
55
|
+
const ids = await getAvailableChanges(root.path, root.changesDir);
|
|
56
|
+
return ids.sort();
|
|
57
|
+
}
|
|
46
58
|
async runInteractiveSelector(root, opts) {
|
|
47
59
|
const { select } = await import('@inquirer/prompts');
|
|
48
60
|
const choice = await select({
|
|
@@ -61,7 +73,7 @@ export class ValidateCommand {
|
|
|
61
73
|
if (choice === 'specs')
|
|
62
74
|
return this.runBulkValidation(root, { changes: false, specs: true }, opts);
|
|
63
75
|
// one
|
|
64
|
-
const [changes, specs] = await Promise.all([
|
|
76
|
+
const [changes, specs] = await Promise.all([this.listChangeIds(root), getSpecIds(root.path)]);
|
|
65
77
|
const items = [];
|
|
66
78
|
items.push(...changes.map(id => ({ name: `change/${id}`, value: { type: 'change', id } })));
|
|
67
79
|
items.push(...specs.map(id => ({ name: `spec/${id}`, value: { type: 'spec', id } })));
|
|
@@ -82,7 +94,7 @@ export class ValidateCommand {
|
|
|
82
94
|
console.error('Or run in an interactive terminal.');
|
|
83
95
|
}
|
|
84
96
|
async validateDirectItem(root, itemName, opts) {
|
|
85
|
-
const [changes, specs] = await Promise.all([
|
|
97
|
+
const [changes, specs] = await Promise.all([this.listChangeIds(root), getSpecIds(root.path)]);
|
|
86
98
|
const isChange = changes.includes(itemName);
|
|
87
99
|
const isSpec = specs.includes(itemName);
|
|
88
100
|
const type = opts.typeOverride ?? (isChange ? 'change' : isSpec ? 'spec' : undefined);
|
|
@@ -133,10 +145,13 @@ export class ValidateCommand {
|
|
|
133
145
|
if (type === 'change') {
|
|
134
146
|
const changeDir = path.join(root.changesDir, id);
|
|
135
147
|
const start = Date.now();
|
|
136
|
-
const report = await validator.validateChangeDeltaSpecs(changeDir
|
|
148
|
+
const report = await validator.validateChangeDeltaSpecs(changeDir, {
|
|
149
|
+
mainSpecsDir: root.specsDir,
|
|
150
|
+
projectRoot: root.path,
|
|
151
|
+
});
|
|
137
152
|
const durationMs = Date.now() - start;
|
|
138
153
|
this.printReport('change', id, report, durationMs, opts.json, root);
|
|
139
|
-
|
|
154
|
+
// Non-zero exit if invalid (keeps enriched output test semantics)
|
|
140
155
|
process.exitCode = report.valid ? 0 : 1;
|
|
141
156
|
return;
|
|
142
157
|
}
|
|
@@ -145,7 +160,6 @@ export class ValidateCommand {
|
|
|
145
160
|
const report = await validator.validateSpec(file);
|
|
146
161
|
const durationMs = Date.now() - start;
|
|
147
162
|
this.printReport('spec', id, report, durationMs, opts.json, root);
|
|
148
|
-
trackEvent('spec_validated', { valid: report.valid, issue_count: report.issues.length, strict: opts.strict, duration_ms: durationMs });
|
|
149
163
|
process.exitCode = report.valid ? 0 : 1;
|
|
150
164
|
}
|
|
151
165
|
printReport(type, id, report, durationMs, json, root) {
|
|
@@ -164,12 +178,26 @@ export class ValidateCommand {
|
|
|
164
178
|
const prefix = issue.level === 'ERROR' ? '✗' : issue.level === 'WARNING' ? '⚠' : 'ℹ';
|
|
165
179
|
console.error(`${prefix} [${label}] ${issue.path}: ${issue.message}`);
|
|
166
180
|
}
|
|
167
|
-
this.printNextSteps(type, id, root);
|
|
181
|
+
this.printNextSteps(type, id, root, report.issues);
|
|
168
182
|
}
|
|
169
183
|
}
|
|
170
|
-
printNextSteps(type, id, root) {
|
|
184
|
+
printNextSteps(type, id, root, issues = []) {
|
|
171
185
|
const bullets = [];
|
|
172
|
-
|
|
186
|
+
// The delta-authoring bullets contradict a marker-related error ("add
|
|
187
|
+
// deltas" vs "remove skip_specs or the files"), so branch on the exact
|
|
188
|
+
// marker messages - the generic no-deltas guidance also mentions
|
|
189
|
+
// skip_specs, which must not trigger this.
|
|
190
|
+
const conflictIssue = issues.some(i => i.message.includes(VALIDATION_MESSAGES.CHANGE_SKIP_SPECS_CONFLICT));
|
|
191
|
+
const invalidMarkerIssue = issues.some(i => i.message.includes(VALIDATION_MESSAGES.CHANGE_SKIP_SPECS_INVALID_METADATA));
|
|
192
|
+
if (type === 'change' && conflictIssue) {
|
|
193
|
+
bullets.push('- This change declares skip_specs (no spec deltas): delete the files under specs/, or remove skip_specs from .openspec.yaml if requirements do change');
|
|
194
|
+
bullets.push('- skip_specs is only honored when .openspec.yaml is valid change metadata (schema: <name> naming a known schema is required)');
|
|
195
|
+
}
|
|
196
|
+
else if (type === 'change' && invalidMarkerIssue) {
|
|
197
|
+
bullets.push('- Fix .openspec.yaml so the skip_specs marker can be honored (schema: <name> naming a known schema is required)');
|
|
198
|
+
bullets.push('- Or remove skip_specs from .openspec.yaml and add delta specs instead');
|
|
199
|
+
}
|
|
200
|
+
else if (type === 'change') {
|
|
173
201
|
bullets.push('- Ensure change has deltas in specs/: use headers ## ADDED/MODIFIED/REMOVED/RENAMED Requirements');
|
|
174
202
|
bullets.push('- Each requirement MUST include at least one #### Scenario: block');
|
|
175
203
|
bullets.push(`- Debug parsed deltas: ${withStoreFlag(root, `openspec show ${id} --json --deltas-only`)}`);
|
|
@@ -185,7 +213,7 @@ export class ValidateCommand {
|
|
|
185
213
|
async runBulkValidation(root, scope, opts) {
|
|
186
214
|
const spinner = !opts.json && !opts.noInteractive ? ora('Validating...').start() : undefined;
|
|
187
215
|
const [changeIds, specIds] = await Promise.all([
|
|
188
|
-
scope.changes ?
|
|
216
|
+
scope.changes ? this.listChangeIds(root) : Promise.resolve([]),
|
|
189
217
|
scope.specs ? getSpecIds(root.path) : Promise.resolve([]),
|
|
190
218
|
]);
|
|
191
219
|
const DEFAULT_CONCURRENCY = 6;
|
|
@@ -197,7 +225,10 @@ export class ValidateCommand {
|
|
|
197
225
|
queue.push(async () => {
|
|
198
226
|
const start = Date.now();
|
|
199
227
|
const changeDir = path.join(root.changesDir, id);
|
|
200
|
-
const report = await validator.validateChangeDeltaSpecs(changeDir
|
|
228
|
+
const report = await validator.validateChangeDeltaSpecs(changeDir, {
|
|
229
|
+
mainSpecsDir: root.specsDir,
|
|
230
|
+
projectRoot: root.path,
|
|
231
|
+
});
|
|
201
232
|
const durationMs = Date.now() - start;
|
|
202
233
|
return { id, type: 'change', valid: report.valid, issues: report.issues, durationMs };
|
|
203
234
|
});
|
|
@@ -295,14 +326,6 @@ export class ValidateCommand {
|
|
|
295
326
|
console.log(`Details: openspec validate ${firstFailure.id} --type ${firstFailure.type}${storeFlag}`);
|
|
296
327
|
}
|
|
297
328
|
}
|
|
298
|
-
trackEvent('bulk_validation_run', {
|
|
299
|
-
total: summary.totals.items,
|
|
300
|
-
passed: summary.totals.passed,
|
|
301
|
-
failed: summary.totals.failed,
|
|
302
|
-
scope_changes: scope.changes,
|
|
303
|
-
scope_specs: scope.specs,
|
|
304
|
-
strict: opts.strict,
|
|
305
|
-
});
|
|
306
329
|
process.exitCode = failed > 0 ? 1 : 0;
|
|
307
330
|
}
|
|
308
331
|
}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { statusCommand } from './status.js';
|
|
7
7
|
export type { StatusOptions } from './status.js';
|
|
8
|
-
export { instructionsCommand, applyInstructionsCommand,
|
|
9
|
-
export type { InstructionsOptions
|
|
8
|
+
export { instructionsCommand, applyInstructionsCommand, archiveInstructionsCommand, } from './instructions.js';
|
|
9
|
+
export type { InstructionsOptions } from './instructions.js';
|
|
10
10
|
export { templatesCommand } from './templates.js';
|
|
11
11
|
export type { TemplatesOptions } from './templates.js';
|
|
12
12
|
export { schemasCommand } from './schemas.js';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Commands for the artifact-driven workflow: status, instructions, templates, schemas, new change.
|
|
5
5
|
*/
|
|
6
6
|
export { statusCommand } from './status.js';
|
|
7
|
-
export { instructionsCommand, applyInstructionsCommand,
|
|
7
|
+
export { instructionsCommand, applyInstructionsCommand, archiveInstructionsCommand, } from './instructions.js';
|
|
8
8
|
export { templatesCommand } from './templates.js';
|
|
9
9
|
export { schemasCommand } from './schemas.js';
|
|
10
10
|
export { newChangeCommand } from './new-change.js';
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Generates enriched instructions for creating artifacts or applying tasks.
|
|
5
5
|
* Includes both artifact instructions and apply instructions.
|
|
6
6
|
*/
|
|
7
|
-
import { type ArtifactInstructions
|
|
7
|
+
import { type ArtifactInstructions } from '../../core/artifact-graph/index.js';
|
|
8
8
|
import { type PlanningHome } from '../../core/planning-home.js';
|
|
9
9
|
import { type ReferenceIndexEntry } from '../../core/references.js';
|
|
10
10
|
import { type ProjectConfig } from '../../core/project-config.js';
|
|
11
|
-
import { type ApplyInstructions } from './shared.js';
|
|
11
|
+
import { type ApplyInstructions, type ArchiveInstructions } from './shared.js';
|
|
12
12
|
export interface InstructionsOptions {
|
|
13
13
|
change?: string;
|
|
14
14
|
schema?: string;
|
|
@@ -22,29 +22,8 @@ export interface ApplyInstructionsOptions {
|
|
|
22
22
|
store?: string;
|
|
23
23
|
storePath?: string;
|
|
24
24
|
json?: boolean;
|
|
25
|
-
recordComprehensionPass?: boolean;
|
|
26
|
-
score?: number;
|
|
27
|
-
attempt?: number;
|
|
28
|
-
questionCount?: number;
|
|
29
|
-
}
|
|
30
|
-
export interface ModifyInstructionsOptions extends InstructionsOptions {
|
|
31
|
-
artifact?: string;
|
|
32
|
-
workflowInput?: string;
|
|
33
|
-
workflowInputFile?: string;
|
|
34
|
-
editor?: string;
|
|
35
|
-
}
|
|
36
|
-
export interface ModifyInstructions {
|
|
37
|
-
changeName: string;
|
|
38
|
-
schemaName: string;
|
|
39
|
-
sourceArtifact: string;
|
|
40
|
-
modifyInput?: string;
|
|
41
|
-
downstreamArtifacts: string[];
|
|
42
|
-
artifactsToUpdate: string[];
|
|
43
|
-
changeRoot: string;
|
|
44
|
-
artifactPaths: Record<string, ArtifactPathSummary>;
|
|
45
|
-
phase: 'pre_apply';
|
|
46
|
-
instruction: string;
|
|
47
25
|
}
|
|
26
|
+
export type ArchiveInstructionsOptions = ApplyInstructionsOptions;
|
|
48
27
|
export declare function instructionsCommand(artifactId: string | undefined, options: InstructionsOptions): Promise<void>;
|
|
49
28
|
export declare function printInstructionsText(instructions: ArtifactInstructions, isBlocked: boolean): void;
|
|
50
29
|
export interface GenerateApplyInstructionsOptions {
|
|
@@ -60,6 +39,7 @@ export interface GenerateApplyInstructionsOptions {
|
|
|
60
39
|
export declare function generateApplyInstructions(projectRoot: string, changeName: string, schemaName?: string, options?: GenerateApplyInstructionsOptions): Promise<ApplyInstructions>;
|
|
61
40
|
export declare function applyInstructionsCommand(options: ApplyInstructionsOptions): Promise<void>;
|
|
62
41
|
export declare function printApplyInstructionsText(instructions: ApplyInstructions): void;
|
|
63
|
-
export declare function
|
|
64
|
-
export declare function
|
|
42
|
+
export declare function generateArchiveInstructions(changeName: string, projectConfig: ProjectConfig | null): ArchiveInstructions;
|
|
43
|
+
export declare function archiveInstructionsCommand(options: ArchiveInstructionsOptions): Promise<void>;
|
|
44
|
+
export declare function printArchiveInstructionsText(instructions: ArchiveInstructions): void;
|
|
65
45
|
//# sourceMappingURL=instructions.d.ts.map
|