@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
package/src/lib/plan.js
CHANGED
|
@@ -1,22 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildPlan = exports.claudeMdImportsAgentsMd = void 0;
|
|
3
|
+
exports.buildPlan = exports.claudeMdImportsAgentsMd = exports.assertResolvedContentReferences = void 0;
|
|
4
4
|
const fs_1 = require("fs");
|
|
5
5
|
const path_1 = require("path");
|
|
6
6
|
const config_1 = require("./config");
|
|
7
|
+
const render_1 = require("./render");
|
|
7
8
|
const filter_1 = require("./filter");
|
|
8
9
|
const load_content_1 = require("./load-content");
|
|
10
|
+
const package_runner_1 = require("./package-runner");
|
|
9
11
|
const agents_skills_1 = require("./targets/agents-skills");
|
|
10
12
|
const claude_hooks_1 = require("./targets/claude-hooks");
|
|
13
|
+
const claude_mods_1 = require("./targets/claude-mods");
|
|
11
14
|
const claude_1 = require("./targets/claude");
|
|
12
15
|
const codex_1 = require("./targets/codex");
|
|
16
|
+
const codex_hooks_1 = require("./targets/codex-hooks");
|
|
17
|
+
const git_hooks_1 = require("./targets/git-hooks");
|
|
18
|
+
const hooks_shared_1 = require("./targets/hooks-shared");
|
|
13
19
|
const copilot_1 = require("./targets/copilot");
|
|
14
20
|
const cursor_1 = require("./targets/cursor");
|
|
21
|
+
const mcp_1 = require("./targets/mcp");
|
|
15
22
|
const SKILL_LINK_PATTERN = /\{%\s*skill:([a-zA-Z0-9_.-]+)\s*%\}/g;
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
const RESOURCE_LINK_PATTERN = /\{%\s*resource:([a-zA-Z0-9_.-]+)\s*%\}/g;
|
|
24
|
+
const assertResolvedContentReferences = (options) => {
|
|
25
|
+
var _a;
|
|
26
|
+
const { items, kept, skipped } = options;
|
|
27
|
+
const knownSkills = new Set(items.filter((item) => item.frontmatter.kind === 'skill').map((item) => item.frontmatter.name));
|
|
28
|
+
const emittedSkills = new Set(kept.filter((item) => item.frontmatter.kind === 'skill').map((item) => item.frontmatter.name));
|
|
29
|
+
const skippedByName = new Map(skipped.map((item) => [item.name, item.reason]));
|
|
30
|
+
for (const item of kept) {
|
|
31
|
+
const origin = item.frontmatter.kind === 'skill' ? `skills/${item.frontmatter.name}/SKILL.md` : item.sourcePath;
|
|
32
|
+
const skillLinks = [...item.body.matchAll(SKILL_LINK_PATTERN)].map((match) => match[1]);
|
|
33
|
+
for (const target of skillLinks) {
|
|
34
|
+
if (!knownSkills.has(target)) {
|
|
35
|
+
throw new Error(`${origin}: references unknown package skill "${target}".`);
|
|
36
|
+
}
|
|
37
|
+
if (!emittedSkills.has(target)) {
|
|
38
|
+
const reason = (_a = skippedByName.get(target)) !== null && _a !== void 0 ? _a : 'it was not selected for emission';
|
|
39
|
+
throw new Error(`${origin}: references package skill "${target}", but it is not emitted because ${reason}.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const resources = new Set(item.resources.map((resource) => resource.fileName));
|
|
43
|
+
for (const target of [...item.body.matchAll(RESOURCE_LINK_PATTERN)].map((match) => match[1])) {
|
|
44
|
+
if (!resources.has(target)) {
|
|
45
|
+
throw new Error(`${origin}: references missing bundled resource "${target}".`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const withoutStructuredLinks = item.body.replace(SKILL_LINK_PATTERN, '');
|
|
49
|
+
for (const target of knownSkills) {
|
|
50
|
+
if (target === item.frontmatter.name)
|
|
51
|
+
continue;
|
|
52
|
+
const plainReference = new RegExp('`(?:ethlete-)?' + target.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '` (?:skill|guide)');
|
|
53
|
+
if (plainReference.test(withoutStructuredLinks)) {
|
|
54
|
+
throw new Error(`${origin}: references package skill "${target}" as plain text; use "{% skill:${target} %}" so filtering can validate it.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
exports.assertResolvedContentReferences = assertResolvedContentReferences;
|
|
20
60
|
const readExisting = (root, relativePath) => {
|
|
21
61
|
const path = (0, path_1.join)(root, relativePath);
|
|
22
62
|
return (0, fs_1.existsSync)(path) ? (0, fs_1.readFileSync)(path, 'utf8') : '';
|
|
@@ -27,33 +67,16 @@ const claudeMdImportsAgentsMd = (root) => {
|
|
|
27
67
|
if (!(0, fs_1.existsSync)(path))
|
|
28
68
|
return false;
|
|
29
69
|
if ((0, fs_1.lstatSync)(path).isSymbolicLink())
|
|
30
|
-
return (0, fs_1.readlinkSync)(path).
|
|
31
|
-
|
|
70
|
+
return (0, path_1.resolve)(root, (0, fs_1.readlinkSync)(path)) === (0, path_1.resolve)(root, 'AGENTS.md');
|
|
71
|
+
const outsideFences = (0, fs_1.readFileSync)(path, 'utf8').replace(/^(`{3,}|~{3,})[^\n]*\n[\s\S]*?^\1[^\n]*$/gm, '');
|
|
72
|
+
return /^@AGENTS\.md\s*$/m.test(outsideFences);
|
|
32
73
|
};
|
|
33
74
|
exports.claudeMdImportsAgentsMd = claudeMdImportsAgentsMd;
|
|
34
|
-
/** Marks a directory as an `ethlete-sdk` checkout rather than some other folder. */
|
|
35
|
-
const SDK_CHECKOUT_MARKERS = ['libs/components', 'libs/core', 'libs/agent-rules'];
|
|
36
|
-
const describeSdkSourcePath = (options) => {
|
|
37
|
-
const { root, value } = options;
|
|
38
|
-
if (value === undefined)
|
|
39
|
-
return [];
|
|
40
|
-
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
41
|
-
return [`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "sdkSourcePath" — use a path to an ethlete-sdk checkout.`];
|
|
42
|
-
}
|
|
43
|
-
const absolute = (0, path_1.resolve)(root, value);
|
|
44
|
-
if (!(0, fs_1.existsSync)(absolute)) {
|
|
45
|
-
return [`${config_1.LOCAL_CONFIG_FILE_NAME} points "sdkSourcePath" at ${absolute}, which does not exist.`];
|
|
46
|
-
}
|
|
47
|
-
if (SDK_CHECKOUT_MARKERS.some((marker) => !(0, fs_1.existsSync)((0, path_1.join)(absolute, marker)))) {
|
|
48
|
-
return [`${config_1.LOCAL_CONFIG_FILE_NAME} points "sdkSourcePath" at ${absolute}, which is not an ethlete-sdk checkout.`];
|
|
49
|
-
}
|
|
50
|
-
return [];
|
|
51
|
-
};
|
|
52
75
|
/**
|
|
53
76
|
* The local file only affects runtime behavior, never sync output — so the warnings here are about
|
|
54
77
|
* the mistakes that would otherwise fail silently: a file the hooks can't parse, a key that
|
|
55
|
-
* suggests someone expected sync-time overrides, a hook name nothing matches, or
|
|
56
|
-
* no longer exists (the skills reading it would just report the checkout as missing).
|
|
78
|
+
* suggests someone expected sync-time overrides, a hook name nothing matches, or a checkout path
|
|
79
|
+
* that no longer exists (the skills reading it would just report the checkout as missing).
|
|
57
80
|
*/
|
|
58
81
|
const collectLocalConfigWarnings = (root) => {
|
|
59
82
|
const local = (0, config_1.readLocalConfig)(root);
|
|
@@ -64,23 +87,100 @@ const collectLocalConfigWarnings = (root) => {
|
|
|
64
87
|
}
|
|
65
88
|
const warnings = [];
|
|
66
89
|
if (local.unknownKeys.length > 0) {
|
|
67
|
-
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} contains unsupported key(s): ${local.unknownKeys.join(', ')} — the local file supports "
|
|
90
|
+
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} contains unsupported key(s): ${local.unknownKeys.join(', ')} — the local file supports ${config_1.LOCAL_CONFIG_KEYS.map((key) => `"${key}"`).join(' and ')}; it never changes what sync writes.`);
|
|
91
|
+
}
|
|
92
|
+
if (local.movedKeys.length > 0) {
|
|
93
|
+
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} still holds ${local.movedKeys.map((key) => `"${key}"`).join(', ')} — move ` +
|
|
94
|
+
`${local.movedKeys.length === 1 ? 'it' : 'them'} to ${config_1.TOPOLOGY_CONFIG_FILE_NAME}, which \`et\` reads too.`);
|
|
68
95
|
}
|
|
69
|
-
warnings.push(...describeSdkSourcePath({ root, value: local.config.sdkSourcePath }));
|
|
70
96
|
const disable = local.config.disableHooks;
|
|
71
97
|
if (disable !== undefined && typeof disable !== 'boolean' && !Array.isArray(disable)) {
|
|
72
98
|
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "disableHooks" value — use true or an array of hook names; hooks stay enabled.`);
|
|
73
99
|
}
|
|
74
100
|
if (Array.isArray(disable)) {
|
|
75
|
-
const unknown = disable.filter((name) => !(name
|
|
101
|
+
const unknown = disable.filter((name) => !Object.prototype.hasOwnProperty.call(hooks_shared_1.KNOWN_HOOKS, name));
|
|
76
102
|
if (unknown.length > 0) {
|
|
77
|
-
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} disables unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(
|
|
103
|
+
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} disables unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(hooks_shared_1.KNOWN_HOOKS).join(', ')}.`);
|
|
78
104
|
}
|
|
79
105
|
}
|
|
106
|
+
const disableAutoHandoffSave = local.config.disableAutoHandoffSave;
|
|
107
|
+
if (disableAutoHandoffSave !== undefined && typeof disableAutoHandoffSave !== 'boolean') {
|
|
108
|
+
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "disableAutoHandoffSave" value — use true or false.`);
|
|
109
|
+
}
|
|
80
110
|
return warnings;
|
|
81
111
|
};
|
|
82
|
-
|
|
83
|
-
|
|
112
|
+
/**
|
|
113
|
+
* Only `.husky/` is written into, never `.git/hooks/`: the generated files are committed and CI's
|
|
114
|
+
* `check` diffs them, so a hook that lives outside the working tree could never be in sync.
|
|
115
|
+
*/
|
|
116
|
+
const collectGitHookWarnings = (config) => {
|
|
117
|
+
if (config.gitHooks.length === 0 || (0, fs_1.existsSync)((0, path_1.join)(config.root, git_hooks_1.HUSKY_DIR)))
|
|
118
|
+
return [];
|
|
119
|
+
return [
|
|
120
|
+
`gitHooks is set to ${config.gitHooks.join(', ')} but there is no ${git_hooks_1.HUSKY_DIR}/ directory — nothing was written. Install husky, or run \`npx ethlete-agents git-flow check\` from your own hooks.`,
|
|
121
|
+
];
|
|
122
|
+
};
|
|
123
|
+
const collectExcludeWarnings = (items, exclude) => {
|
|
124
|
+
const knownNames = new Set(items.map((item) => item.frontmatter.name));
|
|
125
|
+
const unknownNames = exclude.filter((name) => !knownNames.has(name));
|
|
126
|
+
if (unknownNames.length === 0)
|
|
127
|
+
return [];
|
|
128
|
+
return [
|
|
129
|
+
`${config_1.CONFIG_FILE_NAME} excludes unknown content name(s): ${unknownNames.join(', ')} — check their spelling or remove them.`,
|
|
130
|
+
];
|
|
131
|
+
};
|
|
132
|
+
const PATH_VARS = ['themeStylesheet'];
|
|
133
|
+
const collectPathVarWarnings = (config) => PATH_VARS.flatMap((name) => {
|
|
134
|
+
const value = config.vars[name];
|
|
135
|
+
if (typeof value !== 'string' || (0, fs_1.existsSync)((0, path_1.resolve)(config.root, value)))
|
|
136
|
+
return [];
|
|
137
|
+
return [
|
|
138
|
+
`vars.${name} points at ${value}, which does not exist — the guides that read it will send agents to a missing file.`,
|
|
139
|
+
];
|
|
140
|
+
});
|
|
141
|
+
const isUnparseableJson = (contents) => {
|
|
142
|
+
if (!contents.trim())
|
|
143
|
+
return false;
|
|
144
|
+
try {
|
|
145
|
+
JSON.parse(contents);
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
catch (_a) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const collectHookSettingsWarnings = (root) => [claude_hooks_1.CLAUDE_SETTINGS_FILE, codex_hooks_1.CODEX_HOOKS_FILE]
|
|
153
|
+
.filter((path) => isUnparseableJson(readExisting(root, path)))
|
|
154
|
+
.map((path) => `${path} is not valid JSON — sync leaves it alone, so no hook is registered or removed there.`);
|
|
155
|
+
const SCRIPT_COMMAND_VARS = ['lintCommand', 'lintFixCommand'];
|
|
156
|
+
const collectMissingScriptWarnings = (config, kept) => {
|
|
157
|
+
const scripts = (0, package_runner_1.readScripts)(config.root);
|
|
158
|
+
if (!scripts)
|
|
159
|
+
return [];
|
|
160
|
+
const used = new Set(kept.flatMap((item) => item.frontmatter.vars));
|
|
161
|
+
return SCRIPT_COMMAND_VARS.filter((name) => used.has(name)).flatMap((name) => {
|
|
162
|
+
var _a;
|
|
163
|
+
const value = config.vars[name];
|
|
164
|
+
const script = typeof value === 'string' ? (_a = /^(?:npm|yarn|pnpm|bun) run (\S+)/.exec(value)) === null || _a === void 0 ? void 0 : _a[1] : undefined;
|
|
165
|
+
if (script === undefined || scripts.has(script))
|
|
166
|
+
return [];
|
|
167
|
+
return [
|
|
168
|
+
`vars.${name} is \`${value}\`, but package.json has no "${script}" script — set vars.${name} in ${config_1.CONFIG_FILE_NAME} to the command this repo uses.`,
|
|
169
|
+
];
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
const collectWarnings = (options) => {
|
|
173
|
+
var _a;
|
|
174
|
+
const { config, items, kept } = options;
|
|
175
|
+
const warnings = [
|
|
176
|
+
...((_a = config.configWarnings) !== null && _a !== void 0 ? _a : []),
|
|
177
|
+
...collectMissingScriptWarnings(config, kept),
|
|
178
|
+
...collectLocalConfigWarnings(config.root),
|
|
179
|
+
...collectHookSettingsWarnings(config.root),
|
|
180
|
+
...collectPathVarWarnings(config),
|
|
181
|
+
...collectGitHookWarnings(config),
|
|
182
|
+
...collectExcludeWarnings(items, config.exclude),
|
|
183
|
+
];
|
|
84
184
|
if (!config.claudeMdImportsAgentsMd)
|
|
85
185
|
return warnings;
|
|
86
186
|
if (!config.targets.includes('codex')) {
|
|
@@ -96,17 +196,18 @@ const collectWarnings = (config) => {
|
|
|
96
196
|
* result and `check` diffs it.
|
|
97
197
|
*/
|
|
98
198
|
const buildPlan = (options) => {
|
|
99
|
-
const { config
|
|
100
|
-
(0,
|
|
101
|
-
|
|
199
|
+
const { config } = options;
|
|
200
|
+
(0, hooks_shared_1.assertKnownHooks)(config.hooks);
|
|
201
|
+
(0, git_hooks_1.assertKnownGitHooks)(config.gitHooks);
|
|
202
|
+
(0, claude_mods_1.assertKnownMods)(config.mods);
|
|
203
|
+
const items = (0, load_content_1.loadContent)();
|
|
204
|
+
const { kept, skipped } = (0, filter_1.filterContent)(items, config);
|
|
205
|
+
(0, exports.assertResolvedContentReferences)({ items, kept, skipped });
|
|
102
206
|
const skills = kept.filter((item) => item.frontmatter.kind === 'skill');
|
|
103
|
-
const emittedSkills = new Set(skills.map((item) => item.frontmatter.name));
|
|
104
207
|
const context = {
|
|
105
208
|
rules: kept.filter((item) => item.frontmatter.kind === 'rule'),
|
|
106
209
|
skills,
|
|
107
|
-
emittedSkills,
|
|
108
210
|
vars: config.vars,
|
|
109
|
-
version,
|
|
110
211
|
claudeMdImportsAgentsMd: config.claudeMdImportsAgentsMd,
|
|
111
212
|
hooks: config.hooks,
|
|
112
213
|
};
|
|
@@ -125,12 +226,35 @@ const buildPlan = (options) => {
|
|
|
125
226
|
if (config.targets.includes('copilot')) {
|
|
126
227
|
files.push(...(0, copilot_1.emitCopilot)({ context, existing: readExisting(config.root, copilot_1.COPILOT_FILE) }));
|
|
127
228
|
}
|
|
229
|
+
if ((0, filter_1.isPackageInstalled)(config.root, '@ethlete/cli')) {
|
|
230
|
+
if (config.targets.includes('claude')) {
|
|
231
|
+
files.push((0, mcp_1.emitClaudeMcp)({ existing: readExisting(config.root, mcp_1.CLAUDE_MCP_FILE), runner: (0, render_1.packageRunnerVar)(config.vars) }));
|
|
232
|
+
}
|
|
233
|
+
if (config.targets.includes('codex')) {
|
|
234
|
+
files.push((0, mcp_1.emitCodexMcp)({ existing: readExisting(config.root, mcp_1.CODEX_CONFIG_FILE), runner: (0, render_1.packageRunnerVar)(config.vars) }));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
128
237
|
files.push(...(0, claude_hooks_1.emitClaudeHooks)({
|
|
129
238
|
context,
|
|
130
239
|
claudeTarget: config.targets.includes('claude'),
|
|
131
240
|
existingSettings: readExisting(config.root, claude_hooks_1.CLAUDE_SETTINGS_FILE),
|
|
241
|
+
mods: config.mods,
|
|
242
|
+
sdkProfile: config.scopes.includes('sdk'),
|
|
243
|
+
}), ...(0, codex_hooks_1.emitCodexHooks)({
|
|
244
|
+
context,
|
|
245
|
+
codexTarget: config.targets.includes('codex'),
|
|
246
|
+
existingHooks: readExisting(config.root, codex_hooks_1.CODEX_HOOKS_FILE),
|
|
247
|
+
}), ...(0, git_hooks_1.emitGitHooks)({
|
|
248
|
+
gitHooks: config.gitHooks,
|
|
249
|
+
huskyExists: (0, fs_1.existsSync)((0, path_1.join)(config.root, git_hooks_1.HUSKY_DIR)),
|
|
250
|
+
runner: (0, render_1.packageRunnerVar)(config.vars),
|
|
251
|
+
existing: Object.fromEntries(Object.keys(git_hooks_1.KNOWN_GIT_HOOKS).map((name) => [name, readExisting(config.root, (0, git_hooks_1.huskyHookPath)(name))])),
|
|
132
252
|
}));
|
|
133
|
-
return {
|
|
253
|
+
return {
|
|
254
|
+
files,
|
|
255
|
+
skipped,
|
|
256
|
+
warnings: collectWarnings({ config, items, kept }),
|
|
257
|
+
};
|
|
134
258
|
};
|
|
135
259
|
exports.buildPlan = buildPlan;
|
|
136
260
|
//# sourceMappingURL=plan.js.map
|
package/src/lib/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/plan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.confirm = void 0;
|
|
13
|
+
const promises_1 = require("readline/promises");
|
|
14
|
+
/**
|
|
15
|
+
* Without a TTY there is nobody to ask, so an unattended run must pass `--yes` explicitly rather
|
|
16
|
+
* than have silence read as consent.
|
|
17
|
+
*/
|
|
18
|
+
const confirm = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
if (options.assumeYes)
|
|
20
|
+
return true;
|
|
21
|
+
if (!process.stdin.isTTY) {
|
|
22
|
+
console.error('Nothing to prompt on (no TTY). Re-run with --yes to proceed unattended.');
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const readline = (0, promises_1.createInterface)({ input: process.stdin, output: process.stdout });
|
|
26
|
+
try {
|
|
27
|
+
const answer = yield readline.question(`${options.question} [y/N] `);
|
|
28
|
+
return /^y(es)?$/i.test(answer.trim());
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
readline.close();
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
exports.confirm = confirm;
|
|
35
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/prompt.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gDAAoD;AAEpD;;;GAGG;AACI,MAAM,OAAO,GAAG,CAAO,OAAiD,EAAE,EAAE;IACjF,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAEzF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,0BAAe,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEnF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,SAAS,CAAC,CAAC;QAErE,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC,CAAA,CAAC;AAlBW,QAAA,OAAO,WAkBlB"}
|
package/src/lib/render.d.ts
CHANGED
|
@@ -13,7 +13,15 @@ export type LinkResolver = {
|
|
|
13
13
|
};
|
|
14
14
|
export declare const START_MARKER = "<!-- ethlete:agent-rules:start -->";
|
|
15
15
|
export declare const END_MARKER = "<!-- ethlete:agent-rules:end -->";
|
|
16
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Never interpolate the package version here. `check` diffs whole file contents, so a version in
|
|
18
|
+
* the banner puts every generated file out of sync on a release bump that changed no content —
|
|
19
|
+
* turning each release into a repo-wide re-sync commit and a red CI in the meantime.
|
|
20
|
+
*/
|
|
21
|
+
export declare const banner: (runner?: string) => string;
|
|
22
|
+
/** `#` comment form for generated scripts, which must stay runnable. See {@link banner}. */
|
|
23
|
+
export declare const shellBanner: (runner?: string) => string;
|
|
24
|
+
export declare const packageRunnerVar: (vars: Record<string, string | string[]>) => string | undefined;
|
|
17
25
|
export declare const renderBody: (options: {
|
|
18
26
|
item: ContentItem;
|
|
19
27
|
vars: Record<string, string | string[]>;
|
|
@@ -31,9 +39,24 @@ export declare const renderDescription: (options: {
|
|
|
31
39
|
}) => string;
|
|
32
40
|
/**
|
|
33
41
|
* Rewrites the block between the markers, leaving everything a repo wrote around it untouched.
|
|
34
|
-
* A file without markers gets the block appended.
|
|
42
|
+
* A file without markers gets the block appended. Shell files pass their own `#` markers.
|
|
43
|
+
* Throws when only one marker is there, or the end marker comes first, rather than guess where the
|
|
44
|
+
* block ends and delete what the repo wrote.
|
|
35
45
|
*/
|
|
36
46
|
export declare const replaceMarkedBlock: (options: {
|
|
37
47
|
existing: string;
|
|
38
48
|
block: string;
|
|
49
|
+
/** Named in the error for unbalanced markers. */
|
|
50
|
+
file?: string;
|
|
51
|
+
startMarker?: string;
|
|
52
|
+
endMarker?: string;
|
|
53
|
+
}) => string;
|
|
54
|
+
/**
|
|
55
|
+
* Takes the block back out, so switching a generated block off in the config removes it instead of
|
|
56
|
+
* leaving it behind — `sync`'s file-level pruning cannot reach inside a file the repo also owns.
|
|
57
|
+
*/
|
|
58
|
+
export declare const removeMarkedBlock: (options: {
|
|
59
|
+
existing: string;
|
|
60
|
+
startMarker: string;
|
|
61
|
+
endMarker: string;
|
|
39
62
|
}) => string;
|
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.packageRunnerVar = exports.shellBanner = 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,18 @@ 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
|
+
const banner = (runner = 'npx') => `<!-- Generated by @ethlete/agent-rules — DO NOT EDIT. Run \`${runner} ethlete-agents sync\`. -->`;
|
|
17
|
+
exports.banner = banner;
|
|
18
|
+
/** `#` comment form for generated scripts, which must stay runnable. See {@link banner}. */
|
|
19
|
+
const shellBanner = (runner = 'npx') => `# Generated by @ethlete/agent-rules — DO NOT EDIT. Run \`${runner} ethlete-agents sync\`.`;
|
|
20
|
+
exports.shellBanner = shellBanner;
|
|
21
|
+
const packageRunnerVar = (vars) => typeof vars['packageRunner'] === 'string' ? vars['packageRunner'] : undefined;
|
|
22
|
+
exports.packageRunnerVar = packageRunnerVar;
|
|
13
23
|
const renderValue = (value) => Array.isArray(value) ? value.map((entry) => `\`${entry}\``).join(', ') : value;
|
|
14
24
|
const renderBody = (options) => {
|
|
15
25
|
const { item, vars, links } = options;
|
|
@@ -56,18 +66,41 @@ const renderDescription = (options) => (0, exports.substituteVars)({
|
|
|
56
66
|
exports.renderDescription = renderDescription;
|
|
57
67
|
/**
|
|
58
68
|
* Rewrites the block between the markers, leaving everything a repo wrote around it untouched.
|
|
59
|
-
* A file without markers gets the block appended.
|
|
69
|
+
* A file without markers gets the block appended. Shell files pass their own `#` markers.
|
|
70
|
+
* Throws when only one marker is there, or the end marker comes first, rather than guess where the
|
|
71
|
+
* block ends and delete what the repo wrote.
|
|
60
72
|
*/
|
|
61
73
|
const replaceMarkedBlock = (options) => {
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
|
|
74
|
+
var _a, _b;
|
|
75
|
+
const { existing, block, file = 'The file' } = options;
|
|
76
|
+
const startMarker = (_a = options.startMarker) !== null && _a !== void 0 ? _a : exports.START_MARKER;
|
|
77
|
+
const endMarker = (_b = options.endMarker) !== null && _b !== void 0 ? _b : exports.END_MARKER;
|
|
78
|
+
const wrapped = `${startMarker}\n${block}\n${endMarker}`;
|
|
79
|
+
const start = existing.indexOf(startMarker);
|
|
80
|
+
const end = existing.indexOf(endMarker);
|
|
81
|
+
if (start === -1 && end === -1) {
|
|
67
82
|
const separator = existing.trim().length > 0 ? `${existing.trimEnd()}\n\n` : '';
|
|
68
83
|
return `${separator}${wrapped}\n`;
|
|
69
84
|
}
|
|
70
|
-
|
|
85
|
+
if (start === -1 || end === -1 || end < start) {
|
|
86
|
+
throw new Error(`${file} has an ethlete marker block with no matching end marker. Put "${startMarker}" and ` +
|
|
87
|
+
`"${endMarker}" back around the generated block, or remove both, then sync again.`);
|
|
88
|
+
}
|
|
89
|
+
return `${existing.slice(0, start)}${wrapped}${existing.slice(end + endMarker.length)}`;
|
|
71
90
|
};
|
|
72
91
|
exports.replaceMarkedBlock = replaceMarkedBlock;
|
|
92
|
+
/**
|
|
93
|
+
* Takes the block back out, so switching a generated block off in the config removes it instead of
|
|
94
|
+
* leaving it behind — `sync`'s file-level pruning cannot reach inside a file the repo also owns.
|
|
95
|
+
*/
|
|
96
|
+
const removeMarkedBlock = (options) => {
|
|
97
|
+
const { existing, startMarker, endMarker } = options;
|
|
98
|
+
const start = existing.indexOf(startMarker);
|
|
99
|
+
const end = existing.indexOf(endMarker);
|
|
100
|
+
if (start === -1 || end === -1 || end < start)
|
|
101
|
+
return existing;
|
|
102
|
+
const kept = `${existing.slice(0, start).trimEnd()}\n${existing.slice(end + endMarker.length).trimStart()}`;
|
|
103
|
+
return kept.trim().length > 0 ? kept : '';
|
|
104
|
+
};
|
|
105
|
+
exports.removeMarkedBlock = removeMarkedBlock;
|
|
73
106
|
//# 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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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sessionsCommand = exports.SESSIONS_SCRIPT = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const load_content_1 = require("./load-content");
|
|
7
|
+
exports.SESSIONS_SCRIPT = (0, path_1.join)('skills', 'agent-sessions', 'agent-sessions.mjs');
|
|
8
|
+
const sessionsCommand = (options) => {
|
|
9
|
+
var _a;
|
|
10
|
+
const result = (0, child_process_1.spawnSync)(process.execPath, [(0, path_1.join)((0, load_content_1.resolveContentRoot)(), exports.SESSIONS_SCRIPT), ...options.argv], {
|
|
11
|
+
stdio: 'inherit',
|
|
12
|
+
});
|
|
13
|
+
return (_a = result.status) !== null && _a !== void 0 ? _a : 1;
|
|
14
|
+
};
|
|
15
|
+
exports.sessionsCommand = sessionsCommand;
|
|
16
|
+
//# sourceMappingURL=sessions-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions-command.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/sessions-command.ts"],"names":[],"mappings":";;;AAAA,iDAA0C;AAC1C,+BAA4B;AAC5B,iDAAoD;AAEvC,QAAA,eAAe,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;AAE/E,MAAM,eAAe,GAAG,CAAC,OAA2B,EAAE,EAAE;;IAC7D,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAA,WAAI,EAAC,IAAA,iCAAkB,GAAE,EAAE,uBAAe,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE;QACzG,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,OAAO,MAAA,MAAM,CAAC,MAAM,mCAAI,CAAC,CAAC;AAC5B,CAAC,CAAC;AANW,QAAA,eAAe,mBAM1B"}
|
package/src/lib/sync.d.ts
CHANGED
package/src/lib/sync.js
CHANGED
|
@@ -25,8 +25,13 @@ const diffPlan = (options) => {
|
|
|
25
25
|
};
|
|
26
26
|
/** Removing the last generated file from a skill folder must not leave the folder behind. */
|
|
27
27
|
const pruneEmptyDirs = (options) => {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
const root = (0, path_1.resolve)(options.root);
|
|
29
|
+
let current = (0, path_1.resolve)((0, path_1.dirname)(options.from));
|
|
30
|
+
const isInsideRoot = (path) => {
|
|
31
|
+
const rel = (0, path_1.relative)(root, path);
|
|
32
|
+
return rel !== '' && !rel.startsWith('..') && !(0, path_1.isAbsolute)(rel);
|
|
33
|
+
};
|
|
34
|
+
while (isInsideRoot(current)) {
|
|
30
35
|
if (!(0, fs_1.existsSync)(current) || (0, fs_1.readdirSync)(current).length > 0)
|
|
31
36
|
return;
|
|
32
37
|
(0, fs_1.rmdirSync)(current);
|
|
@@ -37,20 +42,26 @@ const describe = (change) => {
|
|
|
37
42
|
const label = { write: 'create', update: 'update', delete: 'remove' }[change.action];
|
|
38
43
|
return ` ${label} ${change.path}`;
|
|
39
44
|
};
|
|
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) {
|
|
45
|
+
const reportPlan = (plan) => {
|
|
46
|
+
for (const warning of plan.warnings) {
|
|
46
47
|
console.warn(` warn ${warning}`);
|
|
47
48
|
}
|
|
48
|
-
|
|
49
|
+
const outOfScope = plan.skipped.filter((entry) => entry.cause === 'scope');
|
|
50
|
+
const listed = plan.skipped.filter((entry) => entry.cause !== 'scope');
|
|
51
|
+
for (const entry of listed) {
|
|
49
52
|
console.log(` skip ${entry.name} — ${entry.reason}`);
|
|
50
53
|
}
|
|
51
|
-
|
|
52
|
-
console.log(`
|
|
54
|
+
if (outOfScope.length > 0) {
|
|
55
|
+
console.log(` skip ${outOfScope.length} item(s) not meant for this profile`);
|
|
53
56
|
}
|
|
57
|
+
};
|
|
58
|
+
const sync = (options) => {
|
|
59
|
+
const config = (0, config_1.loadConfig)({ root: options.root, targetOverride: options.targets });
|
|
60
|
+
const plan = (0, plan_1.buildPlan)({ config });
|
|
61
|
+
const { files } = plan;
|
|
62
|
+
const changes = diffPlan({ root: options.root, files, owned: (0, owned_paths_1.collectOwnedPaths)(options.root) });
|
|
63
|
+
console.log(`Targets: ${config.targets.join(', ')}`);
|
|
64
|
+
reportPlan(plan);
|
|
54
65
|
if (changes.length === 0) {
|
|
55
66
|
console.log('Everything is already up to date.');
|
|
56
67
|
return 0;
|
|
@@ -60,7 +71,10 @@ const sync = (options) => {
|
|
|
60
71
|
console.log(`\n${changes.length} file(s) would change. Re-run without --dry-run to apply.`);
|
|
61
72
|
return 0;
|
|
62
73
|
}
|
|
74
|
+
const written = new Set(changes.filter((change) => change.action !== 'delete').map((change) => change.path));
|
|
63
75
|
for (const file of files) {
|
|
76
|
+
if (!written.has(file.path))
|
|
77
|
+
continue;
|
|
64
78
|
const absolute = (0, path_1.join)(options.root, file.path);
|
|
65
79
|
(0, fs_1.mkdirSync)((0, path_1.dirname)(absolute), { recursive: true });
|
|
66
80
|
(0, fs_1.writeFileSync)(absolute, file.contents, 'utf8');
|
|
@@ -78,18 +92,17 @@ const sync = (options) => {
|
|
|
78
92
|
exports.sync = sync;
|
|
79
93
|
const check = (options) => {
|
|
80
94
|
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
|
-
}
|
|
95
|
+
const plan = (0, plan_1.buildPlan)({ config });
|
|
96
|
+
const changes = diffPlan({ root: options.root, files: plan.files, owned: (0, owned_paths_1.collectOwnedPaths)(options.root) });
|
|
97
|
+
reportPlan(plan);
|
|
86
98
|
if (changes.length === 0) {
|
|
87
99
|
console.log('Agent rules are in sync.');
|
|
88
100
|
return 0;
|
|
89
101
|
}
|
|
90
102
|
console.error('Agent rules are out of sync with @ethlete/agent-rules:');
|
|
91
103
|
changes.forEach((change) => console.error(describe(change)));
|
|
92
|
-
|
|
104
|
+
const runner = typeof config.vars['packageRunner'] === 'string' ? config.vars['packageRunner'] : 'npx';
|
|
105
|
+
console.error(`\nRun \`${runner} ethlete-agents sync\` and commit the result.`);
|
|
93
106
|
return 1;
|
|
94
107
|
};
|
|
95
108
|
exports.check = check;
|