@ethlete/agent-rules 0.1.0-next.5 → 0.1.0-next.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +167 -3
- package/content/git-hooks/post-checkout.sh +10 -0
- package/content/git-hooks/pre-push.sh +5 -0
- package/content/hooks/context-warning.py +39 -11
- package/content/skills/git-flow/SKILL.md +83 -0
- package/content/skills/handoff/SKILL.md +4 -0
- package/content/skills/query/SKILL.md +17 -13
- package/package.json +12 -1
- package/src/index.js +10 -5
- package/src/index.js.map +1 -1
- package/src/lib/config.d.ts +28 -0
- package/src/lib/config.js +20 -3
- package/src/lib/config.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 +5 -0
- package/src/lib/git-flow/index.js +9 -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 +274 -0
- package/src/lib/git-flow/parse.js.map +1 -0
- package/src/lib/git-flow/start.d.ts +22 -0
- package/src/lib/git-flow/start.js +24 -0
- package/src/lib/git-flow/start.js.map +1 -0
- package/src/lib/git-flow/validate.d.ts +34 -0
- package/src/lib/git-flow/validate.js +72 -0
- package/src/lib/git-flow/validate.js.map +1 -0
- package/src/lib/git-flow-command.d.ts +4 -0
- package/src/lib/git-flow-command.js +157 -0
- package/src/lib/git-flow-command.js.map +1 -0
- package/src/lib/git-flow-repair.d.ts +17 -0
- package/src/lib/git-flow-repair.js +150 -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 +147 -0
- package/src/lib/git-flow-start.js.map +1 -0
- package/src/lib/git.d.ts +27 -0
- package/src/lib/git.js +49 -0
- package/src/lib/git.js.map +1 -0
- package/src/lib/gitlab.d.ts +35 -0
- package/src/lib/gitlab.js +98 -0
- package/src/lib/gitlab.js.map +1 -0
- package/src/lib/jira.d.ts +28 -0
- package/src/lib/jira.js +83 -0
- package/src/lib/jira.js.map +1 -0
- package/src/lib/plan.js +20 -2
- package/src/lib/plan.js.map +1 -1
- package/src/lib/prompt.d.ts +8 -0
- package/src/lib/prompt.js +27 -0
- package/src/lib/prompt.js.map +1 -0
- package/src/lib/render.d.ts +12 -1
- package/src/lib/render.js +23 -6
- package/src/lib/render.js.map +1 -1
- package/src/lib/targets/git-hooks.d.ts +25 -0
- package/src/lib/targets/git-hooks.js +70 -0
- package/src/lib/targets/git-hooks.js.map +1 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.confirm = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const promises_1 = require("readline/promises");
|
|
6
|
+
/**
|
|
7
|
+
* Without a TTY there is nobody to ask, so an unattended run must pass `--yes` explicitly rather
|
|
8
|
+
* than have silence read as consent.
|
|
9
|
+
*/
|
|
10
|
+
const confirm = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
11
|
+
if (options.assumeYes)
|
|
12
|
+
return true;
|
|
13
|
+
if (!process.stdin.isTTY) {
|
|
14
|
+
console.error('Nothing to prompt on (no TTY). Re-run with --yes to proceed unattended.');
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const readline = (0, promises_1.createInterface)({ input: process.stdin, output: process.stdout });
|
|
18
|
+
try {
|
|
19
|
+
const answer = yield readline.question(`${options.question} [y/N] `);
|
|
20
|
+
return /^y(es)?$/i.test(answer.trim());
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
readline.close();
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
exports.confirm = confirm;
|
|
27
|
+
//# 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
|
@@ -31,9 +31,20 @@ export declare const renderDescription: (options: {
|
|
|
31
31
|
}) => string;
|
|
32
32
|
/**
|
|
33
33
|
* Rewrites the block between the markers, leaving everything a repo wrote around it untouched.
|
|
34
|
-
* A file without markers gets the block appended.
|
|
34
|
+
* A file without markers gets the block appended. Shell files pass their own `#` markers.
|
|
35
35
|
*/
|
|
36
36
|
export declare const replaceMarkedBlock: (options: {
|
|
37
37
|
existing: string;
|
|
38
38
|
block: string;
|
|
39
|
+
startMarker?: string;
|
|
40
|
+
endMarker?: string;
|
|
41
|
+
}) => string;
|
|
42
|
+
/**
|
|
43
|
+
* Takes the block back out, so switching a generated block off in the config removes it instead of
|
|
44
|
+
* leaving it behind — `sync`'s file-level pruning cannot reach inside a file the repo also owns.
|
|
45
|
+
*/
|
|
46
|
+
export declare const removeMarkedBlock: (options: {
|
|
47
|
+
existing: string;
|
|
48
|
+
startMarker: string;
|
|
49
|
+
endMarker: string;
|
|
39
50
|
}) => 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.buildBanner = exports.END_MARKER = exports.START_MARKER = void 0;
|
|
3
|
+
exports.removeMarkedBlock = exports.replaceMarkedBlock = exports.renderDescription = exports.substituteVars = exports.renderBody = exports.buildBanner = 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.
|
|
@@ -56,18 +56,35 @@ const renderDescription = (options) => (0, exports.substituteVars)({
|
|
|
56
56
|
exports.renderDescription = renderDescription;
|
|
57
57
|
/**
|
|
58
58
|
* Rewrites the block between the markers, leaving everything a repo wrote around it untouched.
|
|
59
|
-
* A file without markers gets the block appended.
|
|
59
|
+
* A file without markers gets the block appended. Shell files pass their own `#` markers.
|
|
60
60
|
*/
|
|
61
61
|
const replaceMarkedBlock = (options) => {
|
|
62
|
+
var _a, _b;
|
|
62
63
|
const { existing, block } = options;
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
const
|
|
64
|
+
const startMarker = (_a = options.startMarker) !== null && _a !== void 0 ? _a : exports.START_MARKER;
|
|
65
|
+
const endMarker = (_b = options.endMarker) !== null && _b !== void 0 ? _b : exports.END_MARKER;
|
|
66
|
+
const wrapped = `${startMarker}\n${block}\n${endMarker}`;
|
|
67
|
+
const start = existing.indexOf(startMarker);
|
|
68
|
+
const end = existing.indexOf(endMarker);
|
|
66
69
|
if (start === -1 || end === -1 || end < start) {
|
|
67
70
|
const separator = existing.trim().length > 0 ? `${existing.trimEnd()}\n\n` : '';
|
|
68
71
|
return `${separator}${wrapped}\n`;
|
|
69
72
|
}
|
|
70
|
-
return `${existing.slice(0, start)}${wrapped}${existing.slice(end +
|
|
73
|
+
return `${existing.slice(0, start)}${wrapped}${existing.slice(end + endMarker.length)}`;
|
|
71
74
|
};
|
|
72
75
|
exports.replaceMarkedBlock = replaceMarkedBlock;
|
|
76
|
+
/**
|
|
77
|
+
* Takes the block back out, so switching a generated block off in the config removes it instead of
|
|
78
|
+
* leaving it behind — `sync`'s file-level pruning cannot reach inside a file the repo also owns.
|
|
79
|
+
*/
|
|
80
|
+
const removeMarkedBlock = (options) => {
|
|
81
|
+
const { existing, startMarker, endMarker } = options;
|
|
82
|
+
const start = existing.indexOf(startMarker);
|
|
83
|
+
const end = existing.indexOf(endMarker);
|
|
84
|
+
if (start === -1 || end === -1 || end < start)
|
|
85
|
+
return existing;
|
|
86
|
+
const kept = `${existing.slice(0, start).trimEnd()}\n${existing.slice(end + endMarker.length).trimStart()}`;
|
|
87
|
+
return kept.trim().length > 0 ? kept : '';
|
|
88
|
+
};
|
|
89
|
+
exports.removeMarkedBlock = removeMarkedBlock;
|
|
73
90
|
//# 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":"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
|
|
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;AAEtD,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,EAAE,CAC7C,2CAA2C,OAAO,sDAAsD,CAAC;AAD9F,QAAA,WAAW,eACmF;AAE3G,MAAM,WAAW,GAAG,CAAC,KAAwB,EAAE,EAAE,CAC/C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAE1E,MAAM,UAAU,GAAG,CAAC,OAI1B,EAAE,EAAE;IACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QACzE,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE/C,IAAI,SAAS,KAAK,OAAO,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEpE,IAAI,SAAS,KAAK,UAAU,IAAI,QAAQ,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,kCAAkC,KAAK,IAAI,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE9C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,gCAAgC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAhCW,QAAA,UAAU,cAgCrB;AAEF,2FAA2F;AACpF,MAAM,cAAc,GAAG,CAAC,OAAkF,EAAE,EAAE;IACnH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEvC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC1D,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,MAAM,KAAK,4DAA4D,CAAC,CAAC;QACpG,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,kCAAkC,KAAK,IAAI,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAhBW,QAAA,cAAc,kBAgBzB;AAEK,MAAM,iBAAiB,GAAG,CAAC,OAAuE,EAAE,EAAE,CAC3G,IAAA,sBAAc,EAAC;IACb,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW;IAC1C,IAAI,EAAE,OAAO,CAAC,IAAI;IAClB,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,gBAAgB;CACzD,CAAC,CAAC;AALQ,QAAA,iBAAiB,qBAKzB;AAEL;;;GAGG;AACI,MAAM,kBAAkB,GAAG,CAAC,OAKlC,EAAE,EAAE;;IACH,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,WAAW,GAAG,MAAA,OAAO,CAAC,WAAW,mCAAI,oBAAY,CAAC;IACxD,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,SAAS,mCAAI,kBAAU,CAAC;IAClD,MAAM,OAAO,GAAG,GAAG,WAAW,KAAK,KAAK,KAAK,SAAS,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAExC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAEhF,OAAO,GAAG,SAAS,GAAG,OAAO,IAAI,CAAC;IACpC,CAAC;IAED,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1F,CAAC,CAAC;AApBW,QAAA,kBAAkB,sBAoB7B;AAEF;;;GAGG;AACI,MAAM,iBAAiB,GAAG,CAAC,OAAqE,EAAE,EAAE;IACzG,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAExC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK;QAAE,OAAO,QAAQ,CAAC;IAE/D,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;IAE5G,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC,CAAC;AAVW,QAAA,iBAAiB,qBAU5B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EmittedFile } from './shared';
|
|
2
|
+
export declare const HUSKY_DIR = ".husky";
|
|
3
|
+
export declare const START_MARKER = "# ethlete:git-flow:start";
|
|
4
|
+
export declare const END_MARKER = "# ethlete:git-flow:end";
|
|
5
|
+
/**
|
|
6
|
+
* Git hooks a repo can opt into via the config's `gitHooks` array. Like the agent hooks these never
|
|
7
|
+
* default: a generated block that can reject a developer's push is a higher-stakes artifact than a
|
|
8
|
+
* markdown one, so a repo asks for it.
|
|
9
|
+
*/
|
|
10
|
+
export declare const KNOWN_GIT_HOOKS: Record<string, {
|
|
11
|
+
file: string;
|
|
12
|
+
}>;
|
|
13
|
+
export declare const assertKnownGitHooks: (hooks: string[]) => void;
|
|
14
|
+
export declare const huskyHookPath: (name: string) => string;
|
|
15
|
+
/**
|
|
16
|
+
* Appends the check to whatever the repo already has in `.husky/<name>`, between markers — those
|
|
17
|
+
* files routinely hold a git-lfs hook that must keep running and must keep reading stdin first,
|
|
18
|
+
* which is why the appended block never consumes it.
|
|
19
|
+
*/
|
|
20
|
+
export declare const emitGitHooks: (options: {
|
|
21
|
+
gitHooks: string[];
|
|
22
|
+
version: string;
|
|
23
|
+
huskyExists: boolean;
|
|
24
|
+
existing: Record<string, string>;
|
|
25
|
+
}) => EmittedFile[];
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitGitHooks = exports.huskyHookPath = exports.assertKnownGitHooks = exports.KNOWN_GIT_HOOKS = exports.END_MARKER = exports.START_MARKER = exports.HUSKY_DIR = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const load_content_1 = require("../load-content");
|
|
7
|
+
const render_1 = require("../render");
|
|
8
|
+
exports.HUSKY_DIR = '.husky';
|
|
9
|
+
exports.START_MARKER = '# ethlete:git-flow:start';
|
|
10
|
+
exports.END_MARKER = '# ethlete:git-flow:end';
|
|
11
|
+
/**
|
|
12
|
+
* Git hooks a repo can opt into via the config's `gitHooks` array. Like the agent hooks these never
|
|
13
|
+
* default: a generated block that can reject a developer's push is a higher-stakes artifact than a
|
|
14
|
+
* markdown one, so a repo asks for it.
|
|
15
|
+
*/
|
|
16
|
+
exports.KNOWN_GIT_HOOKS = {
|
|
17
|
+
'pre-push': { file: 'pre-push.sh' },
|
|
18
|
+
'post-checkout': { file: 'post-checkout.sh' },
|
|
19
|
+
};
|
|
20
|
+
const assertKnownGitHooks = (hooks) => {
|
|
21
|
+
const unknown = hooks.filter((name) => !(name in exports.KNOWN_GIT_HOOKS));
|
|
22
|
+
if (unknown.length > 0) {
|
|
23
|
+
throw new Error(`Unknown git hook(s): ${unknown.join(', ')}. Known git hooks: ${Object.keys(exports.KNOWN_GIT_HOOKS).join(', ')}.`);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.assertKnownGitHooks = assertKnownGitHooks;
|
|
27
|
+
const huskyHookPath = (name) => `${exports.HUSKY_DIR}/${name}`;
|
|
28
|
+
exports.huskyHookPath = huskyHookPath;
|
|
29
|
+
const SHEBANG = '#!/bin/sh\n';
|
|
30
|
+
const block = (options) => {
|
|
31
|
+
const { file, version } = options;
|
|
32
|
+
const body = (0, fs_1.readFileSync)((0, path_1.join)((0, load_content_1.resolveContentRoot)(), 'git-hooks', file), 'utf8');
|
|
33
|
+
return [
|
|
34
|
+
`# Generated by @ethlete/agent-rules v${version} — DO NOT EDIT between the markers. Run \`npx ethlete-agents sync\`.`,
|
|
35
|
+
'# Set ETHLETE_GIT_FLOW_SKIP=1 to silence it on this machine.',
|
|
36
|
+
body.trimEnd(),
|
|
37
|
+
].join('\n');
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Appends the check to whatever the repo already has in `.husky/<name>`, between markers — those
|
|
41
|
+
* files routinely hold a git-lfs hook that must keep running and must keep reading stdin first,
|
|
42
|
+
* which is why the appended block never consumes it.
|
|
43
|
+
*/
|
|
44
|
+
const emitGitHooks = (options) => {
|
|
45
|
+
const { gitHooks, version, huskyExists, existing } = options;
|
|
46
|
+
if (!huskyExists)
|
|
47
|
+
return [];
|
|
48
|
+
return Object.entries(exports.KNOWN_GIT_HOOKS).flatMap(([name, definition]) => {
|
|
49
|
+
var _a;
|
|
50
|
+
const path = (0, exports.huskyHookPath)(name);
|
|
51
|
+
const current = (_a = existing[name]) !== null && _a !== void 0 ? _a : '';
|
|
52
|
+
if (!gitHooks.includes(name)) {
|
|
53
|
+
const stripped = (0, render_1.removeMarkedBlock)({ existing: current, startMarker: exports.START_MARKER, endMarker: exports.END_MARKER });
|
|
54
|
+
return stripped === current ? [] : [{ path, contents: stripped.trim().length > 0 ? stripped : SHEBANG }];
|
|
55
|
+
}
|
|
56
|
+
return [
|
|
57
|
+
{
|
|
58
|
+
path,
|
|
59
|
+
contents: (0, render_1.replaceMarkedBlock)({
|
|
60
|
+
existing: current.trim().length > 0 ? current : SHEBANG,
|
|
61
|
+
block: block({ file: definition.file, version }),
|
|
62
|
+
startMarker: exports.START_MARKER,
|
|
63
|
+
endMarker: exports.END_MARKER,
|
|
64
|
+
}),
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
exports.emitGitHooks = emitGitHooks;
|
|
70
|
+
//# sourceMappingURL=git-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-hooks.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/git-hooks.ts"],"names":[],"mappings":"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"}
|