@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.
- package/AGENTS.md +28 -0
- package/CHANGELOG.md +463 -0
- package/CLAUDE.md +1 -0
- package/README.md +362 -29
- package/THIRD-PARTY-LICENSES.md +35 -0
- package/content/defaults.json +1 -1
- package/content/git-hooks/post-checkout.sh +10 -0
- package/content/git-hooks/pre-push.sh +5 -0
- package/content/hooks/context-warning.py +871 -110
- package/content/hooks/subagent-model-policy.py +194 -0
- package/content/mods/.claude-plugin/marketplace.json +11 -0
- package/content/mods/plugins/e2e-progress/.claude-plugin/plugin.json +6 -0
- package/content/mods/plugins/e2e-progress/hooks/hooks.json +1 -0
- package/content/mods/plugins/e2e-progress/hooks/register.tsx +442 -0
- package/content/mods/plugins/e2e-progress/tsconfig.json +3 -0
- package/content/mods/plugins/e2e-progress/types/index.d.ts +23 -0
- package/content/output-styles/ste-clarity.md +131 -0
- package/content/rules/agent-sessions-wake-up.md +11 -0
- package/content/rules/app-styling.md +66 -0
- package/content/rules/comments.md +4 -1
- package/content/rules/lint-and-format.md +7 -5
- package/content/rules/nx-layout.md +50 -0
- package/content/rules/reactive-state.md +1 -1
- package/content/rules/styling.md +9 -7
- package/content/rules/subagent-models.md +39 -0
- package/content/skills/agent-sessions/SKILL.md +81 -0
- package/content/skills/agent-sessions/agent-sessions.mjs +492 -0
- package/content/skills/angular-patterns/SKILL.md +30 -7
- package/content/skills/api-source/SKILL.md +156 -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 +657 -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/e2e-triage/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 +11 -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 +51 -0
- package/content/skills/handoff/SKILL.md +125 -5
- package/content/skills/query/SKILL.md +165 -64
- package/content/skills/rxjs-signals/SKILL.md +33 -4
- package/content/skills/sdk-docs/SKILL.md +50 -14
- package/content/skills/sdk-local-build/SKILL.md +26 -8
- package/content/skills/sdk-local-build/sdk-local-baseline.mjs +64 -0
- package/content/skills/sdk-source/SKILL.md +37 -34
- package/content/skills/sdk-update/SKILL.md +103 -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 +50 -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 +19 -3
- package/src/index.js +85 -30
- 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 +41 -5
- package/src/lib/config.js +117 -10
- 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 +23 -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 +165 -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 +165 -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 +140 -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 +116 -0
- package/src/lib/gitlab.js.map +1 -0
- package/src/lib/index.d.ts +2 -0
- package/src/lib/index.js +26 -11
- package/src/lib/index.js.map +1 -1
- package/src/lib/migrate.js +6 -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 +4 -0
- package/src/lib/package-runner.js +86 -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 +164 -40
- package/src/lib/plan.js.map +1 -1
- package/src/lib/prompt.d.ts +8 -0
- package/src/lib/prompt.js +35 -0
- package/src/lib/prompt.js.map +1 -0
- package/src/lib/render.d.ts +25 -2
- package/src/lib/render.js +43 -10
- package/src/lib/render.js.map +1 -1
- package/src/lib/sessions-command.d.ts +4 -0
- package/src/lib/sessions-command.js +16 -0
- package/src/lib/sessions-command.js.map +1 -0
- package/src/lib/sync.d.ts +0 -1
- package/src/lib/sync.js +30 -17
- 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 +3 -23
- package/src/lib/targets/claude-hooks.js +22 -86
- package/src/lib/targets/claude-hooks.js.map +1 -1
- package/src/lib/targets/claude-mods.d.ts +20 -0
- package/src/lib/targets/claude-mods.js +47 -0
- package/src/lib/targets/claude-mods.js.map +1 -0
- package/src/lib/targets/claude.js +2 -3
- 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 +35 -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 +4 -4
- package/src/lib/targets/copilot.js.map +1 -1
- package/src/lib/targets/cursor.js +3 -3
- package/src/lib/targets/cursor.js.map +1 -1
- package/src/lib/targets/git-hooks.d.ts +25 -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 +60 -0
- package/src/lib/targets/hooks-shared.js +130 -0
- package/src/lib/targets/hooks-shared.js.map +1 -0
- package/src/lib/targets/mcp.d.ts +16 -0
- package/src/lib/targets/mcp.js +68 -0
- package/src/lib/targets/mcp.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 +1063 -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 +279 -0
- package/src/lib/timetrack.js.map +1 -0
- package/content/skills/styleguide/STYLEGUIDE.md +0 -520
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EmittedFile } from './shared';
|
|
2
|
+
type HookRegistration = {
|
|
3
|
+
event: string;
|
|
4
|
+
/** Tool-name pattern for a tool-scoped event, so the script is not run on every tool call. */
|
|
5
|
+
matcher?: string;
|
|
6
|
+
/** Agents that have this event. Empty means every target that registers the hook gets it. */
|
|
7
|
+
agents?: string[];
|
|
8
|
+
};
|
|
9
|
+
type HookDefinition = {
|
|
10
|
+
events: HookRegistration[];
|
|
11
|
+
file: string;
|
|
12
|
+
timeout: number;
|
|
13
|
+
/** Agents that have the hook at all. Empty means every target registers it. */
|
|
14
|
+
agents?: string[];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Hooks a repo can opt into via the config's `hooks` array. Hooks run arbitrary commands on the
|
|
18
|
+
* developer's machine, so unlike rules and skills they are never emitted by default.
|
|
19
|
+
*/
|
|
20
|
+
export declare const KNOWN_HOOKS: Record<string, HookDefinition>;
|
|
21
|
+
/** Drops the hooks whose event the agent does not have, so neither script nor entry is emitted. */
|
|
22
|
+
export declare const hooksForAgent: (options: {
|
|
23
|
+
hooks: string[];
|
|
24
|
+
agent: string;
|
|
25
|
+
}) => string[];
|
|
26
|
+
/** The registrations of one hook that the given agent has the event for. */
|
|
27
|
+
export declare const eventsForAgent: (options: {
|
|
28
|
+
hook: string;
|
|
29
|
+
agent: string;
|
|
30
|
+
}) => HookRegistration[];
|
|
31
|
+
export declare const assertKnownHooks: (hooks: string[]) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Rewrites the generated entries declaratively: every entry whose command points into the
|
|
34
|
+
* agent's `hooks/ethlete/` directory is dropped and the currently enabled hooks are re-added, so
|
|
35
|
+
* disabling a hook in the config also unregisters it. Everything else in the file is untouched.
|
|
36
|
+
*/
|
|
37
|
+
export declare const mergeHookSettings: (options: {
|
|
38
|
+
agent: string;
|
|
39
|
+
existing: string;
|
|
40
|
+
hooks: string[];
|
|
41
|
+
hooksDir: string;
|
|
42
|
+
commandFor: (file: string) => string;
|
|
43
|
+
}) => string;
|
|
44
|
+
export declare const emitHookScripts: (options: {
|
|
45
|
+
hooks: string[];
|
|
46
|
+
hooksDir: string;
|
|
47
|
+
runner?: string;
|
|
48
|
+
}) => EmittedFile[];
|
|
49
|
+
/** Only planned when the parsed content actually changes; an unparseable file is left alone. */
|
|
50
|
+
export declare const emitHookSettings: (options: {
|
|
51
|
+
agent: string;
|
|
52
|
+
path: string;
|
|
53
|
+
existing: string;
|
|
54
|
+
hooks: string[];
|
|
55
|
+
hooksDir: string;
|
|
56
|
+
commandFor: (file: string) => string;
|
|
57
|
+
createWhenEmpty: boolean;
|
|
58
|
+
mergeExtra?: (merged: string) => string;
|
|
59
|
+
}) => EmittedFile[];
|
|
60
|
+
export {};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitHookSettings = exports.emitHookScripts = exports.mergeHookSettings = exports.assertKnownHooks = exports.eventsForAgent = exports.hooksForAgent = exports.KNOWN_HOOKS = 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
|
+
/**
|
|
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
|
+
exports.KNOWN_HOOKS = {
|
|
13
|
+
'context-warning': {
|
|
14
|
+
events: [
|
|
15
|
+
{ event: 'UserPromptSubmit' },
|
|
16
|
+
// Codex has none of the three below, so its registration stays prompt-only.
|
|
17
|
+
{ event: 'SessionStart', agents: ['claude'] },
|
|
18
|
+
// The only event between an agent's own model requests, and the only way a warning
|
|
19
|
+
// reaches a long autonomous run before the user sends a message.
|
|
20
|
+
{ event: 'PostToolBatch', agents: ['claude'] },
|
|
21
|
+
{ event: 'Stop', agents: ['claude'] },
|
|
22
|
+
{ event: 'SubagentStop', agents: ['claude'] },
|
|
23
|
+
],
|
|
24
|
+
file: 'context-warning.py',
|
|
25
|
+
timeout: 10,
|
|
26
|
+
},
|
|
27
|
+
'subagent-model-policy': {
|
|
28
|
+
events: [{ event: 'PreToolUse', matcher: 'Task|Agent' }],
|
|
29
|
+
file: 'subagent-model-policy.py',
|
|
30
|
+
timeout: 10,
|
|
31
|
+
agents: ['claude'],
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
/** Drops the hooks whose event the agent does not have, so neither script nor entry is emitted. */
|
|
35
|
+
const hooksForAgent = (options) => options.hooks.filter((name) => {
|
|
36
|
+
var _a, _b;
|
|
37
|
+
const agents = (_b = (_a = exports.KNOWN_HOOKS[name]) === null || _a === void 0 ? void 0 : _a.agents) !== null && _b !== void 0 ? _b : [];
|
|
38
|
+
return agents.length === 0 || agents.includes(options.agent);
|
|
39
|
+
});
|
|
40
|
+
exports.hooksForAgent = hooksForAgent;
|
|
41
|
+
/** The registrations of one hook that the given agent has the event for. */
|
|
42
|
+
const eventsForAgent = (options) => {
|
|
43
|
+
var _a, _b;
|
|
44
|
+
return ((_b = (_a = exports.KNOWN_HOOKS[options.hook]) === null || _a === void 0 ? void 0 : _a.events) !== null && _b !== void 0 ? _b : []).filter((registration) => { var _a, _b; return ((_a = registration.agents) !== null && _a !== void 0 ? _a : []).length === 0 || ((_b = registration.agents) === null || _b === void 0 ? void 0 : _b.includes(options.agent)); });
|
|
45
|
+
};
|
|
46
|
+
exports.eventsForAgent = eventsForAgent;
|
|
47
|
+
const assertKnownHooks = (hooks) => {
|
|
48
|
+
const unknown = hooks.filter((name) => !Object.prototype.hasOwnProperty.call(exports.KNOWN_HOOKS, name));
|
|
49
|
+
if (unknown.length > 0) {
|
|
50
|
+
throw new Error(`Unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(exports.KNOWN_HOOKS).join(', ')}.`);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.assertKnownHooks = assertKnownHooks;
|
|
54
|
+
/** Placed after the shebang so the file stays runnable. */
|
|
55
|
+
const withBanner = (raw, runner) => {
|
|
56
|
+
var _a;
|
|
57
|
+
const lines = raw.split('\n');
|
|
58
|
+
if ((_a = lines[0]) === null || _a === void 0 ? void 0 : _a.startsWith('#!'))
|
|
59
|
+
return [lines[0], (0, render_1.shellBanner)(runner), ...lines.slice(1)].join('\n');
|
|
60
|
+
return `${(0, render_1.shellBanner)(runner)}\n${raw}`;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Rewrites the generated entries declaratively: every entry whose command points into the
|
|
64
|
+
* agent's `hooks/ethlete/` directory is dropped and the currently enabled hooks are re-added, so
|
|
65
|
+
* disabling a hook in the config also unregisters it. Everything else in the file is untouched.
|
|
66
|
+
*/
|
|
67
|
+
const mergeHookSettings = (options) => {
|
|
68
|
+
var _a, _b;
|
|
69
|
+
const { agent, existing, hooks, hooksDir, commandFor } = options;
|
|
70
|
+
const settings = JSON.parse(existing.trim() || '{}');
|
|
71
|
+
const events = Object.assign({}, ((_a = settings.hooks) !== null && _a !== void 0 ? _a : {}));
|
|
72
|
+
for (const [event, groups] of Object.entries(events)) {
|
|
73
|
+
const kept = groups
|
|
74
|
+
.map((group) => {
|
|
75
|
+
var _a;
|
|
76
|
+
return (Object.assign(Object.assign({}, group), { hooks: ((_a = group.hooks) !== null && _a !== void 0 ? _a : []).filter((hook) => { var _a; return !((_a = hook.command) !== null && _a !== void 0 ? _a : '').includes(`${hooksDir}/`); }) }));
|
|
77
|
+
})
|
|
78
|
+
.filter((group) => group.hooks.length > 0);
|
|
79
|
+
if (kept.length > 0)
|
|
80
|
+
events[event] = kept;
|
|
81
|
+
else
|
|
82
|
+
delete events[event];
|
|
83
|
+
}
|
|
84
|
+
for (const name of hooks) {
|
|
85
|
+
const definition = exports.KNOWN_HOOKS[name];
|
|
86
|
+
if (!definition)
|
|
87
|
+
continue;
|
|
88
|
+
for (const registration of (0, exports.eventsForAgent)({ hook: name, agent })) {
|
|
89
|
+
events[registration.event] = [
|
|
90
|
+
...((_b = events[registration.event]) !== null && _b !== void 0 ? _b : []),
|
|
91
|
+
Object.assign(Object.assign({}, (registration.matcher ? { matcher: registration.matcher } : {})), { hooks: [{ type: 'command', command: commandFor(definition.file), timeout: definition.timeout }] }),
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (Object.keys(events).length > 0)
|
|
96
|
+
settings.hooks = events;
|
|
97
|
+
else
|
|
98
|
+
delete settings.hooks;
|
|
99
|
+
return `${JSON.stringify(settings, null, 2)}\n`;
|
|
100
|
+
};
|
|
101
|
+
exports.mergeHookSettings = mergeHookSettings;
|
|
102
|
+
const emitHookScripts = (options) => {
|
|
103
|
+
const { hooks, hooksDir, runner } = options;
|
|
104
|
+
return hooks.flatMap((name) => {
|
|
105
|
+
const definition = exports.KNOWN_HOOKS[name];
|
|
106
|
+
if (!definition)
|
|
107
|
+
return [];
|
|
108
|
+
const raw = (0, fs_1.readFileSync)((0, path_1.join)((0, load_content_1.resolveContentRoot)(), 'hooks', definition.file), 'utf8');
|
|
109
|
+
return [{ path: `${hooksDir}/${definition.file}`, contents: withBanner(raw, runner) }];
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
exports.emitHookScripts = emitHookScripts;
|
|
113
|
+
/** Only planned when the parsed content actually changes; an unparseable file is left alone. */
|
|
114
|
+
const emitHookSettings = (options) => {
|
|
115
|
+
const { agent, path, existing, hooks, hooksDir, commandFor, createWhenEmpty, mergeExtra } = options;
|
|
116
|
+
if (existing.trim().length === 0 && hooks.length === 0 && !createWhenEmpty)
|
|
117
|
+
return [];
|
|
118
|
+
try {
|
|
119
|
+
const hookMerged = (0, exports.mergeHookSettings)({ agent, existing, hooks, hooksDir, commandFor });
|
|
120
|
+
const merged = mergeExtra ? mergeExtra(hookMerged) : hookMerged;
|
|
121
|
+
if (JSON.stringify(JSON.parse(existing.trim() || '{}')) === JSON.stringify(JSON.parse(merged)))
|
|
122
|
+
return [];
|
|
123
|
+
return [{ path, contents: merged }];
|
|
124
|
+
}
|
|
125
|
+
catch (_a) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
exports.emitHookSettings = emitHookSettings;
|
|
130
|
+
//# sourceMappingURL=hooks-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-shared.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/hooks-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EmittedFile } from './shared';
|
|
2
|
+
export declare const CLAUDE_MCP_FILE = ".mcp.json";
|
|
3
|
+
export declare const CODEX_CONFIG_FILE = ".codex/config.toml";
|
|
4
|
+
export declare const DESIGN_MCP_SERVER = "ethlete-design";
|
|
5
|
+
export declare const emitClaudeMcp: (options: {
|
|
6
|
+
existing: string;
|
|
7
|
+
runner: string | undefined;
|
|
8
|
+
}) => EmittedFile;
|
|
9
|
+
/**
|
|
10
|
+
* Replaces only the `[mcp_servers.ethlete-design]` table (up to the next table header) and appends it
|
|
11
|
+
* when absent, so every other table in the project's Codex config stays as written.
|
|
12
|
+
*/
|
|
13
|
+
export declare const emitCodexMcp: (options: {
|
|
14
|
+
existing: string;
|
|
15
|
+
runner: string | undefined;
|
|
16
|
+
}) => EmittedFile;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitCodexMcp = exports.emitClaudeMcp = exports.DESIGN_MCP_SERVER = exports.CODEX_CONFIG_FILE = exports.CLAUDE_MCP_FILE = void 0;
|
|
4
|
+
exports.CLAUDE_MCP_FILE = '.mcp.json';
|
|
5
|
+
exports.CODEX_CONFIG_FILE = '.codex/config.toml';
|
|
6
|
+
exports.DESIGN_MCP_SERVER = 'ethlete-design';
|
|
7
|
+
const serverCommand = (runner = 'npx') => {
|
|
8
|
+
const [command = 'npx', ...prefix] = runner.split(' ').filter(Boolean);
|
|
9
|
+
return { command, args: [...prefix, 'et', 'design', 'mcp'] };
|
|
10
|
+
};
|
|
11
|
+
const parseObject = (existing, file) => {
|
|
12
|
+
if (existing.trim() === '')
|
|
13
|
+
return {};
|
|
14
|
+
let parsed;
|
|
15
|
+
try {
|
|
16
|
+
parsed = JSON.parse(existing);
|
|
17
|
+
}
|
|
18
|
+
catch (_a) {
|
|
19
|
+
throw new Error(`${file} is not valid JSON — fix or remove it so the ${exports.DESIGN_MCP_SERVER} MCP server can be merged.`);
|
|
20
|
+
}
|
|
21
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
22
|
+
throw new Error(`${file} is not a JSON object — fix or remove it so the ${exports.DESIGN_MCP_SERVER} MCP server can be merged.`);
|
|
23
|
+
}
|
|
24
|
+
return parsed;
|
|
25
|
+
};
|
|
26
|
+
const emitClaudeMcp = (options) => {
|
|
27
|
+
var _a;
|
|
28
|
+
const settings = parseObject(options.existing, exports.CLAUDE_MCP_FILE);
|
|
29
|
+
const servers = ((_a = settings['mcpServers']) !== null && _a !== void 0 ? _a : {});
|
|
30
|
+
const merged = Object.assign(Object.assign({}, settings), { mcpServers: Object.assign(Object.assign({}, servers), { [exports.DESIGN_MCP_SERVER]: serverCommand(options.runner) }) });
|
|
31
|
+
return { path: exports.CLAUDE_MCP_FILE, contents: `${JSON.stringify(merged, null, 2)}\n` };
|
|
32
|
+
};
|
|
33
|
+
exports.emitClaudeMcp = emitClaudeMcp;
|
|
34
|
+
const tomlSection = (runner) => {
|
|
35
|
+
const { command, args } = serverCommand(runner);
|
|
36
|
+
return [
|
|
37
|
+
`[mcp_servers.${exports.DESIGN_MCP_SERVER}]`,
|
|
38
|
+
`command = "${command}"`,
|
|
39
|
+
`args = [${args.map((arg) => `"${arg}"`).join(', ')}]`,
|
|
40
|
+
].join('\n');
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Replaces only the `[mcp_servers.ethlete-design]` table (up to the next table header) and appends it
|
|
44
|
+
* when absent, so every other table in the project's Codex config stays as written.
|
|
45
|
+
*/
|
|
46
|
+
const emitCodexMcp = (options) => {
|
|
47
|
+
const { existing, runner } = options;
|
|
48
|
+
const header = `[mcp_servers.${exports.DESIGN_MCP_SERVER}]`;
|
|
49
|
+
const lines = existing.split('\n');
|
|
50
|
+
const start = lines.findIndex((line) => line.trim() === header);
|
|
51
|
+
const section = tomlSection(runner);
|
|
52
|
+
if (start === -1) {
|
|
53
|
+
const base = existing.trimEnd();
|
|
54
|
+
return { path: exports.CODEX_CONFIG_FILE, contents: `${base === '' ? '' : `${base}\n\n`}${section}\n` };
|
|
55
|
+
}
|
|
56
|
+
let end = lines.findIndex((line, index) => index > start && /^\s*\[/.test(line));
|
|
57
|
+
if (end === -1)
|
|
58
|
+
end = lines.length;
|
|
59
|
+
const before = lines
|
|
60
|
+
.slice(0, start)
|
|
61
|
+
.map((line) => `${line}\n`)
|
|
62
|
+
.join('');
|
|
63
|
+
const after = lines.slice(end).join('\n').trimStart();
|
|
64
|
+
const contents = `${before}${section}\n${after === '' ? '' : `\n${after}`}`;
|
|
65
|
+
return { path: exports.CODEX_CONFIG_FILE, contents: contents.endsWith('\n') ? contents : `${contents}\n` };
|
|
66
|
+
};
|
|
67
|
+
exports.emitCodexMcp = emitCodexMcp;
|
|
68
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,7 @@ export type EmittedFile = {
|
|
|
8
8
|
export type EmitContext = {
|
|
9
9
|
rules: ContentItem[];
|
|
10
10
|
skills: ContentItem[];
|
|
11
|
-
/** Names of the skills that actually survived filtering, so links can't point at a missing file. */
|
|
12
|
-
emittedSkills: Set<string>;
|
|
13
11
|
vars: Record<string, string | string[]>;
|
|
14
|
-
version: string;
|
|
15
12
|
/**
|
|
16
13
|
* The repo's `CLAUDE.md` is an `@AGENTS.md` import (or symlink), so Claude already receives the
|
|
17
14
|
* rules through the `AGENTS.md` marker block and must not get a second copy in `.claude/rules/`.
|
|
@@ -23,19 +20,14 @@ export type EmitContext = {
|
|
|
23
20
|
export declare const AGENTS_SKILLS_DIR = ".agents/skills";
|
|
24
21
|
export declare const agentsSkillDir: (name: string) => string;
|
|
25
22
|
export declare const agentsSkillPath: (name: string) => string;
|
|
26
|
-
/**
|
|
27
|
-
* A guide can be filtered out of a given repo while another still references it. Degrade such a
|
|
28
|
-
* link to the bare name rather than emitting a path to a file that was never written.
|
|
29
|
-
*/
|
|
30
23
|
export declare const makeLinks: (options: {
|
|
31
|
-
context: EmitContext;
|
|
32
24
|
skill: (name: string) => string;
|
|
33
25
|
resource: (target: {
|
|
34
26
|
skillName: string;
|
|
35
27
|
fileName: string;
|
|
36
28
|
}) => string;
|
|
37
29
|
}) => LinkResolver;
|
|
38
|
-
export declare const agentsSkillsLinks: (
|
|
30
|
+
export declare const agentsSkillsLinks: () => LinkResolver;
|
|
39
31
|
export declare const body: (options: {
|
|
40
32
|
item: ContentItem;
|
|
41
33
|
context: EmitContext;
|
|
@@ -8,17 +8,12 @@ const agentsSkillDir = (name) => `${exports.AGENTS_SKILLS_DIR}/ethlete-${name}`;
|
|
|
8
8
|
exports.agentsSkillDir = agentsSkillDir;
|
|
9
9
|
const agentsSkillPath = (name) => `${(0, exports.agentsSkillDir)(name)}/SKILL.md`;
|
|
10
10
|
exports.agentsSkillPath = agentsSkillPath;
|
|
11
|
-
/**
|
|
12
|
-
* A guide can be filtered out of a given repo while another still references it. Degrade such a
|
|
13
|
-
* link to the bare name rather than emitting a path to a file that was never written.
|
|
14
|
-
*/
|
|
15
11
|
const makeLinks = (options) => ({
|
|
16
|
-
skill:
|
|
12
|
+
skill: options.skill,
|
|
17
13
|
resource: options.resource,
|
|
18
14
|
});
|
|
19
15
|
exports.makeLinks = makeLinks;
|
|
20
|
-
const agentsSkillsLinks = (
|
|
21
|
-
context,
|
|
16
|
+
const agentsSkillsLinks = () => (0, exports.makeLinks)({
|
|
22
17
|
skill: (name) => `\`${(0, exports.agentsSkillPath)(name)}\``,
|
|
23
18
|
resource: (target) => `\`${(0, exports.agentsSkillDir)(target.skillName)}/${target.fileName}\``,
|
|
24
19
|
});
|
|
@@ -47,12 +42,13 @@ const skillBundle = (options) => {
|
|
|
47
42
|
'---',
|
|
48
43
|
`name: ethlete-${item.frontmatter.name}`,
|
|
49
44
|
`description: ${(0, exports.yamlString)((0, exports.description)({ item, context }))}`,
|
|
45
|
+
...(item.frontmatter.modelInvocation ? [] : ['disable-model-invocation: true']),
|
|
50
46
|
'---',
|
|
51
47
|
].join('\n');
|
|
52
48
|
return [
|
|
53
49
|
{
|
|
54
50
|
path: `${dir}/SKILL.md`,
|
|
55
|
-
contents: (0, exports.document)([frontmatter, (0, render_1.
|
|
51
|
+
contents: (0, exports.document)([frontmatter, (0, render_1.banner)((0, render_1.packageRunnerVar)(context.vars)), (0, exports.body)({ item, context, links })]),
|
|
56
52
|
},
|
|
57
53
|
...(0, exports.resourceFiles)({ item, context, pathFor: (fileName) => `${dir}/${fileName}` }),
|
|
58
54
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/shared.ts"],"names":[],"mappings":";;;AAAA,2BAAkC;AAElC,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent-facing half of Timetrack: everything here is one call into the running app.
|
|
3
|
+
*
|
|
4
|
+
* Nothing in this file knows a Jira host or a token. That is the point — an agent working in any
|
|
5
|
+
* repository asks the one process that holds them, so a machine has one secret to rotate rather than
|
|
6
|
+
* one per checkout.
|
|
7
|
+
*/
|
|
8
|
+
export declare const timetrackCommand: (options: {
|
|
9
|
+
root: string;
|
|
10
|
+
argv: string[];
|
|
11
|
+
}) => Promise<number>;
|