teamcast 0.6.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 (344) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +654 -0
  3. package/dist/application/build-generated-files.d.ts +8 -0
  4. package/dist/application/build-generated-files.d.ts.map +1 -0
  5. package/dist/application/build-generated-files.js +16 -0
  6. package/dist/application/build-generated-files.js.map +1 -0
  7. package/dist/application/team.d.ts +27 -0
  8. package/dist/application/team.d.ts.map +1 -0
  9. package/dist/application/team.js +203 -0
  10. package/dist/application/team.js.map +1 -0
  11. package/dist/application/validate-team.d.ts +32 -0
  12. package/dist/application/validate-team.d.ts.map +1 -0
  13. package/dist/application/validate-team.js +132 -0
  14. package/dist/application/validate-team.js.map +1 -0
  15. package/dist/cli/diff.d.ts +3 -0
  16. package/dist/cli/diff.d.ts.map +1 -0
  17. package/dist/cli/diff.js +57 -0
  18. package/dist/cli/diff.js.map +1 -0
  19. package/dist/cli/explain.d.ts +3 -0
  20. package/dist/cli/explain.d.ts.map +1 -0
  21. package/dist/cli/explain.js +29 -0
  22. package/dist/cli/explain.js.map +1 -0
  23. package/dist/cli/generate.d.ts +3 -0
  24. package/dist/cli/generate.d.ts.map +1 -0
  25. package/dist/cli/generate.js +68 -0
  26. package/dist/cli/generate.js.map +1 -0
  27. package/dist/cli/import.d.ts +3 -0
  28. package/dist/cli/import.d.ts.map +1 -0
  29. package/dist/cli/import.js +93 -0
  30. package/dist/cli/import.js.map +1 -0
  31. package/dist/cli/index.d.ts +3 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +19 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/init.d.ts +3 -0
  36. package/dist/cli/init.d.ts.map +1 -0
  37. package/dist/cli/init.js +155 -0
  38. package/dist/cli/init.js.map +1 -0
  39. package/dist/cli/manage.d.ts +3 -0
  40. package/dist/cli/manage.d.ts.map +1 -0
  41. package/dist/cli/manage.js +350 -0
  42. package/dist/cli/manage.js.map +1 -0
  43. package/dist/cli/manifest-validation.d.ts +13 -0
  44. package/dist/cli/manifest-validation.d.ts.map +1 -0
  45. package/dist/cli/manifest-validation.js +38 -0
  46. package/dist/cli/manifest-validation.js.map +1 -0
  47. package/dist/cli/reset.d.ts +3 -0
  48. package/dist/cli/reset.d.ts.map +1 -0
  49. package/dist/cli/reset.js +116 -0
  50. package/dist/cli/reset.js.map +1 -0
  51. package/dist/cli/validate.d.ts +3 -0
  52. package/dist/cli/validate.d.ts.map +1 -0
  53. package/dist/cli/validate.js +48 -0
  54. package/dist/cli/validate.js.map +1 -0
  55. package/dist/components/agent-fragments.d.ts +15 -0
  56. package/dist/components/agent-fragments.d.ts.map +1 -0
  57. package/dist/components/agent-fragments.js +163 -0
  58. package/dist/components/agent-fragments.js.map +1 -0
  59. package/dist/components/policy-fragments.d.ts +5 -0
  60. package/dist/components/policy-fragments.d.ts.map +1 -0
  61. package/dist/components/policy-fragments.js +125 -0
  62. package/dist/components/policy-fragments.js.map +1 -0
  63. package/dist/core/assertions.d.ts +28 -0
  64. package/dist/core/assertions.d.ts.map +1 -0
  65. package/dist/core/assertions.js +11 -0
  66. package/dist/core/assertions.js.map +1 -0
  67. package/dist/core/guards.d.ts +11 -0
  68. package/dist/core/guards.d.ts.map +1 -0
  69. package/dist/core/guards.js +20 -0
  70. package/dist/core/guards.js.map +1 -0
  71. package/dist/core/index.d.ts +9 -0
  72. package/dist/core/index.d.ts.map +1 -0
  73. package/dist/core/index.js +9 -0
  74. package/dist/core/index.js.map +1 -0
  75. package/dist/core/instructions.d.ts +10 -0
  76. package/dist/core/instructions.d.ts.map +1 -0
  77. package/dist/core/instructions.js +33 -0
  78. package/dist/core/instructions.js.map +1 -0
  79. package/dist/core/permissions.d.ts +10 -0
  80. package/dist/core/permissions.d.ts.map +1 -0
  81. package/dist/core/permissions.js +67 -0
  82. package/dist/core/permissions.js.map +1 -0
  83. package/dist/core/policy-evaluator.d.ts +5 -0
  84. package/dist/core/policy-evaluator.d.ts.map +1 -0
  85. package/dist/core/policy-evaluator.js +161 -0
  86. package/dist/core/policy-evaluator.js.map +1 -0
  87. package/dist/core/skill-resolver.d.ts +8 -0
  88. package/dist/core/skill-resolver.d.ts.map +1 -0
  89. package/dist/core/skill-resolver.js +17 -0
  90. package/dist/core/skill-resolver.js.map +1 -0
  91. package/dist/core/skills.d.ts +4 -0
  92. package/dist/core/skills.d.ts.map +1 -0
  93. package/dist/core/skills.js +14 -0
  94. package/dist/core/skills.js.map +1 -0
  95. package/dist/core/types.d.ts +117 -0
  96. package/dist/core/types.d.ts.map +1 -0
  97. package/dist/core/types.js +6 -0
  98. package/dist/core/types.js.map +1 -0
  99. package/dist/detector/index.d.ts +7 -0
  100. package/dist/detector/index.d.ts.map +1 -0
  101. package/dist/detector/index.js +57 -0
  102. package/dist/detector/index.js.map +1 -0
  103. package/dist/diff/index.d.ts +10 -0
  104. package/dist/diff/index.d.ts.map +1 -0
  105. package/dist/diff/index.js +26 -0
  106. package/dist/diff/index.js.map +1 -0
  107. package/dist/explainer/index.d.ts +3 -0
  108. package/dist/explainer/index.d.ts.map +1 -0
  109. package/dist/explainer/index.js +85 -0
  110. package/dist/explainer/index.js.map +1 -0
  111. package/dist/generator/file-policies.d.ts +2 -0
  112. package/dist/generator/file-policies.d.ts.map +1 -0
  113. package/dist/generator/file-policies.js +4 -0
  114. package/dist/generator/file-policies.js.map +1 -0
  115. package/dist/generator/index.d.ts +5 -0
  116. package/dist/generator/index.d.ts.map +1 -0
  117. package/dist/generator/index.js +10 -0
  118. package/dist/generator/index.js.map +1 -0
  119. package/dist/generator/renderers/agent-md.d.ts +5 -0
  120. package/dist/generator/renderers/agent-md.d.ts.map +1 -0
  121. package/dist/generator/renderers/agent-md.js +66 -0
  122. package/dist/generator/renderers/agent-md.js.map +1 -0
  123. package/dist/generator/renderers/agents-md.d.ts +4 -0
  124. package/dist/generator/renderers/agents-md.d.ts.map +1 -0
  125. package/dist/generator/renderers/agents-md.js +86 -0
  126. package/dist/generator/renderers/agents-md.js.map +1 -0
  127. package/dist/generator/renderers/claude-md.d.ts +4 -0
  128. package/dist/generator/renderers/claude-md.d.ts.map +1 -0
  129. package/dist/generator/renderers/claude-md.js +68 -0
  130. package/dist/generator/renderers/claude-md.js.map +1 -0
  131. package/dist/generator/renderers/codex-config.d.ts +4 -0
  132. package/dist/generator/renderers/codex-config.d.ts.map +1 -0
  133. package/dist/generator/renderers/codex-config.js +145 -0
  134. package/dist/generator/renderers/codex-config.js.map +1 -0
  135. package/dist/generator/renderers/codex-skill-md.d.ts +4 -0
  136. package/dist/generator/renderers/codex-skill-md.d.ts.map +1 -0
  137. package/dist/generator/renderers/codex-skill-md.js +47 -0
  138. package/dist/generator/renderers/codex-skill-md.js.map +1 -0
  139. package/dist/generator/renderers/settings-json.d.ts +5 -0
  140. package/dist/generator/renderers/settings-json.d.ts.map +1 -0
  141. package/dist/generator/renderers/settings-json.js +100 -0
  142. package/dist/generator/renderers/settings-json.js.map +1 -0
  143. package/dist/generator/renderers/skill-md.d.ts +4 -0
  144. package/dist/generator/renderers/skill-md.d.ts.map +1 -0
  145. package/dist/generator/renderers/skill-md.js +44 -0
  146. package/dist/generator/renderers/skill-md.js.map +1 -0
  147. package/dist/generator/state.d.ts +14 -0
  148. package/dist/generator/state.d.ts.map +1 -0
  149. package/dist/generator/state.js +76 -0
  150. package/dist/generator/state.js.map +1 -0
  151. package/dist/generator/targets/claude.d.ts +3 -0
  152. package/dist/generator/targets/claude.d.ts.map +1 -0
  153. package/dist/generator/targets/claude.js +24 -0
  154. package/dist/generator/targets/claude.js.map +1 -0
  155. package/dist/generator/targets/codex.d.ts +3 -0
  156. package/dist/generator/targets/codex.d.ts.map +1 -0
  157. package/dist/generator/targets/codex.js +19 -0
  158. package/dist/generator/targets/codex.js.map +1 -0
  159. package/dist/generator/targets/index.d.ts +4 -0
  160. package/dist/generator/targets/index.d.ts.map +1 -0
  161. package/dist/generator/targets/index.js +10 -0
  162. package/dist/generator/targets/index.js.map +1 -0
  163. package/dist/generator/targets/types.d.ts +8 -0
  164. package/dist/generator/targets/types.d.ts.map +1 -0
  165. package/dist/generator/targets/types.js +2 -0
  166. package/dist/generator/targets/types.js.map +1 -0
  167. package/dist/generator/types.d.ts +11 -0
  168. package/dist/generator/types.d.ts.map +1 -0
  169. package/dist/generator/types.js +2 -0
  170. package/dist/generator/types.js.map +1 -0
  171. package/dist/generator/writer.d.ts +5 -0
  172. package/dist/generator/writer.d.ts.map +1 -0
  173. package/dist/generator/writer.js +14 -0
  174. package/dist/generator/writer.js.map +1 -0
  175. package/dist/importer/index.d.ts +12 -0
  176. package/dist/importer/index.d.ts.map +1 -0
  177. package/dist/importer/index.js +295 -0
  178. package/dist/importer/index.js.map +1 -0
  179. package/dist/index.d.ts +3 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +25 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/manifest/compat.d.ts +6 -0
  184. package/dist/manifest/compat.d.ts.map +1 -0
  185. package/dist/manifest/compat.js +56 -0
  186. package/dist/manifest/compat.js.map +1 -0
  187. package/dist/manifest/defaults.d.ts +4 -0
  188. package/dist/manifest/defaults.d.ts.map +1 -0
  189. package/dist/manifest/defaults.js +28 -0
  190. package/dist/manifest/defaults.js.map +1 -0
  191. package/dist/manifest/normalize.d.ts +14 -0
  192. package/dist/manifest/normalize.d.ts.map +1 -0
  193. package/dist/manifest/normalize.js +353 -0
  194. package/dist/manifest/normalize.js.map +1 -0
  195. package/dist/manifest/reader.d.ts +7 -0
  196. package/dist/manifest/reader.d.ts.map +1 -0
  197. package/dist/manifest/reader.js +36 -0
  198. package/dist/manifest/reader.js.map +1 -0
  199. package/dist/manifest/schema-validator.d.ts +13 -0
  200. package/dist/manifest/schema-validator.d.ts.map +1 -0
  201. package/dist/manifest/schema-validator.js +33 -0
  202. package/dist/manifest/schema-validator.js.map +1 -0
  203. package/dist/manifest/types.d.ts +150 -0
  204. package/dist/manifest/types.d.ts.map +1 -0
  205. package/dist/manifest/types.js +4 -0
  206. package/dist/manifest/types.js.map +1 -0
  207. package/dist/manifest/writer.d.ts +3 -0
  208. package/dist/manifest/writer.d.ts.map +1 -0
  209. package/dist/manifest/writer.js +10 -0
  210. package/dist/manifest/writer.js.map +1 -0
  211. package/dist/presets/index.d.ts +6 -0
  212. package/dist/presets/index.d.ts.map +1 -0
  213. package/dist/presets/index.js +56 -0
  214. package/dist/presets/index.js.map +1 -0
  215. package/dist/presets/types.d.ts +12 -0
  216. package/dist/presets/types.d.ts.map +1 -0
  217. package/dist/presets/types.js +2 -0
  218. package/dist/presets/types.js.map +1 -0
  219. package/dist/renderers/claude/agent-md.d.ts +5 -0
  220. package/dist/renderers/claude/agent-md.d.ts.map +1 -0
  221. package/dist/renderers/claude/agent-md.js +45 -0
  222. package/dist/renderers/claude/agent-md.js.map +1 -0
  223. package/dist/renderers/claude/docs.d.ts +5 -0
  224. package/dist/renderers/claude/docs.d.ts.map +1 -0
  225. package/dist/renderers/claude/docs.js +155 -0
  226. package/dist/renderers/claude/docs.js.map +1 -0
  227. package/dist/renderers/claude/index.d.ts +5 -0
  228. package/dist/renderers/claude/index.d.ts.map +1 -0
  229. package/dist/renderers/claude/index.js +23 -0
  230. package/dist/renderers/claude/index.js.map +1 -0
  231. package/dist/renderers/claude/policy-mapper.d.ts +10 -0
  232. package/dist/renderers/claude/policy-mapper.d.ts.map +1 -0
  233. package/dist/renderers/claude/policy-mapper.js +40 -0
  234. package/dist/renderers/claude/policy-mapper.js.map +1 -0
  235. package/dist/renderers/claude/settings.d.ts +5 -0
  236. package/dist/renderers/claude/settings.d.ts.map +1 -0
  237. package/dist/renderers/claude/settings.js +77 -0
  238. package/dist/renderers/claude/settings.js.map +1 -0
  239. package/dist/renderers/claude/skill-map.d.ts +16 -0
  240. package/dist/renderers/claude/skill-map.d.ts.map +1 -0
  241. package/dist/renderers/claude/skill-map.js +39 -0
  242. package/dist/renderers/claude/skill-map.js.map +1 -0
  243. package/dist/renderers/claude/skill-md.d.ts +4 -0
  244. package/dist/renderers/claude/skill-md.d.ts.map +1 -0
  245. package/dist/renderers/claude/skill-md.js +35 -0
  246. package/dist/renderers/claude/skill-md.js.map +1 -0
  247. package/dist/renderers/claude/tools.d.ts +4 -0
  248. package/dist/renderers/claude/tools.d.ts.map +1 -0
  249. package/dist/renderers/claude/tools.js +12 -0
  250. package/dist/renderers/claude/tools.js.map +1 -0
  251. package/dist/renderers/index.d.ts +3 -0
  252. package/dist/renderers/index.d.ts.map +1 -0
  253. package/dist/renderers/index.js +2 -0
  254. package/dist/renderers/index.js.map +1 -0
  255. package/dist/renderers/types.d.ts +12 -0
  256. package/dist/renderers/types.d.ts.map +1 -0
  257. package/dist/renderers/types.js +2 -0
  258. package/dist/renderers/types.js.map +1 -0
  259. package/dist/team-templates/policies.d.ts +4 -0
  260. package/dist/team-templates/policies.d.ts.map +1 -0
  261. package/dist/team-templates/policies.js +69 -0
  262. package/dist/team-templates/policies.js.map +1 -0
  263. package/dist/team-templates/presets.d.ts +6 -0
  264. package/dist/team-templates/presets.d.ts.map +1 -0
  265. package/dist/team-templates/presets.js +14 -0
  266. package/dist/team-templates/presets.js.map +1 -0
  267. package/dist/team-templates/roles.d.ts +22 -0
  268. package/dist/team-templates/roles.d.ts.map +1 -0
  269. package/dist/team-templates/roles.js +117 -0
  270. package/dist/team-templates/roles.js.map +1 -0
  271. package/dist/types/manifest.d.ts +11 -0
  272. package/dist/types/manifest.d.ts.map +1 -0
  273. package/dist/types/manifest.js +16 -0
  274. package/dist/types/manifest.js.map +1 -0
  275. package/dist/utils/chalk-helpers.d.ts +18 -0
  276. package/dist/utils/chalk-helpers.d.ts.map +1 -0
  277. package/dist/utils/chalk-helpers.js +51 -0
  278. package/dist/utils/chalk-helpers.js.map +1 -0
  279. package/dist/utils/prompts.d.ts +28 -0
  280. package/dist/utils/prompts.d.ts.map +1 -0
  281. package/dist/utils/prompts.js +51 -0
  282. package/dist/utils/prompts.js.map +1 -0
  283. package/dist/validator/checks/handoff-graph.d.ts +5 -0
  284. package/dist/validator/checks/handoff-graph.d.ts.map +1 -0
  285. package/dist/validator/checks/handoff-graph.js +65 -0
  286. package/dist/validator/checks/handoff-graph.js.map +1 -0
  287. package/dist/validator/checks/instruction-blocks.d.ts +5 -0
  288. package/dist/validator/checks/instruction-blocks.d.ts.map +1 -0
  289. package/dist/validator/checks/instruction-blocks.js +45 -0
  290. package/dist/validator/checks/instruction-blocks.js.map +1 -0
  291. package/dist/validator/checks/role-warnings.d.ts +5 -0
  292. package/dist/validator/checks/role-warnings.d.ts.map +1 -0
  293. package/dist/validator/checks/role-warnings.js +50 -0
  294. package/dist/validator/checks/role-warnings.js.map +1 -0
  295. package/dist/validator/checks/security-baseline.d.ts +3 -0
  296. package/dist/validator/checks/security-baseline.d.ts.map +1 -0
  297. package/dist/validator/checks/security-baseline.js +73 -0
  298. package/dist/validator/checks/security-baseline.js.map +1 -0
  299. package/dist/validator/checks/tool-conflicts.d.ts +5 -0
  300. package/dist/validator/checks/tool-conflicts.d.ts.map +1 -0
  301. package/dist/validator/checks/tool-conflicts.js +33 -0
  302. package/dist/validator/checks/tool-conflicts.js.map +1 -0
  303. package/dist/validator/index.d.ts +5 -0
  304. package/dist/validator/index.d.ts.map +1 -0
  305. package/dist/validator/index.js +28 -0
  306. package/dist/validator/index.js.map +1 -0
  307. package/dist/validator/reporter.d.ts +4 -0
  308. package/dist/validator/reporter.d.ts.map +1 -0
  309. package/dist/validator/reporter.js +76 -0
  310. package/dist/validator/reporter.js.map +1 -0
  311. package/dist/validator/types.d.ts +10 -0
  312. package/dist/validator/types.d.ts.map +1 -0
  313. package/dist/validator/types.js +2 -0
  314. package/dist/validator/types.js.map +1 -0
  315. package/dist/wizard/index.d.ts +7 -0
  316. package/dist/wizard/index.d.ts.map +1 -0
  317. package/dist/wizard/index.js +57 -0
  318. package/dist/wizard/index.js.map +1 -0
  319. package/dist/wizard/steps/agent-customization.d.ts +5 -0
  320. package/dist/wizard/steps/agent-customization.d.ts.map +1 -0
  321. package/dist/wizard/steps/agent-customization.js +68 -0
  322. package/dist/wizard/steps/agent-customization.js.map +1 -0
  323. package/dist/wizard/steps/confirm-generate.d.ts +3 -0
  324. package/dist/wizard/steps/confirm-generate.d.ts.map +1 -0
  325. package/dist/wizard/steps/confirm-generate.js +19 -0
  326. package/dist/wizard/steps/confirm-generate.js.map +1 -0
  327. package/dist/wizard/steps/custom-team.d.ts +3 -0
  328. package/dist/wizard/steps/custom-team.d.ts.map +1 -0
  329. package/dist/wizard/steps/custom-team.js +17 -0
  330. package/dist/wizard/steps/custom-team.js.map +1 -0
  331. package/dist/wizard/steps/project-context.d.ts +6 -0
  332. package/dist/wizard/steps/project-context.d.ts.map +1 -0
  333. package/dist/wizard/steps/project-context.js +24 -0
  334. package/dist/wizard/steps/project-context.js.map +1 -0
  335. package/dist/wizard/steps/team-selection.d.ts +5 -0
  336. package/dist/wizard/steps/team-selection.d.ts.map +1 -0
  337. package/dist/wizard/steps/team-selection.js +44 -0
  338. package/dist/wizard/steps/team-selection.js.map +1 -0
  339. package/package.json +56 -0
  340. package/schema/teamcast.schema.json +580 -0
  341. package/templates/presets/feature-team.yaml +77 -0
  342. package/templates/presets/research-and-build.yaml +69 -0
  343. package/templates/presets/secure-dev.yaml +93 -0
  344. package/templates/presets/solo-dev.yaml +32 -0
@@ -0,0 +1,93 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { importFromClaudeDir } from '../importer/index.js';
5
+ import { writeManifest } from '../manifest/writer.js';
6
+ import { detectProjectContext } from '../detector/index.js';
7
+ import { evaluateTeam, teamHasBlockingIssues, printManifestValidation, } from '../application/validate-team.js';
8
+ import { printHeader, printSuccess, printError, printWarning, printCommandSuccess, printNextSteps, } from '../utils/chalk-helpers.js';
9
+ import { promptConfirm } from '../utils/prompts.js';
10
+ export function registerImportCommand(program) {
11
+ program
12
+ .command('import')
13
+ .description('Import existing .claude/ configuration into teamcast.yaml')
14
+ .option('--yes', 'Skip confirmation prompt')
15
+ .action(async (options) => {
16
+ const cwd = process.cwd();
17
+ printHeader('Import');
18
+ const claudeDir = join(cwd, '.claude');
19
+ if (!existsSync(claudeDir)) {
20
+ printError('No .claude/ directory found', 'Nothing to import.');
21
+ process.exit(1);
22
+ }
23
+ const manifestPath = join(cwd, 'teamcast.yaml');
24
+ if (existsSync(manifestPath)) {
25
+ printError('teamcast.yaml already exists', 'Use "teamcast generate" to update from existing manifest.');
26
+ process.exit(1);
27
+ }
28
+ const ctx = detectProjectContext(cwd);
29
+ const projectName = ctx.name ?? 'my-project';
30
+ const result = importFromClaudeDir(cwd, projectName);
31
+ if (result.warnings.length > 0) {
32
+ for (const warning of result.warnings) {
33
+ printWarning(warning.file, warning.message);
34
+ }
35
+ console.log('');
36
+ }
37
+ const agentNames = Object.keys(result.team.agents);
38
+ if (agentNames.length === 0) {
39
+ printError('No agents found', 'No .claude/agents/*.md files to import.');
40
+ process.exit(1);
41
+ }
42
+ console.log(chalk.dim(` Found ${agentNames.length} agent${agentNames.length !== 1 ? 's' : ''}:`));
43
+ for (const name of agentNames) {
44
+ const agent = result.team.agents[name];
45
+ console.log(chalk.dim(` ${name} - ${agent.description}`));
46
+ }
47
+ if (result.team.policies) {
48
+ const parts = [];
49
+ if (result.team.policies.permissions)
50
+ parts.push('permissions');
51
+ if (result.team.policies.sandbox)
52
+ parts.push('sandbox');
53
+ if (result.team.policies.hooks)
54
+ parts.push('hooks');
55
+ if (parts.length > 0) {
56
+ console.log(chalk.dim(` Policies: ${parts.join(', ')}`));
57
+ }
58
+ }
59
+ console.log('');
60
+ const validation = evaluateTeam(result.team);
61
+ if (teamHasBlockingIssues(validation)) {
62
+ printManifestValidation(validation);
63
+ printError('Imported configuration has errors', 'Fix the issues above and try again.');
64
+ process.exit(1);
65
+ }
66
+ if (!options.yes) {
67
+ const confirmed = await promptConfirm({
68
+ message: 'Write teamcast.yaml with imported configuration?',
69
+ default: true,
70
+ });
71
+ if (!confirmed) {
72
+ console.log(chalk.dim('Aborted.'));
73
+ return;
74
+ }
75
+ }
76
+ try {
77
+ writeManifest(result.team, cwd);
78
+ }
79
+ catch (err) {
80
+ printError('Failed to write teamcast.yaml', String(err));
81
+ process.exit(1);
82
+ }
83
+ printSuccess('teamcast.yaml');
84
+ printManifestValidation(validation);
85
+ printCommandSuccess(`Imported ${agentNames.length} agent${agentNames.length !== 1 ? 's' : ''} from .claude/`);
86
+ printNextSteps([
87
+ `Run ${chalk.bold('teamcast validate')} to check the configuration`,
88
+ `Run ${chalk.bold('teamcast explain')} to see the team structure`,
89
+ `Edit ${chalk.bold('teamcast.yaml')} to customize, then run ${chalk.bold('teamcast generate')}`,
90
+ ]);
91
+ });
92
+ }
93
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/cli/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAllCommands(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS1D"}
@@ -0,0 +1,19 @@
1
+ import { registerInitCommand } from './init.js';
2
+ import { registerGenerateCommand } from './generate.js';
3
+ import { registerValidateCommand } from './validate.js';
4
+ import { registerExplainCommand } from './explain.js';
5
+ import { registerDiffCommand } from './diff.js';
6
+ import { registerManageCommands } from './manage.js';
7
+ import { registerResetCommand } from './reset.js';
8
+ import { registerImportCommand } from './import.js';
9
+ export function registerAllCommands(program) {
10
+ registerInitCommand(program);
11
+ registerGenerateCommand(program);
12
+ registerValidateCommand(program);
13
+ registerExplainCommand(program);
14
+ registerDiffCommand(program);
15
+ registerManageCommands(program);
16
+ registerResetCommand(program);
17
+ registerImportCommand(program);
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2B1D"}
@@ -0,0 +1,155 @@
1
+ import chalk from 'chalk';
2
+ import { readFileSync, existsSync } from 'fs';
3
+ import { parse } from 'yaml';
4
+ import { listPresets, loadPreset, applyPreset } from '../presets/index.js';
5
+ import { writeManifest } from '../manifest/writer.js';
6
+ import { generate } from '../generator/index.js';
7
+ import { detectProjectContext } from '../detector/index.js';
8
+ import { validateSchema } from '../manifest/schema-validator.js';
9
+ import { applyDefaults } from '../manifest/defaults.js';
10
+ import { evaluateTeam, teamHasBlockingIssues, printManifestValidation, } from '../application/validate-team.js';
11
+ import { printHeader, printSuccess, printError, printCommandSuccess, printNextSteps, } from '../utils/chalk-helpers.js';
12
+ import { runWizard } from '../wizard/index.js';
13
+ export function registerInitCommand(program) {
14
+ program
15
+ .command('init')
16
+ .description('Initialize an agent team configuration in the current project')
17
+ .option('--preset <name>', 'Skip the wizard and use a preset directly')
18
+ .option('--from <path>', 'Initialize from a custom YAML manifest file')
19
+ .option('--yes', 'Accept all defaults without prompting')
20
+ .action(async (options) => {
21
+ const cwd = process.cwd();
22
+ const ctx = detectProjectContext(cwd);
23
+ if (options.from) {
24
+ await initFromFile(options.from, cwd, ctx.name);
25
+ return;
26
+ }
27
+ if (options.preset) {
28
+ await initWithPreset(options.preset, cwd, ctx.name);
29
+ return;
30
+ }
31
+ await runWizard({
32
+ cwd,
33
+ skipConfirm: options.yes,
34
+ nonInteractive: options.yes,
35
+ });
36
+ });
37
+ }
38
+ async function initWithPreset(presetName, cwd, detectedName) {
39
+ printHeader('Init');
40
+ console.log(chalk.dim(`Using preset ${chalk.bold(presetName)}`));
41
+ console.log('');
42
+ let preset;
43
+ try {
44
+ preset = loadPreset(presetName);
45
+ }
46
+ catch (err) {
47
+ printError('Unknown preset', String(err));
48
+ console.log('');
49
+ console.log('Available presets:');
50
+ for (const entry of listPresets()) {
51
+ console.log(` ${chalk.bold(entry.name)} ${chalk.dim(entry.description)}`);
52
+ }
53
+ process.exit(1);
54
+ }
55
+ const projectName = detectedName ?? 'my-project';
56
+ const team = applyPreset(preset, projectName);
57
+ const validation = evaluateTeam(team);
58
+ if (teamHasBlockingIssues(validation)) {
59
+ printManifestValidation(validation);
60
+ process.exit(1);
61
+ }
62
+ try {
63
+ writeManifest(team, cwd);
64
+ }
65
+ catch (err) {
66
+ printError('Failed to write teamcast.yaml', String(err));
67
+ process.exit(1);
68
+ }
69
+ printHeader('Generate');
70
+ let files;
71
+ try {
72
+ files = generate(team, { cwd });
73
+ }
74
+ catch (err) {
75
+ printError('Generation failed', String(err));
76
+ process.exit(1);
77
+ }
78
+ for (const file of files) {
79
+ printSuccess(file.path);
80
+ }
81
+ printCommandSuccess(`Initialized "${presetName}" for project "${projectName}"`);
82
+ printManifestValidation(validation);
83
+ printNextSteps([
84
+ `Run ${chalk.bold('teamcast explain')} to see the team structure`,
85
+ `Open ${chalk.bold('teamcast.yaml')} to customize the team`,
86
+ ]);
87
+ }
88
+ async function initFromFile(filePath, cwd, detectedName) {
89
+ printHeader('Init');
90
+ console.log(chalk.dim(`Loading from ${chalk.bold(filePath)}`));
91
+ console.log('');
92
+ if (!existsSync(filePath)) {
93
+ printError('File not found', filePath);
94
+ process.exit(1);
95
+ }
96
+ let raw;
97
+ try {
98
+ raw = readFileSync(filePath, 'utf-8');
99
+ }
100
+ catch (err) {
101
+ printError('Failed to read file', String(err));
102
+ process.exit(1);
103
+ }
104
+ let parsed;
105
+ try {
106
+ parsed = parse(raw);
107
+ }
108
+ catch (err) {
109
+ printError('Failed to parse YAML', String(err));
110
+ process.exit(1);
111
+ }
112
+ const schemaResult = validateSchema(parsed);
113
+ if (!schemaResult.valid) {
114
+ printError('Schema validation failed', '');
115
+ for (const error of schemaResult.errors) {
116
+ console.error(chalk.dim(` ${error.path}: ${error.message}`));
117
+ }
118
+ process.exit(1);
119
+ }
120
+ const team = applyDefaults(schemaResult.data);
121
+ if (detectedName && team.project.name === 'my-project') {
122
+ team.project.name = detectedName;
123
+ }
124
+ const validation = evaluateTeam(team);
125
+ if (teamHasBlockingIssues(validation)) {
126
+ printManifestValidation(validation);
127
+ process.exit(1);
128
+ }
129
+ try {
130
+ writeManifest(team, cwd);
131
+ }
132
+ catch (err) {
133
+ printError('Failed to write teamcast.yaml', String(err));
134
+ process.exit(1);
135
+ }
136
+ printHeader('Generate');
137
+ let files;
138
+ try {
139
+ files = generate(team, { cwd });
140
+ }
141
+ catch (err) {
142
+ printError('Generation failed', String(err));
143
+ process.exit(1);
144
+ }
145
+ for (const file of files) {
146
+ printSuccess(file.path);
147
+ }
148
+ printCommandSuccess(`Initialized from ${filePath}`);
149
+ printManifestValidation(validation);
150
+ printNextSteps([
151
+ `Run ${chalk.bold('teamcast explain')} to see the team structure`,
152
+ `Open ${chalk.bold('teamcast.yaml')} to customize`,
153
+ ]);
154
+ }
155
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerManageCommands(program: Command): void;
3
+ //# sourceMappingURL=manage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manage.d.ts","sourceRoot":"","sources":["../../src/cli/manage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqKzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwM7D"}
@@ -0,0 +1,350 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync, rmSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { readManifest, ManifestError } from '../manifest/reader.js';
5
+ import { writeManifest } from '../manifest/writer.js';
6
+ import { generate } from '../generator/index.js';
7
+ import { printSuccess, printError, printHeader, printCommandSuccess, } from '../utils/chalk-helpers.js';
8
+ import { CLAUDE_CODE_TOOLS } from '../renderers/claude/tools.js';
9
+ import { evaluateTeam, teamHasBlockingIssues, printManifestValidation, } from '../application/validate-team.js';
10
+ import { promptCheckbox, promptConfirm, promptInput, promptList, } from '../utils/prompts.js';
11
+ import { createRoleAgent, isTeamRoleName, listRoleTemplates, } from '../team-templates/roles.js';
12
+ import { addAgentToTeam, assignSkillToAgents, buildCustomAgent, editAgentInTeam, invertToolSelection, removeAgentFromTeam, updateAgentBasics, } from '../application/team.js';
13
+ function loadTeamOrExit(cwd) {
14
+ try {
15
+ return readManifest(cwd);
16
+ }
17
+ catch (err) {
18
+ if (err instanceof ManifestError) {
19
+ console.error(chalk.red(`\nError: ${err.message}`));
20
+ if (err.details?.length) {
21
+ for (const detail of err.details) {
22
+ console.error(chalk.dim(` ${detail}`));
23
+ }
24
+ }
25
+ process.exit(1);
26
+ }
27
+ throw err;
28
+ }
29
+ }
30
+ function validateTeamOrExit(team) {
31
+ const validation = evaluateTeam(team);
32
+ if (teamHasBlockingIssues(validation)) {
33
+ printManifestValidation(validation);
34
+ process.exit(1);
35
+ }
36
+ return validation;
37
+ }
38
+ function printGeneratedFiles(paths) {
39
+ console.log('');
40
+ for (const path of paths) {
41
+ printSuccess(path);
42
+ }
43
+ }
44
+ function applyTeamChanges(cwd, team, options) {
45
+ const validation = validateTeamOrExit(team);
46
+ try {
47
+ writeManifest(team, cwd);
48
+ }
49
+ catch (err) {
50
+ printError('Failed to write teamcast.yaml', String(err));
51
+ process.exit(1);
52
+ }
53
+ if (options?.orphanedAgentFile && existsSync(options.orphanedAgentFile)) {
54
+ rmSync(options.orphanedAgentFile);
55
+ }
56
+ let files;
57
+ try {
58
+ files = generate(team, { cwd });
59
+ }
60
+ catch (err) {
61
+ printError('Generation failed', String(err));
62
+ process.exit(1);
63
+ }
64
+ printGeneratedFiles(files.map((file) => file.path));
65
+ printManifestValidation(validation);
66
+ }
67
+ function collectSkills(team) {
68
+ const skills = new Set();
69
+ for (const agent of Object.values(team.agents)) {
70
+ for (const skill of agent.runtime.skillDocs ?? []) {
71
+ skills.add(skill);
72
+ }
73
+ }
74
+ return skills;
75
+ }
76
+ function resolveTemplateAgent(name, template) {
77
+ if (!isTeamRoleName(template)) {
78
+ const available = listRoleTemplates().map((role) => role.name).join(', ');
79
+ printError('Unknown role template', `"${template}". Available templates: ${available}`);
80
+ process.exit(1);
81
+ }
82
+ return {
83
+ ...createRoleAgent(template),
84
+ id: name,
85
+ };
86
+ }
87
+ function applyEditOptions(current, options) {
88
+ let nextMaxTurns = current.runtime.maxTurns;
89
+ if (options.maxTurns !== undefined && options.maxTurns.trim() !== '') {
90
+ const parsed = parseInt(options.maxTurns.trim(), 10);
91
+ if (Number.isNaN(parsed) || parsed <= 0) {
92
+ printError('Invalid --max-turns', 'Must be a positive integer');
93
+ process.exit(1);
94
+ }
95
+ nextMaxTurns = parsed;
96
+ }
97
+ return updateAgentBasics(current, {
98
+ description: options.description,
99
+ model: options.model,
100
+ maxTurns: nextMaxTurns,
101
+ });
102
+ }
103
+ export function registerManageCommands(program) {
104
+ const addCmd = program.command('add').description('Add a resource to the team (subcommands: agent)');
105
+ addCmd
106
+ .command('agent <name>')
107
+ .description('Add a new agent to the team')
108
+ .option('--template <role>', 'Create agent from a built-in role template')
109
+ .action(async (name, options) => {
110
+ const cwd = process.cwd();
111
+ const team = loadTeamOrExit(cwd);
112
+ if (team.agents[name]) {
113
+ console.error(chalk.red(`\nAgent "${name}" already exists.`));
114
+ process.exit(1);
115
+ }
116
+ printHeader(`Add agent ${name}`);
117
+ const agent = options.template
118
+ ? resolveTemplateAgent(name, options.template)
119
+ : await promptAgentConfig(name);
120
+ const nextTeam = addAgentToTeam(team, name, agent);
121
+ applyTeamChanges(cwd, nextTeam);
122
+ printCommandSuccess(`Agent "${name}" added and configuration regenerated`);
123
+ });
124
+ const createCmd = program.command('create').description('Create a new resource');
125
+ createCmd
126
+ .command('skill <name>')
127
+ .description('Create a new skill (generates stub file in .claude/skills/)')
128
+ .action(async (name) => {
129
+ const cwd = process.cwd();
130
+ const team = loadTeamOrExit(cwd);
131
+ if (!/^[a-z][a-z0-9-]*$/.test(name)) {
132
+ printError('Invalid skill name', `"${name}" - must start with a letter, lowercase alphanumeric and hyphens only.`);
133
+ process.exit(1);
134
+ }
135
+ const allSkills = collectSkills(team);
136
+ if (allSkills.has(name)) {
137
+ const owners = Object.entries(team.agents)
138
+ .filter(([, agent]) => agent.runtime.skillDocs?.includes(name))
139
+ .map(([agentName]) => agentName);
140
+ printError(`Skill "${name}" already exists`, owners.length > 0 ? `Assigned to: ${owners.join(', ')}` : 'Defined but not assigned');
141
+ process.exit(1);
142
+ }
143
+ printHeader(`Create skill ${name}`);
144
+ if (allSkills.size > 0) {
145
+ console.log(chalk.dim(` Existing skills: ${[...allSkills].join(', ')}`));
146
+ console.log('');
147
+ }
148
+ const agentNames = Object.keys(team.agents);
149
+ const owner = await promptList({
150
+ message: 'Which agent should own this skill?',
151
+ choices: agentNames.map((agentName) => ({
152
+ name: `${agentName} - ${team.agents[agentName].description}`,
153
+ value: agentName,
154
+ })),
155
+ });
156
+ const nextTeam = assignSkillToAgents(team, name, [owner]);
157
+ applyTeamChanges(cwd, nextTeam);
158
+ printCommandSuccess(`Skill "${name}" created and assigned to ${owner}`);
159
+ });
160
+ const assignCmd = program.command('assign').description('Assign a resource to agents');
161
+ assignCmd
162
+ .command('skill <name>')
163
+ .description('Assign an existing skill to one or more agents')
164
+ .action(async (name) => {
165
+ const cwd = process.cwd();
166
+ const team = loadTeamOrExit(cwd);
167
+ const agentNames = Object.keys(team.agents);
168
+ const allSkills = collectSkills(team);
169
+ if (!allSkills.has(name)) {
170
+ printError(`Skill "${name}" does not exist`, `Available skills: ${allSkills.size > 0 ? [...allSkills].join(', ') : '(none)'}. Use "create skill" first.`);
171
+ process.exit(1);
172
+ }
173
+ const alreadyAssigned = agentNames.filter((agentName) => team.agents[agentName].runtime.skillDocs?.includes(name));
174
+ const available = agentNames.filter((agentName) => !team.agents[agentName].runtime.skillDocs?.includes(name));
175
+ if (available.length === 0) {
176
+ printError(`Skill "${name}" is already assigned to all agents`, alreadyAssigned.join(', '));
177
+ process.exit(1);
178
+ }
179
+ printHeader(`Assign skill ${name}`);
180
+ if (alreadyAssigned.length > 0) {
181
+ console.log(chalk.dim(` Already assigned to: ${alreadyAssigned.join(', ')}`));
182
+ console.log('');
183
+ }
184
+ const selectedAgents = await promptCheckbox({
185
+ message: 'Assign to which agents?',
186
+ choices: available.map((agentName) => ({
187
+ name: `${agentName} - ${team.agents[agentName].description}`,
188
+ value: agentName,
189
+ })),
190
+ validate: (selected) => selected.length > 0 || 'Select at least one agent',
191
+ });
192
+ const nextTeam = assignSkillToAgents(team, name, selectedAgents);
193
+ applyTeamChanges(cwd, nextTeam);
194
+ printCommandSuccess(`Skill "${name}" assigned to ${selectedAgents.join(', ')}`);
195
+ });
196
+ const removeCmd = program.command('remove').description('Remove a resource from the team (subcommands: agent)');
197
+ removeCmd
198
+ .command('agent <name>')
199
+ .description('Remove an agent from the team')
200
+ .option('--yes', 'Skip confirmation')
201
+ .action(async (name, options) => {
202
+ const cwd = process.cwd();
203
+ const team = loadTeamOrExit(cwd);
204
+ if (!team.agents[name]) {
205
+ console.error(chalk.red(`\nAgent "${name}" not found.`));
206
+ console.error(chalk.dim(`Available agents: ${Object.keys(team.agents).join(', ')}`));
207
+ process.exit(1);
208
+ }
209
+ const confirmed = options.yes ?? await promptConfirm({
210
+ message: `Remove agent "${name}"? This will also remove it from any handoffs.`,
211
+ default: false,
212
+ });
213
+ if (!confirmed) {
214
+ console.log(chalk.dim('Aborted.'));
215
+ return;
216
+ }
217
+ const nextTeam = removeAgentFromTeam(team, name);
218
+ applyTeamChanges(cwd, nextTeam, { orphanedAgentFile: join(cwd, `.claude/agents/${name}.md`) });
219
+ printCommandSuccess(`Agent "${name}" removed and configuration regenerated`);
220
+ });
221
+ const editCmd = program.command('edit').description('Edit a resource in the team (subcommands: agent)');
222
+ editCmd
223
+ .command('agent <name>')
224
+ .description('Edit an existing agent configuration')
225
+ .option('--description <text>', 'Update the agent description')
226
+ .option('--model <model>', 'Update the model')
227
+ .option('--max-turns <number>', 'Update max turns')
228
+ .action(async (name, options) => {
229
+ const cwd = process.cwd();
230
+ const team = loadTeamOrExit(cwd);
231
+ const agent = team.agents[name];
232
+ if (!agent) {
233
+ console.error(chalk.red(`\nAgent "${name}" not found.`));
234
+ console.error(chalk.dim(`Available agents: ${Object.keys(team.agents).join(', ')}`));
235
+ process.exit(1);
236
+ }
237
+ printHeader(`Edit agent ${name}`);
238
+ console.log(chalk.dim(` description: ${agent.description}`));
239
+ console.log(chalk.dim(` model: ${agent.runtime.model ?? 'inherit'}`));
240
+ if (agent.runtime.tools?.length) {
241
+ console.log(chalk.dim(` tools: ${agent.runtime.tools.join(', ')}`));
242
+ }
243
+ if (agent.runtime.disallowedTools?.length) {
244
+ console.log(chalk.dim(` disallowed_tools: ${agent.runtime.disallowedTools.join(', ')}`));
245
+ }
246
+ console.log('');
247
+ const hasDirectEdits = options.description !== undefined || options.model !== undefined || options.maxTurns !== undefined;
248
+ const updated = hasDirectEdits
249
+ ? applyEditOptions(agent, options)
250
+ : await promptEditAgent(agent);
251
+ applyTeamChanges(cwd, editAgentInTeam(team, name, updated));
252
+ printCommandSuccess(`Agent "${name}" updated and configuration regenerated`);
253
+ });
254
+ }
255
+ async function promptAgentConfig(name) {
256
+ const description = await promptInput({
257
+ message: 'Agent description (when should Claude delegate to this agent?):',
258
+ validate: (value) => value.trim().length > 0 || 'Description is required',
259
+ });
260
+ const model = await promptList({
261
+ message: 'Model:',
262
+ choices: [
263
+ { name: 'sonnet (recommended - fast, capable)', value: 'sonnet' },
264
+ { name: 'opus (most capable, slower)', value: 'opus' },
265
+ { name: 'haiku (fastest, lightweight tasks)', value: 'haiku' },
266
+ ],
267
+ default: 'sonnet',
268
+ });
269
+ const canWrite = await promptConfirm({
270
+ message: 'Can this agent write/edit files?',
271
+ default: true,
272
+ });
273
+ const canBash = await promptConfirm({
274
+ message: 'Can this agent run shell commands?',
275
+ default: false,
276
+ });
277
+ const canWeb = await promptConfirm({
278
+ message: 'Can this agent access the internet?',
279
+ default: false,
280
+ });
281
+ const canDelegate = await promptConfirm({
282
+ message: 'Can this agent delegate to other agents?',
283
+ default: false,
284
+ });
285
+ return buildCustomAgent({
286
+ name,
287
+ description,
288
+ model,
289
+ canWrite,
290
+ canBash,
291
+ canWeb,
292
+ canDelegate,
293
+ });
294
+ }
295
+ async function promptEditAgent(current) {
296
+ const currentAllow = current.runtime.tools ?? [];
297
+ const description = await promptInput({
298
+ message: 'Description:',
299
+ default: current.description,
300
+ validate: (value) => value.trim().length > 0 || 'Description is required',
301
+ });
302
+ const model = await promptList({
303
+ message: 'Model:',
304
+ choices: [
305
+ { name: 'sonnet (recommended - fast, capable)', value: 'sonnet' },
306
+ { name: 'opus (most capable, slower)', value: 'opus' },
307
+ { name: 'haiku (fastest, lightweight tasks)', value: 'haiku' },
308
+ { name: 'inherit (use project default)', value: 'inherit' },
309
+ ],
310
+ default: current.runtime.model ?? 'inherit',
311
+ });
312
+ const maxTurnsInput = await promptInput({
313
+ message: 'Max turns (leave empty to keep current):',
314
+ default: current.runtime.maxTurns?.toString() ?? '',
315
+ validate: (value) => {
316
+ if (value.trim() === '')
317
+ return true;
318
+ const parsed = parseInt(value.trim(), 10);
319
+ return (!Number.isNaN(parsed) && parsed > 0) || 'Must be a positive integer or empty';
320
+ },
321
+ });
322
+ const customizeTools = await promptConfirm({
323
+ message: 'Customize tools?',
324
+ default: false,
325
+ });
326
+ let tools = current.runtime.tools;
327
+ let disallowedTools = current.runtime.disallowedTools;
328
+ if (customizeTools) {
329
+ const allowList = await promptCheckbox({
330
+ message: 'Select allowed tools:',
331
+ choices: CLAUDE_CODE_TOOLS.map((tool) => ({
332
+ name: tool,
333
+ value: tool,
334
+ checked: currentAllow.includes(tool),
335
+ })),
336
+ validate: (selected) => selected.length > 0 || 'Select at least one tool',
337
+ });
338
+ tools = allowList;
339
+ disallowedTools = invertToolSelection(tools ?? []);
340
+ }
341
+ const maxTurns = maxTurnsInput.trim() ? parseInt(maxTurnsInput.trim(), 10) : undefined;
342
+ return updateAgentBasics(current, {
343
+ description,
344
+ model,
345
+ maxTurns: maxTurns ?? current.runtime.maxTurns,
346
+ tools,
347
+ disallowedTools,
348
+ });
349
+ }
350
+ //# sourceMappingURL=manage.js.map