@ethlete/agent-rules 0.1.0-next.3 → 0.1.0-next.30

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 (200) hide show
  1. package/AGENTS.md +28 -0
  2. package/CHANGELOG.md +463 -0
  3. package/CLAUDE.md +1 -0
  4. package/README.md +362 -29
  5. package/THIRD-PARTY-LICENSES.md +35 -0
  6. package/content/defaults.json +1 -1
  7. package/content/git-hooks/post-checkout.sh +10 -0
  8. package/content/git-hooks/pre-push.sh +5 -0
  9. package/content/hooks/context-warning.py +871 -110
  10. package/content/hooks/subagent-model-policy.py +194 -0
  11. package/content/mods/.claude-plugin/marketplace.json +11 -0
  12. package/content/mods/plugins/e2e-progress/.claude-plugin/plugin.json +6 -0
  13. package/content/mods/plugins/e2e-progress/hooks/hooks.json +1 -0
  14. package/content/mods/plugins/e2e-progress/hooks/register.tsx +442 -0
  15. package/content/mods/plugins/e2e-progress/tsconfig.json +3 -0
  16. package/content/mods/plugins/e2e-progress/types/index.d.ts +23 -0
  17. package/content/output-styles/ste-clarity.md +131 -0
  18. package/content/rules/agent-sessions-wake-up.md +11 -0
  19. package/content/rules/app-styling.md +66 -0
  20. package/content/rules/comments.md +4 -1
  21. package/content/rules/lint-and-format.md +7 -5
  22. package/content/rules/nx-layout.md +50 -0
  23. package/content/rules/reactive-state.md +1 -1
  24. package/content/rules/styling.md +9 -7
  25. package/content/rules/subagent-models.md +39 -0
  26. package/content/skills/agent-sessions/SKILL.md +81 -0
  27. package/content/skills/agent-sessions/agent-sessions.mjs +492 -0
  28. package/content/skills/angular-patterns/SKILL.md +30 -7
  29. package/content/skills/api-source/SKILL.md +156 -0
  30. package/content/skills/app-testing/SKILL.md +141 -0
  31. package/content/skills/codex-subagent/SKILL.md +90 -0
  32. package/content/skills/codex-subagent/codex-agent.mjs +229 -0
  33. package/content/skills/design-exploration/SKILL.md +657 -0
  34. package/content/skills/design-exploration/check-story.mjs +139 -0
  35. package/content/skills/design-exploration/shoot-template.mjs +61 -0
  36. package/content/skills/domain-modeling/ADR-FORMAT.md +47 -0
  37. package/content/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
  38. package/content/skills/domain-modeling/SKILL.md +80 -0
  39. package/content/skills/e2e-triage/SKILL.md +80 -0
  40. package/content/skills/figma-export/SKILL.md +191 -0
  41. package/content/skills/figma-export/dump-figma-layers.py +83 -0
  42. package/content/skills/figma-export/dump-figma-svg.py +235 -0
  43. package/content/skills/figma-export/measure-template.mjs +87 -0
  44. package/content/skills/git-commit/SKILL.md +11 -7
  45. package/content/skills/git-flow/SKILL.md +87 -0
  46. package/content/skills/grill-with-docs/SKILL.md +13 -0
  47. package/content/skills/grilling/SKILL.md +51 -0
  48. package/content/skills/handoff/SKILL.md +125 -5
  49. package/content/skills/query/SKILL.md +165 -64
  50. package/content/skills/rxjs-signals/SKILL.md +33 -4
  51. package/content/skills/sdk-docs/SKILL.md +50 -14
  52. package/content/skills/sdk-local-build/SKILL.md +26 -8
  53. package/content/skills/sdk-local-build/sdk-local-baseline.mjs +64 -0
  54. package/content/skills/sdk-source/SKILL.md +37 -34
  55. package/content/skills/sdk-update/SKILL.md +103 -0
  56. package/content/skills/story-styling/SKILL.md +10 -8
  57. package/content/skills/styleguide/SKILL.md +12 -7
  58. package/content/skills/styleguide/assets.md +54 -0
  59. package/content/skills/styleguide/changesets.md +17 -0
  60. package/content/skills/styleguide/file-structure.md +73 -0
  61. package/content/skills/styleguide/lint-rule-lookup.md +51 -0
  62. package/content/skills/styleguide/storybook-structure.md +25 -0
  63. package/content/skills/theming/SKILL.md +50 -28
  64. package/content/skills/timetrack/SKILL.md +397 -0
  65. package/content/skills/verify-in-app/SKILL.md +107 -0
  66. package/migrations/app-styling-utilities.md +63 -0
  67. package/migrations/list-state-query-form.md +20 -0
  68. package/migrations/nx-layout.md +29 -0
  69. package/migrations/sdk-components-over-hand-built-ui.md +27 -0
  70. package/migrations/search-query-field.md +52 -0
  71. package/migrations.json +48 -0
  72. package/package.json +19 -3
  73. package/src/index.js +85 -30
  74. package/src/index.js.map +1 -1
  75. package/src/lib/cli-args.d.ts +9 -0
  76. package/src/lib/cli-args.js +48 -0
  77. package/src/lib/cli-args.js.map +1 -0
  78. package/src/lib/commitlint.d.ts +10 -0
  79. package/src/lib/commitlint.js +51 -0
  80. package/src/lib/commitlint.js.map +1 -0
  81. package/src/lib/config.d.ts +41 -5
  82. package/src/lib/config.js +117 -10
  83. package/src/lib/config.js.map +1 -1
  84. package/src/lib/filter.d.ts +2 -0
  85. package/src/lib/filter.js +4 -4
  86. package/src/lib/filter.js.map +1 -1
  87. package/src/lib/frontmatter.d.ts +2 -0
  88. package/src/lib/frontmatter.js +33 -5
  89. package/src/lib/frontmatter.js.map +1 -1
  90. package/src/lib/git-flow/build.d.ts +35 -0
  91. package/src/lib/git-flow/build.js +24 -0
  92. package/src/lib/git-flow/build.js.map +1 -0
  93. package/src/lib/git-flow/config.d.ts +59 -0
  94. package/src/lib/git-flow/config.js +50 -0
  95. package/src/lib/git-flow/config.js.map +1 -0
  96. package/src/lib/git-flow/index.d.ts +6 -0
  97. package/src/lib/git-flow/index.js +23 -0
  98. package/src/lib/git-flow/index.js.map +1 -0
  99. package/src/lib/git-flow/parse.d.ts +49 -0
  100. package/src/lib/git-flow/parse.js +300 -0
  101. package/src/lib/git-flow/parse.js.map +1 -0
  102. package/src/lib/git-flow/rename.d.ts +24 -0
  103. package/src/lib/git-flow/rename.js +70 -0
  104. package/src/lib/git-flow/rename.js.map +1 -0
  105. package/src/lib/git-flow/start.d.ts +49 -0
  106. package/src/lib/git-flow/start.js +57 -0
  107. package/src/lib/git-flow/start.js.map +1 -0
  108. package/src/lib/git-flow/validate.d.ts +34 -0
  109. package/src/lib/git-flow/validate.js +72 -0
  110. package/src/lib/git-flow/validate.js.map +1 -0
  111. package/src/lib/git-flow-command.d.ts +4 -0
  112. package/src/lib/git-flow-command.js +165 -0
  113. package/src/lib/git-flow-command.js.map +1 -0
  114. package/src/lib/git-flow-repair.d.ts +17 -0
  115. package/src/lib/git-flow-repair.js +165 -0
  116. package/src/lib/git-flow-repair.js.map +1 -0
  117. package/src/lib/git-flow-start.d.ts +20 -0
  118. package/src/lib/git-flow-start.js +140 -0
  119. package/src/lib/git-flow-start.js.map +1 -0
  120. package/src/lib/git.d.ts +64 -0
  121. package/src/lib/git.js +131 -0
  122. package/src/lib/git.js.map +1 -0
  123. package/src/lib/gitlab.d.ts +35 -0
  124. package/src/lib/gitlab.js +116 -0
  125. package/src/lib/gitlab.js.map +1 -0
  126. package/src/lib/index.d.ts +2 -0
  127. package/src/lib/index.js +26 -11
  128. package/src/lib/index.js.map +1 -1
  129. package/src/lib/migrate.js +6 -1
  130. package/src/lib/migrate.js.map +1 -1
  131. package/src/lib/output-style-command.d.ts +3 -0
  132. package/src/lib/output-style-command.js +69 -0
  133. package/src/lib/output-style-command.js.map +1 -0
  134. package/src/lib/output-style.d.ts +38 -0
  135. package/src/lib/output-style.js +134 -0
  136. package/src/lib/output-style.js.map +1 -0
  137. package/src/lib/owned-paths.js +27 -3
  138. package/src/lib/owned-paths.js.map +1 -1
  139. package/src/lib/package-runner.d.ts +4 -0
  140. package/src/lib/package-runner.js +86 -0
  141. package/src/lib/package-runner.js.map +1 -0
  142. package/src/lib/plain-text.d.ts +9 -0
  143. package/src/lib/plain-text.js +22 -0
  144. package/src/lib/plain-text.js.map +1 -0
  145. package/src/lib/plan.d.ts +6 -6
  146. package/src/lib/plan.js +164 -40
  147. package/src/lib/plan.js.map +1 -1
  148. package/src/lib/prompt.d.ts +8 -0
  149. package/src/lib/prompt.js +35 -0
  150. package/src/lib/prompt.js.map +1 -0
  151. package/src/lib/render.d.ts +25 -2
  152. package/src/lib/render.js +43 -10
  153. package/src/lib/render.js.map +1 -1
  154. package/src/lib/sessions-command.d.ts +4 -0
  155. package/src/lib/sessions-command.js +16 -0
  156. package/src/lib/sessions-command.js.map +1 -0
  157. package/src/lib/sync.d.ts +0 -1
  158. package/src/lib/sync.js +30 -17
  159. package/src/lib/sync.js.map +1 -1
  160. package/src/lib/targets/agents-skills.js +1 -1
  161. package/src/lib/targets/agents-skills.js.map +1 -1
  162. package/src/lib/targets/claude-hooks.d.ts +3 -23
  163. package/src/lib/targets/claude-hooks.js +22 -86
  164. package/src/lib/targets/claude-hooks.js.map +1 -1
  165. package/src/lib/targets/claude-mods.d.ts +20 -0
  166. package/src/lib/targets/claude-mods.js +47 -0
  167. package/src/lib/targets/claude-mods.js.map +1 -0
  168. package/src/lib/targets/claude.js +2 -3
  169. package/src/lib/targets/claude.js.map +1 -1
  170. package/src/lib/targets/codex-hooks.d.ts +12 -0
  171. package/src/lib/targets/codex-hooks.js +35 -0
  172. package/src/lib/targets/codex-hooks.js.map +1 -0
  173. package/src/lib/targets/codex.js +4 -4
  174. package/src/lib/targets/codex.js.map +1 -1
  175. package/src/lib/targets/copilot.js +4 -4
  176. package/src/lib/targets/copilot.js.map +1 -1
  177. package/src/lib/targets/cursor.js +3 -3
  178. package/src/lib/targets/cursor.js.map +1 -1
  179. package/src/lib/targets/git-hooks.d.ts +25 -0
  180. package/src/lib/targets/git-hooks.js +71 -0
  181. package/src/lib/targets/git-hooks.js.map +1 -0
  182. package/src/lib/targets/hooks-shared.d.ts +60 -0
  183. package/src/lib/targets/hooks-shared.js +130 -0
  184. package/src/lib/targets/hooks-shared.js.map +1 -0
  185. package/src/lib/targets/mcp.d.ts +16 -0
  186. package/src/lib/targets/mcp.js +68 -0
  187. package/src/lib/targets/mcp.js.map +1 -0
  188. package/src/lib/targets/shared.d.ts +1 -9
  189. package/src/lib/targets/shared.js +4 -8
  190. package/src/lib/targets/shared.js.map +1 -1
  191. package/src/lib/timetrack-command.d.ts +11 -0
  192. package/src/lib/timetrack-command.js +1063 -0
  193. package/src/lib/timetrack-command.js.map +1 -0
  194. package/src/lib/timetrack-snapshot.d.ts +55 -0
  195. package/src/lib/timetrack-snapshot.js +120 -0
  196. package/src/lib/timetrack-snapshot.js.map +1 -0
  197. package/src/lib/timetrack.d.ts +561 -0
  198. package/src/lib/timetrack.js +279 -0
  199. package/src/lib/timetrack.js.map +1 -0
  200. package/content/skills/styleguide/STYLEGUIDE.md +0 -520
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/sync.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ const emitAgentsSkills = (context) => context.skills.flatMap((item) => (0, share
12
12
  item,
13
13
  context,
14
14
  dir: (0, shared_1.agentsSkillDir)(item.frontmatter.name),
15
- links: (0, shared_1.agentsSkillsLinks)(context),
15
+ links: (0, shared_1.agentsSkillsLinks)(),
16
16
  }));
17
17
  exports.emitAgentsSkills = emitAgentsSkills;
18
18
  //# sourceMappingURL=agents-skills.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents-skills.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/agents-skills.ts"],"names":[],"mappings":";;;AAAA,qCAAoG;AAEpG;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,OAAoB,EAAiB,EAAE,CACtE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9B,IAAA,oBAAW,EAAC;IACV,IAAI;IACJ,OAAO;IACP,GAAG,EAAE,IAAA,uBAAc,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC1C,KAAK,EAAE,IAAA,0BAAiB,EAAC,OAAO,CAAC;CAClC,CAAC,CACH,CAAC;AARS,QAAA,gBAAgB,oBAQzB"}
1
+ {"version":3,"file":"agents-skills.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/agents-skills.ts"],"names":[],"mappings":";;;AAAA,qCAAoG;AAEpG;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,OAAoB,EAAiB,EAAE,CACtE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9B,IAAA,oBAAW,EAAC;IACV,IAAI;IACJ,OAAO;IACP,GAAG,EAAE,IAAA,uBAAc,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC1C,KAAK,EAAE,IAAA,0BAAiB,GAAE;CAC3B,CAAC,CACH,CAAC;AARS,QAAA,gBAAgB,oBAQzB"}
@@ -1,33 +1,13 @@
1
1
  import { EmitContext, EmittedFile } from './shared';
2
2
  export declare const CLAUDE_SETTINGS_FILE = ".claude/settings.json";
3
- type HookDefinition = {
4
- event: string;
5
- file: string;
6
- timeout: number;
7
- };
8
- /**
9
- * Hooks a repo can opt into via the config's `hooks` array. Hooks run arbitrary commands on the
10
- * developer's machine, so unlike rules and skills they are never emitted by default.
11
- */
12
- export declare const CLAUDE_HOOKS: Record<string, HookDefinition>;
13
- export declare const assertKnownHooks: (hooks: string[]) => void;
14
- /**
15
- * Rewrites the generated entries in `.claude/settings.json` declaratively: every entry pointing
16
- * into `.claude/hooks/ethlete/` is dropped and the currently enabled hooks are re-added, so
17
- * disabling a hook in the config also unregisters it. Everything else in the file is untouched.
18
- */
19
- export declare const mergeClaudeSettings: (options: {
20
- existing: string;
21
- hooks: string[];
22
- }) => string;
23
3
  /**
24
4
  * The hook scripts plus the settings registration. Runs even when the claude target is off so a
25
- * repo that drops the target also gets its stale registrations removed — the settings file is
26
- * only planned when its parsed content actually changes, and an unparseable file is left alone.
5
+ * repo that drops the target also gets its stale registrations removed.
27
6
  */
28
7
  export declare const emitClaudeHooks: (options: {
29
8
  context: EmitContext;
30
9
  claudeTarget: boolean;
31
10
  existingSettings: string;
11
+ mods: string[];
12
+ sdkProfile: boolean;
32
13
  }) => EmittedFile[];
33
- export {};
@@ -1,97 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.emitClaudeHooks = exports.mergeClaudeSettings = exports.assertKnownHooks = exports.CLAUDE_HOOKS = exports.CLAUDE_SETTINGS_FILE = void 0;
4
- const fs_1 = require("fs");
5
- const path_1 = require("path");
6
- const load_content_1 = require("../load-content");
3
+ exports.emitClaudeHooks = exports.CLAUDE_SETTINGS_FILE = void 0;
4
+ const render_1 = require("../render");
5
+ const claude_mods_1 = require("./claude-mods");
6
+ const hooks_shared_1 = require("./hooks-shared");
7
7
  exports.CLAUDE_SETTINGS_FILE = '.claude/settings.json';
8
8
  const HOOKS_DIR = '.claude/hooks/ethlete';
9
- /**
10
- * Hooks a repo can opt into via the config's `hooks` array. Hooks run arbitrary commands on the
11
- * developer's machine, so unlike rules and skills they are never emitted by default.
12
- */
13
- exports.CLAUDE_HOOKS = {
14
- 'context-warning': { event: 'UserPromptSubmit', file: 'context-warning.py', timeout: 10 },
15
- };
16
- const assertKnownHooks = (hooks) => {
17
- const unknown = hooks.filter((name) => !(name in exports.CLAUDE_HOOKS));
18
- if (unknown.length > 0) {
19
- throw new Error(`Unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(exports.CLAUDE_HOOKS).join(', ')}.`);
20
- }
21
- };
22
- exports.assertKnownHooks = assertKnownHooks;
23
- const commandFor = (file) => `python3 "$CLAUDE_PROJECT_DIR/${HOOKS_DIR}/${file}"`;
24
- /** `#` comment instead of the HTML banner, placed after the shebang so the file stays runnable. */
25
- const withBanner = (raw, version) => {
26
- var _a;
27
- const banner = `# Generated by @ethlete/agent-rules v${version} — DO NOT EDIT. Run \`npx ethlete-agents sync\`.`;
28
- const lines = raw.split('\n');
29
- if ((_a = lines[0]) === null || _a === void 0 ? void 0 : _a.startsWith('#!'))
30
- return [lines[0], banner, ...lines.slice(1)].join('\n');
31
- return `${banner}\n${raw}`;
32
- };
33
- const isGenerated = (hook) => { var _a; return ((_a = hook.command) !== null && _a !== void 0 ? _a : '').includes(HOOKS_DIR); };
34
- /**
35
- * Rewrites the generated entries in `.claude/settings.json` declaratively: every entry pointing
36
- * into `.claude/hooks/ethlete/` is dropped and the currently enabled hooks are re-added, so
37
- * disabling a hook in the config also unregisters it. Everything else in the file is untouched.
38
- */
39
- const mergeClaudeSettings = (options) => {
40
- var _a, _b;
41
- const { existing, hooks } = options;
42
- const settings = JSON.parse(existing.trim() || '{}');
43
- const events = Object.assign({}, ((_a = settings.hooks) !== null && _a !== void 0 ? _a : {}));
44
- for (const [event, groups] of Object.entries(events)) {
45
- const kept = groups
46
- .map((group) => { var _a; return (Object.assign(Object.assign({}, group), { hooks: ((_a = group.hooks) !== null && _a !== void 0 ? _a : []).filter((hook) => !isGenerated(hook)) })); })
47
- .filter((group) => group.hooks.length > 0);
48
- if (kept.length > 0)
49
- events[event] = kept;
50
- else
51
- delete events[event];
52
- }
53
- for (const name of hooks) {
54
- const definition = exports.CLAUDE_HOOKS[name];
55
- if (!definition)
56
- continue;
57
- events[definition.event] = [
58
- ...((_b = events[definition.event]) !== null && _b !== void 0 ? _b : []),
59
- { hooks: [{ type: 'command', command: commandFor(definition.file), timeout: definition.timeout }] },
60
- ];
61
- }
62
- if (Object.keys(events).length > 0)
63
- settings.hooks = events;
64
- else
65
- delete settings.hooks;
66
- return `${JSON.stringify(settings, null, 2)}\n`;
67
- };
68
- exports.mergeClaudeSettings = mergeClaudeSettings;
9
+ const commandFor = (file) => `python3 "$CLAUDE_PROJECT_DIR/${HOOKS_DIR}/${file}" --agent claude`;
69
10
  /**
70
11
  * The hook scripts plus the settings registration. Runs even when the claude target is off so a
71
- * repo that drops the target also gets its stale registrations removed — the settings file is
72
- * only planned when its parsed content actually changes, and an unparseable file is left alone.
12
+ * repo that drops the target also gets its stale registrations removed.
73
13
  */
74
14
  const emitClaudeHooks = (options) => {
75
- const { context, claudeTarget, existingSettings } = options;
76
- const hooks = claudeTarget ? context.hooks : [];
77
- const files = [];
78
- for (const name of hooks) {
79
- const definition = exports.CLAUDE_HOOKS[name];
80
- if (!definition)
81
- continue;
82
- const raw = (0, fs_1.readFileSync)((0, path_1.join)((0, load_content_1.resolveContentRoot)(), 'hooks', definition.file), 'utf8');
83
- files.push({ path: `${HOOKS_DIR}/${definition.file}`, contents: withBanner(raw, context.version) });
84
- }
85
- try {
86
- const merged = (0, exports.mergeClaudeSettings)({ existing: existingSettings, hooks });
87
- if (JSON.stringify(JSON.parse(existingSettings.trim() || '{}')) !== JSON.stringify(JSON.parse(merged))) {
88
- files.push({ path: exports.CLAUDE_SETTINGS_FILE, contents: merged });
89
- }
90
- }
91
- catch (_a) {
92
- // Unparseable settings.json — never clobber a file the repo owns.
93
- }
94
- return files;
15
+ const { context, claudeTarget, existingSettings, sdkProfile } = options;
16
+ const hooks = claudeTarget ? (0, hooks_shared_1.hooksForAgent)({ hooks: context.hooks, agent: 'claude' }) : [];
17
+ const mods = claudeTarget ? options.mods : [];
18
+ return [
19
+ ...(0, hooks_shared_1.emitHookScripts)({ hooks, hooksDir: HOOKS_DIR, runner: (0, render_1.packageRunnerVar)(context.vars) }),
20
+ ...(0, hooks_shared_1.emitHookSettings)({
21
+ agent: 'claude',
22
+ path: exports.CLAUDE_SETTINGS_FILE,
23
+ existing: existingSettings,
24
+ hooks,
25
+ hooksDir: HOOKS_DIR,
26
+ commandFor,
27
+ createWhenEmpty: true,
28
+ mergeExtra: (merged) => (0, claude_mods_1.mergeModSettings)({ existing: merged, mods, marketplacePath: (0, claude_mods_1.modMarketplacePath)({ sdkProfile }) }),
29
+ }),
30
+ ];
95
31
  };
96
32
  exports.emitClaudeHooks = emitClaudeHooks;
97
33
  //# sourceMappingURL=claude-hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-hooks.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude-hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-hooks.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude-hooks.ts"],"names":[],"mappings":";;;AACA,sCAA6C;AAC7C,+CAAqE;AACrE,iDAAkF;AAErE,QAAA,oBAAoB,GAAG,uBAAuB,CAAC;AAE5D,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAE1C,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,gCAAgC,SAAS,IAAI,IAAI,kBAAkB,CAAC;AAEzG;;;GAGG;AACI,MAAM,eAAe,GAAG,CAAC,OAM/B,EAAiB,EAAE;IAClB,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACxE,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,IAAA,4BAAa,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9C,OAAO;QACL,GAAG,IAAA,8BAAe,EAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAA,yBAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,GAAG,IAAA,+BAAgB,EAAC;YAClB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,4BAAoB;YAC1B,QAAQ,EAAE,gBAAgB;YAC1B,KAAK;YACL,QAAQ,EAAE,SAAS;YACnB,UAAU;YACV,eAAe,EAAE,IAAI;YACrB,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CACrB,IAAA,8BAAgB,EAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAA,gCAAkB,EAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;SACpG,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AAzBW,QAAA,eAAe,mBAyB1B"}
@@ -0,0 +1,20 @@
1
+ export declare const MOD_MARKETPLACE = "ethlete";
2
+ /**
3
+ * Claude Code mods a repo can opt into via the config's `mods` array. A mod runs code in every
4
+ * Claude Code session of the repo, so like the hooks it is never enabled by default.
5
+ */
6
+ export declare const KNOWN_MODS: string[];
7
+ export declare const assertKnownMods: (mods: string[]) => void;
8
+ /** Relative to the repo root. The settings file is committed, and an absolute path breaks on other machines. */
9
+ export declare const modMarketplacePath: (options: {
10
+ sdkProfile: boolean;
11
+ }) => "./libs/agent-rules/content/mods" | "./node_modules/@ethlete/agent-rules/content/mods";
12
+ /**
13
+ * Owns the `ethlete` marketplace entry and every `<mod>@ethlete` plugin entry: they are dropped and
14
+ * the configured mods re-added, so removing a mod from the config also disables it.
15
+ */
16
+ export declare const mergeModSettings: (options: {
17
+ existing: string;
18
+ mods: string[];
19
+ marketplacePath: string;
20
+ }) => string;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeModSettings = exports.modMarketplacePath = exports.assertKnownMods = exports.KNOWN_MODS = exports.MOD_MARKETPLACE = void 0;
4
+ exports.MOD_MARKETPLACE = 'ethlete';
5
+ /**
6
+ * Claude Code mods a repo can opt into via the config's `mods` array. A mod runs code in every
7
+ * Claude Code session of the repo, so like the hooks it is never enabled by default.
8
+ */
9
+ exports.KNOWN_MODS = ['e2e-progress'];
10
+ const assertKnownMods = (mods) => {
11
+ const unknown = mods.filter((name) => !exports.KNOWN_MODS.includes(name));
12
+ if (unknown.length > 0) {
13
+ throw new Error(`Unknown mod(s): ${unknown.join(', ')}. Known mods: ${exports.KNOWN_MODS.join(', ')}.`);
14
+ }
15
+ };
16
+ exports.assertKnownMods = assertKnownMods;
17
+ /** Relative to the repo root. The settings file is committed, and an absolute path breaks on other machines. */
18
+ const modMarketplacePath = (options) => options.sdkProfile ? './libs/agent-rules/content/mods' : './node_modules/@ethlete/agent-rules/content/mods';
19
+ exports.modMarketplacePath = modMarketplacePath;
20
+ /**
21
+ * Owns the `ethlete` marketplace entry and every `<mod>@ethlete` plugin entry: they are dropped and
22
+ * the configured mods re-added, so removing a mod from the config also disables it.
23
+ */
24
+ const mergeModSettings = (options) => {
25
+ var _a, _b;
26
+ const { existing, mods, marketplacePath } = options;
27
+ const settings = JSON.parse(existing.trim() || '{}');
28
+ const marketplaces = Object.assign({}, ((_a = settings.extraKnownMarketplaces) !== null && _a !== void 0 ? _a : {}));
29
+ const plugins = Object.fromEntries(Object.entries((_b = settings.enabledPlugins) !== null && _b !== void 0 ? _b : {}).filter(([id]) => !id.endsWith(`@${exports.MOD_MARKETPLACE}`)));
30
+ delete marketplaces[exports.MOD_MARKETPLACE];
31
+ if (mods.length > 0) {
32
+ marketplaces[exports.MOD_MARKETPLACE] = { source: { source: 'directory', path: marketplacePath } };
33
+ for (const mod of mods)
34
+ plugins[`${mod}@${exports.MOD_MARKETPLACE}`] = true;
35
+ }
36
+ if (Object.keys(marketplaces).length > 0)
37
+ settings.extraKnownMarketplaces = marketplaces;
38
+ else
39
+ delete settings.extraKnownMarketplaces;
40
+ if (Object.keys(plugins).length > 0)
41
+ settings.enabledPlugins = plugins;
42
+ else
43
+ delete settings.enabledPlugins;
44
+ return `${JSON.stringify(settings, null, 2)}\n`;
45
+ };
46
+ exports.mergeModSettings = mergeModSettings;
47
+ //# sourceMappingURL=claude-mods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-mods.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude-mods.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,SAAS,CAAC;AAEzC;;;GAGG;AACU,QAAA,UAAU,GAAG,CAAC,cAAc,CAAC,CAAC;AAEpC,MAAM,eAAe,GAAG,CAAC,IAAc,EAAE,EAAE;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,kBAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAElE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,kBAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClG,CAAC;AACH,CAAC,CAAC;AANW,QAAA,eAAe,mBAM1B;AAEF,gHAAgH;AACzG,MAAM,kBAAkB,GAAG,CAAC,OAAgC,EAAE,EAAE,CACrE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,kDAAkD,CAAC;AADjG,QAAA,kBAAkB,sBAC+E;AAO9G;;;GAGG;AACI,MAAM,gBAAgB,GAAG,CAAC,OAAsE,EAAE,EAAE;;IACzG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,CAAgB,CAAC;IACpE,MAAM,YAAY,qBAAQ,CAAC,MAAA,QAAQ,CAAC,sBAAsB,mCAAI,EAAE,CAAC,CAAE,CAAC;IACpE,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAChC,MAAM,CAAC,OAAO,CAAC,MAAA,QAAQ,CAAC,cAAc,mCAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,uBAAe,EAAE,CAAC,CAAC,CACpG,CAAC;IAEF,OAAO,YAAY,CAAC,uBAAe,CAAC,CAAC;IAErC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,YAAY,CAAC,uBAAe,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC;QAE3F,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,GAAG,IAAI,uBAAe,EAAE,CAAC,GAAG,IAAI,CAAC;IACtE,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,QAAQ,CAAC,sBAAsB,GAAG,YAAY,CAAC;;QACpF,OAAO,QAAQ,CAAC,sBAAsB,CAAC;IAE5C,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,QAAQ,CAAC,cAAc,GAAG,OAAO,CAAC;;QAClE,OAAO,QAAQ,CAAC,cAAc,CAAC;IAEpC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC,CAAC;AAvBW,QAAA,gBAAgB,oBAuB3B"}
@@ -13,9 +13,8 @@ const quoteList = (values) => values.map((value) => ` - '${value}'`).join('\n')
13
13
  * rules directory is skipped entirely rather than loading everything twice.
14
14
  */
15
15
  const emitClaude = (context) => {
16
- const banner = (0, render_1.buildBanner)(context.version);
16
+ const fileBanner = (0, render_1.banner)((0, render_1.packageRunnerVar)(context.vars));
17
17
  const links = (0, shared_1.makeLinks)({
18
- context,
19
18
  skill: (name) => `the **\`ethlete-${name}\`** skill`,
20
19
  resource: (target) => `\`${target.fileName}\` (bundled next to this skill)`,
21
20
  });
@@ -26,7 +25,7 @@ const emitClaude = (context) => {
26
25
  const frontmatter = paths.length > 0 ? `---\npaths:\n${quoteList(paths)}\n---` : '';
27
26
  files.push({
28
27
  path: `.claude/rules/ethlete/${name}.md`,
29
- contents: (0, shared_1.document)([frontmatter, banner, (0, shared_1.body)({ item, context, links })]),
28
+ contents: (0, shared_1.document)([frontmatter, fileBanner, (0, shared_1.body)({ item, context, links })]),
30
29
  });
31
30
  }
32
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude.ts"],"names":[],"mappings":";;;AAAA,sCAAwC;AACxC,qCAA4F;AAE5F,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,0BAA0B,IAAI,EAAE,CAAC;AAEpE,MAAM,SAAS,GAAG,CAAC,MAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE3F;;;;;;GAMG;AACI,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAiB,EAAE;IAChE,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAA,kBAAS,EAAC;QACtB,OAAO;QACP,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,IAAI,YAAY;QACpD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,iCAAiC;KAC5E,CAAC,CAAC;IACH,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAEpF,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,yBAAyB,IAAI,KAAK;gBACxC,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;aAC1E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AA1BW,QAAA,UAAU,cA0BrB"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude.ts"],"names":[],"mappings":";;;AAAA,sCAAqD;AACrD,qCAA4F;AAE5F,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,0BAA0B,IAAI,EAAE,CAAC;AAEpE,MAAM,SAAS,GAAG,CAAC,MAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE3F;;;;;;GAMG;AACI,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAiB,EAAE;IAChE,MAAM,UAAU,GAAG,IAAA,eAAM,EAAC,IAAA,yBAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAA,kBAAS,EAAC;QACtB,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,IAAI,YAAY;QACpD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,iCAAiC;KAC5E,CAAC,CAAC;IACH,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAEpF,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,yBAAyB,IAAI,KAAK;gBACxC,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,UAAU,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;aAC9E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAzBW,QAAA,UAAU,cAyBrB"}
@@ -0,0 +1,12 @@
1
+ import { EmitContext, EmittedFile } from './shared';
2
+ export declare const CODEX_HOOKS_FILE = ".codex/hooks.json";
3
+ /**
4
+ * The hook scripts plus the `.codex/hooks.json` registration. Runs even when the codex target is
5
+ * off so a repo that drops the target also gets its stale registrations removed — but an absent
6
+ * file stays absent rather than being created empty.
7
+ */
8
+ export declare const emitCodexHooks: (options: {
9
+ context: EmitContext;
10
+ codexTarget: boolean;
11
+ existingHooks: string;
12
+ }) => EmittedFile[];
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emitCodexHooks = exports.CODEX_HOOKS_FILE = void 0;
4
+ const render_1 = require("../render");
5
+ const hooks_shared_1 = require("./hooks-shared");
6
+ exports.CODEX_HOOKS_FILE = '.codex/hooks.json';
7
+ const HOOKS_DIR = '.codex/hooks/ethlete';
8
+ /**
9
+ * Codex exposes no project-dir variable, so the path is resolved the way Codex's own hook docs
10
+ * resolve it — the command string is evaluated by a shell.
11
+ */
12
+ const commandFor = (file) => `python3 "$(git rev-parse --show-toplevel)/${HOOKS_DIR}/${file}" --agent codex`;
13
+ /**
14
+ * The hook scripts plus the `.codex/hooks.json` registration. Runs even when the codex target is
15
+ * off so a repo that drops the target also gets its stale registrations removed — but an absent
16
+ * file stays absent rather than being created empty.
17
+ */
18
+ const emitCodexHooks = (options) => {
19
+ const { context, codexTarget, existingHooks } = options;
20
+ const hooks = codexTarget ? (0, hooks_shared_1.hooksForAgent)({ hooks: context.hooks, agent: 'codex' }) : [];
21
+ return [
22
+ ...(0, hooks_shared_1.emitHookScripts)({ hooks, hooksDir: HOOKS_DIR, runner: (0, render_1.packageRunnerVar)(context.vars) }),
23
+ ...(0, hooks_shared_1.emitHookSettings)({
24
+ agent: 'codex',
25
+ path: exports.CODEX_HOOKS_FILE,
26
+ existing: existingHooks,
27
+ hooks,
28
+ hooksDir: HOOKS_DIR,
29
+ commandFor,
30
+ createWhenEmpty: false,
31
+ }),
32
+ ];
33
+ };
34
+ exports.emitCodexHooks = emitCodexHooks;
35
+ //# sourceMappingURL=codex-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-hooks.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/codex-hooks.ts"],"names":[],"mappings":";;;AACA,sCAA6C;AAC7C,iDAAkF;AAErE,QAAA,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,MAAM,SAAS,GAAG,sBAAsB,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,6CAA6C,SAAS,IAAI,IAAI,iBAAiB,CAAC;AAErH;;;;GAIG;AACI,MAAM,cAAc,GAAG,CAAC,OAI9B,EAAiB,EAAE;IAClB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAA,4BAAa,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzF,OAAO;QACL,GAAG,IAAA,8BAAe,EAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAA,yBAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,GAAG,IAAA,+BAAgB,EAAC;YAClB,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,wBAAgB;YACtB,QAAQ,EAAE,aAAa;YACvB,KAAK;YACL,QAAQ,EAAE,SAAS;YACnB,UAAU;YACV,eAAe,EAAE,KAAK;SACvB,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AApBW,QAAA,cAAc,kBAoBzB"}
@@ -13,15 +13,15 @@ exports.CODEX_FILE = 'AGENTS.md';
13
13
  */
14
14
  const emitCodex = (options) => {
15
15
  const { context, existing } = options;
16
- const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links: (0, shared_1.agentsSkillsLinks)(context) }));
16
+ const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links: (0, shared_1.agentsSkillsLinks)() }));
17
17
  if (context.skills.length > 0) {
18
18
  sections.push([
19
19
  '## Ethlete skills',
20
- "On-demand guides live in `.agents/skills/ethlete-*/SKILL.md`; each one's frontmatter says when to read it. If your agent does not discover skills on its own, list that directory and read the matching guide before starting that kind of work — do not work from memory.",
20
+ "On-demand package guides live in `.agents/skills/ethlete-*/SKILL.md`; `ethlete-agents sync` owns and updates them. Third-party skills may be tracked separately in `skills-lock.json`, while repository-authored skills are maintained by the repository. Each skill's frontmatter says when to read it. If your agent does not discover skills on its own, list the directory and read the matching guide before starting that kind of work — do not work from memory.",
21
21
  ].join('\n\n'));
22
22
  }
23
- const block = (0, shared_1.document)([(0, render_1.buildBanner)(context.version), ...sections]).trimEnd();
24
- return [{ path: exports.CODEX_FILE, contents: (0, render_1.replaceMarkedBlock)({ existing, block }) }];
23
+ const block = (0, shared_1.document)([(0, render_1.banner)((0, render_1.packageRunnerVar)(context.vars)), ...sections]).trimEnd();
24
+ return [{ path: exports.CODEX_FILE, contents: (0, render_1.replaceMarkedBlock)({ existing, block, file: exports.CODEX_FILE }) }];
25
25
  };
26
26
  exports.emitCodex = emitCodex;
27
27
  //# sourceMappingURL=codex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/codex.ts"],"names":[],"mappings":";;;AAAA,sCAA4D;AAC5D,qCAAuF;AAE1E,QAAA,UAAU,GAAG,WAAW,CAAC;AAEtC;;;;;;GAMG;AACI,MAAM,SAAS,GAAG,CAAC,OAAmD,EAAiB,EAAE;IAC9F,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAA,0BAAiB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CACX;YACE,mBAAmB;YACnB,4QAA4Q;SAC7Q,CAAC,IAAI,CAAC,MAAM,CAAC,CACf,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,CAAC,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAE9E,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAU,EAAE,QAAQ,EAAE,IAAA,2BAAkB,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC,CAAC;AAhBW,QAAA,SAAS,aAgBpB"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/codex.ts"],"names":[],"mappings":";;;AAAA,sCAAyE;AACzE,qCAAuF;AAE1E,QAAA,UAAU,GAAG,WAAW,CAAC;AAEtC;;;;;;GAMG;AACI,MAAM,SAAS,GAAG,CAAC,OAAmD,EAAiB,EAAE;IAC9F,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAA,0BAAiB,GAAE,EAAE,CAAC,CAAC,CAAC;IAElG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CACX;YACE,mBAAmB;YACnB,ycAAyc;SAC1c,CAAC,IAAI,CAAC,MAAM,CAAC,CACf,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,CAAC,IAAA,eAAM,EAAC,IAAA,yBAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAExF,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAU,EAAE,QAAQ,EAAE,IAAA,2BAAkB,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AACrG,CAAC,CAAC;AAhBW,QAAA,SAAS,aAgBpB"}
@@ -11,10 +11,10 @@ exports.COPILOT_FILE = '.github/copilot-instructions.md';
11
11
  */
12
12
  const emitCopilot = (options) => {
13
13
  const { context, existing } = options;
14
- const banner = (0, render_1.buildBanner)(context.version);
15
- const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links: (0, shared_1.agentsSkillsLinks)(context) }));
16
- const block = (0, shared_1.document)([banner, ...sections]).trimEnd();
17
- return [{ path: exports.COPILOT_FILE, contents: (0, render_1.replaceMarkedBlock)({ existing, block }) }];
14
+ const fileBanner = (0, render_1.banner)((0, render_1.packageRunnerVar)(context.vars));
15
+ const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links: (0, shared_1.agentsSkillsLinks)() }));
16
+ const block = (0, shared_1.document)([fileBanner, ...sections]).trimEnd();
17
+ return [{ path: exports.COPILOT_FILE, contents: (0, render_1.replaceMarkedBlock)({ existing, block, file: exports.COPILOT_FILE }) }];
18
18
  };
19
19
  exports.emitCopilot = emitCopilot;
20
20
  //# sourceMappingURL=copilot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/copilot.ts"],"names":[],"mappings":";;;AAAA,sCAA4D;AAC5D,qCAAuF;AAE1E,QAAA,YAAY,GAAG,iCAAiC,CAAC;AAE9D;;;;GAIG;AACI,MAAM,WAAW,GAAG,CAAC,OAAmD,EAAiB,EAAE;IAChG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAA,0BAAiB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACzG,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAExD,OAAO,CAAC,EAAE,IAAI,EAAE,oBAAY,EAAE,QAAQ,EAAE,IAAA,2BAAkB,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC,CAAC;AAPW,QAAA,WAAW,eAOtB"}
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/copilot.ts"],"names":[],"mappings":";;;AAAA,sCAAyE;AACzE,qCAAuF;AAE1E,QAAA,YAAY,GAAG,iCAAiC,CAAC;AAE9D;;;;GAIG;AACI,MAAM,WAAW,GAAG,CAAC,OAAmD,EAAiB,EAAE;IAChG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,UAAU,GAAG,IAAA,eAAM,EAAC,IAAA,yBAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAA,0BAAiB,GAAE,EAAE,CAAC,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAE5D,OAAO,CAAC,EAAE,IAAI,EAAE,oBAAY,EAAE,QAAQ,EAAE,IAAA,2BAAkB,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAY,EAAE,CAAC,EAAE,CAAC,CAAC;AACzG,CAAC,CAAC;AAPW,QAAA,WAAW,eAOtB"}
@@ -9,8 +9,8 @@ const shared_1 = require("./shared");
9
9
  * agentskills.io-aware tool.
10
10
  */
11
11
  const emitCursor = (context) => {
12
- const banner = (0, render_1.buildBanner)(context.version);
13
- const links = (0, shared_1.agentsSkillsLinks)(context);
12
+ const fileBanner = (0, render_1.banner)((0, render_1.packageRunnerVar)(context.vars));
13
+ const links = (0, shared_1.agentsSkillsLinks)();
14
14
  return context.rules.map((item) => {
15
15
  const { name, paths } = item.frontmatter;
16
16
  const frontmatter = [
@@ -22,7 +22,7 @@ const emitCursor = (context) => {
22
22
  ].join('\n');
23
23
  return {
24
24
  path: `.cursor/rules/ethlete-${name}.mdc`,
25
- contents: (0, shared_1.document)([frontmatter, banner, (0, shared_1.body)({ item, context, links })]),
25
+ contents: (0, shared_1.document)([frontmatter, fileBanner, (0, shared_1.body)({ item, context, links })]),
26
26
  };
27
27
  });
28
28
  };
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/cursor.ts"],"names":[],"mappings":";;;AAAA,sCAAwC;AACxC,qCAAgH;AAEhH;;;;GAIG;AACI,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAiB,EAAE;IAChE,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;IAEzC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QACzC,MAAM,WAAW,GAAG;YAClB,KAAK;YACL,gBAAgB,IAAA,mBAAU,EAAC,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;YAC5D,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;YACzD,mBAAmB;YACnB,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO;YACL,IAAI,EAAE,yBAAyB,IAAI,MAAM;YACzC,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAnBW,QAAA,UAAU,cAmBrB"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/cursor.ts"],"names":[],"mappings":";;;AAAA,sCAAqD;AACrD,qCAAgH;AAEhH;;;;GAIG;AACI,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAiB,EAAE;IAChE,MAAM,UAAU,GAAG,IAAA,eAAM,EAAC,IAAA,yBAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAA,0BAAiB,GAAE,CAAC;IAElC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QACzC,MAAM,WAAW,GAAG;YAClB,KAAK;YACL,gBAAgB,IAAA,mBAAU,EAAC,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;YAC5D,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;YACzD,mBAAmB;YACnB,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO;YACL,IAAI,EAAE,yBAAyB,IAAI,MAAM;YACzC,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,UAAU,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAC9E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAnBW,QAAA,UAAU,cAmBrB"}
@@ -0,0 +1,25 @@
1
+ import { EmittedFile } from './shared';
2
+ export declare const HUSKY_DIR = ".husky";
3
+ export declare const START_MARKER = "# ethlete:git-flow:start";
4
+ export declare const END_MARKER = "# ethlete:git-flow:end";
5
+ /**
6
+ * Git hooks a repo can opt into via the config's `gitHooks` array. Like the agent hooks these never
7
+ * default: a generated block that can reject a developer's push is a higher-stakes artifact than a
8
+ * markdown one, so a repo asks for it.
9
+ */
10
+ export declare const KNOWN_GIT_HOOKS: Record<string, {
11
+ file: string;
12
+ }>;
13
+ export declare const assertKnownGitHooks: (hooks: string[]) => void;
14
+ export declare const huskyHookPath: (name: string) => string;
15
+ /**
16
+ * Appends the check to whatever the repo already has in `.husky/<name>`, between markers — those
17
+ * files routinely hold a git-lfs hook that must keep running and must keep reading stdin first,
18
+ * which is why the appended block never consumes it.
19
+ */
20
+ export declare const emitGitHooks: (options: {
21
+ gitHooks: string[];
22
+ huskyExists: boolean;
23
+ existing: Record<string, string>;
24
+ runner?: string;
25
+ }) => EmittedFile[];
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emitGitHooks = exports.huskyHookPath = exports.assertKnownGitHooks = exports.KNOWN_GIT_HOOKS = exports.END_MARKER = exports.START_MARKER = exports.HUSKY_DIR = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const load_content_1 = require("../load-content");
7
+ const render_1 = require("../render");
8
+ exports.HUSKY_DIR = '.husky';
9
+ exports.START_MARKER = '# ethlete:git-flow:start';
10
+ exports.END_MARKER = '# ethlete:git-flow:end';
11
+ /**
12
+ * Git hooks a repo can opt into via the config's `gitHooks` array. Like the agent hooks these never
13
+ * default: a generated block that can reject a developer's push is a higher-stakes artifact than a
14
+ * markdown one, so a repo asks for it.
15
+ */
16
+ exports.KNOWN_GIT_HOOKS = {
17
+ 'pre-push': { file: 'pre-push.sh' },
18
+ 'post-checkout': { file: 'post-checkout.sh' },
19
+ };
20
+ const assertKnownGitHooks = (hooks) => {
21
+ const unknown = hooks.filter((name) => !Object.prototype.hasOwnProperty.call(exports.KNOWN_GIT_HOOKS, name));
22
+ if (unknown.length > 0) {
23
+ throw new Error(`Unknown git hook(s): ${unknown.join(', ')}. Known git hooks: ${Object.keys(exports.KNOWN_GIT_HOOKS).join(', ')}.`);
24
+ }
25
+ };
26
+ exports.assertKnownGitHooks = assertKnownGitHooks;
27
+ const huskyHookPath = (name) => `${exports.HUSKY_DIR}/${name}`;
28
+ exports.huskyHookPath = huskyHookPath;
29
+ const SHEBANG = '#!/bin/sh\n';
30
+ const block = (options) => {
31
+ const { file, runner = 'npx' } = options;
32
+ const body = (0, fs_1.readFileSync)((0, path_1.join)((0, load_content_1.resolveContentRoot)(), 'git-hooks', file), 'utf8');
33
+ return [
34
+ `# Generated by @ethlete/agent-rules — DO NOT EDIT between the markers. Run \`${runner} ethlete-agents sync\`.`,
35
+ '# Set ETHLETE_GIT_FLOW_SKIP=1 to silence it on this machine.',
36
+ body.trimEnd(),
37
+ ].join('\n');
38
+ };
39
+ /**
40
+ * Appends the check to whatever the repo already has in `.husky/<name>`, between markers — those
41
+ * files routinely hold a git-lfs hook that must keep running and must keep reading stdin first,
42
+ * which is why the appended block never consumes it.
43
+ */
44
+ const emitGitHooks = (options) => {
45
+ const { gitHooks, huskyExists, existing, runner } = options;
46
+ if (!huskyExists)
47
+ return [];
48
+ return Object.entries(exports.KNOWN_GIT_HOOKS).flatMap(([name, definition]) => {
49
+ var _a;
50
+ const path = (0, exports.huskyHookPath)(name);
51
+ const current = (_a = existing[name]) !== null && _a !== void 0 ? _a : '';
52
+ if (!gitHooks.includes(name)) {
53
+ const stripped = (0, render_1.removeMarkedBlock)({ existing: current, startMarker: exports.START_MARKER, endMarker: exports.END_MARKER });
54
+ return stripped === current ? [] : [{ path, contents: stripped.trim().length > 0 ? stripped : SHEBANG }];
55
+ }
56
+ return [
57
+ {
58
+ path,
59
+ contents: (0, render_1.replaceMarkedBlock)({
60
+ existing: current.trim().length > 0 ? current : SHEBANG,
61
+ block: block({ file: definition.file, runner }),
62
+ file: path,
63
+ startMarker: exports.START_MARKER,
64
+ endMarker: exports.END_MARKER,
65
+ }),
66
+ },
67
+ ];
68
+ });
69
+ };
70
+ exports.emitGitHooks = emitGitHooks;
71
+ //# sourceMappingURL=git-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-hooks.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/git-hooks.ts"],"names":[],"mappings":"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"}