@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,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.outputStyleCommand = void 0;
|
|
4
|
+
const output_style_1 = require("./output-style");
|
|
5
|
+
const FLAGS_WITH_VALUE = ['--config-dir'];
|
|
6
|
+
const positionalArgs = (args) => args.filter((entry, index) => { var _a; return !entry.startsWith('--') && !FLAGS_WITH_VALUE.includes((_a = args[index - 1]) !== null && _a !== void 0 ? _a : ''); });
|
|
7
|
+
const flagValue = (args, flag) => {
|
|
8
|
+
const index = args.indexOf(flag);
|
|
9
|
+
return index === -1 ? undefined : args[index + 1];
|
|
10
|
+
};
|
|
11
|
+
const usage = () => `ethlete-agents output-style — install an Ethlete output style into Claude Code
|
|
12
|
+
|
|
13
|
+
An output style replaces Claude Code's own answer style for every session, so it is written
|
|
14
|
+
into the machine's Claude config rather than into a repository.
|
|
15
|
+
|
|
16
|
+
output-style [name] Install the style and switch Claude Code to it
|
|
17
|
+
(default: ${output_style_1.DEFAULT_OUTPUT_STYLE})
|
|
18
|
+
|
|
19
|
+
Options
|
|
20
|
+
--no-activate Write the file, but leave "outputStyle" in settings.json alone
|
|
21
|
+
--remove Delete the style file and stop using it
|
|
22
|
+
--force Overwrite (or delete) a style file this command did not write
|
|
23
|
+
--dry-run Print what would change without writing
|
|
24
|
+
--config-dir <path> Claude's config directory (default: $CLAUDE_CONFIG_DIR, else ~/.claude)
|
|
25
|
+
|
|
26
|
+
Ships: ${(0, output_style_1.availableOutputStyles)().join(', ') || 'nothing'}
|
|
27
|
+
|
|
28
|
+
Claude Code only. Codex has no output-style mechanism - everything it is told comes from
|
|
29
|
+
AGENTS.md, which \`ethlete-agents sync\` already writes.
|
|
30
|
+
`;
|
|
31
|
+
const describe = (file) => ` ${file.action.padEnd(6)} ${file.path}`;
|
|
32
|
+
const outputStyleCommand = (options) => {
|
|
33
|
+
const { argv } = options;
|
|
34
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
35
|
+
console.log(usage());
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
const plan = (0, output_style_1.planOutputStyle)({
|
|
39
|
+
name: positionalArgs(argv)[0],
|
|
40
|
+
configDir: flagValue(argv, '--config-dir'),
|
|
41
|
+
activate: !argv.includes('--no-activate'),
|
|
42
|
+
remove: argv.includes('--remove'),
|
|
43
|
+
force: argv.includes('--force'),
|
|
44
|
+
});
|
|
45
|
+
console.log(`Style ${plan.name}`);
|
|
46
|
+
console.log(`Config ${plan.configDir}`);
|
|
47
|
+
if (plan.conflict) {
|
|
48
|
+
console.error(plan.conflict);
|
|
49
|
+
return 1;
|
|
50
|
+
}
|
|
51
|
+
if (plan.files.length === 0) {
|
|
52
|
+
console.log(argv.includes('--remove') ? 'It is not installed here.' : 'Already installed and in use.');
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
plan.files.forEach((file) => console.log(describe(file)));
|
|
56
|
+
if (argv.includes('--dry-run')) {
|
|
57
|
+
console.log(`\n${plan.files.length} file(s) would change. Re-run without --dry-run to apply.`);
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
(0, output_style_1.applyOutputStylePlan)(plan);
|
|
61
|
+
if (argv.includes('--remove')) {
|
|
62
|
+
console.log('\nRemoved. A session that is already open keeps the style until it restarts.');
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
console.log(`\nInstalled. Start a new session, or run \`/output-style ${plan.name}\`, to use it.`);
|
|
66
|
+
return 0;
|
|
67
|
+
};
|
|
68
|
+
exports.outputStyleCommand = outputStyleCommand;
|
|
69
|
+
//# sourceMappingURL=output-style-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-style-command.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/output-style-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const DEFAULT_OUTPUT_STYLE = "ste-clarity";
|
|
2
|
+
/** Claude Code reads `~/.claude`, or `CLAUDE_CONFIG_DIR` when it is set; an explicit path wins over both. */
|
|
3
|
+
export declare const resolveClaudeConfigDir: (override?: string) => string;
|
|
4
|
+
export declare const availableOutputStyles: (contentRoot?: string) => string[];
|
|
5
|
+
/** `contents` is `null` exactly when the action is `remove`. */
|
|
6
|
+
export type PlannedOutputStyleFile = {
|
|
7
|
+
path: string;
|
|
8
|
+
action: 'create' | 'update' | 'remove';
|
|
9
|
+
contents: string | null;
|
|
10
|
+
};
|
|
11
|
+
export type OutputStylePlan = {
|
|
12
|
+
name: string;
|
|
13
|
+
configDir: string;
|
|
14
|
+
stylePath: string;
|
|
15
|
+
settingsPath: string;
|
|
16
|
+
/** The style Claude Code is set to now, before this plan is applied. */
|
|
17
|
+
activeStyle: string | null;
|
|
18
|
+
files: PlannedOutputStyleFile[];
|
|
19
|
+
/** Set when the installed file is not this command's own; nothing is planned until `force`. */
|
|
20
|
+
conflict: string | null;
|
|
21
|
+
};
|
|
22
|
+
export type OutputStyleOptions = {
|
|
23
|
+
name?: string;
|
|
24
|
+
configDir?: string;
|
|
25
|
+
/** Also point `outputStyle` in `settings.json` at the style (default). */
|
|
26
|
+
activate?: boolean;
|
|
27
|
+
remove?: boolean;
|
|
28
|
+
/** Overwrite or delete a style file this command did not write. */
|
|
29
|
+
force?: boolean;
|
|
30
|
+
contentRoot?: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* What an install (or a `remove`) would write into Claude Code's user config, without touching
|
|
34
|
+
* disk. A style file that someone else wrote is reported as a conflict rather than overwritten -
|
|
35
|
+
* the name is a plain file name, so a hand-written style can carry it.
|
|
36
|
+
*/
|
|
37
|
+
export declare const planOutputStyle: (options?: OutputStyleOptions) => OutputStylePlan;
|
|
38
|
+
export declare const applyOutputStylePlan: (plan: OutputStylePlan) => void;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyOutputStylePlan = exports.planOutputStyle = exports.availableOutputStyles = exports.resolveClaudeConfigDir = exports.DEFAULT_OUTPUT_STYLE = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const os_1 = require("os");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const load_content_1 = require("./load-content");
|
|
8
|
+
exports.DEFAULT_OUTPUT_STYLE = 'ste-clarity';
|
|
9
|
+
const CONTENT_DIR = 'output-styles';
|
|
10
|
+
const MARKER_PREFIX = '<!-- @ethlete/agent-rules output style';
|
|
11
|
+
const marker = (name) => `${MARKER_PREFIX} "${name}" — installed by \`ethlete-agents output-style\`. Re-run it to update; edits here are overwritten. -->`;
|
|
12
|
+
/** Claude Code reads `~/.claude`, or `CLAUDE_CONFIG_DIR` when it is set; an explicit path wins over both. */
|
|
13
|
+
const resolveClaudeConfigDir = (override) => { var _a; return (override === null || override === void 0 ? void 0 : override.trim()) || ((_a = process.env['CLAUDE_CONFIG_DIR']) === null || _a === void 0 ? void 0 : _a.trim()) || (0, path_1.join)((0, os_1.homedir)(), '.claude'); };
|
|
14
|
+
exports.resolveClaudeConfigDir = resolveClaudeConfigDir;
|
|
15
|
+
const availableOutputStyles = (contentRoot = (0, load_content_1.resolveContentRoot)()) => {
|
|
16
|
+
const dir = (0, path_1.join)(contentRoot, CONTENT_DIR);
|
|
17
|
+
if (!(0, fs_1.existsSync)(dir))
|
|
18
|
+
return [];
|
|
19
|
+
return (0, fs_1.readdirSync)(dir)
|
|
20
|
+
.filter((entry) => entry.endsWith('.md'))
|
|
21
|
+
.map((entry) => entry.slice(0, -'.md'.length))
|
|
22
|
+
.sort();
|
|
23
|
+
};
|
|
24
|
+
exports.availableOutputStyles = availableOutputStyles;
|
|
25
|
+
const FRONTMATTER = /^(---\n[\s\S]*?\n---)\n?([\s\S]*)$/;
|
|
26
|
+
/**
|
|
27
|
+
* The marker sits after the frontmatter, never before it: Claude Code only reads a style's `name`
|
|
28
|
+
* and `description` when the file opens with the fence.
|
|
29
|
+
*/
|
|
30
|
+
const withMarker = (raw, name) => {
|
|
31
|
+
var _a;
|
|
32
|
+
const source = raw.replace(/\r\n/g, '\n').trim();
|
|
33
|
+
const parts = FRONTMATTER.exec(source);
|
|
34
|
+
if (!parts)
|
|
35
|
+
return `${marker(name)}\n\n${source}\n`;
|
|
36
|
+
return `${parts[1]}\n\n${marker(name)}\n\n${((_a = parts[2]) !== null && _a !== void 0 ? _a : '').trim()}\n`;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Two files count as the same style when they hold the same text in any layout, so a copy that
|
|
40
|
+
* predates the marker is still recognised as this command's own. Whitespace and the width of a
|
|
41
|
+
* table's separator row are both layout: Prettier pads both, and neither changes what Claude reads.
|
|
42
|
+
*/
|
|
43
|
+
const normalize = (contents) => contents
|
|
44
|
+
.split('\n')
|
|
45
|
+
.filter((line) => !line.startsWith(MARKER_PREFIX))
|
|
46
|
+
.join(' ')
|
|
47
|
+
.replace(/-{3,}/g, '---')
|
|
48
|
+
.replace(/\s+/g, ' ')
|
|
49
|
+
.trim();
|
|
50
|
+
const readShippedStyle = (name, contentRoot) => {
|
|
51
|
+
const path = (0, path_1.join)(contentRoot, CONTENT_DIR, `${name}.md`);
|
|
52
|
+
if (!(0, fs_1.existsSync)(path)) {
|
|
53
|
+
const known = (0, exports.availableOutputStyles)(contentRoot);
|
|
54
|
+
throw new Error(`Unknown output style "${name}". This package ships: ${known.join(', ') || 'none'}.`);
|
|
55
|
+
}
|
|
56
|
+
return (0, fs_1.readFileSync)(path, 'utf8');
|
|
57
|
+
};
|
|
58
|
+
const readSettings = (path) => {
|
|
59
|
+
const raw = (0, fs_1.existsSync)(path) ? (0, fs_1.readFileSync)(path, 'utf8') : '';
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(raw.trim() || '{}');
|
|
62
|
+
}
|
|
63
|
+
catch (_a) {
|
|
64
|
+
throw new Error(`${path} is not valid JSON. Fix the file, then run this again.`);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const withOutputStyle = (settings, name) => {
|
|
68
|
+
const next = Object.assign({}, settings);
|
|
69
|
+
if (name)
|
|
70
|
+
next.outputStyle = name;
|
|
71
|
+
else
|
|
72
|
+
delete next.outputStyle;
|
|
73
|
+
return `${JSON.stringify(next, null, 2)}\n`;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* What an install (or a `remove`) would write into Claude Code's user config, without touching
|
|
77
|
+
* disk. A style file that someone else wrote is reported as a conflict rather than overwritten -
|
|
78
|
+
* the name is a plain file name, so a hand-written style can carry it.
|
|
79
|
+
*/
|
|
80
|
+
const planOutputStyle = (options = {}) => {
|
|
81
|
+
var _a, _b;
|
|
82
|
+
const name = ((_a = options.name) === null || _a === void 0 ? void 0 : _a.trim()) || exports.DEFAULT_OUTPUT_STYLE;
|
|
83
|
+
if (!/^[A-Za-z0-9][\w.-]*$/.test(name)) {
|
|
84
|
+
throw new Error(`Invalid output style name "${name}". Use letters, digits, ".", "_" and "-".`);
|
|
85
|
+
}
|
|
86
|
+
const configDir = (0, exports.resolveClaudeConfigDir)(options.configDir);
|
|
87
|
+
const stylePath = (0, path_1.join)(configDir, CONTENT_DIR, `${name}.md`);
|
|
88
|
+
const settingsPath = (0, path_1.join)(configDir, 'settings.json');
|
|
89
|
+
const settings = readSettings(settingsPath);
|
|
90
|
+
const activeStyle = typeof settings.outputStyle === 'string' ? settings.outputStyle : null;
|
|
91
|
+
const installed = (0, fs_1.existsSync)(stylePath) ? (0, fs_1.readFileSync)(stylePath, 'utf8') : null;
|
|
92
|
+
const contentRoot = (_b = options.contentRoot) !== null && _b !== void 0 ? _b : (0, load_content_1.resolveContentRoot)();
|
|
93
|
+
const shipped = options.remove && !(0, exports.availableOutputStyles)(contentRoot).includes(name)
|
|
94
|
+
? null
|
|
95
|
+
: withMarker(readShippedStyle(name, contentRoot), name);
|
|
96
|
+
const ours = installed === null ||
|
|
97
|
+
installed.includes(MARKER_PREFIX) ||
|
|
98
|
+
(shipped !== null && normalize(installed) === normalize(shipped));
|
|
99
|
+
const plan = { name, configDir, stylePath, settingsPath, activeStyle };
|
|
100
|
+
if (!ours && !options.force) {
|
|
101
|
+
const verb = options.remove ? 'delete' : 'overwrite';
|
|
102
|
+
return Object.assign(Object.assign({}, plan), { files: [], conflict: `${stylePath} was not written by this command. Pass --force to ${verb} it, or rename your own style.` });
|
|
103
|
+
}
|
|
104
|
+
const files = [];
|
|
105
|
+
const settingsAction = (0, fs_1.existsSync)(settingsPath) ? 'update' : 'create';
|
|
106
|
+
if (options.remove) {
|
|
107
|
+
if (installed !== null)
|
|
108
|
+
files.push({ path: stylePath, action: 'remove', contents: null });
|
|
109
|
+
if (activeStyle === name) {
|
|
110
|
+
files.push({ path: settingsPath, action: settingsAction, contents: withOutputStyle(settings, null) });
|
|
111
|
+
}
|
|
112
|
+
return Object.assign(Object.assign({}, plan), { files, conflict: null });
|
|
113
|
+
}
|
|
114
|
+
if (shipped !== null && installed !== shipped) {
|
|
115
|
+
files.push({ path: stylePath, action: installed === null ? 'create' : 'update', contents: shipped });
|
|
116
|
+
}
|
|
117
|
+
if (options.activate !== false && activeStyle !== name) {
|
|
118
|
+
files.push({ path: settingsPath, action: settingsAction, contents: withOutputStyle(settings, name) });
|
|
119
|
+
}
|
|
120
|
+
return Object.assign(Object.assign({}, plan), { files, conflict: null });
|
|
121
|
+
};
|
|
122
|
+
exports.planOutputStyle = planOutputStyle;
|
|
123
|
+
const applyOutputStylePlan = (plan) => {
|
|
124
|
+
for (const file of plan.files) {
|
|
125
|
+
if (file.contents === null) {
|
|
126
|
+
(0, fs_1.rmSync)(file.path, { force: true });
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(file.path), { recursive: true });
|
|
130
|
+
(0, fs_1.writeFileSync)(file.path, file.contents, 'utf8');
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
exports.applyOutputStylePlan = applyOutputStylePlan;
|
|
134
|
+
//# sourceMappingURL=output-style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-style.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/output-style.ts"],"names":[],"mappings":"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"}
|
package/src/lib/owned-paths.js
CHANGED
|
@@ -5,7 +5,7 @@ const fs_1 = require("fs");
|
|
|
5
5
|
const path_1 = require("path");
|
|
6
6
|
// `.agents/ethlete` and `.github/instructions/ethlete-*` are no longer emitted, but stay owned so
|
|
7
7
|
// a sync prunes them from repos generated by older versions.
|
|
8
|
-
const OWNED_DIRECTORIES = ['.agents/ethlete', '.claude/rules/ethlete', '.claude/hooks/ethlete'];
|
|
8
|
+
const OWNED_DIRECTORIES = ['.agents/ethlete', '.claude/rules/ethlete', '.claude/hooks/ethlete', '.codex/hooks/ethlete'];
|
|
9
9
|
const OWNED_PARENTS = [
|
|
10
10
|
{ dir: '.agents/skills', match: (entry) => entry.startsWith('ethlete-') },
|
|
11
11
|
{ dir: '.claude/skills', match: (entry) => entry.startsWith('ethlete-') },
|
|
@@ -15,12 +15,32 @@ const OWNED_PARENTS = [
|
|
|
15
15
|
match: (entry) => entry.startsWith('ethlete-') && entry.endsWith('.instructions.md'),
|
|
16
16
|
},
|
|
17
17
|
];
|
|
18
|
+
/**
|
|
19
|
+
* Files that exist only to register hooks: once the last generated entry is removed the merge
|
|
20
|
+
* leaves `{}` behind, which is ours to clean up. Any hand-written entry keeps the file non-empty
|
|
21
|
+
* and therefore unowned.
|
|
22
|
+
*/
|
|
23
|
+
const OWNED_WHEN_EMPTY = ['.codex/hooks.json'];
|
|
24
|
+
const isEmptyObject = (absolute) => {
|
|
25
|
+
if (!(0, fs_1.existsSync)(absolute))
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
const parsed = JSON.parse((0, fs_1.readFileSync)(absolute, 'utf8'));
|
|
29
|
+
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed) && Object.keys(parsed).length === 0;
|
|
30
|
+
}
|
|
31
|
+
catch (_a) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
18
35
|
const walk = (root, absoluteDir) => {
|
|
19
36
|
if (!(0, fs_1.existsSync)(absoluteDir))
|
|
20
37
|
return [];
|
|
21
38
|
return (0, fs_1.readdirSync)(absoluteDir).flatMap((entry) => {
|
|
22
39
|
const absolute = (0, path_1.join)(absoluteDir, entry);
|
|
23
|
-
|
|
40
|
+
const stats = (0, fs_1.lstatSync)(absolute);
|
|
41
|
+
if (stats.isSymbolicLink())
|
|
42
|
+
return [];
|
|
43
|
+
if (stats.isDirectory())
|
|
24
44
|
return walk(root, absolute);
|
|
25
45
|
return [(0, path_1.relative)(root, absolute).split(path_1.sep).join('/')];
|
|
26
46
|
});
|
|
@@ -41,9 +61,13 @@ const collectOwnedPaths = (root) => {
|
|
|
41
61
|
if (!parent.match(entry))
|
|
42
62
|
continue;
|
|
43
63
|
const absolute = (0, path_1.join)(absoluteParent, entry);
|
|
44
|
-
|
|
64
|
+
const stats = (0, fs_1.lstatSync)(absolute);
|
|
65
|
+
if (stats.isSymbolicLink())
|
|
66
|
+
continue;
|
|
67
|
+
owned.push(...(stats.isDirectory() ? walk(root, absolute) : [`${parent.dir}/${entry}`]));
|
|
45
68
|
}
|
|
46
69
|
}
|
|
70
|
+
owned.push(...OWNED_WHEN_EMPTY.filter((path) => isEmptyObject((0, path_1.join)(root, path))));
|
|
47
71
|
return owned;
|
|
48
72
|
};
|
|
49
73
|
exports.collectOwnedPaths = collectOwnedPaths;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owned-paths.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/owned-paths.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"owned-paths.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/owned-paths.ts"],"names":[],"mappings":";;;AAAA,2BAAsE;AACtE,+BAA2C;AAE3C,kGAAkG;AAClG,6DAA6D;AAC7D,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,sBAAsB,CAAC,CAAC;AACxH,MAAM,aAAa,GAAG;IACpB,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;IACjF,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;IACjF,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;IAC1G;QACE,GAAG,EAAE,sBAAsB;QAC3B,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC7F;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAE/C,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,EAAE;IACzC,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAY,CAAC;QAErE,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACrH,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAY,EAAE;IAC3D,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,OAAO,IAAA,gBAAW,EAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAChD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAA,cAAS,EAAC,QAAQ,CAAC,CAAC;QAElC,IAAI,KAAK,CAAC,cAAc,EAAE;YAAE,OAAO,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAErD,OAAO,CAAC,IAAA,eAAQ,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,UAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;GAKG;AACI,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE;IAChD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAA,WAAI,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAE9E,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,IAAA,WAAI,EAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,CAAC,IAAA,eAAU,EAAC,cAAc,CAAC;YAAE,SAAS;QAE1C,KAAK,MAAM,KAAK,IAAI,IAAA,gBAAW,EAAC,cAAc,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YAEnC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAA,cAAS,EAAC,QAAQ,CAAC,CAAC;YAElC,IAAI,KAAK,CAAC,cAAc,EAAE;gBAAE,SAAS;YAErC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAA,WAAI,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAvBW,QAAA,iBAAiB,qBAuB5B"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const detectPackageRunner: (root: string) => "yarn" | "pnpm exec" | "bunx" | "npx";
|
|
2
|
+
export declare const readScripts: (root: string) => Set<string> | undefined;
|
|
3
|
+
export declare const detectCommandVars: (root: string) => Record<string, string>;
|
|
4
|
+
export declare const followPackageManager: (root: string, vars: Record<string, string | string[]>) => any;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.followPackageManager = exports.detectCommandVars = exports.readScripts = exports.detectPackageRunner = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const RUNNERS = { yarn: 'yarn', pnpm: 'pnpm exec', bun: 'bunx', npm: 'npx' };
|
|
7
|
+
const LOCKFILES = [
|
|
8
|
+
['yarn.lock', 'yarn'],
|
|
9
|
+
['pnpm-lock.yaml', 'pnpm'],
|
|
10
|
+
['bun.lock', 'bun'],
|
|
11
|
+
['bun.lockb', 'bun'],
|
|
12
|
+
['package-lock.json', 'npm'],
|
|
13
|
+
];
|
|
14
|
+
const readManifest = (root) => {
|
|
15
|
+
const path = (0, path_1.join)(root, 'package.json');
|
|
16
|
+
if (!(0, fs_1.existsSync)(path))
|
|
17
|
+
return undefined;
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse((0, fs_1.readFileSync)(path, 'utf8'));
|
|
20
|
+
}
|
|
21
|
+
catch (_a) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const declaredManager = (root) => {
|
|
26
|
+
var _a;
|
|
27
|
+
const packageManager = (_a = readManifest(root)) === null || _a === void 0 ? void 0 : _a.packageManager;
|
|
28
|
+
if (typeof packageManager !== 'string')
|
|
29
|
+
return undefined;
|
|
30
|
+
return Object.keys(RUNNERS).find((name) => packageManager.startsWith(`${name}@`));
|
|
31
|
+
};
|
|
32
|
+
const detectPackageManagerName = (root) => { var _a, _b, _c; return (_c = (_a = declaredManager(root)) !== null && _a !== void 0 ? _a : (_b = LOCKFILES.find(([fileName]) => (0, fs_1.existsSync)((0, path_1.join)(root, fileName)))) === null || _b === void 0 ? void 0 : _b[1]) !== null && _c !== void 0 ? _c : 'npm'; };
|
|
33
|
+
const detectPackageRunner = (root) => RUNNERS[detectPackageManagerName(root)];
|
|
34
|
+
exports.detectPackageRunner = detectPackageRunner;
|
|
35
|
+
const readScripts = (root) => {
|
|
36
|
+
const manifest = readManifest(root);
|
|
37
|
+
if (!manifest)
|
|
38
|
+
return undefined;
|
|
39
|
+
return new Set(manifest.scripts && typeof manifest.scripts === 'object' ? Object.keys(manifest.scripts) : []);
|
|
40
|
+
};
|
|
41
|
+
exports.readScripts = readScripts;
|
|
42
|
+
const SCRIPT_RUNNERS = {
|
|
43
|
+
yarn: 'yarn run',
|
|
44
|
+
pnpm: 'pnpm run',
|
|
45
|
+
bun: 'bun run',
|
|
46
|
+
npm: 'npm run',
|
|
47
|
+
};
|
|
48
|
+
const detectCommandVars = (root) => {
|
|
49
|
+
var _a, _b, _c, _d;
|
|
50
|
+
const manager = detectPackageManagerName(root);
|
|
51
|
+
const manifest = readManifest(root);
|
|
52
|
+
const scripts = (_a = (0, exports.readScripts)(root)) !== null && _a !== void 0 ? _a : new Set();
|
|
53
|
+
const script = (name, ...args) => [SCRIPT_RUNNERS[manager], name, ...(args.length && manager === 'npm' ? ['--'] : []), ...args].join(' ');
|
|
54
|
+
const hasNx = Boolean((_c = (_b = manifest === null || manifest === void 0 ? void 0 : manifest.devDependencies) === null || _b === void 0 ? void 0 : _b['nx']) !== null && _c !== void 0 ? _c : (_d = manifest === null || manifest === void 0 ? void 0 : manifest.dependencies) === null || _d === void 0 ? void 0 : _d['nx']) || (0, fs_1.existsSync)((0, path_1.join)(root, 'nx.json'));
|
|
55
|
+
const vars = {};
|
|
56
|
+
if (scripts.has('lint')) {
|
|
57
|
+
vars['lintCommand'] = script('lint');
|
|
58
|
+
vars['lintFixCommand'] = script('lint', '--fix');
|
|
59
|
+
}
|
|
60
|
+
else if (hasNx) {
|
|
61
|
+
vars['lintCommand'] = `${RUNNERS[manager]} nx lint <project>`;
|
|
62
|
+
vars['lintFixCommand'] = `${RUNNERS[manager]} nx lint <project> --fix`;
|
|
63
|
+
}
|
|
64
|
+
if (scripts.has('storybook'))
|
|
65
|
+
vars['storybookStartCommand'] = script('storybook');
|
|
66
|
+
return vars;
|
|
67
|
+
};
|
|
68
|
+
exports.detectCommandVars = detectCommandVars;
|
|
69
|
+
const NPM_COMMAND = /^npm run (\S+)(?: -- (.*))?$/;
|
|
70
|
+
const followPackageManager = (root, vars) => {
|
|
71
|
+
const manager = detectPackageManagerName(root);
|
|
72
|
+
if (manager === 'npm')
|
|
73
|
+
return vars;
|
|
74
|
+
return Object.fromEntries(Object.entries(vars).map(([name, value]) => {
|
|
75
|
+
if (typeof value !== 'string')
|
|
76
|
+
return [name, value];
|
|
77
|
+
const script = NPM_COMMAND.exec(value);
|
|
78
|
+
if (script)
|
|
79
|
+
return [name, [SCRIPT_RUNNERS[manager], script[1], script[2]].filter(Boolean).join(' ')];
|
|
80
|
+
if (value.startsWith('npx '))
|
|
81
|
+
return [name, `${RUNNERS[manager]} ${value.slice(4)}`];
|
|
82
|
+
return [name, value];
|
|
83
|
+
}));
|
|
84
|
+
};
|
|
85
|
+
exports.followPackageManager = followPackageManager;
|
|
86
|
+
//# sourceMappingURL=package-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-runner.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/package-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One line as a terminal prints it literally.
|
|
3
|
+
*
|
|
4
|
+
* A Jira summary, a stand-in name and an error message all reach the terminal as somebody typed them.
|
|
5
|
+
* An escape sequence in one of them can clear the screen, move the cursor or redraw a line that has
|
|
6
|
+
* already been printed, so output could be made to say something the app never answered. Every control
|
|
7
|
+
* character apart from tab and newline is printed as its own escaped form instead.
|
|
8
|
+
*/
|
|
9
|
+
export declare const plain: (text: string) => string;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.plain = void 0;
|
|
4
|
+
/** Tab and newline are the only control characters a printed line may hold. */
|
|
5
|
+
const isControl = (code) => (code < 0x20 ? code !== 0x09 && code !== 0x0a : code >= 0x7f && code <= 0x9f);
|
|
6
|
+
/**
|
|
7
|
+
* One line as a terminal prints it literally.
|
|
8
|
+
*
|
|
9
|
+
* A Jira summary, a stand-in name and an error message all reach the terminal as somebody typed them.
|
|
10
|
+
* An escape sequence in one of them can clear the screen, move the cursor or redraw a line that has
|
|
11
|
+
* already been printed, so output could be made to say something the app never answered. Every control
|
|
12
|
+
* character apart from tab and newline is printed as its own escaped form instead.
|
|
13
|
+
*/
|
|
14
|
+
const plain = (text) => [...text]
|
|
15
|
+
.map((character) => {
|
|
16
|
+
var _a;
|
|
17
|
+
const code = (_a = character.codePointAt(0)) !== null && _a !== void 0 ? _a : 0;
|
|
18
|
+
return isControl(code) ? `\\x${code.toString(16).padStart(2, '0')}` : character;
|
|
19
|
+
})
|
|
20
|
+
.join('');
|
|
21
|
+
exports.plain = plain;
|
|
22
|
+
//# sourceMappingURL=plain-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plain-text.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/plain-text.ts"],"names":[],"mappings":";;;AAAA,+EAA+E;AAC/E,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;AAElH;;;;;;;GAOG;AACI,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CACpC,CAAC,GAAG,IAAI,CAAC;KACN,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;;IACjB,MAAM,IAAI,GAAG,MAAA,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC;IAE3C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAClF,CAAC,CAAC;KACD,IAAI,CAAC,EAAE,CAAC,CAAC;AAPD,QAAA,KAAK,SAOJ"}
|
package/src/lib/plan.d.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { SyncConfig } from './config';
|
|
2
2
|
import { SkippedItem } from './filter';
|
|
3
|
+
import { ContentItem } from './load-content';
|
|
3
4
|
import { EmittedFile } from './targets/shared';
|
|
4
5
|
export type SyncPlan = {
|
|
5
6
|
files: EmittedFile[];
|
|
6
7
|
skipped: SkippedItem[];
|
|
7
|
-
/** Cross-references whose target was filtered out of this repo; rendered as a bare name. */
|
|
8
|
-
danglingLinks: {
|
|
9
|
-
from: string;
|
|
10
|
-
to: string;
|
|
11
|
-
}[];
|
|
12
8
|
/** Config/repo mismatches that won't fail the run but will silently lose content if ignored. */
|
|
13
9
|
warnings: string[];
|
|
14
10
|
};
|
|
11
|
+
export declare const assertResolvedContentReferences: (options: {
|
|
12
|
+
items: ContentItem[];
|
|
13
|
+
kept: ContentItem[];
|
|
14
|
+
skipped: SkippedItem[];
|
|
15
|
+
}) => void;
|
|
15
16
|
/** `@AGENTS.md` on its own line (the documented import syntax), or a symlink pointing at it. */
|
|
16
17
|
export declare const claudeMdImportsAgentsMd: (root: string) => boolean;
|
|
17
18
|
/**
|
|
@@ -20,5 +21,4 @@ export declare const claudeMdImportsAgentsMd: (root: string) => boolean;
|
|
|
20
21
|
*/
|
|
21
22
|
export declare const buildPlan: (options: {
|
|
22
23
|
config: SyncConfig;
|
|
23
|
-
version: string;
|
|
24
24
|
}) => SyncPlan;
|