@autonav/core 1.1.3 → 1.1.5

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 (49) hide show
  1. package/README.md +33 -0
  2. package/dist/adapter/claude-adapter.d.ts +30 -0
  3. package/dist/adapter/claude-adapter.d.ts.map +1 -1
  4. package/dist/adapter/claude-adapter.js +155 -0
  5. package/dist/adapter/claude-adapter.js.map +1 -1
  6. package/dist/cli/autonav.d.ts +1 -0
  7. package/dist/cli/autonav.d.ts.map +1 -1
  8. package/dist/cli/autonav.js +23 -4
  9. package/dist/cli/autonav.js.map +1 -1
  10. package/dist/cli/nav-init.js +86 -13
  11. package/dist/cli/nav-init.js.map +1 -1
  12. package/dist/cli/nav-install.d.ts +3 -0
  13. package/dist/cli/nav-install.d.ts.map +1 -0
  14. package/dist/cli/nav-install.js +101 -0
  15. package/dist/cli/nav-install.js.map +1 -0
  16. package/dist/cli/nav-uninstall.d.ts +3 -0
  17. package/dist/cli/nav-uninstall.d.ts.map +1 -0
  18. package/dist/cli/nav-uninstall.js +123 -0
  19. package/dist/cli/nav-uninstall.js.map +1 -0
  20. package/dist/cli/nav-update.d.ts +3 -0
  21. package/dist/cli/nav-update.d.ts.map +1 -0
  22. package/dist/cli/nav-update.js +131 -0
  23. package/dist/cli/nav-update.js.map +1 -0
  24. package/dist/interview/App.d.ts +7 -1
  25. package/dist/interview/App.d.ts.map +1 -1
  26. package/dist/interview/App.js +211 -17
  27. package/dist/interview/App.js.map +1 -1
  28. package/dist/interview/index.d.ts +9 -2
  29. package/dist/interview/index.d.ts.map +1 -1
  30. package/dist/interview/index.js +12 -3
  31. package/dist/interview/index.js.map +1 -1
  32. package/dist/interview/progress.d.ts +55 -0
  33. package/dist/interview/progress.d.ts.map +1 -0
  34. package/dist/interview/progress.js +88 -0
  35. package/dist/interview/progress.js.map +1 -0
  36. package/dist/interview/prompts.d.ts +4 -1
  37. package/dist/interview/prompts.d.ts.map +1 -1
  38. package/dist/interview/prompts.js +46 -7
  39. package/dist/interview/prompts.js.map +1 -1
  40. package/dist/pack-installer/index.d.ts.map +1 -1
  41. package/dist/pack-installer/index.js +14 -2
  42. package/dist/pack-installer/index.js.map +1 -1
  43. package/dist/skill-generator/index.d.ts +89 -4
  44. package/dist/skill-generator/index.d.ts.map +1 -1
  45. package/dist/skill-generator/index.js +364 -143
  46. package/dist/skill-generator/index.js.map +1 -1
  47. package/dist/templates/.gitignore.template +3 -0
  48. package/package.json +11 -1
  49. package/dist/templates/CLAUDE-import.md.template +0 -90
@@ -2,18 +2,65 @@ import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
3
  import os from "node:os";
4
4
  /**
5
- * Get the global skills directory path
5
+ * Get the global skills directory path (~/.claude/skills/)
6
6
  */
7
7
  export function getGlobalSkillsDir() {
8
8
  return path.join(os.homedir(), ".claude", "skills");
9
9
  }
10
10
  /**
11
- * Check if a skill already exists
11
+ * Get the local skills directory path for a navigator (.autonav/skills/)
12
+ */
13
+ export function getLocalSkillsDir(navigatorPath) {
14
+ return path.join(navigatorPath, ".autonav", "skills");
15
+ }
16
+ /**
17
+ * Get the full path to a local skill directory
18
+ */
19
+ export function getLocalSkillPath(navigatorPath, skillName) {
20
+ return path.join(getLocalSkillsDir(navigatorPath), skillName);
21
+ }
22
+ /**
23
+ * Check if a skill already exists globally
12
24
  */
13
25
  export function skillExists(skillName) {
14
26
  const skillDir = path.join(getGlobalSkillsDir(), skillName);
15
27
  return fs.existsSync(skillDir);
16
28
  }
29
+ /**
30
+ * Check if a skill exists locally in a navigator
31
+ */
32
+ export function localSkillExists(navigatorPath, skillName) {
33
+ const skillDir = getLocalSkillPath(navigatorPath, skillName);
34
+ return fs.existsSync(skillDir);
35
+ }
36
+ /**
37
+ * Check if a global skill is a symlink
38
+ */
39
+ export function isSkillSymlink(skillName) {
40
+ const skillDir = path.join(getGlobalSkillsDir(), skillName);
41
+ try {
42
+ const stats = fs.lstatSync(skillDir);
43
+ return stats.isSymbolicLink();
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ /**
50
+ * Get the target of a global skill symlink
51
+ */
52
+ export function getSkillSymlinkTarget(skillName) {
53
+ const skillDir = path.join(getGlobalSkillsDir(), skillName);
54
+ try {
55
+ if (!isSkillSymlink(skillName)) {
56
+ return null;
57
+ }
58
+ return fs.readlinkSync(skillDir);
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
17
64
  /**
18
65
  * Generate the skill name from navigator name
19
66
  */
@@ -22,6 +69,14 @@ export function getSkillName(navigatorName) {
22
69
  const normalized = navigatorName.toLowerCase().replace(/[_\s]+/g, "-");
23
70
  return `ask-${normalized}`;
24
71
  }
72
+ /**
73
+ * Generate the update skill name from navigator name
74
+ */
75
+ export function getUpdateSkillName(navigatorName) {
76
+ // Convert to lowercase, replace spaces/underscores with hyphens
77
+ const normalized = navigatorName.toLowerCase().replace(/[_\s]+/g, "-");
78
+ return `update-${normalized}`;
79
+ }
25
80
  /**
26
81
  * Generate the SKILL.md content for a navigator
27
82
  */
@@ -30,159 +85,95 @@ export function generateSkillContent(config) {
30
85
  const navPath = config.navigatorPath;
31
86
  return `---
32
87
  name: ${skillName}
33
- description: Consult with ${config.navigatorName} navigator for questions about ${config.description}. Use when user asks to "ask ${config.navigatorName}" or needs information from this knowledge base.
88
+ description: Query ${config.navigatorName} navigator about ${config.description}. Use when user asks to "ask ${config.navigatorName}" or needs information from this knowledge base.
34
89
  ---
35
90
 
36
- # Ask ${config.navigatorName} Skill
91
+ # Ask ${config.navigatorName}
92
+
93
+ Query the **${config.navigatorName}** navigator for information.
37
94
 
38
- ## Purpose
39
- Facilitate conversations with the **${config.navigatorName}** navigator located at \`${navPath}\`.
95
+ **Navigator Location**: \`${navPath}\`
40
96
 
41
97
  ${config.description}
42
98
 
43
99
  ${config.scope ? `**Scope**: ${config.scope}\n` : ""}
44
100
  ${config.audience ? `**Audience**: ${config.audience}\n` : ""}
45
101
 
46
- ## When to Use This Skill
47
-
48
- Use this skill when the user:
49
- - Asks to "ask ${config.navigatorName.toLowerCase()}" or "query ${config.navigatorName.toLowerCase()}"
50
- - Needs information from the ${config.navigatorName} knowledge base
51
- - Wants to consult this navigator's domain expertise
52
-
53
- ## Communication Protocol
54
-
55
- This navigator uses the Autonav communication layer for structured interactions.
56
-
57
- ### Query Format (NavigatorQuery)
58
- \`\`\`json
59
- {
60
- "protocolVersion": "1.0.0",
61
- "fromNavigator": "<your-navigator-name>",
62
- "toNavigator": "${config.navigatorName}",
63
- "question": "<the question>",
64
- "context": "<optional context>",
65
- "reason": "needs_specialist"
66
- }
67
- \`\`\`
68
-
69
- ### Response Format (NavigatorResponse)
70
- \`\`\`json
71
- {
72
- "protocolVersion": "1.0.0",
73
- "query": "<original question>",
74
- "answer": "<grounded answer with citations>",
75
- "sources": [
76
- {
77
- "filePath": "path/to/file.md",
78
- "excerpt": "exact quote",
79
- "section": "section heading"
80
- }
81
- ],
82
- "confidence": 0.85
83
- }
84
- \`\`\`
102
+ ## How to Use
85
103
 
86
- ## Technical Implementation
104
+ Simply use \`autonav query\` to ask questions:
87
105
 
88
- ### Starting a New Conversation
89
-
90
- 1. Generate a session UUID:
91
106
  \`\`\`bash
92
- UUID=$(python -c "import uuid; print(uuid.uuid4())")
107
+ autonav query "${navPath}" "your question here"
93
108
  \`\`\`
94
109
 
95
- 2. Start conversation:
96
- \`\`\`bash
97
- cd "${navPath}" && claude -p --session-id "$UUID" "$message"
98
- \`\`\`
110
+ The navigator will provide grounded answers with sources from its knowledge base.
99
111
 
100
- ### Continuing a Conversation
112
+ ## What This Navigator Knows
101
113
 
102
- \`\`\`bash
103
- cd "${navPath}" && claude --resume "$UUID" -p "$message"
104
- \`\`\`
114
+ This navigator specializes in ${config.scope || 'its configured domain'} and follows strict grounding rules:
115
+ - Always cites sources from the knowledge base
116
+ - Never invents information
117
+ - Acknowledges uncertainty with confidence scores
118
+ - Only references files that actually exist
119
+ `;
120
+ }
121
+ /**
122
+ * Generate the update skill content for a navigator (with write permissions)
123
+ */
124
+ export function generateUpdateSkillContent(config) {
125
+ const skillName = getUpdateSkillName(config.navigatorName);
126
+ const navPath = config.navigatorPath;
127
+ return `---
128
+ name: ${skillName}
129
+ description: Update ${config.navigatorName} navigator's documentation and knowledge base. Use when reporting implementation progress, documenting issues, or updating knowledge about ${config.description}.
130
+ ---
105
131
 
106
- ### Using autonav query (Simpler)
132
+ # Update ${config.navigatorName}
107
133
 
108
- For one-off queries without maintaining session state:
109
- \`\`\`bash
110
- autonav query "${navPath}" "your question here"
111
- \`\`\`
134
+ Update the **${config.navigatorName}** navigator's documentation and knowledge base.
112
135
 
113
- ## Conversation Template
136
+ **Navigator Location**: \`${navPath}\`
114
137
 
115
- When starting a conversation, provide:
116
- 1. **Context** - What you're working on
117
- 2. **Question** - Specific question for this navigator
118
- 3. **Expected format** - If you need structured output
138
+ ${config.description}
119
139
 
120
- Example:
121
- \`\`\`
122
- Hi ${config.navigatorName}! I'm working on [context].
140
+ ${config.scope ? `**Scope**: ${config.scope}\n` : ""}
141
+ ${config.audience ? `**Audience**: ${config.audience}\n` : ""}
123
142
 
124
- Question: [your specific question]
143
+ ## When to Use
125
144
 
126
- Please provide sources for your answer.
127
- \`\`\`
145
+ Use this skill to:
146
+ - Report implementation progress or issues
147
+ - Update documentation after making changes
148
+ - Add new knowledge or learnings
149
+ - Document troubleshooting steps
150
+ - Create status reports or logs
128
151
 
129
- ## Example Workflow
152
+ ## How to Use
130
153
 
131
- ### Quick Query
132
- \`\`\`bash
133
- autonav query "${navPath}" "How do I configure X?"
134
- \`\`\`
154
+ Simply use \`autonav update\` to send an update message:
135
155
 
136
- ### Interactive Session
137
156
  \`\`\`bash
138
- # Generate UUID
139
- UUID=$(python -c "import uuid; print(uuid.uuid4())")
157
+ autonav update "${navPath}" "your update message"
158
+ \`\`\`
140
159
 
141
- # Start conversation
142
- cd "${navPath}" && claude -p --session-id "$UUID" \\
143
- "I need help understanding the architecture. Can you explain the main components?"
160
+ **Example updates:**
144
161
 
145
- # Follow up
146
- cd "${navPath}" && claude --resume "$UUID" -p \\
147
- "Thanks! How do those components interact?"
162
+ Report progress:
163
+ \`\`\`bash
164
+ autonav update "${navPath}" "I completed feature X. Please document this in the knowledge base."
148
165
  \`\`\`
149
166
 
150
- ### With Write Access (for self-configuration)
167
+ Log an issue:
151
168
  \`\`\`bash
152
- cd "${navPath}" && claude --resume "$UUID" -p --permission-mode acceptEdits \\
153
- "Please update the configuration to enable feature X"
169
+ autonav update "${navPath}" "Encountered error Y during deployment. Add this to troubleshooting docs."
154
170
  \`\`\`
155
171
 
156
- ## Best Practices
157
-
158
- 1. **Provide Context** - Give enough information for grounded answers
159
- 2. **Be Specific** - Focused questions get better answers
160
- 3. **Request Sources** - Ask for citations to verify grounding
161
- 4. **Check Confidence** - Low confidence answers may need human review
162
- 5. **Use Structured Queries** - For programmatic access, use the NavigatorQuery format
163
-
164
- ## Grounding Rules
165
-
166
- This navigator follows strict grounding rules:
167
- - Always cites sources from the knowledge base
168
- - Never invents information
169
- - Acknowledges uncertainty with confidence scores
170
- - Only references files that actually exist
171
-
172
- ## Tool Usage
173
-
174
- - Use \`Bash\` tool to communicate with the navigator
175
- - Always \`cd\` to the navigator directory first
176
- - Use \`-p\` flag for prompt mode
177
- - Store UUIDs for multi-turn conversations
178
- - Add \`--permission-mode acceptEdits\` only when edits are needed and confirmed
172
+ ## Important
179
173
 
180
- ## Important Notes
181
-
182
- - Navigator location: \`${navPath}\`
183
- - Each conversation needs a unique UUID for session tracking
184
- - Use \`autonav query\` for simple one-off questions
185
- - Use \`claude -p --session-id\` for multi-turn conversations
174
+ - This command grants **write permissions** to the navigator
175
+ - Changes are made directly to files in the knowledge base
176
+ - Always review edits before committing to version control
186
177
  `;
187
178
  }
188
179
  /**
@@ -193,44 +184,274 @@ This navigator follows strict grounding rules:
193
184
  * @returns Path to the created skill directory, or null if skipped
194
185
  */
195
186
  export async function createNavigatorSkill(config, options = {}) {
196
- const skillName = getSkillName(config.navigatorName);
187
+ const askSkillName = getSkillName(config.navigatorName);
188
+ const updateSkillName = getUpdateSkillName(config.navigatorName);
197
189
  const skillsDir = getGlobalSkillsDir();
198
- const skillDir = path.join(skillsDir, skillName);
199
- // Check if skill already exists
200
- if (skillExists(skillName) && !options.force) {
190
+ const askSkillDir = path.join(skillsDir, askSkillName);
191
+ const updateSkillDir = path.join(skillsDir, updateSkillName);
192
+ // Ensure skills directory exists
193
+ fs.mkdirSync(skillsDir, { recursive: true });
194
+ // Create "ask" skill
195
+ if (skillExists(askSkillName) && !options.force) {
196
+ if (!options.quiet) {
197
+ console.log(`⏭️ Skill "${askSkillName}" already exists (use --force to overwrite)`);
198
+ }
199
+ }
200
+ else {
201
+ fs.mkdirSync(askSkillDir, { recursive: true });
202
+ const askSkillContent = generateSkillContent(config);
203
+ fs.writeFileSync(path.join(askSkillDir, "SKILL.md"), askSkillContent);
204
+ if (!options.quiet) {
205
+ console.log(`✓ Created global skill: ${askSkillName}`);
206
+ }
207
+ }
208
+ // Create "update" skill
209
+ if (skillExists(updateSkillName) && !options.force) {
210
+ if (!options.quiet) {
211
+ console.log(`⏭️ Skill "${updateSkillName}" already exists (use --force to overwrite)`);
212
+ }
213
+ }
214
+ else {
215
+ fs.mkdirSync(updateSkillDir, { recursive: true });
216
+ const updateSkillContent = generateUpdateSkillContent(config);
217
+ fs.writeFileSync(path.join(updateSkillDir, "SKILL.md"), updateSkillContent);
218
+ if (!options.quiet) {
219
+ console.log(`✓ Created global skill: ${updateSkillName}`);
220
+ }
221
+ }
222
+ return askSkillDir;
223
+ }
224
+ /**
225
+ * Remove a navigator skill (both ask and update skills, global only)
226
+ */
227
+ export function removeNavigatorSkill(navigatorName, options = {}) {
228
+ const askSkillName = getSkillName(navigatorName);
229
+ const updateSkillName = getUpdateSkillName(navigatorName);
230
+ const skillsDir = getGlobalSkillsDir();
231
+ const askSkillDir = path.join(skillsDir, askSkillName);
232
+ const updateSkillDir = path.join(skillsDir, updateSkillName);
233
+ let removedAny = false;
234
+ // Remove ask skill
235
+ if (fs.existsSync(askSkillDir)) {
236
+ fs.rmSync(askSkillDir, { recursive: true, force: true });
237
+ if (!options.quiet) {
238
+ console.log(`Removed skill: ${askSkillName}`);
239
+ }
240
+ removedAny = true;
241
+ }
242
+ // Remove update skill
243
+ if (fs.existsSync(updateSkillDir)) {
244
+ fs.rmSync(updateSkillDir, { recursive: true, force: true });
245
+ if (!options.quiet) {
246
+ console.log(`Removed skill: ${updateSkillName}`);
247
+ }
248
+ removedAny = true;
249
+ }
250
+ if (!removedAny && !options.quiet) {
251
+ console.log(`No skills found for navigator "${navigatorName}"`);
252
+ }
253
+ return removedAny;
254
+ }
255
+ /**
256
+ * Create a skill locally in the navigator's .autonav/skills/ directory
257
+ */
258
+ export async function createLocalSkill(navigatorPath, config, options = {}) {
259
+ const skillName = getSkillName(config.navigatorName);
260
+ const localSkillsDir = getLocalSkillsDir(navigatorPath);
261
+ const localSkillDir = path.join(localSkillsDir, skillName);
262
+ // Check if skill already exists locally
263
+ if (localSkillExists(navigatorPath, skillName) && !options.force) {
201
264
  if (!options.quiet) {
202
- console.log(`⏭️ Skill "${skillName}" already exists (use --force to overwrite)`);
265
+ console.log(`Skill "${skillName}" already exists locally (use --force to overwrite)`);
203
266
  }
204
267
  return null;
205
268
  }
206
- // Ensure skills directory exists
207
- fs.mkdirSync(skillsDir, { recursive: true });
208
- // Create skill directory
209
- fs.mkdirSync(skillDir, { recursive: true });
269
+ // Ensure local skills directory exists
270
+ fs.mkdirSync(localSkillsDir, { recursive: true });
271
+ // Create local skill directory
272
+ fs.mkdirSync(localSkillDir, { recursive: true });
210
273
  // Generate and write SKILL.md
211
274
  const skillContent = generateSkillContent(config);
212
- fs.writeFileSync(path.join(skillDir, "SKILL.md"), skillContent);
275
+ fs.writeFileSync(path.join(localSkillDir, "SKILL.md"), skillContent);
213
276
  if (!options.quiet) {
214
- console.log(`✓ Created global skill: ${skillName}`);
277
+ console.log(`Created local skill: ${skillName}`);
215
278
  }
216
- return skillDir;
279
+ return localSkillDir;
217
280
  }
218
281
  /**
219
- * Remove a navigator skill
282
+ * Create a symlink from global skills directory to local skill
283
+ *
284
+ * @returns SymlinkResult with status and details
220
285
  */
221
- export function removeNavigatorSkill(navigatorName, options = {}) {
222
- const skillName = getSkillName(navigatorName);
223
- const skillDir = path.join(getGlobalSkillsDir(), skillName);
224
- if (!fs.existsSync(skillDir)) {
286
+ export function symlinkSkillToGlobal(localSkillPath, skillName, options = {}) {
287
+ const globalSkillsDir = getGlobalSkillsDir();
288
+ const globalSkillDir = path.join(globalSkillsDir, skillName);
289
+ // Ensure global skills directory exists
290
+ fs.mkdirSync(globalSkillsDir, { recursive: true });
291
+ // Check if global skill already exists
292
+ if (fs.existsSync(globalSkillDir)) {
293
+ // Check if it's already a symlink to the correct location
294
+ if (isSkillSymlink(skillName)) {
295
+ const target = getSkillSymlinkTarget(skillName);
296
+ const resolvedLocal = path.resolve(localSkillPath);
297
+ const resolvedTarget = target ? path.resolve(path.dirname(globalSkillDir), target) : null;
298
+ if (resolvedTarget === resolvedLocal) {
299
+ if (!options.quiet) {
300
+ console.log(`Skill "${skillName}" already linked`);
301
+ }
302
+ return {
303
+ success: true,
304
+ action: "already_linked",
305
+ message: `Skill "${skillName}" already symlinked correctly`,
306
+ skillName,
307
+ localPath: localSkillPath,
308
+ globalPath: globalSkillDir,
309
+ };
310
+ }
311
+ // Symlink exists but points elsewhere
312
+ if (!options.force) {
313
+ if (!options.quiet) {
314
+ console.log(`Conflict: "${skillName}" symlinked to different location: ${target}`);
315
+ }
316
+ return {
317
+ success: false,
318
+ action: "conflict",
319
+ message: `Global skill "${skillName}" already symlinked to different location`,
320
+ skillName,
321
+ localPath: localSkillPath,
322
+ globalPath: globalSkillDir,
323
+ conflictTarget: target ?? undefined,
324
+ };
325
+ }
326
+ // Force: remove existing symlink
327
+ fs.unlinkSync(globalSkillDir);
328
+ }
329
+ else {
330
+ // Regular directory exists (not a symlink)
331
+ if (!options.force) {
332
+ if (!options.quiet) {
333
+ console.log(`Conflict: "${skillName}" exists as regular directory (not symlink)`);
334
+ }
335
+ return {
336
+ success: false,
337
+ action: "conflict",
338
+ message: `Global skill "${skillName}" exists as regular directory, not symlink`,
339
+ skillName,
340
+ localPath: localSkillPath,
341
+ globalPath: globalSkillDir,
342
+ };
343
+ }
344
+ // Force: remove existing directory
345
+ fs.rmSync(globalSkillDir, { recursive: true, force: true });
346
+ }
347
+ }
348
+ // Create symlink
349
+ try {
350
+ fs.symlinkSync(localSkillPath, globalSkillDir, "dir");
225
351
  if (!options.quiet) {
226
- console.log(`⚠️ Skill "${skillName}" does not exist`);
352
+ console.log(`Symlinked skill: ${skillName}`);
227
353
  }
228
- return false;
354
+ return {
355
+ success: true,
356
+ action: "created",
357
+ message: `Created symlink for "${skillName}"`,
358
+ skillName,
359
+ localPath: localSkillPath,
360
+ globalPath: globalSkillDir,
361
+ };
229
362
  }
230
- fs.rmSync(skillDir, { recursive: true, force: true });
231
- if (!options.quiet) {
232
- console.log(`✓ Removed skill: ${skillName}`);
363
+ catch (error) {
364
+ const errorMsg = error instanceof Error ? error.message : String(error);
365
+ if (!options.quiet) {
366
+ console.error(`Failed to create symlink for "${skillName}": ${errorMsg}`);
367
+ }
368
+ return {
369
+ success: false,
370
+ action: "error",
371
+ message: `Failed to create symlink: ${errorMsg}`,
372
+ skillName,
373
+ localPath: localSkillPath,
374
+ globalPath: globalSkillDir,
375
+ };
376
+ }
377
+ }
378
+ /**
379
+ * Remove the global symlink for a skill (preserves local skill)
380
+ */
381
+ export function removeSkillSymlink(skillName, options = {}) {
382
+ const globalSkillDir = path.join(getGlobalSkillsDir(), skillName);
383
+ if (!fs.existsSync(globalSkillDir)) {
384
+ if (!options.quiet) {
385
+ console.log(`No global skill "${skillName}" found`);
386
+ }
387
+ return {
388
+ success: true,
389
+ wasSymlink: false,
390
+ message: `No global skill "${skillName}" found`,
391
+ };
392
+ }
393
+ if (!isSkillSymlink(skillName)) {
394
+ if (!options.quiet) {
395
+ console.log(`Warning: "${skillName}" is not a symlink, skipping removal`);
396
+ }
397
+ return {
398
+ success: false,
399
+ wasSymlink: false,
400
+ message: `"${skillName}" is a regular directory, not a symlink. Manual removal required.`,
401
+ };
402
+ }
403
+ try {
404
+ fs.unlinkSync(globalSkillDir);
405
+ if (!options.quiet) {
406
+ console.log(`Removed symlink: ${skillName}`);
407
+ }
408
+ return {
409
+ success: true,
410
+ wasSymlink: true,
411
+ message: `Removed symlink for "${skillName}"`,
412
+ };
413
+ }
414
+ catch (error) {
415
+ const errorMsg = error instanceof Error ? error.message : String(error);
416
+ if (!options.quiet) {
417
+ console.error(`Failed to remove symlink for "${skillName}": ${errorMsg}`);
418
+ }
419
+ return {
420
+ success: false,
421
+ wasSymlink: true,
422
+ message: `Failed to remove symlink: ${errorMsg}`,
423
+ };
424
+ }
425
+ }
426
+ /**
427
+ * Create a skill locally AND symlink it globally (recommended for new navigators)
428
+ *
429
+ * This is the preferred method for creating skills as it:
430
+ * 1. Stores the skill in the navigator's .autonav/skills/ (version-controlled)
431
+ * 2. Symlinks to ~/.claude/skills/ for global discovery
432
+ */
433
+ export async function createAndSymlinkSkill(navigatorPath, config, options = {}) {
434
+ // Create local skill
435
+ const localPath = await createLocalSkill(navigatorPath, config, options);
436
+ if (!localPath) {
437
+ return { localPath: null, symlinkResult: null };
438
+ }
439
+ // Symlink to global
440
+ const skillName = getSkillName(config.navigatorName);
441
+ const symlinkResult = symlinkSkillToGlobal(localPath, skillName, options);
442
+ return { localPath, symlinkResult };
443
+ }
444
+ /**
445
+ * Discover all local skills in a navigator
446
+ */
447
+ export function discoverLocalSkills(navigatorPath) {
448
+ const localSkillsDir = getLocalSkillsDir(navigatorPath);
449
+ if (!fs.existsSync(localSkillsDir)) {
450
+ return [];
233
451
  }
234
- return true;
452
+ const entries = fs.readdirSync(localSkillsDir, { withFileTypes: true });
453
+ return entries
454
+ .filter((entry) => entry.isDirectory() && entry.name.startsWith("ask-"))
455
+ .map((entry) => entry.name);
235
456
  }
236
457
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skill-generator/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skill-generator/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AA0BzB;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAqB;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAqB,EAAE,SAAiB;IACxE,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,aAAqB,EAAE,SAAiB;IACvE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC7D,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,aAAqB;IAChD,gEAAgE;IAChE,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACvE,OAAO,OAAO,UAAU,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,gEAAgE;IAChE,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACvE,OAAO,UAAU,UAAU,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACtD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;IAErC,OAAO;QACD,SAAS;qBACI,MAAM,CAAC,aAAa,oBAAoB,MAAM,CAAC,WAAW,gCAAgC,MAAM,CAAC,aAAa;;;QAG3H,MAAM,CAAC,aAAa;;cAEd,MAAM,CAAC,aAAa;;4BAEN,OAAO;;EAEjC,MAAM,CAAC,WAAW;;EAElB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE;EAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE;;;;;;;iBAO5C,OAAO;;;;;;;gCAOQ,MAAM,CAAC,KAAK,IAAI,uBAAuB;;;;;CAKtE,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAmB;IAC5D,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;IAErC,OAAO;QACD,SAAS;sBACK,MAAM,CAAC,aAAa,8IAA8I,MAAM,CAAC,WAAW;;;WAG/L,MAAM,CAAC,aAAa;;eAEhB,MAAM,CAAC,aAAa;;4BAEP,OAAO;;EAEjC,MAAM,CAAC,WAAW;;EAElB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE;EAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;kBAgB3C,OAAO;;;;;;;kBAOP,OAAO;;;;;kBAKP,OAAO;;;;;;;;CAQxB,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAmB,EACnB,UAGI,EAAE;IAEN,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAE7D,iCAAiC;IACjC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,qBAAqB;IACrB,IAAI,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,cAAc,YAAY,6CAA6C,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,eAAe,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACrD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,cAAc,eAAe,6CAA6C,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAC9D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC5E,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,eAAe,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,aAAqB,EACrB,UAA+B,EAAE;IAEjC,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAE7D,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,mBAAmB;IACnB,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,kBAAkB,YAAY,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,sBAAsB;IACtB,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,kBAAkB,eAAe,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,kCAAkC,aAAa,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAgBD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,MAAmB,EACnB,UAGI,EAAE;IAEN,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAE3D,wCAAwC;IACxC,IAAI,gBAAgB,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,UAAU,SAAS,qDAAqD,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uCAAuC;IACvC,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,+BAA+B;IAC/B,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjD,8BAA8B;IAC9B,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;IAErE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,cAAsB,EACtB,SAAiB,EACjB,UAGI,EAAE;IAEN,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IAE7D,wCAAwC;IACxC,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,uCAAuC;IACvC,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,0DAA0D;QAC1D,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACnD,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE1F,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,UAAU,SAAS,kBAAkB,CAAC,CAAC;gBACrD,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,gBAAgB;oBACxB,OAAO,EAAE,UAAU,SAAS,+BAA+B;oBAC3D,SAAS;oBACT,SAAS,EAAE,cAAc;oBACzB,UAAU,EAAE,cAAc;iBAC3B,CAAC;YACJ,CAAC;YAED,sCAAsC;YACtC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,sCAAsC,MAAM,EAAE,CAAC,CAAC;gBACrF,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,UAAU;oBAClB,OAAO,EAAE,iBAAiB,SAAS,2CAA2C;oBAC9E,SAAS;oBACT,SAAS,EAAE,cAAc;oBACzB,UAAU,EAAE,cAAc;oBAC1B,cAAc,EAAE,MAAM,IAAI,SAAS;iBACpC,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,6CAA6C,CAAC,CAAC;gBACpF,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,UAAU;oBAClB,OAAO,EAAE,iBAAiB,SAAS,4CAA4C;oBAC/E,SAAS;oBACT,SAAS,EAAE,cAAc;oBACzB,UAAU,EAAE,cAAc;iBAC3B,CAAC;YACJ,CAAC;YAED,mCAAmC;YACnC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC;QACH,EAAE,CAAC,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,wBAAwB,SAAS,GAAG;YAC7C,SAAS;YACT,SAAS,EAAE,cAAc;YACzB,UAAU,EAAE,cAAc;SAC3B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,iCAAiC,SAAS,MAAM,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,6BAA6B,QAAQ,EAAE;YAChD,SAAS;YACT,SAAS,EAAE,cAAc;YACzB,UAAU,EAAE,cAAc;SAC3B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,UAA+B,EAAE;IAEjC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC,CAAC;IAElE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,SAAS,CAAC,CAAC;QACtD,CAAC;QACD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,oBAAoB,SAAS,SAAS;SAChD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,sCAAsC,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,IAAI,SAAS,mEAAmE;SAC1F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,wBAAwB,SAAS,GAAG;SAC9C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,iCAAiC,SAAS,MAAM,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,6BAA6B,QAAQ,EAAE;SACjD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,aAAqB,EACrB,MAAmB,EACnB,UAGI,EAAE;IAEN,qBAAqB;IACrB,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAClD,CAAC;IAED,oBAAoB;IACpB,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAE1E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAqB;IACvD,MAAM,cAAc,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAExD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;SACvE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
@@ -8,6 +8,9 @@ node_modules/
8
8
  # Plugin credentials (NEVER commit these!)
9
9
  .claude/plugins.json
10
10
 
11
+ # Interview progress (temporary state)
12
+ .autonav-init-progress.json
13
+
11
14
  # OS files
12
15
  .DS_Store
13
16
  Thumbs.db
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autonav/core",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "CLI tools and Claude SDK Adapter for Autonav navigators",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -63,10 +63,20 @@
63
63
  "zod": "^3.24.1"
64
64
  },
65
65
  "devDependencies": {
66
+ "@testing-library/react": "^14.0.0",
66
67
  "@types/node": "^20.0.0",
67
68
  "@types/react": "^18.3.0",
68
69
  "@types/tar": "^6.1.0",
70
+ "ink-testing-library": "^4.0.0",
69
71
  "typescript": "^5.3.0",
70
72
  "vitest": "^1.2.0"
73
+ },
74
+ "peerDependencies": {
75
+ "langsmith": "^0.3.0"
76
+ },
77
+ "peerDependenciesMeta": {
78
+ "langsmith": {
79
+ "optional": true
80
+ }
71
81
  }
72
82
  }