agentpacks 1.7.6 → 1.7.8
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.
- package/README.md +69 -742
- package/dist/api.d.ts +15 -15
- package/dist/api.js +2706 -2706
- package/dist/cli/export-cmd.js +364 -364
- package/dist/cli/generate.js +1409 -1409
- package/dist/cli/import-cmd.js +249 -249
- package/dist/cli/info.js +31 -31
- package/dist/cli/init.js +6 -6
- package/dist/cli/install.js +141 -141
- package/dist/cli/login.js +31 -31
- package/dist/cli/models-explain.js +514 -514
- package/dist/cli/pack/create.js +6 -6
- package/dist/cli/pack/enable.js +2 -2
- package/dist/cli/pack/list.js +362 -362
- package/dist/cli/pack/validate.js +119 -119
- package/dist/cli/publish.js +42 -42
- package/dist/cli/search.js +31 -31
- package/dist/core/config.js +3 -3
- package/dist/core/feature-merger.d.ts +5 -5
- package/dist/core/feature-merger.js +4 -4
- package/dist/core/index.d.ts +4 -4
- package/dist/core/index.js +633 -633
- package/dist/core/lockfile.js +1 -1
- package/dist/core/metarepo.js +3 -3
- package/dist/core/pack-loader.d.ts +6 -6
- package/dist/core/pack-loader.js +362 -362
- package/dist/core/profile-resolver.d.ts +1 -1
- package/dist/exporters/cursor-plugin.d.ts +12 -0
- package/dist/exporters/cursor-plugin.js +46 -46
- package/dist/exporters/index.d.ts +1 -1
- package/dist/exporters/index.js +46 -46
- package/dist/features/agents.js +4 -4
- package/dist/features/commands.js +4 -4
- package/dist/features/hooks.js +4 -4
- package/dist/features/index.d.ts +8 -8
- package/dist/features/index.js +350 -350
- package/dist/features/mcp.js +4 -4
- package/dist/features/models.js +4 -4
- package/dist/features/plugins.js +5 -5
- package/dist/features/rules.js +4 -4
- package/dist/features/skills.js +5 -5
- package/dist/importers/claude-code.js +6 -6
- package/dist/importers/cursor.js +7 -7
- package/dist/importers/opencode.js +7 -7
- package/dist/importers/rulesync.js +7 -7
- package/dist/index.js +2674 -2674
- package/dist/node/api.js +2706 -2706
- package/dist/node/cli/export-cmd.js +364 -364
- package/dist/node/cli/generate.js +1409 -1409
- package/dist/node/cli/import-cmd.js +249 -249
- package/dist/node/cli/info.js +31 -31
- package/dist/node/cli/init.js +6 -6
- package/dist/node/cli/install.js +141 -141
- package/dist/node/cli/login.js +31 -31
- package/dist/node/cli/models-explain.js +514 -514
- package/dist/node/cli/pack/create.js +6 -6
- package/dist/node/cli/pack/enable.js +2 -2
- package/dist/node/cli/pack/list.js +362 -362
- package/dist/node/cli/pack/validate.js +119 -119
- package/dist/node/cli/publish.js +42 -42
- package/dist/node/cli/search.js +31 -31
- package/dist/node/core/config.js +3 -3
- package/dist/node/core/feature-merger.js +4 -4
- package/dist/node/core/index.js +633 -633
- package/dist/node/core/lockfile.js +1 -1
- package/dist/node/core/metarepo.js +3 -3
- package/dist/node/core/pack-loader.js +362 -362
- package/dist/node/exporters/cursor-plugin.js +46 -46
- package/dist/node/exporters/index.js +46 -46
- package/dist/node/features/agents.js +4 -4
- package/dist/node/features/commands.js +4 -4
- package/dist/node/features/hooks.js +4 -4
- package/dist/node/features/index.js +350 -350
- package/dist/node/features/mcp.js +4 -4
- package/dist/node/features/models.js +4 -4
- package/dist/node/features/plugins.js +5 -5
- package/dist/node/features/rules.js +4 -4
- package/dist/node/features/skills.js +5 -5
- package/dist/node/importers/claude-code.js +6 -6
- package/dist/node/importers/cursor.js +7 -7
- package/dist/node/importers/opencode.js +7 -7
- package/dist/node/importers/rulesync.js +7 -7
- package/dist/node/index.js +2674 -2674
- package/dist/node/sources/git.js +2 -2
- package/dist/node/sources/index.js +138 -138
- package/dist/node/sources/local.js +1 -1
- package/dist/node/sources/npm.js +3 -3
- package/dist/node/sources/registry.js +35 -35
- package/dist/node/targets/additional-targets.js +43 -43
- package/dist/node/targets/agents-md.js +4 -4
- package/dist/node/targets/claude-code.js +86 -86
- package/dist/node/targets/codex-cli.js +6 -6
- package/dist/node/targets/copilot.js +46 -46
- package/dist/node/targets/cursor.js +68 -68
- package/dist/node/targets/gemini-cli.js +25 -25
- package/dist/node/targets/generic-md-target.js +43 -43
- package/dist/node/targets/index.js +911 -911
- package/dist/node/targets/mistral-vibe.js +46 -46
- package/dist/node/targets/opencode.js +68 -68
- package/dist/node/targets/registry.js +911 -911
- package/dist/node/utils/credentials.js +2 -2
- package/dist/node/utils/filesystem.js +4 -4
- package/dist/node/utils/global.js +1 -1
- package/dist/node/utils/tarball.js +2 -2
- package/dist/sources/git.js +2 -2
- package/dist/sources/index.d.ts +6 -6
- package/dist/sources/index.js +138 -138
- package/dist/sources/local.js +1 -1
- package/dist/sources/npm.d.ts +3 -0
- package/dist/sources/npm.js +3 -3
- package/dist/sources/registry.js +35 -35
- package/dist/targets/additional-targets.js +43 -43
- package/dist/targets/agents-md.js +4 -4
- package/dist/targets/claude-code.js +86 -86
- package/dist/targets/codex-cli.js +6 -6
- package/dist/targets/copilot.js +46 -46
- package/dist/targets/cursor.js +68 -68
- package/dist/targets/gemini-cli.js +25 -25
- package/dist/targets/generic-md-target.js +43 -43
- package/dist/targets/index.d.ts +6 -6
- package/dist/targets/index.js +911 -911
- package/dist/targets/mistral-vibe.js +46 -46
- package/dist/targets/opencode.js +68 -68
- package/dist/targets/registry.js +911 -911
- package/dist/utils/credentials.js +2 -2
- package/dist/utils/filesystem.js +4 -4
- package/dist/utils/global.d.ts +3 -0
- package/dist/utils/global.js +1 -1
- package/dist/utils/tarball.js +2 -2
- package/package.json +5 -5
- package/templates/pack/models.json +36 -36
- package/templates/pack/pack.json +8 -8
- package/templates/workspace/agentpacks.jsonc +24 -24
|
@@ -5,13 +5,13 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
5
5
|
import {
|
|
6
6
|
existsSync,
|
|
7
7
|
mkdirSync,
|
|
8
|
-
readFileSync,
|
|
9
|
-
writeFileSync,
|
|
10
8
|
readdirSync,
|
|
9
|
+
readFileSync,
|
|
11
10
|
rmSync,
|
|
12
|
-
statSync
|
|
11
|
+
statSync,
|
|
12
|
+
writeFileSync
|
|
13
13
|
} from "fs";
|
|
14
|
-
import { dirname,
|
|
14
|
+
import { dirname, join, relative } from "path";
|
|
15
15
|
var GENERATED_HEADER_MD = "<!-- Generated by agentpacks. DO NOT EDIT. -->";
|
|
16
16
|
var GENERATED_HEADER_JSON = "// Generated by agentpacks. DO NOT EDIT.";
|
|
17
17
|
var GENERATED_HEADER_JS = "// Generated by agentpacks. DO NOT EDIT.";
|
|
@@ -129,38 +129,32 @@ function serializeFrontmatter(data, content) {
|
|
|
129
129
|
return matter.stringify(content, filtered);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
// src/features/
|
|
132
|
+
// src/features/agents.ts
|
|
133
133
|
import { readFileSync as readFileSync2 } from "fs";
|
|
134
134
|
import { basename } from "path";
|
|
135
|
-
function
|
|
136
|
-
const files = listFiles(
|
|
137
|
-
return files.map((filepath) =>
|
|
135
|
+
function parseAgents(agentsDir, packName) {
|
|
136
|
+
const files = listFiles(agentsDir, { extension: ".md" });
|
|
137
|
+
return files.map((filepath) => parseAgentFile(filepath, packName));
|
|
138
138
|
}
|
|
139
|
-
function
|
|
139
|
+
function parseAgentFile(filepath, packName) {
|
|
140
140
|
const raw = readFileSync2(filepath, "utf-8");
|
|
141
141
|
const { data, content } = parseFrontmatter(raw);
|
|
142
142
|
return {
|
|
143
|
-
name: basename(filepath, ".md"),
|
|
143
|
+
name: data.name ?? basename(filepath, ".md"),
|
|
144
144
|
sourcePath: filepath,
|
|
145
145
|
packName,
|
|
146
146
|
meta: data,
|
|
147
147
|
content
|
|
148
148
|
};
|
|
149
149
|
}
|
|
150
|
-
function
|
|
151
|
-
const { targets } =
|
|
150
|
+
function agentMatchesTarget(agent, targetId) {
|
|
151
|
+
const { targets } = agent.meta;
|
|
152
152
|
if (!targets || targets === "*")
|
|
153
153
|
return true;
|
|
154
154
|
if (Array.isArray(targets) && targets.includes("*"))
|
|
155
155
|
return true;
|
|
156
156
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
157
157
|
}
|
|
158
|
-
function getRootRules(rules) {
|
|
159
|
-
return rules.filter((r) => r.meta.root === true);
|
|
160
|
-
}
|
|
161
|
-
function getDetailRules(rules) {
|
|
162
|
-
return rules.filter((r) => r.meta.root !== true);
|
|
163
|
-
}
|
|
164
158
|
|
|
165
159
|
// src/features/commands.ts
|
|
166
160
|
import { readFileSync as readFileSync3 } from "fs";
|
|
@@ -189,43 +183,87 @@ function commandMatchesTarget(cmd, targetId) {
|
|
|
189
183
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
190
184
|
}
|
|
191
185
|
|
|
192
|
-
// src/features/
|
|
186
|
+
// src/features/hooks.ts
|
|
187
|
+
import { join as join2 } from "path";
|
|
188
|
+
var TARGET_OVERRIDE_KEYS = ["cursor", "claudecode", "opencode"];
|
|
189
|
+
function parseHooks(packDir, packName) {
|
|
190
|
+
const hooksPath = join2(packDir, "hooks", "hooks.json");
|
|
191
|
+
const raw = readJsonOrNull(hooksPath);
|
|
192
|
+
if (!raw)
|
|
193
|
+
return null;
|
|
194
|
+
const shared = raw.hooks ?? {};
|
|
195
|
+
const targetOverrides = {};
|
|
196
|
+
for (const key of TARGET_OVERRIDE_KEYS) {
|
|
197
|
+
const override = raw[key];
|
|
198
|
+
if (override && typeof override === "object" && "hooks" in override && override.hooks) {
|
|
199
|
+
targetOverrides[key] = override.hooks;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
packName,
|
|
204
|
+
sourcePath: hooksPath,
|
|
205
|
+
version: raw.version,
|
|
206
|
+
shared,
|
|
207
|
+
targetOverrides
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function resolveHooksForTarget(hooks, targetId) {
|
|
211
|
+
const merged = {};
|
|
212
|
+
for (const [event, entries] of Object.entries(hooks.shared)) {
|
|
213
|
+
merged[event] = [...entries];
|
|
214
|
+
}
|
|
215
|
+
const overrides = hooks.targetOverrides[targetId];
|
|
216
|
+
if (overrides) {
|
|
217
|
+
for (const [event, entries] of Object.entries(overrides)) {
|
|
218
|
+
merged[event] = [...merged[event] ?? [], ...entries];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return merged;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// src/features/rules.ts
|
|
193
225
|
import { readFileSync as readFileSync4 } from "fs";
|
|
194
226
|
import { basename as basename3 } from "path";
|
|
195
|
-
function
|
|
196
|
-
const files = listFiles(
|
|
197
|
-
return files.map((filepath) =>
|
|
227
|
+
function parseRules(rulesDir, packName) {
|
|
228
|
+
const files = listFiles(rulesDir, { extension: ".md" });
|
|
229
|
+
return files.map((filepath) => parseRuleFile(filepath, packName));
|
|
198
230
|
}
|
|
199
|
-
function
|
|
231
|
+
function parseRuleFile(filepath, packName) {
|
|
200
232
|
const raw = readFileSync4(filepath, "utf-8");
|
|
201
233
|
const { data, content } = parseFrontmatter(raw);
|
|
202
234
|
return {
|
|
203
|
-
name:
|
|
235
|
+
name: basename3(filepath, ".md"),
|
|
204
236
|
sourcePath: filepath,
|
|
205
237
|
packName,
|
|
206
238
|
meta: data,
|
|
207
239
|
content
|
|
208
240
|
};
|
|
209
241
|
}
|
|
210
|
-
function
|
|
211
|
-
const { targets } =
|
|
242
|
+
function ruleMatchesTarget(rule, targetId) {
|
|
243
|
+
const { targets } = rule.meta;
|
|
212
244
|
if (!targets || targets === "*")
|
|
213
245
|
return true;
|
|
214
246
|
if (Array.isArray(targets) && targets.includes("*"))
|
|
215
247
|
return true;
|
|
216
248
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
217
249
|
}
|
|
250
|
+
function getRootRules(rules) {
|
|
251
|
+
return rules.filter((r) => r.meta.root === true);
|
|
252
|
+
}
|
|
253
|
+
function getDetailRules(rules) {
|
|
254
|
+
return rules.filter((r) => r.meta.root !== true);
|
|
255
|
+
}
|
|
218
256
|
|
|
219
257
|
// src/features/skills.ts
|
|
220
|
-
import {
|
|
221
|
-
import { basename as basename4, join as
|
|
258
|
+
import { existsSync as existsSync2, readFileSync as readFileSync5 } from "fs";
|
|
259
|
+
import { basename as basename4, join as join3 } from "path";
|
|
222
260
|
var SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
223
261
|
var SKILL_NAME_MAX_LENGTH = 64;
|
|
224
262
|
function parseSkills(skillsDir, packName) {
|
|
225
263
|
const dirs = listDirs(skillsDir);
|
|
226
264
|
const skills = [];
|
|
227
265
|
for (const dir of dirs) {
|
|
228
|
-
const skillMd =
|
|
266
|
+
const skillMd = join3(dir, "SKILL.md");
|
|
229
267
|
if (existsSync2(skillMd)) {
|
|
230
268
|
skills.push(parseSkillFile(skillMd, dir, packName));
|
|
231
269
|
}
|
|
@@ -306,44 +344,6 @@ function skillMatchesTarget(skill, targetId) {
|
|
|
306
344
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
307
345
|
}
|
|
308
346
|
|
|
309
|
-
// src/features/hooks.ts
|
|
310
|
-
import { join as join3 } from "path";
|
|
311
|
-
var TARGET_OVERRIDE_KEYS = ["cursor", "claudecode", "opencode"];
|
|
312
|
-
function parseHooks(packDir, packName) {
|
|
313
|
-
const hooksPath = join3(packDir, "hooks", "hooks.json");
|
|
314
|
-
const raw = readJsonOrNull(hooksPath);
|
|
315
|
-
if (!raw)
|
|
316
|
-
return null;
|
|
317
|
-
const shared = raw.hooks ?? {};
|
|
318
|
-
const targetOverrides = {};
|
|
319
|
-
for (const key of TARGET_OVERRIDE_KEYS) {
|
|
320
|
-
const override = raw[key];
|
|
321
|
-
if (override && typeof override === "object" && "hooks" in override && override.hooks) {
|
|
322
|
-
targetOverrides[key] = override.hooks;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return {
|
|
326
|
-
packName,
|
|
327
|
-
sourcePath: hooksPath,
|
|
328
|
-
version: raw.version,
|
|
329
|
-
shared,
|
|
330
|
-
targetOverrides
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
function resolveHooksForTarget(hooks, targetId) {
|
|
334
|
-
const merged = {};
|
|
335
|
-
for (const [event, entries] of Object.entries(hooks.shared)) {
|
|
336
|
-
merged[event] = [...entries];
|
|
337
|
-
}
|
|
338
|
-
const overrides = hooks.targetOverrides[targetId];
|
|
339
|
-
if (overrides) {
|
|
340
|
-
for (const [event, entries] of Object.entries(overrides)) {
|
|
341
|
-
merged[event] = [...merged[event] ?? [], ...entries];
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
return merged;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
347
|
// src/core/profile-resolver.ts
|
|
348
348
|
function resolveModels(merged, modelProfile, targetId) {
|
|
349
349
|
let defaultModel = merged.default;
|
|
@@ -448,24 +448,6 @@ function resolveProfileChain(name, profiles, visited, depth) {
|
|
|
448
448
|
};
|
|
449
449
|
}
|
|
450
450
|
|
|
451
|
-
// src/targets/base-target.ts
|
|
452
|
-
class BaseTarget {
|
|
453
|
-
supportsFeature(feature) {
|
|
454
|
-
return this.supportedFeatures.includes(feature);
|
|
455
|
-
}
|
|
456
|
-
getEffectiveFeatures(enabledFeatures) {
|
|
457
|
-
return enabledFeatures.filter((f) => this.supportsFeature(f));
|
|
458
|
-
}
|
|
459
|
-
createResult(filesWritten = [], filesDeleted = [], warnings = []) {
|
|
460
|
-
return {
|
|
461
|
-
targetId: this.id,
|
|
462
|
-
filesWritten,
|
|
463
|
-
filesDeleted,
|
|
464
|
-
warnings
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
|
|
469
451
|
// src/utils/model-guidance.ts
|
|
470
452
|
function generateModelGuidanceMarkdown(resolved) {
|
|
471
453
|
if (!resolved.default && !resolved.small && Object.keys(resolved.agents).length === 0 && Object.keys(resolved.profiles).length === 0) {
|
|
@@ -539,8 +521,26 @@ function generateModelGuidanceMarkdown(resolved) {
|
|
|
539
521
|
`);
|
|
540
522
|
}
|
|
541
523
|
|
|
524
|
+
// src/targets/base-target.ts
|
|
525
|
+
class BaseTarget {
|
|
526
|
+
supportsFeature(feature) {
|
|
527
|
+
return this.supportedFeatures.includes(feature);
|
|
528
|
+
}
|
|
529
|
+
getEffectiveFeatures(enabledFeatures) {
|
|
530
|
+
return enabledFeatures.filter((f) => this.supportsFeature(f));
|
|
531
|
+
}
|
|
532
|
+
createResult(filesWritten = [], filesDeleted = [], warnings = []) {
|
|
533
|
+
return {
|
|
534
|
+
targetId: this.id,
|
|
535
|
+
filesWritten,
|
|
536
|
+
filesDeleted,
|
|
537
|
+
warnings
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
542
|
// src/targets/claude-code.ts
|
|
543
|
-
import {
|
|
543
|
+
import { join as join4, resolve } from "path";
|
|
544
544
|
var TARGET_ID = "claudecode";
|
|
545
545
|
|
|
546
546
|
class ClaudeCodeTarget extends BaseTarget {
|
|
@@ -5,13 +5,13 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
5
5
|
import {
|
|
6
6
|
existsSync,
|
|
7
7
|
mkdirSync,
|
|
8
|
-
readFileSync,
|
|
9
|
-
writeFileSync,
|
|
10
8
|
readdirSync,
|
|
9
|
+
readFileSync,
|
|
11
10
|
rmSync,
|
|
12
|
-
statSync
|
|
11
|
+
statSync,
|
|
12
|
+
writeFileSync
|
|
13
13
|
} from "fs";
|
|
14
|
-
import { dirname,
|
|
14
|
+
import { dirname, join, relative } from "path";
|
|
15
15
|
var GENERATED_HEADER_MD = "<!-- Generated by agentpacks. DO NOT EDIT. -->";
|
|
16
16
|
var GENERATED_HEADER_JSON = "// Generated by agentpacks. DO NOT EDIT.";
|
|
17
17
|
var GENERATED_HEADER_JS = "// Generated by agentpacks. DO NOT EDIT.";
|
|
@@ -163,7 +163,7 @@ function getDetailRules(rules) {
|
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
// src/features/skills.ts
|
|
166
|
-
import {
|
|
166
|
+
import { existsSync as existsSync2, readFileSync as readFileSync3 } from "fs";
|
|
167
167
|
import { basename as basename2, join as join2 } from "path";
|
|
168
168
|
var SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
169
169
|
var SKILL_NAME_MAX_LENGTH = 64;
|
|
@@ -271,7 +271,7 @@ class BaseTarget {
|
|
|
271
271
|
}
|
|
272
272
|
|
|
273
273
|
// src/targets/codex-cli.ts
|
|
274
|
-
import {
|
|
274
|
+
import { join as join3, resolve } from "path";
|
|
275
275
|
var TARGET_ID = "codexcli";
|
|
276
276
|
|
|
277
277
|
class CodexCliTarget extends BaseTarget {
|
|
@@ -5,13 +5,13 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
5
5
|
import {
|
|
6
6
|
existsSync,
|
|
7
7
|
mkdirSync,
|
|
8
|
-
readFileSync,
|
|
9
|
-
writeFileSync,
|
|
10
8
|
readdirSync,
|
|
9
|
+
readFileSync,
|
|
11
10
|
rmSync,
|
|
12
|
-
statSync
|
|
11
|
+
statSync,
|
|
12
|
+
writeFileSync
|
|
13
13
|
} from "fs";
|
|
14
|
-
import { dirname,
|
|
14
|
+
import { dirname, join, relative } from "path";
|
|
15
15
|
var GENERATED_HEADER_MD = "<!-- Generated by agentpacks. DO NOT EDIT. -->";
|
|
16
16
|
var GENERATED_HEADER_JSON = "// Generated by agentpacks. DO NOT EDIT.";
|
|
17
17
|
var GENERATED_HEADER_JS = "// Generated by agentpacks. DO NOT EDIT.";
|
|
@@ -129,38 +129,32 @@ function serializeFrontmatter(data, content) {
|
|
|
129
129
|
return matter.stringify(content, filtered);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
// src/features/
|
|
132
|
+
// src/features/agents.ts
|
|
133
133
|
import { readFileSync as readFileSync2 } from "fs";
|
|
134
134
|
import { basename } from "path";
|
|
135
|
-
function
|
|
136
|
-
const files = listFiles(
|
|
137
|
-
return files.map((filepath) =>
|
|
135
|
+
function parseAgents(agentsDir, packName) {
|
|
136
|
+
const files = listFiles(agentsDir, { extension: ".md" });
|
|
137
|
+
return files.map((filepath) => parseAgentFile(filepath, packName));
|
|
138
138
|
}
|
|
139
|
-
function
|
|
139
|
+
function parseAgentFile(filepath, packName) {
|
|
140
140
|
const raw = readFileSync2(filepath, "utf-8");
|
|
141
141
|
const { data, content } = parseFrontmatter(raw);
|
|
142
142
|
return {
|
|
143
|
-
name: basename(filepath, ".md"),
|
|
143
|
+
name: data.name ?? basename(filepath, ".md"),
|
|
144
144
|
sourcePath: filepath,
|
|
145
145
|
packName,
|
|
146
146
|
meta: data,
|
|
147
147
|
content
|
|
148
148
|
};
|
|
149
149
|
}
|
|
150
|
-
function
|
|
151
|
-
const { targets } =
|
|
150
|
+
function agentMatchesTarget(agent, targetId) {
|
|
151
|
+
const { targets } = agent.meta;
|
|
152
152
|
if (!targets || targets === "*")
|
|
153
153
|
return true;
|
|
154
154
|
if (Array.isArray(targets) && targets.includes("*"))
|
|
155
155
|
return true;
|
|
156
156
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
157
157
|
}
|
|
158
|
-
function getRootRules(rules) {
|
|
159
|
-
return rules.filter((r) => r.meta.root === true);
|
|
160
|
-
}
|
|
161
|
-
function getDetailRules(rules) {
|
|
162
|
-
return rules.filter((r) => r.meta.root !== true);
|
|
163
|
-
}
|
|
164
158
|
|
|
165
159
|
// src/features/commands.ts
|
|
166
160
|
import { readFileSync as readFileSync3 } from "fs";
|
|
@@ -189,35 +183,41 @@ function commandMatchesTarget(cmd, targetId) {
|
|
|
189
183
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
190
184
|
}
|
|
191
185
|
|
|
192
|
-
// src/features/
|
|
186
|
+
// src/features/rules.ts
|
|
193
187
|
import { readFileSync as readFileSync4 } from "fs";
|
|
194
188
|
import { basename as basename3 } from "path";
|
|
195
|
-
function
|
|
196
|
-
const files = listFiles(
|
|
197
|
-
return files.map((filepath) =>
|
|
189
|
+
function parseRules(rulesDir, packName) {
|
|
190
|
+
const files = listFiles(rulesDir, { extension: ".md" });
|
|
191
|
+
return files.map((filepath) => parseRuleFile(filepath, packName));
|
|
198
192
|
}
|
|
199
|
-
function
|
|
193
|
+
function parseRuleFile(filepath, packName) {
|
|
200
194
|
const raw = readFileSync4(filepath, "utf-8");
|
|
201
195
|
const { data, content } = parseFrontmatter(raw);
|
|
202
196
|
return {
|
|
203
|
-
name:
|
|
197
|
+
name: basename3(filepath, ".md"),
|
|
204
198
|
sourcePath: filepath,
|
|
205
199
|
packName,
|
|
206
200
|
meta: data,
|
|
207
201
|
content
|
|
208
202
|
};
|
|
209
203
|
}
|
|
210
|
-
function
|
|
211
|
-
const { targets } =
|
|
204
|
+
function ruleMatchesTarget(rule, targetId) {
|
|
205
|
+
const { targets } = rule.meta;
|
|
212
206
|
if (!targets || targets === "*")
|
|
213
207
|
return true;
|
|
214
208
|
if (Array.isArray(targets) && targets.includes("*"))
|
|
215
209
|
return true;
|
|
216
210
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
217
211
|
}
|
|
212
|
+
function getRootRules(rules) {
|
|
213
|
+
return rules.filter((r) => r.meta.root === true);
|
|
214
|
+
}
|
|
215
|
+
function getDetailRules(rules) {
|
|
216
|
+
return rules.filter((r) => r.meta.root !== true);
|
|
217
|
+
}
|
|
218
218
|
|
|
219
219
|
// src/features/skills.ts
|
|
220
|
-
import {
|
|
220
|
+
import { existsSync as existsSync2, readFileSync as readFileSync5 } from "fs";
|
|
221
221
|
import { basename as basename4, join as join2 } from "path";
|
|
222
222
|
var SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
223
223
|
var SKILL_NAME_MAX_LENGTH = 64;
|
|
@@ -410,24 +410,6 @@ function resolveProfileChain(name, profiles, visited, depth) {
|
|
|
410
410
|
};
|
|
411
411
|
}
|
|
412
412
|
|
|
413
|
-
// src/targets/base-target.ts
|
|
414
|
-
class BaseTarget {
|
|
415
|
-
supportsFeature(feature) {
|
|
416
|
-
return this.supportedFeatures.includes(feature);
|
|
417
|
-
}
|
|
418
|
-
getEffectiveFeatures(enabledFeatures) {
|
|
419
|
-
return enabledFeatures.filter((f) => this.supportsFeature(f));
|
|
420
|
-
}
|
|
421
|
-
createResult(filesWritten = [], filesDeleted = [], warnings = []) {
|
|
422
|
-
return {
|
|
423
|
-
targetId: this.id,
|
|
424
|
-
filesWritten,
|
|
425
|
-
filesDeleted,
|
|
426
|
-
warnings
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
|
|
431
413
|
// src/utils/model-guidance.ts
|
|
432
414
|
function generateModelGuidanceMarkdown(resolved) {
|
|
433
415
|
if (!resolved.default && !resolved.small && Object.keys(resolved.agents).length === 0 && Object.keys(resolved.profiles).length === 0) {
|
|
@@ -501,8 +483,26 @@ function generateModelGuidanceMarkdown(resolved) {
|
|
|
501
483
|
`);
|
|
502
484
|
}
|
|
503
485
|
|
|
486
|
+
// src/targets/base-target.ts
|
|
487
|
+
class BaseTarget {
|
|
488
|
+
supportsFeature(feature) {
|
|
489
|
+
return this.supportedFeatures.includes(feature);
|
|
490
|
+
}
|
|
491
|
+
getEffectiveFeatures(enabledFeatures) {
|
|
492
|
+
return enabledFeatures.filter((f) => this.supportsFeature(f));
|
|
493
|
+
}
|
|
494
|
+
createResult(filesWritten = [], filesDeleted = [], warnings = []) {
|
|
495
|
+
return {
|
|
496
|
+
targetId: this.id,
|
|
497
|
+
filesWritten,
|
|
498
|
+
filesDeleted,
|
|
499
|
+
warnings
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
504
|
// src/targets/copilot.ts
|
|
505
|
-
import {
|
|
505
|
+
import { join as join3, resolve } from "path";
|
|
506
506
|
var TARGET_ID = "copilot";
|
|
507
507
|
|
|
508
508
|
class CopilotTarget extends BaseTarget {
|
|
@@ -5,13 +5,13 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
5
5
|
import {
|
|
6
6
|
existsSync,
|
|
7
7
|
mkdirSync,
|
|
8
|
-
readFileSync,
|
|
9
|
-
writeFileSync,
|
|
10
8
|
readdirSync,
|
|
9
|
+
readFileSync,
|
|
11
10
|
rmSync,
|
|
12
|
-
statSync
|
|
11
|
+
statSync,
|
|
12
|
+
writeFileSync
|
|
13
13
|
} from "fs";
|
|
14
|
-
import { dirname,
|
|
14
|
+
import { dirname, join, relative } from "path";
|
|
15
15
|
var GENERATED_HEADER_MD = "<!-- Generated by agentpacks. DO NOT EDIT. -->";
|
|
16
16
|
var GENERATED_HEADER_JSON = "// Generated by agentpacks. DO NOT EDIT.";
|
|
17
17
|
var GENERATED_HEADER_JS = "// Generated by agentpacks. DO NOT EDIT.";
|
|
@@ -129,38 +129,32 @@ function serializeFrontmatter(data, content) {
|
|
|
129
129
|
return matter.stringify(content, filtered);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
// src/features/
|
|
132
|
+
// src/features/agents.ts
|
|
133
133
|
import { readFileSync as readFileSync2 } from "fs";
|
|
134
134
|
import { basename } from "path";
|
|
135
|
-
function
|
|
136
|
-
const files = listFiles(
|
|
137
|
-
return files.map((filepath) =>
|
|
135
|
+
function parseAgents(agentsDir, packName) {
|
|
136
|
+
const files = listFiles(agentsDir, { extension: ".md" });
|
|
137
|
+
return files.map((filepath) => parseAgentFile(filepath, packName));
|
|
138
138
|
}
|
|
139
|
-
function
|
|
139
|
+
function parseAgentFile(filepath, packName) {
|
|
140
140
|
const raw = readFileSync2(filepath, "utf-8");
|
|
141
141
|
const { data, content } = parseFrontmatter(raw);
|
|
142
142
|
return {
|
|
143
|
-
name: basename(filepath, ".md"),
|
|
143
|
+
name: data.name ?? basename(filepath, ".md"),
|
|
144
144
|
sourcePath: filepath,
|
|
145
145
|
packName,
|
|
146
146
|
meta: data,
|
|
147
147
|
content
|
|
148
148
|
};
|
|
149
149
|
}
|
|
150
|
-
function
|
|
151
|
-
const { targets } =
|
|
150
|
+
function agentMatchesTarget(agent, targetId) {
|
|
151
|
+
const { targets } = agent.meta;
|
|
152
152
|
if (!targets || targets === "*")
|
|
153
153
|
return true;
|
|
154
154
|
if (Array.isArray(targets) && targets.includes("*"))
|
|
155
155
|
return true;
|
|
156
156
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
157
157
|
}
|
|
158
|
-
function getRootRules(rules) {
|
|
159
|
-
return rules.filter((r) => r.meta.root === true);
|
|
160
|
-
}
|
|
161
|
-
function getDetailRules(rules) {
|
|
162
|
-
return rules.filter((r) => r.meta.root !== true);
|
|
163
|
-
}
|
|
164
158
|
|
|
165
159
|
// src/features/commands.ts
|
|
166
160
|
import { readFileSync as readFileSync3 } from "fs";
|
|
@@ -189,43 +183,87 @@ function commandMatchesTarget(cmd, targetId) {
|
|
|
189
183
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
190
184
|
}
|
|
191
185
|
|
|
192
|
-
// src/features/
|
|
186
|
+
// src/features/hooks.ts
|
|
187
|
+
import { join as join2 } from "path";
|
|
188
|
+
var TARGET_OVERRIDE_KEYS = ["cursor", "claudecode", "opencode"];
|
|
189
|
+
function parseHooks(packDir, packName) {
|
|
190
|
+
const hooksPath = join2(packDir, "hooks", "hooks.json");
|
|
191
|
+
const raw = readJsonOrNull(hooksPath);
|
|
192
|
+
if (!raw)
|
|
193
|
+
return null;
|
|
194
|
+
const shared = raw.hooks ?? {};
|
|
195
|
+
const targetOverrides = {};
|
|
196
|
+
for (const key of TARGET_OVERRIDE_KEYS) {
|
|
197
|
+
const override = raw[key];
|
|
198
|
+
if (override && typeof override === "object" && "hooks" in override && override.hooks) {
|
|
199
|
+
targetOverrides[key] = override.hooks;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
packName,
|
|
204
|
+
sourcePath: hooksPath,
|
|
205
|
+
version: raw.version,
|
|
206
|
+
shared,
|
|
207
|
+
targetOverrides
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function resolveHooksForTarget(hooks, targetId) {
|
|
211
|
+
const merged = {};
|
|
212
|
+
for (const [event, entries] of Object.entries(hooks.shared)) {
|
|
213
|
+
merged[event] = [...entries];
|
|
214
|
+
}
|
|
215
|
+
const overrides = hooks.targetOverrides[targetId];
|
|
216
|
+
if (overrides) {
|
|
217
|
+
for (const [event, entries] of Object.entries(overrides)) {
|
|
218
|
+
merged[event] = [...merged[event] ?? [], ...entries];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return merged;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// src/features/rules.ts
|
|
193
225
|
import { readFileSync as readFileSync4 } from "fs";
|
|
194
226
|
import { basename as basename3 } from "path";
|
|
195
|
-
function
|
|
196
|
-
const files = listFiles(
|
|
197
|
-
return files.map((filepath) =>
|
|
227
|
+
function parseRules(rulesDir, packName) {
|
|
228
|
+
const files = listFiles(rulesDir, { extension: ".md" });
|
|
229
|
+
return files.map((filepath) => parseRuleFile(filepath, packName));
|
|
198
230
|
}
|
|
199
|
-
function
|
|
231
|
+
function parseRuleFile(filepath, packName) {
|
|
200
232
|
const raw = readFileSync4(filepath, "utf-8");
|
|
201
233
|
const { data, content } = parseFrontmatter(raw);
|
|
202
234
|
return {
|
|
203
|
-
name:
|
|
235
|
+
name: basename3(filepath, ".md"),
|
|
204
236
|
sourcePath: filepath,
|
|
205
237
|
packName,
|
|
206
238
|
meta: data,
|
|
207
239
|
content
|
|
208
240
|
};
|
|
209
241
|
}
|
|
210
|
-
function
|
|
211
|
-
const { targets } =
|
|
242
|
+
function ruleMatchesTarget(rule, targetId) {
|
|
243
|
+
const { targets } = rule.meta;
|
|
212
244
|
if (!targets || targets === "*")
|
|
213
245
|
return true;
|
|
214
246
|
if (Array.isArray(targets) && targets.includes("*"))
|
|
215
247
|
return true;
|
|
216
248
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
217
249
|
}
|
|
250
|
+
function getRootRules(rules) {
|
|
251
|
+
return rules.filter((r) => r.meta.root === true);
|
|
252
|
+
}
|
|
253
|
+
function getDetailRules(rules) {
|
|
254
|
+
return rules.filter((r) => r.meta.root !== true);
|
|
255
|
+
}
|
|
218
256
|
|
|
219
257
|
// src/features/skills.ts
|
|
220
|
-
import {
|
|
221
|
-
import { basename as basename4, join as
|
|
258
|
+
import { existsSync as existsSync2, readFileSync as readFileSync5 } from "fs";
|
|
259
|
+
import { basename as basename4, join as join3 } from "path";
|
|
222
260
|
var SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
223
261
|
var SKILL_NAME_MAX_LENGTH = 64;
|
|
224
262
|
function parseSkills(skillsDir, packName) {
|
|
225
263
|
const dirs = listDirs(skillsDir);
|
|
226
264
|
const skills = [];
|
|
227
265
|
for (const dir of dirs) {
|
|
228
|
-
const skillMd =
|
|
266
|
+
const skillMd = join3(dir, "SKILL.md");
|
|
229
267
|
if (existsSync2(skillMd)) {
|
|
230
268
|
skills.push(parseSkillFile(skillMd, dir, packName));
|
|
231
269
|
}
|
|
@@ -306,44 +344,6 @@ function skillMatchesTarget(skill, targetId) {
|
|
|
306
344
|
return Array.isArray(targets) && targets.includes(targetId);
|
|
307
345
|
}
|
|
308
346
|
|
|
309
|
-
// src/features/hooks.ts
|
|
310
|
-
import { join as join3 } from "path";
|
|
311
|
-
var TARGET_OVERRIDE_KEYS = ["cursor", "claudecode", "opencode"];
|
|
312
|
-
function parseHooks(packDir, packName) {
|
|
313
|
-
const hooksPath = join3(packDir, "hooks", "hooks.json");
|
|
314
|
-
const raw = readJsonOrNull(hooksPath);
|
|
315
|
-
if (!raw)
|
|
316
|
-
return null;
|
|
317
|
-
const shared = raw.hooks ?? {};
|
|
318
|
-
const targetOverrides = {};
|
|
319
|
-
for (const key of TARGET_OVERRIDE_KEYS) {
|
|
320
|
-
const override = raw[key];
|
|
321
|
-
if (override && typeof override === "object" && "hooks" in override && override.hooks) {
|
|
322
|
-
targetOverrides[key] = override.hooks;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return {
|
|
326
|
-
packName,
|
|
327
|
-
sourcePath: hooksPath,
|
|
328
|
-
version: raw.version,
|
|
329
|
-
shared,
|
|
330
|
-
targetOverrides
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
function resolveHooksForTarget(hooks, targetId) {
|
|
334
|
-
const merged = {};
|
|
335
|
-
for (const [event, entries] of Object.entries(hooks.shared)) {
|
|
336
|
-
merged[event] = [...entries];
|
|
337
|
-
}
|
|
338
|
-
const overrides = hooks.targetOverrides[targetId];
|
|
339
|
-
if (overrides) {
|
|
340
|
-
for (const [event, entries] of Object.entries(overrides)) {
|
|
341
|
-
merged[event] = [...merged[event] ?? [], ...entries];
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
return merged;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
347
|
// src/core/profile-resolver.ts
|
|
348
348
|
function resolveModels(merged, modelProfile, targetId) {
|
|
349
349
|
let defaultModel = merged.default;
|
|
@@ -467,7 +467,7 @@ class BaseTarget {
|
|
|
467
467
|
}
|
|
468
468
|
|
|
469
469
|
// src/targets/cursor.ts
|
|
470
|
-
import {
|
|
470
|
+
import { join as join4, resolve } from "path";
|
|
471
471
|
var TARGET_ID = "cursor";
|
|
472
472
|
|
|
473
473
|
class CursorTarget extends BaseTarget {
|