@kbdavis07/openspec 1.5.0-nov.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/LICENSE +22 -0
- package/README.md +239 -0
- package/bin/openspec.js +5 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.js +544 -0
- package/dist/commands/change.d.ts +38 -0
- package/dist/commands/change.js +245 -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 +552 -0
- package/dist/commands/context.d.ts +3 -0
- package/dist/commands/context.js +155 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.js +163 -0
- package/dist/commands/feedback.d.ts +9 -0
- package/dist/commands/feedback.js +183 -0
- package/dist/commands/schema.d.ts +6 -0
- package/dist/commands/schema.js +869 -0
- package/dist/commands/shared-gather.d.ts +14 -0
- package/dist/commands/shared-gather.js +31 -0
- package/dist/commands/shared-output.d.ts +18 -0
- package/dist/commands/shared-output.js +61 -0
- package/dist/commands/show.d.ts +19 -0
- package/dist/commands/show.js +177 -0
- package/dist/commands/spec.d.ts +19 -0
- package/dist/commands/spec.js +236 -0
- package/dist/commands/store.d.ts +3 -0
- package/dist/commands/store.js +547 -0
- package/dist/commands/validate.d.ts +34 -0
- package/dist/commands/validate.js +342 -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 +39 -0
- package/dist/commands/workflow/instructions.js +393 -0
- package/dist/commands/workflow/new-change.d.ts +20 -0
- package/dist/commands/workflow/new-change.js +109 -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 +74 -0
- package/dist/commands/workflow/shared.js +170 -0
- package/dist/commands/workflow/status.d.ts +16 -0
- package/dist/commands/workflow/status.js +92 -0
- package/dist/commands/workflow/templates.d.ts +16 -0
- package/dist/commands/workflow/templates.js +69 -0
- package/dist/commands/workset-input.d.ts +19 -0
- package/dist/commands/workset-input.js +112 -0
- package/dist/commands/workset-prompts.d.ts +12 -0
- package/dist/commands/workset-prompts.js +143 -0
- package/dist/commands/workset.d.ts +25 -0
- package/dist/commands/workset.js +446 -0
- package/dist/core/archive.d.ts +22 -0
- package/dist/core/archive.js +496 -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 +9 -0
- package/dist/core/artifact-graph/index.js +14 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +188 -0
- package/dist/core/artifact-graph/instruction-loader.js +233 -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 +40 -0
- package/dist/core/artifact-graph/types.js +29 -0
- package/dist/core/available-tools.d.ts +17 -0
- package/dist/core/available-tools.js +43 -0
- package/dist/core/change-metadata/index.d.ts +2 -0
- package/dist/core/change-metadata/index.js +2 -0
- package/dist/core/change-metadata/schema.d.ts +19 -0
- package/dist/core/change-metadata/schema.js +30 -0
- package/dist/core/change-status-policy.d.ts +37 -0
- package/dist/core/change-status-policy.js +35 -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 +32 -0
- package/dist/core/command-generation/adapters/claude.d.ts +13 -0
- package/dist/core/command-generation/adapters/claude.js +39 -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 +31 -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 +34 -0
- package/dist/core/command-generation/adapters/index.js +34 -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/oh-my-pi.d.ts +21 -0
- package/dist/core/command-generation/adapters/oh-my-pi.js +44 -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 +42 -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/trae.d.ts +13 -0
- package/dist/core/command-generation/adapters/trae.js +48 -0
- package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
- package/dist/core/command-generation/adapters/windsurf.js +38 -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 +102 -0
- package/dist/core/command-generation/types.d.ts +56 -0
- package/dist/core/command-generation/types.js +8 -0
- package/dist/core/command-generation/yaml.d.ts +22 -0
- package/dist/core/command-generation/yaml.js +38 -0
- package/dist/core/completions/command-registry.d.ts +3 -0
- package/dist/core/completions/command-registry.js +759 -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 +276 -0
- package/dist/core/completions/installers/bash-installer.d.ts +87 -0
- package/dist/core/completions/installers/bash-installer.js +321 -0
- package/dist/core/completions/installers/fish-installer.d.ts +43 -0
- package/dist/core/completions/installers/fish-installer.js +151 -0
- package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
- package/dist/core/completions/installers/powershell-installer.js +415 -0
- package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
- package/dist/core/completions/installers/zsh-installer.js +424 -0
- package/dist/core/completions/shared-flags.d.ts +13 -0
- package/dist/core/completions/shared-flags.js +33 -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 +87 -0
- package/dist/core/config-schema.js +239 -0
- package/dist/core/config.d.ts +18 -0
- package/dist/core/config.js +40 -0
- package/dist/core/converters/json-converter.d.ts +6 -0
- package/dist/core/converters/json-converter.js +51 -0
- package/dist/core/file-state.d.ts +36 -0
- package/dist/core/file-state.js +112 -0
- package/dist/core/global-config.d.ts +51 -0
- package/dist/core/global-config.js +124 -0
- package/dist/core/id.d.ts +17 -0
- package/dist/core/id.js +30 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.js +7 -0
- package/dist/core/init.d.ts +37 -0
- package/dist/core/init.js +614 -0
- package/dist/core/legacy-cleanup.d.ts +162 -0
- package/dist/core/legacy-cleanup.js +514 -0
- package/dist/core/list.d.ts +11 -0
- package/dist/core/list.js +214 -0
- package/dist/core/migration.d.ts +23 -0
- package/dist/core/migration.js +108 -0
- package/dist/core/openers.d.ts +77 -0
- package/dist/core/openers.js +251 -0
- package/dist/core/openspec-root.d.ts +45 -0
- package/dist/core/openspec-root.js +195 -0
- package/dist/core/parsers/change-parser.d.ts +13 -0
- package/dist/core/parsers/change-parser.js +198 -0
- package/dist/core/parsers/markdown-parser.d.ts +23 -0
- package/dist/core/parsers/markdown-parser.js +173 -0
- package/dist/core/parsers/requirement-blocks.d.ts +48 -0
- package/dist/core/parsers/requirement-blocks.js +235 -0
- package/dist/core/parsers/requirement-text.d.ts +55 -0
- package/dist/core/parsers/requirement-text.js +136 -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 +16 -0
- package/dist/core/planning-home.js +67 -0
- package/dist/core/profile-sync-drift.d.ts +38 -0
- package/dist/core/profile-sync-drift.js +201 -0
- package/dist/core/profiles.d.ts +26 -0
- package/dist/core/profiles.js +41 -0
- package/dist/core/project-config.d.ts +107 -0
- package/dist/core/project-config.js +373 -0
- package/dist/core/references.d.ts +63 -0
- package/dist/core/references.js +310 -0
- package/dist/core/relationship-health.d.ts +65 -0
- package/dist/core/relationship-health.js +64 -0
- package/dist/core/root-selection.d.ts +122 -0
- package/dist/core/root-selection.js +337 -0
- package/dist/core/schemas/base.schema.d.ts +13 -0
- package/dist/core/schemas/base.schema.js +18 -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/allowed-tools.d.ts +12 -0
- package/dist/core/shared/allowed-tools.js +12 -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 +100 -0
- package/dist/core/shared/tool-detection.d.ts +71 -0
- package/dist/core/shared/tool-detection.js +160 -0
- package/dist/core/specs-apply.d.ts +78 -0
- package/dist/core/specs-apply.js +428 -0
- package/dist/core/store/errors.d.ts +20 -0
- package/dist/core/store/errors.js +22 -0
- package/dist/core/store/foundation.d.ts +56 -0
- package/dist/core/store/foundation.js +251 -0
- package/dist/core/store/git.d.ts +23 -0
- package/dist/core/store/git.js +137 -0
- package/dist/core/store/index.d.ts +5 -0
- package/dist/core/store/index.js +5 -0
- package/dist/core/store/operations.d.ts +114 -0
- package/dist/core/store/operations.js +803 -0
- package/dist/core/store/registry.d.ts +58 -0
- package/dist/core/store/registry.js +275 -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 +20 -0
- package/dist/core/templates/skill-templates.js +19 -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 +315 -0
- package/dist/core/templates/workflows/archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/archive-change.js +278 -0
- package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/bulk-archive-change.js +493 -0
- package/dist/core/templates/workflows/continue-change.d.ts +10 -0
- package/dist/core/templates/workflows/continue-change.js +239 -0
- package/dist/core/templates/workflows/explore.d.ts +10 -0
- package/dist/core/templates/workflows/explore.js +464 -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 +205 -0
- package/dist/core/templates/workflows/new-change.d.ts +10 -0
- package/dist/core/templates/workflows/new-change.js +148 -0
- package/dist/core/templates/workflows/onboard.d.ts +10 -0
- package/dist/core/templates/workflows/onboard.js +566 -0
- package/dist/core/templates/workflows/propose.d.ts +10 -0
- package/dist/core/templates/workflows/propose.js +223 -0
- package/dist/core/templates/workflows/store-selection.d.ts +8 -0
- package/dist/core/templates/workflows/store-selection.js +8 -0
- package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
- package/dist/core/templates/workflows/sync-specs.js +291 -0
- package/dist/core/templates/workflows/update-change.d.ts +10 -0
- package/dist/core/templates/workflows/update-change.js +167 -0
- package/dist/core/templates/workflows/verify-change.d.ts +10 -0
- package/dist/core/templates/workflows/verify-change.js +339 -0
- package/dist/core/update.d.ts +82 -0
- package/dist/core/update.js +557 -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 +51 -0
- package/dist/core/validation/validator.js +498 -0
- package/dist/core/view.d.ts +8 -0
- package/dist/core/view.js +168 -0
- package/dist/core/working-set.d.ts +47 -0
- package/dist/core/working-set.js +43 -0
- package/dist/core/worksets.d.ts +75 -0
- package/dist/core/worksets.js +245 -0
- package/dist/core/zod-issues.d.ts +4 -0
- package/dist/core/zod-issues.js +10 -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 +55 -0
- package/dist/utils/change-metadata.js +141 -0
- package/dist/utils/change-utils.d.ts +85 -0
- package/dist/utils/change-utils.js +173 -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 +320 -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 +17 -0
- package/dist/utils/task-progress.js +100 -0
- package/package.json +85 -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/scripts/postinstall.js +83 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trae Command Adapter
|
|
3
|
+
*
|
|
4
|
+
* Formats commands for Trae IDE following its command specification.
|
|
5
|
+
*/
|
|
6
|
+
import path from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Escapes a string value for safe YAML output.
|
|
9
|
+
* Quotes the string if it contains special YAML characters.
|
|
10
|
+
*/
|
|
11
|
+
function escapeYamlValue(value) {
|
|
12
|
+
if (value === '') {
|
|
13
|
+
return '""';
|
|
14
|
+
}
|
|
15
|
+
// Check if value needs quoting (contains special YAML characters or starts/ends with whitespace)
|
|
16
|
+
const needsQuoting = /[:\n\r#{}[\],&*!|>'"%@`]|^\s|\s$/.test(value);
|
|
17
|
+
if (needsQuoting) {
|
|
18
|
+
// Use double quotes and escape internal double quotes, backslashes, and newlines
|
|
19
|
+
const escaped = value
|
|
20
|
+
.replace(/\\/g, '\\\\')
|
|
21
|
+
.replace(/"/g, '\\"')
|
|
22
|
+
.replace(/\n/g, '\\n')
|
|
23
|
+
.replace(/\r/g, '\\r');
|
|
24
|
+
return `"${escaped}"`;
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Trae adapter for command generation.
|
|
30
|
+
* File path: .trae/commands/opsx-<id>.md
|
|
31
|
+
* Frontmatter: name, description
|
|
32
|
+
*/
|
|
33
|
+
export const traeAdapter = {
|
|
34
|
+
toolId: 'trae',
|
|
35
|
+
getFilePath(commandId) {
|
|
36
|
+
return path.join('.trae', 'commands', `opsx-${commandId}.md`);
|
|
37
|
+
},
|
|
38
|
+
formatFile(content) {
|
|
39
|
+
return `---
|
|
40
|
+
name: ${escapeYamlValue(content.name)}
|
|
41
|
+
description: ${escapeYamlValue(content.description)}
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
${content.body}
|
|
45
|
+
`;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=trae.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windsurf Command Adapter
|
|
3
|
+
*
|
|
4
|
+
* Formats commands for Windsurf following its frontmatter specification.
|
|
5
|
+
* Windsurf uses a similar format to Claude but may have different conventions.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolCommandAdapter } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Windsurf adapter for command generation.
|
|
10
|
+
* File path: .windsurf/workflows/opsx-<id>.md
|
|
11
|
+
* Frontmatter: name, description, category, tags
|
|
12
|
+
*/
|
|
13
|
+
export declare const windsurfAdapter: ToolCommandAdapter;
|
|
14
|
+
//# sourceMappingURL=windsurf.d.ts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windsurf Command Adapter
|
|
3
|
+
*
|
|
4
|
+
* Formats commands for Windsurf following its frontmatter specification.
|
|
5
|
+
* Windsurf uses a similar format to Claude but may have different conventions.
|
|
6
|
+
*/
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { escapeYamlValue } from '../yaml.js';
|
|
9
|
+
/**
|
|
10
|
+
* Formats a tags array as a YAML array with proper escaping.
|
|
11
|
+
*/
|
|
12
|
+
function formatTagsArray(tags) {
|
|
13
|
+
const escapedTags = tags.map((tag) => escapeYamlValue(tag));
|
|
14
|
+
return `[${escapedTags.join(', ')}]`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Windsurf adapter for command generation.
|
|
18
|
+
* File path: .windsurf/workflows/opsx-<id>.md
|
|
19
|
+
* Frontmatter: name, description, category, tags
|
|
20
|
+
*/
|
|
21
|
+
export const windsurfAdapter = {
|
|
22
|
+
toolId: 'windsurf',
|
|
23
|
+
getFilePath(commandId) {
|
|
24
|
+
return path.join('.windsurf', 'workflows', `opsx-${commandId}.md`);
|
|
25
|
+
},
|
|
26
|
+
formatFile(content) {
|
|
27
|
+
return `---
|
|
28
|
+
name: ${escapeYamlValue(content.name)}
|
|
29
|
+
description: ${escapeYamlValue(content.description)}
|
|
30
|
+
category: ${escapeYamlValue(content.category)}
|
|
31
|
+
tags: ${formatTagsArray(content.tags)}
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
${content.body}
|
|
35
|
+
`;
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=windsurf.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Generator
|
|
3
|
+
*
|
|
4
|
+
* Functions for generating command files using tool adapters.
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandContent, ToolCommandAdapter, GeneratedCommand } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate a single command file using the provided adapter.
|
|
9
|
+
* @param content - The tool-agnostic command content
|
|
10
|
+
* @param adapter - The tool-specific adapter
|
|
11
|
+
* @returns Generated command with path and file content
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateCommand(content: CommandContent, adapter: ToolCommandAdapter): GeneratedCommand;
|
|
14
|
+
/**
|
|
15
|
+
* Generate multiple command files using the provided adapter.
|
|
16
|
+
* @param contents - Array of tool-agnostic command contents
|
|
17
|
+
* @param adapter - The tool-specific adapter
|
|
18
|
+
* @returns Array of generated commands with paths and file contents
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateCommands(contents: CommandContent[], adapter: ToolCommandAdapter): GeneratedCommand[];
|
|
21
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Generator
|
|
3
|
+
*
|
|
4
|
+
* Functions for generating command files using tool adapters.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Generate a single command file using the provided adapter.
|
|
8
|
+
* @param content - The tool-agnostic command content
|
|
9
|
+
* @param adapter - The tool-specific adapter
|
|
10
|
+
* @returns Generated command with path and file content
|
|
11
|
+
*/
|
|
12
|
+
export function generateCommand(content, adapter) {
|
|
13
|
+
return {
|
|
14
|
+
path: adapter.getFilePath(content.id),
|
|
15
|
+
fileContent: adapter.formatFile(content),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate multiple command files using the provided adapter.
|
|
20
|
+
* @param contents - Array of tool-agnostic command contents
|
|
21
|
+
* @param adapter - The tool-specific adapter
|
|
22
|
+
* @returns Array of generated commands with paths and file contents
|
|
23
|
+
*/
|
|
24
|
+
export function generateCommands(contents, adapter) {
|
|
25
|
+
return contents.map((content) => generateCommand(content, adapter));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Generation Module
|
|
3
|
+
*
|
|
4
|
+
* Generic command generation system with tool-specific adapters.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { generateCommands, CommandAdapterRegistry, type CommandContent } from './command-generation/index.js';
|
|
9
|
+
*
|
|
10
|
+
* const contents: CommandContent[] = [...];
|
|
11
|
+
* const adapter = CommandAdapterRegistry.get('cursor');
|
|
12
|
+
* if (adapter) {
|
|
13
|
+
* const commands = generateCommands(contents, adapter);
|
|
14
|
+
* // Write commands to disk
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export type { CommandContent, ToolCommandAdapter, GeneratedCommand, } from './types.js';
|
|
19
|
+
export { CommandAdapterRegistry } from './registry.js';
|
|
20
|
+
export { generateCommand, generateCommands } from './generator.js';
|
|
21
|
+
export { claudeAdapter, cursorAdapter, windsurfAdapter } from './adapters/index.js';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Generation Module
|
|
3
|
+
*
|
|
4
|
+
* Generic command generation system with tool-specific adapters.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { generateCommands, CommandAdapterRegistry, type CommandContent } from './command-generation/index.js';
|
|
9
|
+
*
|
|
10
|
+
* const contents: CommandContent[] = [...];
|
|
11
|
+
* const adapter = CommandAdapterRegistry.get('cursor');
|
|
12
|
+
* if (adapter) {
|
|
13
|
+
* const commands = generateCommands(contents, adapter);
|
|
14
|
+
* // Write commands to disk
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
// Registry
|
|
19
|
+
export { CommandAdapterRegistry } from './registry.js';
|
|
20
|
+
// Generator functions
|
|
21
|
+
export { generateCommand, generateCommands } from './generator.js';
|
|
22
|
+
// Adapters (for direct access if needed)
|
|
23
|
+
export { claudeAdapter, cursorAdapter, windsurfAdapter } from './adapters/index.js';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Adapter Registry
|
|
3
|
+
*
|
|
4
|
+
* Centralized registry for tool command adapters.
|
|
5
|
+
* Similar pattern to existing SlashCommandRegistry in the codebase.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolCommandAdapter } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Registry for looking up tool command adapters.
|
|
10
|
+
*/
|
|
11
|
+
export declare class CommandAdapterRegistry {
|
|
12
|
+
private static adapters;
|
|
13
|
+
/**
|
|
14
|
+
* Register a tool command adapter.
|
|
15
|
+
* @param adapter - The adapter to register
|
|
16
|
+
*/
|
|
17
|
+
static register(adapter: ToolCommandAdapter): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get an adapter by tool ID.
|
|
20
|
+
* @param toolId - The tool identifier (e.g., 'claude', 'cursor')
|
|
21
|
+
* @returns The adapter or undefined if not registered
|
|
22
|
+
*/
|
|
23
|
+
static get(toolId: string): ToolCommandAdapter | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Get all registered adapters.
|
|
26
|
+
* @returns Array of all registered adapters
|
|
27
|
+
*/
|
|
28
|
+
static getAll(): ToolCommandAdapter[];
|
|
29
|
+
/**
|
|
30
|
+
* Check if an adapter is registered for a tool.
|
|
31
|
+
* @param toolId - The tool identifier
|
|
32
|
+
* @returns True if an adapter exists
|
|
33
|
+
*/
|
|
34
|
+
static has(toolId: string): boolean;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Adapter Registry
|
|
3
|
+
*
|
|
4
|
+
* Centralized registry for tool command adapters.
|
|
5
|
+
* Similar pattern to existing SlashCommandRegistry in the codebase.
|
|
6
|
+
*/
|
|
7
|
+
import { amazonQAdapter } from './adapters/amazon-q.js';
|
|
8
|
+
import { antigravityAdapter } from './adapters/antigravity.js';
|
|
9
|
+
import { auggieAdapter } from './adapters/auggie.js';
|
|
10
|
+
import { bobAdapter } from './adapters/bob.js';
|
|
11
|
+
import { claudeAdapter } from './adapters/claude.js';
|
|
12
|
+
import { clineAdapter } from './adapters/cline.js';
|
|
13
|
+
import { codexAdapter } from './adapters/codex.js';
|
|
14
|
+
import { codebuddyAdapter } from './adapters/codebuddy.js';
|
|
15
|
+
import { continueAdapter } from './adapters/continue.js';
|
|
16
|
+
import { costrictAdapter } from './adapters/costrict.js';
|
|
17
|
+
import { crushAdapter } from './adapters/crush.js';
|
|
18
|
+
import { cursorAdapter } from './adapters/cursor.js';
|
|
19
|
+
import { factoryAdapter } from './adapters/factory.js';
|
|
20
|
+
import { geminiAdapter } from './adapters/gemini.js';
|
|
21
|
+
import { githubCopilotAdapter } from './adapters/github-copilot.js';
|
|
22
|
+
import { iflowAdapter } from './adapters/iflow.js';
|
|
23
|
+
import { junieAdapter } from './adapters/junie.js';
|
|
24
|
+
import { kilocodeAdapter } from './adapters/kilocode.js';
|
|
25
|
+
import { kiroAdapter } from './adapters/kiro.js';
|
|
26
|
+
import { ohMyPiAdapter } from './adapters/oh-my-pi.js';
|
|
27
|
+
import { opencodeAdapter } from './adapters/opencode.js';
|
|
28
|
+
import { piAdapter } from './adapters/pi.js';
|
|
29
|
+
import { qoderAdapter } from './adapters/qoder.js';
|
|
30
|
+
import { lingmaAdapter } from './adapters/lingma.js';
|
|
31
|
+
import { qwenAdapter } from './adapters/qwen.js';
|
|
32
|
+
import { roocodeAdapter } from './adapters/roocode.js';
|
|
33
|
+
import { traeAdapter } from './adapters/trae.js';
|
|
34
|
+
import { windsurfAdapter } from './adapters/windsurf.js';
|
|
35
|
+
/**
|
|
36
|
+
* Registry for looking up tool command adapters.
|
|
37
|
+
*/
|
|
38
|
+
export class CommandAdapterRegistry {
|
|
39
|
+
static adapters = new Map();
|
|
40
|
+
// Static initializer - register built-in adapters
|
|
41
|
+
static {
|
|
42
|
+
CommandAdapterRegistry.register(amazonQAdapter);
|
|
43
|
+
CommandAdapterRegistry.register(antigravityAdapter);
|
|
44
|
+
CommandAdapterRegistry.register(auggieAdapter);
|
|
45
|
+
CommandAdapterRegistry.register(bobAdapter);
|
|
46
|
+
CommandAdapterRegistry.register(claudeAdapter);
|
|
47
|
+
CommandAdapterRegistry.register(clineAdapter);
|
|
48
|
+
CommandAdapterRegistry.register(codexAdapter);
|
|
49
|
+
CommandAdapterRegistry.register(codebuddyAdapter);
|
|
50
|
+
CommandAdapterRegistry.register(continueAdapter);
|
|
51
|
+
CommandAdapterRegistry.register(costrictAdapter);
|
|
52
|
+
CommandAdapterRegistry.register(crushAdapter);
|
|
53
|
+
CommandAdapterRegistry.register(cursorAdapter);
|
|
54
|
+
CommandAdapterRegistry.register(factoryAdapter);
|
|
55
|
+
CommandAdapterRegistry.register(geminiAdapter);
|
|
56
|
+
CommandAdapterRegistry.register(githubCopilotAdapter);
|
|
57
|
+
CommandAdapterRegistry.register(iflowAdapter);
|
|
58
|
+
CommandAdapterRegistry.register(junieAdapter);
|
|
59
|
+
CommandAdapterRegistry.register(kilocodeAdapter);
|
|
60
|
+
CommandAdapterRegistry.register(kiroAdapter);
|
|
61
|
+
CommandAdapterRegistry.register(ohMyPiAdapter);
|
|
62
|
+
CommandAdapterRegistry.register(opencodeAdapter);
|
|
63
|
+
CommandAdapterRegistry.register(piAdapter);
|
|
64
|
+
CommandAdapterRegistry.register(qoderAdapter);
|
|
65
|
+
CommandAdapterRegistry.register(lingmaAdapter);
|
|
66
|
+
CommandAdapterRegistry.register(qwenAdapter);
|
|
67
|
+
CommandAdapterRegistry.register(roocodeAdapter);
|
|
68
|
+
CommandAdapterRegistry.register(traeAdapter);
|
|
69
|
+
CommandAdapterRegistry.register(windsurfAdapter);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Register a tool command adapter.
|
|
73
|
+
* @param adapter - The adapter to register
|
|
74
|
+
*/
|
|
75
|
+
static register(adapter) {
|
|
76
|
+
CommandAdapterRegistry.adapters.set(adapter.toolId, adapter);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get an adapter by tool ID.
|
|
80
|
+
* @param toolId - The tool identifier (e.g., 'claude', 'cursor')
|
|
81
|
+
* @returns The adapter or undefined if not registered
|
|
82
|
+
*/
|
|
83
|
+
static get(toolId) {
|
|
84
|
+
return CommandAdapterRegistry.adapters.get(toolId);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get all registered adapters.
|
|
88
|
+
* @returns Array of all registered adapters
|
|
89
|
+
*/
|
|
90
|
+
static getAll() {
|
|
91
|
+
return Array.from(CommandAdapterRegistry.adapters.values());
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if an adapter is registered for a tool.
|
|
95
|
+
* @param toolId - The tool identifier
|
|
96
|
+
* @returns True if an adapter exists
|
|
97
|
+
*/
|
|
98
|
+
static has(toolId) {
|
|
99
|
+
return CommandAdapterRegistry.adapters.has(toolId);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Generation Types
|
|
3
|
+
*
|
|
4
|
+
* Tool-agnostic interfaces for command generation.
|
|
5
|
+
* These types separate "what to generate" from "how to format it".
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Tool-agnostic command data.
|
|
9
|
+
* Represents the content of a command without any tool-specific formatting.
|
|
10
|
+
*/
|
|
11
|
+
export interface CommandContent {
|
|
12
|
+
/** Command identifier (e.g., 'explore', 'apply', 'new') */
|
|
13
|
+
id: string;
|
|
14
|
+
/** Human-readable name (e.g., 'OpenSpec Explore') */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Brief description of command purpose */
|
|
17
|
+
description: string;
|
|
18
|
+
/** Grouping category (e.g., 'Workflow') */
|
|
19
|
+
category: string;
|
|
20
|
+
/** Array of tag strings */
|
|
21
|
+
tags: string[];
|
|
22
|
+
/** The command instruction content (body text) */
|
|
23
|
+
body: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Per-tool formatting strategy.
|
|
27
|
+
* Each AI tool implements this interface to handle its specific file path
|
|
28
|
+
* and frontmatter format requirements.
|
|
29
|
+
*/
|
|
30
|
+
export interface ToolCommandAdapter {
|
|
31
|
+
/** Tool identifier matching AIToolOption.value (e.g., 'claude', 'cursor') */
|
|
32
|
+
toolId: string;
|
|
33
|
+
/**
|
|
34
|
+
* Returns the file path for a command.
|
|
35
|
+
* @param commandId - The command identifier (e.g., 'explore')
|
|
36
|
+
* @returns Path from project root (e.g., '.claude/commands/opsx/explore.md').
|
|
37
|
+
* May be absolute for tools with global-scoped prompts (e.g., Codex).
|
|
38
|
+
*/
|
|
39
|
+
getFilePath(commandId: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Formats the complete file content including frontmatter.
|
|
42
|
+
* @param content - The tool-agnostic command content
|
|
43
|
+
* @returns Complete file content ready to write
|
|
44
|
+
*/
|
|
45
|
+
formatFile(content: CommandContent): string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Result of generating a command file.
|
|
49
|
+
*/
|
|
50
|
+
export interface GeneratedCommand {
|
|
51
|
+
/** File path from project root, or absolute for global-scoped tools */
|
|
52
|
+
path: string;
|
|
53
|
+
/** Complete file content (frontmatter + body) */
|
|
54
|
+
fileContent: string;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared YAML frontmatter helpers for command adapters.
|
|
3
|
+
*
|
|
4
|
+
* Several tool adapters emit YAML frontmatter and need to escape
|
|
5
|
+
* user-facing strings (name, description, category, tags) so the
|
|
6
|
+
* generated file stays valid YAML. This module centralizes that logic
|
|
7
|
+
* so the behavior is identical across adapters and fixed in one place.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Escapes a string value for safe YAML output.
|
|
11
|
+
*
|
|
12
|
+
* Quotes the value with double quotes when it contains characters that
|
|
13
|
+
* carry special meaning in YAML (or leading/trailing whitespace), and
|
|
14
|
+
* escapes the characters that are not representable verbatim inside a
|
|
15
|
+
* double-quoted scalar: backslash, double quote, line feed and carriage
|
|
16
|
+
* return. Values without special characters are returned unquoted.
|
|
17
|
+
*
|
|
18
|
+
* @param value - The raw string to embed in YAML frontmatter.
|
|
19
|
+
* @returns The value, double-quoted and escaped when necessary.
|
|
20
|
+
*/
|
|
21
|
+
export declare function escapeYamlValue(value: string): string;
|
|
22
|
+
//# sourceMappingURL=yaml.d.ts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared YAML frontmatter helpers for command adapters.
|
|
3
|
+
*
|
|
4
|
+
* Several tool adapters emit YAML frontmatter and need to escape
|
|
5
|
+
* user-facing strings (name, description, category, tags) so the
|
|
6
|
+
* generated file stays valid YAML. This module centralizes that logic
|
|
7
|
+
* so the behavior is identical across adapters and fixed in one place.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Escapes a string value for safe YAML output.
|
|
11
|
+
*
|
|
12
|
+
* Quotes the value with double quotes when it contains characters that
|
|
13
|
+
* carry special meaning in YAML (or leading/trailing whitespace), and
|
|
14
|
+
* escapes the characters that are not representable verbatim inside a
|
|
15
|
+
* double-quoted scalar: backslash, double quote, line feed and carriage
|
|
16
|
+
* return. Values without special characters are returned unquoted.
|
|
17
|
+
*
|
|
18
|
+
* @param value - The raw string to embed in YAML frontmatter.
|
|
19
|
+
* @returns The value, double-quoted and escaped when necessary.
|
|
20
|
+
*/
|
|
21
|
+
export function escapeYamlValue(value) {
|
|
22
|
+
// Check if value needs quoting (contains special YAML characters or starts/ends with whitespace)
|
|
23
|
+
const needsQuoting = /[:\n\r#{}[\],&*!|>'"%@`]|^\s|\s$/.test(value);
|
|
24
|
+
if (needsQuoting) {
|
|
25
|
+
// Use double quotes and escape characters that are not safe to emit
|
|
26
|
+
// verbatim inside a double-quoted YAML scalar. Carriage returns must be
|
|
27
|
+
// escaped too: a literal CR inside double quotes is subject to YAML line
|
|
28
|
+
// folding/normalization and would silently corrupt the round-tripped value.
|
|
29
|
+
const escaped = value
|
|
30
|
+
.replace(/\\/g, '\\\\')
|
|
31
|
+
.replace(/"/g, '\\"')
|
|
32
|
+
.replace(/\n/g, '\\n')
|
|
33
|
+
.replace(/\r/g, '\\r');
|
|
34
|
+
return `"${escaped}"`;
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=yaml.js.map
|