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,129 @@
1
+ import { getActiveChangeIds, getSpecIds } from '../../utils/item-discovery.js';
2
+ import { listSchemas } from '../artifact-graph/index.js';
3
+ /**
4
+ * Provides dynamic completion suggestions for synarcx items (changes and specs).
5
+ * Implements a 2-second cache to avoid excessive file system operations during
6
+ * tab completion.
7
+ */
8
+ export class CompletionProvider {
9
+ cacheTTLMs;
10
+ projectRoot;
11
+ cacheTTL;
12
+ changeCache = null;
13
+ specCache = null;
14
+ schemaCache = null;
15
+ /**
16
+ * Creates a new completion provider
17
+ *
18
+ * @param cacheTTLMs - Cache time-to-live in milliseconds (default: 2000ms)
19
+ * @param projectRoot - Project root directory (default: process.cwd())
20
+ */
21
+ constructor(cacheTTLMs = 2000, projectRoot = process.cwd()) {
22
+ this.cacheTTLMs = cacheTTLMs;
23
+ this.projectRoot = projectRoot;
24
+ this.cacheTTL = cacheTTLMs;
25
+ }
26
+ /**
27
+ * Get all active change IDs for completion
28
+ *
29
+ * @returns Array of change IDs
30
+ */
31
+ async getChangeIds() {
32
+ const now = Date.now();
33
+ // Check if cache is valid
34
+ if (this.changeCache && now - this.changeCache.timestamp < this.cacheTTL) {
35
+ return this.changeCache.data;
36
+ }
37
+ // Fetch fresh data
38
+ const changeIds = await getActiveChangeIds(this.projectRoot);
39
+ // Update cache
40
+ this.changeCache = {
41
+ data: changeIds,
42
+ timestamp: now,
43
+ };
44
+ return changeIds;
45
+ }
46
+ /**
47
+ * Get all spec IDs for completion
48
+ *
49
+ * @returns Array of spec IDs
50
+ */
51
+ async getSpecIds() {
52
+ const now = Date.now();
53
+ // Check if cache is valid
54
+ if (this.specCache && now - this.specCache.timestamp < this.cacheTTL) {
55
+ return this.specCache.data;
56
+ }
57
+ // Fetch fresh data
58
+ const specIds = await getSpecIds(this.projectRoot);
59
+ // Update cache
60
+ this.specCache = {
61
+ data: specIds,
62
+ timestamp: now,
63
+ };
64
+ return specIds;
65
+ }
66
+ /**
67
+ * Get all schema names for completion
68
+ *
69
+ * @returns Array of schema names
70
+ */
71
+ async getSchemaNames() {
72
+ const now = Date.now();
73
+ // Check if cache is valid
74
+ if (this.schemaCache && now - this.schemaCache.timestamp < this.cacheTTL) {
75
+ return this.schemaCache.data;
76
+ }
77
+ // Fetch fresh data
78
+ const schemaNames = listSchemas(this.projectRoot);
79
+ // Update cache
80
+ this.schemaCache = {
81
+ data: schemaNames,
82
+ timestamp: now,
83
+ };
84
+ return schemaNames;
85
+ }
86
+ /**
87
+ * Get both change and spec IDs for completion
88
+ *
89
+ * @returns Object with changeIds and specIds arrays
90
+ */
91
+ async getAllIds() {
92
+ const [changeIds, specIds] = await Promise.all([
93
+ this.getChangeIds(),
94
+ this.getSpecIds(),
95
+ ]);
96
+ return { changeIds, specIds };
97
+ }
98
+ /**
99
+ * Clear all cached data
100
+ */
101
+ clearCache() {
102
+ this.changeCache = null;
103
+ this.specCache = null;
104
+ this.schemaCache = null;
105
+ }
106
+ /**
107
+ * Get cache statistics for debugging
108
+ *
109
+ * @returns Cache status information
110
+ */
111
+ getCacheStats() {
112
+ const now = Date.now();
113
+ return {
114
+ changeCache: {
115
+ valid: this.changeCache !== null && now - this.changeCache.timestamp < this.cacheTTL,
116
+ age: this.changeCache ? now - this.changeCache.timestamp : undefined,
117
+ },
118
+ specCache: {
119
+ valid: this.specCache !== null && now - this.specCache.timestamp < this.cacheTTL,
120
+ age: this.specCache ? now - this.specCache.timestamp : undefined,
121
+ },
122
+ schemaCache: {
123
+ valid: this.schemaCache !== null && now - this.schemaCache.timestamp < this.cacheTTL,
124
+ age: this.schemaCache ? now - this.schemaCache.timestamp : undefined,
125
+ },
126
+ };
127
+ }
128
+ }
129
+ //# sourceMappingURL=completion-provider.js.map
@@ -0,0 +1,64 @@
1
+ import { CompletionGenerator } from './types.js';
2
+ import { SupportedShell } from '../../utils/shell-detection.js';
3
+ /**
4
+ * Common installation result interface
5
+ */
6
+ export interface InstallationResult {
7
+ success: boolean;
8
+ installedPath?: string;
9
+ backupPath?: string;
10
+ message: string;
11
+ instructions?: string[];
12
+ warnings?: string[];
13
+ isOhMyZsh?: boolean;
14
+ zshrcConfigured?: boolean;
15
+ bashrcConfigured?: boolean;
16
+ profileConfigured?: boolean;
17
+ }
18
+ /**
19
+ * Interface for completion installers
20
+ */
21
+ export interface CompletionInstaller {
22
+ install(script: string): Promise<InstallationResult>;
23
+ uninstall(): Promise<{
24
+ success: boolean;
25
+ message: string;
26
+ }>;
27
+ }
28
+ /**
29
+ * Factory for creating completion generators and installers
30
+ * This design makes it easy to add support for additional shells
31
+ */
32
+ export declare class CompletionFactory {
33
+ private static readonly SUPPORTED_SHELLS;
34
+ /**
35
+ * Create a completion generator for the specified shell
36
+ *
37
+ * @param shell - The target shell
38
+ * @returns CompletionGenerator instance
39
+ * @throws Error if shell is not supported
40
+ */
41
+ static createGenerator(shell: SupportedShell): CompletionGenerator;
42
+ /**
43
+ * Create a completion installer for the specified shell
44
+ *
45
+ * @param shell - The target shell
46
+ * @returns CompletionInstaller instance
47
+ * @throws Error if shell is not supported
48
+ */
49
+ static createInstaller(shell: SupportedShell): CompletionInstaller;
50
+ /**
51
+ * Check if a shell is supported
52
+ *
53
+ * @param shell - The shell to check
54
+ * @returns true if the shell is supported
55
+ */
56
+ static isSupported(shell: string): shell is SupportedShell;
57
+ /**
58
+ * Get list of all supported shells
59
+ *
60
+ * @returns Array of supported shell names
61
+ */
62
+ static getSupportedShells(): SupportedShell[];
63
+ }
64
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1,75 @@
1
+ import { ZshGenerator } from './generators/zsh-generator.js';
2
+ import { BashGenerator } from './generators/bash-generator.js';
3
+ import { FishGenerator } from './generators/fish-generator.js';
4
+ import { PowerShellGenerator } from './generators/powershell-generator.js';
5
+ import { ZshInstaller } from './installers/zsh-installer.js';
6
+ import { BashInstaller } from './installers/bash-installer.js';
7
+ import { FishInstaller } from './installers/fish-installer.js';
8
+ import { PowerShellInstaller } from './installers/powershell-installer.js';
9
+ /**
10
+ * Factory for creating completion generators and installers
11
+ * This design makes it easy to add support for additional shells
12
+ */
13
+ export class CompletionFactory {
14
+ static SUPPORTED_SHELLS = ['zsh', 'bash', 'fish', 'powershell'];
15
+ /**
16
+ * Create a completion generator for the specified shell
17
+ *
18
+ * @param shell - The target shell
19
+ * @returns CompletionGenerator instance
20
+ * @throws Error if shell is not supported
21
+ */
22
+ static createGenerator(shell) {
23
+ switch (shell) {
24
+ case 'zsh':
25
+ return new ZshGenerator();
26
+ case 'bash':
27
+ return new BashGenerator();
28
+ case 'fish':
29
+ return new FishGenerator();
30
+ case 'powershell':
31
+ return new PowerShellGenerator();
32
+ default:
33
+ throw new Error(`Unsupported shell: ${shell}`);
34
+ }
35
+ }
36
+ /**
37
+ * Create a completion installer for the specified shell
38
+ *
39
+ * @param shell - The target shell
40
+ * @returns CompletionInstaller instance
41
+ * @throws Error if shell is not supported
42
+ */
43
+ static createInstaller(shell) {
44
+ switch (shell) {
45
+ case 'zsh':
46
+ return new ZshInstaller();
47
+ case 'bash':
48
+ return new BashInstaller();
49
+ case 'fish':
50
+ return new FishInstaller();
51
+ case 'powershell':
52
+ return new PowerShellInstaller();
53
+ default:
54
+ throw new Error(`Unsupported shell: ${shell}`);
55
+ }
56
+ }
57
+ /**
58
+ * Check if a shell is supported
59
+ *
60
+ * @param shell - The shell to check
61
+ * @returns true if the shell is supported
62
+ */
63
+ static isSupported(shell) {
64
+ return this.SUPPORTED_SHELLS.includes(shell);
65
+ }
66
+ /**
67
+ * Get list of all supported shells
68
+ *
69
+ * @returns Array of supported shell names
70
+ */
71
+ static getSupportedShells() {
72
+ return [...this.SUPPORTED_SHELLS];
73
+ }
74
+ }
75
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1,35 @@
1
+ import { CompletionGenerator, CommandDefinition } from '../types.js';
2
+ /**
3
+ * Generates Bash completion scripts for the synarcx CLI.
4
+ * Follows Bash completion conventions using complete builtin and COMPREPLY array.
5
+ */
6
+ export declare class BashGenerator implements CompletionGenerator {
7
+ readonly shell: "bash";
8
+ /**
9
+ * Generate a Bash completion script
10
+ *
11
+ * @param commands - Command definitions to generate completions for
12
+ * @returns Bash completion script as a string
13
+ */
14
+ generate(commands: CommandDefinition[]): string;
15
+ /**
16
+ * Generate completion case logic for a command
17
+ */
18
+ private generateCommandCase;
19
+ /**
20
+ * Generate argument completion (flags and positional arguments)
21
+ */
22
+ private generateArgumentCompletion;
23
+ /**
24
+ * Generate positional argument completion based on type
25
+ */
26
+ private generatePositionalCompletion;
27
+ private generateIndexedPositionalCompletion;
28
+ private generateValueFlagCases;
29
+ private generateIndexedPositionalCase;
30
+ /**
31
+ * Escape command/subcommand names for safe use in Bash scripts
32
+ */
33
+ private escapeCommandName;
34
+ }
35
+ //# sourceMappingURL=bash-generator.d.ts.map
@@ -0,0 +1,230 @@
1
+ import { BASH_DYNAMIC_HELPERS } from '../templates/bash-templates.js';
2
+ /**
3
+ * Generates Bash completion scripts for the synarcx CLI.
4
+ * Follows Bash completion conventions using complete builtin and COMPREPLY array.
5
+ */
6
+ export class BashGenerator {
7
+ shell = 'bash';
8
+ /**
9
+ * Generate a Bash completion script
10
+ *
11
+ * @param commands - Command definitions to generate completions for
12
+ * @returns Bash completion script as a string
13
+ */
14
+ generate(commands) {
15
+ // Build command list for top-level completions
16
+ const commandList = commands.map(c => this.escapeCommandName(c.name)).join(' ');
17
+ // Build command cases using push() for loop clarity
18
+ const caseLines = [];
19
+ for (const cmd of commands) {
20
+ caseLines.push(` ${cmd.name})`);
21
+ caseLines.push(...this.generateCommandCase(cmd, ' '));
22
+ caseLines.push(' ;;');
23
+ }
24
+ const commandCases = caseLines.join('\n');
25
+ // Dynamic completion helpers from template
26
+ const helpers = BASH_DYNAMIC_HELPERS;
27
+ // Assemble final script with template literal
28
+ return `# Bash completion script for synarcx CLI
29
+ # Auto-generated - do not edit manually
30
+
31
+ _synarcx_completion() {
32
+ local cur prev words cword
33
+
34
+ # Use _init_completion if available (from bash-completion package)
35
+ # The -n : option prevents colons from being treated as word separators
36
+ # (important for spec/change IDs that may contain colons)
37
+ # Otherwise, fall back to manual initialization
38
+ if declare -F _init_completion >/dev/null 2>&1; then
39
+ _init_completion -n : || return
40
+ else
41
+ # Manual fallback when bash-completion is not installed
42
+ COMPREPLY=()
43
+ cur="\${COMP_WORDS[COMP_CWORD]}"
44
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
45
+ words=("\${COMP_WORDS[@]}")
46
+ cword=$COMP_CWORD
47
+ fi
48
+
49
+ local cmd="\${words[1]}"
50
+ local subcmd="\${words[2]}"
51
+
52
+ # Top-level commands
53
+ if [[ $cword -eq 1 ]]; then
54
+ local commands="${commandList}"
55
+ COMPREPLY=($(compgen -W "$commands" -- "$cur"))
56
+ return 0
57
+ fi
58
+
59
+ # Command-specific completion
60
+ case "$cmd" in
61
+ ${commandCases}
62
+ esac
63
+
64
+ return 0
65
+ }
66
+
67
+ ${helpers}
68
+ complete -F _synarcx_completion synarcx
69
+ `;
70
+ }
71
+ /**
72
+ * Generate completion case logic for a command
73
+ */
74
+ generateCommandCase(cmd, indent) {
75
+ const lines = [];
76
+ // Handle subcommands
77
+ if (cmd.subcommands && cmd.subcommands.length > 0) {
78
+ // First, check if user is typing a flag for the parent command
79
+ if (cmd.flags.length > 0) {
80
+ lines.push(`${indent}if [[ "$cur" == -* ]]; then`);
81
+ const flags = cmd.flags.map(f => {
82
+ const parts = [];
83
+ if (f.short)
84
+ parts.push(`-${f.short}`);
85
+ parts.push(`--${f.name}`);
86
+ return parts.join(' ');
87
+ }).join(' ');
88
+ lines.push(`${indent} local flags="${flags}"`);
89
+ lines.push(`${indent} COMPREPLY=($(compgen -W "$flags" -- "$cur"))`);
90
+ lines.push(`${indent} return 0`);
91
+ lines.push(`${indent}fi`);
92
+ lines.push('');
93
+ }
94
+ lines.push(`${indent}if [[ $cword -eq 2 ]]; then`);
95
+ lines.push(`${indent} local subcommands="` + cmd.subcommands.map(s => this.escapeCommandName(s.name)).join(' ') + '"');
96
+ lines.push(`${indent} COMPREPLY=($(compgen -W "$subcommands" -- "$cur"))`);
97
+ lines.push(`${indent} return 0`);
98
+ lines.push(`${indent}fi`);
99
+ lines.push('');
100
+ lines.push(`${indent}case "$subcmd" in`);
101
+ for (const subcmd of cmd.subcommands) {
102
+ lines.push(`${indent} ${subcmd.name})`);
103
+ lines.push(...this.generateArgumentCompletion(subcmd, indent + ' ', 3));
104
+ lines.push(`${indent} ;;`);
105
+ }
106
+ lines.push(`${indent}esac`);
107
+ }
108
+ else {
109
+ // No subcommands, just complete arguments
110
+ lines.push(...this.generateArgumentCompletion(cmd, indent, 2));
111
+ }
112
+ return lines;
113
+ }
114
+ /**
115
+ * Generate argument completion (flags and positional arguments)
116
+ */
117
+ generateArgumentCompletion(cmd, indent, firstPositionalWordIndex) {
118
+ const lines = [];
119
+ // Check for flag completion
120
+ if (cmd.flags.length > 0) {
121
+ lines.push(`${indent}if [[ "$cur" == -* ]]; then`);
122
+ const flags = cmd.flags.map(f => {
123
+ const parts = [];
124
+ if (f.short)
125
+ parts.push(`-${f.short}`);
126
+ parts.push(`--${f.name}`);
127
+ return parts.join(' ');
128
+ }).join(' ');
129
+ lines.push(`${indent} local flags="${flags}"`);
130
+ lines.push(`${indent} COMPREPLY=($(compgen -W "$flags" -- "$cur"))`);
131
+ lines.push(`${indent} return 0`);
132
+ lines.push(`${indent}fi`);
133
+ lines.push('');
134
+ }
135
+ // Handle positional completions
136
+ if (cmd.positionals && cmd.positionals.length > 0) {
137
+ lines.push(...this.generateIndexedPositionalCompletion(cmd.positionals, cmd.flags, firstPositionalWordIndex, indent));
138
+ }
139
+ else if (cmd.acceptsPositional) {
140
+ lines.push(...this.generatePositionalCompletion(cmd.positionalType, indent));
141
+ }
142
+ return lines;
143
+ }
144
+ /**
145
+ * Generate positional argument completion based on type
146
+ */
147
+ generatePositionalCompletion(positionalType, indent) {
148
+ const lines = [];
149
+ switch (positionalType) {
150
+ case 'change-id':
151
+ lines.push(`${indent}_synarcx_complete_changes`);
152
+ break;
153
+ case 'spec-id':
154
+ lines.push(`${indent}_synarcx_complete_specs`);
155
+ break;
156
+ case 'change-or-spec-id':
157
+ lines.push(`${indent}_synarcx_complete_items`);
158
+ break;
159
+ case 'schema-name':
160
+ lines.push(`${indent}_synarcx_complete_schemas`);
161
+ break;
162
+ case 'shell':
163
+ lines.push(`${indent}local shells="zsh bash fish powershell"`);
164
+ lines.push(`${indent}COMPREPLY=($(compgen -W "$shells" -- "$cur"))`);
165
+ break;
166
+ case 'path':
167
+ lines.push(`${indent}COMPREPLY=($(compgen -f -- "$cur"))`);
168
+ break;
169
+ }
170
+ return lines;
171
+ }
172
+ generateIndexedPositionalCompletion(positionals, flags, firstPositionalWordIndex, indent) {
173
+ const lines = [];
174
+ const valueFlagCases = this.generateValueFlagCases(flags);
175
+ if (valueFlagCases.length > 0) {
176
+ lines.push(`${indent}case "$prev" in`);
177
+ lines.push(`${indent} ${valueFlagCases.join('|')}) return 0 ;;`);
178
+ lines.push(`${indent}esac`);
179
+ lines.push('');
180
+ }
181
+ lines.push(`${indent}local positional_index=0`);
182
+ lines.push(`${indent}local skip_next=0`);
183
+ lines.push(`${indent}local i`);
184
+ lines.push(`${indent}for ((i = ${firstPositionalWordIndex}; i < cword; i++)); do`);
185
+ lines.push(`${indent} if [[ $skip_next -eq 1 ]]; then`);
186
+ lines.push(`${indent} skip_next=0`);
187
+ lines.push(`${indent} continue`);
188
+ lines.push(`${indent} fi`);
189
+ lines.push(`${indent} case "\${words[i]}" in`);
190
+ if (valueFlagCases.length > 0) {
191
+ lines.push(`${indent} ${valueFlagCases.join('|')}) skip_next=1 ;;`);
192
+ lines.push(`${indent} ${valueFlagCases.map((flag) => `${flag}=*`).join('|')}) ;;`);
193
+ }
194
+ lines.push(`${indent} -*) ;;`);
195
+ lines.push(`${indent} *) ((positional_index++)) ;;`);
196
+ lines.push(`${indent} esac`);
197
+ lines.push(`${indent}done`);
198
+ lines.push('');
199
+ lines.push(`${indent}case "$positional_index" in`);
200
+ for (const [index, positional] of positionals.entries()) {
201
+ const completion = this.generateIndexedPositionalCase(positional, indent + ' ');
202
+ if (completion.length === 0)
203
+ continue;
204
+ lines.push(`${indent} ${index})`);
205
+ lines.push(...completion);
206
+ lines.push(`${indent} ;;`);
207
+ }
208
+ lines.push(`${indent}esac`);
209
+ return lines;
210
+ }
211
+ generateValueFlagCases(flags) {
212
+ return flags
213
+ .filter((flag) => flag.takesValue)
214
+ .flatMap((flag) => [
215
+ `--${flag.name}`,
216
+ ...(flag.short ? [`-${flag.short}`] : []),
217
+ ]);
218
+ }
219
+ generateIndexedPositionalCase(positional, indent) {
220
+ return this.generatePositionalCompletion(positional.type, indent);
221
+ }
222
+ /**
223
+ * Escape command/subcommand names for safe use in Bash scripts
224
+ */
225
+ escapeCommandName(name) {
226
+ // Escape shell metacharacters to prevent command injection
227
+ return name.replace(/["\$`\\]/g, '\\$&');
228
+ }
229
+ }
230
+ //# sourceMappingURL=bash-generator.js.map
@@ -0,0 +1,32 @@
1
+ import { CompletionGenerator, CommandDefinition } from '../types.js';
2
+ /**
3
+ * Generates Fish completion scripts for the synarcx CLI.
4
+ * Follows Fish completion conventions using the complete command.
5
+ */
6
+ export declare class FishGenerator implements CompletionGenerator {
7
+ readonly 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: CommandDefinition[]): string;
15
+ /**
16
+ * Generate completions for a specific command
17
+ */
18
+ private generateCommandCompletions;
19
+ /**
20
+ * Generate flag completion
21
+ */
22
+ private generateFlagCompletion;
23
+ /**
24
+ * Generate positional argument completion
25
+ */
26
+ private generatePositionalCompletion;
27
+ /**
28
+ * Escape description text for Fish
29
+ */
30
+ private escapeDescription;
31
+ }
32
+ //# sourceMappingURL=fish-generator.d.ts.map