@stackbilt/cli 0.1.18 → 0.1.20
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/LICENSE +190 -0
- package/README.md +54 -4
- package/dist/__tests__/hook.test.d.ts +2 -0
- package/dist/__tests__/hook.test.d.ts.map +1 -0
- package/dist/__tests__/hook.test.js +83 -0
- package/dist/__tests__/hook.test.js.map +1 -0
- package/dist/bin.js +0 -0
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +57 -22
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/drift.d.ts.map +1 -1
- package/dist/commands/drift.js +7 -2
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/hook.d.ts +8 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +166 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +16 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +188 -17
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +117 -32
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/why.js +52 -25
- package/dist/commands/why.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUH,
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUH,oCA4EC;AApFD,4CAA8B;AAC9B,gDAAkC;AAElC,oCAAqC;AACrC,sCAAoF;AACpF,4CAAgD;AAGzC,KAAK,UAAU,YAAY,CAAC,OAAmB,EAAE,IAAc;IACpE,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,uCAAuC;gBAChD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;gBAC/B,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC;gBACzD,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,iBAAS,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,qBAAY,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,sBAAsB;gBAC/B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;gBAC/B,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC;gBACzD,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAS,CAAC,OAAO,CAAC;IACzE,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC;IAChD,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEjF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,qCAAqC;gBAC9C,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;gBAC/B,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC;gBACzD,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAS,CAAC,OAAO,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAoB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACxF,MAAM,kBAAkB,GAAG,IAAA,sCAA6B,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG;QACb,MAAM;QACN,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;QAC/B,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC;QACzD,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,kBAAkB;QAClB,GAAG,MAAM;KACV,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC3D,OAAO,iBAAS,CAAC,gBAAgB,CAAC;IACpC,CAAC;IAED,OAAO,iBAAS,CAAC,OAAO,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,MAAmB,EAAE,QAAgB,EAAE,kBAAkC;IAC5F,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,iBAAiB,GAAG,iBAAiB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,YAAY,kBAAkB,MAAM,CAAC,eAAe,WAAW,CAAC,CAAC;IACrG,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,6BAA6B,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;QAE7D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoC,CAAC;QAC5D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAClD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CACnB,QAAgB,EAChB,OAAiB,EACjB,OAAiB;IAEjB,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE7C,SAAS,IAAI,CAAC,GAAW,EAAE,UAAkB;QAC3C,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEpD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxD,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;wBACnD,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;oBAC3B,CAAC;oBAAC,MAAM,CAAC;wBACP,yBAAyB;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAkB;IAC3C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACpC,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,QAAkB;IACzC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACpC,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,IAAc,EAAE,IAAY;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* charter hook
|
|
3
|
+
*
|
|
4
|
+
* Installs git hooks for commit-time governance ergonomics.
|
|
5
|
+
*/
|
|
6
|
+
import type { CLIOptions } from '../index';
|
|
7
|
+
export declare function hookCommand(options: CLIOptions, args: string[]): Promise<number>;
|
|
8
|
+
//# sourceMappingURL=hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA4B3C,wBAAsB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BtF"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* charter hook
|
|
4
|
+
*
|
|
5
|
+
* Installs git hooks for commit-time governance ergonomics.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.hookCommand = hookCommand;
|
|
42
|
+
const node_child_process_1 = require("node:child_process");
|
|
43
|
+
const fs = __importStar(require("node:fs"));
|
|
44
|
+
const path = __importStar(require("node:path"));
|
|
45
|
+
const index_1 = require("../index");
|
|
46
|
+
const COMMIT_MSG_HOOK_MARKER = '# Managed by Charter: commit-msg trailer normalizer';
|
|
47
|
+
const COMMIT_MSG_HOOK_CONTENT = `#!/usr/bin/env sh
|
|
48
|
+
${COMMIT_MSG_HOOK_MARKER}
|
|
49
|
+
set -eu
|
|
50
|
+
|
|
51
|
+
msg_file="$1"
|
|
52
|
+
|
|
53
|
+
governed_by="$(grep -i '^Governed-By:' "$msg_file" | tail -n 1 | sed -E 's/^[Gg]overned-[Bb]y:[[:space:]]*//')"
|
|
54
|
+
resolves_request="$(grep -i '^Resolves-Request:' "$msg_file" | tail -n 1 | sed -E 's/^[Rr]esolves-[Rr]equest:[[:space:]]*//')"
|
|
55
|
+
|
|
56
|
+
if [ -n "$governed_by" ]; then
|
|
57
|
+
git interpret-trailers --in-place --if-exists=replace --trailer "Governed-By: $governed_by" "$msg_file"
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if [ -n "$resolves_request" ]; then
|
|
61
|
+
git interpret-trailers --in-place --if-exists=replace --trailer "Resolves-Request: $resolves_request" "$msg_file"
|
|
62
|
+
fi
|
|
63
|
+
`;
|
|
64
|
+
async function hookCommand(options, args) {
|
|
65
|
+
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
66
|
+
printHelp();
|
|
67
|
+
return index_1.EXIT_CODE.SUCCESS;
|
|
68
|
+
}
|
|
69
|
+
if (args[0] !== 'install') {
|
|
70
|
+
throw new index_1.CLIError(`Unknown hook subcommand: ${args[0]}. Supported: install`);
|
|
71
|
+
}
|
|
72
|
+
if (!args.includes('--commit-msg')) {
|
|
73
|
+
throw new index_1.CLIError('hook install requires --commit-msg.');
|
|
74
|
+
}
|
|
75
|
+
const force = options.yes || args.includes('--force');
|
|
76
|
+
const result = installCommitMsgHook(force);
|
|
77
|
+
if (options.format === 'json') {
|
|
78
|
+
console.log(JSON.stringify(result, null, 2));
|
|
79
|
+
}
|
|
80
|
+
else if (result.status === 'INSTALLED') {
|
|
81
|
+
console.log(` [ok] Installed commit-msg hook at ${result.hookPath}`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.log(` [warn] Skipped commit-msg hook install at ${result.hookPath}: ${result.reason}`);
|
|
85
|
+
console.log(' Re-run with --force (or --yes) to overwrite existing non-Charter hook.');
|
|
86
|
+
}
|
|
87
|
+
return index_1.EXIT_CODE.SUCCESS;
|
|
88
|
+
}
|
|
89
|
+
function installCommitMsgHook(force) {
|
|
90
|
+
ensureGitRepo();
|
|
91
|
+
const hooksDir = resolveHooksDir();
|
|
92
|
+
const hookPath = path.join(hooksDir, 'commit-msg');
|
|
93
|
+
const normalizedHookPath = hookPath.replace(/\\/g, '/');
|
|
94
|
+
const exists = fs.existsSync(hookPath);
|
|
95
|
+
if (exists) {
|
|
96
|
+
const current = fs.readFileSync(hookPath, 'utf-8');
|
|
97
|
+
const managedByCharter = current.includes(COMMIT_MSG_HOOK_MARKER);
|
|
98
|
+
if (!managedByCharter && !force) {
|
|
99
|
+
return {
|
|
100
|
+
status: 'SKIPPED',
|
|
101
|
+
hookPath: normalizedHookPath,
|
|
102
|
+
reason: 'existing commit-msg hook is not managed by Charter',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
fs.mkdirSync(hooksDir, { recursive: true });
|
|
108
|
+
}
|
|
109
|
+
fs.writeFileSync(hookPath, COMMIT_MSG_HOOK_CONTENT);
|
|
110
|
+
setExecutableBit(hookPath);
|
|
111
|
+
return {
|
|
112
|
+
status: 'INSTALLED',
|
|
113
|
+
hookPath: normalizedHookPath,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function resolveHooksDir() {
|
|
117
|
+
const configuredPath = getGitConfig('core.hooksPath');
|
|
118
|
+
if (configuredPath && configuredPath.trim().length > 0) {
|
|
119
|
+
return path.resolve(configuredPath.trim());
|
|
120
|
+
}
|
|
121
|
+
const gitDir = runGit(['rev-parse', '--git-dir']).trim();
|
|
122
|
+
return path.resolve(gitDir, 'hooks');
|
|
123
|
+
}
|
|
124
|
+
function getGitConfig(key) {
|
|
125
|
+
try {
|
|
126
|
+
return runGit(['config', '--get', key]).trim();
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function ensureGitRepo() {
|
|
133
|
+
try {
|
|
134
|
+
runGit(['rev-parse', '--is-inside-work-tree']);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
throw new index_1.CLIError('Not inside a git repository.');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function runGit(args) {
|
|
141
|
+
return (0, node_child_process_1.execFileSync)('git', args, {
|
|
142
|
+
encoding: 'utf-8',
|
|
143
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
144
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function setExecutableBit(targetPath) {
|
|
148
|
+
try {
|
|
149
|
+
fs.chmodSync(targetPath, 0o755);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// best-effort on non-posix filesystems
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function printHelp() {
|
|
156
|
+
console.log('');
|
|
157
|
+
console.log(' charter hook');
|
|
158
|
+
console.log('');
|
|
159
|
+
console.log(' Usage:');
|
|
160
|
+
console.log(' charter hook install --commit-msg [--force]');
|
|
161
|
+
console.log('');
|
|
162
|
+
console.log(' Install a git commit-msg hook that normalizes Governed-By and');
|
|
163
|
+
console.log(' Resolves-Request trailers using git interpret-trailers.');
|
|
164
|
+
console.log('');
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI3C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI3C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AA8L1E,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,iBAAiB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B3F;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,GAAE,iBAAsB,GAAG,UAAU,CAqCpH"}
|
package/dist/commands/init.js
CHANGED
|
@@ -201,6 +201,9 @@ Governed-By: <ADR-ID or ledger entry reference>
|
|
|
201
201
|
Resolves-Request: <governance request ID>
|
|
202
202
|
\`\`\`
|
|
203
203
|
|
|
204
|
+
Keep governance trailers in one contiguous block at the end of the commit message.
|
|
205
|
+
Do not insert a blank line between governance trailers and other trailers like Co-Authored-By.
|
|
206
|
+
|
|
204
207
|
## Change Classification
|
|
205
208
|
|
|
206
209
|
Changes are classified as:
|
|
@@ -217,6 +220,11 @@ Capture waiver reason, approver, and expiration.
|
|
|
217
220
|
|
|
218
221
|
Cross-cutting changes require architectural review before merge.
|
|
219
222
|
Escalate ambiguous or high-risk decisions for explicit approval.
|
|
223
|
+
|
|
224
|
+
## Agent Standards Compatibility
|
|
225
|
+
|
|
226
|
+
If repository-level agent standards exist (for example \`AGENTS.md\`, \`CLAUDE.md\`, \`GEMINI.md\`), Charter policy is complementary and does not override those files.
|
|
227
|
+
Keep governance workflows aligned across all active agent instruction standards.
|
|
220
228
|
`;
|
|
221
229
|
const GITIGNORE_CONTENT = `# Charter local state
|
|
222
230
|
.cache/
|
|
@@ -308,8 +316,14 @@ function getFlag(args, flag) {
|
|
|
308
316
|
}
|
|
309
317
|
function buildPatternTemplate(preset, features) {
|
|
310
318
|
const base = JSON.parse(JSON.stringify(PATTERN_TEMPLATES[preset]));
|
|
319
|
+
const finalize = (items) => ({
|
|
320
|
+
customized: false,
|
|
321
|
+
preset,
|
|
322
|
+
generatedAt: new Date().toISOString(),
|
|
323
|
+
patterns: items,
|
|
324
|
+
});
|
|
311
325
|
if (!features) {
|
|
312
|
-
return base;
|
|
326
|
+
return finalize(base);
|
|
313
327
|
}
|
|
314
328
|
if (features.cloudflare) {
|
|
315
329
|
base.unshift({
|
|
@@ -345,6 +359,6 @@ function buildPatternTemplate(preset, features) {
|
|
|
345
359
|
for (const pattern of base) {
|
|
346
360
|
dedup.set(pattern.name, pattern);
|
|
347
361
|
}
|
|
348
|
-
return [...dedup.values()];
|
|
362
|
+
return finalize([...dedup.values()]);
|
|
349
363
|
}
|
|
350
364
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA6J3C,wBAAsB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiOvF"}
|
package/dist/commands/setup.js
CHANGED
|
@@ -50,7 +50,30 @@ const index_2 = require("../index");
|
|
|
50
50
|
const init_1 = require("./init");
|
|
51
51
|
const package_json_1 = __importDefault(require("../../package.json"));
|
|
52
52
|
const CLI_VERSION = package_json_1.default.version;
|
|
53
|
-
function getGithubWorkflow() {
|
|
53
|
+
function getGithubWorkflow(packageManager) {
|
|
54
|
+
const installStep = packageManager === 'pnpm'
|
|
55
|
+
? ` - uses: pnpm/action-setup@v4
|
|
56
|
+
with:
|
|
57
|
+
version: 9
|
|
58
|
+
|
|
59
|
+
- uses: actions/setup-node@v4
|
|
60
|
+
with:
|
|
61
|
+
node-version: '20'
|
|
62
|
+
cache: 'pnpm'
|
|
63
|
+
|
|
64
|
+
- name: Install dependencies
|
|
65
|
+
run: pnpm install --frozen-lockfile`
|
|
66
|
+
: ` - uses: actions/setup-node@v4
|
|
67
|
+
with:
|
|
68
|
+
node-version: '20'
|
|
69
|
+
|
|
70
|
+
- name: Install dependencies
|
|
71
|
+
run: |
|
|
72
|
+
if [ -f package-lock.json ]; then
|
|
73
|
+
npm ci
|
|
74
|
+
else
|
|
75
|
+
npm install
|
|
76
|
+
fi`;
|
|
54
77
|
return `name: Governance Check
|
|
55
78
|
|
|
56
79
|
on:
|
|
@@ -71,17 +94,7 @@ jobs:
|
|
|
71
94
|
with:
|
|
72
95
|
fetch-depth: 0
|
|
73
96
|
|
|
74
|
-
|
|
75
|
-
with:
|
|
76
|
-
node-version: '20'
|
|
77
|
-
|
|
78
|
-
- name: Install dependencies
|
|
79
|
-
run: |
|
|
80
|
-
if [ -f package-lock.json ]; then
|
|
81
|
-
npm ci
|
|
82
|
-
else
|
|
83
|
-
npm install
|
|
84
|
-
fi
|
|
97
|
+
${installStep}
|
|
85
98
|
|
|
86
99
|
- name: Validate Commits
|
|
87
100
|
run: npx charter validate --ci --format text
|
|
@@ -109,6 +122,7 @@ async function setupCommand(options, args) {
|
|
|
109
122
|
}
|
|
110
123
|
const contexts = loadPackageContexts();
|
|
111
124
|
const detection = detectStack(contexts);
|
|
125
|
+
const packageManager = detectPackageManager(contexts);
|
|
112
126
|
const selectedPreset = isValidPreset(presetFlag) ? presetFlag : detection.suggestedPreset;
|
|
113
127
|
const inferenceMode = presetFlag
|
|
114
128
|
? 'preset-override'
|
|
@@ -130,6 +144,8 @@ async function setupCommand(options, args) {
|
|
|
130
144
|
console.log(` Frameworks: ${detection.frameworks.join(', ') || 'none detected'}`);
|
|
131
145
|
console.log(` State: ${detection.state.join(', ') || 'none detected'}`);
|
|
132
146
|
console.log(` Sources: ${detection.sources.join(', ') || 'none'}`);
|
|
147
|
+
console.log(` Agent standards: ${detection.agentStandards.join(', ') || 'none detected'}`);
|
|
148
|
+
console.log(` Monorepo: ${detection.monorepo ? 'yes' : 'no'}`);
|
|
133
149
|
console.log(` Confidence: ${detection.confidence}`);
|
|
134
150
|
console.log(` Selected preset: ${selectedPreset} (${inferenceMode})`);
|
|
135
151
|
if (detection.mixedStack) {
|
|
@@ -148,7 +164,7 @@ async function setupCommand(options, args) {
|
|
|
148
164
|
const baselinePlan = planBaselineMutation(baselinePath, explicitForce);
|
|
149
165
|
const workflowPath = path.join('.github', 'workflows', 'charter-governance.yml');
|
|
150
166
|
const workflowPlan = ciMode === 'github'
|
|
151
|
-
? planManagedFile(workflowPath, getGithubWorkflow())
|
|
167
|
+
? planManagedFile(workflowPath, getGithubWorkflow(packageManager))
|
|
152
168
|
: { action: 'skip' };
|
|
153
169
|
const manifestPlan = syncPackageManifest(selectedPreset, !noDependencySync, false);
|
|
154
170
|
const initResult = (0, init_1.initializeCharter)(options.configPath, explicitForce, {
|
|
@@ -227,7 +243,7 @@ async function setupCommand(options, args) {
|
|
|
227
243
|
},
|
|
228
244
|
};
|
|
229
245
|
if (ciMode === 'github') {
|
|
230
|
-
const workflowWrite = applyManagedFile(workflowPath, getGithubWorkflow(), force);
|
|
246
|
+
const workflowWrite = applyManagedFile(workflowPath, getGithubWorkflow(packageManager), force);
|
|
231
247
|
result.workflow = {
|
|
232
248
|
mode: 'github',
|
|
233
249
|
path: workflowPath,
|
|
@@ -288,9 +304,15 @@ async function setupCommand(options, args) {
|
|
|
288
304
|
console.log(' - Audit-ready governance evidence from repo history');
|
|
289
305
|
console.log('');
|
|
290
306
|
console.log(' Run now:');
|
|
291
|
-
console.log(' 1. charter
|
|
292
|
-
console.log(' 2. charter
|
|
293
|
-
console.log(' 3. charter
|
|
307
|
+
console.log(' 1. charter classify "<planned change summary>"');
|
|
308
|
+
console.log(' 2. charter hook install --commit-msg');
|
|
309
|
+
console.log(' 3. charter validate --format text');
|
|
310
|
+
console.log(' 4. charter drift --format text');
|
|
311
|
+
console.log(' 5. charter audit --format text');
|
|
312
|
+
console.log('');
|
|
313
|
+
console.log(' Adoption ramp option:');
|
|
314
|
+
console.log(' - Set "validation.citationStrictness": "WARN" in .charter/config.json for an initial non-blocking trailer policy.');
|
|
315
|
+
console.log(' - Keep "git.trailerThreshold" at HIGH initially, then tighten based on team maturity.');
|
|
294
316
|
return index_2.EXIT_CODE.SUCCESS;
|
|
295
317
|
}
|
|
296
318
|
function detectStack(contexts) {
|
|
@@ -300,6 +322,8 @@ function detectStack(contexts) {
|
|
|
300
322
|
frameworks: [],
|
|
301
323
|
state: [],
|
|
302
324
|
sources: [],
|
|
325
|
+
agentStandards: [],
|
|
326
|
+
monorepo: false,
|
|
303
327
|
signals: {
|
|
304
328
|
hasFrontend: false,
|
|
305
329
|
hasBackend: false,
|
|
@@ -308,6 +332,7 @@ function detectStack(contexts) {
|
|
|
308
332
|
hasHono: false,
|
|
309
333
|
hasReact: false,
|
|
310
334
|
hasVite: false,
|
|
335
|
+
hasPnpm: false,
|
|
311
336
|
},
|
|
312
337
|
mixedStack: false,
|
|
313
338
|
confidence: 'LOW',
|
|
@@ -331,6 +356,12 @@ function detectStack(contexts) {
|
|
|
331
356
|
const hasHono = hasAny(depNames, ['hono']);
|
|
332
357
|
const hasReact = hasAny(depNames, ['react']);
|
|
333
358
|
const hasVite = hasAny(depNames, ['vite']);
|
|
359
|
+
const hasPnpm = contexts.some((ctx) => !!ctx.engines?.pnpm)
|
|
360
|
+
|| contexts.some((ctx) => typeof ctx.packageManager === 'string' && ctx.packageManager.toLowerCase().startsWith('pnpm@'))
|
|
361
|
+
|| fs.existsSync(path.resolve('pnpm-lock.yaml'));
|
|
362
|
+
const monorepo = contexts.length > 1 || fs.existsSync(path.resolve('pnpm-workspace.yaml'));
|
|
363
|
+
const agentStandards = ['AGENTS.md', 'CLAUDE.md', 'GEMINI.md']
|
|
364
|
+
.filter((filename) => fs.existsSync(path.resolve(filename)));
|
|
334
365
|
const frameworks = [];
|
|
335
366
|
const runtime = [];
|
|
336
367
|
const state = [];
|
|
@@ -359,11 +390,15 @@ function detectStack(contexts) {
|
|
|
359
390
|
hasHono,
|
|
360
391
|
hasReact,
|
|
361
392
|
hasVite,
|
|
393
|
+
hasPnpm,
|
|
362
394
|
};
|
|
363
395
|
const warnings = [];
|
|
364
396
|
if (dedupRuntime.length > 1 && !(hasFrontend && (hasBackend || hasWorker))) {
|
|
365
397
|
warnings.push('Multiple runtime families detected without clear frontend/backend split; verify preset selection.');
|
|
366
398
|
}
|
|
399
|
+
if (agentStandards.length > 0) {
|
|
400
|
+
warnings.push(`Agent standards detected (${agentStandards.join(', ')}); align Charter policy with existing agent instructions.`);
|
|
401
|
+
}
|
|
367
402
|
if (mixedStack) {
|
|
368
403
|
const isClassicMixed = hasFrontend && (hasBackend || hasWorker);
|
|
369
404
|
return {
|
|
@@ -371,6 +406,8 @@ function detectStack(contexts) {
|
|
|
371
406
|
frameworks: dedup(frameworks),
|
|
372
407
|
state: dedup(state),
|
|
373
408
|
sources: contexts.map((c) => c.source),
|
|
409
|
+
agentStandards,
|
|
410
|
+
monorepo,
|
|
374
411
|
signals,
|
|
375
412
|
mixedStack: true,
|
|
376
413
|
confidence: isClassicMixed ? 'HIGH' : 'MEDIUM',
|
|
@@ -384,6 +421,8 @@ function detectStack(contexts) {
|
|
|
384
421
|
frameworks: dedup(frameworks),
|
|
385
422
|
state: dedup(state),
|
|
386
423
|
sources: contexts.map((c) => c.source),
|
|
424
|
+
agentStandards,
|
|
425
|
+
monorepo,
|
|
387
426
|
signals,
|
|
388
427
|
mixedStack: false,
|
|
389
428
|
confidence: 'HIGH',
|
|
@@ -397,6 +436,8 @@ function detectStack(contexts) {
|
|
|
397
436
|
frameworks: dedup(frameworks),
|
|
398
437
|
state: dedup(state),
|
|
399
438
|
sources: contexts.map((c) => c.source),
|
|
439
|
+
agentStandards,
|
|
440
|
+
monorepo,
|
|
400
441
|
signals,
|
|
401
442
|
mixedStack: false,
|
|
402
443
|
confidence: warnings.length > 0 ? 'MEDIUM' : 'HIGH',
|
|
@@ -410,6 +451,8 @@ function detectStack(contexts) {
|
|
|
410
451
|
frameworks: dedup(frameworks),
|
|
411
452
|
state: dedup(state),
|
|
412
453
|
sources: contexts.map((c) => c.source),
|
|
454
|
+
agentStandards,
|
|
455
|
+
monorepo,
|
|
413
456
|
signals,
|
|
414
457
|
mixedStack: false,
|
|
415
458
|
confidence: warnings.length > 0 ? 'MEDIUM' : 'HIGH',
|
|
@@ -423,6 +466,8 @@ function detectStack(contexts) {
|
|
|
423
466
|
frameworks: dedup(frameworks),
|
|
424
467
|
state: dedup(state),
|
|
425
468
|
sources: contexts.map((c) => c.source),
|
|
469
|
+
agentStandards,
|
|
470
|
+
monorepo,
|
|
426
471
|
signals,
|
|
427
472
|
mixedStack: false,
|
|
428
473
|
confidence: 'MEDIUM',
|
|
@@ -435,6 +480,8 @@ function detectStack(contexts) {
|
|
|
435
480
|
frameworks: dedup(frameworks),
|
|
436
481
|
state: dedup(state),
|
|
437
482
|
sources: contexts.map((c) => c.source),
|
|
483
|
+
agentStandards,
|
|
484
|
+
monorepo,
|
|
438
485
|
signals,
|
|
439
486
|
mixedStack: false,
|
|
440
487
|
confidence: 'LOW',
|
|
@@ -456,6 +503,17 @@ function loadPackageContexts() {
|
|
|
456
503
|
}
|
|
457
504
|
}
|
|
458
505
|
}
|
|
506
|
+
const packagesDir = path.resolve('packages');
|
|
507
|
+
if (fs.existsSync(packagesDir)) {
|
|
508
|
+
for (const entry of fs.readdirSync(packagesDir, { withFileTypes: true })) {
|
|
509
|
+
if (entry.isDirectory()) {
|
|
510
|
+
candidates.add(path.join('packages', entry.name, 'package.json'));
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
for (const workspaceManifest of resolvePnpmWorkspacePackageJsons()) {
|
|
515
|
+
candidates.add(workspaceManifest);
|
|
516
|
+
}
|
|
459
517
|
const contexts = [];
|
|
460
518
|
for (const relativePath of candidates) {
|
|
461
519
|
const absolutePath = path.resolve(relativePath);
|
|
@@ -468,6 +526,7 @@ function loadPackageContexts() {
|
|
|
468
526
|
dependencies: parsed.dependencies,
|
|
469
527
|
devDependencies: parsed.devDependencies,
|
|
470
528
|
engines: parsed.engines,
|
|
529
|
+
packageManager: parsed.packageManager,
|
|
471
530
|
name: parsed.name,
|
|
472
531
|
});
|
|
473
532
|
}
|
|
@@ -477,6 +536,118 @@ function loadPackageContexts() {
|
|
|
477
536
|
}
|
|
478
537
|
return contexts;
|
|
479
538
|
}
|
|
539
|
+
function detectPackageManager(contexts) {
|
|
540
|
+
const root = contexts.find((ctx) => ctx.source === 'package.json');
|
|
541
|
+
if (root?.engines?.pnpm || fs.existsSync(path.resolve('pnpm-lock.yaml'))) {
|
|
542
|
+
return 'pnpm';
|
|
543
|
+
}
|
|
544
|
+
if (typeof root?.packageManager === 'string' && root.packageManager.toLowerCase().startsWith('pnpm@')) {
|
|
545
|
+
return 'pnpm';
|
|
546
|
+
}
|
|
547
|
+
return 'npm';
|
|
548
|
+
}
|
|
549
|
+
function resolvePnpmWorkspacePackageJsons() {
|
|
550
|
+
const workspaceFile = path.resolve('pnpm-workspace.yaml');
|
|
551
|
+
if (!fs.existsSync(workspaceFile))
|
|
552
|
+
return [];
|
|
553
|
+
let content = '';
|
|
554
|
+
try {
|
|
555
|
+
content = fs.readFileSync(workspaceFile, 'utf-8');
|
|
556
|
+
}
|
|
557
|
+
catch {
|
|
558
|
+
return [];
|
|
559
|
+
}
|
|
560
|
+
const globs = parsePnpmWorkspaceGlobs(content);
|
|
561
|
+
const resolved = new Set();
|
|
562
|
+
for (const glob of globs) {
|
|
563
|
+
for (const match of expandWorkspacePackageJsonGlob(glob)) {
|
|
564
|
+
resolved.add(match);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
return [...resolved];
|
|
568
|
+
}
|
|
569
|
+
function parsePnpmWorkspaceGlobs(content) {
|
|
570
|
+
const lines = content.split(/\r?\n/);
|
|
571
|
+
const globs = [];
|
|
572
|
+
let inPackagesBlock = false;
|
|
573
|
+
for (const line of lines) {
|
|
574
|
+
const trimmed = line.trim();
|
|
575
|
+
if (!inPackagesBlock) {
|
|
576
|
+
if (trimmed === 'packages:') {
|
|
577
|
+
inPackagesBlock = true;
|
|
578
|
+
}
|
|
579
|
+
continue;
|
|
580
|
+
}
|
|
581
|
+
if (trimmed.length > 0 && !line.startsWith(' ') && !line.startsWith('\t') && !line.trimStart().startsWith('-')) {
|
|
582
|
+
break;
|
|
583
|
+
}
|
|
584
|
+
const match = line.match(/^\s*-\s*['"]?([^'"]+)['"]?\s*$/);
|
|
585
|
+
if (match) {
|
|
586
|
+
globs.push(match[1].trim());
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
return globs;
|
|
590
|
+
}
|
|
591
|
+
function expandWorkspacePackageJsonGlob(globPattern) {
|
|
592
|
+
const normalized = globPattern.replace(/\\/g, '/').replace(/\/+$/, '');
|
|
593
|
+
if (normalized.length === 0)
|
|
594
|
+
return [];
|
|
595
|
+
if (!normalized.includes('*')) {
|
|
596
|
+
return maybePackageJsonPathsForDir(path.resolve(normalized), normalized);
|
|
597
|
+
}
|
|
598
|
+
if (normalized.endsWith('/*')) {
|
|
599
|
+
const root = normalized.slice(0, -2);
|
|
600
|
+
const rootAbsolute = path.resolve(root);
|
|
601
|
+
if (!fs.existsSync(rootAbsolute) || !fs.statSync(rootAbsolute).isDirectory()) {
|
|
602
|
+
return [];
|
|
603
|
+
}
|
|
604
|
+
const results = [];
|
|
605
|
+
for (const entry of fs.readdirSync(rootAbsolute, { withFileTypes: true })) {
|
|
606
|
+
if (!entry.isDirectory())
|
|
607
|
+
continue;
|
|
608
|
+
const relative = path.posix.join(root, entry.name);
|
|
609
|
+
results.push(...maybePackageJsonPathsForDir(path.resolve(relative), relative));
|
|
610
|
+
}
|
|
611
|
+
return results;
|
|
612
|
+
}
|
|
613
|
+
if (normalized.includes('/**')) {
|
|
614
|
+
const root = normalized.split('/**')[0];
|
|
615
|
+
const rootAbsolute = path.resolve(root);
|
|
616
|
+
if (!fs.existsSync(rootAbsolute) || !fs.statSync(rootAbsolute).isDirectory()) {
|
|
617
|
+
return [];
|
|
618
|
+
}
|
|
619
|
+
return collectPackageJsonsRecursive(rootAbsolute)
|
|
620
|
+
.map((absolute) => path.relative(process.cwd(), absolute).replace(/\\/g, '/'));
|
|
621
|
+
}
|
|
622
|
+
return [];
|
|
623
|
+
}
|
|
624
|
+
function maybePackageJsonPathsForDir(absoluteDir, relativeDir) {
|
|
625
|
+
const manifest = path.join(absoluteDir, 'package.json');
|
|
626
|
+
if (!fs.existsSync(manifest))
|
|
627
|
+
return [];
|
|
628
|
+
return [path.posix.join(relativeDir, 'package.json')];
|
|
629
|
+
}
|
|
630
|
+
function collectPackageJsonsRecursive(rootDir) {
|
|
631
|
+
const results = [];
|
|
632
|
+
const stack = [rootDir];
|
|
633
|
+
while (stack.length > 0) {
|
|
634
|
+
const current = stack.pop();
|
|
635
|
+
if (!current)
|
|
636
|
+
continue;
|
|
637
|
+
const manifest = path.join(current, 'package.json');
|
|
638
|
+
if (fs.existsSync(manifest)) {
|
|
639
|
+
results.push(manifest);
|
|
640
|
+
}
|
|
641
|
+
for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
|
|
642
|
+
if (!entry.isDirectory())
|
|
643
|
+
continue;
|
|
644
|
+
if (entry.name === 'node_modules' || entry.name.startsWith('.'))
|
|
645
|
+
continue;
|
|
646
|
+
stack.push(path.join(current, entry.name));
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
return results;
|
|
650
|
+
}
|
|
480
651
|
function inferProjectName(contexts) {
|
|
481
652
|
const root = contexts.find((c) => c.source === 'package.json');
|
|
482
653
|
if (root?.name && root.name.trim().length > 0) {
|