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,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
|