gmc-openspec 1.0.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/LICENSE +22 -0
- package/README.md +207 -0
- package/bin/openspec.js +3 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +494 -0
- package/dist/commands/change.d.ts +35 -0
- package/dist/commands/change.js +277 -0
- package/dist/commands/completion.d.ts +72 -0
- package/dist/commands/completion.js +264 -0
- package/dist/commands/config.d.ts +36 -0
- package/dist/commands/config.js +611 -0
- package/dist/commands/feedback.d.ts +9 -0
- package/dist/commands/feedback.js +183 -0
- package/dist/commands/jira.d.ts +3 -0
- package/dist/commands/jira.js +249 -0
- package/dist/commands/schema.d.ts +6 -0
- package/dist/commands/schema.js +869 -0
- package/dist/commands/show.d.ts +14 -0
- package/dist/commands/show.js +132 -0
- package/dist/commands/spec.d.ts +15 -0
- package/dist/commands/spec.js +225 -0
- package/dist/commands/validate.d.ts +24 -0
- package/dist/commands/validate.js +294 -0
- package/dist/commands/workflow/index.d.ts +17 -0
- package/dist/commands/workflow/index.js +12 -0
- package/dist/commands/workflow/instructions.d.ts +29 -0
- package/dist/commands/workflow/instructions.js +336 -0
- package/dist/commands/workflow/new-change.d.ts +13 -0
- package/dist/commands/workflow/new-change.js +92 -0
- package/dist/commands/workflow/schemas.d.ts +10 -0
- package/dist/commands/workflow/schemas.js +34 -0
- package/dist/commands/workflow/shared.d.ts +57 -0
- package/dist/commands/workflow/shared.js +116 -0
- package/dist/commands/workflow/status.d.ts +14 -0
- package/dist/commands/workflow/status.js +87 -0
- package/dist/commands/workflow/templates.d.ts +16 -0
- package/dist/commands/workflow/templates.js +69 -0
- package/dist/commands/workspace/open.d.ts +29 -0
- package/dist/commands/workspace/open.js +84 -0
- package/dist/commands/workspace/operations.d.ts +23 -0
- package/dist/commands/workspace/operations.js +475 -0
- package/dist/commands/workspace/selection.d.ts +6 -0
- package/dist/commands/workspace/selection.js +113 -0
- package/dist/commands/workspace/types.d.ts +88 -0
- package/dist/commands/workspace/types.js +36 -0
- package/dist/commands/workspace.d.ts +6 -0
- package/dist/commands/workspace.js +868 -0
- package/dist/core/archive.d.ts +11 -0
- package/dist/core/archive.js +318 -0
- package/dist/core/artifact-graph/graph.d.ts +56 -0
- package/dist/core/artifact-graph/graph.js +141 -0
- package/dist/core/artifact-graph/index.d.ts +8 -0
- package/dist/core/artifact-graph/index.js +14 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +196 -0
- package/dist/core/artifact-graph/instruction-loader.js +317 -0
- package/dist/core/artifact-graph/outputs.d.ts +14 -0
- package/dist/core/artifact-graph/outputs.js +39 -0
- package/dist/core/artifact-graph/resolver.d.ts +81 -0
- package/dist/core/artifact-graph/resolver.js +257 -0
- package/dist/core/artifact-graph/schema.d.ts +13 -0
- package/dist/core/artifact-graph/schema.js +108 -0
- package/dist/core/artifact-graph/state.d.ts +12 -0
- package/dist/core/artifact-graph/state.js +31 -0
- package/dist/core/artifact-graph/types.d.ts +47 -0
- package/dist/core/artifact-graph/types.js +48 -0
- package/dist/core/available-tools.d.ts +17 -0
- package/dist/core/available-tools.js +43 -0
- package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
- package/dist/core/command-generation/adapters/amazon-q.js +26 -0
- package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
- package/dist/core/command-generation/adapters/antigravity.js +26 -0
- package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
- package/dist/core/command-generation/adapters/auggie.js +27 -0
- package/dist/core/command-generation/adapters/bob.d.ts +14 -0
- package/dist/core/command-generation/adapters/bob.js +45 -0
- package/dist/core/command-generation/adapters/claude.d.ts +13 -0
- package/dist/core/command-generation/adapters/claude.js +50 -0
- package/dist/core/command-generation/adapters/cline.d.ts +14 -0
- package/dist/core/command-generation/adapters/cline.js +27 -0
- package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
- package/dist/core/command-generation/adapters/codebuddy.js +28 -0
- package/dist/core/command-generation/adapters/codex.d.ts +16 -0
- package/dist/core/command-generation/adapters/codex.js +39 -0
- package/dist/core/command-generation/adapters/continue.d.ts +13 -0
- package/dist/core/command-generation/adapters/continue.js +28 -0
- package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
- package/dist/core/command-generation/adapters/costrict.js +27 -0
- package/dist/core/command-generation/adapters/crush.d.ts +13 -0
- package/dist/core/command-generation/adapters/crush.js +30 -0
- package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
- package/dist/core/command-generation/adapters/cursor.js +44 -0
- package/dist/core/command-generation/adapters/factory.d.ts +13 -0
- package/dist/core/command-generation/adapters/factory.js +27 -0
- package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
- package/dist/core/command-generation/adapters/gemini.js +26 -0
- package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
- package/dist/core/command-generation/adapters/github-copilot.js +26 -0
- package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
- package/dist/core/command-generation/adapters/iflow.js +29 -0
- package/dist/core/command-generation/adapters/index.d.ts +32 -0
- package/dist/core/command-generation/adapters/index.js +32 -0
- package/dist/core/command-generation/adapters/junie.d.ts +13 -0
- package/dist/core/command-generation/adapters/junie.js +26 -0
- package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/kilocode.js +23 -0
- package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
- package/dist/core/command-generation/adapters/kiro.js +26 -0
- package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
- package/dist/core/command-generation/adapters/lingma.js +30 -0
- package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
- package/dist/core/command-generation/adapters/opencode.js +29 -0
- package/dist/core/command-generation/adapters/pi.d.ts +18 -0
- package/dist/core/command-generation/adapters/pi.js +55 -0
- package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
- package/dist/core/command-generation/adapters/qoder.js +30 -0
- package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
- package/dist/core/command-generation/adapters/qwen.js +26 -0
- package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/roocode.js +27 -0
- package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
- package/dist/core/command-generation/adapters/windsurf.js +51 -0
- package/dist/core/command-generation/generator.d.ts +21 -0
- package/dist/core/command-generation/generator.js +27 -0
- package/dist/core/command-generation/index.d.ts +22 -0
- package/dist/core/command-generation/index.js +24 -0
- package/dist/core/command-generation/registry.d.ts +36 -0
- package/dist/core/command-generation/registry.js +98 -0
- package/dist/core/command-generation/types.d.ts +56 -0
- package/dist/core/command-generation/types.js +8 -0
- package/dist/core/completions/command-registry.d.ts +7 -0
- package/dist/core/completions/command-registry.js +626 -0
- package/dist/core/completions/completion-provider.d.ts +71 -0
- package/dist/core/completions/completion-provider.js +129 -0
- package/dist/core/completions/factory.d.ts +64 -0
- package/dist/core/completions/factory.js +75 -0
- package/dist/core/completions/generators/bash-generator.d.ts +35 -0
- package/dist/core/completions/generators/bash-generator.js +230 -0
- package/dist/core/completions/generators/fish-generator.d.ts +32 -0
- package/dist/core/completions/generators/fish-generator.js +160 -0
- package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
- package/dist/core/completions/generators/powershell-generator.js +266 -0
- package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
- package/dist/core/completions/generators/zsh-generator.js +274 -0
- package/dist/core/completions/installers/bash-installer.d.ts +87 -0
- package/dist/core/completions/installers/bash-installer.js +318 -0
- package/dist/core/completions/installers/fish-installer.d.ts +43 -0
- package/dist/core/completions/installers/fish-installer.js +143 -0
- package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
- package/dist/core/completions/installers/powershell-installer.js +387 -0
- package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
- package/dist/core/completions/installers/zsh-installer.js +421 -0
- package/dist/core/completions/templates/bash-templates.d.ts +6 -0
- package/dist/core/completions/templates/bash-templates.js +30 -0
- package/dist/core/completions/templates/fish-templates.d.ts +7 -0
- package/dist/core/completions/templates/fish-templates.js +45 -0
- package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
- package/dist/core/completions/templates/powershell-templates.js +34 -0
- package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
- package/dist/core/completions/templates/zsh-templates.js +45 -0
- package/dist/core/completions/types.d.ts +101 -0
- package/dist/core/completions/types.js +2 -0
- package/dist/core/config-prompts.d.ts +9 -0
- package/dist/core/config-prompts.js +34 -0
- package/dist/core/config-schema.d.ts +86 -0
- package/dist/core/config-schema.js +213 -0
- package/dist/core/config.d.ts +18 -0
- package/dist/core/config.js +38 -0
- package/dist/core/converters/json-converter.d.ts +6 -0
- package/dist/core/converters/json-converter.js +51 -0
- package/dist/core/global-config.d.ts +49 -0
- package/dist/core/global-config.js +124 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.js +6 -0
- package/dist/core/init.d.ts +37 -0
- package/dist/core/init.js +593 -0
- package/dist/core/jira/config.d.ts +35 -0
- package/dist/core/jira/config.js +151 -0
- package/dist/core/jira/constants.d.ts +20 -0
- package/dist/core/jira/constants.js +49 -0
- package/dist/core/jira/doctor.d.ts +19 -0
- package/dist/core/jira/doctor.js +173 -0
- package/dist/core/jira/hash.d.ts +3 -0
- package/dist/core/jira/hash.js +9 -0
- package/dist/core/jira/index.d.ts +11 -0
- package/dist/core/jira/index.js +11 -0
- package/dist/core/jira/intake.d.ts +40 -0
- package/dist/core/jira/intake.js +54 -0
- package/dist/core/jira/mcp-config.d.ts +13 -0
- package/dist/core/jira/mcp-config.js +259 -0
- package/dist/core/jira/paths.d.ts +12 -0
- package/dist/core/jira/paths.js +66 -0
- package/dist/core/jira/setup.d.ts +30 -0
- package/dist/core/jira/setup.js +99 -0
- package/dist/core/jira/templates.d.ts +12 -0
- package/dist/core/jira/templates.js +204 -0
- package/dist/core/jira/validation.d.ts +17 -0
- package/dist/core/jira/validation.js +341 -0
- package/dist/core/legacy-cleanup.d.ts +162 -0
- package/dist/core/legacy-cleanup.js +514 -0
- package/dist/core/list.d.ts +9 -0
- package/dist/core/list.js +171 -0
- package/dist/core/migration.d.ts +23 -0
- package/dist/core/migration.js +108 -0
- package/dist/core/parsers/change-parser.d.ts +13 -0
- package/dist/core/parsers/change-parser.js +197 -0
- package/dist/core/parsers/markdown-parser.d.ts +26 -0
- package/dist/core/parsers/markdown-parser.js +227 -0
- package/dist/core/parsers/requirement-blocks.d.ts +37 -0
- package/dist/core/parsers/requirement-blocks.js +201 -0
- package/dist/core/parsers/spec-structure.d.ts +9 -0
- package/dist/core/parsers/spec-structure.js +88 -0
- package/dist/core/planning-home.d.ts +21 -0
- package/dist/core/planning-home.js +124 -0
- package/dist/core/profile-sync-drift.d.ts +38 -0
- package/dist/core/profile-sync-drift.js +200 -0
- package/dist/core/profiles.d.ts +26 -0
- package/dist/core/profiles.js +40 -0
- package/dist/core/project-config.d.ts +64 -0
- package/dist/core/project-config.js +223 -0
- package/dist/core/schemas/base.schema.d.ts +13 -0
- package/dist/core/schemas/base.schema.js +13 -0
- package/dist/core/schemas/change.schema.d.ts +73 -0
- package/dist/core/schemas/change.schema.js +31 -0
- package/dist/core/schemas/index.d.ts +4 -0
- package/dist/core/schemas/index.js +4 -0
- package/dist/core/schemas/spec.schema.d.ts +18 -0
- package/dist/core/schemas/spec.schema.js +15 -0
- package/dist/core/shared/index.d.ts +8 -0
- package/dist/core/shared/index.js +8 -0
- package/dist/core/shared/skill-generation.d.ts +49 -0
- package/dist/core/shared/skill-generation.js +96 -0
- package/dist/core/shared/tool-detection.d.ts +71 -0
- package/dist/core/shared/tool-detection.js +158 -0
- package/dist/core/specs-apply.d.ts +73 -0
- package/dist/core/specs-apply.js +392 -0
- package/dist/core/styles/palette.d.ts +7 -0
- package/dist/core/styles/palette.js +8 -0
- package/dist/core/templates/index.d.ts +8 -0
- package/dist/core/templates/index.js +9 -0
- package/dist/core/templates/skill-templates.d.ts +19 -0
- package/dist/core/templates/skill-templates.js +18 -0
- package/dist/core/templates/types.d.ts +19 -0
- package/dist/core/templates/types.js +5 -0
- package/dist/core/templates/workflows/apply-change.d.ts +10 -0
- package/dist/core/templates/workflows/apply-change.js +314 -0
- package/dist/core/templates/workflows/archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/archive-change.js +277 -0
- package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
- package/dist/core/templates/workflows/continue-change.d.ts +10 -0
- package/dist/core/templates/workflows/continue-change.js +234 -0
- package/dist/core/templates/workflows/explore.d.ts +10 -0
- package/dist/core/templates/workflows/explore.js +459 -0
- package/dist/core/templates/workflows/feedback.d.ts +9 -0
- package/dist/core/templates/workflows/feedback.js +108 -0
- package/dist/core/templates/workflows/ff-change.d.ts +10 -0
- package/dist/core/templates/workflows/ff-change.js +200 -0
- package/dist/core/templates/workflows/new-change.d.ts +10 -0
- package/dist/core/templates/workflows/new-change.js +143 -0
- package/dist/core/templates/workflows/onboard.d.ts +10 -0
- package/dist/core/templates/workflows/onboard.js +563 -0
- package/dist/core/templates/workflows/propose.d.ts +10 -0
- package/dist/core/templates/workflows/propose.js +218 -0
- package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
- package/dist/core/templates/workflows/sync-specs.js +290 -0
- package/dist/core/templates/workflows/verify-change.d.ts +10 -0
- package/dist/core/templates/workflows/verify-change.js +338 -0
- package/dist/core/update.d.ts +83 -0
- package/dist/core/update.js +573 -0
- package/dist/core/validation/constants.d.ts +34 -0
- package/dist/core/validation/constants.js +40 -0
- package/dist/core/validation/types.d.ts +18 -0
- package/dist/core/validation/types.js +2 -0
- package/dist/core/validation/validator.d.ts +33 -0
- package/dist/core/validation/validator.js +418 -0
- package/dist/core/view.d.ts +8 -0
- package/dist/core/view.js +168 -0
- package/dist/core/workspace/foundation.d.ts +87 -0
- package/dist/core/workspace/foundation.js +379 -0
- package/dist/core/workspace/index.d.ts +6 -0
- package/dist/core/workspace/index.js +6 -0
- package/dist/core/workspace/link-input.d.ts +9 -0
- package/dist/core/workspace/link-input.js +32 -0
- package/dist/core/workspace/open-surface.d.ts +24 -0
- package/dist/core/workspace/open-surface.js +137 -0
- package/dist/core/workspace/openers.d.ts +21 -0
- package/dist/core/workspace/openers.js +119 -0
- package/dist/core/workspace/skills.d.ts +55 -0
- package/dist/core/workspace/skills.js +334 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/prompts/searchable-multi-select.d.ts +28 -0
- package/dist/prompts/searchable-multi-select.js +159 -0
- package/dist/telemetry/config.d.ts +38 -0
- package/dist/telemetry/config.js +136 -0
- package/dist/telemetry/index.d.ts +31 -0
- package/dist/telemetry/index.js +164 -0
- package/dist/ui/ascii-patterns.d.ts +16 -0
- package/dist/ui/ascii-patterns.js +133 -0
- package/dist/ui/welcome-screen.d.ts +10 -0
- package/dist/ui/welcome-screen.js +146 -0
- package/dist/utils/change-metadata.d.ts +51 -0
- package/dist/utils/change-metadata.js +147 -0
- package/dist/utils/change-utils.d.ts +71 -0
- package/dist/utils/change-utils.js +123 -0
- package/dist/utils/command-references.d.ts +18 -0
- package/dist/utils/command-references.js +20 -0
- package/dist/utils/file-system.d.ts +41 -0
- package/dist/utils/file-system.js +301 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/interactive.d.ts +18 -0
- package/dist/utils/interactive.js +21 -0
- package/dist/utils/item-discovery.d.ts +4 -0
- package/dist/utils/item-discovery.js +72 -0
- package/dist/utils/match.d.ts +3 -0
- package/dist/utils/match.js +22 -0
- package/dist/utils/shell-detection.d.ts +20 -0
- package/dist/utils/shell-detection.js +41 -0
- package/dist/utils/task-progress.d.ts +8 -0
- package/dist/utils/task-progress.js +36 -0
- package/package.json +79 -0
- package/schemas/spec-driven/schema.yaml +153 -0
- package/schemas/spec-driven/templates/design.md +19 -0
- package/schemas/spec-driven/templates/proposal.md +23 -0
- package/schemas/spec-driven/templates/spec.md +8 -0
- package/schemas/spec-driven/templates/tasks.md +9 -0
- package/schemas/workspace-planning/schema.yaml +72 -0
- package/schemas/workspace-planning/templates/design.md +33 -0
- package/schemas/workspace-planning/templates/proposal.md +28 -0
- package/schemas/workspace-planning/templates/spec.md +9 -0
- package/schemas/workspace-planning/templates/tasks.md +15 -0
- package/scripts/postinstall.js +83 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status Command
|
|
3
|
+
*
|
|
4
|
+
* Displays artifact completion status for a change.
|
|
5
|
+
*/
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { resolveCurrentPlanningHomeSync, getChangeDir } from '../../core/planning-home.js';
|
|
9
|
+
import { loadChangeContext, formatChangeStatus, } from '../../core/artifact-graph/index.js';
|
|
10
|
+
import { validateChangeExists, validateSchemaExists, getAvailableChanges, getStatusIndicator, getStatusColor, } from './shared.js';
|
|
11
|
+
// -----------------------------------------------------------------------------
|
|
12
|
+
// Command Implementation
|
|
13
|
+
// -----------------------------------------------------------------------------
|
|
14
|
+
export async function statusCommand(options) {
|
|
15
|
+
const spinner = options.json ? undefined : ora('Loading change status...').start();
|
|
16
|
+
try {
|
|
17
|
+
const planningHome = resolveCurrentPlanningHomeSync();
|
|
18
|
+
const projectRoot = planningHome.root;
|
|
19
|
+
// Handle no-changes case gracefully — status is informational,
|
|
20
|
+
// so "no changes" is a valid state, not an error.
|
|
21
|
+
if (!options.change) {
|
|
22
|
+
const available = await getAvailableChanges(projectRoot, planningHome.changesDir);
|
|
23
|
+
if (available.length === 0) {
|
|
24
|
+
spinner?.stop();
|
|
25
|
+
if (options.json) {
|
|
26
|
+
console.log(JSON.stringify({ changes: [], message: 'No active changes.' }, null, 2));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
console.log('No active changes. Create one with: openspec new change <name>');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Changes exist but --change not provided
|
|
33
|
+
spinner?.stop();
|
|
34
|
+
throw new Error(`Missing required option --change. Available changes:\n ${available.join('\n ')}`);
|
|
35
|
+
}
|
|
36
|
+
const changeName = await validateChangeExists(options.change, projectRoot, planningHome.changesDir);
|
|
37
|
+
// Validate schema if explicitly provided
|
|
38
|
+
if (options.schema) {
|
|
39
|
+
validateSchemaExists(options.schema, projectRoot);
|
|
40
|
+
}
|
|
41
|
+
// loadChangeContext will auto-detect schema from metadata if not provided
|
|
42
|
+
const context = loadChangeContext(projectRoot, changeName, options.schema, {
|
|
43
|
+
changeDir: getChangeDir(planningHome, changeName),
|
|
44
|
+
planningHome,
|
|
45
|
+
});
|
|
46
|
+
const status = formatChangeStatus(context);
|
|
47
|
+
spinner?.stop();
|
|
48
|
+
if (options.json) {
|
|
49
|
+
console.log(JSON.stringify(status, null, 2));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
printStatusText(status);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
spinner?.stop();
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function printStatusText(status) {
|
|
60
|
+
const doneCount = status.artifacts.filter((a) => a.status === 'done').length;
|
|
61
|
+
const total = status.artifacts.length;
|
|
62
|
+
console.log(`Change: ${status.changeName}`);
|
|
63
|
+
console.log(`Schema: ${status.schemaName}`);
|
|
64
|
+
if (status.planningHome) {
|
|
65
|
+
const label = status.planningHome.kind === 'workspace'
|
|
66
|
+
? `workspace${status.planningHome.workspaceName ? ` (${status.planningHome.workspaceName})` : ''}`
|
|
67
|
+
: 'repo';
|
|
68
|
+
console.log(`Planning home: ${label}`);
|
|
69
|
+
console.log(`Change root: ${status.changeRoot}`);
|
|
70
|
+
}
|
|
71
|
+
console.log(`Progress: ${doneCount}/${total} artifacts complete`);
|
|
72
|
+
console.log();
|
|
73
|
+
for (const artifact of status.artifacts) {
|
|
74
|
+
const indicator = getStatusIndicator(artifact.status);
|
|
75
|
+
const color = getStatusColor(artifact.status);
|
|
76
|
+
let line = `${indicator} ${artifact.id}`;
|
|
77
|
+
if (artifact.status === 'blocked' && artifact.missingDeps && artifact.missingDeps.length > 0) {
|
|
78
|
+
line += color(` (blocked by: ${artifact.missingDeps.join(', ')})`);
|
|
79
|
+
}
|
|
80
|
+
console.log(line);
|
|
81
|
+
}
|
|
82
|
+
if (status.isComplete) {
|
|
83
|
+
console.log();
|
|
84
|
+
console.log(chalk.green('All artifacts complete!'));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Templates Command
|
|
3
|
+
*
|
|
4
|
+
* Shows resolved template paths for all artifacts in a schema.
|
|
5
|
+
*/
|
|
6
|
+
export interface TemplatesOptions {
|
|
7
|
+
schema?: string;
|
|
8
|
+
json?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface TemplateInfo {
|
|
11
|
+
artifactId: string;
|
|
12
|
+
templatePath: string;
|
|
13
|
+
source: 'project' | 'user' | 'package';
|
|
14
|
+
}
|
|
15
|
+
export declare function templatesCommand(options: TemplatesOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Templates Command
|
|
3
|
+
*
|
|
4
|
+
* Shows resolved template paths for all artifacts in a schema.
|
|
5
|
+
*/
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { resolveSchema, getSchemaDir, ArtifactGraph, } from '../../core/artifact-graph/index.js';
|
|
9
|
+
import { FileSystemUtils } from '../../utils/file-system.js';
|
|
10
|
+
import { validateSchemaExists, DEFAULT_SCHEMA } from './shared.js';
|
|
11
|
+
// -----------------------------------------------------------------------------
|
|
12
|
+
// Command Implementation
|
|
13
|
+
// -----------------------------------------------------------------------------
|
|
14
|
+
export async function templatesCommand(options) {
|
|
15
|
+
const spinner = options.json ? undefined : ora('Loading templates...').start();
|
|
16
|
+
try {
|
|
17
|
+
const projectRoot = process.cwd();
|
|
18
|
+
const schemaName = validateSchemaExists(options.schema ?? DEFAULT_SCHEMA, projectRoot);
|
|
19
|
+
const schema = resolveSchema(schemaName, projectRoot);
|
|
20
|
+
const graph = ArtifactGraph.fromSchema(schema);
|
|
21
|
+
const schemaDir = getSchemaDir(schemaName, projectRoot);
|
|
22
|
+
// Determine the source (project, user, or package)
|
|
23
|
+
const { getUserSchemasDir, getProjectSchemasDir, } = await import('../../core/artifact-graph/resolver.js');
|
|
24
|
+
const projectSchemasDir = getProjectSchemasDir(projectRoot);
|
|
25
|
+
const userSchemasDir = getUserSchemasDir();
|
|
26
|
+
// Determine source by checking if schemaDir is inside each base directory
|
|
27
|
+
// Using path.relative is more robust than startsWith for path comparisons
|
|
28
|
+
const isInsideDir = (child, parent) => {
|
|
29
|
+
const relative = path.relative(parent, child);
|
|
30
|
+
return !relative.startsWith('..') && !path.isAbsolute(relative);
|
|
31
|
+
};
|
|
32
|
+
let source;
|
|
33
|
+
if (isInsideDir(schemaDir, projectSchemasDir)) {
|
|
34
|
+
source = 'project';
|
|
35
|
+
}
|
|
36
|
+
else if (isInsideDir(schemaDir, userSchemasDir)) {
|
|
37
|
+
source = 'user';
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
source = 'package';
|
|
41
|
+
}
|
|
42
|
+
const templates = graph.getAllArtifacts().map((artifact) => ({
|
|
43
|
+
artifactId: artifact.id,
|
|
44
|
+
templatePath: FileSystemUtils.canonicalizeExistingPath(path.join(schemaDir, 'templates', artifact.template)),
|
|
45
|
+
source,
|
|
46
|
+
}));
|
|
47
|
+
spinner?.stop();
|
|
48
|
+
if (options.json) {
|
|
49
|
+
const output = {};
|
|
50
|
+
for (const t of templates) {
|
|
51
|
+
output[t.artifactId] = { path: t.templatePath, source: t.source };
|
|
52
|
+
}
|
|
53
|
+
console.log(JSON.stringify(output, null, 2));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
console.log(`Schema: ${schemaName}`);
|
|
57
|
+
console.log(`Source: ${source}`);
|
|
58
|
+
console.log();
|
|
59
|
+
for (const t of templates) {
|
|
60
|
+
console.log(`${t.artifactId}:`);
|
|
61
|
+
console.log(` ${t.templatePath}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
spinner?.stop();
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'node:child_process';
|
|
2
|
+
import { WorkspaceLocalState, WorkspacePreferredOpener, WorkspaceSharedState, resolveWorkspaceOpenLinks } from '../../core/workspace/index.js';
|
|
3
|
+
import { SelectedWorkspace } from './types.js';
|
|
4
|
+
export declare const WORKSPACE_OPEN_MINIMAL_PROMPT = "Open this OpenSpec workspace.";
|
|
5
|
+
export interface WorkspaceOpenState {
|
|
6
|
+
sharedState: WorkspaceSharedState;
|
|
7
|
+
localState: WorkspaceLocalState;
|
|
8
|
+
codeWorkspacePath: string;
|
|
9
|
+
}
|
|
10
|
+
export interface WorkspaceOpenLaunchCommand {
|
|
11
|
+
executable: string;
|
|
12
|
+
args: string[];
|
|
13
|
+
cwd: string;
|
|
14
|
+
openerLabel: string;
|
|
15
|
+
}
|
|
16
|
+
export type WorkspaceOpenSpawn = typeof nodeSpawn;
|
|
17
|
+
export interface WorkspaceOpenLaunchOptions {
|
|
18
|
+
spawn?: WorkspaceOpenSpawn;
|
|
19
|
+
isExecutableAvailable?: (executable: string) => boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function readWorkspaceOpenState(selected: SelectedWorkspace): Promise<WorkspaceOpenState>;
|
|
22
|
+
export declare function buildWorkspaceOpenLaunchCommand(opener: WorkspacePreferredOpener, workspaceRoot: string, codeWorkspacePath: string, linkedPaths: string[]): WorkspaceOpenLaunchCommand;
|
|
23
|
+
export declare function assertWorkspaceOpenerAvailable(opener: WorkspacePreferredOpener, codeWorkspacePath: string, isExecutableAvailable?: (executable: string) => boolean): void;
|
|
24
|
+
export declare function buildWorkspaceOpenCommandForState(opener: WorkspacePreferredOpener, workspaceRoot: string, state: WorkspaceOpenState): Promise<{
|
|
25
|
+
command: WorkspaceOpenLaunchCommand;
|
|
26
|
+
skipped: Awaited<ReturnType<typeof resolveWorkspaceOpenLinks>>['skipped'];
|
|
27
|
+
}>;
|
|
28
|
+
export declare function launchWorkspaceOpenCommand(command: WorkspaceOpenLaunchCommand, options?: WorkspaceOpenLaunchOptions): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=open.d.ts.map
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { getWorkspaceCodeWorkspacePath, getWorkspaceOpenerExecutable, getWorkspaceOpenerLabel, isWorkspaceExecutableAvailable, readWorkspaceLocalState, readWorkspaceSharedState, resolveWorkspaceOpenLinks, writeWorkspaceCodeWorkspaceFile, } from '../../core/workspace/index.js';
|
|
3
|
+
import { WorkspaceCliError, asErrorMessage } from './types.js';
|
|
4
|
+
export const WORKSPACE_OPEN_MINIMAL_PROMPT = 'Open this OpenSpec workspace.';
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const spawn = require('cross-spawn');
|
|
7
|
+
export async function readWorkspaceOpenState(selected) {
|
|
8
|
+
const sharedState = await readWorkspaceSharedState(selected.root);
|
|
9
|
+
const localState = await readWorkspaceLocalState(selected.root);
|
|
10
|
+
return {
|
|
11
|
+
sharedState,
|
|
12
|
+
localState,
|
|
13
|
+
codeWorkspacePath: getWorkspaceCodeWorkspacePath(selected.root, sharedState.name),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function buildWorkspaceOpenLaunchCommand(opener, workspaceRoot, codeWorkspacePath, linkedPaths) {
|
|
17
|
+
const executable = getWorkspaceOpenerExecutable(opener);
|
|
18
|
+
const openerLabel = getWorkspaceOpenerLabel(opener);
|
|
19
|
+
if (opener.kind === 'editor' || opener.id === 'github-copilot') {
|
|
20
|
+
return {
|
|
21
|
+
executable,
|
|
22
|
+
args: [codeWorkspacePath],
|
|
23
|
+
cwd: workspaceRoot,
|
|
24
|
+
openerLabel,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
executable,
|
|
29
|
+
args: [
|
|
30
|
+
...linkedPaths.flatMap((linkedPath) => ['--add-dir', linkedPath]),
|
|
31
|
+
WORKSPACE_OPEN_MINIMAL_PROMPT,
|
|
32
|
+
],
|
|
33
|
+
cwd: workspaceRoot,
|
|
34
|
+
openerLabel,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function assertWorkspaceOpenerAvailable(opener, codeWorkspacePath, isExecutableAvailable = isWorkspaceExecutableAvailable) {
|
|
38
|
+
const executable = getWorkspaceOpenerExecutable(opener);
|
|
39
|
+
if (isExecutableAvailable(executable)) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const openerLabel = getWorkspaceOpenerLabel(opener);
|
|
43
|
+
const manualPath = executable === 'code'
|
|
44
|
+
? ` You can open the workspace file manually: ${codeWorkspacePath}`
|
|
45
|
+
: '';
|
|
46
|
+
throw new WorkspaceCliError(`${openerLabel} requires '${executable}', but '${executable}' was not found on PATH.${manualPath}`, 'workspace_opener_unavailable', {
|
|
47
|
+
target: 'workspace.opener',
|
|
48
|
+
fix: `Install '${executable}' or choose another opener.`,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export async function buildWorkspaceOpenCommandForState(opener, workspaceRoot, state) {
|
|
52
|
+
const openLinks = await resolveWorkspaceOpenLinks(state.sharedState, state.localState);
|
|
53
|
+
await writeWorkspaceCodeWorkspaceFile(state.codeWorkspacePath, openLinks.links);
|
|
54
|
+
return {
|
|
55
|
+
command: buildWorkspaceOpenLaunchCommand(opener, workspaceRoot, state.codeWorkspacePath, openLinks.links.map((link) => link.path)),
|
|
56
|
+
skipped: openLinks.skipped,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export async function launchWorkspaceOpenCommand(command, options = {}) {
|
|
60
|
+
const spawnCommand = options.spawn ?? spawn;
|
|
61
|
+
await new Promise((resolve, reject) => {
|
|
62
|
+
const child = spawnCommand(command.executable, command.args, {
|
|
63
|
+
cwd: command.cwd,
|
|
64
|
+
stdio: 'inherit',
|
|
65
|
+
shell: false,
|
|
66
|
+
});
|
|
67
|
+
child.on('error', (error) => {
|
|
68
|
+
reject(new WorkspaceCliError(`Could not launch ${command.openerLabel}: ${asErrorMessage(error)}`, 'workspace_opener_launch_failed', {
|
|
69
|
+
target: 'workspace.opener',
|
|
70
|
+
}));
|
|
71
|
+
});
|
|
72
|
+
child.on('close', (code, signal) => {
|
|
73
|
+
if (code === 0) {
|
|
74
|
+
resolve();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const reason = signal ? `signal ${signal}` : `exit code ${code}`;
|
|
78
|
+
reject(new WorkspaceCliError(`${command.openerLabel} exited with ${reason}.`, 'workspace_opener_launch_failed', {
|
|
79
|
+
target: 'workspace.opener',
|
|
80
|
+
}));
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=open.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { WorkspaceLocalState, WorkspacePreferredOpener, WorkspaceRegistryEntry, WorkspaceRegistryState, WorkspaceSharedState } from '../../core/workspace/index.js';
|
|
2
|
+
import { SelectedWorkspace, WorkspaceLinkMutationPayload, WorkspaceListOutput, WorkspaceOutput, WorkspaceStatus } from './types.js';
|
|
3
|
+
export declare function readRegistry(): Promise<WorkspaceRegistryState>;
|
|
4
|
+
export declare function directoryExists(dirPath: string): Promise<boolean>;
|
|
5
|
+
export declare function resolveExistingDirectory(inputPath: string, cwd?: string): Promise<string>;
|
|
6
|
+
export declare function inferLinkName(absolutePath: string): string;
|
|
7
|
+
export declare function validateWorkspaceNameForSetup(name: string): string;
|
|
8
|
+
export declare function validateLinkNameForCommand(name: string): string;
|
|
9
|
+
export declare function createManagedWorkspace(name: string, links: Record<string, string>, preferredOpener?: WorkspacePreferredOpener): Promise<WorkspaceOutput>;
|
|
10
|
+
export declare function parseSetupLinks(linkInputs: string[] | undefined): Promise<Record<string, string>>;
|
|
11
|
+
export declare function loadWorkspaceForList(entry: WorkspaceRegistryEntry): Promise<WorkspaceListOutput>;
|
|
12
|
+
export declare function loadWorkspaceForDoctor(selected: SelectedWorkspace): Promise<{
|
|
13
|
+
workspace: WorkspaceOutput;
|
|
14
|
+
status: WorkspaceStatus[];
|
|
15
|
+
}>;
|
|
16
|
+
export declare function readWorkspaceForMutation(selected: SelectedWorkspace): Promise<{
|
|
17
|
+
sharedState: WorkspaceSharedState;
|
|
18
|
+
localState: WorkspaceLocalState;
|
|
19
|
+
}>;
|
|
20
|
+
export declare function recordSelectedWorkspaceAfterMutation(selected: SelectedWorkspace): Promise<void>;
|
|
21
|
+
export declare function addWorkspaceLink(selected: SelectedWorkspace, nameOrPath: string, linkPath?: string): Promise<WorkspaceLinkMutationPayload>;
|
|
22
|
+
export declare function updateWorkspaceLink(selected: SelectedWorkspace, linkNameInput: string, linkPath: string): Promise<WorkspaceLinkMutationPayload>;
|
|
23
|
+
//# sourceMappingURL=operations.d.ts.map
|