synarcx 0.1.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 +23 -0
- package/README.md +90 -0
- package/bin/synarcx.js +3 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +474 -0
- package/dist/commands/change.d.ts +35 -0
- package/dist/commands/change.js +278 -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/feedback.d.ts +9 -0
- package/dist/commands/feedback.js +170 -0
- package/dist/commands/schema.d.ts +6 -0
- package/dist/commands/schema.js +870 -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 +226 -0
- package/dist/commands/validate.d.ts +24 -0
- package/dist/commands/validate.js +295 -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 +327 -0
- package/dist/commands/workflow/new-change.d.ts +11 -0
- package/dist/commands/workflow/new-change.js +45 -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 +117 -0
- package/dist/commands/workflow/status.d.ts +14 -0
- package/dist/commands/workflow/status.js +75 -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 +18 -0
- package/dist/commands/workspace/operations.js +461 -0
- package/dist/commands/workspace/selection.d.ts +5 -0
- package/dist/commands/workspace/selection.js +90 -0
- package/dist/commands/workspace/types.d.ts +83 -0
- package/dist/commands/workspace/types.js +36 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.js +635 -0
- package/dist/core/archive.d.ts +11 -0
- package/dist/core/archive.js +319 -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 +143 -0
- package/dist/core/artifact-graph/instruction-loader.js +217 -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 +258 -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 +45 -0
- package/dist/core/artifact-graph/types.js +43 -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 +27 -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 +596 -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 +19 -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 +3 -0
- package/dist/core/index.js +4 -0
- package/dist/core/init.d.ts +37 -0
- package/dist/core/init.js +585 -0
- package/dist/core/legacy-cleanup.d.ts +169 -0
- package/dist/core/legacy-cleanup.js +578 -0
- package/dist/core/list.d.ts +9 -0
- package/dist/core/list.js +172 -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/profile-sync-drift.d.ts +38 -0
- package/dist/core/profile-sync-drift.js +197 -0
- package/dist/core/profiles.d.ts +26 -0
- package/dist/core/profiles.js +37 -0
- package/dist/core/project-config.d.ts +64 -0
- package/dist/core/project-config.js +224 -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 +90 -0
- package/dist/core/shared/tool-detection.d.ts +71 -0
- package/dist/core/shared/tool-detection.js +152 -0
- package/dist/core/specs-apply.d.ts +73 -0
- package/dist/core/specs-apply.js +393 -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 +15 -0
- package/dist/core/templates/skill-templates.js +14 -0
- package/dist/core/templates/types.d.ts +19 -0
- package/dist/core/templates/types.js +5 -0
- package/dist/core/templates/workflows/analyze.d.ts +4 -0
- package/dist/core/templates/workflows/analyze.js +101 -0
- package/dist/core/templates/workflows/apply-change.d.ts +10 -0
- package/dist/core/templates/workflows/apply-change.js +308 -0
- package/dist/core/templates/workflows/archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/archive-change.js +271 -0
- package/dist/core/templates/workflows/clarify.d.ts +4 -0
- package/dist/core/templates/workflows/clarify.js +108 -0
- package/dist/core/templates/workflows/debug.d.ts +4 -0
- package/dist/core/templates/workflows/debug.js +117 -0
- package/dist/core/templates/workflows/explore.d.ts +10 -0
- package/dist/core/templates/workflows/explore.js +479 -0
- package/dist/core/templates/workflows/propose.d.ts +10 -0
- package/dist/core/templates/workflows/propose.js +216 -0
- package/dist/core/templates/workflows/sync.d.ts +4 -0
- package/dist/core/templates/workflows/sync.js +108 -0
- package/dist/core/update.d.ts +82 -0
- package/dist/core/update.js +555 -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 +169 -0
- package/dist/core/workspace/foundation.d.ts +79 -0
- package/dist/core/workspace/foundation.js +367 -0
- package/dist/core/workspace/index.d.ts +5 -0
- package/dist/core/workspace/index.js +5 -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/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/ui/ascii-patterns.d.ts +25 -0
- package/dist/ui/ascii-patterns.js +140 -0
- package/dist/ui/welcome-screen.d.ts +10 -0
- package/dist/ui/welcome-screen.js +144 -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 +62 -0
- package/dist/utils/change-utils.js +122 -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 +73 -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 +76 -0
- package/schemas/synarcx/schema.yaml +153 -0
- package/schemas/synarcx/templates/design.md +19 -0
- package/schemas/synarcx/templates/proposal.md +23 -0
- package/schemas/synarcx/templates/spec.md +8 -0
- package/schemas/synarcx/templates/tasks.md +9 -0
- package/scripts/postinstall.js +83 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { FISH_STATIC_HELPERS, FISH_DYNAMIC_HELPERS } from '../templates/fish-templates.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates Fish completion scripts for the synarcx CLI.
|
|
4
|
+
* Follows Fish completion conventions using the complete command.
|
|
5
|
+
*/
|
|
6
|
+
export class FishGenerator {
|
|
7
|
+
shell = 'fish';
|
|
8
|
+
/**
|
|
9
|
+
* Generate a Fish completion script
|
|
10
|
+
*
|
|
11
|
+
* @param commands - Command definitions to generate completions for
|
|
12
|
+
* @returns Fish completion script as a string
|
|
13
|
+
*/
|
|
14
|
+
generate(commands) {
|
|
15
|
+
// Build top-level commands using push() for loop clarity
|
|
16
|
+
const topLevelLines = [];
|
|
17
|
+
for (const cmd of commands) {
|
|
18
|
+
topLevelLines.push(`# ${cmd.name} command`);
|
|
19
|
+
topLevelLines.push(`complete -c synarcx -n '__fish_synarcx_no_subcommand' -a '${cmd.name}' -d '${this.escapeDescription(cmd.description)}'`);
|
|
20
|
+
}
|
|
21
|
+
const topLevelCommands = topLevelLines.join('\n');
|
|
22
|
+
// Build command-specific completions using push() for loop clarity
|
|
23
|
+
const commandCompletionLines = [];
|
|
24
|
+
for (const cmd of commands) {
|
|
25
|
+
commandCompletionLines.push(...this.generateCommandCompletions(cmd));
|
|
26
|
+
commandCompletionLines.push('');
|
|
27
|
+
}
|
|
28
|
+
const commandCompletions = commandCompletionLines.join('\n');
|
|
29
|
+
// Static helper functions from template
|
|
30
|
+
const helperFunctions = FISH_STATIC_HELPERS;
|
|
31
|
+
// Dynamic completion helpers from template
|
|
32
|
+
const dynamicHelpers = FISH_DYNAMIC_HELPERS;
|
|
33
|
+
// Assemble final script with template literal
|
|
34
|
+
return `# Fish completion script for synarcx CLI
|
|
35
|
+
# Auto-generated - do not edit manually
|
|
36
|
+
|
|
37
|
+
${helperFunctions}
|
|
38
|
+
${dynamicHelpers}
|
|
39
|
+
${topLevelCommands}
|
|
40
|
+
|
|
41
|
+
${commandCompletions}`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Generate completions for a specific command
|
|
45
|
+
*/
|
|
46
|
+
generateCommandCompletions(cmd) {
|
|
47
|
+
const lines = [];
|
|
48
|
+
// If command has subcommands
|
|
49
|
+
if (cmd.subcommands && cmd.subcommands.length > 0) {
|
|
50
|
+
// Add subcommand completions
|
|
51
|
+
for (const subcmd of cmd.subcommands) {
|
|
52
|
+
lines.push(`complete -c synarcx -n '__fish_synarcx_using_subcommand ${cmd.name}; and not __fish_synarcx_using_subcommand ${subcmd.name}' -a '${subcmd.name}' -d '${this.escapeDescription(subcmd.description)}'`);
|
|
53
|
+
}
|
|
54
|
+
lines.push('');
|
|
55
|
+
// Add flags for parent command
|
|
56
|
+
for (const flag of cmd.flags) {
|
|
57
|
+
lines.push(...this.generateFlagCompletion(flag, `__fish_synarcx_using_subcommand ${cmd.name}`));
|
|
58
|
+
}
|
|
59
|
+
// Add completions for each subcommand
|
|
60
|
+
for (const subcmd of cmd.subcommands) {
|
|
61
|
+
lines.push(`# ${cmd.name} ${subcmd.name} flags`);
|
|
62
|
+
for (const flag of subcmd.flags) {
|
|
63
|
+
lines.push(...this.generateFlagCompletion(flag, `__fish_synarcx_using_subcommand ${cmd.name}; and __fish_synarcx_using_subcommand ${subcmd.name}`));
|
|
64
|
+
}
|
|
65
|
+
// Add positional completions for subcommand
|
|
66
|
+
if (subcmd.acceptsPositional) {
|
|
67
|
+
lines.push(...this.generatePositionalCompletion(subcmd.positionalType, `__fish_synarcx_using_subcommand ${cmd.name}; and __fish_synarcx_using_subcommand ${subcmd.name}`));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Command without subcommands
|
|
73
|
+
lines.push(`# ${cmd.name} flags`);
|
|
74
|
+
for (const flag of cmd.flags) {
|
|
75
|
+
lines.push(...this.generateFlagCompletion(flag, `__fish_synarcx_using_subcommand ${cmd.name}`));
|
|
76
|
+
}
|
|
77
|
+
// Add positional completions
|
|
78
|
+
if (cmd.acceptsPositional) {
|
|
79
|
+
lines.push(...this.generatePositionalCompletion(cmd.positionalType, `__fish_synarcx_using_subcommand ${cmd.name}`));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return lines;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Generate flag completion
|
|
86
|
+
*/
|
|
87
|
+
generateFlagCompletion(flag, condition) {
|
|
88
|
+
const lines = [];
|
|
89
|
+
const longFlag = `--${flag.name}`;
|
|
90
|
+
const shortFlag = flag.short ? `-${flag.short}` : undefined;
|
|
91
|
+
if (flag.takesValue && flag.values) {
|
|
92
|
+
// Flag with enum values
|
|
93
|
+
for (const value of flag.values) {
|
|
94
|
+
if (shortFlag) {
|
|
95
|
+
lines.push(`complete -c synarcx -n '${condition}' -s ${flag.short} -l ${flag.name} -a '${value}' -d '${this.escapeDescription(flag.description)}'`);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
lines.push(`complete -c synarcx -n '${condition}' -l ${flag.name} -a '${value}' -d '${this.escapeDescription(flag.description)}'`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (flag.takesValue) {
|
|
103
|
+
// Flag that takes a value but no specific values defined
|
|
104
|
+
if (shortFlag) {
|
|
105
|
+
lines.push(`complete -c synarcx -n '${condition}' -s ${flag.short} -l ${flag.name} -r -d '${this.escapeDescription(flag.description)}'`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
lines.push(`complete -c synarcx -n '${condition}' -l ${flag.name} -r -d '${this.escapeDescription(flag.description)}'`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// Boolean flag
|
|
113
|
+
if (shortFlag) {
|
|
114
|
+
lines.push(`complete -c synarcx -n '${condition}' -s ${flag.short} -l ${flag.name} -d '${this.escapeDescription(flag.description)}'`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
lines.push(`complete -c synarcx -n '${condition}' -l ${flag.name} -d '${this.escapeDescription(flag.description)}'`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return lines;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Generate positional argument completion
|
|
124
|
+
*/
|
|
125
|
+
generatePositionalCompletion(positionalType, condition) {
|
|
126
|
+
const lines = [];
|
|
127
|
+
switch (positionalType) {
|
|
128
|
+
case 'change-id':
|
|
129
|
+
lines.push(`complete -c synarcx -n '${condition}' -a '(__fish_synarcx_changes)' -f`);
|
|
130
|
+
break;
|
|
131
|
+
case 'spec-id':
|
|
132
|
+
lines.push(`complete -c synarcx -n '${condition}' -a '(__fish_synarcx_specs)' -f`);
|
|
133
|
+
break;
|
|
134
|
+
case 'change-or-spec-id':
|
|
135
|
+
lines.push(`complete -c synarcx -n '${condition}' -a '(__fish_synarcx_items)' -f`);
|
|
136
|
+
break;
|
|
137
|
+
case 'schema-name':
|
|
138
|
+
lines.push(`complete -c synarcx -n '${condition}' -a '(__fish_synarcx_schemas)' -f`);
|
|
139
|
+
break;
|
|
140
|
+
case 'shell':
|
|
141
|
+
lines.push(`complete -c synarcx -n '${condition}' -a 'zsh bash fish powershell' -f`);
|
|
142
|
+
break;
|
|
143
|
+
case 'path':
|
|
144
|
+
// Fish automatically completes files, no need to specify
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
return lines;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Escape description text for Fish
|
|
151
|
+
*/
|
|
152
|
+
escapeDescription(description) {
|
|
153
|
+
return description
|
|
154
|
+
.replace(/\\/g, '\\\\') // Backslashes first
|
|
155
|
+
.replace(/'/g, "\\'") // Single quotes
|
|
156
|
+
.replace(/\$/g, '\\$') // Dollar signs (prevents $())
|
|
157
|
+
.replace(/`/g, '\\`'); // Backticks
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=fish-generator.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { CompletionGenerator, CommandDefinition } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates PowerShell completion scripts for the synarcx CLI.
|
|
4
|
+
* Uses Register-ArgumentCompleter for command completion.
|
|
5
|
+
*/
|
|
6
|
+
export declare class PowerShellGenerator implements CompletionGenerator {
|
|
7
|
+
readonly shell: "powershell";
|
|
8
|
+
private stripTrailingCommaFromLastLine;
|
|
9
|
+
/**
|
|
10
|
+
* Generate a PowerShell completion script
|
|
11
|
+
*
|
|
12
|
+
* @param commands - Command definitions to generate completions for
|
|
13
|
+
* @returns PowerShell completion script as a string
|
|
14
|
+
*/
|
|
15
|
+
generate(commands: CommandDefinition[]): string;
|
|
16
|
+
/**
|
|
17
|
+
* Generate completion case for a command
|
|
18
|
+
*/
|
|
19
|
+
private generateCommandCase;
|
|
20
|
+
/**
|
|
21
|
+
* Generate argument completion (flags and positional)
|
|
22
|
+
*/
|
|
23
|
+
private generateArgumentCompletion;
|
|
24
|
+
private generateIndexedPositionalCompletion;
|
|
25
|
+
private generateValueFlags;
|
|
26
|
+
private escapeRegex;
|
|
27
|
+
/**
|
|
28
|
+
* Generate positional argument completion
|
|
29
|
+
*/
|
|
30
|
+
private generatePositionalCompletion;
|
|
31
|
+
/**
|
|
32
|
+
* Escape description text for PowerShell
|
|
33
|
+
*/
|
|
34
|
+
private escapeDescription;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=powershell-generator.d.ts.map
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { POWERSHELL_DYNAMIC_HELPERS } from '../templates/powershell-templates.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates PowerShell completion scripts for the synarcx CLI.
|
|
4
|
+
* Uses Register-ArgumentCompleter for command completion.
|
|
5
|
+
*/
|
|
6
|
+
export class PowerShellGenerator {
|
|
7
|
+
shell = 'powershell';
|
|
8
|
+
stripTrailingCommaFromLastLine(lines) {
|
|
9
|
+
if (lines.length === 0)
|
|
10
|
+
return;
|
|
11
|
+
lines[lines.length - 1] = lines[lines.length - 1].replace(/,\s*$/, '');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate a PowerShell completion script
|
|
15
|
+
*
|
|
16
|
+
* @param commands - Command definitions to generate completions for
|
|
17
|
+
* @returns PowerShell completion script as a string
|
|
18
|
+
*/
|
|
19
|
+
generate(commands) {
|
|
20
|
+
// Build top-level commands using push() for loop clarity
|
|
21
|
+
const commandLines = [];
|
|
22
|
+
for (const cmd of commands) {
|
|
23
|
+
commandLines.push(` @{Name="${cmd.name}"; Description="${this.escapeDescription(cmd.description)}"},`);
|
|
24
|
+
}
|
|
25
|
+
this.stripTrailingCommaFromLastLine(commandLines);
|
|
26
|
+
const topLevelCommands = commandLines.join('\n');
|
|
27
|
+
// Build command cases using push() for loop clarity
|
|
28
|
+
const commandCaseLines = [];
|
|
29
|
+
for (const cmd of commands) {
|
|
30
|
+
commandCaseLines.push(` "${cmd.name}" {`);
|
|
31
|
+
commandCaseLines.push(...this.generateCommandCase(cmd, ' '));
|
|
32
|
+
commandCaseLines.push(' }');
|
|
33
|
+
}
|
|
34
|
+
const commandCases = commandCaseLines.join('\n');
|
|
35
|
+
// Dynamic completion helpers from template
|
|
36
|
+
const helpers = POWERSHELL_DYNAMIC_HELPERS;
|
|
37
|
+
// Assemble final script with template literal
|
|
38
|
+
return `# PowerShell completion script for synarcx CLI
|
|
39
|
+
# Auto-generated - do not edit manually
|
|
40
|
+
|
|
41
|
+
${helpers}
|
|
42
|
+
$synarcxCompleter = {
|
|
43
|
+
param($wordToComplete, $commandAst, $cursorPosition)
|
|
44
|
+
|
|
45
|
+
$tokens = $commandAst.ToString() -split "\\s+"
|
|
46
|
+
$commandCount = ($tokens | Measure-Object).Count
|
|
47
|
+
|
|
48
|
+
# Top-level commands
|
|
49
|
+
if ($commandCount -eq 1 -or ($commandCount -eq 2 -and $wordToComplete)) {
|
|
50
|
+
$commands = @(
|
|
51
|
+
${topLevelCommands}
|
|
52
|
+
)
|
|
53
|
+
$commands | Where-Object { $_.Name -like "$wordToComplete*" } | ForEach-Object {
|
|
54
|
+
[System.Management.Automation.CompletionResult]::new($_.Name, $_.Name, "ParameterValue", $_.Description)
|
|
55
|
+
}
|
|
56
|
+
return
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
$command = $tokens[1]
|
|
60
|
+
|
|
61
|
+
switch ($command) {
|
|
62
|
+
${commandCases}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
Register-ArgumentCompleter -CommandName synarcx -ScriptBlock $synarcxCompleter
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Generate completion case for a command
|
|
71
|
+
*/
|
|
72
|
+
generateCommandCase(cmd, indent) {
|
|
73
|
+
const lines = [];
|
|
74
|
+
if (cmd.subcommands && cmd.subcommands.length > 0) {
|
|
75
|
+
// First, check if user is typing a flag for the parent command
|
|
76
|
+
if (cmd.flags.length > 0) {
|
|
77
|
+
lines.push(`${indent}if ($wordToComplete -like "-*") {`);
|
|
78
|
+
lines.push(`${indent} $flags = @(`);
|
|
79
|
+
for (const flag of cmd.flags) {
|
|
80
|
+
const longFlag = `--${flag.name}`;
|
|
81
|
+
const shortFlag = flag.short ? `-${flag.short}` : undefined;
|
|
82
|
+
if (shortFlag) {
|
|
83
|
+
lines.push(`${indent} @{Name="${longFlag}"; Description="${this.escapeDescription(flag.description)}"},`);
|
|
84
|
+
lines.push(`${indent} @{Name="${shortFlag}"; Description="${this.escapeDescription(flag.description)}"},`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
lines.push(`${indent} @{Name="${longFlag}"; Description="${this.escapeDescription(flag.description)}"},`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
this.stripTrailingCommaFromLastLine(lines);
|
|
91
|
+
lines.push(`${indent} )`);
|
|
92
|
+
lines.push(`${indent} $flags | Where-Object { $_.Name -like "$wordToComplete*" } | ForEach-Object {`);
|
|
93
|
+
lines.push(`${indent} [System.Management.Automation.CompletionResult]::new($_.Name, $_.Name, "ParameterName", $_.Description)`);
|
|
94
|
+
lines.push(`${indent} }`);
|
|
95
|
+
lines.push(`${indent} return`);
|
|
96
|
+
lines.push(`${indent}}`);
|
|
97
|
+
lines.push('');
|
|
98
|
+
}
|
|
99
|
+
// Handle subcommands
|
|
100
|
+
lines.push(`${indent}if ($commandCount -eq 2 -or ($commandCount -eq 3 -and $wordToComplete)) {`);
|
|
101
|
+
lines.push(`${indent} $subcommands = @(`);
|
|
102
|
+
for (const subcmd of cmd.subcommands) {
|
|
103
|
+
lines.push(`${indent} @{Name="${subcmd.name}"; Description="${this.escapeDescription(subcmd.description)}"},`);
|
|
104
|
+
}
|
|
105
|
+
this.stripTrailingCommaFromLastLine(lines);
|
|
106
|
+
lines.push(`${indent} )`);
|
|
107
|
+
lines.push(`${indent} $subcommands | Where-Object { $_.Name -like "$wordToComplete*" } | ForEach-Object {`);
|
|
108
|
+
lines.push(`${indent} [System.Management.Automation.CompletionResult]::new($_.Name, $_.Name, "ParameterValue", $_.Description)`);
|
|
109
|
+
lines.push(`${indent} }`);
|
|
110
|
+
lines.push(`${indent} return`);
|
|
111
|
+
lines.push(`${indent}}`);
|
|
112
|
+
lines.push('');
|
|
113
|
+
lines.push(`${indent}$subcommand = if ($commandCount -gt 2) { $tokens[2] } else { "" }`);
|
|
114
|
+
lines.push(`${indent}switch ($subcommand) {`);
|
|
115
|
+
for (const subcmd of cmd.subcommands) {
|
|
116
|
+
lines.push(`${indent} "${subcmd.name}" {`);
|
|
117
|
+
lines.push(...this.generateArgumentCompletion(subcmd, indent + ' ', 3));
|
|
118
|
+
lines.push(`${indent} }`);
|
|
119
|
+
}
|
|
120
|
+
lines.push(`${indent}}`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// No subcommands
|
|
124
|
+
lines.push(...this.generateArgumentCompletion(cmd, indent, 2));
|
|
125
|
+
}
|
|
126
|
+
return lines;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Generate argument completion (flags and positional)
|
|
130
|
+
*/
|
|
131
|
+
generateArgumentCompletion(cmd, indent, firstPositionalTokenIndex) {
|
|
132
|
+
const lines = [];
|
|
133
|
+
// Flag completion
|
|
134
|
+
if (cmd.flags.length > 0) {
|
|
135
|
+
lines.push(`${indent}if ($wordToComplete -like "-*") {`);
|
|
136
|
+
lines.push(`${indent} $flags = @(`);
|
|
137
|
+
for (const flag of cmd.flags) {
|
|
138
|
+
const longFlag = `--${flag.name}`;
|
|
139
|
+
const shortFlag = flag.short ? `-${flag.short}` : undefined;
|
|
140
|
+
if (shortFlag) {
|
|
141
|
+
lines.push(`${indent} @{Name="${longFlag}"; Description="${this.escapeDescription(flag.description)}"},`);
|
|
142
|
+
lines.push(`${indent} @{Name="${shortFlag}"; Description="${this.escapeDescription(flag.description)}"},`);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
lines.push(`${indent} @{Name="${longFlag}"; Description="${this.escapeDescription(flag.description)}"},`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
this.stripTrailingCommaFromLastLine(lines);
|
|
149
|
+
lines.push(`${indent} )`);
|
|
150
|
+
lines.push(`${indent} $flags | Where-Object { $_.Name -like "$wordToComplete*" } | ForEach-Object {`);
|
|
151
|
+
lines.push(`${indent} [System.Management.Automation.CompletionResult]::new($_.Name, $_.Name, "ParameterName", $_.Description)`);
|
|
152
|
+
lines.push(`${indent} }`);
|
|
153
|
+
lines.push(`${indent} return`);
|
|
154
|
+
lines.push(`${indent}}`);
|
|
155
|
+
lines.push('');
|
|
156
|
+
}
|
|
157
|
+
// Positional completion
|
|
158
|
+
if (cmd.positionals && cmd.positionals.length > 0) {
|
|
159
|
+
lines.push(...this.generateIndexedPositionalCompletion(cmd.positionals, cmd.flags, firstPositionalTokenIndex, indent));
|
|
160
|
+
}
|
|
161
|
+
else if (cmd.acceptsPositional) {
|
|
162
|
+
lines.push(...this.generatePositionalCompletion(cmd.positionalType, indent));
|
|
163
|
+
}
|
|
164
|
+
return lines;
|
|
165
|
+
}
|
|
166
|
+
generateIndexedPositionalCompletion(positionals, flags, firstPositionalTokenIndex, indent) {
|
|
167
|
+
const lines = [];
|
|
168
|
+
const valueFlags = this.generateValueFlags(flags);
|
|
169
|
+
if (valueFlags.length > 0) {
|
|
170
|
+
const flagList = valueFlags.map((flag) => `"${flag}"`).join(', ');
|
|
171
|
+
lines.push(`${indent}if (@(${flagList}) -contains $tokens[$commandCount - 2]) { return }`);
|
|
172
|
+
lines.push('');
|
|
173
|
+
}
|
|
174
|
+
lines.push(`${indent}$positionalIndex = 0`);
|
|
175
|
+
lines.push(`${indent}$skipNext = $false`);
|
|
176
|
+
lines.push(`${indent}for ($i = ${firstPositionalTokenIndex}; $i -lt ($commandCount - 1); $i++) {`);
|
|
177
|
+
lines.push(`${indent} if ($skipNext) {`);
|
|
178
|
+
lines.push(`${indent} $skipNext = $false`);
|
|
179
|
+
lines.push(`${indent} continue`);
|
|
180
|
+
lines.push(`${indent} }`);
|
|
181
|
+
lines.push(`${indent} $token = $tokens[$i]`);
|
|
182
|
+
if (valueFlags.length > 0) {
|
|
183
|
+
const flagList = valueFlags.map((flag) => `"${flag}"`).join(', ');
|
|
184
|
+
lines.push(`${indent} if (@(${flagList}) -contains $token) {`);
|
|
185
|
+
lines.push(`${indent} $skipNext = $true`);
|
|
186
|
+
lines.push(`${indent} continue`);
|
|
187
|
+
lines.push(`${indent} }`);
|
|
188
|
+
lines.push(`${indent} if ($token -match "^(${valueFlags.map((flag) => this.escapeRegex(flag)).join('|')})=.*") { continue }`);
|
|
189
|
+
}
|
|
190
|
+
lines.push(`${indent} if ($token -like "-*") { continue }`);
|
|
191
|
+
lines.push(`${indent} $positionalIndex++`);
|
|
192
|
+
lines.push(`${indent}}`);
|
|
193
|
+
lines.push('');
|
|
194
|
+
lines.push(`${indent}switch ($positionalIndex) {`);
|
|
195
|
+
for (const [index, positional] of positionals.entries()) {
|
|
196
|
+
const completion = this.generatePositionalCompletion(positional.type, indent + ' ');
|
|
197
|
+
if (completion.length === 0)
|
|
198
|
+
continue;
|
|
199
|
+
lines.push(`${indent} ${index} {`);
|
|
200
|
+
lines.push(...completion);
|
|
201
|
+
lines.push(`${indent} }`);
|
|
202
|
+
}
|
|
203
|
+
lines.push(`${indent}}`);
|
|
204
|
+
return lines;
|
|
205
|
+
}
|
|
206
|
+
generateValueFlags(flags) {
|
|
207
|
+
return flags
|
|
208
|
+
.filter((flag) => flag.takesValue)
|
|
209
|
+
.flatMap((flag) => [
|
|
210
|
+
`--${flag.name}`,
|
|
211
|
+
...(flag.short ? [`-${flag.short}`] : []),
|
|
212
|
+
]);
|
|
213
|
+
}
|
|
214
|
+
escapeRegex(value) {
|
|
215
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Generate positional argument completion
|
|
219
|
+
*/
|
|
220
|
+
generatePositionalCompletion(positionalType, indent) {
|
|
221
|
+
const lines = [];
|
|
222
|
+
switch (positionalType) {
|
|
223
|
+
case 'change-id':
|
|
224
|
+
lines.push(`${indent}Get-SynarcxChanges | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {`);
|
|
225
|
+
lines.push(`${indent} [System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", "Change: $_")`);
|
|
226
|
+
lines.push(`${indent}}`);
|
|
227
|
+
break;
|
|
228
|
+
case 'spec-id':
|
|
229
|
+
lines.push(`${indent}Get-SynarcxSpecs | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {`);
|
|
230
|
+
lines.push(`${indent} [System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", "Spec: $_")`);
|
|
231
|
+
lines.push(`${indent}}`);
|
|
232
|
+
break;
|
|
233
|
+
case 'change-or-spec-id':
|
|
234
|
+
lines.push(`${indent}$items = @(Get-SynarcxChanges) + @(Get-SynarcxSpecs)`);
|
|
235
|
+
lines.push(`${indent}$items | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {`);
|
|
236
|
+
lines.push(`${indent} [System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)`);
|
|
237
|
+
lines.push(`${indent}}`);
|
|
238
|
+
break;
|
|
239
|
+
case 'schema-name':
|
|
240
|
+
lines.push(`${indent}Get-SynarcxSchemas | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {`);
|
|
241
|
+
lines.push(`${indent} [System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", "Schema: $_")`);
|
|
242
|
+
lines.push(`${indent}}`);
|
|
243
|
+
break;
|
|
244
|
+
case 'shell':
|
|
245
|
+
lines.push(`${indent}$shells = @("zsh", "bash", "fish", "powershell")`);
|
|
246
|
+
lines.push(`${indent}$shells | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {`);
|
|
247
|
+
lines.push(`${indent} [System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", "Shell: $_")`);
|
|
248
|
+
lines.push(`${indent}}`);
|
|
249
|
+
break;
|
|
250
|
+
case 'path':
|
|
251
|
+
// PowerShell handles file path completion automatically
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
return lines;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Escape description text for PowerShell
|
|
258
|
+
*/
|
|
259
|
+
escapeDescription(description) {
|
|
260
|
+
return description
|
|
261
|
+
.replace(/`/g, '``') // Backticks (escape sequences)
|
|
262
|
+
.replace(/\$/g, '`$') // Dollar signs (prevents $())
|
|
263
|
+
.replace(/"/g, '""'); // Double quotes
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=powershell-generator.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { CompletionGenerator, CommandDefinition } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates Zsh completion scripts for the synarcx CLI.
|
|
4
|
+
* Follows Zsh completion system conventions using the _synarcx function.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ZshGenerator implements CompletionGenerator {
|
|
7
|
+
readonly shell: "zsh";
|
|
8
|
+
/**
|
|
9
|
+
* Generate a Zsh completion script
|
|
10
|
+
*
|
|
11
|
+
* @param commands - Command definitions to generate completions for
|
|
12
|
+
* @returns Zsh completion script as a string
|
|
13
|
+
*/
|
|
14
|
+
generate(commands: CommandDefinition[]): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generate completion function for a specific command
|
|
17
|
+
*/
|
|
18
|
+
private generateCommandFunction;
|
|
19
|
+
/**
|
|
20
|
+
* Generate completion function for a subcommand
|
|
21
|
+
*/
|
|
22
|
+
private generateSubcommandFunction;
|
|
23
|
+
/**
|
|
24
|
+
* Generate flag specification for _arguments
|
|
25
|
+
*/
|
|
26
|
+
private generateFlagSpec;
|
|
27
|
+
/**
|
|
28
|
+
* Generate positional argument specification
|
|
29
|
+
*/
|
|
30
|
+
private generatePositionalSpec;
|
|
31
|
+
private appendPositionalSpecs;
|
|
32
|
+
private generatePositionalSpecs;
|
|
33
|
+
private generateIndexedPositionalSpec;
|
|
34
|
+
/**
|
|
35
|
+
* Escape special characters in descriptions
|
|
36
|
+
*/
|
|
37
|
+
private escapeDescription;
|
|
38
|
+
/**
|
|
39
|
+
* Escape special characters in values
|
|
40
|
+
*/
|
|
41
|
+
private escapeValue;
|
|
42
|
+
/**
|
|
43
|
+
* Sanitize command names for use in function names
|
|
44
|
+
*/
|
|
45
|
+
private sanitizeFunctionName;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=zsh-generator.d.ts.map
|