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.
Files changed (288) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +90 -0
  3. package/bin/synarcx.js +3 -0
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.js +474 -0
  6. package/dist/commands/change.d.ts +35 -0
  7. package/dist/commands/change.js +278 -0
  8. package/dist/commands/completion.d.ts +72 -0
  9. package/dist/commands/completion.js +264 -0
  10. package/dist/commands/config.d.ts +36 -0
  11. package/dist/commands/config.js +552 -0
  12. package/dist/commands/feedback.d.ts +9 -0
  13. package/dist/commands/feedback.js +170 -0
  14. package/dist/commands/schema.d.ts +6 -0
  15. package/dist/commands/schema.js +870 -0
  16. package/dist/commands/show.d.ts +14 -0
  17. package/dist/commands/show.js +132 -0
  18. package/dist/commands/spec.d.ts +15 -0
  19. package/dist/commands/spec.js +226 -0
  20. package/dist/commands/validate.d.ts +24 -0
  21. package/dist/commands/validate.js +295 -0
  22. package/dist/commands/workflow/index.d.ts +17 -0
  23. package/dist/commands/workflow/index.js +12 -0
  24. package/dist/commands/workflow/instructions.d.ts +29 -0
  25. package/dist/commands/workflow/instructions.js +327 -0
  26. package/dist/commands/workflow/new-change.d.ts +11 -0
  27. package/dist/commands/workflow/new-change.js +45 -0
  28. package/dist/commands/workflow/schemas.d.ts +10 -0
  29. package/dist/commands/workflow/schemas.js +34 -0
  30. package/dist/commands/workflow/shared.d.ts +57 -0
  31. package/dist/commands/workflow/shared.js +117 -0
  32. package/dist/commands/workflow/status.d.ts +14 -0
  33. package/dist/commands/workflow/status.js +75 -0
  34. package/dist/commands/workflow/templates.d.ts +16 -0
  35. package/dist/commands/workflow/templates.js +69 -0
  36. package/dist/commands/workspace/open.d.ts +29 -0
  37. package/dist/commands/workspace/open.js +84 -0
  38. package/dist/commands/workspace/operations.d.ts +18 -0
  39. package/dist/commands/workspace/operations.js +461 -0
  40. package/dist/commands/workspace/selection.d.ts +5 -0
  41. package/dist/commands/workspace/selection.js +90 -0
  42. package/dist/commands/workspace/types.d.ts +83 -0
  43. package/dist/commands/workspace/types.js +36 -0
  44. package/dist/commands/workspace.d.ts +3 -0
  45. package/dist/commands/workspace.js +635 -0
  46. package/dist/core/archive.d.ts +11 -0
  47. package/dist/core/archive.js +319 -0
  48. package/dist/core/artifact-graph/graph.d.ts +56 -0
  49. package/dist/core/artifact-graph/graph.js +141 -0
  50. package/dist/core/artifact-graph/index.d.ts +8 -0
  51. package/dist/core/artifact-graph/index.js +14 -0
  52. package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
  53. package/dist/core/artifact-graph/instruction-loader.js +217 -0
  54. package/dist/core/artifact-graph/outputs.d.ts +14 -0
  55. package/dist/core/artifact-graph/outputs.js +39 -0
  56. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  57. package/dist/core/artifact-graph/resolver.js +258 -0
  58. package/dist/core/artifact-graph/schema.d.ts +13 -0
  59. package/dist/core/artifact-graph/schema.js +108 -0
  60. package/dist/core/artifact-graph/state.d.ts +12 -0
  61. package/dist/core/artifact-graph/state.js +31 -0
  62. package/dist/core/artifact-graph/types.d.ts +45 -0
  63. package/dist/core/artifact-graph/types.js +43 -0
  64. package/dist/core/available-tools.d.ts +17 -0
  65. package/dist/core/available-tools.js +43 -0
  66. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  67. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  68. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  69. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  70. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  71. package/dist/core/command-generation/adapters/auggie.js +27 -0
  72. package/dist/core/command-generation/adapters/bob.d.ts +14 -0
  73. package/dist/core/command-generation/adapters/bob.js +45 -0
  74. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  75. package/dist/core/command-generation/adapters/claude.js +50 -0
  76. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  77. package/dist/core/command-generation/adapters/cline.js +27 -0
  78. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  79. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  80. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  81. package/dist/core/command-generation/adapters/codex.js +39 -0
  82. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  83. package/dist/core/command-generation/adapters/continue.js +28 -0
  84. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  85. package/dist/core/command-generation/adapters/costrict.js +27 -0
  86. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  87. package/dist/core/command-generation/adapters/crush.js +30 -0
  88. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  89. package/dist/core/command-generation/adapters/cursor.js +44 -0
  90. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  91. package/dist/core/command-generation/adapters/factory.js +27 -0
  92. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  93. package/dist/core/command-generation/adapters/gemini.js +26 -0
  94. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  95. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  96. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  97. package/dist/core/command-generation/adapters/iflow.js +29 -0
  98. package/dist/core/command-generation/adapters/index.d.ts +32 -0
  99. package/dist/core/command-generation/adapters/index.js +32 -0
  100. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  101. package/dist/core/command-generation/adapters/junie.js +26 -0
  102. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  103. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  104. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  105. package/dist/core/command-generation/adapters/kiro.js +26 -0
  106. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  107. package/dist/core/command-generation/adapters/lingma.js +30 -0
  108. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  109. package/dist/core/command-generation/adapters/opencode.js +27 -0
  110. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  111. package/dist/core/command-generation/adapters/pi.js +55 -0
  112. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/qoder.js +30 -0
  114. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  115. package/dist/core/command-generation/adapters/qwen.js +26 -0
  116. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  117. package/dist/core/command-generation/adapters/roocode.js +27 -0
  118. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  119. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  120. package/dist/core/command-generation/generator.d.ts +21 -0
  121. package/dist/core/command-generation/generator.js +27 -0
  122. package/dist/core/command-generation/index.d.ts +22 -0
  123. package/dist/core/command-generation/index.js +24 -0
  124. package/dist/core/command-generation/registry.d.ts +36 -0
  125. package/dist/core/command-generation/registry.js +98 -0
  126. package/dist/core/command-generation/types.d.ts +56 -0
  127. package/dist/core/command-generation/types.js +8 -0
  128. package/dist/core/completions/command-registry.d.ts +7 -0
  129. package/dist/core/completions/command-registry.js +596 -0
  130. package/dist/core/completions/completion-provider.d.ts +71 -0
  131. package/dist/core/completions/completion-provider.js +129 -0
  132. package/dist/core/completions/factory.d.ts +64 -0
  133. package/dist/core/completions/factory.js +75 -0
  134. package/dist/core/completions/generators/bash-generator.d.ts +35 -0
  135. package/dist/core/completions/generators/bash-generator.js +230 -0
  136. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  137. package/dist/core/completions/generators/fish-generator.js +160 -0
  138. package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
  139. package/dist/core/completions/generators/powershell-generator.js +266 -0
  140. package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
  141. package/dist/core/completions/generators/zsh-generator.js +274 -0
  142. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  143. package/dist/core/completions/installers/bash-installer.js +318 -0
  144. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  145. package/dist/core/completions/installers/fish-installer.js +143 -0
  146. package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
  147. package/dist/core/completions/installers/powershell-installer.js +387 -0
  148. package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
  149. package/dist/core/completions/installers/zsh-installer.js +421 -0
  150. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  151. package/dist/core/completions/templates/bash-templates.js +30 -0
  152. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  153. package/dist/core/completions/templates/fish-templates.js +45 -0
  154. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  155. package/dist/core/completions/templates/powershell-templates.js +34 -0
  156. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  157. package/dist/core/completions/templates/zsh-templates.js +45 -0
  158. package/dist/core/completions/types.d.ts +101 -0
  159. package/dist/core/completions/types.js +2 -0
  160. package/dist/core/config-prompts.d.ts +9 -0
  161. package/dist/core/config-prompts.js +34 -0
  162. package/dist/core/config-schema.d.ts +86 -0
  163. package/dist/core/config-schema.js +213 -0
  164. package/dist/core/config.d.ts +19 -0
  165. package/dist/core/config.js +38 -0
  166. package/dist/core/converters/json-converter.d.ts +6 -0
  167. package/dist/core/converters/json-converter.js +51 -0
  168. package/dist/core/global-config.d.ts +49 -0
  169. package/dist/core/global-config.js +124 -0
  170. package/dist/core/index.d.ts +3 -0
  171. package/dist/core/index.js +4 -0
  172. package/dist/core/init.d.ts +37 -0
  173. package/dist/core/init.js +585 -0
  174. package/dist/core/legacy-cleanup.d.ts +169 -0
  175. package/dist/core/legacy-cleanup.js +578 -0
  176. package/dist/core/list.d.ts +9 -0
  177. package/dist/core/list.js +172 -0
  178. package/dist/core/migration.d.ts +23 -0
  179. package/dist/core/migration.js +108 -0
  180. package/dist/core/parsers/change-parser.d.ts +13 -0
  181. package/dist/core/parsers/change-parser.js +197 -0
  182. package/dist/core/parsers/markdown-parser.d.ts +26 -0
  183. package/dist/core/parsers/markdown-parser.js +227 -0
  184. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  185. package/dist/core/parsers/requirement-blocks.js +201 -0
  186. package/dist/core/parsers/spec-structure.d.ts +9 -0
  187. package/dist/core/parsers/spec-structure.js +88 -0
  188. package/dist/core/profile-sync-drift.d.ts +38 -0
  189. package/dist/core/profile-sync-drift.js +197 -0
  190. package/dist/core/profiles.d.ts +26 -0
  191. package/dist/core/profiles.js +37 -0
  192. package/dist/core/project-config.d.ts +64 -0
  193. package/dist/core/project-config.js +224 -0
  194. package/dist/core/schemas/base.schema.d.ts +13 -0
  195. package/dist/core/schemas/base.schema.js +13 -0
  196. package/dist/core/schemas/change.schema.d.ts +73 -0
  197. package/dist/core/schemas/change.schema.js +31 -0
  198. package/dist/core/schemas/index.d.ts +4 -0
  199. package/dist/core/schemas/index.js +4 -0
  200. package/dist/core/schemas/spec.schema.d.ts +18 -0
  201. package/dist/core/schemas/spec.schema.js +15 -0
  202. package/dist/core/shared/index.d.ts +8 -0
  203. package/dist/core/shared/index.js +8 -0
  204. package/dist/core/shared/skill-generation.d.ts +49 -0
  205. package/dist/core/shared/skill-generation.js +90 -0
  206. package/dist/core/shared/tool-detection.d.ts +71 -0
  207. package/dist/core/shared/tool-detection.js +152 -0
  208. package/dist/core/specs-apply.d.ts +73 -0
  209. package/dist/core/specs-apply.js +393 -0
  210. package/dist/core/styles/palette.d.ts +7 -0
  211. package/dist/core/styles/palette.js +8 -0
  212. package/dist/core/templates/index.d.ts +8 -0
  213. package/dist/core/templates/index.js +9 -0
  214. package/dist/core/templates/skill-templates.d.ts +15 -0
  215. package/dist/core/templates/skill-templates.js +14 -0
  216. package/dist/core/templates/types.d.ts +19 -0
  217. package/dist/core/templates/types.js +5 -0
  218. package/dist/core/templates/workflows/analyze.d.ts +4 -0
  219. package/dist/core/templates/workflows/analyze.js +101 -0
  220. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  221. package/dist/core/templates/workflows/apply-change.js +308 -0
  222. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  223. package/dist/core/templates/workflows/archive-change.js +271 -0
  224. package/dist/core/templates/workflows/clarify.d.ts +4 -0
  225. package/dist/core/templates/workflows/clarify.js +108 -0
  226. package/dist/core/templates/workflows/debug.d.ts +4 -0
  227. package/dist/core/templates/workflows/debug.js +117 -0
  228. package/dist/core/templates/workflows/explore.d.ts +10 -0
  229. package/dist/core/templates/workflows/explore.js +479 -0
  230. package/dist/core/templates/workflows/propose.d.ts +10 -0
  231. package/dist/core/templates/workflows/propose.js +216 -0
  232. package/dist/core/templates/workflows/sync.d.ts +4 -0
  233. package/dist/core/templates/workflows/sync.js +108 -0
  234. package/dist/core/update.d.ts +82 -0
  235. package/dist/core/update.js +555 -0
  236. package/dist/core/validation/constants.d.ts +34 -0
  237. package/dist/core/validation/constants.js +40 -0
  238. package/dist/core/validation/types.d.ts +18 -0
  239. package/dist/core/validation/types.js +2 -0
  240. package/dist/core/validation/validator.d.ts +33 -0
  241. package/dist/core/validation/validator.js +418 -0
  242. package/dist/core/view.d.ts +8 -0
  243. package/dist/core/view.js +169 -0
  244. package/dist/core/workspace/foundation.d.ts +79 -0
  245. package/dist/core/workspace/foundation.js +367 -0
  246. package/dist/core/workspace/index.d.ts +5 -0
  247. package/dist/core/workspace/index.js +5 -0
  248. package/dist/core/workspace/link-input.d.ts +9 -0
  249. package/dist/core/workspace/link-input.js +32 -0
  250. package/dist/core/workspace/open-surface.d.ts +24 -0
  251. package/dist/core/workspace/open-surface.js +137 -0
  252. package/dist/core/workspace/openers.d.ts +21 -0
  253. package/dist/core/workspace/openers.js +119 -0
  254. package/dist/index.d.ts +3 -0
  255. package/dist/index.js +3 -0
  256. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  257. package/dist/prompts/searchable-multi-select.js +159 -0
  258. package/dist/ui/ascii-patterns.d.ts +25 -0
  259. package/dist/ui/ascii-patterns.js +140 -0
  260. package/dist/ui/welcome-screen.d.ts +10 -0
  261. package/dist/ui/welcome-screen.js +144 -0
  262. package/dist/utils/change-metadata.d.ts +51 -0
  263. package/dist/utils/change-metadata.js +147 -0
  264. package/dist/utils/change-utils.d.ts +62 -0
  265. package/dist/utils/change-utils.js +122 -0
  266. package/dist/utils/command-references.d.ts +18 -0
  267. package/dist/utils/command-references.js +20 -0
  268. package/dist/utils/file-system.d.ts +41 -0
  269. package/dist/utils/file-system.js +301 -0
  270. package/dist/utils/index.d.ts +6 -0
  271. package/dist/utils/index.js +9 -0
  272. package/dist/utils/interactive.d.ts +18 -0
  273. package/dist/utils/interactive.js +21 -0
  274. package/dist/utils/item-discovery.d.ts +4 -0
  275. package/dist/utils/item-discovery.js +73 -0
  276. package/dist/utils/match.d.ts +3 -0
  277. package/dist/utils/match.js +22 -0
  278. package/dist/utils/shell-detection.d.ts +20 -0
  279. package/dist/utils/shell-detection.js +41 -0
  280. package/dist/utils/task-progress.d.ts +8 -0
  281. package/dist/utils/task-progress.js +36 -0
  282. package/package.json +76 -0
  283. package/schemas/synarcx/schema.yaml +153 -0
  284. package/schemas/synarcx/templates/design.md +19 -0
  285. package/schemas/synarcx/templates/proposal.md +23 -0
  286. package/schemas/synarcx/templates/spec.md +8 -0
  287. package/schemas/synarcx/templates/tasks.md +9 -0
  288. 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