@agents-inc/cli 0.77.0 → 0.79.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 (136) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/{chunk-ZIZFTSQY.js → chunk-7HGMFJ4Y.js} +2 -2
  3. package/dist/{chunk-R6QNVMN5.js → chunk-B4C2S5LP.js} +11 -11
  4. package/dist/{chunk-R6QNVMN5.js.map → chunk-B4C2S5LP.js.map} +1 -1
  5. package/dist/{chunk-B66E255O.js → chunk-D4T3HHE7.js} +3 -3
  6. package/dist/chunk-D4T3HHE7.js.map +1 -0
  7. package/dist/{chunk-KMLJCO5H.js → chunk-F4IZ3UAS.js} +15 -21
  8. package/dist/chunk-F4IZ3UAS.js.map +1 -0
  9. package/dist/{chunk-XU6N3OIS.js → chunk-HANGA633.js} +2 -6
  10. package/dist/{chunk-XU6N3OIS.js.map → chunk-HANGA633.js.map} +1 -1
  11. package/dist/{chunk-2I5SXGXR.js → chunk-KQDGLEBF.js} +80 -5
  12. package/dist/chunk-KQDGLEBF.js.map +1 -0
  13. package/dist/{chunk-G3YSDQJ2.js → chunk-KVRR4PEJ.js} +46 -37
  14. package/dist/chunk-KVRR4PEJ.js.map +1 -0
  15. package/dist/{chunk-J5OOAKB5.js → chunk-LVBRC2CP.js} +1 -5
  16. package/dist/chunk-LVBRC2CP.js.map +1 -0
  17. package/dist/chunk-N2XGUAJU.js +34 -0
  18. package/dist/{chunk-KB57OPUL.js.map → chunk-N2XGUAJU.js.map} +1 -1
  19. package/dist/{chunk-CY23HPDE.js → chunk-N34D3ROY.js} +10 -11
  20. package/dist/chunk-N34D3ROY.js.map +1 -0
  21. package/dist/{chunk-PDYKGJGR.js → chunk-NKLNT7N7.js} +3 -20
  22. package/dist/chunk-NKLNT7N7.js.map +1 -0
  23. package/dist/{chunk-CZLXZ75E.js → chunk-OIHZ2YH3.js} +107 -69
  24. package/dist/chunk-OIHZ2YH3.js.map +1 -0
  25. package/dist/{chunk-SGKNE6EJ.js → chunk-OOWNDQCG.js} +2 -2
  26. package/dist/{chunk-WMTYOK4E.js → chunk-OTMIGYBB.js} +48 -6
  27. package/dist/chunk-OTMIGYBB.js.map +1 -0
  28. package/dist/chunk-PZERKWE2.js +114 -0
  29. package/dist/chunk-PZERKWE2.js.map +1 -0
  30. package/dist/{chunk-N4KD5PBX.js → chunk-Q755X6QF.js} +2 -2
  31. package/dist/{chunk-AQ5KP4YW.js → chunk-QD3GQ2CH.js} +3 -3
  32. package/dist/{chunk-ERHTXNIF.js → chunk-RU5XLS5Q.js} +1 -5
  33. package/dist/{chunk-ERHTXNIF.js.map → chunk-RU5XLS5Q.js.map} +1 -1
  34. package/dist/{chunk-UZHD4DBD.js → chunk-SJNUTUSJ.js} +2 -2
  35. package/dist/{chunk-5DDHCCEB.js → chunk-VDVLM3KB.js} +42 -4
  36. package/dist/chunk-VDVLM3KB.js.map +1 -0
  37. package/dist/{chunk-CTZ4GEAD.js → chunk-W46L2PXK.js} +17 -8
  38. package/dist/chunk-W46L2PXK.js.map +1 -0
  39. package/dist/{chunk-A6XMJT2Q.js → chunk-YFHVP3VA.js} +3 -10
  40. package/dist/chunk-YFHVP3VA.js.map +1 -0
  41. package/dist/commands/build/plugins.js +2 -2
  42. package/dist/commands/build/stack.js +2 -2
  43. package/dist/commands/compile.js +32 -16
  44. package/dist/commands/compile.js.map +1 -1
  45. package/dist/commands/config/index.js +2 -2
  46. package/dist/commands/config/path.js +1 -1
  47. package/dist/commands/config/show.js +2 -2
  48. package/dist/commands/diff.js +29 -9
  49. package/dist/commands/diff.js.map +1 -1
  50. package/dist/commands/doctor.js +18 -6
  51. package/dist/commands/doctor.js.map +1 -1
  52. package/dist/commands/edit.js +37 -27
  53. package/dist/commands/edit.js.map +1 -1
  54. package/dist/commands/eject.js +1 -1
  55. package/dist/commands/import/skill.js +1 -1
  56. package/dist/commands/info.js +1 -1
  57. package/dist/commands/init.js +18 -18
  58. package/dist/commands/list.js +1 -1
  59. package/dist/commands/new/agent.js +2 -2
  60. package/dist/commands/new/marketplace.js +2 -2
  61. package/dist/commands/new/skill.js +2 -2
  62. package/dist/commands/outdated.js +12 -4
  63. package/dist/commands/outdated.js.map +1 -1
  64. package/dist/commands/search.js +1 -1
  65. package/dist/commands/uninstall.js +9 -21
  66. package/dist/commands/uninstall.js.map +1 -1
  67. package/dist/commands/update.js +20 -10
  68. package/dist/commands/update.js.map +1 -1
  69. package/dist/commands/validate.js +1 -1
  70. package/dist/components/wizard/category-grid.js +1 -1
  71. package/dist/components/wizard/category-grid.test.js +3 -3
  72. package/dist/components/wizard/checkbox-grid.js +1 -2
  73. package/dist/components/wizard/checkbox-grid.test.js +2 -4
  74. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  75. package/dist/components/wizard/domain-selection.js +4 -5
  76. package/dist/components/wizard/source-grid.js +1 -1
  77. package/dist/components/wizard/source-grid.test.js +3 -3
  78. package/dist/components/wizard/stack-selection.js +3 -3
  79. package/dist/components/wizard/stats-panel.js +12 -0
  80. package/dist/components/wizard/step-agents.js +3 -4
  81. package/dist/components/wizard/step-agents.test.js +7 -6
  82. package/dist/components/wizard/step-agents.test.js.map +1 -1
  83. package/dist/components/wizard/step-build.js +5 -6
  84. package/dist/components/wizard/step-build.test.js +23 -23
  85. package/dist/components/wizard/step-build.test.js.map +1 -1
  86. package/dist/components/wizard/step-confirm.js +1 -3
  87. package/dist/components/wizard/step-confirm.test.js +17 -16
  88. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  89. package/dist/components/wizard/step-refine.js +1 -2
  90. package/dist/components/wizard/step-refine.test.js +1 -2
  91. package/dist/components/wizard/step-refine.test.js.map +1 -1
  92. package/dist/components/wizard/step-settings.js +2 -3
  93. package/dist/components/wizard/step-settings.test.js +8 -9
  94. package/dist/components/wizard/step-settings.test.js.map +1 -1
  95. package/dist/components/wizard/step-sources.js +4 -5
  96. package/dist/components/wizard/step-sources.test.js +7 -9
  97. package/dist/components/wizard/step-sources.test.js.map +1 -1
  98. package/dist/components/wizard/step-stack.js +6 -7
  99. package/dist/components/wizard/step-stack.test.js +16 -15
  100. package/dist/components/wizard/step-stack.test.js.map +1 -1
  101. package/dist/components/wizard/view-title.js +21 -3
  102. package/dist/components/wizard/view-title.js.map +1 -1
  103. package/dist/components/wizard/wizard-layout.js +5 -4
  104. package/dist/components/wizard/wizard-tabs.js +1 -1
  105. package/dist/components/wizard/wizard-tabs.test.js +1 -1
  106. package/dist/components/wizard/wizard.js +17 -17
  107. package/dist/hooks/init.js +18 -18
  108. package/dist/{source-loader-H3QLG5AE.js → source-loader-D3VIG3GM.js} +2 -2
  109. package/dist/{source-manager-ZDBUHGIR.js → source-manager-FPYFJRR7.js} +2 -2
  110. package/dist/source-manager-FPYFJRR7.js.map +1 -0
  111. package/dist/stores/wizard-store.js +2 -2
  112. package/dist/stores/wizard-store.test.js +4 -4
  113. package/dist/stores/wizard-store.test.js.map +1 -1
  114. package/package.json +1 -1
  115. package/dist/chunk-2I5SXGXR.js.map +0 -1
  116. package/dist/chunk-5DDHCCEB.js.map +0 -1
  117. package/dist/chunk-A6XMJT2Q.js.map +0 -1
  118. package/dist/chunk-B66E255O.js.map +0 -1
  119. package/dist/chunk-CTZ4GEAD.js.map +0 -1
  120. package/dist/chunk-CY23HPDE.js.map +0 -1
  121. package/dist/chunk-CZLXZ75E.js.map +0 -1
  122. package/dist/chunk-G3YSDQJ2.js.map +0 -1
  123. package/dist/chunk-J5OOAKB5.js.map +0 -1
  124. package/dist/chunk-JNQKCZA3.js +0 -28
  125. package/dist/chunk-JNQKCZA3.js.map +0 -1
  126. package/dist/chunk-KB57OPUL.js +0 -40
  127. package/dist/chunk-KMLJCO5H.js.map +0 -1
  128. package/dist/chunk-PDYKGJGR.js.map +0 -1
  129. package/dist/chunk-WMTYOK4E.js.map +0 -1
  130. /package/dist/{chunk-ZIZFTSQY.js.map → chunk-7HGMFJ4Y.js.map} +0 -0
  131. /package/dist/{chunk-SGKNE6EJ.js.map → chunk-OOWNDQCG.js.map} +0 -0
  132. /package/dist/{chunk-N4KD5PBX.js.map → chunk-Q755X6QF.js.map} +0 -0
  133. /package/dist/{chunk-AQ5KP4YW.js.map → chunk-QD3GQ2CH.js.map} +0 -0
  134. /package/dist/{chunk-UZHD4DBD.js.map → chunk-SJNUTUSJ.js.map} +0 -0
  135. /package/dist/{source-loader-H3QLG5AE.js.map → components/wizard/stats-panel.js.map} +0 -0
  136. /package/dist/{source-manager-ZDBUHGIR.js.map → source-loader-D3VIG3GM.js.map} +0 -0
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-N6S7ZRIL.js";
5
5
  import {
6
6
  recompileAgents
7
- } from "../chunk-UZHD4DBD.js";
7
+ } from "../chunk-SJNUTUSJ.js";
8
8
  import {
9
9
  ERROR_MESSAGES,
10
10
  INFO_MESSAGES,
@@ -15,7 +15,7 @@ import {
15
15
  compareLocalSkillsWithSource,
16
16
  injectForkedFromMetadata,
17
17
  loadSkillsMatrixFromSource
18
- } from "../chunk-CZLXZ75E.js";
18
+ } from "../chunk-OIHZ2YH3.js";
19
19
  import "../chunk-IFCASC6R.js";
20
20
  import {
21
21
  matrix
@@ -44,6 +44,7 @@ init_esm_shims();
44
44
  import { Flags, Args } from "@oclif/core";
45
45
  import { printTable } from "@oclif/table";
46
46
  import { render } from "ink";
47
+ import os from "os";
47
48
  import path from "path";
48
49
  import { jsx } from "react/jsx-runtime";
49
50
  async function updateSkill(skill, projectDir, sourceResult) {
@@ -129,8 +130,12 @@ var Update = class _Update extends BaseCommand {
129
130
  const projectDir = process.cwd();
130
131
  const shouldRecompile = !flags["no-recompile"];
131
132
  try {
132
- const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);
133
- if (!await fileExists(localSkillsPath)) {
133
+ const projectLocalPath = path.join(projectDir, LOCAL_SKILLS_PATH);
134
+ const homeDir = os.homedir();
135
+ const globalLocalPath = path.join(homeDir, LOCAL_SKILLS_PATH);
136
+ const hasProject = await fileExists(projectLocalPath);
137
+ const hasGlobal = projectDir !== homeDir && await fileExists(globalLocalPath);
138
+ if (!hasProject && !hasGlobal) {
134
139
  this.warn(ERROR_MESSAGES.NO_LOCAL_SKILLS);
135
140
  return;
136
141
  }
@@ -149,11 +154,15 @@ var Update = class _Update extends BaseCommand {
149
154
  sourceSkills[skillId] = { path: skill.path };
150
155
  }
151
156
  }
152
- const allResults = await compareLocalSkillsWithSource(
153
- projectDir,
154
- sourceResult.sourcePath,
155
- sourceSkills
156
- );
157
+ const projectResults = hasProject ? await compareLocalSkillsWithSource(projectDir, sourceResult.sourcePath, sourceSkills) : [];
158
+ const globalResults = hasGlobal ? await compareLocalSkillsWithSource(homeDir, sourceResult.sourcePath, sourceSkills) : [];
159
+ const skillBaseDir = /* @__PURE__ */ new Map();
160
+ for (const r of projectResults) skillBaseDir.set(r.id, projectDir);
161
+ for (const r of globalResults) {
162
+ if (!skillBaseDir.has(r.id)) skillBaseDir.set(r.id, homeDir);
163
+ }
164
+ const seenIds = new Set(projectResults.map((r) => r.id));
165
+ const allResults = [...projectResults, ...globalResults.filter((r) => !seenIds.has(r.id))];
157
166
  let outdatedSkills = allResults.filter((r) => r.status === "outdated");
158
167
  if (args.skill) {
159
168
  const foundSkill = findSkillByPartialMatch(args.skill, allResults);
@@ -247,7 +256,8 @@ var Update = class _Update extends BaseCommand {
247
256
  const failed = [];
248
257
  for (const skill of outdatedSkills) {
249
258
  this.log(`Updating ${skill.id}...`);
250
- const result = await updateSkill(skill, projectDir, sourceResult);
259
+ const baseDir = skillBaseDir.get(skill.id) ?? projectDir;
260
+ const result = await updateSkill(skill, baseDir, sourceResult);
251
261
  if (result.success) {
252
262
  this.log(` Updated ${skill.id}`);
253
263
  updated.push(skill.id);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/update.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags, Args } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport { render } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../lib/loading/index.js\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { recompileAgents } from \"../lib/agents/index.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n compareLocalSkillsWithSource,\n injectForkedFromMetadata,\n type SkillComparisonResult,\n} from \"../lib/skills/index.js\";\nimport { fileExists, copy } from \"../utils/fs.js\";\nimport { CLI_BIN_NAME, LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport {\n ERROR_MESSAGES,\n SUCCESS_MESSAGES,\n STATUS_MESSAGES,\n INFO_MESSAGES,\n} from \"../utils/messages.js\";\nimport { Confirm } from \"../components/common/confirm.js\";\n\nasync function updateSkill(\n skill: SkillComparisonResult,\n projectDir: string,\n sourceResult: SourceLoadResult,\n): Promise<{ success: boolean; newHash: string | null; error?: string }> {\n if (!skill.sourcePath || !skill.sourceHash) {\n return { success: false, newHash: null, error: \"No source path available\" };\n }\n\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const destPath = path.join(localSkillsPath, skill.dirName);\n const srcPath = path.join(sourceResult.sourcePath, \"src\", skill.sourcePath);\n\n try {\n await copy(srcPath, destPath);\n await injectForkedFromMetadata(destPath, skill.id, skill.sourceHash);\n\n return { success: true, newHash: skill.sourceHash };\n } catch (error) {\n return {\n success: false,\n newHash: null,\n error: getErrorMessage(error),\n };\n }\n}\n\nfunction findSkillByPartialMatch(\n skillName: string,\n results: SkillComparisonResult[],\n): SkillComparisonResult | null {\n const exact = results.find((r) => r.id === skillName);\n if (exact) return exact;\n\n const partial = results.find((r) => {\n const nameWithoutAuthor = r.id.replace(/\\s*\\(@\\w+\\)$/, \"\").toLowerCase();\n return nameWithoutAuthor === skillName.toLowerCase();\n });\n if (partial) return partial;\n\n const byDir = results.find((r) => r.dirName.toLowerCase() === skillName.toLowerCase());\n if (byDir) return byDir;\n\n return null;\n}\n\nfunction findSimilarSkills(skillName: string, results: SkillComparisonResult[]): string[] {\n const lowered = skillName.toLowerCase();\n return results\n .filter((r) => {\n const name = r.id.toLowerCase();\n const dir = r.dirName.toLowerCase();\n return (\n name.includes(lowered) || dir.includes(lowered) || lowered.includes(name.split(\" \")[0])\n );\n })\n .map((r) => r.id)\n .slice(0, 3);\n}\n\ntype UpdateConfirmProps = {\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nconst UpdateConfirm: React.FC<UpdateConfirmProps> = ({ onConfirm, onCancel }) => {\n return (\n <Confirm\n message=\"Proceed with update?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={false}\n />\n );\n};\n\nexport default class Update extends BaseCommand {\n static summary = \"Update local skills from source\";\n\n static description =\n \"Update local skills from the source repository. By default, checks all skills for updates. Specify a skill name to update only that skill.\";\n\n static args = {\n skill: Args.string({\n description: \"Specific skill to update (optional)\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n \"no-recompile\": Flags.boolean({\n description: \"Skip agent recompilation after update\",\n default: false,\n }),\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> my-skill\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n \"<%= config.bin %> <%= command.id %> --source /path/to/marketplace\",\n \"<%= config.bin %> <%= command.id %> --no-recompile\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Update);\n const projectDir = process.cwd();\n const shouldRecompile = !flags[\"no-recompile\"];\n\n try {\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n if (!(await fileExists(localSkillsPath))) {\n this.warn(ERROR_MESSAGES.NO_LOCAL_SKILLS);\n return;\n }\n\n this.log(STATUS_MESSAGES.LOADING_SKILLS);\n\n const sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n\n this.log(\n `Loaded from ${sourceResult.isLocal ? \"local\" : \"remote\"}: ${sourceResult.sourcePath}`,\n );\n\n const sourceSkills: Record<string, { path: string }> = {};\n for (const [skillId, skill] of Object.entries(matrix.skills)) {\n if (!skill) continue;\n if (!skill.local) {\n sourceSkills[skillId] = { path: skill.path };\n }\n }\n\n const allResults = await compareLocalSkillsWithSource(\n projectDir,\n sourceResult.sourcePath,\n sourceSkills,\n );\n\n let outdatedSkills = allResults.filter((r) => r.status === \"outdated\");\n\n if (args.skill) {\n const foundSkill = findSkillByPartialMatch(args.skill, allResults);\n\n if (!foundSkill) {\n this.log(\"\");\n this.log(`Error: Skill \"${args.skill}\" not found.`);\n this.log(\"\");\n\n const similar = findSimilarSkills(args.skill, allResults);\n if (similar.length > 0) {\n this.log(\"Did you mean one of these?\");\n for (const name of similar) {\n this.log(` - ${name}`);\n }\n this.log(\"\");\n }\n\n this.log(`Run \\`${CLI_BIN_NAME} search ${args.skill}\\` to search available skills.`);\n this.log(\"\");\n this.error(ERROR_MESSAGES.SKILL_NOT_FOUND, { exit: EXIT_CODES.ERROR });\n }\n\n if (foundSkill.status === \"current\") {\n this.log(\"\");\n this.log(`Skill \"${foundSkill.id}\" is already up to date.`);\n this.log(\"\");\n this.log(` Local hash: ${foundSkill.localHash}`);\n this.log(` Source hash: ${foundSkill.sourceHash}`);\n this.log(\"\");\n return;\n }\n\n if (foundSkill.status === \"local-only\") {\n this.log(\"\");\n this.log(`Skill \"${foundSkill.id}\" is a local-only skill (not forked from source).`);\n this.log(\"Cannot update local-only skills.\");\n this.log(\"\");\n return;\n }\n\n outdatedSkills = [foundSkill];\n }\n\n if (outdatedSkills.length === 0) {\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.ALL_SKILLS_UP_TO_DATE);\n this.log(\"\");\n return;\n }\n\n this.log(\"\");\n this.log(\"The following skills will be updated:\");\n this.log(\"\");\n\n printTable({\n data: outdatedSkills.map((skill) => ({\n skill: skill.id,\n localHash: skill.localHash ?? \"-\",\n sourceHash: skill.sourceHash ?? \"-\",\n })),\n columns: [\n { key: \"skill\", name: \"Skill\" },\n { key: \"localHash\", name: \"Local Hash\" },\n { key: \"sourceHash\", name: \"Source Hash\" },\n ],\n headerOptions: { bold: true },\n });\n\n this.log(\"\");\n this.log(`${outdatedSkills.length} skill(s) will be updated.`);\n this.log(\"\");\n\n if (!flags.yes) {\n let confirmed = false;\n let cancelled = false;\n\n const { waitUntilExit } = render(\n <UpdateConfirm\n onConfirm={() => {\n confirmed = true;\n }}\n onCancel={() => {\n cancelled = true;\n }}\n />,\n );\n\n await waitUntilExit();\n\n if (cancelled) {\n this.log(\"Update cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (!confirmed) {\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n return;\n }\n }\n\n this.log(\"\");\n\n const updated: string[] = [];\n const failed: string[] = [];\n\n for (const skill of outdatedSkills) {\n this.log(`Updating ${skill.id}...`);\n\n const result = await updateSkill(skill, projectDir, sourceResult);\n\n if (result.success) {\n this.log(` Updated ${skill.id}`);\n updated.push(skill.id);\n } else {\n this.log(` Failed to update ${skill.id}: ${result.error}`);\n failed.push(skill.id);\n }\n }\n\n let recompiledAgents: string[] = [];\n\n if (shouldRecompile && updated.length > 0) {\n this.log(\"\");\n this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);\n\n try {\n const recompileResult = await recompileAgents({\n pluginDir: projectDir,\n sourcePath: sourceResult.sourcePath,\n projectDir,\n });\n\n recompiledAgents = recompileResult.compiled;\n\n if (recompiledAgents.length > 0) {\n this.log(\"Agents recompiled\");\n for (const agent of recompiledAgents) {\n this.log(` Recompiled: ${agent}`);\n }\n } else {\n this.log(INFO_MESSAGES.NO_AGENTS_TO_RECOMPILE);\n }\n\n if (recompileResult.warnings.length > 0) {\n for (const warning of recompileResult.warnings) {\n this.warn(warning);\n }\n }\n } catch (error) {\n this.warn(\"Agent recompilation failed\");\n this.warn(`Could not recompile agents: ${getErrorMessage(error)}`);\n }\n }\n\n this.log(\"\");\n if (failed.length === 0) {\n const agentMsg =\n recompiledAgents.length > 0 ? `, ${recompiledAgents.length} agent(s) recompiled` : \"\";\n this.logSuccess(`Update complete! ${updated.length} skill(s) updated${agentMsg}.`);\n } else {\n this.warn(\n `Update finished with errors: ${updated.length} updated, ${failed.length} failed.`,\n );\n }\n this.log(\"\");\n\n if (failed.length > 0) {\n this.error(\"Some updates failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`Update failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/update.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags, Args } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport { render } from \"ink\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../lib/loading/index.js\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { recompileAgents } from \"../lib/agents/index.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n compareLocalSkillsWithSource,\n injectForkedFromMetadata,\n type SkillComparisonResult,\n} from \"../lib/skills/index.js\";\nimport { fileExists, copy } from \"../utils/fs.js\";\nimport { CLI_BIN_NAME, LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport {\n ERROR_MESSAGES,\n SUCCESS_MESSAGES,\n STATUS_MESSAGES,\n INFO_MESSAGES,\n} from \"../utils/messages.js\";\nimport { Confirm } from \"../components/common/confirm.js\";\n\nasync function updateSkill(\n skill: SkillComparisonResult,\n projectDir: string,\n sourceResult: SourceLoadResult,\n): Promise<{ success: boolean; newHash: string | null; error?: string }> {\n if (!skill.sourcePath || !skill.sourceHash) {\n return { success: false, newHash: null, error: \"No source path available\" };\n }\n\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const destPath = path.join(localSkillsPath, skill.dirName);\n const srcPath = path.join(sourceResult.sourcePath, \"src\", skill.sourcePath);\n\n try {\n await copy(srcPath, destPath);\n await injectForkedFromMetadata(destPath, skill.id, skill.sourceHash);\n\n return { success: true, newHash: skill.sourceHash };\n } catch (error) {\n return {\n success: false,\n newHash: null,\n error: getErrorMessage(error),\n };\n }\n}\n\nfunction findSkillByPartialMatch(\n skillName: string,\n results: SkillComparisonResult[],\n): SkillComparisonResult | null {\n const exact = results.find((r) => r.id === skillName);\n if (exact) return exact;\n\n const partial = results.find((r) => {\n const nameWithoutAuthor = r.id.replace(/\\s*\\(@\\w+\\)$/, \"\").toLowerCase();\n return nameWithoutAuthor === skillName.toLowerCase();\n });\n if (partial) return partial;\n\n const byDir = results.find((r) => r.dirName.toLowerCase() === skillName.toLowerCase());\n if (byDir) return byDir;\n\n return null;\n}\n\nfunction findSimilarSkills(skillName: string, results: SkillComparisonResult[]): string[] {\n const lowered = skillName.toLowerCase();\n return results\n .filter((r) => {\n const name = r.id.toLowerCase();\n const dir = r.dirName.toLowerCase();\n return (\n name.includes(lowered) || dir.includes(lowered) || lowered.includes(name.split(\" \")[0])\n );\n })\n .map((r) => r.id)\n .slice(0, 3);\n}\n\ntype UpdateConfirmProps = {\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nconst UpdateConfirm: React.FC<UpdateConfirmProps> = ({ onConfirm, onCancel }) => {\n return (\n <Confirm\n message=\"Proceed with update?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={false}\n />\n );\n};\n\nexport default class Update extends BaseCommand {\n static summary = \"Update local skills from source\";\n\n static description =\n \"Update local skills from the source repository. By default, checks all skills for updates. Specify a skill name to update only that skill.\";\n\n static args = {\n skill: Args.string({\n description: \"Specific skill to update (optional)\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n \"no-recompile\": Flags.boolean({\n description: \"Skip agent recompilation after update\",\n default: false,\n }),\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> my-skill\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n \"<%= config.bin %> <%= command.id %> --source /path/to/marketplace\",\n \"<%= config.bin %> <%= command.id %> --no-recompile\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Update);\n const projectDir = process.cwd();\n const shouldRecompile = !flags[\"no-recompile\"];\n\n try {\n const projectLocalPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const homeDir = os.homedir();\n const globalLocalPath = path.join(homeDir, LOCAL_SKILLS_PATH);\n const hasProject = await fileExists(projectLocalPath);\n const hasGlobal = projectDir !== homeDir && (await fileExists(globalLocalPath));\n\n if (!hasProject && !hasGlobal) {\n this.warn(ERROR_MESSAGES.NO_LOCAL_SKILLS);\n return;\n }\n\n this.log(STATUS_MESSAGES.LOADING_SKILLS);\n\n const sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n\n this.log(\n `Loaded from ${sourceResult.isLocal ? \"local\" : \"remote\"}: ${sourceResult.sourcePath}`,\n );\n\n const sourceSkills: Record<string, { path: string }> = {};\n for (const [skillId, skill] of Object.entries(matrix.skills)) {\n if (!skill) continue;\n if (!skill.local) {\n sourceSkills[skillId] = { path: skill.path };\n }\n }\n\n // Check both project-scoped and global-scoped local skills\n const projectResults = hasProject\n ? await compareLocalSkillsWithSource(projectDir, sourceResult.sourcePath, sourceSkills)\n : [];\n const globalResults = hasGlobal\n ? await compareLocalSkillsWithSource(homeDir, sourceResult.sourcePath, sourceSkills)\n : [];\n\n // Track which base dir each skill lives in (for updateSkill dest path)\n const skillBaseDir = new Map<string, string>();\n for (const r of projectResults) skillBaseDir.set(r.id, projectDir);\n for (const r of globalResults) {\n if (!skillBaseDir.has(r.id)) skillBaseDir.set(r.id, homeDir);\n }\n\n // Merge results, project-scoped takes precedence\n const seenIds = new Set(projectResults.map((r) => r.id));\n const allResults = [...projectResults, ...globalResults.filter((r) => !seenIds.has(r.id))];\n\n let outdatedSkills = allResults.filter((r) => r.status === \"outdated\");\n\n if (args.skill) {\n const foundSkill = findSkillByPartialMatch(args.skill, allResults);\n\n if (!foundSkill) {\n this.log(\"\");\n this.log(`Error: Skill \"${args.skill}\" not found.`);\n this.log(\"\");\n\n const similar = findSimilarSkills(args.skill, allResults);\n if (similar.length > 0) {\n this.log(\"Did you mean one of these?\");\n for (const name of similar) {\n this.log(` - ${name}`);\n }\n this.log(\"\");\n }\n\n this.log(`Run \\`${CLI_BIN_NAME} search ${args.skill}\\` to search available skills.`);\n this.log(\"\");\n this.error(ERROR_MESSAGES.SKILL_NOT_FOUND, { exit: EXIT_CODES.ERROR });\n }\n\n if (foundSkill.status === \"current\") {\n this.log(\"\");\n this.log(`Skill \"${foundSkill.id}\" is already up to date.`);\n this.log(\"\");\n this.log(` Local hash: ${foundSkill.localHash}`);\n this.log(` Source hash: ${foundSkill.sourceHash}`);\n this.log(\"\");\n return;\n }\n\n if (foundSkill.status === \"local-only\") {\n this.log(\"\");\n this.log(`Skill \"${foundSkill.id}\" is a local-only skill (not forked from source).`);\n this.log(\"Cannot update local-only skills.\");\n this.log(\"\");\n return;\n }\n\n outdatedSkills = [foundSkill];\n }\n\n if (outdatedSkills.length === 0) {\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.ALL_SKILLS_UP_TO_DATE);\n this.log(\"\");\n return;\n }\n\n this.log(\"\");\n this.log(\"The following skills will be updated:\");\n this.log(\"\");\n\n printTable({\n data: outdatedSkills.map((skill) => ({\n skill: skill.id,\n localHash: skill.localHash ?? \"-\",\n sourceHash: skill.sourceHash ?? \"-\",\n })),\n columns: [\n { key: \"skill\", name: \"Skill\" },\n { key: \"localHash\", name: \"Local Hash\" },\n { key: \"sourceHash\", name: \"Source Hash\" },\n ],\n headerOptions: { bold: true },\n });\n\n this.log(\"\");\n this.log(`${outdatedSkills.length} skill(s) will be updated.`);\n this.log(\"\");\n\n if (!flags.yes) {\n let confirmed = false;\n let cancelled = false;\n\n const { waitUntilExit } = render(\n <UpdateConfirm\n onConfirm={() => {\n confirmed = true;\n }}\n onCancel={() => {\n cancelled = true;\n }}\n />,\n );\n\n await waitUntilExit();\n\n if (cancelled) {\n this.log(\"Update cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (!confirmed) {\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n return;\n }\n }\n\n this.log(\"\");\n\n const updated: string[] = [];\n const failed: string[] = [];\n\n for (const skill of outdatedSkills) {\n this.log(`Updating ${skill.id}...`);\n\n const baseDir = skillBaseDir.get(skill.id) ?? projectDir;\n const result = await updateSkill(skill, baseDir, sourceResult);\n\n if (result.success) {\n this.log(` Updated ${skill.id}`);\n updated.push(skill.id);\n } else {\n this.log(` Failed to update ${skill.id}: ${result.error}`);\n failed.push(skill.id);\n }\n }\n\n let recompiledAgents: string[] = [];\n\n if (shouldRecompile && updated.length > 0) {\n this.log(\"\");\n this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);\n\n try {\n const recompileResult = await recompileAgents({\n pluginDir: projectDir,\n sourcePath: sourceResult.sourcePath,\n projectDir,\n });\n\n recompiledAgents = recompileResult.compiled;\n\n if (recompiledAgents.length > 0) {\n this.log(\"Agents recompiled\");\n for (const agent of recompiledAgents) {\n this.log(` Recompiled: ${agent}`);\n }\n } else {\n this.log(INFO_MESSAGES.NO_AGENTS_TO_RECOMPILE);\n }\n\n if (recompileResult.warnings.length > 0) {\n for (const warning of recompileResult.warnings) {\n this.warn(warning);\n }\n }\n } catch (error) {\n this.warn(\"Agent recompilation failed\");\n this.warn(`Could not recompile agents: ${getErrorMessage(error)}`);\n }\n }\n\n this.log(\"\");\n if (failed.length === 0) {\n const agentMsg =\n recompiledAgents.length > 0 ? `, ${recompiledAgents.length} agent(s) recompiled` : \"\";\n this.logSuccess(`Update complete! ${updated.length} skill(s) updated${agentMsg}.`);\n } else {\n this.warn(\n `Update finished with errors: ${updated.length} updated, ${failed.length} failed.`,\n );\n }\n this.log(\"\");\n\n if (failed.length > 0) {\n this.error(\"Some updates failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`Update failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -11,7 +11,7 @@ import {
11
11
  validateAllPlugins,
12
12
  validateAllSchemas,
13
13
  validatePlugin
14
- } from "../chunk-CZLXZ75E.js";
14
+ } from "../chunk-OIHZ2YH3.js";
15
15
  import {
16
16
  parseFrontmatter
17
17
  } from "../chunk-IFCASC6R.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CategoryGrid
4
- } from "../../chunk-CTZ4GEAD.js";
4
+ } from "../../chunk-W46L2PXK.js";
5
5
  import "../../chunk-P2FHS5IS.js";
6
6
  import "../../chunk-FFMWFEUH.js";
7
7
  import "../../chunk-HK53FRMU.js";
@@ -27,12 +27,12 @@ import {
27
27
  } from "../../chunk-XY3XDVMI.js";
28
28
  import {
29
29
  CategoryGrid
30
- } from "../../chunk-CTZ4GEAD.js";
30
+ } from "../../chunk-W46L2PXK.js";
31
31
  import "../../chunk-P2FHS5IS.js";
32
32
  import "../../chunk-FFMWFEUH.js";
33
- import "../../chunk-CY23HPDE.js";
33
+ import "../../chunk-N34D3ROY.js";
34
34
  import "../../chunk-HK53FRMU.js";
35
- import "../../chunk-CZLXZ75E.js";
35
+ import "../../chunk-OIHZ2YH3.js";
36
36
  import "../../chunk-IFCASC6R.js";
37
37
  import {
38
38
  BUILT_IN_MATRIX,
@@ -1,9 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CheckboxGrid
4
- } from "../../chunk-ERHTXNIF.js";
4
+ } from "../../chunk-RU5XLS5Q.js";
5
5
  import "../../chunk-SQ7WINEU.js";
6
- import "../../chunk-JNQKCZA3.js";
7
6
  import "../../chunk-FFMWFEUH.js";
8
7
  import "../../chunk-FMYAYX6W.js";
9
8
  import "../../chunk-DHET7RCE.js";
@@ -21,9 +21,8 @@ import {
21
21
  } from "../../chunk-XY3XDVMI.js";
22
22
  import {
23
23
  CheckboxGrid
24
- } from "../../chunk-ERHTXNIF.js";
24
+ } from "../../chunk-RU5XLS5Q.js";
25
25
  import "../../chunk-SQ7WINEU.js";
26
- import "../../chunk-JNQKCZA3.js";
27
26
  import "../../chunk-FFMWFEUH.js";
28
27
  import "../../chunk-FMYAYX6W.js";
29
28
  import {
@@ -58,11 +57,10 @@ describe("CheckboxGrid component", () => {
58
57
  cleanup = void 0;
59
58
  });
60
59
  describe("rendering", () => {
61
- it("should render title and subtitle", () => {
60
+ it("should render subtitle (title is rendered by wizard-layout, not checkbox-grid)", () => {
62
61
  const { lastFrame, unmount } = renderCheckboxGrid();
63
62
  cleanup = unmount;
64
63
  const output = lastFrame();
65
- globalExpect(output).toContain("Test title");
66
64
  globalExpect(output).toContain("Test subtitle");
67
65
  });
68
66
  it("should render all items with correct labels", () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/checkbox-grid.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { CheckboxGrid, type CheckboxGridProps } from \"./checkbox-grid\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n SPACE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\ntype TestItem = \"alpha\" | \"beta\" | \"gamma\";\n\nconst TEST_ITEMS: CheckboxGridProps<TestItem>[\"items\"] = [\n { id: \"alpha\", label: \"Alpha\", description: \"First item\" },\n { id: \"beta\", label: \"Beta\", description: \"Second item\" },\n { id: \"gamma\", label: \"Gamma\", description: \"Third item\" },\n];\n\nconst defaultProps: CheckboxGridProps<TestItem> = {\n title: \"Test title\",\n subtitle: \"Test subtitle\",\n items: TEST_ITEMS,\n selectedIds: [],\n onToggle: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n emptyMessage: \"Select at least one\",\n};\n\nconst renderCheckboxGrid = (props: Partial<CheckboxGridProps<TestItem>> = {}) => {\n return render(<CheckboxGrid {...defaultProps} {...props} />);\n};\n\ndescribe(\"CheckboxGrid component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render title and subtitle\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Test title\");\n expect(output).toContain(\"Test subtitle\");\n });\n\n it(\"should render all items with correct labels\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Alpha\");\n expect(output).toContain(\"Beta\");\n expect(output).toContain(\"Gamma\");\n });\n\n it(\"should render focused item description\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Only the focused item (first by default) shows its description\n expect(output).toContain(\"First item\");\n expect(output).not.toContain(\"Second item\");\n expect(output).not.toContain(\"Third item\");\n });\n\n it(\"should show unchecked checkboxes when nothing selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[ ]\");\n expect(output).not.toContain(\"[\\u2713]\");\n });\n\n it(\"should show checked checkboxes for selected items\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\", \"gamma\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[\\u2713]\");\n });\n\n it(\"should show empty message when nothing selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select at least one\");\n });\n\n it(\"should show empty message as dimmed informational text\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n emptyMessage: \"No items selected\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"No items selected\");\n });\n\n it(\"should show selected summary when items are selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\", \"beta\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"alpha\");\n expect(output).toContain(\"beta\");\n });\n\n it(\"should show selected summary when items are selected instead of continue label\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Continue label is no longer rendered; selected summary is shown instead\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"alpha\");\n });\n\n it(\"should show empty message when nothing selected instead of continue label\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Continue label is no longer rendered; empty message is shown instead\n expect(output).toContain(\"Select at least one\");\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should move focus down with arrow down\", async () => {\n const { stdin, lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First item focused by default (has focus indicator)\n let output = lastFrame();\n expect(output).toBeDefined();\n\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should move focus up with arrow up\", async () => {\n const { stdin, lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last item\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should move focus with j/k vim keys\", async () => {\n const { stdin, lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"j\");\n await delay(INPUT_DELAY_MS);\n\n let output = lastFrame();\n expect(output).toBeDefined();\n\n stdin.write(\"k\");\n await delay(INPUT_DELAY_MS);\n\n output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should toggle selection with SPACE\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onToggle });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n // First item is focused by default, so toggling should call with \"alpha\"\n expect(onToggle).toHaveBeenCalledWith(\"alpha\");\n });\n\n it(\"should toggle correct item after navigation\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onToggle });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"beta\");\n });\n\n it(\"should call onContinue with ENTER when items selected\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({\n onContinue,\n selectedIds: [\"alpha\"],\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n\n it(\"should call onContinue with ENTER even when nothing selected\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({\n onContinue,\n selectedIds: [],\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n\n it(\"should call onBack with ESC\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n });\n\n it(\"should wrap focus from last to first item\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onToggle });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Navigate down past all 3 items + continue item (always present)\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n // Should wrap to first item\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"alpha\");\n });\n });\n\n describe(\"custom props\", () => {\n it(\"should show selected items in summary with custom selections\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\", \"beta\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Continue label is no longer rendered; verify selected summary instead\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"alpha\");\n expect(output).toContain(\"beta\");\n });\n\n it(\"should use custom emptyMessage\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n emptyMessage: \"Pick something!\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Pick something!\");\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/checkbox-grid.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { CheckboxGrid, type CheckboxGridProps } from \"./checkbox-grid\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n SPACE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\ntype TestItem = \"alpha\" | \"beta\" | \"gamma\";\n\nconst TEST_ITEMS: CheckboxGridProps<TestItem>[\"items\"] = [\n { id: \"alpha\", label: \"Alpha\", description: \"First item\" },\n { id: \"beta\", label: \"Beta\", description: \"Second item\" },\n { id: \"gamma\", label: \"Gamma\", description: \"Third item\" },\n];\n\nconst defaultProps: CheckboxGridProps<TestItem> = {\n title: \"Test title\",\n subtitle: \"Test subtitle\",\n items: TEST_ITEMS,\n selectedIds: [],\n onToggle: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n emptyMessage: \"Select at least one\",\n};\n\nconst renderCheckboxGrid = (props: Partial<CheckboxGridProps<TestItem>> = {}) => {\n return render(<CheckboxGrid {...defaultProps} {...props} />);\n};\n\ndescribe(\"CheckboxGrid component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render subtitle (title is rendered by wizard-layout, not checkbox-grid)\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Test subtitle\");\n });\n\n it(\"should render all items with correct labels\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Alpha\");\n expect(output).toContain(\"Beta\");\n expect(output).toContain(\"Gamma\");\n });\n\n it(\"should render focused item description\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Only the focused item (first by default) shows its description\n expect(output).toContain(\"First item\");\n expect(output).not.toContain(\"Second item\");\n expect(output).not.toContain(\"Third item\");\n });\n\n it(\"should show unchecked checkboxes when nothing selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[ ]\");\n expect(output).not.toContain(\"[\\u2713]\");\n });\n\n it(\"should show checked checkboxes for selected items\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\", \"gamma\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[\\u2713]\");\n });\n\n it(\"should show empty message when nothing selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select at least one\");\n });\n\n it(\"should show empty message as dimmed informational text\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n emptyMessage: \"No items selected\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"No items selected\");\n });\n\n it(\"should show selected summary when items are selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\", \"beta\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"alpha\");\n expect(output).toContain(\"beta\");\n });\n\n it(\"should show selected summary when items are selected instead of continue label\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Continue label is no longer rendered; selected summary is shown instead\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"alpha\");\n });\n\n it(\"should show empty message when nothing selected instead of continue label\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Continue label is no longer rendered; empty message is shown instead\n expect(output).toContain(\"Select at least one\");\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should move focus down with arrow down\", async () => {\n const { stdin, lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First item focused by default (has focus indicator)\n let output = lastFrame();\n expect(output).toBeDefined();\n\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should move focus up with arrow up\", async () => {\n const { stdin, lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last item\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should move focus with j/k vim keys\", async () => {\n const { stdin, lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"j\");\n await delay(INPUT_DELAY_MS);\n\n let output = lastFrame();\n expect(output).toBeDefined();\n\n stdin.write(\"k\");\n await delay(INPUT_DELAY_MS);\n\n output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should toggle selection with SPACE\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onToggle });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n // First item is focused by default, so toggling should call with \"alpha\"\n expect(onToggle).toHaveBeenCalledWith(\"alpha\");\n });\n\n it(\"should toggle correct item after navigation\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onToggle });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"beta\");\n });\n\n it(\"should call onContinue with ENTER when items selected\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({\n onContinue,\n selectedIds: [\"alpha\"],\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n\n it(\"should call onContinue with ENTER even when nothing selected\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({\n onContinue,\n selectedIds: [],\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n\n it(\"should call onBack with ESC\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n });\n\n it(\"should wrap focus from last to first item\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onToggle });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Navigate down past all 3 items + continue item (always present)\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n // Should wrap to first item\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"alpha\");\n });\n });\n\n describe(\"custom props\", () => {\n it(\"should show selected items in summary with custom selections\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\", \"beta\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Continue label is no longer rendered; verify selected summary instead\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"alpha\");\n expect(output).toContain(\"beta\");\n });\n\n it(\"should use custom emptyMessage\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n emptyMessage: \"Pick something!\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Pick something!\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,14 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DomainSelection
4
- } from "../../chunk-AQ5KP4YW.js";
4
+ } from "../../chunk-QD3GQ2CH.js";
5
5
  import "../../chunk-7JQIMEUX.js";
6
- import "../../chunk-ERHTXNIF.js";
6
+ import "../../chunk-RU5XLS5Q.js";
7
7
  import "../../chunk-SQ7WINEU.js";
8
- import "../../chunk-JNQKCZA3.js";
9
8
  import "../../chunk-FFMWFEUH.js";
10
- import "../../chunk-CY23HPDE.js";
11
- import "../../chunk-CZLXZ75E.js";
9
+ import "../../chunk-N34D3ROY.js";
10
+ import "../../chunk-OIHZ2YH3.js";
12
11
  import "../../chunk-IFCASC6R.js";
13
12
  import "../../chunk-FSK4TQX7.js";
14
13
  import "../../chunk-XYPAOBBV.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SourceGrid
4
- } from "../../chunk-B66E255O.js";
4
+ } from "../../chunk-D4T3HHE7.js";
5
5
  import "../../chunk-7SOPVGDV.js";
6
6
  import "../../chunk-A5JSBU65.js";
7
7
  import "../../chunk-P2FHS5IS.js";
@@ -32,16 +32,16 @@ import {
32
32
  } from "../../chunk-XY3XDVMI.js";
33
33
  import {
34
34
  SourceGrid
35
- } from "../../chunk-B66E255O.js";
35
+ } from "../../chunk-D4T3HHE7.js";
36
36
  import "../../chunk-7SOPVGDV.js";
37
37
  import "../../chunk-A5JSBU65.js";
38
38
  import "../../chunk-P2FHS5IS.js";
39
39
  import "../../chunk-FFMWFEUH.js";
40
40
  import "../../chunk-MLXAZODL.js";
41
41
  import "../../chunk-KUV24B5M.js";
42
- import "../../chunk-CY23HPDE.js";
42
+ import "../../chunk-N34D3ROY.js";
43
43
  import "../../chunk-HK53FRMU.js";
44
- import "../../chunk-CZLXZ75E.js";
44
+ import "../../chunk-OIHZ2YH3.js";
45
45
  import "../../chunk-IFCASC6R.js";
46
46
  import {
47
47
  BUILT_IN_MATRIX,
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "../../chunk-SGKNE6EJ.js";
4
+ } from "../../chunk-OOWNDQCG.js";
5
5
  import "../../chunk-K77I4XGL.js";
6
6
  import "../../chunk-SQ7WINEU.js";
7
7
  import "../../chunk-FFMWFEUH.js";
8
- import "../../chunk-CY23HPDE.js";
9
- import "../../chunk-CZLXZ75E.js";
8
+ import "../../chunk-N34D3ROY.js";
9
+ import "../../chunk-OIHZ2YH3.js";
10
10
  import "../../chunk-IFCASC6R.js";
11
11
  import "../../chunk-FSK4TQX7.js";
12
12
  import "../../chunk-XYPAOBBV.js";
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ StatsPanel,
4
+ computeStats
5
+ } from "../../chunk-PZERKWE2.js";
6
+ import "../../chunk-FMYAYX6W.js";
7
+ import "../../chunk-DHET7RCE.js";
8
+ export {
9
+ StatsPanel,
10
+ computeStats
11
+ };
12
+ //# sourceMappingURL=stats-panel.js.map
@@ -1,14 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepAgents
4
- } from "../../chunk-XU6N3OIS.js";
4
+ } from "../../chunk-HANGA633.js";
5
5
  import "../../chunk-K77I4XGL.js";
6
6
  import "../../chunk-7JQIMEUX.js";
7
7
  import "../../chunk-SQ7WINEU.js";
8
- import "../../chunk-JNQKCZA3.js";
9
8
  import "../../chunk-FFMWFEUH.js";
10
- import "../../chunk-CY23HPDE.js";
11
- import "../../chunk-CZLXZ75E.js";
9
+ import "../../chunk-N34D3ROY.js";
10
+ import "../../chunk-OIHZ2YH3.js";
12
11
  import "../../chunk-IFCASC6R.js";
13
12
  import "../../chunk-FSK4TQX7.js";
14
13
  import "../../chunk-XYPAOBBV.js";
@@ -25,16 +25,15 @@ import {
25
25
  } from "../../chunk-XY3XDVMI.js";
26
26
  import {
27
27
  StepAgents
28
- } from "../../chunk-XU6N3OIS.js";
28
+ } from "../../chunk-HANGA633.js";
29
29
  import "../../chunk-K77I4XGL.js";
30
30
  import "../../chunk-7JQIMEUX.js";
31
31
  import "../../chunk-SQ7WINEU.js";
32
- import "../../chunk-JNQKCZA3.js";
33
32
  import "../../chunk-FFMWFEUH.js";
34
33
  import {
35
34
  useWizardStore
36
- } from "../../chunk-CY23HPDE.js";
37
- import "../../chunk-CZLXZ75E.js";
35
+ } from "../../chunk-N34D3ROY.js";
36
+ import "../../chunk-OIHZ2YH3.js";
38
37
  import "../../chunk-IFCASC6R.js";
39
38
  import {
40
39
  initializeMatrix
@@ -60,11 +59,13 @@ describe("StepAgents component", () => {
60
59
  cleanup = void 0;
61
60
  });
62
61
  describe("rendering", () => {
63
- it("should render title", () => {
62
+ it("should render agent group headers", () => {
64
63
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
65
64
  cleanup = unmount;
66
65
  const output = lastFrame();
67
- globalExpect(output).toContain("Select agents");
66
+ globalExpect(output).toContain("Web");
67
+ globalExpect(output).toContain("API");
68
+ globalExpect(output).toContain("Meta");
68
69
  });
69
70
  it("should render all agents", () => {
70
71
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-agents.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { EMPTY_MATRIX } from \"../../lib/__tests__/mock-data/mock-matrices\";\nimport {\n ARROW_DOWN,\n ENTER,\n ESCAPE,\n INPUT_DELAY_MS,\n RENDER_DELAY_MS,\n SPACE,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { StepAgents } from \"./step-agents\";\n\nconst EXPECTED_AGENT_COUNT = 18;\n\ndescribe(\"StepAgents component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n initializeMatrix(EMPTY_MATRIX);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render title\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select agents\");\n });\n\n it(\"should render all agents\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web Developer\");\n expect(output).toContain(\"API Developer\");\n expect(output).toContain(\"CLI Developer\");\n expect(output).toContain(\"Web Architecture\");\n expect(output).toContain(\"Web Reviewer\");\n expect(output).toContain(\"API Reviewer\");\n expect(output).toContain(\"CLI Reviewer\");\n expect(output).toContain(\"Web Researcher\");\n expect(output).toContain(\"API Researcher\");\n expect(output).toContain(\"Web Tester\");\n expect(output).toContain(\"CLI Tester\");\n expect(output).toContain(\"Web PM\");\n expect(output).toContain(\"Pattern Scout\");\n expect(output).toContain(\"Pattern Critique\");\n expect(output).toContain(\"Agent Summoner\");\n expect(output).toContain(\"Skill Summoner\");\n expect(output).toContain(\"Documentor\");\n });\n\n it(\"should render agent descriptions\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Frontend features, components, TypeScript\");\n expect(output).toContain(\"Backend routes, database, middleware\");\n expect(output).toContain(\"CLI commands, interactive prompts\");\n });\n\n it(\"should render group headers\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n expect(output).toContain(\"Meta\");\n });\n\n it(\"should show continue arrow\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2192\");\n expect(output).toContain(\"Continue\");\n });\n\n it(\"should show continue option with agent count when agents selected\", () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n store.toggleAgent(\"api-developer\");\n store.toggleAgent(\"web-reviewer\");\n\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue with 3 agent(s)\");\n });\n\n it(\"should show 'Continue without agents' when no agents selected\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue without agents\");\n });\n });\n\n describe(\"keyboard interaction\", () => {\n it(\"should toggle agent on SPACE\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const store = useWizardStore.getState();\n expect(store.selectedAgents).toContain(\"web-developer\");\n });\n\n it(\"should toggle correct agent after navigation\", async () => {\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const store = useWizardStore.getState();\n expect(store.selectedAgents).toContain(\"web-reviewer\");\n });\n\n it(\"should navigate to confirm on ENTER when agents selected\", async () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n // Set step to agents so setStep(\"confirm\") actually navigates\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"confirm\");\n });\n\n it(\"should navigate to confirm on ENTER even with no agents selected\", async () => {\n const store = useWizardStore.getState();\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"confirm\");\n });\n\n it(\"should go back on ESC\", async () => {\n const store = useWizardStore.getState();\n store.setStep(\"sources\");\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"sources\");\n });\n\n it(\"should toggle agent off when already selected\", async () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // First item is web-developer, toggle it off\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.selectedAgents).not.toContain(\"web-developer\");\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-agents.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { EMPTY_MATRIX } from \"../../lib/__tests__/mock-data/mock-matrices\";\nimport {\n ARROW_DOWN,\n ENTER,\n ESCAPE,\n INPUT_DELAY_MS,\n RENDER_DELAY_MS,\n SPACE,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { StepAgents } from \"./step-agents\";\n\nconst EXPECTED_AGENT_COUNT = 18;\n\ndescribe(\"StepAgents component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n initializeMatrix(EMPTY_MATRIX);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render agent group headers\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify agent groups render (title shown by wizard-layout)\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"Meta\");\n });\n\n it(\"should render all agents\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web Developer\");\n expect(output).toContain(\"API Developer\");\n expect(output).toContain(\"CLI Developer\");\n expect(output).toContain(\"Web Architecture\");\n expect(output).toContain(\"Web Reviewer\");\n expect(output).toContain(\"API Reviewer\");\n expect(output).toContain(\"CLI Reviewer\");\n expect(output).toContain(\"Web Researcher\");\n expect(output).toContain(\"API Researcher\");\n expect(output).toContain(\"Web Tester\");\n expect(output).toContain(\"CLI Tester\");\n expect(output).toContain(\"Web PM\");\n expect(output).toContain(\"Pattern Scout\");\n expect(output).toContain(\"Pattern Critique\");\n expect(output).toContain(\"Agent Summoner\");\n expect(output).toContain(\"Skill Summoner\");\n expect(output).toContain(\"Documentor\");\n });\n\n it(\"should render agent descriptions\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Frontend features, components, TypeScript\");\n expect(output).toContain(\"Backend routes, database, middleware\");\n expect(output).toContain(\"CLI commands, interactive prompts\");\n });\n\n it(\"should render group headers\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n expect(output).toContain(\"Meta\");\n });\n\n it(\"should show continue arrow\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2192\");\n expect(output).toContain(\"Continue\");\n });\n\n it(\"should show continue option with agent count when agents selected\", () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n store.toggleAgent(\"api-developer\");\n store.toggleAgent(\"web-reviewer\");\n\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue with 3 agent(s)\");\n });\n\n it(\"should show 'Continue without agents' when no agents selected\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue without agents\");\n });\n });\n\n describe(\"keyboard interaction\", () => {\n it(\"should toggle agent on SPACE\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const store = useWizardStore.getState();\n expect(store.selectedAgents).toContain(\"web-developer\");\n });\n\n it(\"should toggle correct agent after navigation\", async () => {\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const store = useWizardStore.getState();\n expect(store.selectedAgents).toContain(\"web-reviewer\");\n });\n\n it(\"should navigate to confirm on ENTER when agents selected\", async () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n // Set step to agents so setStep(\"confirm\") actually navigates\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"confirm\");\n });\n\n it(\"should navigate to confirm on ENTER even with no agents selected\", async () => {\n const store = useWizardStore.getState();\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"confirm\");\n });\n\n it(\"should go back on ESC\", async () => {\n const store = useWizardStore.getState();\n store.setStep(\"sources\");\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"sources\");\n });\n\n it(\"should toggle agent off when already selected\", async () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // First item is web-developer, toggle it off\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.selectedAgents).not.toContain(\"web-developer\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,16 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepBuild
4
- } from "../../chunk-G3YSDQJ2.js";
4
+ } from "../../chunk-KVRR4PEJ.js";
5
+ import "../../chunk-PZERKWE2.js";
5
6
  import "../../chunk-K77I4XGL.js";
6
- import "../../chunk-CTZ4GEAD.js";
7
+ import "../../chunk-W46L2PXK.js";
7
8
  import "../../chunk-P2FHS5IS.js";
8
- import "../../chunk-7JQIMEUX.js";
9
- import "../../chunk-JNQKCZA3.js";
10
9
  import "../../chunk-FFMWFEUH.js";
11
- import "../../chunk-CY23HPDE.js";
10
+ import "../../chunk-N34D3ROY.js";
12
11
  import "../../chunk-HK53FRMU.js";
13
- import "../../chunk-CZLXZ75E.js";
12
+ import "../../chunk-OIHZ2YH3.js";
14
13
  import "../../chunk-IFCASC6R.js";
15
14
  import "../../chunk-FSK4TQX7.js";
16
15
  import "../../chunk-XYPAOBBV.js";