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.
Files changed (133) hide show
  1. package/README.md +69 -742
  2. package/dist/api.d.ts +15 -15
  3. package/dist/api.js +2706 -2706
  4. package/dist/cli/export-cmd.js +364 -364
  5. package/dist/cli/generate.js +1409 -1409
  6. package/dist/cli/import-cmd.js +249 -249
  7. package/dist/cli/info.js +31 -31
  8. package/dist/cli/init.js +6 -6
  9. package/dist/cli/install.js +141 -141
  10. package/dist/cli/login.js +31 -31
  11. package/dist/cli/models-explain.js +514 -514
  12. package/dist/cli/pack/create.js +6 -6
  13. package/dist/cli/pack/enable.js +2 -2
  14. package/dist/cli/pack/list.js +362 -362
  15. package/dist/cli/pack/validate.js +119 -119
  16. package/dist/cli/publish.js +42 -42
  17. package/dist/cli/search.js +31 -31
  18. package/dist/core/config.js +3 -3
  19. package/dist/core/feature-merger.d.ts +5 -5
  20. package/dist/core/feature-merger.js +4 -4
  21. package/dist/core/index.d.ts +4 -4
  22. package/dist/core/index.js +633 -633
  23. package/dist/core/lockfile.js +1 -1
  24. package/dist/core/metarepo.js +3 -3
  25. package/dist/core/pack-loader.d.ts +6 -6
  26. package/dist/core/pack-loader.js +362 -362
  27. package/dist/core/profile-resolver.d.ts +1 -1
  28. package/dist/exporters/cursor-plugin.d.ts +12 -0
  29. package/dist/exporters/cursor-plugin.js +46 -46
  30. package/dist/exporters/index.d.ts +1 -1
  31. package/dist/exporters/index.js +46 -46
  32. package/dist/features/agents.js +4 -4
  33. package/dist/features/commands.js +4 -4
  34. package/dist/features/hooks.js +4 -4
  35. package/dist/features/index.d.ts +8 -8
  36. package/dist/features/index.js +350 -350
  37. package/dist/features/mcp.js +4 -4
  38. package/dist/features/models.js +4 -4
  39. package/dist/features/plugins.js +5 -5
  40. package/dist/features/rules.js +4 -4
  41. package/dist/features/skills.js +5 -5
  42. package/dist/importers/claude-code.js +6 -6
  43. package/dist/importers/cursor.js +7 -7
  44. package/dist/importers/opencode.js +7 -7
  45. package/dist/importers/rulesync.js +7 -7
  46. package/dist/index.js +2674 -2674
  47. package/dist/node/api.js +2706 -2706
  48. package/dist/node/cli/export-cmd.js +364 -364
  49. package/dist/node/cli/generate.js +1409 -1409
  50. package/dist/node/cli/import-cmd.js +249 -249
  51. package/dist/node/cli/info.js +31 -31
  52. package/dist/node/cli/init.js +6 -6
  53. package/dist/node/cli/install.js +141 -141
  54. package/dist/node/cli/login.js +31 -31
  55. package/dist/node/cli/models-explain.js +514 -514
  56. package/dist/node/cli/pack/create.js +6 -6
  57. package/dist/node/cli/pack/enable.js +2 -2
  58. package/dist/node/cli/pack/list.js +362 -362
  59. package/dist/node/cli/pack/validate.js +119 -119
  60. package/dist/node/cli/publish.js +42 -42
  61. package/dist/node/cli/search.js +31 -31
  62. package/dist/node/core/config.js +3 -3
  63. package/dist/node/core/feature-merger.js +4 -4
  64. package/dist/node/core/index.js +633 -633
  65. package/dist/node/core/lockfile.js +1 -1
  66. package/dist/node/core/metarepo.js +3 -3
  67. package/dist/node/core/pack-loader.js +362 -362
  68. package/dist/node/exporters/cursor-plugin.js +46 -46
  69. package/dist/node/exporters/index.js +46 -46
  70. package/dist/node/features/agents.js +4 -4
  71. package/dist/node/features/commands.js +4 -4
  72. package/dist/node/features/hooks.js +4 -4
  73. package/dist/node/features/index.js +350 -350
  74. package/dist/node/features/mcp.js +4 -4
  75. package/dist/node/features/models.js +4 -4
  76. package/dist/node/features/plugins.js +5 -5
  77. package/dist/node/features/rules.js +4 -4
  78. package/dist/node/features/skills.js +5 -5
  79. package/dist/node/importers/claude-code.js +6 -6
  80. package/dist/node/importers/cursor.js +7 -7
  81. package/dist/node/importers/opencode.js +7 -7
  82. package/dist/node/importers/rulesync.js +7 -7
  83. package/dist/node/index.js +2674 -2674
  84. package/dist/node/sources/git.js +2 -2
  85. package/dist/node/sources/index.js +138 -138
  86. package/dist/node/sources/local.js +1 -1
  87. package/dist/node/sources/npm.js +3 -3
  88. package/dist/node/sources/registry.js +35 -35
  89. package/dist/node/targets/additional-targets.js +43 -43
  90. package/dist/node/targets/agents-md.js +4 -4
  91. package/dist/node/targets/claude-code.js +86 -86
  92. package/dist/node/targets/codex-cli.js +6 -6
  93. package/dist/node/targets/copilot.js +46 -46
  94. package/dist/node/targets/cursor.js +68 -68
  95. package/dist/node/targets/gemini-cli.js +25 -25
  96. package/dist/node/targets/generic-md-target.js +43 -43
  97. package/dist/node/targets/index.js +911 -911
  98. package/dist/node/targets/mistral-vibe.js +46 -46
  99. package/dist/node/targets/opencode.js +68 -68
  100. package/dist/node/targets/registry.js +911 -911
  101. package/dist/node/utils/credentials.js +2 -2
  102. package/dist/node/utils/filesystem.js +4 -4
  103. package/dist/node/utils/global.js +1 -1
  104. package/dist/node/utils/tarball.js +2 -2
  105. package/dist/sources/git.js +2 -2
  106. package/dist/sources/index.d.ts +6 -6
  107. package/dist/sources/index.js +138 -138
  108. package/dist/sources/local.js +1 -1
  109. package/dist/sources/npm.d.ts +3 -0
  110. package/dist/sources/npm.js +3 -3
  111. package/dist/sources/registry.js +35 -35
  112. package/dist/targets/additional-targets.js +43 -43
  113. package/dist/targets/agents-md.js +4 -4
  114. package/dist/targets/claude-code.js +86 -86
  115. package/dist/targets/codex-cli.js +6 -6
  116. package/dist/targets/copilot.js +46 -46
  117. package/dist/targets/cursor.js +68 -68
  118. package/dist/targets/gemini-cli.js +25 -25
  119. package/dist/targets/generic-md-target.js +43 -43
  120. package/dist/targets/index.d.ts +6 -6
  121. package/dist/targets/index.js +911 -911
  122. package/dist/targets/mistral-vibe.js +46 -46
  123. package/dist/targets/opencode.js +68 -68
  124. package/dist/targets/registry.js +911 -911
  125. package/dist/utils/credentials.js +2 -2
  126. package/dist/utils/filesystem.js +4 -4
  127. package/dist/utils/global.d.ts +3 -0
  128. package/dist/utils/global.js +1 -1
  129. package/dist/utils/tarball.js +2 -2
  130. package/package.json +5 -5
  131. package/templates/pack/models.json +36 -36
  132. package/templates/pack/pack.json +8 -8
  133. 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, relative, join } from "path";
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/rules.ts
132
+ // src/features/agents.ts
133
133
  import { readFileSync as readFileSync2 } from "fs";
134
134
  import { basename } from "path";
135
- function parseRules(rulesDir, packName) {
136
- const files = listFiles(rulesDir, { extension: ".md" });
137
- return files.map((filepath) => parseRuleFile(filepath, packName));
135
+ function parseAgents(agentsDir, packName) {
136
+ const files = listFiles(agentsDir, { extension: ".md" });
137
+ return files.map((filepath) => parseAgentFile(filepath, packName));
138
138
  }
139
- function parseRuleFile(filepath, packName) {
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 ruleMatchesTarget(rule, targetId) {
151
- const { targets } = rule.meta;
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/agents.ts
186
+ // src/features/rules.ts
193
187
  import { readFileSync as readFileSync4 } from "fs";
194
188
  import { basename as basename3 } from "path";
195
- function parseAgents(agentsDir, packName) {
196
- const files = listFiles(agentsDir, { extension: ".md" });
197
- return files.map((filepath) => parseAgentFile(filepath, packName));
189
+ function parseRules(rulesDir, packName) {
190
+ const files = listFiles(rulesDir, { extension: ".md" });
191
+ return files.map((filepath) => parseRuleFile(filepath, packName));
198
192
  }
199
- function parseAgentFile(filepath, packName) {
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: data.name ?? basename3(filepath, ".md"),
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 agentMatchesTarget(agent, targetId) {
211
- const { targets } = agent.meta;
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 { readFileSync as readFileSync5, existsSync as existsSync2 } from "fs";
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/mistral-vibe.ts
505
- import { resolve, join as join3 } from "path";
505
+ import { join as join3, resolve } from "path";
506
506
  var TARGET_ID = "mistralvibe";
507
507
 
508
508
  class MistralVibeTarget 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, relative, join } from "path";
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/rules.ts
132
+ // src/features/agents.ts
133
133
  import { readFileSync as readFileSync2 } from "fs";
134
134
  import { basename } from "path";
135
- function parseRules(rulesDir, packName) {
136
- const files = listFiles(rulesDir, { extension: ".md" });
137
- return files.map((filepath) => parseRuleFile(filepath, packName));
135
+ function parseAgents(agentsDir, packName) {
136
+ const files = listFiles(agentsDir, { extension: ".md" });
137
+ return files.map((filepath) => parseAgentFile(filepath, packName));
138
138
  }
139
- function parseRuleFile(filepath, packName) {
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 ruleMatchesTarget(rule, targetId) {
151
- const { targets } = rule.meta;
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/agents.ts
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 parseAgents(agentsDir, packName) {
196
- const files = listFiles(agentsDir, { extension: ".md" });
197
- return files.map((filepath) => parseAgentFile(filepath, packName));
227
+ function parseRules(rulesDir, packName) {
228
+ const files = listFiles(rulesDir, { extension: ".md" });
229
+ return files.map((filepath) => parseRuleFile(filepath, packName));
198
230
  }
199
- function parseAgentFile(filepath, packName) {
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: data.name ?? basename3(filepath, ".md"),
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 agentMatchesTarget(agent, targetId) {
211
- const { targets } = agent.meta;
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 { readFileSync as readFileSync5, existsSync as existsSync2 } from "fs";
221
- import { basename as basename4, join as join2 } from "path";
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 = join2(dir, "SKILL.md");
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;
@@ -492,7 +492,7 @@ ${content}`;
492
492
  }
493
493
 
494
494
  // src/targets/opencode.ts
495
- import { resolve, join as join4 } from "path";
495
+ import { join as join4, resolve } from "path";
496
496
  var TARGET_ID = "opencode";
497
497
 
498
498
  class OpenCodeTarget extends BaseTarget {