@ethlete/agent-rules 0.1.0-next.2 → 0.1.0-next.21
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/CHANGELOG.md +275 -0
- package/README.md +350 -29
- package/THIRD-PARTY-LICENSES.md +35 -0
- package/content/git-hooks/post-checkout.sh +10 -0
- package/content/git-hooks/pre-push.sh +5 -0
- package/content/hooks/context-warning.py +766 -108
- package/content/hooks/subagent-model-policy.py +193 -0
- package/content/output-styles/ste-clarity.md +131 -0
- package/content/rules/app-styling.md +59 -0
- package/content/rules/comments.md +53 -20
- package/content/rules/lint-and-format.md +6 -5
- package/content/rules/nx-layout.md +47 -0
- package/content/rules/reactive-state.md +1 -1
- package/content/rules/styling.md +9 -7
- package/content/rules/subagent-models.md +29 -0
- package/content/skills/angular-patterns/SKILL.md +30 -7
- package/content/skills/api-source/SKILL.md +130 -0
- package/content/skills/app-testing/SKILL.md +141 -0
- package/content/skills/codex-subagent/SKILL.md +90 -0
- package/content/skills/codex-subagent/codex-agent.mjs +229 -0
- package/content/skills/design-exploration/SKILL.md +205 -0
- package/content/skills/design-exploration/check-story.mjs +139 -0
- package/content/skills/design-exploration/shoot-template.mjs +61 -0
- package/content/skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/content/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/content/skills/domain-modeling/SKILL.md +80 -0
- package/content/skills/figma-export/SKILL.md +191 -0
- package/content/skills/figma-export/dump-figma-layers.py +83 -0
- package/content/skills/figma-export/dump-figma-svg.py +235 -0
- package/content/skills/figma-export/measure-template.mjs +87 -0
- package/content/skills/git-commit/SKILL.md +6 -7
- package/content/skills/git-flow/SKILL.md +87 -0
- package/content/skills/grill-with-docs/SKILL.md +13 -0
- package/content/skills/grilling/SKILL.md +34 -0
- package/content/skills/handoff/SKILL.md +74 -4
- package/content/skills/query/SKILL.md +165 -64
- package/content/skills/rxjs-signals/SKILL.md +31 -4
- package/content/skills/sdk-docs/SKILL.md +50 -14
- package/content/skills/sdk-local-build/SKILL.md +30 -10
- package/content/skills/sdk-local-build/sdk-local-baseline.mjs +64 -0
- package/content/skills/sdk-source/SKILL.md +49 -21
- package/content/skills/sdk-update/SKILL.md +96 -0
- package/content/skills/story-styling/SKILL.md +10 -8
- package/content/skills/styleguide/SKILL.md +12 -7
- package/content/skills/styleguide/assets.md +54 -0
- package/content/skills/styleguide/changesets.md +17 -0
- package/content/skills/styleguide/file-structure.md +73 -0
- package/content/skills/styleguide/lint-rule-lookup.md +51 -0
- package/content/skills/styleguide/storybook-structure.md +25 -0
- package/content/skills/theming/SKILL.md +41 -28
- package/content/skills/timetrack/SKILL.md +397 -0
- package/content/skills/verify-in-app/SKILL.md +107 -0
- package/migrations/app-styling-utilities.md +63 -0
- package/migrations/list-state-query-form.md +20 -0
- package/migrations/nx-layout.md +29 -0
- package/migrations/sdk-components-over-hand-built-ui.md +27 -0
- package/migrations/search-query-field.md +52 -0
- package/migrations.json +48 -0
- package/package.json +16 -2
- package/src/index.js +63 -28
- package/src/index.js.map +1 -1
- package/src/lib/cli-args.d.ts +9 -0
- package/src/lib/cli-args.js +48 -0
- package/src/lib/cli-args.js.map +1 -0
- package/src/lib/commitlint.d.ts +10 -0
- package/src/lib/commitlint.js +51 -0
- package/src/lib/commitlint.js.map +1 -0
- package/src/lib/config.d.ts +38 -4
- package/src/lib/config.js +84 -8
- package/src/lib/config.js.map +1 -1
- package/src/lib/filter.d.ts +2 -0
- package/src/lib/filter.js +4 -4
- package/src/lib/filter.js.map +1 -1
- package/src/lib/frontmatter.d.ts +2 -0
- package/src/lib/frontmatter.js +33 -5
- package/src/lib/frontmatter.js.map +1 -1
- package/src/lib/git-flow/build.d.ts +35 -0
- package/src/lib/git-flow/build.js +24 -0
- package/src/lib/git-flow/build.js.map +1 -0
- package/src/lib/git-flow/config.d.ts +59 -0
- package/src/lib/git-flow/config.js +50 -0
- package/src/lib/git-flow/config.js.map +1 -0
- package/src/lib/git-flow/index.d.ts +6 -0
- package/src/lib/git-flow/index.js +10 -0
- package/src/lib/git-flow/index.js.map +1 -0
- package/src/lib/git-flow/parse.d.ts +49 -0
- package/src/lib/git-flow/parse.js +300 -0
- package/src/lib/git-flow/parse.js.map +1 -0
- package/src/lib/git-flow/rename.d.ts +24 -0
- package/src/lib/git-flow/rename.js +70 -0
- package/src/lib/git-flow/rename.js.map +1 -0
- package/src/lib/git-flow/start.d.ts +49 -0
- package/src/lib/git-flow/start.js +57 -0
- package/src/lib/git-flow/start.js.map +1 -0
- package/src/lib/git-flow/validate.d.ts +34 -0
- package/src/lib/git-flow/validate.js +72 -0
- package/src/lib/git-flow/validate.js.map +1 -0
- package/src/lib/git-flow-command.d.ts +4 -0
- package/src/lib/git-flow-command.js +157 -0
- package/src/lib/git-flow-command.js.map +1 -0
- package/src/lib/git-flow-repair.d.ts +17 -0
- package/src/lib/git-flow-repair.js +157 -0
- package/src/lib/git-flow-repair.js.map +1 -0
- package/src/lib/git-flow-start.d.ts +20 -0
- package/src/lib/git-flow-start.js +132 -0
- package/src/lib/git-flow-start.js.map +1 -0
- package/src/lib/git.d.ts +64 -0
- package/src/lib/git.js +131 -0
- package/src/lib/git.js.map +1 -0
- package/src/lib/gitlab.d.ts +35 -0
- package/src/lib/gitlab.js +108 -0
- package/src/lib/gitlab.js.map +1 -0
- package/src/lib/index.d.ts +2 -0
- package/src/lib/index.js +2 -0
- package/src/lib/index.js.map +1 -1
- package/src/lib/migrate.js +1 -1
- package/src/lib/migrate.js.map +1 -1
- package/src/lib/output-style-command.d.ts +3 -0
- package/src/lib/output-style-command.js +69 -0
- package/src/lib/output-style-command.js.map +1 -0
- package/src/lib/output-style.d.ts +38 -0
- package/src/lib/output-style.js +134 -0
- package/src/lib/output-style.js.map +1 -0
- package/src/lib/owned-paths.js +27 -3
- package/src/lib/owned-paths.js.map +1 -1
- package/src/lib/package-runner.d.ts +3 -0
- package/src/lib/package-runner.js +69 -0
- package/src/lib/package-runner.js.map +1 -0
- package/src/lib/plain-text.d.ts +9 -0
- package/src/lib/plain-text.js +22 -0
- package/src/lib/plain-text.js.map +1 -0
- package/src/lib/plan.d.ts +6 -6
- package/src/lib/plan.js +147 -40
- package/src/lib/plan.js.map +1 -1
- package/src/lib/prompt.d.ts +8 -0
- package/src/lib/prompt.js +27 -0
- package/src/lib/prompt.js.map +1 -0
- package/src/lib/render.d.ts +24 -2
- package/src/lib/render.js +39 -10
- package/src/lib/render.js.map +1 -1
- package/src/lib/sync.d.ts +0 -1
- package/src/lib/sync.js +23 -15
- package/src/lib/sync.js.map +1 -1
- package/src/lib/targets/agents-skills.js +1 -1
- package/src/lib/targets/agents-skills.js.map +1 -1
- package/src/lib/targets/claude-hooks.d.ts +1 -23
- package/src/lib/targets/claude-hooks.js +17 -85
- package/src/lib/targets/claude-hooks.js.map +1 -1
- package/src/lib/targets/claude.js +1 -2
- package/src/lib/targets/claude.js.map +1 -1
- package/src/lib/targets/codex-hooks.d.ts +12 -0
- package/src/lib/targets/codex-hooks.js +34 -0
- package/src/lib/targets/codex-hooks.js.map +1 -0
- package/src/lib/targets/codex.js +4 -4
- package/src/lib/targets/codex.js.map +1 -1
- package/src/lib/targets/copilot.js +3 -3
- package/src/lib/targets/copilot.js.map +1 -1
- package/src/lib/targets/cursor.js +2 -2
- package/src/lib/targets/cursor.js.map +1 -1
- package/src/lib/targets/git-hooks.d.ts +24 -0
- package/src/lib/targets/git-hooks.js +71 -0
- package/src/lib/targets/git-hooks.js.map +1 -0
- package/src/lib/targets/hooks-shared.d.ts +58 -0
- package/src/lib/targets/hooks-shared.js +128 -0
- package/src/lib/targets/hooks-shared.js.map +1 -0
- package/src/lib/targets/shared.d.ts +1 -9
- package/src/lib/targets/shared.js +4 -8
- package/src/lib/targets/shared.js.map +1 -1
- package/src/lib/timetrack-command.d.ts +11 -0
- package/src/lib/timetrack-command.js +1055 -0
- package/src/lib/timetrack-command.js.map +1 -0
- package/src/lib/timetrack-snapshot.d.ts +55 -0
- package/src/lib/timetrack-snapshot.js +120 -0
- package/src/lib/timetrack-snapshot.js.map +1 -0
- package/src/lib/timetrack.d.ts +561 -0
- package/src/lib/timetrack.js +271 -0
- package/src/lib/timetrack.js.map +1 -0
- package/content/skills/styleguide/STYLEGUIDE.md +0 -520
package/src/lib/render.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.replaceMarkedBlock = exports.renderDescription = exports.substituteVars = exports.renderBody = exports.
|
|
3
|
+
exports.removeMarkedBlock = exports.replaceMarkedBlock = exports.renderDescription = exports.substituteVars = exports.renderBody = exports.SHELL_BANNER = exports.BANNER = exports.END_MARKER = exports.START_MARKER = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* `{% … %}`, not `{{ … }}`: content bodies routinely quote Angular templates, and an example
|
|
6
6
|
* containing `{{ count() }}` must not be mistaken for a template token.
|
|
@@ -8,8 +8,14 @@ exports.replaceMarkedBlock = exports.renderDescription = exports.substituteVars
|
|
|
8
8
|
const TOKEN_PATTERN = /\{%\s*([a-zA-Z0-9_:.-]+)\s*%\}/g;
|
|
9
9
|
exports.START_MARKER = '<!-- ethlete:agent-rules:start -->';
|
|
10
10
|
exports.END_MARKER = '<!-- ethlete:agent-rules:end -->';
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Never interpolate the package version here. `check` diffs whole file contents, so a version in
|
|
13
|
+
* the banner puts every generated file out of sync on a release bump that changed no content —
|
|
14
|
+
* turning each release into a repo-wide re-sync commit and a red CI in the meantime.
|
|
15
|
+
*/
|
|
16
|
+
exports.BANNER = '<!-- Generated by @ethlete/agent-rules — DO NOT EDIT. Run `npx ethlete-agents sync`. -->';
|
|
17
|
+
/** `#` comment form for generated scripts, which must stay runnable. See {@link BANNER}. */
|
|
18
|
+
exports.SHELL_BANNER = '# Generated by @ethlete/agent-rules — DO NOT EDIT. Run `npx ethlete-agents sync`.';
|
|
13
19
|
const renderValue = (value) => Array.isArray(value) ? value.map((entry) => `\`${entry}\``).join(', ') : value;
|
|
14
20
|
const renderBody = (options) => {
|
|
15
21
|
const { item, vars, links } = options;
|
|
@@ -56,18 +62,41 @@ const renderDescription = (options) => (0, exports.substituteVars)({
|
|
|
56
62
|
exports.renderDescription = renderDescription;
|
|
57
63
|
/**
|
|
58
64
|
* Rewrites the block between the markers, leaving everything a repo wrote around it untouched.
|
|
59
|
-
* A file without markers gets the block appended.
|
|
65
|
+
* A file without markers gets the block appended. Shell files pass their own `#` markers.
|
|
66
|
+
* Throws when only one marker is there, or the end marker comes first, rather than guess where the
|
|
67
|
+
* block ends and delete what the repo wrote.
|
|
60
68
|
*/
|
|
61
69
|
const replaceMarkedBlock = (options) => {
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
|
|
70
|
+
var _a, _b;
|
|
71
|
+
const { existing, block, file = 'The file' } = options;
|
|
72
|
+
const startMarker = (_a = options.startMarker) !== null && _a !== void 0 ? _a : exports.START_MARKER;
|
|
73
|
+
const endMarker = (_b = options.endMarker) !== null && _b !== void 0 ? _b : exports.END_MARKER;
|
|
74
|
+
const wrapped = `${startMarker}\n${block}\n${endMarker}`;
|
|
75
|
+
const start = existing.indexOf(startMarker);
|
|
76
|
+
const end = existing.indexOf(endMarker);
|
|
77
|
+
if (start === -1 && end === -1) {
|
|
67
78
|
const separator = existing.trim().length > 0 ? `${existing.trimEnd()}\n\n` : '';
|
|
68
79
|
return `${separator}${wrapped}\n`;
|
|
69
80
|
}
|
|
70
|
-
|
|
81
|
+
if (start === -1 || end === -1 || end < start) {
|
|
82
|
+
throw new Error(`${file} has an ethlete marker block with no matching end marker. Put "${startMarker}" and ` +
|
|
83
|
+
`"${endMarker}" back around the generated block, or remove both, then sync again.`);
|
|
84
|
+
}
|
|
85
|
+
return `${existing.slice(0, start)}${wrapped}${existing.slice(end + endMarker.length)}`;
|
|
71
86
|
};
|
|
72
87
|
exports.replaceMarkedBlock = replaceMarkedBlock;
|
|
88
|
+
/**
|
|
89
|
+
* Takes the block back out, so switching a generated block off in the config removes it instead of
|
|
90
|
+
* leaving it behind — `sync`'s file-level pruning cannot reach inside a file the repo also owns.
|
|
91
|
+
*/
|
|
92
|
+
const removeMarkedBlock = (options) => {
|
|
93
|
+
const { existing, startMarker, endMarker } = options;
|
|
94
|
+
const start = existing.indexOf(startMarker);
|
|
95
|
+
const end = existing.indexOf(endMarker);
|
|
96
|
+
if (start === -1 || end === -1 || end < start)
|
|
97
|
+
return existing;
|
|
98
|
+
const kept = `${existing.slice(0, start).trimEnd()}\n${existing.slice(end + endMarker.length).trimStart()}`;
|
|
99
|
+
return kept.trim().length > 0 ? kept : '';
|
|
100
|
+
};
|
|
101
|
+
exports.removeMarkedBlock = removeMarkedBlock;
|
|
73
102
|
//# sourceMappingURL=render.js.map
|
package/src/lib/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/render.ts"],"names":[],"mappings":";;;AAYA;;;GAGG;AACH,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAE3C,QAAA,YAAY,GAAG,oCAAoC,CAAC;AACpD,QAAA,UAAU,GAAG,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/render.ts"],"names":[],"mappings":"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"}
|
package/src/lib/sync.d.ts
CHANGED
package/src/lib/sync.js
CHANGED
|
@@ -37,20 +37,26 @@ const describe = (change) => {
|
|
|
37
37
|
const label = { write: 'create', update: 'update', delete: 'remove' }[change.action];
|
|
38
38
|
return ` ${label} ${change.path}`;
|
|
39
39
|
};
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const { files, skipped, danglingLinks, warnings } = (0, plan_1.buildPlan)({ config, version: options.version });
|
|
43
|
-
const changes = diffPlan({ root: options.root, files, owned: (0, owned_paths_1.collectOwnedPaths)(options.root) });
|
|
44
|
-
console.log(`Targets: ${config.targets.join(', ')}`);
|
|
45
|
-
for (const warning of warnings) {
|
|
40
|
+
const reportPlan = (plan) => {
|
|
41
|
+
for (const warning of plan.warnings) {
|
|
46
42
|
console.warn(` warn ${warning}`);
|
|
47
43
|
}
|
|
48
|
-
|
|
44
|
+
const outOfScope = plan.skipped.filter((entry) => entry.cause === 'scope');
|
|
45
|
+
const listed = plan.skipped.filter((entry) => entry.cause !== 'scope');
|
|
46
|
+
for (const entry of listed) {
|
|
49
47
|
console.log(` skip ${entry.name} — ${entry.reason}`);
|
|
50
48
|
}
|
|
51
|
-
|
|
52
|
-
console.log(`
|
|
49
|
+
if (outOfScope.length > 0) {
|
|
50
|
+
console.log(` skip ${outOfScope.length} item(s) not meant for this profile`);
|
|
53
51
|
}
|
|
52
|
+
};
|
|
53
|
+
const sync = (options) => {
|
|
54
|
+
const config = (0, config_1.loadConfig)({ root: options.root, targetOverride: options.targets });
|
|
55
|
+
const plan = (0, plan_1.buildPlan)({ config });
|
|
56
|
+
const { files } = plan;
|
|
57
|
+
const changes = diffPlan({ root: options.root, files, owned: (0, owned_paths_1.collectOwnedPaths)(options.root) });
|
|
58
|
+
console.log(`Targets: ${config.targets.join(', ')}`);
|
|
59
|
+
reportPlan(plan);
|
|
54
60
|
if (changes.length === 0) {
|
|
55
61
|
console.log('Everything is already up to date.');
|
|
56
62
|
return 0;
|
|
@@ -60,7 +66,10 @@ const sync = (options) => {
|
|
|
60
66
|
console.log(`\n${changes.length} file(s) would change. Re-run without --dry-run to apply.`);
|
|
61
67
|
return 0;
|
|
62
68
|
}
|
|
69
|
+
const written = new Set(changes.filter((change) => change.action !== 'delete').map((change) => change.path));
|
|
63
70
|
for (const file of files) {
|
|
71
|
+
if (!written.has(file.path))
|
|
72
|
+
continue;
|
|
64
73
|
const absolute = (0, path_1.join)(options.root, file.path);
|
|
65
74
|
(0, fs_1.mkdirSync)((0, path_1.dirname)(absolute), { recursive: true });
|
|
66
75
|
(0, fs_1.writeFileSync)(absolute, file.contents, 'utf8');
|
|
@@ -78,18 +87,17 @@ const sync = (options) => {
|
|
|
78
87
|
exports.sync = sync;
|
|
79
88
|
const check = (options) => {
|
|
80
89
|
const config = (0, config_1.loadConfig)({ root: options.root, targetOverride: options.targets });
|
|
81
|
-
const
|
|
82
|
-
const changes = diffPlan({ root: options.root, files, owned: (0, owned_paths_1.collectOwnedPaths)(options.root) });
|
|
83
|
-
|
|
84
|
-
console.warn(` warn ${warning}`);
|
|
85
|
-
}
|
|
90
|
+
const plan = (0, plan_1.buildPlan)({ config });
|
|
91
|
+
const changes = diffPlan({ root: options.root, files: plan.files, owned: (0, owned_paths_1.collectOwnedPaths)(options.root) });
|
|
92
|
+
reportPlan(plan);
|
|
86
93
|
if (changes.length === 0) {
|
|
87
94
|
console.log('Agent rules are in sync.');
|
|
88
95
|
return 0;
|
|
89
96
|
}
|
|
90
97
|
console.error('Agent rules are out of sync with @ethlete/agent-rules:');
|
|
91
98
|
changes.forEach((change) => console.error(describe(change)));
|
|
92
|
-
|
|
99
|
+
const runner = typeof config.vars['packageRunner'] === 'string' ? config.vars['packageRunner'] : 'npx';
|
|
100
|
+
console.error(`\nRun \`${runner} ethlete-agents sync\` and commit the result.`);
|
|
93
101
|
return 1;
|
|
94
102
|
};
|
|
95
103
|
exports.check = check;
|
package/src/lib/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/sync.ts"],"names":[],"mappings":";;;AAAA,2BAAwG;AACxG,+BAA+C;AAC/C,qCAAmD;AACnD,+CAAkD;AAClD,
|
|
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)(
|
|
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,
|
|
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,11 @@
|
|
|
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
|
|
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;
|
|
32
11
|
}) => EmittedFile[];
|
|
33
|
-
export {};
|
|
@@ -1,97 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.emitClaudeHooks = exports.
|
|
4
|
-
const
|
|
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 hooks_shared_1 = require("./hooks-shared");
|
|
7
5
|
exports.CLAUDE_SETTINGS_FILE = '.claude/settings.json';
|
|
8
6
|
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;
|
|
7
|
+
const commandFor = (file) => `python3 "$CLAUDE_PROJECT_DIR/${HOOKS_DIR}/${file}" --agent claude`;
|
|
69
8
|
/**
|
|
70
9
|
* 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
|
|
72
|
-
* only planned when its parsed content actually changes, and an unparseable file is left alone.
|
|
10
|
+
* repo that drops the target also gets its stale registrations removed.
|
|
73
11
|
*/
|
|
74
12
|
const emitClaudeHooks = (options) => {
|
|
75
13
|
const { context, claudeTarget, existingSettings } = options;
|
|
76
|
-
const hooks = claudeTarget ? context.hooks : [];
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
catch (_a) {
|
|
92
|
-
// Unparseable settings.json — never clobber a file the repo owns.
|
|
93
|
-
}
|
|
94
|
-
return files;
|
|
14
|
+
const hooks = claudeTarget ? (0, hooks_shared_1.hooksForAgent)({ hooks: context.hooks, agent: 'claude' }) : [];
|
|
15
|
+
return [
|
|
16
|
+
...(0, hooks_shared_1.emitHookScripts)({ hooks, hooksDir: HOOKS_DIR }),
|
|
17
|
+
...(0, hooks_shared_1.emitHookSettings)({
|
|
18
|
+
agent: 'claude',
|
|
19
|
+
path: exports.CLAUDE_SETTINGS_FILE,
|
|
20
|
+
existing: existingSettings,
|
|
21
|
+
hooks,
|
|
22
|
+
hooksDir: HOOKS_DIR,
|
|
23
|
+
commandFor,
|
|
24
|
+
createWhenEmpty: true,
|
|
25
|
+
}),
|
|
26
|
+
];
|
|
95
27
|
};
|
|
96
28
|
exports.emitClaudeHooks = emitClaudeHooks;
|
|
97
29
|
//# 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":";;;
|
|
1
|
+
{"version":3,"file":"claude-hooks.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude-hooks.ts"],"names":[],"mappings":";;;AACA,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,OAI/B,EAAiB,EAAE;IAClB,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAC5D,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;IAE3F,OAAO;QACL,GAAG,IAAA,8BAAe,EAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAClD,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;SACtB,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AApBW,QAAA,eAAe,mBAoB1B"}
|
|
@@ -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 =
|
|
16
|
+
const banner = render_1.BANNER;
|
|
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
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AACnC,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,eAAM,CAAC;IACtB,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,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;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,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitCodexHooks = exports.CODEX_HOOKS_FILE = void 0;
|
|
4
|
+
const hooks_shared_1 = require("./hooks-shared");
|
|
5
|
+
exports.CODEX_HOOKS_FILE = '.codex/hooks.json';
|
|
6
|
+
const HOOKS_DIR = '.codex/hooks/ethlete';
|
|
7
|
+
/**
|
|
8
|
+
* Codex exposes no project-dir variable, so the path is resolved the way Codex's own hook docs
|
|
9
|
+
* resolve it — the command string is evaluated by a shell.
|
|
10
|
+
*/
|
|
11
|
+
const commandFor = (file) => `python3 "$(git rev-parse --show-toplevel)/${HOOKS_DIR}/${file}" --agent codex`;
|
|
12
|
+
/**
|
|
13
|
+
* The hook scripts plus the `.codex/hooks.json` registration. Runs even when the codex target is
|
|
14
|
+
* off so a repo that drops the target also gets its stale registrations removed — but an absent
|
|
15
|
+
* file stays absent rather than being created empty.
|
|
16
|
+
*/
|
|
17
|
+
const emitCodexHooks = (options) => {
|
|
18
|
+
const { context, codexTarget, existingHooks } = options;
|
|
19
|
+
const hooks = codexTarget ? (0, hooks_shared_1.hooksForAgent)({ hooks: context.hooks, agent: 'codex' }) : [];
|
|
20
|
+
return [
|
|
21
|
+
...(0, hooks_shared_1.emitHookScripts)({ hooks, hooksDir: HOOKS_DIR }),
|
|
22
|
+
...(0, hooks_shared_1.emitHookSettings)({
|
|
23
|
+
agent: 'codex',
|
|
24
|
+
path: exports.CODEX_HOOKS_FILE,
|
|
25
|
+
existing: existingHooks,
|
|
26
|
+
hooks,
|
|
27
|
+
hooksDir: HOOKS_DIR,
|
|
28
|
+
commandFor,
|
|
29
|
+
createWhenEmpty: false,
|
|
30
|
+
}),
|
|
31
|
+
];
|
|
32
|
+
};
|
|
33
|
+
exports.emitCodexHooks = emitCodexHooks;
|
|
34
|
+
//# 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,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,CAAC;QAClD,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"}
|
package/src/lib/targets/codex.js
CHANGED
|
@@ -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)(
|
|
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`;
|
|
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)([
|
|
24
|
-
return [{ path: exports.CODEX_FILE, contents: (0, render_1.replaceMarkedBlock)({ existing, block }) }];
|
|
23
|
+
const block = (0, shared_1.document)([render_1.BANNER, ...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,
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/codex.ts"],"names":[],"mappings":";;;AAAA,sCAAuD;AACvD,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,eAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAExD,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 =
|
|
15
|
-
const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links: (0, shared_1.agentsSkillsLinks)(
|
|
14
|
+
const banner = render_1.BANNER;
|
|
15
|
+
const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links: (0, shared_1.agentsSkillsLinks)() }));
|
|
16
16
|
const block = (0, shared_1.document)([banner, ...sections]).trimEnd();
|
|
17
|
-
return [{ path: exports.COPILOT_FILE, contents: (0, render_1.replaceMarkedBlock)({ existing, block }) }];
|
|
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,
|
|
1
|
+
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/copilot.ts"],"names":[],"mappings":";;;AAAA,sCAAuD;AACvD,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,eAAM,CAAC;IACtB,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,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,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 =
|
|
13
|
-
const links = (0, shared_1.agentsSkillsLinks)(
|
|
12
|
+
const banner = render_1.BANNER;
|
|
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 = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/cursor.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/cursor.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AACnC,qCAAgH;AAEhH;;;;GAIG;AACI,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAiB,EAAE;IAChE,MAAM,MAAM,GAAG,eAAM,CAAC;IACtB,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,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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
}) => EmittedFile[];
|