agents-inc 0.153.0 → 0.154.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 (116) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/{chunk-EFU6P3B7.js → chunk-2IMYK4WN.js} +3 -3
  3. package/dist/{chunk-U2YSGBHA.js → chunk-4VCWL2IG.js} +33 -16
  4. package/dist/chunk-4VCWL2IG.js.map +1 -0
  5. package/dist/{chunk-ORJ5Y222.js → chunk-5MFJ24VM.js} +90 -24
  6. package/dist/chunk-5MFJ24VM.js.map +1 -0
  7. package/dist/{chunk-TY6CAOL7.js → chunk-7VZV4O6B.js} +3 -3
  8. package/dist/{chunk-4VYALFQZ.js → chunk-AKQ5QISO.js} +6 -6
  9. package/dist/{chunk-U2DNAHFE.js → chunk-AURY6RT6.js} +3 -3
  10. package/dist/{chunk-ACKC577F.js → chunk-B66SC72V.js} +3 -3
  11. package/dist/{chunk-WDAO3RUY.js → chunk-BZ4CZBOM.js} +3 -3
  12. package/dist/{chunk-NXQAY5U7.js → chunk-CBF4ZYV3.js} +4556 -4457
  13. package/dist/chunk-CBF4ZYV3.js.map +1 -0
  14. package/dist/{chunk-JFAUQDZM.js → chunk-CHNA5RVS.js} +3 -3
  15. package/dist/{chunk-2HC2SNRP.js → chunk-DRKSYJZ2.js} +1 -5
  16. package/dist/chunk-DRKSYJZ2.js.map +1 -0
  17. package/dist/{chunk-X5XJ6WKO.js → chunk-FMYHWKGG.js} +45 -4
  18. package/dist/chunk-FMYHWKGG.js.map +1 -0
  19. package/dist/{chunk-K7PJDWER.js → chunk-GUDGCFSF.js} +6 -6
  20. package/dist/{chunk-35VOK7XE.js → chunk-IPJOMAWC.js} +4355 -4355
  21. package/dist/{chunk-35VOK7XE.js.map → chunk-IPJOMAWC.js.map} +1 -1
  22. package/dist/{chunk-VGEBYCQZ.js → chunk-IXEDSKMH.js} +4 -15
  23. package/dist/chunk-IXEDSKMH.js.map +1 -0
  24. package/dist/{chunk-ZNDLUWWD.js → chunk-LA3JPESW.js} +3 -3
  25. package/dist/{chunk-M5HSTNYU.js → chunk-MJFIO5SX.js} +5 -23
  26. package/dist/chunk-MJFIO5SX.js.map +1 -0
  27. package/dist/{chunk-VECFAKM5.js → chunk-NFH6SA62.js} +4 -4
  28. package/dist/{chunk-R4SEU3DF.js → chunk-NKCY2ULI.js} +2 -2
  29. package/dist/{chunk-IO4VEW5U.js → chunk-ONWEOS77.js} +2 -2
  30. package/dist/{chunk-FRWKCE6R.js → chunk-PRJD5MMQ.js} +3 -3
  31. package/dist/{chunk-HEBPKK5L.js → chunk-QQTYMW7N.js} +11 -23
  32. package/dist/chunk-QQTYMW7N.js.map +1 -0
  33. package/dist/{chunk-KET3EVGX.js → chunk-QUDQTO3O.js} +3 -3
  34. package/dist/{chunk-BMGBA6HJ.js → chunk-R7JV22QK.js} +12 -12
  35. package/dist/{chunk-FIHTAFST.js → chunk-TUQF577Z.js} +30 -30
  36. package/dist/{chunk-FIHTAFST.js.map → chunk-TUQF577Z.js.map} +1 -1
  37. package/dist/{chunk-NXGMM5YN.js → chunk-UW44KSYL.js} +3 -3
  38. package/dist/{chunk-WG6V6VJV.js → chunk-WRRP47PY.js} +2 -2
  39. package/dist/{chunk-F7Z5I6GU.js → chunk-XMEIVWAS.js} +4 -4
  40. package/dist/{chunk-REKOWTIB.js → chunk-ZU6DAR4S.js} +42 -8
  41. package/dist/chunk-ZU6DAR4S.js.map +1 -0
  42. package/dist/commands/build/marketplace.js +6 -5
  43. package/dist/commands/build/marketplace.js.map +1 -1
  44. package/dist/commands/build/plugins.js +6 -6
  45. package/dist/commands/compile.js +48 -10
  46. package/dist/commands/compile.js.map +1 -1
  47. package/dist/commands/doctor.js +10 -10
  48. package/dist/commands/edit.js +93 -59
  49. package/dist/commands/edit.js.map +1 -1
  50. package/dist/commands/eject.js +10 -10
  51. package/dist/commands/init.js +29 -29
  52. package/dist/commands/list.js +7 -7
  53. package/dist/commands/search.js +29 -21
  54. package/dist/commands/search.js.map +1 -1
  55. package/dist/commands/uninstall.js +198 -147
  56. package/dist/commands/uninstall.js.map +1 -1
  57. package/dist/commands/update.js +5 -5
  58. package/dist/components/wizard/category-grid.js +3 -3
  59. package/dist/components/wizard/checkbox-grid.js +2 -2
  60. package/dist/components/wizard/domain-selection.js +8 -8
  61. package/dist/components/wizard/run-wizard-session.js +21 -21
  62. package/dist/components/wizard/skill-agent-summary.js +5 -5
  63. package/dist/components/wizard/source-grid.js +3 -3
  64. package/dist/components/wizard/stack-selection.js +5 -5
  65. package/dist/components/wizard/step-agents.js +8 -8
  66. package/dist/components/wizard/step-build.js +7 -7
  67. package/dist/components/wizard/step-confirm.js +8 -8
  68. package/dist/components/wizard/step-sources.js +7 -7
  69. package/dist/components/wizard/step-stack.js +6 -6
  70. package/dist/components/wizard/summary-panel.js +7 -7
  71. package/dist/components/wizard/wizard-layout.js +9 -9
  72. package/dist/components/wizard/wizard.js +20 -20
  73. package/dist/copy-local-skills-WVHJFRPK.js +14 -0
  74. package/dist/hooks/init.js +29 -29
  75. package/dist/load-agent-defs-5OT54J5M.js +15 -0
  76. package/dist/{loader-4U7UCE2Y.js → loader-JIZDTR4G.js} +2 -2
  77. package/dist/recompile-project-agents-VREEPBDV.js +20 -0
  78. package/dist/{source-loader-ZNSYJJCI.js → source-loader-OE6EJFPU.js} +4 -4
  79. package/dist/stores/wizard-store.js +4 -4
  80. package/package.json +1 -1
  81. package/src/schemas/plugin.schema.json +3 -0
  82. package/dist/chunk-2HC2SNRP.js.map +0 -1
  83. package/dist/chunk-HEBPKK5L.js.map +0 -1
  84. package/dist/chunk-M5HSTNYU.js.map +0 -1
  85. package/dist/chunk-NXQAY5U7.js.map +0 -1
  86. package/dist/chunk-ORJ5Y222.js.map +0 -1
  87. package/dist/chunk-REKOWTIB.js.map +0 -1
  88. package/dist/chunk-U2YSGBHA.js.map +0 -1
  89. package/dist/chunk-VGEBYCQZ.js.map +0 -1
  90. package/dist/chunk-X5XJ6WKO.js.map +0 -1
  91. package/dist/copy-local-skills-KF2RAVD3.js +0 -14
  92. package/dist/load-agent-defs-DGXGBU3Q.js +0 -15
  93. package/dist/recompile-project-agents-CJVBAWDJ.js +0 -20
  94. /package/dist/{chunk-EFU6P3B7.js.map → chunk-2IMYK4WN.js.map} +0 -0
  95. /package/dist/{chunk-TY6CAOL7.js.map → chunk-7VZV4O6B.js.map} +0 -0
  96. /package/dist/{chunk-4VYALFQZ.js.map → chunk-AKQ5QISO.js.map} +0 -0
  97. /package/dist/{chunk-U2DNAHFE.js.map → chunk-AURY6RT6.js.map} +0 -0
  98. /package/dist/{chunk-ACKC577F.js.map → chunk-B66SC72V.js.map} +0 -0
  99. /package/dist/{chunk-WDAO3RUY.js.map → chunk-BZ4CZBOM.js.map} +0 -0
  100. /package/dist/{chunk-JFAUQDZM.js.map → chunk-CHNA5RVS.js.map} +0 -0
  101. /package/dist/{chunk-K7PJDWER.js.map → chunk-GUDGCFSF.js.map} +0 -0
  102. /package/dist/{chunk-ZNDLUWWD.js.map → chunk-LA3JPESW.js.map} +0 -0
  103. /package/dist/{chunk-VECFAKM5.js.map → chunk-NFH6SA62.js.map} +0 -0
  104. /package/dist/{chunk-R4SEU3DF.js.map → chunk-NKCY2ULI.js.map} +0 -0
  105. /package/dist/{chunk-IO4VEW5U.js.map → chunk-ONWEOS77.js.map} +0 -0
  106. /package/dist/{chunk-FRWKCE6R.js.map → chunk-PRJD5MMQ.js.map} +0 -0
  107. /package/dist/{chunk-KET3EVGX.js.map → chunk-QUDQTO3O.js.map} +0 -0
  108. /package/dist/{chunk-BMGBA6HJ.js.map → chunk-R7JV22QK.js.map} +0 -0
  109. /package/dist/{chunk-NXGMM5YN.js.map → chunk-UW44KSYL.js.map} +0 -0
  110. /package/dist/{chunk-WG6V6VJV.js.map → chunk-WRRP47PY.js.map} +0 -0
  111. /package/dist/{chunk-F7Z5I6GU.js.map → chunk-XMEIVWAS.js.map} +0 -0
  112. /package/dist/{copy-local-skills-KF2RAVD3.js.map → copy-local-skills-WVHJFRPK.js.map} +0 -0
  113. /package/dist/{load-agent-defs-DGXGBU3Q.js.map → load-agent-defs-5OT54J5M.js.map} +0 -0
  114. /package/dist/{loader-4U7UCE2Y.js.map → loader-JIZDTR4G.js.map} +0 -0
  115. /package/dist/{recompile-project-agents-CJVBAWDJ.js.map → recompile-project-agents-VREEPBDV.js.map} +0 -0
  116. /package/dist/{source-loader-ZNSYJJCI.js.map → source-loader-OE6EJFPU.js.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  isDomain
4
- } from "./chunk-NXQAY5U7.js";
4
+ } from "./chunk-CBF4ZYV3.js";
5
5
  import {
6
6
  findStack
7
- } from "./chunk-35VOK7XE.js";
7
+ } from "./chunk-IPJOMAWC.js";
8
8
 
9
9
  // src/cli/components/wizard/utils.ts
10
10
  var DOMAIN_DISPLAY_NAMES = {
@@ -32,4 +32,4 @@ export {
32
32
  getDomainDisplayName,
33
33
  getStackName
34
34
  };
35
- //# sourceMappingURL=chunk-JFAUQDZM.js.map
35
+ //# sourceMappingURL=chunk-CHNA5RVS.js.map
@@ -5,8 +5,6 @@ var HOTKEY_INFO = { key: "i", label: "I" };
5
5
  var HOTKEY_ACCEPT_DEFAULTS = { key: "a", label: "A" };
6
6
  var HOTKEY_SCOPE = { key: "s", label: "S" };
7
7
  var HOTKEY_TOGGLE_LABELS = { key: "d", label: "D" };
8
- var HOTKEY_SET_ALL_LOCAL = { key: "l", label: "L" };
9
- var HOTKEY_SET_ALL_PLUGIN = { key: "p", label: "P" };
10
8
  var KEY_SPACE = " ";
11
9
  var KEY_LABEL_ENTER = "ENTER";
12
10
  var KEY_LABEL_ESC = "ESC";
@@ -23,8 +21,6 @@ export {
23
21
  HOTKEY_ACCEPT_DEFAULTS,
24
22
  HOTKEY_SCOPE,
25
23
  HOTKEY_TOGGLE_LABELS,
26
- HOTKEY_SET_ALL_LOCAL,
27
- HOTKEY_SET_ALL_PLUGIN,
28
24
  KEY_SPACE,
29
25
  KEY_LABEL_ENTER,
30
26
  KEY_LABEL_ESC,
@@ -32,4 +28,4 @@ export {
32
28
  isHotkey,
33
29
  isInfoPanelAvailable
34
30
  };
35
- //# sourceMappingURL=chunk-2HC2SNRP.js.map
31
+ //# sourceMappingURL=chunk-DRKSYJZ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/hotkeys.ts"],"sourcesContent":["/**\n * Centralized hotkey registry for wizard components.\n *\n * Every character-based hotkey and its display label lives here so that\n * changing a binding updates the key check, the footer hint, and the\n * info panel in one place.\n */\n\nimport type { WizardStep } from \"../../stores/wizard-store.js\";\n\n// ---------------------------------------------------------------------------\n// Global hotkeys (active across multiple wizard steps)\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_INFO = { key: \"i\", label: \"I\" } as const;\nexport const HOTKEY_ACCEPT_DEFAULTS = { key: \"a\", label: \"A\" } as const;\nexport const HOTKEY_SCOPE = { key: \"s\", label: \"S\" } as const;\n\n// ---------------------------------------------------------------------------\n// Build step hotkeys\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_TOGGLE_LABELS = { key: \"d\", label: \"D\" } as const;\n\n// ---------------------------------------------------------------------------\n// Sources step hotkeys\n// ---------------------------------------------------------------------------\n\n// None. The step's two bulk install-mode keys — `l` (set all local) and `p` (set\n// all plugin) — are withdrawn. They rewrote `source` on every active skill config\n// with no scope authority behind them, so from a project edit they reached the\n// inherited global rows the same step renders locked and non-focusable: the bulk\n// key could do what the per-row control provably cannot. Per-row SPACE on the\n// grid cell is the only install-mode surface, and its own inertness on a locked\n// row is the containment.\n\n// ---------------------------------------------------------------------------\n// Common key labels (for structural keys handled via Ink key objects)\n// ---------------------------------------------------------------------------\n\n/** The spacebar input character (Ink delivers a literal space for the space key). */\nexport const KEY_SPACE = \" \";\n\nexport const KEY_LABEL_ENTER = \"ENTER\" as const;\nexport const KEY_LABEL_ESC = \"ESC\" as const;\nexport const KEY_LABEL_SPACE = \"SPACE\" as const;\nexport const KEY_LABEL_DEL = \"DEL\" as const;\nexport const KEY_LABEL_ARROWS_VERT = \"\\u2191/\\u2193\" as const;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Case-insensitive check for a character hotkey. */\nexport function isHotkey(input: string, hotkey: { key: string }): boolean {\n return input.toLowerCase() === hotkey.key.toLowerCase();\n}\n\n/**\n * Whether `HOTKEY_INFO` does anything on `step` — the single answer both the\n * key handler in `wizard.tsx` and the footer hint in `wizard-layout.tsx` read,\n * so the wizard never advertises a key it ignores.\n *\n * The confirm step is excluded because it already renders the panel the\n * overlay would show, and the overlay REPLACES the step rather than sitting\n * over it: opening it there would unmount the confirm step's `Enter` handler\n * and strand the user on a screen nothing can complete.\n */\nexport function isInfoPanelAvailable(step: WizardStep): boolean {\n return step !== \"confirm\";\n}\n"],"mappings":";;;AAcO,IAAM,cAAc,EAAE,KAAK,KAAK,OAAO,IAAI;AAC3C,IAAM,yBAAyB,EAAE,KAAK,KAAK,OAAO,IAAI;AACtD,IAAM,eAAe,EAAE,KAAK,KAAK,OAAO,IAAI;AAM5C,IAAM,uBAAuB,EAAE,KAAK,KAAK,OAAO,IAAI;AAmBpD,IAAM,YAAY;AAElB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AASxB,SAAS,SAAS,OAAe,QAAkC;AACxE,SAAO,MAAM,YAAY,MAAM,OAAO,IAAI,YAAY;AACxD;AAYO,SAAS,qBAAqB,MAA2B;AAC9D,SAAO,SAAS;AAClB;","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  installPluginSkills,
4
4
  pluginInstallFailureError
5
- } from "./chunk-TY6CAOL7.js";
5
+ } from "./chunk-7VZV4O6B.js";
6
6
  import {
7
7
  clearTerminalScreen,
8
8
  formatTerminalTooSmallMessage,
@@ -17,15 +17,19 @@ import {
17
17
  fetchMarketplace,
18
18
  findConfigLoadFailures,
19
19
  findUnusableSavedSkillMetadata,
20
+ getStackSkillIds,
21
+ isActiveAt,
20
22
  pluginsInstalled,
21
23
  propagatedRecompileSummary,
22
24
  savedSkillMetadataUnusableError,
25
+ scopeBlockedStackAssignment,
26
+ skillAssignedToNoAgent,
23
27
  skillMetadataUnusableDetail
24
- } from "./chunk-NXQAY5U7.js";
28
+ } from "./chunk-CBF4ZYV3.js";
25
29
  import {
26
30
  getErrorMessage,
27
31
  warn
28
- } from "./chunk-U2YSGBHA.js";
32
+ } from "./chunk-4VCWL2IG.js";
29
33
  import {
30
34
  CLI_COLORS,
31
35
  MIN_TERMINAL_SIZE
@@ -43,6 +47,7 @@ var EXIT_CODES = {
43
47
  // src/cli/base-command.ts
44
48
  import { Command } from "@oclif/core";
45
49
  import chalk from "chalk";
50
+ import { unique } from "remeda";
46
51
 
47
52
  // src/cli/lib/operations/source/ensure-marketplace.ts
48
53
  async function ensureMarketplace(sourceResult) {
@@ -100,6 +105,20 @@ function waitForTerminal(isSatisfied) {
100
105
  process.stdout.on("resize", check);
101
106
  });
102
107
  }
108
+ function findUnassignedSkills(config) {
109
+ const assignedIds = new Set(config.stack ? getStackSkillIds(config.stack) : []);
110
+ const globalAgentNames = config.agents.filter((agent) => isActiveAt(agent, "global")).map((agent) => agent.name);
111
+ const unassignedIds = unique(
112
+ config.skills.filter((skill) => !skill.excluded).map((skill) => skill.id).filter((skillId) => !assignedIds.has(skillId))
113
+ );
114
+ return unassignedIds.map((skillId) => ({
115
+ skillId,
116
+ blockedBy: hasActiveProjectEntry(config.skills, skillId) ? globalAgentNames : []
117
+ }));
118
+ }
119
+ function hasActiveProjectEntry(skills, skillId) {
120
+ return skills.some((skill) => skill.id === skillId && isActiveAt(skill, "project"));
121
+ }
103
122
  var BaseCommand = class extends Command {
104
123
  async init() {
105
124
  await super.init();
@@ -229,6 +248,28 @@ var BaseCommand = class extends Command {
229
248
  }
230
249
  this.log(propagatedRecompileSummary(rewrittenCount, unchangedCount, failedCount));
231
250
  }
251
+ /**
252
+ * Names every selected skill this save left in no sub-agent's stack, and — where the
253
+ * scope rule is why — every sub-agent it was kept away from.
254
+ *
255
+ * Shared by `init` and `edit` for the reason {@link reportValidationErrors} is: both
256
+ * build the stack from the same rules over the same selection, so a skill that reaches
257
+ * nothing through one reaches nothing through the other. The rule being reported is
258
+ * CORRECT and nothing here changes it — a project-scoped skill installs, is written to
259
+ * `config.ts`, and is loaded by nobody, which every other surface reports as a clean
260
+ * install.
261
+ *
262
+ * `compile` says the same thing about the same shape one layer over, for a config
263
+ * hand-edited into it — see `Compile.warnScopeDroppedStackPairs`.
264
+ */
265
+ reportUnassignedSkills(config) {
266
+ for (const { skillId, blockedBy } of findUnassignedSkills(config)) {
267
+ this.warn(skillAssignedToNoAgent(skillId));
268
+ if (blockedBy.length > 0) {
269
+ this.warn(scopeBlockedStackAssignment(blockedBy, skillId));
270
+ }
271
+ }
272
+ }
232
273
  /**
233
274
  * Refuses to run when a config file exists but cannot be loaded.
234
275
  *
@@ -281,4 +322,4 @@ export {
281
322
  EXIT_CODES,
282
323
  BaseCommand
283
324
  };
284
- //# sourceMappingURL=chunk-X5XJ6WKO.js.map
325
+ //# sourceMappingURL=chunk-FMYHWKGG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/exit-codes.ts","../src/cli/base-command.ts","../src/cli/lib/operations/source/ensure-marketplace.ts","../src/cli/lib/operations/source/require-marketplace.ts"],"sourcesContent":["export const EXIT_CODES = {\n SUCCESS: 0,\n ERROR: 1,\n INVALID_ARGS: 2,\n NETWORK_ERROR: 3,\n CANCELLED: 4,\n} as const;\n","import { Command } from \"@oclif/core\";\n\nimport chalk from \"chalk\";\nimport { unique } from \"remeda\";\n\nimport { CLI_COLORS, MIN_TERMINAL_SIZE } from \"./consts.js\";\nimport { getErrorMessage } from \"./utils/errors.js\";\nimport {\n configUnreadableError,\n pluginsInstalled,\n propagatedRecompileSummary,\n savedSkillMetadataUnusableError,\n scopeBlockedStackAssignment,\n skillAssignedToNoAgent,\n skillMetadataUnusableDetail,\n STATUS_MESSAGES,\n} from \"./utils/messages.js\";\nimport {\n clearTerminalScreen,\n formatTerminalTooSmallMessage,\n isTerminalLargeEnough,\n} from \"./utils/terminal.js\";\nimport { EXIT_CODES } from \"./lib/exit-codes.js\";\nimport type { ResolvedConfig } from \"./lib/configuration/index.js\";\nimport { isActiveAt } from \"./lib/configuration/scope-predicates.js\";\nimport { getStackSkillIds } from \"./lib/stacks/index.js\";\nimport type {\n AgentName,\n MergedSkillsMatrix,\n ProjectConfig,\n SelectionValidation,\n SkillConfig,\n SkillId,\n} from \"./types/index.js\";\nimport { findConfigLoadFailures } from \"./lib/configuration/project-config.js\";\nimport { findUnusableSavedSkillMetadata } from \"./lib/skills/index.js\";\nimport { requireMarketplace } from \"./lib/operations/source/require-marketplace.js\";\nimport {\n installPluginSkills,\n pluginInstallFailureError,\n type PluginInstallResult,\n} from \"./lib/operations/skills/install-plugin-skills.js\";\nimport type { GateReport } from \"./lib/config-gate/index.js\";\nimport type { SourceLoadResult } from \"./lib/loading/source-loader.js\";\n\n/** Narrow interface for the sourceConfig we attach to oclif's Config in the init hook. */\nexport interface ConfigWithSource {\n sourceConfig?: ResolvedConfig;\n}\n\n/**\n * How often the size gate re-reads the terminal while it is blocked. `resize` is what normally\n * ends the wait; the poll is the belt for the terminals and multiplexers that resize without\n * ever emitting one, and it is the only reason a blocked command is not a hung one there.\n */\nconst TERMINAL_RESIZE_POLL_MS = 500;\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- @types/node declares this as `number`; it is undefined whenever stdout is not a TTY\nconst terminalColumns = (): number => process.stdout.columns ?? MIN_TERMINAL_SIZE.COLS;\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- @types/node declares this as `number`; it is undefined whenever stdout is not a TTY\nconst terminalRows = (): number => process.stdout.rows ?? MIN_TERMINAL_SIZE.ROWS;\n\nfunction isTerminalBigEnough(): boolean {\n return isTerminalLargeEnough(terminalColumns(), terminalRows());\n}\n\n/**\n * Resolves the moment the terminal satisfies `isSatisfied` — on the resize event where there is\n * one, on the poll where there is not. Both listeners are torn down before resolving, so a\n * command that got past the gate leaves nothing behind holding the process open.\n */\nfunction waitForTerminal(isSatisfied: () => boolean): Promise<void> {\n return new Promise<void>((resolve) => {\n const check = () => {\n if (!isSatisfied()) return;\n clearInterval(interval);\n process.stdout.off(\"resize\", check);\n resolve();\n };\n const interval = setInterval(check, TERMINAL_RESIZE_POLL_MS);\n process.stdout.on(\"resize\", check);\n });\n}\n\n/** A selected skill no sub-agent's stack carries, and the sub-agents the scope rule blocked. */\ntype UnassignedSkill = { skillId: SkillId; blockedBy: AgentName[] };\n\n/**\n * Every active skill of a saved config that no agent's stack references, paired with the\n * global-scoped sub-agents that could not have carried it.\n *\n * `blockedBy` is empty for a global-scoped skill: the scope rule had no say there, and the\n * skill reached nothing for a different reason (no selected sub-agent the resolver\n * considers it relevant to). Naming sub-agents there would blame the wrong rule.\n */\nfunction findUnassignedSkills(config: ProjectConfig): UnassignedSkill[] {\n const assignedIds = new Set(config.stack ? getStackSkillIds(config.stack) : []);\n const globalAgentNames = config.agents\n .filter((agent) => isActiveAt(agent, \"global\"))\n .map((agent) => agent.name);\n\n const unassignedIds = unique(\n config.skills\n .filter((skill) => !skill.excluded)\n .map((skill) => skill.id)\n .filter((skillId) => !assignedIds.has(skillId)),\n );\n\n return unassignedIds.map((skillId) => ({\n skillId,\n blockedBy: hasActiveProjectEntry(config.skills, skillId) ? globalAgentNames : [],\n }));\n}\n\n/** True when an ACTIVE entry for this id sits at project scope — the only case the rule explains. */\nfunction hasActiveProjectEntry(skills: readonly SkillConfig[], skillId: SkillId): boolean {\n return skills.some((skill) => skill.id === skillId && isActiveAt(skill, \"project\"));\n}\n\n/**\n * Nothing is inherited by every command, so this class declares no `baseFlags`.\n *\n * There was one — `--source` — until naming a source became `init`'s decision alone\n * (owner ruling 2026-08-09). Six commands were already opting out of it through an\n * exported empty-object cast; a flag one command wants is that command's flag, so it\n * is declared in `init` and the six opt-outs went with it.\n */\nexport abstract class BaseCommand extends Command {\n async init(): Promise<void> {\n await super.init();\n await this.ensureTerminalSize();\n }\n\n public get sourceConfig(): ResolvedConfig | undefined {\n // Boundary cast: oclif Config is a class (not augmentable); we attach sourceConfig in the init hook\n return (this.config as unknown as ConfigWithSource).sourceConfig;\n }\n\n /**\n * Blocks the command from launching in a terminal below\n * {@link MIN_TERMINAL_SIZE}. This runs once, before Ink mounts; the terminal\n * shrinking mid-session is caught by the matching guard in `WizardLayout`.\n */\n protected async ensureTerminalSize(): Promise<void> {\n if (isTerminalBigEnough()) return;\n\n this.clearTerminal();\n this.log(chalk.hex(CLI_COLORS.WARNING)(formatTerminalTooSmallMessage(terminalColumns())));\n\n await waitForTerminal(isTerminalBigEnough);\n }\n\n protected handleError(error: unknown): never {\n const message = getErrorMessage(error);\n this.error(message, { exit: EXIT_CODES.ERROR });\n }\n\n protected logSuccess(message: string): void {\n this.log(`✓ ${message}`);\n }\n\n protected logWarning(message: string): void {\n this.warn(message);\n }\n\n protected logInfo(message: string): void {\n this.log(message);\n }\n\n protected clearTerminal(): void {\n clearTerminalScreen();\n }\n\n /**\n * Resolves the marketplace required for a plugin operation, or hard-exits with\n * an actionable error when it cannot be resolved. `onRegistered` is invoked\n * (when provided) if the marketplace had to be registered — init uses it to log.\n */\n protected async requireMarketplaceOrExit(\n sourceResult: SourceLoadResult,\n purpose: string,\n onRegistered?: (marketplace: string) => void,\n ): Promise<string> {\n const required = await requireMarketplace(sourceResult, purpose);\n if (!required.ok) {\n this.error(required.error, { exit: EXIT_CODES.ERROR });\n }\n if (required.registered) {\n onRegistered?.(required.marketplace);\n }\n return required.marketplace;\n }\n\n /**\n * Reports every constraint a completed selection breaks — a conflicting pair, an unmet\n * requirement, an exclusive category with two picks.\n *\n * Shared by `init` and `edit` so one selection cannot be reported two ways. Both commands ask\n * the same question of the same matrix, so a roster that draws a warning through one must draw\n * the same warning through the other; `init` used to compute the answer and drop it, which is\n * the whole reason this lives here rather than on either command.\n *\n * These are advisory (`ValidationError` in types/matrix.ts): the selection is installed either\n * way and neither command's exit code turns on them, so they are warnings and not errors. The\n * loop is its own guard — an accepted selection carries no errors and says nothing.\n */\n protected reportValidationErrors(validation: SelectionValidation): void {\n for (const error of validation.errors) {\n this.warn(error.message);\n }\n }\n\n /**\n * Installs skill plugins and narrates the operation.\n *\n * Shared by `init` and `edit` for the same reason as {@link reportValidationErrors}:\n * both run the SAME install against the same marketplace, so a line one prints about\n * it the other owes. `edit` used to run it in silence — a real `claude plugin install`\n * was indistinguishable in the output from nothing having happened.\n */\n protected async installPluginSkillsReported(\n skills: SkillConfig[],\n marketplace: string,\n projectDir: string,\n ): Promise<PluginInstallResult> {\n this.announcePluginInstall();\n const result = await installPluginSkills(skills, marketplace, projectDir);\n this.reportPluginInstalls(result);\n return result;\n }\n\n /**\n * The opening half of the narration above, exposed for the one caller that cannot\n * use the whole of it: an eject→plugin migration installs each plugin and deletes\n * that skill's working copy in the same step (see `executeMigration`), so the\n * install it performs is not this command's to run.\n */\n protected announcePluginInstall(): void {\n this.log(STATUS_MESSAGES.INSTALLING_PLUGINS);\n }\n\n /**\n * The closing half: what was installed, what was not, and the refusal to continue\n * past a failure.\n *\n * The hard-error is part of the report rather than each caller's own postscript\n * because it is the same rule everywhere — plugin install intent is inviolable, so\n * a run that could not honor it must stop BEFORE any config records a marketplace\n * `source` for a skill with no plugin registration.\n */\n protected reportPluginInstalls(result: PluginInstallResult): void {\n for (const item of result.installed) {\n this.log(` Installed ${item.ref}`);\n }\n for (const item of result.failed) {\n this.warn(`Failed to install plugin ${item.id}: ${item.error}`);\n }\n if (result.failed.length > 0) {\n this.error(pluginInstallFailureError(result.failed.length), { exit: EXIT_CODES.ERROR });\n }\n this.log(`${pluginsInstalled(result.installed.length)}\\n`);\n }\n\n /**\n * Renders the recompile a gated write already performed on every OTHER registered\n * project this run's global change was propagated into.\n *\n * Shared by all four commands that fan out — the count and its wording are one\n * statement about one operation, and four copies of it had already drifted into two\n * spellings of the same sentence.\n */\n protected reportPropagatedRecompile(report: GateReport): void {\n if (report.propagated.updated.length === 0) return;\n\n const { rewrittenCount, unchangedCount, failedCount, warnings } = report.recompile;\n for (const warning of warnings) {\n this.warn(warning);\n }\n this.log(propagatedRecompileSummary(rewrittenCount, unchangedCount, failedCount));\n }\n\n /**\n * Names every selected skill this save left in no sub-agent's stack, and — where the\n * scope rule is why — every sub-agent it was kept away from.\n *\n * Shared by `init` and `edit` for the reason {@link reportValidationErrors} is: both\n * build the stack from the same rules over the same selection, so a skill that reaches\n * nothing through one reaches nothing through the other. The rule being reported is\n * CORRECT and nothing here changes it — a project-scoped skill installs, is written to\n * `config.ts`, and is loaded by nobody, which every other surface reports as a clean\n * install.\n *\n * `compile` says the same thing about the same shape one layer over, for a config\n * hand-edited into it — see `Compile.warnScopeDroppedStackPairs`.\n */\n protected reportUnassignedSkills(config: ProjectConfig): void {\n for (const { skillId, blockedBy } of findUnassignedSkills(config)) {\n this.warn(skillAssignedToNoAgent(skillId));\n if (blockedBy.length > 0) {\n this.warn(scopeBlockedStackAssignment(blockedBy, skillId));\n }\n }\n }\n\n /**\n * Refuses to run when a config file exists but cannot be loaded.\n *\n * Both configs this run would read are checked, because both are read on the way through: a\n * project's own `config.ts` and the global one every project write inlines. Checking up\n * front is the whole point — an unreadable GLOBAL config otherwise surfaced only at the\n * config write, after the wizard had copied skills and installed plugins, as a warning that\n * the write never happened.\n *\n * A MISSING config is not a corrupt one and passes here untouched: it is the legitimate\n * state `init` exists for, and the state `edit` reports as \"no installation\".\n */\n protected async ensureConfigReadable(projectDir: string): Promise<void> {\n const [failure] = await findConfigLoadFailures(projectDir);\n if (failure) {\n this.error(configUnreadableError(failure.message), { exit: EXIT_CODES.ERROR });\n }\n }\n\n /**\n * Refuses to run when a saved skill entry names a local skill that IS installed and whose\n * metadata.yaml describes no skill.\n *\n * One layer below {@link ensureConfigReadable} and for the same reason: the config parses,\n * and a file it points at does not. Both wizards resolve their saved roster against the\n * loaded catalogue, and an id nothing can be loaded for reaches no screen — so without this\n * the entry is dropped and reported as a skill the marketplace no longer carries, which is a\n * removal the user never asked for and a sentence blaming the wrong thing.\n *\n * Only entries the catalogue does not carry are looked at, so a healthy install pays a\n * filesystem read for nothing. An entry whose files are simply GONE is not refused — there\n * is no file to repair, so it is removed with a reason that says so\n * (`unresolvedSkillRemovalReasons`).\n *\n * Runs before the wizard mounts, which is the whole point: past that, a refusal costs the\n * user the session they had already spent, and everything this protects has been rewritten.\n */\n protected async ensureSavedSkillsReadable(\n savedSkills: readonly SkillConfig[],\n matrix: MergedSkillsMatrix,\n projectDir: string,\n ): Promise<void> {\n const unresolved = savedSkills\n .filter((saved) => !saved.excluded && !matrix.skills[saved.id])\n .map((saved) => saved.id);\n if (unresolved.length === 0) return;\n\n const unusable = await findUnusableSavedSkillMetadata(unresolved, savedSkills, projectDir);\n if (unusable.length === 0) return;\n\n // The detail is LOGGED and only the refusal is raised — oclif hard-wraps error text at the\n // terminal width, and a path broken across two lines is one nobody can copy. Same split\n // `compile` makes over the same verdict.\n for (const entry of unusable) {\n this.log(skillMetadataUnusableDetail(entry));\n }\n this.error(savedSkillMetadataUnusableError(unusable), { exit: EXIT_CODES.ERROR });\n }\n}\n","import {\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n claudePluginMarketplaceUpdate,\n} from \"../../../utils/exec.js\";\nimport { fetchMarketplace } from \"../../loading/index.js\";\nimport { warn } from \"../../../utils/logger.js\";\nimport type { SourceLoadResult } from \"../../loading/source-loader.js\";\n\nexport type MarketplaceResult = {\n /** The resolved marketplace name, or null if no marketplace is configured. */\n marketplace: string | null;\n /** Whether a new marketplace was registered (vs. updated or already existed). */\n registered: boolean;\n};\n\n/**\n * Ensures the marketplace is registered with the Claude CLI.\n *\n * If the marketplace does not exist, registers it. If it exists, updates it.\n * Handles lazy marketplace name resolution when sourceResult.marketplace is undefined.\n *\n * Operation is intentionally SILENT — commands decide what to log based on the\n * `registered` flag.\n */\nexport async function ensureMarketplace(\n sourceResult: SourceLoadResult,\n): Promise<MarketplaceResult> {\n if (!sourceResult.marketplace) {\n try {\n const marketplaceResult = await fetchMarketplace(sourceResult.sourceConfig.source);\n sourceResult.marketplace = marketplaceResult.marketplace.name;\n } catch {\n return { marketplace: null, registered: false };\n }\n }\n\n const marketplace = sourceResult.marketplace;\n const exists = await claudePluginMarketplaceExists(marketplace);\n\n if (!exists) {\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n return { marketplace, registered: true };\n }\n\n try {\n await claudePluginMarketplaceUpdate(marketplace);\n } catch {\n warn(\"Could not update marketplace — continuing with cached version\");\n }\n\n return { marketplace, registered: false };\n}\n","import { ensureMarketplace } from \"./ensure-marketplace.js\";\nimport type { SourceLoadResult } from \"../../loading/source-loader.js\";\n\nexport type MarketplaceRequirement =\n { ok: true; marketplace: string; registered: boolean } | { ok: false; error: string };\n\n/**\n * Resolves the marketplace required for plugin operations. Plugin install\n * intent is inviolable — callers must hard-error on `ok: false` rather than\n * silently falling back to eject or skipping, and must do so BEFORE any\n * filesystem mutation so a failure leaves no partial state on disk.\n */\nexport async function requireMarketplace(\n sourceResult: SourceLoadResult,\n purpose: string,\n): Promise<MarketplaceRequirement> {\n const mpResult = await ensureMarketplace(sourceResult);\n if (!mpResult.marketplace) {\n return {\n ok: false,\n error:\n `Cannot ${purpose}: marketplace could not be resolved from source '${sourceResult.sourceConfig.source}'. ` +\n `Plugin install mode requires a marketplace — fix the source or switch the affected skills to eject mode.`,\n };\n }\n return { ok: true, marketplace: mpResult.marketplace, registered: mpResult.registered };\n}\n"],"mappings":"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","names":[]}
@@ -4,25 +4,25 @@ import {
4
4
  } from "./chunk-TSIU7DME.js";
5
5
  import {
6
6
  getDomainDisplayName
7
- } from "./chunk-JFAUQDZM.js";
7
+ } from "./chunk-CHNA5RVS.js";
8
8
  import {
9
9
  useRowScroll
10
10
  } from "./chunk-V3ENMW7G.js";
11
11
  import {
12
12
  KEY_SPACE
13
- } from "./chunk-2HC2SNRP.js";
13
+ } from "./chunk-DRKSYJZ2.js";
14
14
  import {
15
15
  deriveScopeBadges,
16
16
  formatScopeTag,
17
17
  useWizardStore
18
- } from "./chunk-HEBPKK5L.js";
18
+ } from "./chunk-QQTYMW7N.js";
19
19
  import {
20
20
  isAgentName,
21
21
  toTitleCase
22
- } from "./chunk-NXQAY5U7.js";
22
+ } from "./chunk-CBF4ZYV3.js";
23
23
  import {
24
24
  matrix
25
- } from "./chunk-35VOK7XE.js";
25
+ } from "./chunk-IPJOMAWC.js";
26
26
  import {
27
27
  typedKeys
28
28
  } from "./chunk-VASLW636.js";
@@ -319,4 +319,4 @@ var StepAgents = () => {
319
319
  export {
320
320
  StepAgents
321
321
  };
322
- //# sourceMappingURL=chunk-K7PJDWER.js.map
322
+ //# sourceMappingURL=chunk-GUDGCFSF.js.map