agents-inc 0.170.1 → 0.171.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 (163) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/{chunk-52HDHJ7I.js → chunk-24OD7IP4.js} +32 -21
  3. package/dist/chunk-24OD7IP4.js.map +1 -0
  4. package/dist/{chunk-MQ6CGZNJ.js → chunk-3YYHL76L.js} +1879 -2019
  5. package/dist/chunk-3YYHL76L.js.map +1 -0
  6. package/dist/chunk-4RQKCV6I.js +103 -0
  7. package/dist/chunk-4RQKCV6I.js.map +1 -0
  8. package/dist/{chunk-USVBYQSQ.js → chunk-5FM77WKW.js} +16 -6
  9. package/dist/chunk-5FM77WKW.js.map +1 -0
  10. package/dist/{chunk-HED2DAXZ.js → chunk-7IVLVEHX.js} +5 -5
  11. package/dist/chunk-7IVLVEHX.js.map +1 -0
  12. package/dist/{chunk-PJWGTNOX.js → chunk-A6OWEJGC.js} +144 -186
  13. package/dist/chunk-A6OWEJGC.js.map +1 -0
  14. package/dist/{chunk-BMRUNMPV.js → chunk-AWWCRL5A.js} +35 -35
  15. package/dist/chunk-AWWCRL5A.js.map +1 -0
  16. package/dist/{chunk-F2BHT5C4.js → chunk-EOKNEGRD.js} +129 -151
  17. package/dist/chunk-EOKNEGRD.js.map +1 -0
  18. package/dist/{chunk-NQW25DCF.js → chunk-GHHJYNAN.js} +1 -7
  19. package/dist/chunk-GHHJYNAN.js.map +1 -0
  20. package/dist/chunk-JGPE4RRE.js +35 -0
  21. package/dist/chunk-JGPE4RRE.js.map +1 -0
  22. package/dist/{chunk-JFLVEFFP.js → chunk-KIK5EZYD.js} +1 -1
  23. package/dist/chunk-KIK5EZYD.js.map +1 -0
  24. package/dist/{chunk-NCWDK6L7.js → chunk-KMOCMVK5.js} +254 -379
  25. package/dist/chunk-KMOCMVK5.js.map +1 -0
  26. package/dist/{chunk-4AAOOAIN.js → chunk-P6CYS4JK.js} +2 -2
  27. package/dist/chunk-P6CYS4JK.js.map +1 -0
  28. package/dist/chunk-QIR56IDM.js +1169 -0
  29. package/dist/chunk-QIR56IDM.js.map +1 -0
  30. package/dist/{chunk-6ZRH5RHC.js → chunk-R572RLTI.js} +4 -4
  31. package/dist/chunk-R572RLTI.js.map +1 -0
  32. package/dist/{chunk-WTWMGH2C.js → chunk-RDXY4GRO.js} +2 -2
  33. package/dist/chunk-RDXY4GRO.js.map +1 -0
  34. package/dist/{chunk-7RDMTR64.js → chunk-S2SKVJT2.js} +785 -256
  35. package/dist/chunk-S2SKVJT2.js.map +1 -0
  36. package/dist/{chunk-SZYQISA2.js → chunk-TNFYBKVD.js} +43 -29
  37. package/dist/chunk-TNFYBKVD.js.map +1 -0
  38. package/dist/{chunk-RIPSGNLU.js → chunk-W4KAY26P.js} +3 -3
  39. package/dist/chunk-W4KAY26P.js.map +1 -0
  40. package/dist/{chunk-OYJQUA3D.js → chunk-WDH6HHA3.js} +31 -13
  41. package/dist/chunk-WDH6HHA3.js.map +1 -0
  42. package/dist/{chunk-3G7X2WKI.js → chunk-WII6GOPM.js} +18 -38
  43. package/dist/chunk-WII6GOPM.js.map +1 -0
  44. package/dist/{chunk-F5EBEATU.js → chunk-WM2N2D6Q.js} +34 -46
  45. package/dist/chunk-WM2N2D6Q.js.map +1 -0
  46. package/dist/{chunk-KOLDW6SF.js → chunk-YLUOGAW7.js} +2 -2
  47. package/dist/chunk-YLUOGAW7.js.map +1 -0
  48. package/dist/{chunk-44TE3RKH.js → chunk-ZC6GC66J.js} +5 -4
  49. package/dist/chunk-ZC6GC66J.js.map +1 -0
  50. package/dist/{chunk-NEZ4OAOL.js → chunk-ZEGM3MVR.js} +3 -5
  51. package/dist/chunk-ZEGM3MVR.js.map +1 -0
  52. package/dist/commands/build/marketplace.js +46 -46
  53. package/dist/commands/build/marketplace.js.map +1 -1
  54. package/dist/commands/build/plugins.js +25 -28
  55. package/dist/commands/build/plugins.js.map +1 -1
  56. package/dist/commands/compile.js +87 -178
  57. package/dist/commands/compile.js.map +1 -1
  58. package/dist/commands/doctor.js +510 -360
  59. package/dist/commands/doctor.js.map +1 -1
  60. package/dist/commands/edit.js +451 -357
  61. package/dist/commands/edit.js.map +1 -1
  62. package/dist/commands/eject.js +144 -125
  63. package/dist/commands/eject.js.map +1 -1
  64. package/dist/commands/init.js +20 -27
  65. package/dist/commands/list.js +39 -55
  66. package/dist/commands/list.js.map +1 -1
  67. package/dist/commands/new/marketplace.js +6 -11
  68. package/dist/commands/new/marketplace.js.map +1 -1
  69. package/dist/commands/search.js +35 -32
  70. package/dist/commands/search.js.map +1 -1
  71. package/dist/commands/share.js +17 -77
  72. package/dist/commands/share.js.map +1 -1
  73. package/dist/commands/uninstall.js +159 -222
  74. package/dist/commands/uninstall.js.map +1 -1
  75. package/dist/commands/update.js +9 -32
  76. package/dist/commands/update.js.map +1 -1
  77. package/dist/components/common/prompt-confirm.js +2 -2
  78. package/dist/components/common/removal-plan-confirm.js +2 -2
  79. package/dist/components/common/scroll-affordance.js +2 -2
  80. package/dist/components/common/select-list.js +2 -2
  81. package/dist/components/common/skill-agent-summary.js +4 -4
  82. package/dist/components/common/spinner.js +2 -4
  83. package/dist/components/common/summary-panel.js +5 -5
  84. package/dist/components/common/summary-panel.js.map +1 -1
  85. package/dist/config-exports.js +7 -3
  86. package/dist/config-exports.js.map +1 -1
  87. package/dist/hooks/init.js +18 -19
  88. package/dist/hooks/init.js.map +1 -1
  89. package/dist/index.js.map +1 -1
  90. package/dist/load-agent-defs-UBWITIEI.js +14 -0
  91. package/dist/recompile-project-agents-IQANWGOP.js +65 -0
  92. package/dist/recompile-project-agents-IQANWGOP.js.map +1 -0
  93. package/dist/{source-loader-C5SQXZXI.js → source-loader-YGG7DY2W.js} +5 -5
  94. package/dist/src/agents/developer/ai-developer/playbook.md +2 -5
  95. package/dist/src/agents/developer/api-developer/playbook.md +2 -5
  96. package/dist/src/agents/developer/cli-developer/playbook.md +2 -5
  97. package/dist/src/agents/developer/web-developer/playbook.md +2 -5
  98. package/dist/src/agents/meta/agent-summoner/output.md +2 -2
  99. package/dist/src/agents/meta/agent-summoner/playbook.md +1 -13
  100. package/dist/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  101. package/dist/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  102. package/dist/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  103. package/dist/src/agents/tester/ai-tester/playbook.md +2 -0
  104. package/dist/src/agents/tester/api-tester/critical-requirements.md +1 -2
  105. package/dist/src/agents/tester/api-tester/playbook.md +2 -0
  106. package/dist/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  107. package/dist/src/agents/tester/cli-tester/playbook.md +2 -0
  108. package/dist/src/agents/tester/web-tester/critical-requirements.md +1 -2
  109. package/dist/src/agents/tester/web-tester/playbook.md +2 -0
  110. package/package.json +9 -8
  111. package/src/agents/developer/ai-developer/playbook.md +2 -5
  112. package/src/agents/developer/api-developer/playbook.md +2 -5
  113. package/src/agents/developer/cli-developer/playbook.md +2 -5
  114. package/src/agents/developer/web-developer/playbook.md +2 -5
  115. package/src/agents/meta/agent-summoner/output.md +2 -2
  116. package/src/agents/meta/agent-summoner/playbook.md +1 -13
  117. package/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  118. package/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  119. package/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  120. package/src/agents/tester/ai-tester/playbook.md +2 -0
  121. package/src/agents/tester/api-tester/critical-requirements.md +1 -2
  122. package/src/agents/tester/api-tester/playbook.md +2 -0
  123. package/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  124. package/src/agents/tester/cli-tester/playbook.md +2 -0
  125. package/src/agents/tester/web-tester/critical-requirements.md +1 -2
  126. package/src/agents/tester/web-tester/playbook.md +2 -0
  127. package/src/schemas/project-config.schema.json +0 -3
  128. package/src/schemas/project-source-config.schema.json +0 -6
  129. package/dist/chunk-3G7X2WKI.js.map +0 -1
  130. package/dist/chunk-44TE3RKH.js.map +0 -1
  131. package/dist/chunk-4AAOOAIN.js.map +0 -1
  132. package/dist/chunk-52HDHJ7I.js.map +0 -1
  133. package/dist/chunk-6HNXYYVF.js +0 -373
  134. package/dist/chunk-6HNXYYVF.js.map +0 -1
  135. package/dist/chunk-6ZRH5RHC.js.map +0 -1
  136. package/dist/chunk-7RDMTR64.js.map +0 -1
  137. package/dist/chunk-BMRUNMPV.js.map +0 -1
  138. package/dist/chunk-CLPUWOSA.js +0 -46
  139. package/dist/chunk-CLPUWOSA.js.map +0 -1
  140. package/dist/chunk-F2BHT5C4.js.map +0 -1
  141. package/dist/chunk-F5EBEATU.js.map +0 -1
  142. package/dist/chunk-HED2DAXZ.js.map +0 -1
  143. package/dist/chunk-JFLVEFFP.js.map +0 -1
  144. package/dist/chunk-KOLDW6SF.js.map +0 -1
  145. package/dist/chunk-MQ6CGZNJ.js.map +0 -1
  146. package/dist/chunk-NCWDK6L7.js.map +0 -1
  147. package/dist/chunk-NEZ4OAOL.js.map +0 -1
  148. package/dist/chunk-NIHUOWE4.js +0 -106
  149. package/dist/chunk-NIHUOWE4.js.map +0 -1
  150. package/dist/chunk-NQW25DCF.js.map +0 -1
  151. package/dist/chunk-OYJQUA3D.js.map +0 -1
  152. package/dist/chunk-PJWGTNOX.js.map +0 -1
  153. package/dist/chunk-RIPSGNLU.js.map +0 -1
  154. package/dist/chunk-SZYQISA2.js.map +0 -1
  155. package/dist/chunk-USVBYQSQ.js.map +0 -1
  156. package/dist/chunk-V3KTSP3Q.js +0 -940
  157. package/dist/chunk-V3KTSP3Q.js.map +0 -1
  158. package/dist/chunk-WTWMGH2C.js.map +0 -1
  159. package/dist/load-agent-defs-YMDWBFDP.js +0 -14
  160. package/dist/recompile-project-agents-SZ76WNTW.js +0 -18
  161. package/dist/source-loader-C5SQXZXI.js.map +0 -1
  162. /package/dist/{load-agent-defs-YMDWBFDP.js.map → load-agent-defs-UBWITIEI.js.map} +0 -0
  163. /package/dist/{recompile-project-agents-SZ76WNTW.js.map → source-loader-YGG7DY2W.js.map} +0 -0
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isActiveAt,
4
+ isGlobalTombstone
5
+ } from "./chunk-A6OWEJGC.js";
6
+
7
+ // src/cli/lib/configuration/scope-diff.ts
8
+ import { partition } from "remeda";
9
+ function computeScopeDiff(input) {
10
+ const { currentSkills, currentAgents, installedSkillConfigs, installedAgentConfigs, isInitMode } = input;
11
+ const skills = diffRoster(currentSkills, installedSkillConfigs, (skill) => skill.id, isInitMode);
12
+ const agents = diffRoster(
13
+ currentAgents,
14
+ installedAgentConfigs,
15
+ (agent) => agent.name,
16
+ isInitMode
17
+ );
18
+ const skillRow = skillRowClassifier(installedSkillConfigs);
19
+ const agentRow = agentRowClassifier(installedAgentConfigs);
20
+ const projectSkillRows = rowsOf(skills.project, skillRow, toRemovedSkillRow);
21
+ const globalSkillRows = rowsOf(skills.global, skillRow, toRemovedSkillRow);
22
+ const projectAgentRows = rowsOf(agents.project, agentRow, toRemovedAgentRow);
23
+ const globalAgentRows = rowsOf(agents.global, agentRow, toRemovedAgentRow);
24
+ const hasContent = [projectSkillRows, globalSkillRows, projectAgentRows, globalAgentRows].some(
25
+ (rows) => rows.length > 0
26
+ );
27
+ return { projectSkillRows, globalSkillRows, projectAgentRows, globalAgentRows, hasContent };
28
+ }
29
+ function diffRoster(current, installed, identityOf, isInitMode) {
30
+ const activeBaseline = (installed ?? []).filter((entry) => !entry.excluded);
31
+ const vacated = vacatedInstalls(activeBaseline, current, identityOf);
32
+ const projectEntries = current.filter((entry) => isActiveAt(entry, "project"));
33
+ const claimedByProject = new Set(projectEntries.map(identityOf));
34
+ const [inheritedGlobals, removedGlobals] = partition(
35
+ vacated.filter((entry) => entry.scope === "global"),
36
+ (entry) => claimedByProject.has(identityOf(entry))
37
+ );
38
+ return {
39
+ project: {
40
+ listed: projectEntries,
41
+ removed: vacated.filter((entry) => entry.scope === "project")
42
+ },
43
+ global: {
44
+ listed: [
45
+ ...current.filter((entry) => isActiveAt(entry, "global")),
46
+ ...inheritedGlobals,
47
+ ...current.filter(isGlobalTombstone)
48
+ ],
49
+ removed: isInitMode ? [] : removedGlobals
50
+ }
51
+ };
52
+ }
53
+ function vacatedInstalls(activeBaseline, current, identityOf) {
54
+ const slotOf = (entry) => slotKey(identityOf(entry), entry.scope);
55
+ const occupiedSlots = new Set(current.map(slotOf));
56
+ return activeBaseline.filter((install) => !occupiedSlots.has(slotOf(install)));
57
+ }
58
+ function rowsOf(entries, toRow, toRemovedRow) {
59
+ return [...entries.listed.map(toRow), ...entries.removed.map(toRemovedRow)];
60
+ }
61
+ function slotKey(identity, scope) {
62
+ return `${identity}:${scope}`;
63
+ }
64
+ function formatScopeTag(scope) {
65
+ return scope === "global" ? "[G]" : "[P]";
66
+ }
67
+ function skillRowClassifier(installed) {
68
+ const installedSlots = installed ? new Set(installed.map((skill) => slotKey(skill.id, skill.scope))) : null;
69
+ const installedOriginBySlot = installed ? new Map(
70
+ installed.filter((skill) => !skill.excluded).map((skill) => [slotKey(skill.id, skill.scope), skill.origin])
71
+ ) : null;
72
+ return (skill) => classifySkillDiffRow(skill, installedSlots, installedOriginBySlot);
73
+ }
74
+ function agentRowClassifier(installed) {
75
+ const installedSlots = installed ? new Set(installed.map((agent) => slotKey(agent.name, agent.scope))) : null;
76
+ return (agent) => classifyAgentDiffRow(agent, installedSlots);
77
+ }
78
+ function classifySkillDiffRow(skill, installedSlots, installedOriginBySlot) {
79
+ const slot = slotKey(skill.id, skill.scope);
80
+ const isNew = installedSlots === null || !installedSlots.has(slot);
81
+ const installedOrigin = installedOriginBySlot?.get(slot);
82
+ const modeChanged = !isNew && installedOrigin != null && installedOrigin !== skill.origin;
83
+ if (modeChanged) {
84
+ return { id: skill.id, source: skill.origin, status: "mode-changed" };
85
+ }
86
+ return { id: skill.id, source: skill.origin, status: isNew ? "added" : "unchanged" };
87
+ }
88
+ function classifyAgentDiffRow(agent, installedSlots) {
89
+ const isNew = installedSlots === null || !installedSlots.has(slotKey(agent.name, agent.scope));
90
+ return { name: agent.name, status: isNew ? "added" : "unchanged" };
91
+ }
92
+ function toRemovedSkillRow(skill) {
93
+ return { id: skill.id, source: skill.origin, status: "removed" };
94
+ }
95
+ function toRemovedAgentRow(agent) {
96
+ return { name: agent.name, status: "removed" };
97
+ }
98
+
99
+ export {
100
+ computeScopeDiff,
101
+ formatScopeTag
102
+ };
103
+ //# sourceMappingURL=chunk-4RQKCV6I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/configuration/scope-diff.ts"],"sourcesContent":["import { partition } from \"remeda\";\nimport type { AgentScopeConfig, SkillConfig, SkillScope } from \"../../types/config\";\nimport type { AgentName, SkillId } from \"../../types/index\";\nimport { isActiveAt, isGlobalTombstone, type ScopedEntry } from \"./scope-predicates\";\n\nexport type ScopeDiffInput = {\n currentSkills: SkillConfig[];\n currentAgents: AgentScopeConfig[];\n installedSkillConfigs: SkillConfig[] | null;\n installedAgentConfigs: AgentScopeConfig[] | null;\n isInitMode: boolean;\n};\n\nexport type DiffRowStatus = \"added\" | \"mode-changed\" | \"removed\" | \"unchanged\";\n\nexport type SkillDiffRow = {\n id: SkillId;\n source: string;\n status: DiffRowStatus;\n};\n\nexport type AgentDiffRow = {\n name: AgentName;\n status: Exclude<DiffRowStatus, \"mode-changed\">;\n};\n\nexport type ScopeDiff = {\n projectSkillRows: SkillDiffRow[];\n globalSkillRows: SkillDiffRow[];\n projectAgentRows: AgentDiffRow[];\n globalAgentRows: AgentDiffRow[];\n hasContent: boolean;\n};\n\n/** One scope's share of a roster's diff: the entries listed with a status, then the removals. */\ntype ScopeEntries<Entry> = { listed: Entry[]; removed: Entry[] };\n\ntype RosterDiff<Entry> = Record<SkillScope, ScopeEntries<Entry>>;\n\n/**\n * A tombstone occupies its (id, scope) slot without filling it: it silences a global install at\n * project scope. Slot checks count tombstones; removal and `~` read the active baseline only.\n */\nexport function computeScopeDiff(input: ScopeDiffInput): ScopeDiff {\n const { currentSkills, currentAgents, installedSkillConfigs, installedAgentConfigs, isInitMode } =\n input;\n\n const skills = diffRoster(currentSkills, installedSkillConfigs, (skill) => skill.id, isInitMode);\n const agents = diffRoster(\n currentAgents,\n installedAgentConfigs,\n (agent) => agent.name,\n isInitMode,\n );\n const skillRow = skillRowClassifier(installedSkillConfigs);\n const agentRow = agentRowClassifier(installedAgentConfigs);\n\n const projectSkillRows = rowsOf(skills.project, skillRow, toRemovedSkillRow);\n const globalSkillRows = rowsOf(skills.global, skillRow, toRemovedSkillRow);\n const projectAgentRows = rowsOf(agents.project, agentRow, toRemovedAgentRow);\n const globalAgentRows = rowsOf(agents.global, agentRow, toRemovedAgentRow);\n\n const hasContent = [projectSkillRows, globalSkillRows, projectAgentRows, globalAgentRows].some(\n (rows) => rows.length > 0,\n );\n\n return { projectSkillRows, globalSkillRows, projectAgentRows, globalAgentRows, hasContent };\n}\n\nfunction diffRoster<Entry extends ScopedEntry>(\n current: Entry[],\n installed: Entry[] | null,\n identityOf: (entry: Entry) => string,\n isInitMode: boolean,\n): RosterDiff<Entry> {\n // The installs the baseline actually records; tombstones are not installs.\n const activeBaseline = (installed ?? []).filter((entry) => !entry.excluded);\n const vacated = vacatedInstalls(activeBaseline, current, identityOf);\n const projectEntries = current.filter((entry) => isActiveAt(entry, \"project\"));\n const claimedByProject = new Set(projectEntries.map(identityOf));\n // A vacated global the project claims is inherited: listed once under Global, never removed.\n const [inheritedGlobals, removedGlobals] = partition(\n vacated.filter((entry) => entry.scope === \"global\"),\n (entry) => claimedByProject.has(identityOf(entry)),\n );\n\n return {\n project: {\n listed: projectEntries,\n removed: vacated.filter((entry) => entry.scope === \"project\"),\n },\n global: {\n listed: [\n ...current.filter((entry) => isActiveAt(entry, \"global\")),\n ...inheritedGlobals,\n ...current.filter(isGlobalTombstone),\n ],\n removed: isInitMode ? [] : removedGlobals,\n },\n };\n}\n\n/** Baseline installs whose slot nothing in current, active or tombstone, occupies. */\nfunction vacatedInstalls<Entry extends ScopedEntry>(\n activeBaseline: Entry[],\n current: Entry[],\n identityOf: (entry: Entry) => string,\n): Entry[] {\n const slotOf = (entry: Entry) => slotKey(identityOf(entry), entry.scope);\n const occupiedSlots = new Set(current.map(slotOf));\n return activeBaseline.filter((install) => !occupiedSlots.has(slotOf(install)));\n}\n\nfunction rowsOf<Entry, Row>(\n entries: ScopeEntries<Entry>,\n toRow: (entry: Entry) => Row,\n toRemovedRow: (entry: Entry) => Row,\n): Row[] {\n return [...entries.listed.map(toRow), ...entries.removed.map(toRemovedRow)];\n}\n\n/** The `(id, scope)` SLOT key this module diffs on, rather than the id alone. */\nfunction slotKey(identity: string, scope: SkillScope | undefined): string {\n return `${identity}:${scope}`;\n}\n\nexport function formatScopeTag(scope: SkillScope): \"[G]\" | \"[P]\" {\n return scope === \"global\" ? \"[G]\" : \"[P]\";\n}\n\nfunction skillRowClassifier(installed: SkillConfig[] | null): (skill: SkillConfig) => SkillDiffRow {\n const installedSlots = installed\n ? new Set(installed.map((skill) => slotKey(skill.id, skill.scope)))\n : null;\n const installedOriginBySlot = installed\n ? new Map(\n installed\n .filter((skill) => !skill.excluded)\n .map((skill) => [slotKey(skill.id, skill.scope), skill.origin]),\n )\n : null;\n return (skill) => classifySkillDiffRow(skill, installedSlots, installedOriginBySlot);\n}\n\nfunction agentRowClassifier(\n installed: AgentScopeConfig[] | null,\n): (agent: AgentScopeConfig) => AgentDiffRow {\n const installedSlots = installed\n ? new Set(installed.map((agent) => slotKey(agent.name, agent.scope)))\n : null;\n return (agent) => classifyAgentDiffRow(agent, installedSlots);\n}\n\n/** Compares `origin`, which is where a skill's install mode is recorded. */\nfunction classifySkillDiffRow(\n skill: SkillConfig,\n installedSlots: Set<string> | null,\n installedOriginBySlot: Map<string, string> | null,\n): SkillDiffRow {\n const slot = slotKey(skill.id, skill.scope);\n const isNew = installedSlots === null || !installedSlots.has(slot);\n const installedOrigin = installedOriginBySlot?.get(slot);\n const modeChanged = !isNew && installedOrigin != null && installedOrigin !== skill.origin;\n if (modeChanged) {\n return { id: skill.id, source: skill.origin, status: \"mode-changed\" };\n }\n return { id: skill.id, source: skill.origin, status: isNew ? \"added\" : \"unchanged\" };\n}\n\nfunction classifyAgentDiffRow(\n agent: AgentScopeConfig,\n installedSlots: Set<string> | null,\n): AgentDiffRow {\n const isNew = installedSlots === null || !installedSlots.has(slotKey(agent.name, agent.scope));\n return { name: agent.name, status: isNew ? \"added\" : \"unchanged\" };\n}\n\nfunction toRemovedSkillRow(skill: SkillConfig): SkillDiffRow {\n return { id: skill.id, source: skill.origin, status: \"removed\" };\n}\n\nfunction toRemovedAgentRow(agent: AgentScopeConfig): AgentDiffRow {\n return { name: agent.name, status: \"removed\" };\n}\n"],"mappings":"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","names":[]}
@@ -4,32 +4,41 @@ import {
4
4
  } from "./chunk-OZXAJNLA.js";
5
5
  import {
6
6
  CLI_COLORS
7
- } from "./chunk-PJWGTNOX.js";
7
+ } from "./chunk-A6OWEJGC.js";
8
8
 
9
9
  // src/cli/components/common/removal-plan-confirm.tsx
10
10
  import "react";
11
11
  import { Box, Text, useApp } from "ink";
12
- import { jsx, jsxs } from "react/jsx-runtime";
12
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
13
  var ITEM_INDENT = 3;
14
14
  var RemovalPlanConfirm = ({
15
15
  heading,
16
16
  sections,
17
+ overwritten,
17
18
  statements,
18
19
  message,
19
20
  onConfirm,
20
21
  onCancel
21
22
  }) => {
22
23
  const { exit } = useApp();
24
+ const opensTheFrame = heading === void 0 && sections.length === 0;
23
25
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
24
- /* @__PURE__ */ jsx(Text, { bold: true, children: heading }),
25
- /* @__PURE__ */ jsx(Text, { children: " " }),
26
+ heading !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
27
+ /* @__PURE__ */ jsx(Text, { bold: true, children: heading }),
28
+ /* @__PURE__ */ jsx(Text, { children: " " })
29
+ ] }),
26
30
  sections.map((section) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
27
31
  /* @__PURE__ */ jsxs(Text, { color: CLI_COLORS.ERROR, children: [
28
32
  " ",
29
33
  section.label
30
34
  ] }),
31
- /* @__PURE__ */ jsx(Box, { flexDirection: "column", paddingLeft: ITEM_INDENT, children: section.items.map((item) => /* @__PURE__ */ jsx(Text, { dimColor: true, children: item }, item)) })
35
+ /* @__PURE__ */ jsx(PlanItems, { items: section.items })
32
36
  ] }, section.label)),
37
+ overwritten !== void 0 && overwritten.items.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
38
+ !opensTheFrame && /* @__PURE__ */ jsx(Text, { children: " " }),
39
+ /* @__PURE__ */ jsx(Text, { bold: true, children: overwritten.label }),
40
+ /* @__PURE__ */ jsx(PlanItems, { items: overwritten.items })
41
+ ] }),
33
42
  statements.map((statement) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
34
43
  /* @__PURE__ */ jsx(Text, { children: " " }),
35
44
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: statement })
@@ -52,8 +61,9 @@ var RemovalPlanConfirm = ({
52
61
  )
53
62
  ] });
54
63
  };
64
+ var PlanItems = ({ items }) => /* @__PURE__ */ jsx(Box, { flexDirection: "column", paddingLeft: ITEM_INDENT, children: items.map((item) => /* @__PURE__ */ jsx(Text, { dimColor: true, children: item }, item)) });
55
65
 
56
66
  export {
57
67
  RemovalPlanConfirm
58
68
  };
59
- //# sourceMappingURL=chunk-USVBYQSQ.js.map
69
+ //# sourceMappingURL=chunk-5FM77WKW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/common/removal-plan-confirm.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, Text, useApp } from \"ink\";\n\nimport { Confirm } from \"./confirm.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\n\nconst ITEM_INDENT = 3;\n\nexport type RemovalPlanSection = {\n label: string;\n items: string[];\n};\n\nexport type RemovalPlanConfirmProps = {\n /** Omitted where the plan opens on what it overwrites. */\n heading?: string;\n /** Omit headings with no items. */\n sections: RemovalPlanSection[];\n /** What the apply writes over in place, under a heading of its own; omitted when empty. */\n overwritten?: RemovalPlanSection;\n /** Prose under the removals: what stays and why, and what a removal reaches beyond. */\n statements: string[];\n message: string;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const RemovalPlanConfirm: React.FC<RemovalPlanConfirmProps> = ({\n heading,\n sections,\n overwritten,\n statements,\n message,\n onConfirm,\n onCancel,\n}) => {\n const { exit } = useApp();\n const opensTheFrame = heading === undefined && sections.length === 0;\n\n return (\n <Box flexDirection=\"column\">\n {heading !== undefined && (\n <>\n <Text bold>{heading}</Text>\n <Text> </Text>\n </>\n )}\n\n {sections.map((section) => (\n <Box key={section.label} flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> {section.label}</Text>\n <PlanItems items={section.items} />\n </Box>\n ))}\n\n {overwritten !== undefined && overwritten.items.length > 0 && (\n <Box flexDirection=\"column\">\n {!opensTheFrame && <Text> </Text>}\n <Text bold>{overwritten.label}</Text>\n <PlanItems items={overwritten.items} />\n </Box>\n )}\n\n {statements.map((statement) => (\n <Box key={statement} flexDirection=\"column\">\n <Text> </Text>\n <Text dimColor>{statement}</Text>\n </Box>\n ))}\n\n <Text> </Text>\n <Confirm\n message={message}\n onConfirm={() => {\n onConfirm();\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n defaultValue={false}\n />\n </Box>\n );\n};\n\nconst PlanItems: React.FC<{ items: string[] }> = ({ items }) => (\n <Box flexDirection=\"column\" paddingLeft={ITEM_INDENT}>\n {items.map((item) => (\n <Text key={item} dimColor>\n {item}\n </Text>\n ))}\n </Box>\n);\n"],"mappings":";;;;;;;;;AAAA,OAAkB;AAClB,SAAS,KAAK,MAAM,cAAc;AAyC1B,mBACE,KADF;AApCR,IAAM,cAAc;AAqBb,IAAM,qBAAwD,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,gBAAgB,YAAY,UAAa,SAAS,WAAW;AAEnE,SACE,qBAAC,OAAI,eAAc,UAChB;AAAA,gBAAY,UACX,iCACE;AAAA,0BAAC,QAAK,MAAI,MAAE,mBAAQ;AAAA,MACpB,oBAAC,QAAK,eAAC;AAAA,OACT;AAAA,IAGD,SAAS,IAAI,CAAC,YACb,qBAAC,OAAwB,eAAc,UACrC;AAAA,2BAAC,QAAK,OAAO,WAAW,OAAO;AAAA;AAAA,QAAE,QAAQ;AAAA,SAAM;AAAA,MAC/C,oBAAC,aAAU,OAAO,QAAQ,OAAO;AAAA,SAFzB,QAAQ,KAGlB,CACD;AAAA,IAEA,gBAAgB,UAAa,YAAY,MAAM,SAAS,KACvD,qBAAC,OAAI,eAAc,UAChB;AAAA,OAAC,iBAAiB,oBAAC,QAAK,eAAC;AAAA,MAC1B,oBAAC,QAAK,MAAI,MAAE,sBAAY,OAAM;AAAA,MAC9B,oBAAC,aAAU,OAAO,YAAY,OAAO;AAAA,OACvC;AAAA,IAGD,WAAW,IAAI,CAAC,cACf,qBAAC,OAAoB,eAAc,UACjC;AAAA,0BAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,UAAQ,MAAE,qBAAU;AAAA,SAFlB,SAGV,CACD;AAAA,IAED,oBAAC,QAAK,eAAC;AAAA,IACP;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,MAAM;AACf,oBAAU;AACV,eAAK;AAAA,QACP;AAAA,QACA,UAAU,MAAM;AACd,mBAAS;AACT,eAAK;AAAA,QACP;AAAA,QACA,cAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAEJ;AAEA,IAAM,YAA2C,CAAC,EAAE,MAAM,MACxD,oBAAC,OAAI,eAAc,UAAS,aAAa,aACtC,gBAAM,IAAI,CAAC,SACV,oBAAC,QAAgB,UAAQ,MACtB,kBADQ,IAEX,CACD,GACH;","names":[]}
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- getAgentDefinitions
4
- } from "./chunk-3G7X2WKI.js";
3
+ getLocalAgentDefinitions
4
+ } from "./chunk-WII6GOPM.js";
5
5
  import {
6
6
  loadMergedAgents
7
- } from "./chunk-MQ6CGZNJ.js";
7
+ } from "./chunk-3YYHL76L.js";
8
8
 
9
9
  // src/cli/lib/operations/project/load-agent-defs.ts
10
10
  async function loadAgentDefs() {
11
- const agentSourcePaths = await getAgentDefinitions();
11
+ const agentSourcePaths = await getLocalAgentDefinitions();
12
12
  const agents = await loadMergedAgents(agentSourcePaths.sourcePath);
13
13
  return {
14
14
  agents,
@@ -20,4 +20,4 @@ async function loadAgentDefs() {
20
20
  export {
21
21
  loadAgentDefs
22
22
  };
23
- //# sourceMappingURL=chunk-HED2DAXZ.js.map
23
+ //# sourceMappingURL=chunk-7IVLVEHX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/operations/project/load-agent-defs.ts"],"sourcesContent":["import { getLocalAgentDefinitions } from \"../../agents/index.js\";\nimport { loadMergedAgents } from \"../../loading/index.js\";\nimport type { AgentDefinition, AgentName, AgentSourcePaths } from \"../../../types/index.js\";\n\nexport type AgentDefs = {\n /** The CLI's own sub-agent definitions; nothing a marketplace declares. */\n agents: Partial<Record<AgentName, AgentDefinition>>;\n sourcePath: string;\n agentSourcePaths: AgentSourcePaths;\n};\n\n/**\n * The single definition of which sub-agents exist, shared by every compile pass and every\n * emitted `AgentName` union; a marketplace's sub-agents are never included.\n */\nexport async function loadAgentDefs(): Promise<AgentDefs> {\n const agentSourcePaths = await getLocalAgentDefinitions();\n const agents = await loadMergedAgents(agentSourcePaths.sourcePath);\n\n return {\n agents,\n sourcePath: agentSourcePaths.sourcePath,\n agentSourcePaths,\n };\n}\n"],"mappings":";;;;;;;;;AAeA,eAAsB,gBAAoC;AACxD,QAAM,mBAAmB,MAAM,yBAAyB;AACxD,QAAM,SAAS,MAAM,iBAAiB,iBAAiB,UAAU;AAEjE,SAAO;AAAA,IACL;AAAA,IACA,YAAY,iBAAiB;AAAA,IAC7B;AAAA,EACF;AACF;","names":[]}