@nexrall/code-core 1.4.71 → 1.4.72

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 (125) hide show
  1. package/dist/agent/agentRegistry.d.ts.map +1 -1
  2. package/dist/agent/agentRegistry.js +28 -10
  3. package/dist/agent/agentTypes.d.ts.map +1 -1
  4. package/dist/agent/agentTypes.js +159 -48
  5. package/dist/agent/askOnce.d.ts.map +1 -1
  6. package/dist/agent/askOnce.js +14 -5
  7. package/dist/agent/backgroundAgents.d.ts.map +1 -1
  8. package/dist/agent/backgroundAgents.js +22 -8
  9. package/dist/agent/claimEvidence.d.ts.map +1 -1
  10. package/dist/agent/claimEvidence.js +2 -1
  11. package/dist/agent/compaction.d.ts.map +1 -1
  12. package/dist/agent/compaction.js +31 -10
  13. package/dist/agent/crossProcessLock.d.ts.map +1 -1
  14. package/dist/agent/crossProcessLock.js +14 -6
  15. package/dist/agent/editCompleteness.d.ts.map +1 -1
  16. package/dist/agent/fileLocks.d.ts.map +1 -1
  17. package/dist/agent/fileLocks.js +14 -5
  18. package/dist/agent/flaky.d.ts.map +1 -1
  19. package/dist/agent/hooks.d.ts.map +1 -1
  20. package/dist/agent/hooks.js +284 -75
  21. package/dist/agent/iterationPolicy.d.ts.map +1 -1
  22. package/dist/agent/iterationPolicy.js +26 -23
  23. package/dist/agent/lifecycleHost.d.ts.map +1 -1
  24. package/dist/agent/lifecycleHost.js +35 -11
  25. package/dist/agent/loop.d.ts +22 -4
  26. package/dist/agent/loop.d.ts.map +1 -1
  27. package/dist/agent/loop.js +223 -51
  28. package/dist/agent/memory.d.ts.map +1 -1
  29. package/dist/agent/memory.js +13 -7
  30. package/dist/agent/modelCatalogue.d.ts.map +1 -1
  31. package/dist/agent/modelCatalogue.js +4 -1
  32. package/dist/agent/nestedInstructions.d.ts +122 -0
  33. package/dist/agent/nestedInstructions.d.ts.map +1 -0
  34. package/dist/agent/nestedInstructions.js +696 -0
  35. package/dist/agent/peerRegistry.d.ts.map +1 -1
  36. package/dist/agent/peerRegistry.js +44 -6
  37. package/dist/agent/peerTransport.d.ts.map +1 -1
  38. package/dist/agent/peerTransport.js +18 -6
  39. package/dist/agent/planMode.d.ts.map +1 -1
  40. package/dist/agent/planMode.js +194 -41
  41. package/dist/agent/readDedupe.d.ts.map +1 -1
  42. package/dist/agent/readDedupe.js +3 -1
  43. package/dist/agent/securityLint.d.ts.map +1 -1
  44. package/dist/agent/sharedTasks.d.ts.map +1 -1
  45. package/dist/agent/sharedTasks.js +20 -5
  46. package/dist/agent/skills.d.ts +79 -0
  47. package/dist/agent/skills.d.ts.map +1 -1
  48. package/dist/agent/skills.js +403 -14
  49. package/dist/agent/subAgentBudget.d.ts.map +1 -1
  50. package/dist/agent/subTask.d.ts.map +1 -1
  51. package/dist/agent/subTask.js +87 -37
  52. package/dist/agent/subTaskSupport.d.ts.map +1 -1
  53. package/dist/agent/subTaskSupport.js +43 -14
  54. package/dist/agent/testIntegrity.d.ts.map +1 -1
  55. package/dist/agent/testIntegrity.js +4 -2
  56. package/dist/agent/toolDescriptions.d.ts.map +1 -1
  57. package/dist/agent/toolPrefetch.d.ts.map +1 -1
  58. package/dist/agent/toolPrefetch.js +15 -11
  59. package/dist/agent/trust.d.ts.map +1 -1
  60. package/dist/agent/trust.js +6 -2
  61. package/dist/agent/worktree.d.ts.map +1 -1
  62. package/dist/agent/worktree.js +70 -16
  63. package/dist/agent/worktreeEnforcement.d.ts.map +1 -1
  64. package/dist/agent/worktreeEnforcement.js +9 -4
  65. package/dist/api/client.d.ts.map +1 -1
  66. package/dist/api/client.js +63 -31
  67. package/dist/auth/index.d.ts.map +1 -1
  68. package/dist/auth/index.js +3 -1
  69. package/dist/checkpoint/manager.d.ts.map +1 -1
  70. package/dist/checkpoint/manager.js +22 -7
  71. package/dist/commands/loader.d.ts.map +1 -1
  72. package/dist/commands/loader.js +6 -1
  73. package/dist/index.d.ts +2 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +2 -0
  76. package/dist/mcp/client.d.ts +34 -0
  77. package/dist/mcp/client.d.ts.map +1 -1
  78. package/dist/mcp/client.js +89 -24
  79. package/dist/mcp/httpClient.d.ts +24 -1
  80. package/dist/mcp/httpClient.d.ts.map +1 -1
  81. package/dist/mcp/httpClient.js +80 -14
  82. package/dist/mcp/instructions.d.ts +11 -0
  83. package/dist/mcp/instructions.d.ts.map +1 -0
  84. package/dist/mcp/instructions.js +42 -0
  85. package/dist/mcp/manager.d.ts +24 -0
  86. package/dist/mcp/manager.d.ts.map +1 -1
  87. package/dist/mcp/manager.js +117 -24
  88. package/dist/mcp/server.d.ts.map +1 -1
  89. package/dist/mcp/server.js +48 -14
  90. package/dist/mcp/sseClient.d.ts +9 -1
  91. package/dist/mcp/sseClient.d.ts.map +1 -1
  92. package/dist/mcp/sseClient.js +43 -10
  93. package/dist/mcp/stats.d.ts.map +1 -1
  94. package/dist/permissions/bashClassify.d.ts.map +1 -1
  95. package/dist/permissions/bashClassify.js +25 -3
  96. package/dist/permissions/destructive.d.ts.map +1 -1
  97. package/dist/permissions/destructive.js +7 -2
  98. package/dist/permissions/destructiveTokens.d.ts.map +1 -1
  99. package/dist/permissions/destructiveTokens.js +104 -24
  100. package/dist/permissions/modePolicy.d.ts.map +1 -1
  101. package/dist/permissions/modePolicy.js +40 -17
  102. package/dist/permissions/rules.d.ts.map +1 -1
  103. package/dist/permissions/rules.js +7 -5
  104. package/dist/plugins/data.d.ts.map +1 -1
  105. package/dist/plugins/data.js +6 -2
  106. package/dist/plugins/index.d.ts.map +1 -1
  107. package/dist/plugins/index.js +18 -7
  108. package/dist/plugins/installer.d.ts.map +1 -1
  109. package/dist/plugins/installer.js +17 -10
  110. package/dist/plugins/sources.d.ts.map +1 -1
  111. package/dist/plugins/sources.js +9 -3
  112. package/dist/tools/executor.d.ts.map +1 -1
  113. package/dist/tools/executor.js +454 -168
  114. package/dist/tools/sandbox.d.ts.map +1 -1
  115. package/dist/tools/sandbox.js +5 -1
  116. package/dist/tools/symbols.d.ts.map +1 -1
  117. package/dist/tools/symbols.js +30 -8
  118. package/dist/tools/tsLangService.d.ts.map +1 -1
  119. package/dist/tools/tsLangService.js +12 -4
  120. package/dist/types.d.ts +17 -0
  121. package/dist/types.d.ts.map +1 -1
  122. package/dist/util/frontmatter.d.ts.map +1 -1
  123. package/dist/util/miniYaml.d.ts.map +1 -1
  124. package/dist/util/miniYaml.js +3 -1
  125. package/package.json +1 -1
@@ -34,6 +34,23 @@ export interface Skill {
34
34
  metadata?: Record<string, string>;
35
35
  /** agentskills.io spec field (experimental) — space-separated tool names the skill declares it needs. Not yet enforced as an allowlist; informational. */
36
36
  allowedTools?: string[];
37
+ /**
38
+ * `'fork'` = run the expanded skill as an ISOLATED sub-agent (Claude Code's
39
+ * `context: fork`): the body becomes the child's prompt, the parent
40
+ * conversation is NOT copied in, and only the child's report comes back —
41
+ * the invoking context stays clean. Absent = inject the body inline.
42
+ */
43
+ context?: 'fork';
44
+ /** Sub-agent type a forked run uses (only with `context: 'fork'`). Default `general-purpose`. */
45
+ agent?: string;
46
+ /**
47
+ * Forked runs are backgrounded by default (CC 2.1.x): the invocation returns
48
+ * as soon as the child starts and the report arrives as a <task-notification>.
49
+ * `background: false` awaits the child and returns its report as the tool
50
+ * result. Only meaningful with `context: 'fork'`; hosts without a background
51
+ * hub always await.
52
+ */
53
+ background?: boolean;
37
54
  }
38
55
  /**
39
56
  * Discover all skills, with diagnostics.
@@ -68,6 +85,68 @@ export declare function autoInvokableSkills(skills: Skill[]): Skill[];
68
85
  export declare function userInvokableSkills(skills: Skill[]): Skill[];
69
86
  /** A compact catalogue injected into the system prompt so the model knows what it can auto-invoke via use_skill. */
70
87
  export declare function summariseSkills(skills: Skill[]): string;
88
+ /**
89
+ * Every directory skill discovery reads (see loadSkillsWithWarnings), whether or
90
+ * not it exists. Used by watchSkills; plugin asset dirs are in the list only
91
+ * while the plugin is installed — installing or removing one already reloads
92
+ * skills through its own path, so a stale watcher would be harmless anyway.
93
+ */
94
+ export declare function skillRoots(workDir: string): string[];
95
+ /**
96
+ * Watch every skill root and call `onChange` (debounced) when anything under
97
+ * one moves — the hot reload behind the CLI's mid-session refresh (CC 2.1.x
98
+ * hot-reloads skill files; before this only `/reload` re-read them).
99
+ *
100
+ * Two layers, because neither alone is reliable: fs.watch is the fast path
101
+ * (recursive where the platform allows it — a non-recursive fallback keeps a
102
+ * root that predates a skill dir from going dark), and a low-frequency stat
103
+ * poll backstops the events editors and network filesystems are known to
104
+ * drop. The poll also notices a root that did not exist yet when we started,
105
+ * which is exactly when a user creates their first skill. Returns a disposer.
106
+ */
107
+ export declare function watchSkills(workDir: string, onChange: () => void, opts?: {
108
+ pollMs?: number;
109
+ roots?: string[];
110
+ }): () => void;
111
+ /**
112
+ * Input fields that name a filesystem path. Drives nested discovery — both the skill
113
+ * scanner below and the nested-instruction scanner in nestedInstructions.ts. Nothing
114
+ * else may read them: the list is a discovery hint, not a general path extractor.
115
+ */
116
+ export declare const NESTED_PATH_INPUT_KEYS: readonly ["path", "file_path", "source", "destination"];
117
+ /**
118
+ * Is `dir` (absolute, under `workDir`) a place nested discovery should skip? One policy
119
+ * shared by the nested skill and nested instruction scanners: a generated or dependency
120
+ * checkout is not where the user keeps playbooks or briefs, and `node_modules` alone
121
+ * would turn every read of a dependency into a candidate. `node_modules`/`.git` are
122
+ * decided without a git call; everything else asks `git check-ignore`. Cached per
123
+ * directory by the CALLER (the maps live with the scanners so their lifetime matches).
124
+ */
125
+ export declare function isIgnoredNestedDir(workDir: string, dir: string, cache: Map<string, boolean>): boolean;
126
+ /** Discovers nested `.nexrall/skills` directories as the agent works (see the section comment above). */
127
+ export declare class NestedSkillScanner {
128
+ private readonly workDir;
129
+ private readonly scanned;
130
+ private readonly ignored;
131
+ constructor(workDir: string);
132
+ /**
133
+ * Scan the tool input of one call for filesystem paths and return any skills
134
+ * discovered by this call (usually none). Stateful on purpose: each directory
135
+ * is checked at most once per run, however many files under it are touched.
136
+ */
137
+ scanInput(input: Record<string, unknown>): Skill[];
138
+ /** Scan the ancestor chain of one touched path. */
139
+ scanPath(touched: string): Skill[];
140
+ }
141
+ /**
142
+ * Resolve a `<dir>:<name>` reference to a nested skill. The scope must be a
143
+ * relative path that stays inside the project — `../elsewhere:x` or an absolute
144
+ * scope is rejected, so a skill reference can never read outside the workdir.
145
+ * Deliberately not cache-backed: callers use this for a MISS (a hit resolves
146
+ * against the list they already hold), and re-reading a few files on a miss is
147
+ * cheaper than keeping a second index honest.
148
+ */
149
+ export declare function resolveNestedSkill(workDir: string, ref: string): Skill | undefined;
71
150
  /**
72
151
  * Expand a skill body into a final prompt (same $ARGUMENTS / @file / !`cmd`
73
152
  * substitution as slash commands — see commands/loader.ts#expandBody), then
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"AA0EA,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;IACrE,0IAA0I;IAC1I,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kHAAkH;IAClH,sBAAsB,EAAE,OAAO,CAAC;IAChC,iGAAiG;IACjG,aAAa,EAAE,OAAO,CAAC;IACvB,2GAA2G;IAC3G,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8GAA8G;IAC9G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kHAAkH;IAClH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,0JAA0J;IAC1J,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AA6MD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,KAAK,EAAO,GAAG;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAwB1H;AAED,kKAAkK;AAClK,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAEnD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAG1E;AAED,6GAA6G;AAC7G,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAE5D;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAE5D;AAED,oHAAoH;AACpH,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAIvD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAcpF"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"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"}
@@ -33,25 +33,41 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.NestedSkillScanner = exports.NESTED_PATH_INPUT_KEYS = void 0;
36
37
  exports.loadSkillsWithWarnings = loadSkillsWithWarnings;
37
38
  exports.loadSkills = loadSkills;
38
39
  exports.findSkill = findSkill;
39
40
  exports.autoInvokableSkills = autoInvokableSkills;
40
41
  exports.userInvokableSkills = userInvokableSkills;
41
42
  exports.summariseSkills = summariseSkills;
43
+ exports.skillRoots = skillRoots;
44
+ exports.watchSkills = watchSkills;
45
+ exports.isIgnoredNestedDir = isIgnoredNestedDir;
46
+ exports.resolveNestedSkill = resolveNestedSkill;
42
47
  exports.expandSkill = expandSkill;
43
48
  const fs = __importStar(require("fs"));
44
49
  const path = __importStar(require("path"));
45
50
  const os = __importStar(require("os"));
51
+ const child_process_1 = require("child_process");
46
52
  const index_1 = require("../plugins/index");
47
53
  const loader_1 = require("../commands/loader");
48
54
  const frontmatter_1 = require("../util/frontmatter");
49
55
  const agentTypes_1 = require("./agentTypes");
50
56
  /** Frontmatter keys this parser understands, for typo/unrecognised-key detection (see SkillWarning). */
51
57
  const KNOWN_META_KEYS = new Set([
52
- 'name', 'description', 'model', 'mode',
53
- 'disable-model-invocation', 'user-invocable',
54
- 'license', 'compatibility', 'metadata', 'allowed-tools',
58
+ 'name',
59
+ 'description',
60
+ 'model',
61
+ 'mode',
62
+ 'disable-model-invocation',
63
+ 'user-invocable',
64
+ 'license',
65
+ 'compatibility',
66
+ 'metadata',
67
+ 'allowed-tools',
68
+ 'context',
69
+ 'agent',
70
+ 'background',
55
71
  ]);
56
72
  // agentskills.io's `name` constraint: 1-64 chars, lowercase alphanumeric and
57
73
  // hyphens, no leading/trailing/consecutive hyphens. Validated LENIENTLY here
@@ -73,11 +89,18 @@ function parseBool(v, fallback) {
73
89
  function parseSpaceList(v) {
74
90
  if (!v)
75
91
  return undefined;
76
- const items = v.split(/[,\s]+/).map((t) => t.trim()).filter(Boolean);
92
+ const items = v
93
+ .split(/[,\s]+/)
94
+ .map((t) => t.trim())
95
+ .filter(Boolean);
77
96
  return items.length ? items : undefined;
78
97
  }
79
98
  function toSkill(meta, body, name, source, dir, nested) {
80
99
  const model = (0, agentTypes_1.parseModel)(meta.model);
100
+ // `agent:` / `background:` only mean something for a forked skill (CC: "Only
101
+ // applies when context: fork is set") — dropped otherwise, so a stray line
102
+ // cannot quietly change how an inline skill runs. validateSkillMeta warns.
103
+ const isFork = meta.context?.trim().toLowerCase() === 'fork';
81
104
  return {
82
105
  name,
83
106
  description: meta.description || `Custom /${name} skill`,
@@ -92,6 +115,9 @@ function toSkill(meta, body, name, source, dir, nested) {
92
115
  compatibility: meta.compatibility || undefined,
93
116
  metadata: nested?.metadata,
94
117
  allowedTools: parseSpaceList(meta['allowed-tools']),
118
+ context: isFork ? 'fork' : undefined,
119
+ agent: isFork ? meta.agent?.trim() || undefined : undefined,
120
+ background: isFork && meta.background !== undefined ? parseBool(meta.background, true) : undefined,
95
121
  };
96
122
  }
97
123
  /**
@@ -110,22 +136,32 @@ function validateSkillMeta(meta, rawName, effectiveName, dirName, file, warnings
110
136
  return;
111
137
  if (!SPEC_NAME_RE.test(rawName)) {
112
138
  warnings.push({
113
- file, name: effectiveName,
139
+ file,
140
+ name: effectiveName,
114
141
  message: `name "${rawName}" does not match the agentskills.io convention (lowercase letters, numbers, and single hyphens only) — loaded anyway, but other clients reading this skill may warn or reject it.`,
115
142
  });
116
143
  }
117
144
  else if (rawName.length > 64) {
118
- warnings.push({ file, name: effectiveName, message: `name is ${rawName.length} characters — the spec caps this at 64. Loaded anyway.` });
145
+ warnings.push({
146
+ file,
147
+ name: effectiveName,
148
+ message: `name is ${rawName.length} characters — the spec caps this at 64. Loaded anyway.`,
149
+ });
119
150
  }
120
151
  if (dirName !== undefined && meta.name && meta.name.trim().toLowerCase() !== dirName.toLowerCase()) {
121
152
  warnings.push({
122
- file, name: effectiveName,
153
+ file,
154
+ name: effectiveName,
123
155
  message: `frontmatter name "${meta.name}" does not match its directory name "${dirName}" — the spec requires them to match for cross-client compatibility. Loaded anyway, using the frontmatter name.`,
124
156
  });
125
157
  }
126
158
  const strayKeys = Object.keys(meta).filter((k) => !KNOWN_META_KEYS.has(k));
127
159
  if (strayKeys.length) {
128
- warnings.push({ file, name: effectiveName, message: `has unrecognised frontmatter key(s): ${strayKeys.join(', ')} — these are ignored.` });
160
+ warnings.push({
161
+ file,
162
+ name: effectiveName,
163
+ message: `has unrecognised frontmatter key(s): ${strayKeys.join(', ')} — these are ignored.`,
164
+ });
129
165
  }
130
166
  // Same class of mistake agentTypes.ts already guards against for sub-agents:
131
167
  // pass the value through regardless (parseModel never rejects), but say
@@ -134,14 +170,39 @@ function validateSkillMeta(meta, rawName, effectiveName, dirName, file, warnings
134
170
  // (a valid tier alias) silently parsed to undefined in a skill because this
135
171
  // file carried its own, shorter, independently-drifted copy of the model list.
136
172
  const declaredModel = meta.model === undefined ? undefined : (0, agentTypes_1.parseModel)(meta.model);
137
- if (meta.model !== undefined
138
- && (declaredModel === undefined
139
- || !agentTypes_1.VALID_MODELS.includes(declaredModel))) {
173
+ if (meta.model !== undefined &&
174
+ (declaredModel === undefined || !agentTypes_1.VALID_MODELS.includes(declaredModel))) {
140
175
  warnings.push({
141
- file, name: effectiveName,
176
+ file,
177
+ name: effectiveName,
142
178
  message: `has model: "${meta.model}", which this version does not recognise — expected one of ${agentTypes_1.VALID_MODELS.join(', ')}, or omit the line to inherit the current session's model. It will still be sent; the server decides whether it is valid.`,
143
179
  });
144
180
  }
181
+ // `context: fork` is the only supported value (CC 2.1.x); anything else is a
182
+ // typo the user wants to hear about, not a silent no-op. `agent:`/`background:`
183
+ // are fork-only (CC: "Only applies when context: fork is set") — same reasoning.
184
+ const ctx = meta.context?.trim().toLowerCase();
185
+ if (meta.context !== undefined && ctx !== 'fork') {
186
+ warnings.push({
187
+ file,
188
+ name: effectiveName,
189
+ message: `has context: "${meta.context}" — the only supported value is "fork" (run the skill as an isolated sub-agent). Ignored: the skill will run inline.`,
190
+ });
191
+ }
192
+ if (ctx !== 'fork' && meta.agent !== undefined) {
193
+ warnings.push({
194
+ file,
195
+ name: effectiveName,
196
+ message: `has agent: "${meta.agent}", which only applies together with context: fork — ignored.`,
197
+ });
198
+ }
199
+ if (ctx !== 'fork' && meta.background !== undefined) {
200
+ warnings.push({
201
+ file,
202
+ name: effectiveName,
203
+ message: `has background:, which only applies together with context: fork — ignored.`,
204
+ });
205
+ }
145
206
  }
146
207
  // Legacy flat-file skills: .nexrall/commands/<name>.md (and plugin commands/).
147
208
  // Kept as its own loader (rather than merged into loadSkillDir below) since the
@@ -170,7 +231,11 @@ function loadFlatCommandDir(dir, source, into, warnings) {
170
231
  into.set(name, toSkill(meta, body, name, source));
171
232
  }
172
233
  catch (err) {
173
- warnings?.push({ file: full, name: path.basename(file, '.md'), message: `could not be read or parsed (${err.message}) — skipped.` });
234
+ warnings?.push({
235
+ file: full,
236
+ name: path.basename(file, '.md'),
237
+ message: `could not be read or parsed (${err.message}) — skipped.`,
238
+ });
174
239
  }
175
240
  }
176
241
  }
@@ -212,7 +277,11 @@ function loadSkillDir(root, source, into, warnings) {
212
277
  into.set(name, toSkill(meta, body, name, source, skillDir, nested));
213
278
  }
214
279
  catch (err) {
215
- warnings?.push({ file: skillFile, name: entry.name, message: `could not be read or parsed (${err.message}) — skipped.` });
280
+ warnings?.push({
281
+ file: skillFile,
282
+ name: entry.name,
283
+ message: `could not be read or parsed (${err.message}) — skipped.`,
284
+ });
216
285
  }
217
286
  }
218
287
  }
@@ -325,6 +394,326 @@ function summariseSkills(skills) {
325
394
  return '';
326
395
  return list.map((s) => `- ${s.name}: ${s.description}`).join('\n');
327
396
  }
397
+ /**
398
+ * Every directory skill discovery reads (see loadSkillsWithWarnings), whether or
399
+ * not it exists. Used by watchSkills; plugin asset dirs are in the list only
400
+ * while the plugin is installed — installing or removing one already reloads
401
+ * skills through its own path, so a stale watcher would be harmless anyway.
402
+ */
403
+ function skillRoots(workDir) {
404
+ const home = os.homedir();
405
+ return [
406
+ path.join(workDir, '.agents', 'skills'),
407
+ path.join(workDir, '.nexrall', 'commands'),
408
+ path.join(workDir, '.nexrall', 'skills'),
409
+ path.join(home, '.nexrall', 'commands'),
410
+ path.join(home, '.nexrall', 'skills'),
411
+ path.join(home, '.agents', 'skills'),
412
+ ...(0, index_1.pluginAssetDirs)(workDir, 'skills'),
413
+ ...(0, index_1.pluginAssetDirs)(workDir, 'commands'),
414
+ ];
415
+ }
416
+ /**
417
+ * Cheap stat signature of everything under the roots: entry names + mtimes, plus
418
+ * the mtime of a directory skill's SKILL.md (the file edits actually land in).
419
+ * Two calls with the same string mean discovery has nothing new to find.
420
+ */
421
+ function rootFingerprint(roots) {
422
+ const lines = [];
423
+ for (const root of roots) {
424
+ let entries;
425
+ try {
426
+ entries = fs.readdirSync(root, { withFileTypes: true });
427
+ }
428
+ catch {
429
+ lines.push(`${root} -`);
430
+ continue;
431
+ }
432
+ entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
433
+ for (const e of entries) {
434
+ const p = path.join(root, e.name);
435
+ let mtime = 0;
436
+ try {
437
+ mtime = fs.statSync(p).mtimeMs;
438
+ }
439
+ catch {
440
+ /* vanished between readdir and stat */
441
+ }
442
+ let inner = 0;
443
+ if (e.isDirectory()) {
444
+ try {
445
+ inner = fs.statSync(path.join(p, 'SKILL.md')).mtimeMs;
446
+ }
447
+ catch {
448
+ /* not a directory-style skill (or gone) */
449
+ }
450
+ }
451
+ lines.push(`${p} ${mtime} ${inner}`);
452
+ }
453
+ }
454
+ return lines.join('\n');
455
+ }
456
+ /**
457
+ * Watch every skill root and call `onChange` (debounced) when anything under
458
+ * one moves — the hot reload behind the CLI's mid-session refresh (CC 2.1.x
459
+ * hot-reloads skill files; before this only `/reload` re-read them).
460
+ *
461
+ * Two layers, because neither alone is reliable: fs.watch is the fast path
462
+ * (recursive where the platform allows it — a non-recursive fallback keeps a
463
+ * root that predates a skill dir from going dark), and a low-frequency stat
464
+ * poll backstops the events editors and network filesystems are known to
465
+ * drop. The poll also notices a root that did not exist yet when we started,
466
+ * which is exactly when a user creates their first skill. Returns a disposer.
467
+ */
468
+ function watchSkills(workDir, onChange, opts = {}) {
469
+ const roots = opts.roots ?? skillRoots(workDir);
470
+ const pollMs = opts.pollMs ?? 5000;
471
+ let disposed = false;
472
+ let pending = null;
473
+ let last = rootFingerprint(roots);
474
+ // Everything funnels through the fingerprint before the callback runs. That is
475
+ // not just for the poll: fs.watch is documented as unreliable event-wise, and
476
+ // on macOS a freshly armed recursive watcher fires a synthetic event on the
477
+ // watched dir itself - verified, 2026-10-03 - which would otherwise reload on
478
+ // every startup. "The stats moved" is the one honest signal both layers share.
479
+ const settle = () => {
480
+ pending = null;
481
+ if (disposed)
482
+ return;
483
+ const now = rootFingerprint(roots);
484
+ if (now === last)
485
+ return; // stray arm event, or a rename+change pair already seen
486
+ last = now;
487
+ onChange();
488
+ };
489
+ const fire = () => {
490
+ // Coalesce, never reset: re-arming the timer on every event starves the
491
+ // settle pass whenever events keep arriving inside the window (the poll
492
+ // ticks every 5s by default but tests and busy trees go faster - verified
493
+ // stalling at 100ms, 2026-10-03).
494
+ if (disposed || pending)
495
+ return;
496
+ pending = setTimeout(settle, 150);
497
+ };
498
+ const watchers = [];
499
+ for (const root of roots) {
500
+ try {
501
+ if (!fs.statSync(root).isDirectory())
502
+ continue;
503
+ }
504
+ catch {
505
+ continue; // not there yet - the poll notices when it appears
506
+ }
507
+ try {
508
+ const w = fs.watch(root, { recursive: true }, fire);
509
+ w.on('error', () => { });
510
+ watchers.push(w);
511
+ }
512
+ catch {
513
+ try {
514
+ const w = fs.watch(root, fire);
515
+ w.on('error', () => { });
516
+ watchers.push(w);
517
+ }
518
+ catch {
519
+ /* no watcher for this root - the poll still covers it */
520
+ }
521
+ }
522
+ }
523
+ const timer = setInterval(() => {
524
+ if (rootFingerprint(roots) !== last)
525
+ fire();
526
+ }, pollMs);
527
+ if (typeof timer.unref === 'function')
528
+ timer.unref();
529
+ return () => {
530
+ disposed = true;
531
+ if (pending)
532
+ clearTimeout(pending);
533
+ clearInterval(timer);
534
+ for (const w of watchers) {
535
+ try {
536
+ w.close();
537
+ }
538
+ catch {
539
+ /* already closed */
540
+ }
541
+ }
542
+ };
543
+ }
544
+ // ── Nested skills: <dir>/.nexrall/skills discovered as the agent works ────────
545
+ //
546
+ // Claude Code 2.1.x discovers `.claude/skills` in SUBdirectories lazily: the
547
+ // skill only matters once Claude works with files in (or under) that directory,
548
+ // so it is surfaced then instead of at startup. Same here, one level per
549
+ // ancestor: as a tool call touches `packages/cli/src/x.ts`, every directory from
550
+ // `packages/cli/src` up to (but excluding) the project root gets checked for its
551
+ // own `.nexrall/skills`.
552
+ //
553
+ // Nested skills are ALWAYS addressed as `<dir>:<name>` (the project-relative
554
+ // directory, `/`-separated), which is what makes them self-describing: name
555
+ // resolution needs no memory of what was discovered where — the scope in the
556
+ // name IS the lookup path (see resolveNestedSkill). It also means a nested
557
+ // skill can never silently shadow a top-level one.
558
+ //
559
+ // Gitignored directories are skipped: a generated or dependency checkout is not
560
+ // where the user keeps playbooks, and `node_modules` alone would make every
561
+ // read of a dependency a candidate. (Resolution is deliberately more permissive:
562
+ // naming `<dir>:<name>` explicitly still works even inside an ignored dir.)
563
+ /**
564
+ * Input fields that name a filesystem path. Drives nested discovery — both the skill
565
+ * scanner below and the nested-instruction scanner in nestedInstructions.ts. Nothing
566
+ * else may read them: the list is a discovery hint, not a general path extractor.
567
+ */
568
+ exports.NESTED_PATH_INPUT_KEYS = ['path', 'file_path', 'source', 'destination'];
569
+ /**
570
+ * Is `dir` (absolute, under `workDir`) a place nested discovery should skip? One policy
571
+ * shared by the nested skill and nested instruction scanners: a generated or dependency
572
+ * checkout is not where the user keeps playbooks or briefs, and `node_modules` alone
573
+ * would turn every read of a dependency into a candidate. `node_modules`/`.git` are
574
+ * decided without a git call; everything else asks `git check-ignore`. Cached per
575
+ * directory by the CALLER (the maps live with the scanners so their lifetime matches).
576
+ */
577
+ function isIgnoredNestedDir(workDir, dir, cache) {
578
+ const cached = cache.get(dir);
579
+ if (cached !== undefined)
580
+ return cached;
581
+ const rel = path.relative(workDir, dir);
582
+ let verdict;
583
+ if (rel.split(/[\\/]/).includes('node_modules') || rel.split(/[\\/]/).includes('.git')) {
584
+ verdict = true; // no git call needed for the two dirs that matter most
585
+ }
586
+ else {
587
+ try {
588
+ const r = (0, child_process_1.spawnSync)('git', ['-C', workDir, 'check-ignore', '-q', '--', dir], {
589
+ stdio: 'ignore',
590
+ timeout: 3000,
591
+ });
592
+ verdict = r.status === 0; // 0 = ignored; 1 = not; anything else (no git, not a repo) = not
593
+ }
594
+ catch {
595
+ verdict = false;
596
+ }
597
+ }
598
+ cache.set(dir, verdict);
599
+ return verdict;
600
+ }
601
+ /** Discovers nested `.nexrall/skills` directories as the agent works (see the section comment above). */
602
+ class NestedSkillScanner {
603
+ constructor(workDir) {
604
+ this.workDir = workDir;
605
+ this.scanned = new Set();
606
+ this.ignored = new Map();
607
+ }
608
+ /**
609
+ * Scan the tool input of one call for filesystem paths and return any skills
610
+ * discovered by this call (usually none). Stateful on purpose: each directory
611
+ * is checked at most once per run, however many files under it are touched.
612
+ */
613
+ scanInput(input) {
614
+ const out = [];
615
+ for (const key of exports.NESTED_PATH_INPUT_KEYS) {
616
+ const v = input[key];
617
+ if (typeof v !== 'string' || !v || v.length > 4096)
618
+ continue;
619
+ out.push(...this.scanPath(v));
620
+ }
621
+ return out;
622
+ }
623
+ /** Scan the ancestor chain of one touched path. */
624
+ scanPath(touched) {
625
+ let abs;
626
+ try {
627
+ abs = path.isAbsolute(touched) ? touched : path.join(this.workDir, touched);
628
+ }
629
+ catch {
630
+ return [];
631
+ }
632
+ let base = abs;
633
+ try {
634
+ if (!fs.statSync(abs).isDirectory())
635
+ base = path.dirname(abs);
636
+ }
637
+ catch {
638
+ base = path.dirname(abs); // a path being created: its directory is the claim
639
+ }
640
+ const work = path.resolve(this.workDir);
641
+ const out = [];
642
+ let dir = base;
643
+ for (;;) {
644
+ const rel = path.relative(work, dir);
645
+ if (!rel || rel.startsWith('..') || path.isAbsolute(rel))
646
+ break;
647
+ if (!this.scanned.has(dir)) {
648
+ this.scanned.add(dir);
649
+ const root = path.join(dir, '.nexrall', 'skills');
650
+ let hasRoot = false;
651
+ try {
652
+ hasRoot = fs.statSync(root).isDirectory();
653
+ }
654
+ catch {
655
+ /* the common case - most directories carry no skills */
656
+ }
657
+ if (hasRoot && !isIgnoredNestedDir(this.workDir, dir, this.ignored)) {
658
+ const scope = rel.split(path.sep).join('/');
659
+ const found = new Map();
660
+ loadSkillDir(root, 'project', found);
661
+ for (const skill of found.values()) {
662
+ skill.name = `${scope}:${skill.name}`;
663
+ out.push(skill);
664
+ }
665
+ }
666
+ }
667
+ const parent = path.dirname(dir);
668
+ if (parent === dir)
669
+ break;
670
+ dir = parent;
671
+ }
672
+ return out;
673
+ }
674
+ }
675
+ exports.NestedSkillScanner = NestedSkillScanner;
676
+ /**
677
+ * Resolve a `<dir>:<name>` reference to a nested skill. The scope must be a
678
+ * relative path that stays inside the project — `../elsewhere:x` or an absolute
679
+ * scope is rejected, so a skill reference can never read outside the workdir.
680
+ * Deliberately not cache-backed: callers use this for a MISS (a hit resolves
681
+ * against the list they already hold), and re-reading a few files on a miss is
682
+ * cheaper than keeping a second index honest.
683
+ */
684
+ function resolveNestedSkill(workDir, ref) {
685
+ const bare = ref.replace(/^\//, '').trim();
686
+ const idx = bare.lastIndexOf(':');
687
+ if (idx <= 0 || idx >= bare.length - 1)
688
+ return undefined;
689
+ const scope = bare.slice(0, idx).trim();
690
+ const name = bare
691
+ .slice(idx + 1)
692
+ .trim()
693
+ .toLowerCase();
694
+ if (!scope || !name)
695
+ return undefined;
696
+ const work = path.resolve(workDir);
697
+ let dir;
698
+ try {
699
+ dir = path.resolve(work, scope);
700
+ }
701
+ catch {
702
+ return undefined;
703
+ }
704
+ const rel = path.relative(work, dir);
705
+ if (!rel || rel.startsWith('..') || path.isAbsolute(rel))
706
+ return undefined;
707
+ const found = new Map();
708
+ loadSkillDir(path.join(dir, '.nexrall', 'skills'), 'project', found);
709
+ const skill = found.get(name);
710
+ if (skill) {
711
+ // Same scoped identity the scanner hands out, so console output, error
712
+ // messages and the model all name the skill the same way.
713
+ skill.name = `${rel.split(path.sep).join('/')}:${skill.name}`;
714
+ }
715
+ return skill;
716
+ }
328
717
  /**
329
718
  * Expand a skill body into a final prompt (same $ARGUMENTS / @file / !`cmd`
330
719
  * substitution as slash commands — see commands/loader.ts#expandBody), then
@@ -1 +1 @@
1
- {"version":3,"file":"subAgentBudget.d.ts","sourceRoot":"","sources":["../../src/agent/subAgentBudget.ts"],"names":[],"mappings":"AAuCA;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM,CAW9F;AAoBD,kFAAkF;AAClF,wBAAgB,6BAA6B,CAAC,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM,CAa/F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAgBlF;AA8BD,2FAA2F;AAC3F,eAAO,MAAM,gBAAgB,qBAA4B,CAAC;AAE1D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG;IAC/D,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7C,GAAG,EAAE,MAAM,CAAC;CACb,CAuBA;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C;AAkBD,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAQ9C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAGpE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuB7H;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAGnE;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE"}
1
+ {"version":3,"file":"subAgentBudget.d.ts","sourceRoot":"","sources":["../../src/agent/subAgentBudget.ts"],"names":[],"mappings":"AAuCA;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM,CAW9F;AAoBD,kFAAkF;AAClF,wBAAgB,6BAA6B,CAAC,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM,CAa/F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAgBlF;AA8BD,2FAA2F;AAC3F,eAAO,MAAM,gBAAgB,qBAA4B,CAAC;AAE1D,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf;IACD,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7C,GAAG,EAAE,MAAM,CAAC;CACb,CAuBA;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C;AAsBD,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAW9C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAGpE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAC9B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAuBf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAGnE;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"subTask.d.ts","sourceRoot":"","sources":["../../src/agent/subTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAiB,MAAM,UAAU,CAAC;AAGrF,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAazF;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,SAAS,EAAE,EAQvB,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAEvC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,EAIhF,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,CAAC,CAmvBrB"}
1
+ {"version":3,"file":"subTask.d.ts","sourceRoot":"","sources":["../../src/agent/subTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAiB,MAAM,UAAU,CAAC;AAGrF,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAuCzF;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,SAAS,EAAE,EAQvB,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAEvC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,EAIhF,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,CAAC,CA+yBrB"}