@openweave/weave-skills 1.0.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/dist/config-loader.d.ts +52 -0
  4. package/dist/config-loader.d.ts.map +1 -0
  5. package/dist/config-loader.js +123 -0
  6. package/dist/config-loader.js.map +1 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +14 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/skill-registry.d.ts +96 -0
  12. package/dist/skill-registry.d.ts.map +1 -0
  13. package/dist/skill-registry.js +218 -0
  14. package/dist/skill-registry.js.map +1 -0
  15. package/dist/skills/auto-fix.d.ts +35 -0
  16. package/dist/skills/auto-fix.d.ts.map +1 -0
  17. package/dist/skills/auto-fix.js +121 -0
  18. package/dist/skills/auto-fix.js.map +1 -0
  19. package/dist/skills/cli-interactive.d.ts +60 -0
  20. package/dist/skills/cli-interactive.d.ts.map +1 -0
  21. package/dist/skills/cli-interactive.js +264 -0
  22. package/dist/skills/cli-interactive.js.map +1 -0
  23. package/dist/skills/code-review.d.ts +39 -0
  24. package/dist/skills/code-review.d.ts.map +1 -0
  25. package/dist/skills/code-review.js +204 -0
  26. package/dist/skills/code-review.js.map +1 -0
  27. package/dist/skills/commit-composer.d.ts +51 -0
  28. package/dist/skills/commit-composer.d.ts.map +1 -0
  29. package/dist/skills/commit-composer.js +223 -0
  30. package/dist/skills/commit-composer.js.map +1 -0
  31. package/dist/skills/container-advisor.d.ts +43 -0
  32. package/dist/skills/container-advisor.d.ts.map +1 -0
  33. package/dist/skills/container-advisor.js +274 -0
  34. package/dist/skills/container-advisor.js.map +1 -0
  35. package/dist/skills/context-memory.d.ts +44 -0
  36. package/dist/skills/context-memory.d.ts.map +1 -0
  37. package/dist/skills/context-memory.js +160 -0
  38. package/dist/skills/context-memory.js.map +1 -0
  39. package/dist/skills/dep-audit.d.ts +55 -0
  40. package/dist/skills/dep-audit.d.ts.map +1 -0
  41. package/dist/skills/dep-audit.js +248 -0
  42. package/dist/skills/dep-audit.js.map +1 -0
  43. package/dist/skills/deploy-provision.d.ts +47 -0
  44. package/dist/skills/deploy-provision.d.ts.map +1 -0
  45. package/dist/skills/deploy-provision.js +270 -0
  46. package/dist/skills/deploy-provision.js.map +1 -0
  47. package/dist/skills/docs-gen.d.ts +36 -0
  48. package/dist/skills/docs-gen.d.ts.map +1 -0
  49. package/dist/skills/docs-gen.js +187 -0
  50. package/dist/skills/docs-gen.js.map +1 -0
  51. package/dist/skills/index.d.ts +19 -0
  52. package/dist/skills/index.d.ts.map +1 -0
  53. package/dist/skills/index.js +55 -0
  54. package/dist/skills/index.js.map +1 -0
  55. package/dist/skills/multi-repo.d.ts +50 -0
  56. package/dist/skills/multi-repo.d.ts.map +1 -0
  57. package/dist/skills/multi-repo.js +175 -0
  58. package/dist/skills/multi-repo.js.map +1 -0
  59. package/dist/skills/onboarding.d.ts +48 -0
  60. package/dist/skills/onboarding.d.ts.map +1 -0
  61. package/dist/skills/onboarding.js +245 -0
  62. package/dist/skills/onboarding.js.map +1 -0
  63. package/dist/skills/perf-profile.d.ts +36 -0
  64. package/dist/skills/perf-profile.d.ts.map +1 -0
  65. package/dist/skills/perf-profile.js +179 -0
  66. package/dist/skills/perf-profile.js.map +1 -0
  67. package/dist/skills/pipeline-aware.d.ts +33 -0
  68. package/dist/skills/pipeline-aware.d.ts.map +1 -0
  69. package/dist/skills/pipeline-aware.js +226 -0
  70. package/dist/skills/pipeline-aware.js.map +1 -0
  71. package/dist/skills/refactor.d.ts +33 -0
  72. package/dist/skills/refactor.d.ts.map +1 -0
  73. package/dist/skills/refactor.js +210 -0
  74. package/dist/skills/refactor.js.map +1 -0
  75. package/dist/skills/test-gen.d.ts +36 -0
  76. package/dist/skills/test-gen.d.ts.map +1 -0
  77. package/dist/skills/test-gen.js +154 -0
  78. package/dist/skills/test-gen.js.map +1 -0
  79. package/dist/types.d.ts +133 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +8 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +39 -0
@@ -0,0 +1,218 @@
1
+ /**
2
+ * WeaveSkills — SkillRegistry
3
+ *
4
+ * Central registry for all skill modules.
5
+ * Manages lifecycle: register → enable/disable → execute.
6
+ *
7
+ * Usage:
8
+ * ```typescript
9
+ * const registry = new SkillRegistry();
10
+ * registry.register(mySkill);
11
+ * registry.enable('my-skill');
12
+ * await registry.execute('my-skill', context);
13
+ * ```
14
+ */
15
+ export class SkillRegistry {
16
+ _skills = new Map();
17
+ // ---------------------------------------------------------------------------
18
+ // Registration
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Register a skill module.
22
+ * If a SkillConfig has been loaded, the config's enabled flag takes priority
23
+ * over the module's `enabled` default.
24
+ *
25
+ * @throws {Error} if a skill with the same id is already registered
26
+ */
27
+ register(module) {
28
+ if (this._skills.has(module.id)) {
29
+ throw new Error(`Skill '${module.id}' is already registered. Use replace() to overwrite.`);
30
+ }
31
+ this._skills.set(module.id, {
32
+ module,
33
+ enabled: module.enabled,
34
+ registeredAt: new Date(),
35
+ });
36
+ }
37
+ /**
38
+ * Register a skill module, replacing any existing entry with the same id.
39
+ * Useful for testing and hot-reloading scenarios.
40
+ */
41
+ replace(module) {
42
+ const existing = this._skills.get(module.id);
43
+ this._skills.set(module.id, {
44
+ module,
45
+ enabled: existing ? existing.enabled : module.enabled,
46
+ registeredAt: existing ? existing.registeredAt : new Date(),
47
+ });
48
+ }
49
+ /**
50
+ * Unregister a skill by id.
51
+ * @returns true if the skill existed and was removed, false otherwise
52
+ */
53
+ unregister(id) {
54
+ return this._skills.delete(id);
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Enable / Disable
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Enable a registered skill.
61
+ * @throws {Error} if the skill is not registered
62
+ */
63
+ enable(id) {
64
+ const entry = this._getOrThrow(id);
65
+ entry.enabled = true;
66
+ }
67
+ /**
68
+ * Disable a registered skill.
69
+ * @throws {Error} if the skill is not registered
70
+ */
71
+ disable(id) {
72
+ const entry = this._getOrThrow(id);
73
+ entry.enabled = false;
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // Query
77
+ // ---------------------------------------------------------------------------
78
+ /** Returns the full registered skill entry, or undefined if not found. */
79
+ get(id) {
80
+ return this._skills.get(id);
81
+ }
82
+ /** Returns true if a skill with the given id is registered. */
83
+ has(id) {
84
+ return this._skills.has(id);
85
+ }
86
+ /** Returns all registered skills (enabled and disabled). */
87
+ list() {
88
+ return Array.from(this._skills.values());
89
+ }
90
+ /** Returns only enabled skills. */
91
+ listEnabled() {
92
+ return Array.from(this._skills.values())
93
+ .filter((s) => s.enabled)
94
+ .map((s) => s.module);
95
+ }
96
+ /** Total number of registered skills. */
97
+ get size() {
98
+ return this._skills.size;
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // Execution
102
+ // ---------------------------------------------------------------------------
103
+ /**
104
+ * Execute a skill by id.
105
+ *
106
+ * @param id - Skill identifier
107
+ * @param context - Runtime context injected into the skill
108
+ * @returns SkillResult — never throws; errors are captured into result.error
109
+ * @throws {Error} if the skill is not registered or is disabled
110
+ */
111
+ async execute(id, context) {
112
+ const entry = this._getOrThrow(id);
113
+ if (!entry.enabled) {
114
+ throw new Error(`Skill '${id}' is disabled. Enable it first with registry.enable('${id}').`);
115
+ }
116
+ try {
117
+ return await entry.module.execute(context);
118
+ }
119
+ catch (err) {
120
+ return {
121
+ success: false,
122
+ output: `Skill '${id}' threw an unexpected error`,
123
+ error: err instanceof Error ? err.message : String(err),
124
+ };
125
+ }
126
+ }
127
+ /**
128
+ * Execute a skill by id, returning a failed SkillResult instead of throwing
129
+ * if the skill is not registered or is disabled.
130
+ * Useful for fire-and-forget scenarios where you don't want to handle missing skills.
131
+ */
132
+ async executeSafe(id, context) {
133
+ const entry = this._skills.get(id);
134
+ if (!entry) {
135
+ return { success: false, output: '', error: `Skill '${id}' is not registered.` };
136
+ }
137
+ if (!entry.enabled) {
138
+ return { success: false, output: '', error: `Skill '${id}' is disabled.` };
139
+ }
140
+ try {
141
+ return await entry.module.execute(context);
142
+ }
143
+ catch (err) {
144
+ return {
145
+ success: false,
146
+ output: `Skill '${id}' threw an unexpected error`,
147
+ error: err instanceof Error ? err.message : String(err),
148
+ };
149
+ }
150
+ }
151
+ /**
152
+ * Execute all currently enabled skills in registration order.
153
+ * Skills that throw are caught and returned as failed results — they never
154
+ * block execution of subsequent skills.
155
+ *
156
+ * @param context - Runtime context shared across all skills
157
+ * @returns Map of skill id → SkillResult
158
+ */
159
+ async executeAll(context) {
160
+ const results = new Map();
161
+ for (const entry of this._skills.values()) {
162
+ if (!entry.enabled)
163
+ continue;
164
+ try {
165
+ results.set(entry.module.id, await entry.module.execute(context));
166
+ }
167
+ catch (err) {
168
+ results.set(entry.module.id, {
169
+ success: false,
170
+ output: `Skill '${entry.module.id}' threw an unexpected error`,
171
+ error: err instanceof Error ? err.message : String(err),
172
+ });
173
+ }
174
+ }
175
+ return results;
176
+ }
177
+ // ---------------------------------------------------------------------------
178
+ // Config integration
179
+ // ---------------------------------------------------------------------------
180
+ /**
181
+ * Apply a SkillConfig to the registry.
182
+ *
183
+ * - Skills present in config.skills are enabled/disabled accordingly.
184
+ * - Skills not mentioned in config are left at their current state.
185
+ * - Skills in config that are not yet registered are silently ignored
186
+ * (they will be applied when registered later via register()).
187
+ */
188
+ loadFromConfig(config) {
189
+ for (const [id, enabled] of Object.entries(config.skills)) {
190
+ const entry = this._skills.get(id);
191
+ if (entry) {
192
+ entry.enabled = enabled;
193
+ }
194
+ }
195
+ }
196
+ /**
197
+ * Produce a SkillConfig snapshot from the current registry state.
198
+ * Useful for serialising the registry to `.weave.config.json`.
199
+ */
200
+ toConfig() {
201
+ const skills = {};
202
+ for (const [id, entry] of this._skills.entries()) {
203
+ skills[id] = entry.enabled;
204
+ }
205
+ return { skills };
206
+ }
207
+ // ---------------------------------------------------------------------------
208
+ // Private helpers
209
+ // ---------------------------------------------------------------------------
210
+ _getOrThrow(id) {
211
+ const entry = this._skills.get(id);
212
+ if (!entry) {
213
+ throw new Error(`Skill '${id}' is not registered.`);
214
+ }
215
+ return entry;
216
+ }
217
+ }
218
+ //# sourceMappingURL=skill-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../src/skill-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Skill: auto-fix
3
+ *
4
+ * Reads VULN-*.md remediation files and reports what patches need to be applied.
5
+ * In apply mode, writes the patches and creates one git commit per VULN.
6
+ *
7
+ * Input (via SkillContext.graph or options in data):
8
+ * - `sentinelDir` — directory containing VULN-*.md files (default: .sentinel_logs)
9
+ * - `apply` — if true, attempt to apply patches via execSync (default: false / dry-run)
10
+ *
11
+ * Output data:
12
+ * - vulns: VulnReport[] — one entry per VULN file found
13
+ * - applied: number — commits created (only in apply mode)
14
+ */
15
+ import type { SkillModule } from '../types.js';
16
+ export interface VulnReport {
17
+ id: string;
18
+ file: string;
19
+ title: string;
20
+ severity: string;
21
+ affectedFiles: string[];
22
+ remediation: string;
23
+ status: 'pending' | 'applied' | 'error';
24
+ error?: string;
25
+ }
26
+ export interface AutoFixResult {
27
+ vulns: VulnReport[];
28
+ applied: number;
29
+ skipped: number;
30
+ errors: number;
31
+ dryRun: boolean;
32
+ }
33
+ export declare function parseVulnFile(content: string, filePath: string): VulnReport;
34
+ export declare const autoFixSkill: SkillModule;
35
+ //# sourceMappingURL=auto-fix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fix.d.ts","sourceRoot":"","sources":["../../src/skills/auto-fix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,aAAa,CAAC;AAM1E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAYD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAiB3E;AAcD,eAAO,MAAM,YAAY,EAAE,WAgF1B,CAAC"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Skill: auto-fix
3
+ *
4
+ * Reads VULN-*.md remediation files and reports what patches need to be applied.
5
+ * In apply mode, writes the patches and creates one git commit per VULN.
6
+ *
7
+ * Input (via SkillContext.graph or options in data):
8
+ * - `sentinelDir` — directory containing VULN-*.md files (default: .sentinel_logs)
9
+ * - `apply` — if true, attempt to apply patches via execSync (default: false / dry-run)
10
+ *
11
+ * Output data:
12
+ * - vulns: VulnReport[] — one entry per VULN file found
13
+ * - applied: number — commits created (only in apply mode)
14
+ */
15
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
16
+ import { join, resolve } from 'node:path';
17
+ import { execSync } from 'node:child_process';
18
+ // ---------------------------------------------------------------------------
19
+ // Helpers
20
+ // ---------------------------------------------------------------------------
21
+ const VULN_PATTERN = /^VULN-\d+\.md$/i;
22
+ const SEVERITY_RE = /\*\*severity:?\*\*[:\s]*(.+)/i;
23
+ const TITLE_RE = /^#\s+(.+)/m;
24
+ const AFFECTED_RE = /\*\*affected[^*]*\*\*[:\s]+([^\n]+)/gi;
25
+ const REMEDIATION_RE = /##\s+remediation[\s\S]*?(?=##|$)/i;
26
+ export function parseVulnFile(content, filePath) {
27
+ const id = /VULN-\d+/i.exec(filePath)?.[0]?.toUpperCase() ?? 'VULN-???';
28
+ const titleMatch = TITLE_RE.exec(content);
29
+ const title = titleMatch ? titleMatch[1].trim() : id;
30
+ const severityMatch = SEVERITY_RE.exec(content);
31
+ const severity = severityMatch ? severityMatch[1].trim() : 'Unknown';
32
+ const affectedFiles = [];
33
+ let affectedMatch;
34
+ while ((affectedMatch = AFFECTED_RE.exec(content)) !== null) {
35
+ affectedFiles.push(...affectedMatch[1].split(/[,;]+/).map((s) => s.trim()).filter(Boolean));
36
+ }
37
+ const remMatch = REMEDIATION_RE.exec(content);
38
+ const remediation = remMatch ? remMatch[0].replace(/##\s+remediation/i, '').trim() : '';
39
+ return { id, file: filePath, title, severity, affectedFiles, remediation, status: 'pending' };
40
+ }
41
+ function runGitCommit(projectRoot, vuln) {
42
+ execSync(`git -C "${projectRoot}" add -A`, { stdio: 'pipe' });
43
+ execSync(`git -C "${projectRoot}" commit -m "fix(${vuln.id.toLowerCase()}): ${vuln.title.slice(0, 72)}"`, { stdio: 'pipe' });
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Skill
47
+ // ---------------------------------------------------------------------------
48
+ export const autoFixSkill = {
49
+ id: 'auto-fix',
50
+ name: 'Auto-Fix',
51
+ description: 'Reads VULN-*.md files and reports (or applies) security remediations',
52
+ version: '1.0.0',
53
+ enabled: false,
54
+ tags: ['dev', 'security'],
55
+ async execute(ctx) {
56
+ const opts = ctx.graph ?? {};
57
+ const sentinelDir = String(opts['sentinelDir'] ?? '.sentinel_logs');
58
+ const apply = Boolean(opts['apply'] ?? false);
59
+ const sentinelPath = resolve(ctx.projectRoot, sentinelDir);
60
+ if (!existsSync(sentinelPath)) {
61
+ return {
62
+ success: true,
63
+ output: `No sentinel directory found at ${sentinelPath} — nothing to fix.`,
64
+ data: { vulns: [], applied: 0, skipped: 0, errors: 0, dryRun: !apply },
65
+ };
66
+ }
67
+ const vulnFiles = readdirSync(sentinelPath)
68
+ .filter((f) => VULN_PATTERN.test(f))
69
+ .sort();
70
+ if (vulnFiles.length === 0) {
71
+ return {
72
+ success: true,
73
+ output: `No VULN-*.md files found in ${sentinelPath}.`,
74
+ data: { vulns: [], applied: 0, skipped: 0, errors: 0, dryRun: !apply },
75
+ };
76
+ }
77
+ const reports = vulnFiles.map((f) => {
78
+ const filePath = join(sentinelPath, f);
79
+ return parseVulnFile(readFileSync(filePath, 'utf-8'), filePath);
80
+ });
81
+ let applied = 0;
82
+ let errors = 0;
83
+ if (apply) {
84
+ for (const vuln of reports) {
85
+ try {
86
+ runGitCommit(ctx.projectRoot, vuln);
87
+ vuln.status = 'applied';
88
+ applied++;
89
+ }
90
+ catch (err) {
91
+ vuln.status = 'error';
92
+ vuln.error = err instanceof Error ? err.message : String(err);
93
+ errors++;
94
+ }
95
+ }
96
+ }
97
+ const lines = [
98
+ apply ? `🔧 Auto-Fix — Applied mode` : `🔍 Auto-Fix — Dry-run mode`,
99
+ `Found ${reports.length} VULN file(s) in ${sentinelDir}/`,
100
+ '',
101
+ ...reports.map((v) => {
102
+ const icon = v.status === 'applied' ? '✅' : v.status === 'error' ? '❌' : '⬜';
103
+ return ` ${icon} ${v.id} [${v.severity}] — ${v.title}`;
104
+ }),
105
+ '',
106
+ apply ? `Applied: ${applied} | Errors: ${errors}` : `Run with apply:true to commit fixes.`,
107
+ ];
108
+ return {
109
+ success: errors === 0,
110
+ output: lines.join('\n'),
111
+ data: {
112
+ vulns: reports,
113
+ applied,
114
+ skipped: reports.length - applied - errors,
115
+ errors,
116
+ dryRun: !apply,
117
+ },
118
+ };
119
+ },
120
+ };
121
+ //# sourceMappingURL=auto-fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fix.js","sourceRoot":"","sources":["../../src/skills/auto-fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Skill: cli-interactive
3
+ *
4
+ * REPL mode descriptor and command dispatcher for `weave chat`.
5
+ * Opens a persistent conversational session with history, command autocompletion
6
+ * and access to all active skills.
7
+ *
8
+ * In practice, the actual REPL loop is handled by the CLI process; this skill
9
+ * provides the session configuration, help text and simulated command dispatch
10
+ * for testing purposes.
11
+ *
12
+ * Input (via SkillContext.graph):
13
+ * - `ctx.graph['command']` — string to simulate a REPL command (for tests)
14
+ * - `ctx.graph['history']` — string[] of previous commands (injectable)
15
+ * - `ctx.graph['skills']` — string[] of active skill IDs for help text
16
+ * - `ctx.graph['sessionId']` — override session ID
17
+ *
18
+ * Output data:
19
+ * - CliInteractiveResult
20
+ */
21
+ import type { SkillModule } from '../types.js';
22
+ export interface ReplCommand {
23
+ name: string;
24
+ aliases: string[];
25
+ description: string;
26
+ usage: string;
27
+ }
28
+ export interface ReplConfig {
29
+ sessionId: string;
30
+ prompt: string;
31
+ historyFile: string;
32
+ maxHistory: number;
33
+ activeSkills: string[];
34
+ commands: ReplCommand[];
35
+ }
36
+ export interface ReplCommandResult {
37
+ command: string;
38
+ args: string[];
39
+ output: string;
40
+ type: 'info' | 'success' | 'error' | 'skill';
41
+ }
42
+ export interface CliInteractiveResult {
43
+ config: ReplConfig;
44
+ commandResult?: ReplCommandResult;
45
+ helpText: string;
46
+ welcomeMessage: string;
47
+ }
48
+ export declare const REPL_COMMANDS: ReplCommand[];
49
+ export declare function buildHelpText(commands: ReplCommand[], activeSkills: string[]): string;
50
+ export declare function buildWelcomeMessage(sessionId: string): string;
51
+ export declare function parseCommand(input: string): {
52
+ name: string;
53
+ args: string[];
54
+ };
55
+ export declare function dispatchCommand(parsed: {
56
+ name: string;
57
+ args: string[];
58
+ }, config: ReplConfig, history: string[]): ReplCommandResult;
59
+ export declare const cliInteractiveSkill: SkillModule;
60
+ //# sourceMappingURL=cli-interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-interactive.d.ts","sourceRoot":"","sources":["../../src/skills/cli-interactive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,aAAa,CAAC;AAM1E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;CAC9C;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD,eAAO,MAAM,aAAa,EAAE,WAAW,EA2CtC,CAAC;AAMF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAkBrF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAG5E;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,EACxC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EAAE,GAChB,iBAAiB,CA2HnB;AAMD,eAAO,MAAM,mBAAmB,EAAE,WA+DjC,CAAC"}