@agents-inc/cli 0.85.0 → 0.86.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 (123) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/{chunk-6VGBO6SZ.js → chunk-5M6Q5UQO.js} +2 -2
  3. package/dist/{chunk-YJ2URWF7.js → chunk-B6MYECV6.js} +2 -2
  4. package/dist/{chunk-FT46LN7K.js → chunk-BV2MIQ3O.js} +7 -8
  5. package/dist/chunk-BV2MIQ3O.js.map +1 -0
  6. package/dist/{chunk-G2MINRWX.js → chunk-C5IYJ42F.js} +2 -2
  7. package/dist/{chunk-7UZUDHP7.js → chunk-CXWBVBDM.js} +2 -2
  8. package/dist/chunk-DCVCFBQ7.js +1800 -0
  9. package/dist/chunk-DCVCFBQ7.js.map +1 -0
  10. package/dist/{chunk-CYPCJ536.js → chunk-FBZR46GC.js} +92 -92
  11. package/dist/chunk-FBZR46GC.js.map +1 -0
  12. package/dist/{chunk-TXW257CU.js → chunk-GED2F75H.js} +90 -167
  13. package/dist/chunk-GED2F75H.js.map +1 -0
  14. package/dist/{chunk-LTFGEVTM.js → chunk-HH3AWXF4.js} +3 -3
  15. package/dist/{chunk-2XVLQDNI.js → chunk-HSLVCKVQ.js} +3 -3
  16. package/dist/{chunk-TAQGYJIS.js → chunk-HZ2IBXVQ.js} +3 -3
  17. package/dist/{chunk-LN76TJJP.js → chunk-HZQOFFKA.js} +10 -10
  18. package/dist/{chunk-W7LHI54P.js → chunk-I44YG6VI.js} +2 -2
  19. package/dist/{chunk-L7COG2EX.js → chunk-LZ7XQ3IU.js} +2 -2
  20. package/dist/{chunk-LMR7VAP3.js → chunk-MMTMXLI4.js} +2 -2
  21. package/dist/chunk-N6A7A4RA.js +16 -0
  22. package/dist/chunk-N6A7A4RA.js.map +1 -0
  23. package/dist/{chunk-WJKD6EGK.js → chunk-NUU3U43A.js} +5 -6
  24. package/dist/chunk-NUU3U43A.js.map +1 -0
  25. package/dist/chunk-O5ZWS26C.js +166 -0
  26. package/dist/chunk-O5ZWS26C.js.map +1 -0
  27. package/dist/{chunk-YYIWB42G.js → chunk-Q4DMIPZB.js} +2 -2
  28. package/dist/{chunk-YSLDMYWP.js → chunk-SGZOFIFF.js} +2 -2
  29. package/dist/{chunk-FKXD3EXJ.js → chunk-TMTUTUEV.js} +42 -228
  30. package/dist/chunk-TMTUTUEV.js.map +1 -0
  31. package/dist/{chunk-WCCWQ56J.js → chunk-UNEJKTLP.js} +3 -3
  32. package/dist/chunk-XQK4S22C.js +202 -0
  33. package/dist/chunk-XQK4S22C.js.map +1 -0
  34. package/dist/{chunk-ZGD7PLLC.js → chunk-ZOWRO7UQ.js} +3 -3
  35. package/dist/commands/build/marketplace.js +3 -3
  36. package/dist/commands/build/plugins.js +5 -5
  37. package/dist/commands/build/stack.js +5 -5
  38. package/dist/commands/compile.js +63 -163
  39. package/dist/commands/compile.js.map +1 -1
  40. package/dist/commands/config/index.js +5 -5
  41. package/dist/commands/config/path.js +4 -4
  42. package/dist/commands/config/show.js +5 -5
  43. package/dist/commands/diff.js +27 -632
  44. package/dist/commands/diff.js.map +1 -1
  45. package/dist/commands/doctor.js +41 -28
  46. package/dist/commands/doctor.js.map +1 -1
  47. package/dist/commands/edit.js +128 -194
  48. package/dist/commands/edit.js.map +1 -1
  49. package/dist/commands/eject.js +58 -126
  50. package/dist/commands/eject.js.map +1 -1
  51. package/dist/commands/import/skill.js +15 -148
  52. package/dist/commands/import/skill.js.map +1 -1
  53. package/dist/commands/info.js +34 -85
  54. package/dist/commands/info.js.map +1 -1
  55. package/dist/commands/init.js +23 -17
  56. package/dist/commands/list.js +4 -4
  57. package/dist/commands/new/agent.js +23 -97
  58. package/dist/commands/new/agent.js.map +1 -1
  59. package/dist/commands/new/marketplace.js +9 -9
  60. package/dist/commands/new/marketplace.js.map +1 -1
  61. package/dist/commands/new/skill.js +169 -20
  62. package/dist/commands/new/skill.js.map +1 -1
  63. package/dist/commands/outdated.js +18 -24
  64. package/dist/commands/outdated.js.map +1 -1
  65. package/dist/commands/search.js +37 -100
  66. package/dist/commands/search.js.map +1 -1
  67. package/dist/commands/uninstall.js +39 -156
  68. package/dist/commands/uninstall.js.map +1 -1
  69. package/dist/commands/update.js +49 -99
  70. package/dist/commands/update.js.map +1 -1
  71. package/dist/commands/validate.js +4 -4
  72. package/dist/components/skill-search/skill-search.js +2 -1
  73. package/dist/components/wizard/category-grid.test.js +4 -4
  74. package/dist/components/wizard/domain-selection.js +5 -5
  75. package/dist/components/wizard/help-modal.js +5 -5
  76. package/dist/components/wizard/source-grid.test.js +4 -4
  77. package/dist/components/wizard/stack-selection.js +5 -5
  78. package/dist/components/wizard/step-agents.js +5 -5
  79. package/dist/components/wizard/step-agents.test.js +5 -5
  80. package/dist/components/wizard/step-build.js +5 -5
  81. package/dist/components/wizard/step-build.test.js +5 -5
  82. package/dist/components/wizard/step-confirm.test.js +4 -4
  83. package/dist/components/wizard/step-settings.js +4 -4
  84. package/dist/components/wizard/step-settings.test.js +7 -7
  85. package/dist/components/wizard/step-sources.js +5 -5
  86. package/dist/components/wizard/step-sources.test.js +5 -5
  87. package/dist/components/wizard/step-stack.js +6 -6
  88. package/dist/components/wizard/step-stack.test.js +6 -6
  89. package/dist/components/wizard/wizard-layout.js +6 -6
  90. package/dist/components/wizard/wizard.js +14 -14
  91. package/dist/hooks/init.js +21 -16
  92. package/dist/hooks/init.js.map +1 -1
  93. package/dist/{loader-GT2A7R7U.js → loader-GSEGPK64.js} +3 -3
  94. package/dist/{source-loader-TNQW4P47.js → source-loader-OGFTIRIX.js} +4 -4
  95. package/dist/{source-manager-INRXRFJE.js → source-manager-FMMDDVZA.js} +4 -4
  96. package/dist/stores/wizard-store.js +4 -4
  97. package/dist/stores/wizard-store.test.js +4 -4
  98. package/package.json +1 -1
  99. package/dist/chunk-AABH2HSE.js +0 -340
  100. package/dist/chunk-AABH2HSE.js.map +0 -1
  101. package/dist/chunk-CYPCJ536.js.map +0 -1
  102. package/dist/chunk-FKXD3EXJ.js.map +0 -1
  103. package/dist/chunk-FT46LN7K.js.map +0 -1
  104. package/dist/chunk-TXW257CU.js.map +0 -1
  105. package/dist/chunk-WJKD6EGK.js.map +0 -1
  106. /package/dist/{chunk-6VGBO6SZ.js.map → chunk-5M6Q5UQO.js.map} +0 -0
  107. /package/dist/{chunk-YJ2URWF7.js.map → chunk-B6MYECV6.js.map} +0 -0
  108. /package/dist/{chunk-G2MINRWX.js.map → chunk-C5IYJ42F.js.map} +0 -0
  109. /package/dist/{chunk-7UZUDHP7.js.map → chunk-CXWBVBDM.js.map} +0 -0
  110. /package/dist/{chunk-LTFGEVTM.js.map → chunk-HH3AWXF4.js.map} +0 -0
  111. /package/dist/{chunk-2XVLQDNI.js.map → chunk-HSLVCKVQ.js.map} +0 -0
  112. /package/dist/{chunk-TAQGYJIS.js.map → chunk-HZ2IBXVQ.js.map} +0 -0
  113. /package/dist/{chunk-LN76TJJP.js.map → chunk-HZQOFFKA.js.map} +0 -0
  114. /package/dist/{chunk-W7LHI54P.js.map → chunk-I44YG6VI.js.map} +0 -0
  115. /package/dist/{chunk-L7COG2EX.js.map → chunk-LZ7XQ3IU.js.map} +0 -0
  116. /package/dist/{chunk-LMR7VAP3.js.map → chunk-MMTMXLI4.js.map} +0 -0
  117. /package/dist/{chunk-YYIWB42G.js.map → chunk-Q4DMIPZB.js.map} +0 -0
  118. /package/dist/{chunk-YSLDMYWP.js.map → chunk-SGZOFIFF.js.map} +0 -0
  119. /package/dist/{chunk-WCCWQ56J.js.map → chunk-UNEJKTLP.js.map} +0 -0
  120. /package/dist/{chunk-ZGD7PLLC.js.map → chunk-ZOWRO7UQ.js.map} +0 -0
  121. /package/dist/{loader-GT2A7R7U.js.map → loader-GSEGPK64.js.map} +0 -0
  122. /package/dist/{source-loader-TNQW4P47.js.map → source-loader-OGFTIRIX.js.map} +0 -0
  123. /package/dist/{source-manager-INRXRFJE.js.map → source-manager-FMMDDVZA.js.map} +0 -0
@@ -3,25 +3,26 @@ import {
3
3
  STATUS_MESSAGES
4
4
  } from "../chunk-B7KZLXHV.js";
5
5
  import {
6
- discoverLocalSkills,
7
- loadSkillsMatrixFromSource
8
- } from "../chunk-FKXD3EXJ.js";
9
- import "../chunk-YJ2URWF7.js";
6
+ loadSource,
7
+ resolveSkillInfo
8
+ } from "../chunk-DCVCFBQ7.js";
9
+ import "../chunk-N6A7A4RA.js";
10
+ import "../chunk-O5ZWS26C.js";
11
+ import "../chunk-XQK4S22C.js";
12
+ import "../chunk-FBZR46GC.js";
13
+ import "../chunk-TMTUTUEV.js";
14
+ import "../chunk-B6MYECV6.js";
10
15
  import {
11
16
  matrix
12
17
  } from "../chunk-ANXHMG32.js";
13
18
  import {
14
19
  BaseCommand,
15
20
  EXIT_CODES
16
- } from "../chunk-LMR7VAP3.js";
17
- import {
18
- fileExists,
19
- readFile
20
- } from "../chunk-WJKD6EGK.js";
21
+ } from "../chunk-MMTMXLI4.js";
22
+ import "../chunk-NUU3U43A.js";
21
23
  import "../chunk-6XWHJHNZ.js";
22
24
  import {
23
- CLI_BIN_NAME,
24
- STANDARD_FILES
25
+ CLI_BIN_NAME
25
26
  } from "../chunk-6PGL2XMY.js";
26
27
  import "../chunk-NPMMU4GY.js";
27
28
  import {
@@ -31,40 +32,7 @@ import {
31
32
  // src/cli/commands/info.ts
32
33
  init_esm_shims();
33
34
  import { Args, Flags } from "@oclif/core";
34
- import path from "path";
35
35
  var CONTENT_PREVIEW_LINES = 10;
36
- var MAX_LINE_LENGTH = 80;
37
- var MAX_SUGGESTIONS = 5;
38
- function stripFrontmatter(content) {
39
- const lines = content.split("\n");
40
- let inFrontmatter = false;
41
- let frontmatterEndIndex = 0;
42
- for (let i = 0; i < lines.length; i++) {
43
- const line = lines[i].trim();
44
- if (line === "---") {
45
- if (!inFrontmatter) {
46
- inFrontmatter = true;
47
- } else {
48
- frontmatterEndIndex = i + 1;
49
- break;
50
- }
51
- }
52
- }
53
- return lines.slice(frontmatterEndIndex).join("\n");
54
- }
55
- function getPreviewLines(content, maxLines) {
56
- const body = stripFrontmatter(content);
57
- const lines = body.split("\n");
58
- const result = [];
59
- for (const line of lines) {
60
- if (result.length >= maxLines) break;
61
- if (line.trim() || result.length > 0) {
62
- const truncated = line.length > MAX_LINE_LENGTH ? `${line.slice(0, MAX_LINE_LENGTH - 3)}...` : line;
63
- result.push(truncated);
64
- }
65
- }
66
- return result;
67
- }
68
36
  function formatRequirements(requirements) {
69
37
  if (requirements.length === 0) {
70
38
  return "(none)";
@@ -74,18 +42,6 @@ function formatRequirements(requirements) {
74
42
  return prefix + req.skillIds.join(", ");
75
43
  }).join("; ");
76
44
  }
77
- function findSuggestions(skills, query, maxSuggestions) {
78
- const lowerQuery = query.toLowerCase();
79
- const matches = [];
80
- for (const skill of Object.values(skills)) {
81
- if (!skill) continue;
82
- if (matches.length >= maxSuggestions) break;
83
- if (skill.id.toLowerCase().includes(lowerQuery) || skill.displayName.toLowerCase().includes(lowerQuery) || skill.slug.toLowerCase().includes(lowerQuery)) {
84
- matches.push(skill.id);
85
- }
86
- }
87
- return matches;
88
- }
89
45
  function formatSkillInfo(skill, isInstalled) {
90
46
  const lines = [];
91
47
  lines.push(`Skill: ${skill.id}`);
@@ -150,20 +106,28 @@ var Info = class _Info extends BaseCommand {
150
106
  const { args, flags } = await this.parse(_Info);
151
107
  try {
152
108
  this.log(STATUS_MESSAGES.LOADING_SKILLS);
153
- const { sourcePath, isLocal } = await loadSkillsMatrixFromSource({
154
- sourceFlag: flags.source
109
+ const { sourceResult } = await loadSource({
110
+ sourceFlag: flags.source,
111
+ projectDir: process.cwd()
155
112
  });
113
+ const { sourcePath, isLocal } = sourceResult;
156
114
  this.log(`Loaded from ${isLocal ? "local" : "remote"}: ${sourcePath}`);
157
- const slugResolvedId = matrix.slugMap.slugToId[args.skill];
158
- let skill = matrix.skills[args.skill] ?? (slugResolvedId ? matrix.skills[slugResolvedId] : void 0);
159
- if (!skill) {
160
- const suggestions = findSuggestions(matrix.skills, args.skill, MAX_SUGGESTIONS);
115
+ const result = await resolveSkillInfo({
116
+ query: args.skill,
117
+ skills: matrix.skills,
118
+ slugToId: matrix.slugMap.slugToId,
119
+ projectDir: process.cwd(),
120
+ sourcePath,
121
+ isLocal,
122
+ includePreview: flags.preview
123
+ });
124
+ if (!result.resolved) {
161
125
  this.log("");
162
126
  this.error(`Skill "${args.skill}" not found.`, { exit: false });
163
- if (suggestions.length > 0) {
127
+ if (result.suggestions.length > 0) {
164
128
  this.log("");
165
129
  this.log("Did you mean one of these?");
166
- for (const suggestion of suggestions) {
130
+ for (const suggestion of result.suggestions) {
167
131
  this.log(` - ${suggestion}`);
168
132
  }
169
133
  }
@@ -172,29 +136,14 @@ var Info = class _Info extends BaseCommand {
172
136
  this.log("");
173
137
  this.exit(EXIT_CODES.ERROR);
174
138
  }
175
- const localSkillsResult = await discoverLocalSkills(process.cwd());
176
- const localSkillIds = localSkillsResult?.skills.map((s) => s.id) || [];
177
- const isInstalled = localSkillIds.includes(skill.id);
139
+ const { skill, isInstalled, preview } = result.resolved;
178
140
  this.log("");
179
141
  this.log(formatSkillInfo(skill, isInstalled));
180
- if (flags.preview) {
181
- let skillMdPath;
182
- if (skill.local && skill.localPath) {
183
- skillMdPath = path.join(process.cwd(), skill.localPath, STANDARD_FILES.SKILL_MD);
184
- } else {
185
- const sourceDir = isLocal ? sourcePath : path.dirname(sourcePath);
186
- skillMdPath = path.join(sourceDir, skill.path, STANDARD_FILES.SKILL_MD);
187
- }
188
- if (await fileExists(skillMdPath)) {
189
- const content = await readFile(skillMdPath);
190
- const previewLines = getPreviewLines(content, CONTENT_PREVIEW_LINES);
191
- if (previewLines.length > 0) {
192
- this.log("");
193
- this.log(`--- Content Preview (first ${CONTENT_PREVIEW_LINES} lines) ---`);
194
- for (const line of previewLines) {
195
- this.log(line);
196
- }
197
- }
142
+ if (flags.preview && preview.length > 0) {
143
+ this.log("");
144
+ this.log(`--- Content Preview (first ${CONTENT_PREVIEW_LINES} lines) ---`);
145
+ for (const line of preview) {
146
+ this.log(line);
198
147
  }
199
148
  }
200
149
  this.log("");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/info.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills/index.js\";\nimport { fileExists, readFile } from \"../utils/fs.js\";\nimport { CLI_BIN_NAME, STANDARD_FILES } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { STATUS_MESSAGES } from \"../utils/messages.js\";\nimport type { ResolvedSkill, SkillId, SkillSlug, SkillRequirement } from \"../types/index.js\";\n\nconst CONTENT_PREVIEW_LINES = 10;\nconst MAX_LINE_LENGTH = 80;\nconst MAX_SUGGESTIONS = 5;\n\nfunction stripFrontmatter(content: string): string {\n const lines = content.split(\"\\n\");\n let inFrontmatter = false;\n let frontmatterEndIndex = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === \"---\") {\n if (!inFrontmatter) {\n inFrontmatter = true;\n } else {\n frontmatterEndIndex = i + 1;\n break;\n }\n }\n }\n\n return lines.slice(frontmatterEndIndex).join(\"\\n\");\n}\n\nfunction getPreviewLines(content: string, maxLines: number): string[] {\n const body = stripFrontmatter(content);\n const lines = body.split(\"\\n\");\n const result: string[] = [];\n\n for (const line of lines) {\n if (result.length >= maxLines) break;\n if (line.trim() || result.length > 0) {\n const truncated =\n line.length > MAX_LINE_LENGTH ? `${line.slice(0, MAX_LINE_LENGTH - 3)}...` : line;\n result.push(truncated);\n }\n }\n\n return result;\n}\n\nfunction formatRequirements(requirements: SkillRequirement[]): string {\n if (requirements.length === 0) {\n return \"(none)\";\n }\n return requirements\n .map((req) => {\n const prefix = req.needsAny ? \"any of: \" : \"\";\n return prefix + req.skillIds.join(\", \");\n })\n .join(\"; \");\n}\n\nfunction findSuggestions(\n skills: Partial<Record<SkillId, ResolvedSkill>>,\n query: string,\n maxSuggestions: number,\n): string[] {\n const lowerQuery = query.toLowerCase();\n const matches: string[] = [];\n\n for (const skill of Object.values(skills)) {\n if (!skill) continue;\n if (matches.length >= maxSuggestions) break;\n if (\n skill.id.toLowerCase().includes(lowerQuery) ||\n skill.displayName.toLowerCase().includes(lowerQuery) ||\n skill.slug.toLowerCase().includes(lowerQuery)\n ) {\n matches.push(skill.id);\n }\n }\n\n return matches;\n}\n\nfunction formatSkillInfo(skill: ResolvedSkill, isInstalled: boolean): string {\n const lines: string[] = [];\n\n lines.push(`Skill: ${skill.id}`);\n if (skill.slug) {\n lines.push(`Slug: ${skill.slug}`);\n }\n lines.push(`Display Name: ${skill.displayName}`);\n lines.push(`Author: ${skill.author}`);\n lines.push(`Category: ${skill.category}`);\n lines.push(\"\");\n lines.push(\"Description:\");\n lines.push(` ${skill.description}`);\n lines.push(\"\");\n lines.push(`Requires: ${formatRequirements(skill.requires)}`);\n lines.push(\n `Conflicts with: ${skill.conflictsWith.length > 0 ? skill.conflictsWith.map((r) => r.skillId).join(\", \") : \"(none)\"}`,\n );\n lines.push(\n `Recommended: ${skill.isRecommended ? `Yes${skill.recommendedReason ? ` — ${skill.recommendedReason}` : \"\"}` : \"No\"}`,\n );\n\n if (skill.usageGuidance) {\n lines.push(\"\");\n lines.push(\"Usage Guidance:\");\n lines.push(` ${skill.usageGuidance}`);\n }\n\n lines.push(\"\");\n lines.push(`Local Status: ${isInstalled ? \"Installed\" : \"Not installed\"}`);\n\n return lines.join(\"\\n\");\n}\n\nexport default class Info extends BaseCommand {\n static summary = \"Show detailed information about a skill\";\n static description =\n \"Display comprehensive information about a skill including metadata, relationships, and content preview\";\n\n static examples = [\n {\n description: \"Show info for a skill by ID\",\n command: \"<%= config.bin %> <%= command.id %> web-framework-react\",\n },\n {\n description: \"Show info without content preview\",\n command: \"<%= config.bin %> <%= command.id %> web-framework-react --no-preview\",\n },\n {\n description: \"Show info from a custom source\",\n command: \"<%= config.bin %> <%= command.id %> my-skill --source github:org/marketplace\",\n },\n ];\n\n static args = {\n skill: Args.string({\n description: \"Skill ID or alias to look up\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n preview: Flags.boolean({\n description: \"Show content preview from SKILL.md\",\n default: true,\n allowNo: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Info);\n\n try {\n this.log(STATUS_MESSAGES.LOADING_SKILLS);\n\n const { sourcePath, isLocal } = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n });\n\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n\n // CLI arg is an untyped string — try as skill ID first, then as slug\n const slugResolvedId = matrix.slugMap.slugToId[args.skill as SkillSlug];\n let skill =\n matrix.skills[args.skill as SkillId] ??\n (slugResolvedId ? matrix.skills[slugResolvedId] : undefined);\n\n if (!skill) {\n const suggestions = findSuggestions(matrix.skills, args.skill, MAX_SUGGESTIONS);\n\n this.log(\"\");\n this.error(`Skill \"${args.skill}\" not found.`, { exit: false });\n\n if (suggestions.length > 0) {\n this.log(\"\");\n this.log(\"Did you mean one of these?\");\n for (const suggestion of suggestions) {\n this.log(` - ${suggestion}`);\n }\n }\n\n this.log(\"\");\n this.logInfo(`Use '${CLI_BIN_NAME} search <query>' to find available skills.`);\n this.log(\"\");\n this.exit(EXIT_CODES.ERROR);\n }\n\n const localSkillsResult = await discoverLocalSkills(process.cwd());\n const localSkillIds = localSkillsResult?.skills.map((s) => s.id) || [];\n const isInstalled = localSkillIds.includes(skill.id);\n\n this.log(\"\");\n this.log(formatSkillInfo(skill, isInstalled));\n\n if (flags.preview) {\n let skillMdPath: string;\n\n if (skill.local && skill.localPath) {\n skillMdPath = path.join(process.cwd(), skill.localPath, STANDARD_FILES.SKILL_MD);\n } else {\n const sourceDir = isLocal ? sourcePath : path.dirname(sourcePath);\n skillMdPath = path.join(sourceDir, skill.path, STANDARD_FILES.SKILL_MD);\n }\n\n if (await fileExists(skillMdPath)) {\n const content = await readFile(skillMdPath);\n const previewLines = getPreviewLines(content, CONTENT_PREVIEW_LINES);\n\n if (previewLines.length > 0) {\n this.log(\"\");\n this.log(`--- Content Preview (first ${CONTENT_PREVIEW_LINES} lines) ---`);\n for (const line of previewLines) {\n this.log(line);\n }\n }\n }\n }\n\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/info.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { loadSource, resolveSkillInfo } from \"../lib/operations/index.js\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { CLI_BIN_NAME } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { STATUS_MESSAGES } from \"../utils/messages.js\";\nimport type { ResolvedSkill, SkillRequirement } from \"../types/index.js\";\n\nconst CONTENT_PREVIEW_LINES = 10;\n\nfunction formatRequirements(requirements: SkillRequirement[]): string {\n if (requirements.length === 0) {\n return \"(none)\";\n }\n return requirements\n .map((req) => {\n const prefix = req.needsAny ? \"any of: \" : \"\";\n return prefix + req.skillIds.join(\", \");\n })\n .join(\"; \");\n}\n\nfunction formatSkillInfo(skill: ResolvedSkill, isInstalled: boolean): string {\n const lines: string[] = [];\n\n lines.push(`Skill: ${skill.id}`);\n if (skill.slug) {\n lines.push(`Slug: ${skill.slug}`);\n }\n lines.push(`Display Name: ${skill.displayName}`);\n lines.push(`Author: ${skill.author}`);\n lines.push(`Category: ${skill.category}`);\n lines.push(\"\");\n lines.push(\"Description:\");\n lines.push(` ${skill.description}`);\n lines.push(\"\");\n lines.push(`Requires: ${formatRequirements(skill.requires)}`);\n lines.push(\n `Conflicts with: ${skill.conflictsWith.length > 0 ? skill.conflictsWith.map((r) => r.skillId).join(\", \") : \"(none)\"}`,\n );\n lines.push(\n `Recommended: ${skill.isRecommended ? `Yes${skill.recommendedReason ? ` — ${skill.recommendedReason}` : \"\"}` : \"No\"}`,\n );\n\n if (skill.usageGuidance) {\n lines.push(\"\");\n lines.push(\"Usage Guidance:\");\n lines.push(` ${skill.usageGuidance}`);\n }\n\n lines.push(\"\");\n lines.push(`Local Status: ${isInstalled ? \"Installed\" : \"Not installed\"}`);\n\n return lines.join(\"\\n\");\n}\n\nexport default class Info extends BaseCommand {\n static summary = \"Show detailed information about a skill\";\n static description =\n \"Display comprehensive information about a skill including metadata, relationships, and content preview\";\n\n static examples = [\n {\n description: \"Show info for a skill by ID\",\n command: \"<%= config.bin %> <%= command.id %> web-framework-react\",\n },\n {\n description: \"Show info without content preview\",\n command: \"<%= config.bin %> <%= command.id %> web-framework-react --no-preview\",\n },\n {\n description: \"Show info from a custom source\",\n command: \"<%= config.bin %> <%= command.id %> my-skill --source github:org/marketplace\",\n },\n ];\n\n static args = {\n skill: Args.string({\n description: \"Skill ID or alias to look up\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n preview: Flags.boolean({\n description: \"Show content preview from SKILL.md\",\n default: true,\n allowNo: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Info);\n\n try {\n this.log(STATUS_MESSAGES.LOADING_SKILLS);\n\n const { sourceResult } = await loadSource({\n sourceFlag: flags.source,\n projectDir: process.cwd(),\n });\n const { sourcePath, isLocal } = sourceResult;\n\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n\n const result = await resolveSkillInfo({\n query: args.skill,\n skills: matrix.skills,\n slugToId: matrix.slugMap.slugToId,\n projectDir: process.cwd(),\n sourcePath,\n isLocal,\n includePreview: flags.preview,\n });\n\n if (!result.resolved) {\n this.log(\"\");\n this.error(`Skill \"${args.skill}\" not found.`, { exit: false });\n\n if (result.suggestions.length > 0) {\n this.log(\"\");\n this.log(\"Did you mean one of these?\");\n for (const suggestion of result.suggestions) {\n this.log(` - ${suggestion}`);\n }\n }\n\n this.log(\"\");\n this.logInfo(`Use '${CLI_BIN_NAME} search <query>' to find available skills.`);\n this.log(\"\");\n this.exit(EXIT_CODES.ERROR);\n }\n\n const { skill, isInstalled, preview } = result.resolved;\n\n this.log(\"\");\n this.log(formatSkillInfo(skill, isInstalled));\n\n if (flags.preview && preview.length > 0) {\n this.log(\"\");\n this.log(`--- Content Preview (first ${CONTENT_PREVIEW_LINES} lines) ---`);\n for (const line of preview) {\n this.log(line);\n }\n }\n\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,MAAM,aAAa;AAS5B,IAAM,wBAAwB;AAE9B,SAAS,mBAAmB,cAA0C;AACpE,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,aACJ,IAAI,CAAC,QAAQ;AACZ,UAAM,SAAS,IAAI,WAAW,aAAa;AAC3C,WAAO,SAAS,IAAI,SAAS,KAAK,IAAI;AAAA,EACxC,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAAS,gBAAgB,OAAsB,aAA8B;AAC3E,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,UAAU,MAAM,EAAE,EAAE;AAC/B,MAAI,MAAM,MAAM;AACd,UAAM,KAAK,SAAS,MAAM,IAAI,EAAE;AAAA,EAClC;AACA,QAAM,KAAK,iBAAiB,MAAM,WAAW,EAAE;AAC/C,QAAM,KAAK,WAAW,MAAM,MAAM,EAAE;AACpC,QAAM,KAAK,aAAa,MAAM,QAAQ,EAAE;AACxC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,cAAc;AACzB,QAAM,KAAK,KAAK,MAAM,WAAW,EAAE;AACnC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,aAAa,mBAAmB,MAAM,QAAQ,CAAC,EAAE;AAC5D,QAAM;AAAA,IACJ,mBAAmB,MAAM,cAAc,SAAS,IAAI,MAAM,cAAc,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,QAAQ;AAAA,EACrH;AACA,QAAM;AAAA,IACJ,gBAAgB,MAAM,gBAAgB,MAAM,MAAM,oBAAoB,WAAM,MAAM,iBAAiB,KAAK,EAAE,KAAK,IAAI;AAAA,EACrH;AAEA,MAAI,MAAM,eAAe;AACvB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,KAAK,MAAM,aAAa,EAAE;AAAA,EACvC;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,iBAAiB,cAAc,cAAc,eAAe,EAAE;AAEzE,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA,EAC5C,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,OAAO;AAAA,IACZ,OAAO,KAAK,OAAO;AAAA,MACjB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,SAAS,MAAM,QAAQ;AAAA,MACrB,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,KAAI;AAE7C,QAAI;AACF,WAAK,IAAI,gBAAgB,cAAc;AAEvC,YAAM,EAAE,aAAa,IAAI,MAAM,WAAW;AAAA,QACxC,YAAY,MAAM;AAAA,QAClB,YAAY,QAAQ,IAAI;AAAA,MAC1B,CAAC;AACD,YAAM,EAAE,YAAY,QAAQ,IAAI;AAEhC,WAAK,IAAI,eAAe,UAAU,UAAU,QAAQ,KAAK,UAAU,EAAE;AAErE,YAAM,SAAS,MAAM,iBAAiB;AAAA,QACpC,OAAO,KAAK;AAAA,QACZ,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO,QAAQ;AAAA,QACzB,YAAY,QAAQ,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,QACA,gBAAgB,MAAM;AAAA,MACxB,CAAC;AAED,UAAI,CAAC,OAAO,UAAU;AACpB,aAAK,IAAI,EAAE;AACX,aAAK,MAAM,UAAU,KAAK,KAAK,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAE9D,YAAI,OAAO,YAAY,SAAS,GAAG;AACjC,eAAK,IAAI,EAAE;AACX,eAAK,IAAI,4BAA4B;AACrC,qBAAW,cAAc,OAAO,aAAa;AAC3C,iBAAK,IAAI,OAAO,UAAU,EAAE;AAAA,UAC9B;AAAA,QACF;AAEA,aAAK,IAAI,EAAE;AACX,aAAK,QAAQ,QAAQ,YAAY,4CAA4C;AAC7E,aAAK,IAAI,EAAE;AACX,aAAK,KAAK,WAAW,KAAK;AAAA,MAC5B;AAEA,YAAM,EAAE,OAAO,aAAa,QAAQ,IAAI,OAAO;AAE/C,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,gBAAgB,OAAO,WAAW,CAAC;AAE5C,UAAI,MAAM,WAAW,QAAQ,SAAS,GAAG;AACvC,aAAK,IAAI,EAAE;AACX,aAAK,IAAI,8BAA8B,qBAAqB,aAAa;AACzE,mBAAW,QAAQ,SAAS;AAC1B,eAAK,IAAI,IAAI;AAAA,QACf;AAAA,MACF;AAEA,WAAK,IAAI,EAAE;AAAA,IACb,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AACF;","names":[]}
@@ -2,19 +2,18 @@
2
2
  import {
3
3
  Init,
4
4
  formatDashboardText,
5
- getDashboardData,
6
5
  showDashboard
7
- } from "../chunk-TXW257CU.js";
8
- import "../chunk-LN76TJJP.js";
9
- import "../chunk-WCCWQ56J.js";
6
+ } from "../chunk-GED2F75H.js";
7
+ import "../chunk-HZQOFFKA.js";
8
+ import "../chunk-UNEJKTLP.js";
10
9
  import "../chunk-YVFGISUO.js";
11
- import "../chunk-ZGD7PLLC.js";
12
- import "../chunk-LTFGEVTM.js";
10
+ import "../chunk-ZOWRO7UQ.js";
11
+ import "../chunk-HH3AWXF4.js";
13
12
  import "../chunk-V36FRPAU.js";
14
- import "../chunk-YYIWB42G.js";
15
- import "../chunk-6VGBO6SZ.js";
16
- import "../chunk-L7COG2EX.js";
17
- import "../chunk-YSLDMYWP.js";
13
+ import "../chunk-Q4DMIPZB.js";
14
+ import "../chunk-5M6Q5UQO.js";
15
+ import "../chunk-LZ7XQ3IU.js";
16
+ import "../chunk-SGZOFIFF.js";
18
17
  import "../chunk-FQTYF3OU.js";
19
18
  import "../chunk-K77I4XGL.js";
20
19
  import "../chunk-ANZV33N5.js";
@@ -24,24 +23,31 @@ import "../chunk-7SOPVGDV.js";
24
23
  import "../chunk-SB2R5KHJ.js";
25
24
  import "../chunk-BEZ6ZPDS.js";
26
25
  import "../chunk-P2FHS5IS.js";
27
- import "../chunk-G2MINRWX.js";
26
+ import "../chunk-C5IYJ42F.js";
28
27
  import "../chunk-NL5EB57E.js";
29
28
  import "../chunk-HSKKGAOW.js";
30
29
  import "../chunk-4QA5TIBU.js";
31
30
  import "../chunk-WJXWYSBT.js";
32
- import "../chunk-7UZUDHP7.js";
31
+ import "../chunk-CXWBVBDM.js";
33
32
  import "../chunk-XO6X5QE5.js";
34
33
  import "../chunk-KUV24B5M.js";
35
- import "../chunk-2XVLQDNI.js";
34
+ import "../chunk-HSLVCKVQ.js";
36
35
  import "../chunk-HEQVUIHQ.js";
37
36
  import "../chunk-U3IGFMCY.js";
38
37
  import "../chunk-HK53FRMU.js";
39
38
  import "../chunk-B7KZLXHV.js";
40
- import "../chunk-FKXD3EXJ.js";
41
- import "../chunk-YJ2URWF7.js";
39
+ import {
40
+ getDashboardData
41
+ } from "../chunk-DCVCFBQ7.js";
42
+ import "../chunk-N6A7A4RA.js";
43
+ import "../chunk-O5ZWS26C.js";
44
+ import "../chunk-XQK4S22C.js";
45
+ import "../chunk-FBZR46GC.js";
46
+ import "../chunk-TMTUTUEV.js";
47
+ import "../chunk-B6MYECV6.js";
42
48
  import "../chunk-ANXHMG32.js";
43
- import "../chunk-LMR7VAP3.js";
44
- import "../chunk-WJKD6EGK.js";
49
+ import "../chunk-MMTMXLI4.js";
50
+ import "../chunk-NUU3U43A.js";
45
51
  import "../chunk-6XWHJHNZ.js";
46
52
  import "../chunk-6PGL2XMY.js";
47
53
  import "../chunk-NPMMU4GY.js";
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  formatInstallationDisplay,
4
4
  getInstallationInfo
5
- } from "../chunk-FKXD3EXJ.js";
6
- import "../chunk-YJ2URWF7.js";
5
+ } from "../chunk-TMTUTUEV.js";
6
+ import "../chunk-B6MYECV6.js";
7
7
  import "../chunk-ANXHMG32.js";
8
8
  import {
9
9
  BaseCommand
10
- } from "../chunk-LMR7VAP3.js";
11
- import "../chunk-WJKD6EGK.js";
10
+ } from "../chunk-MMTMXLI4.js";
11
+ import "../chunk-NUU3U43A.js";
12
12
  import "../chunk-6XWHJHNZ.js";
13
13
  import {
14
14
  CLI_BIN_NAME,
@@ -1,24 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- getAgentDefinitions
4
- } from "../../chunk-CYPCJ536.js";
3
+ buildAgentPrompt,
4
+ invokeMetaAgent,
5
+ loadMetaAgent
6
+ } from "../../chunk-DCVCFBQ7.js";
7
+ import "../../chunk-N6A7A4RA.js";
8
+ import "../../chunk-O5ZWS26C.js";
9
+ import "../../chunk-XQK4S22C.js";
10
+ import "../../chunk-FBZR46GC.js";
5
11
  import {
6
12
  isClaudeCLIAvailable,
7
13
  loadConfigTypesDataInBackground,
8
14
  regenerateConfigTypes,
9
15
  resolveSource
10
- } from "../../chunk-FKXD3EXJ.js";
11
- import "../../chunk-YJ2URWF7.js";
16
+ } from "../../chunk-TMTUTUEV.js";
17
+ import "../../chunk-B6MYECV6.js";
12
18
  import "../../chunk-ANXHMG32.js";
13
19
  import {
14
20
  BaseCommand,
15
21
  EXIT_CODES
16
- } from "../../chunk-LMR7VAP3.js";
22
+ } from "../../chunk-MMTMXLI4.js";
17
23
  import {
18
- fileExists,
19
- getErrorMessage,
20
- readFile
21
- } from "../../chunk-WJKD6EGK.js";
24
+ getErrorMessage
25
+ } from "../../chunk-NUU3U43A.js";
22
26
  import "../../chunk-6XWHJHNZ.js";
23
27
  import {
24
28
  CLAUDE_DIR,
@@ -35,12 +39,9 @@ init_esm_shims();
35
39
  import { useState } from "react";
36
40
  import { Args, Flags } from "@oclif/core";
37
41
  import { TextInput } from "@inkjs/ui";
38
- import { spawn } from "child_process";
39
- import matter from "gray-matter";
40
42
  import { render, Box, Text, useApp, useInput } from "ink";
41
43
  import path from "path";
42
44
  import { jsx, jsxs } from "react/jsx-runtime";
43
- var META_AGENT_NAME = "agent-summoner";
44
45
  var SEPARATOR_WIDTH = 60;
45
46
  var PurposeInput = ({ onSubmit, onCancel }) => {
46
47
  const { exit } = useApp();
@@ -69,88 +70,6 @@ var PurposeInput = ({ onSubmit, onCancel }) => {
69
70
  error && /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.ERROR, children: error }) })
70
71
  ] });
71
72
  };
72
- function parseCompiledAgent(content) {
73
- const { data: frontmatter, content: body } = matter(content);
74
- const tools = typeof frontmatter.tools === "string" ? frontmatter.tools.split(",").map((t) => t.trim()) : frontmatter.tools;
75
- return {
76
- description: frontmatter.description || "Creates new agents",
77
- prompt: body.trim(),
78
- model: frontmatter.model,
79
- tools
80
- };
81
- }
82
- async function loadMetaAgent(projectDir, source, forceRefresh) {
83
- const compiledFileName = `${META_AGENT_NAME}.md`;
84
- const localAgentPath = path.join(projectDir, CLAUDE_DIR, "agents", compiledFileName);
85
- if (await fileExists(localAgentPath)) {
86
- return parseCompiledAgent(await readFile(localAgentPath));
87
- }
88
- try {
89
- const agentPaths = await getAgentDefinitions(source, { forceRefresh, projectDir });
90
- const remoteAgentPath = path.join(
91
- agentPaths.sourcePath,
92
- CLAUDE_DIR,
93
- "agents",
94
- compiledFileName
95
- );
96
- if (await fileExists(remoteAgentPath)) {
97
- return parseCompiledAgent(await readFile(remoteAgentPath));
98
- }
99
- } catch {
100
- }
101
- throw new Error(
102
- `Agent '${META_AGENT_NAME}' not found.
103
-
104
- Run 'compile' first to generate agents.`
105
- );
106
- }
107
- function buildAgentPrompt(agentName, purpose, outputDir) {
108
- return `Create a new Claude Code agent named "${agentName}" in the directory "${outputDir}".
109
-
110
- Agent Purpose: ${purpose}
111
-
112
- Requirements:
113
- 1. Create the agent directory structure at ${outputDir}/${agentName}/
114
- 2. Create metadata.yaml with appropriate configuration
115
- 3. Create intro.md with the agent's role and context
116
- 4. Create workflow.md with the agent's operational process
117
- 5. Optionally create examples.md if relevant examples would help
118
- 6. Optionally create critical-requirements.md for important rules
119
- 7. Include \`custom: true\` in the metadata.yaml configuration
120
-
121
- Follow the existing agent patterns in the codebase. Keep the agent focused and practical.`;
122
- }
123
- async function invokeMetaAgent(agentDef, prompt, nonInteractive) {
124
- const agentsJson = JSON.stringify({
125
- [META_AGENT_NAME]: {
126
- description: agentDef.description,
127
- prompt: agentDef.prompt,
128
- model: agentDef.model,
129
- tools: agentDef.tools
130
- }
131
- });
132
- const args = ["--agents", agentsJson, "--agent", META_AGENT_NAME];
133
- if (nonInteractive) {
134
- args.push("-p", prompt);
135
- } else {
136
- args.push("--prompt", prompt);
137
- }
138
- return new Promise((resolve, reject) => {
139
- const child = spawn("claude", args, {
140
- stdio: "inherit"
141
- });
142
- child.on("error", (error) => {
143
- reject(new Error(`Failed to spawn claude CLI: ${error.message}`));
144
- });
145
- child.on("close", (code) => {
146
- if (code === 0) {
147
- resolve();
148
- } else {
149
- reject(new Error(`Claude CLI exited with code ${code}`));
150
- }
151
- });
152
- });
153
- }
154
73
  var NewAgent = class _NewAgent extends BaseCommand {
155
74
  static summary = "Create a new custom agent using AI generation";
156
75
  static description = "Uses the agent-summoner meta-agent to scaffold a new agent with proper structure and documentation.";
@@ -222,14 +141,22 @@ var NewAgent = class _NewAgent extends BaseCommand {
222
141
  this.log("Fetching agent-summoner from source...");
223
142
  try {
224
143
  const sourceConfig = await resolveSource(flags.source, projectDir);
225
- const agentDef = await loadMetaAgent(projectDir, sourceConfig.source, flags.refresh);
144
+ const agentDef = await loadMetaAgent({
145
+ projectDir,
146
+ source: sourceConfig.source,
147
+ forceRefresh: flags.refresh
148
+ });
226
149
  this.log("Meta-agent loaded");
227
150
  this.log("");
228
151
  const agentPrompt = buildAgentPrompt(args.name, purpose, outputDir);
229
152
  this.log("Invoking agent-summoner to create your agent...");
230
153
  this.log("\u2500".repeat(SEPARATOR_WIDTH));
231
154
  this.log("");
232
- await invokeMetaAgent(agentDef, agentPrompt, flags["non-interactive"]);
155
+ await invokeMetaAgent({
156
+ agentDef,
157
+ prompt: agentPrompt,
158
+ nonInteractive: flags["non-interactive"]
159
+ });
233
160
  try {
234
161
  await regenerateConfigTypes(projectDir, configTypesReady, {
235
162
  extraAgentNames: [args.name]
@@ -246,7 +173,6 @@ var NewAgent = class _NewAgent extends BaseCommand {
246
173
  }
247
174
  };
248
175
  export {
249
- buildAgentPrompt,
250
176
  NewAgent as default
251
177
  };
252
178
  //# sourceMappingURL=agent.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/new/agent.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { Args, Flags } from \"@oclif/core\";\nimport { TextInput } from \"@inkjs/ui\";\nimport { spawn } from \"child_process\";\nimport matter from \"gray-matter\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport { CLAUDE_DIR, CLI_COLORS, STANDARD_FILES } from \"../../consts.js\";\nimport { getAgentDefinitions } from \"../../lib/agents/index.js\";\nimport { resolveSource } from \"../../lib/configuration/index.js\";\nimport {\n loadConfigTypesDataInBackground,\n regenerateConfigTypes,\n} from \"../../lib/configuration/config-types-writer.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { isClaudeCLIAvailable } from \"../../utils/exec.js\";\nimport { fileExists, readFile } from \"../../utils/fs.js\";\n\nconst META_AGENT_NAME = \"agent-summoner\";\nconst SEPARATOR_WIDTH = 60;\n\ntype NewAgentInput = {\n description: string;\n prompt: string;\n model?: string;\n tools?: string[];\n};\n\ntype PurposeInputProps = {\n onSubmit: (purpose: string) => void;\n onCancel: () => void;\n};\n\nconst PurposeInput: React.FC<PurposeInputProps> = ({ onSubmit, onCancel }) => {\n const { exit } = useApp();\n const [error, setError] = useState<string | null>(null);\n\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n exit();\n }\n });\n\n const handleSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n setError(\"Purpose is required\");\n return;\n }\n onSubmit(trimmed);\n exit();\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Create New Agent</Text>\n <Text>What should this agent do?</Text>\n <Text dimColor>e.g., Manages database migrations with rollback support</Text>\n <Text> </Text>\n <TextInput placeholder=\"Enter agent purpose...\" onSubmit={handleSubmit} />\n {error && (\n <Box marginTop={1}>\n <Text color={CLI_COLORS.ERROR}>{error}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nfunction parseCompiledAgent(content: string): NewAgentInput {\n const { data: frontmatter, content: body } = matter(content);\n const tools =\n typeof frontmatter.tools === \"string\"\n ? frontmatter.tools.split(\",\").map((t: string) => t.trim())\n : frontmatter.tools;\n\n return {\n description: frontmatter.description || \"Creates new agents\",\n prompt: body.trim(),\n model: frontmatter.model,\n tools,\n };\n}\n\nasync function loadMetaAgent(\n projectDir: string,\n source: string,\n forceRefresh: boolean,\n): Promise<NewAgentInput> {\n const compiledFileName = `${META_AGENT_NAME}.md`;\n\n // Check for compiled agent in the current project\n const localAgentPath = path.join(projectDir, CLAUDE_DIR, \"agents\", compiledFileName);\n if (await fileExists(localAgentPath)) {\n return parseCompiledAgent(await readFile(localAgentPath));\n }\n\n // Fall back to remote source (may not have agents)\n try {\n const agentPaths = await getAgentDefinitions(source, { forceRefresh, projectDir });\n const remoteAgentPath = path.join(\n agentPaths.sourcePath,\n CLAUDE_DIR,\n \"agents\",\n compiledFileName,\n );\n if (await fileExists(remoteAgentPath)) {\n return parseCompiledAgent(await readFile(remoteAgentPath));\n }\n } catch {\n // Source does not contain agents — fall through to error\n }\n\n throw new Error(\n `Agent '${META_AGENT_NAME}' not found.\\n\\n` + `Run 'compile' first to generate agents.`,\n );\n}\n\nexport function buildAgentPrompt(agentName: string, purpose: string, outputDir: string): string {\n return `Create a new Claude Code agent named \"${agentName}\" in the directory \"${outputDir}\".\n\nAgent Purpose: ${purpose}\n\nRequirements:\n1. Create the agent directory structure at ${outputDir}/${agentName}/\n2. Create metadata.yaml with appropriate configuration\n3. Create intro.md with the agent's role and context\n4. Create workflow.md with the agent's operational process\n5. Optionally create examples.md if relevant examples would help\n6. Optionally create critical-requirements.md for important rules\n7. Include \\`custom: true\\` in the metadata.yaml configuration\n\nFollow the existing agent patterns in the codebase. Keep the agent focused and practical.`;\n}\n\nasync function invokeMetaAgent(\n agentDef: NewAgentInput,\n prompt: string,\n nonInteractive: boolean,\n): Promise<void> {\n const agentsJson = JSON.stringify({\n [META_AGENT_NAME]: {\n description: agentDef.description,\n prompt: agentDef.prompt,\n model: agentDef.model,\n tools: agentDef.tools,\n },\n });\n\n const args = [\"--agents\", agentsJson, \"--agent\", META_AGENT_NAME];\n\n if (nonInteractive) {\n args.push(\"-p\", prompt);\n } else {\n args.push(\"--prompt\", prompt);\n }\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"claude\", args, {\n stdio: \"inherit\",\n });\n\n child.on(\"error\", (error) => {\n reject(new Error(`Failed to spawn claude CLI: ${error.message}`));\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Claude CLI exited with code ${code}`));\n }\n });\n });\n}\n\nexport default class NewAgent extends BaseCommand {\n static summary = \"Create a new custom agent using AI generation\";\n static description =\n \"Uses the agent-summoner meta-agent to scaffold a new agent with proper structure and documentation.\";\n\n static args = {\n name: Args.string({\n description: \"Name of the agent to create\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n purpose: Flags.string({\n char: \"p\",\n description: \"Purpose/description of the agent\",\n required: false,\n }),\n \"non-interactive\": Flags.boolean({\n char: \"n\",\n description: \"Run in non-interactive mode\",\n default: false,\n }),\n refresh: Flags.boolean({\n char: \"r\",\n description: \"Force refresh remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewAgent);\n const projectDir = process.cwd();\n\n // Kick off background loading for config-types.ts regeneration (non-blocking)\n const configTypesReady = loadConfigTypesDataInBackground(flags.source, projectDir);\n\n const cliAvailable = await isClaudeCLIAvailable();\n if (!cliAvailable) {\n this.error(\n \"Claude CLI not found. Please install it first:\\n\" +\n \" npm install -g @anthropic-ai/claude-code\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n let purpose = flags.purpose;\n\n if (!purpose) {\n let inputResult: string | null = null;\n let cancelled = false;\n\n const { waitUntilExit } = render(\n <PurposeInput\n onSubmit={(value) => {\n inputResult = value;\n }}\n onCancel={() => {\n cancelled = true;\n }}\n />,\n );\n\n await waitUntilExit();\n\n if (cancelled || !inputResult) {\n this.log(\"Cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n purpose = inputResult;\n }\n\n const outputDir = path.join(projectDir, CLAUDE_DIR, \"agents\", \"_custom\");\n\n this.log(\"\");\n this.log(`Agent name: ${args.name}`);\n this.log(`Purpose: ${purpose}`);\n this.log(`Output: ${outputDir}`);\n this.log(\"\");\n\n this.log(\"Fetching agent-summoner from source...\");\n\n try {\n const sourceConfig = await resolveSource(flags.source, projectDir);\n const agentDef = await loadMetaAgent(projectDir, sourceConfig.source, flags.refresh);\n this.log(\"Meta-agent loaded\");\n this.log(\"\");\n\n const agentPrompt = buildAgentPrompt(args.name, purpose, outputDir);\n\n this.log(\"Invoking agent-summoner to create your agent...\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.log(\"\");\n\n await invokeMetaAgent(agentDef, agentPrompt, flags[\"non-interactive\"]);\n\n // Regenerate config-types.ts to include the new agent\n try {\n await regenerateConfigTypes(projectDir, configTypesReady, {\n extraAgentNames: [args.name],\n });\n } catch (error) {\n this.warn(`Could not update ${STANDARD_FILES.CONFIG_TYPES_TS}: ${getErrorMessage(error)}`);\n }\n\n this.log(\"\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.logSuccess(\"Agent creation complete!\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/new/agent.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { Args, Flags } from \"@oclif/core\";\nimport { TextInput } from \"@inkjs/ui\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport { CLAUDE_DIR, CLI_COLORS, STANDARD_FILES } from \"../../consts.js\";\nimport { resolveSource } from \"../../lib/configuration/index.js\";\nimport {\n loadConfigTypesDataInBackground,\n regenerateConfigTypes,\n} from \"../../lib/configuration/config-types-writer.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { buildAgentPrompt, invokeMetaAgent, loadMetaAgent } from \"../../lib/operations/index.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { isClaudeCLIAvailable } from \"../../utils/exec.js\";\n\nconst SEPARATOR_WIDTH = 60;\n\ntype PurposeInputProps = {\n onSubmit: (purpose: string) => void;\n onCancel: () => void;\n};\n\nconst PurposeInput: React.FC<PurposeInputProps> = ({ onSubmit, onCancel }) => {\n const { exit } = useApp();\n const [error, setError] = useState<string | null>(null);\n\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n exit();\n }\n });\n\n const handleSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n setError(\"Purpose is required\");\n return;\n }\n onSubmit(trimmed);\n exit();\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Create New Agent</Text>\n <Text>What should this agent do?</Text>\n <Text dimColor>e.g., Manages database migrations with rollback support</Text>\n <Text> </Text>\n <TextInput placeholder=\"Enter agent purpose...\" onSubmit={handleSubmit} />\n {error && (\n <Box marginTop={1}>\n <Text color={CLI_COLORS.ERROR}>{error}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nexport default class NewAgent extends BaseCommand {\n static summary = \"Create a new custom agent using AI generation\";\n static description =\n \"Uses the agent-summoner meta-agent to scaffold a new agent with proper structure and documentation.\";\n\n static args = {\n name: Args.string({\n description: \"Name of the agent to create\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n purpose: Flags.string({\n char: \"p\",\n description: \"Purpose/description of the agent\",\n required: false,\n }),\n \"non-interactive\": Flags.boolean({\n char: \"n\",\n description: \"Run in non-interactive mode\",\n default: false,\n }),\n refresh: Flags.boolean({\n char: \"r\",\n description: \"Force refresh remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewAgent);\n const projectDir = process.cwd();\n\n // Kick off background loading for config-types.ts regeneration (non-blocking)\n const configTypesReady = loadConfigTypesDataInBackground(flags.source, projectDir);\n\n const cliAvailable = await isClaudeCLIAvailable();\n if (!cliAvailable) {\n this.error(\n \"Claude CLI not found. Please install it first:\\n\" +\n \" npm install -g @anthropic-ai/claude-code\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n let purpose = flags.purpose;\n\n if (!purpose) {\n let inputResult: string | null = null;\n let cancelled = false;\n\n const { waitUntilExit } = render(\n <PurposeInput\n onSubmit={(value) => {\n inputResult = value;\n }}\n onCancel={() => {\n cancelled = true;\n }}\n />,\n );\n\n await waitUntilExit();\n\n if (cancelled || !inputResult) {\n this.log(\"Cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n purpose = inputResult;\n }\n\n const outputDir = path.join(projectDir, CLAUDE_DIR, \"agents\", \"_custom\");\n\n this.log(\"\");\n this.log(`Agent name: ${args.name}`);\n this.log(`Purpose: ${purpose}`);\n this.log(`Output: ${outputDir}`);\n this.log(\"\");\n\n this.log(\"Fetching agent-summoner from source...\");\n\n try {\n const sourceConfig = await resolveSource(flags.source, projectDir);\n const agentDef = await loadMetaAgent({\n projectDir,\n source: sourceConfig.source,\n forceRefresh: flags.refresh,\n });\n this.log(\"Meta-agent loaded\");\n this.log(\"\");\n\n const agentPrompt = buildAgentPrompt(args.name, purpose, outputDir);\n\n this.log(\"Invoking agent-summoner to create your agent...\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.log(\"\");\n\n await invokeMetaAgent({\n agentDef,\n prompt: agentPrompt,\n nonInteractive: flags[\"non-interactive\"],\n });\n\n // Regenerate config-types.ts to include the new agent\n try {\n await regenerateConfigTypes(projectDir, configTypesReady, {\n extraAgentNames: [args.name],\n });\n } catch (error) {\n this.warn(`Could not update ${STANDARD_FILES.CONFIG_TYPES_TS}: ${getErrorMessage(error)}`);\n }\n\n this.log(\"\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.logSuccess(\"Agent creation complete!\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,31 +1,31 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- generateSkillCategoriesTs,
4
- generateSkillRulesTs
5
- } from "../../chunk-AABH2HSE.js";
6
2
  import {
7
3
  generateMarketplace,
8
4
  writeMarketplace
9
- } from "../../chunk-W7LHI54P.js";
5
+ } from "../../chunk-I44YG6VI.js";
6
+ import {
7
+ generateSkillCategoriesTs,
8
+ generateSkillRulesTs
9
+ } from "../../chunk-XQK4S22C.js";
10
10
  import {
11
11
  LOCAL_DEFAULTS,
12
12
  compileAllSkillPlugins,
13
13
  generateConfigSource,
14
14
  loadConfigTypesDataInBackground,
15
15
  regenerateConfigTypes
16
- } from "../../chunk-FKXD3EXJ.js";
17
- import "../../chunk-YJ2URWF7.js";
16
+ } from "../../chunk-TMTUTUEV.js";
17
+ import "../../chunk-B6MYECV6.js";
18
18
  import "../../chunk-ANXHMG32.js";
19
19
  import {
20
20
  BaseCommand,
21
21
  EXIT_CODES
22
- } from "../../chunk-LMR7VAP3.js";
22
+ } from "../../chunk-MMTMXLI4.js";
23
23
  import {
24
24
  directoryExists,
25
25
  ensureDir,
26
26
  getErrorMessage,
27
27
  writeFile
28
- } from "../../chunk-WJKD6EGK.js";
28
+ } from "../../chunk-NUU3U43A.js";
29
29
  import "../../chunk-6XWHJHNZ.js";
30
30
  import {
31
31
  CLAUDE_SRC_DIR,