@paths.design/caws-cli 11.0.0 → 11.1.0
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/README.md +2 -2
- package/dist/index.js +2 -2
- package/dist/init/harness-detect.d.ts +18 -0
- package/dist/init/harness-detect.d.ts.map +1 -0
- package/dist/init/harness-detect.js +90 -0
- package/dist/init/harness-detect.js.map +1 -0
- package/dist/init/hook-install.d.ts +53 -0
- package/dist/init/hook-install.d.ts.map +1 -0
- package/dist/init/hook-install.js +421 -0
- package/dist/init/hook-install.js.map +1 -0
- package/dist/init/hook-packs/manifest-claude-code.d.ts +4 -0
- package/dist/init/hook-packs/manifest-claude-code.d.ts.map +1 -0
- package/dist/init/hook-packs/manifest-claude-code.js +190 -0
- package/dist/init/hook-packs/manifest-claude-code.js.map +1 -0
- package/dist/init/hook-packs/register.d.ts +19 -0
- package/dist/init/hook-packs/register.d.ts.map +1 -0
- package/dist/init/hook-packs/register.js +37 -0
- package/dist/init/hook-packs/register.js.map +1 -0
- package/dist/init/hook-packs/types.d.ts +123 -0
- package/dist/init/hook-packs/types.d.ts.map +1 -0
- package/dist/init/hook-packs/types.js +29 -0
- package/dist/init/hook-packs/types.js.map +1 -0
- package/dist/shell/commands/gates.d.ts.map +1 -1
- package/dist/shell/commands/gates.js +28 -1
- package/dist/shell/commands/gates.js.map +1 -1
- package/dist/shell/commands/init.d.ts +9 -0
- package/dist/shell/commands/init.d.ts.map +1 -1
- package/dist/shell/commands/init.js +131 -27
- package/dist/shell/commands/init.js.map +1 -1
- package/dist/shell/commands/specs.d.ts +41 -0
- package/dist/shell/commands/specs.d.ts.map +1 -0
- package/dist/shell/commands/specs.js +264 -0
- package/dist/shell/commands/specs.js.map +1 -0
- package/dist/shell/commands/worktree.d.ts +38 -0
- package/dist/shell/commands/worktree.d.ts.map +1 -0
- package/dist/shell/commands/worktree.js +286 -0
- package/dist/shell/commands/worktree.js.map +1 -0
- package/dist/shell/gates/disposition.d.ts.map +1 -1
- package/dist/shell/gates/disposition.js +33 -3
- package/dist/shell/gates/disposition.js.map +1 -1
- package/dist/shell/gates/local-evaluators/budget-limit.d.ts +24 -0
- package/dist/shell/gates/local-evaluators/budget-limit.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/budget-limit.js +67 -0
- package/dist/shell/gates/local-evaluators/budget-limit.js.map +1 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.d.ts +25 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.js +74 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.js.map +1 -0
- package/dist/shell/gates/local-evaluators/index.d.ts +28 -0
- package/dist/shell/gates/local-evaluators/index.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/index.js +67 -0
- package/dist/shell/gates/local-evaluators/index.js.map +1 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.d.ts +23 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.js +67 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.js.map +1 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.d.ts +12 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.js +73 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.js.map +1 -0
- package/dist/shell/index.d.ts +4 -0
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +13 -1
- package/dist/shell/index.js.map +1 -1
- package/dist/shell/register.d.ts.map +1 -1
- package/dist/shell/register.js +192 -2
- package/dist/shell/register.js.map +1 -1
- package/dist/shell/render/init-hook-pack.d.ts +16 -0
- package/dist/shell/render/init-hook-pack.d.ts.map +1 -0
- package/dist/shell/render/init-hook-pack.js +206 -0
- package/dist/shell/render/init-hook-pack.js.map +1 -0
- package/dist/store/atomic-write.d.ts +20 -2
- package/dist/store/atomic-write.d.ts.map +1 -1
- package/dist/store/atomic-write.js +44 -2
- package/dist/store/atomic-write.js.map +1 -1
- package/dist/store/lifecycle-lock.d.ts +34 -0
- package/dist/store/lifecycle-lock.d.ts.map +1 -0
- package/dist/store/lifecycle-lock.js +168 -0
- package/dist/store/lifecycle-lock.js.map +1 -0
- package/dist/store/lifecycle-transaction.d.ts +79 -0
- package/dist/store/lifecycle-transaction.d.ts.map +1 -0
- package/dist/store/lifecycle-transaction.js +319 -0
- package/dist/store/lifecycle-transaction.js.map +1 -0
- package/dist/store/rules.d.ts +16 -0
- package/dist/store/rules.d.ts.map +1 -1
- package/dist/store/rules.js +17 -0
- package/dist/store/rules.js.map +1 -1
- package/dist/store/specs-writer.d.ts +61 -0
- package/dist/store/specs-writer.d.ts.map +1 -0
- package/dist/store/specs-writer.js +506 -0
- package/dist/store/specs-writer.js.map +1 -0
- package/dist/store/worktrees-writer.d.ts +77 -0
- package/dist/store/worktrees-writer.d.ts.map +1 -0
- package/dist/store/worktrees-writer.js +674 -0
- package/dist/store/worktrees-writer.js.map +1 -0
- package/dist/store/yaml-patch.d.ts +7 -0
- package/dist/store/yaml-patch.d.ts.map +1 -0
- package/dist/store/yaml-patch.js +250 -0
- package/dist/store/yaml-patch.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @paths.design/caws-cli
|
|
2
2
|
|
|
3
|
-
**CAWS CLI v11.0.0 — the governed core for the Coding Agent
|
|
3
|
+
**CAWS CLI v11.0.0 — the governed core for the Coding Agent Working Standard.**
|
|
4
4
|
|
|
5
|
-
CAWS (Coding Agent
|
|
5
|
+
CAWS (Coding Agent Working Standard) gives coding agents a deterministic
|
|
6
6
|
substrate for project state, scope, claims, gates, waivers, and audit
|
|
7
7
|
evidence. v11.0.0 is a ground-up rewrite around a pure kernel, an I/O
|
|
8
8
|
store, and a thin shell. It replaces v10.x.
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @fileoverview CAWS CLI - Scaffolding tool for Coding Agent
|
|
4
|
+
* @fileoverview CAWS CLI - Scaffolding tool for Coding Agent Working Standard
|
|
5
5
|
* Provides commands to initialize new projects and scaffold existing ones with CAWS.
|
|
6
6
|
* Includes spec management, quality gates, and AI-assisted development workflows.
|
|
7
7
|
* @author @darianrosebrook
|
|
@@ -39,7 +39,7 @@ const program = new Command();
|
|
|
39
39
|
|
|
40
40
|
program
|
|
41
41
|
.name('caws')
|
|
42
|
-
.description('CAWS - Coding Agent
|
|
42
|
+
.description('CAWS - Coding Agent Working Standard CLI')
|
|
43
43
|
.version(CLI_VERSION)
|
|
44
44
|
.showHelpAfterError(false);
|
|
45
45
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AgentSurface } from './hook-packs/types';
|
|
2
|
+
export type HarnessDetectionResult = {
|
|
3
|
+
readonly kind: 'single';
|
|
4
|
+
readonly surface: Exclude<AgentSurface, 'none'>;
|
|
5
|
+
} | {
|
|
6
|
+
readonly kind: 'ambiguous';
|
|
7
|
+
readonly candidates: readonly Exclude<AgentSurface, 'none'>[];
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: 'none';
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Detect the harness(es) in use in `repoRoot`.
|
|
13
|
+
*
|
|
14
|
+
* Returns `single` when exactly one harness has signals, `ambiguous`
|
|
15
|
+
* when multiple do, and `none` when no harness signal is present.
|
|
16
|
+
*/
|
|
17
|
+
export declare function detectAgentHarness(repoRoot: string): HarnessDetectionResult;
|
|
18
|
+
//# sourceMappingURL=harness-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-detect.d.ts","sourceRoot":"","sources":["../../src/init/harness-detect.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5E;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;CAC/D,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA6B9B;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAc3E"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Detect which agent harness is in use for a given repo, so `caws init`
|
|
3
|
+
// can suggest or auto-select an appropriate hook pack.
|
|
4
|
+
//
|
|
5
|
+
// Detection is intentionally simple: filesystem signals only, no
|
|
6
|
+
// process introspection. False negatives (the user has the harness but
|
|
7
|
+
// the signal file isn't present yet) are expected and acceptable — the
|
|
8
|
+
// caller can always pass --agent-surface explicitly.
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.detectAgentHarness = detectAgentHarness;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const SIGNALS = [
|
|
47
|
+
{
|
|
48
|
+
surface: 'claude-code',
|
|
49
|
+
markers: ['.claude', '.claude/settings.json', '.claude/hooks'],
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
surface: 'cursor',
|
|
53
|
+
markers: ['.cursor', '.cursor/settings.json', '.cursor/rules'],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
surface: 'windsurf',
|
|
57
|
+
markers: ['.windsurf', '.windsurf/settings.json'],
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
function anyMarkerExists(repoRoot, markers) {
|
|
61
|
+
for (const m of markers) {
|
|
62
|
+
if (fs.existsSync(path.join(repoRoot, m)))
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Detect the harness(es) in use in `repoRoot`.
|
|
69
|
+
*
|
|
70
|
+
* Returns `single` when exactly one harness has signals, `ambiguous`
|
|
71
|
+
* when multiple do, and `none` when no harness signal is present.
|
|
72
|
+
*/
|
|
73
|
+
function detectAgentHarness(repoRoot) {
|
|
74
|
+
const present = [];
|
|
75
|
+
for (const signal of SIGNALS) {
|
|
76
|
+
if (anyMarkerExists(repoRoot, signal.markers)) {
|
|
77
|
+
present.push(signal.surface);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (present.length === 0)
|
|
81
|
+
return { kind: 'none' };
|
|
82
|
+
if (present.length === 1) {
|
|
83
|
+
const surface = present[0];
|
|
84
|
+
if (surface === undefined)
|
|
85
|
+
return { kind: 'none' };
|
|
86
|
+
return { kind: 'single', surface };
|
|
87
|
+
}
|
|
88
|
+
return { kind: 'ambiguous', candidates: present };
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=harness-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-detect.js","sourceRoot":"","sources":["../../src/init/harness-detect.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,uDAAuD;AACvD,EAAE;AACF,iEAAiE;AACjE,uEAAuE;AACvE,uEAAuE;AACvE,qDAAqD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDrD,gDAcC;AA5DD,uCAAyB;AACzB,2CAA6B;AAiB7B,MAAM,OAAO,GAA6B;IACxC;QACE,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,CAAC,SAAS,EAAE,uBAAuB,EAAE,eAAe,CAAC;KAC/D;IACD;QACE,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,CAAC,SAAS,EAAE,uBAAuB,EAAE,eAAe,CAAC;KAC/D;IACD;QACE,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAClD;CACF,CAAC;AAEF,SAAS,eAAe,CAAC,QAAgB,EAAE,OAA0B;IACnE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAoC,EAAE,CAAC;IACpD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { HookPackInstallResult, HookPackV1, ManagedHeader } from './hook-packs/types';
|
|
2
|
+
/** Parse a managed header from file content. Returns null when not
|
|
3
|
+
* present. Tolerant of leading shebang and of `<!--`/`-->`-style
|
|
4
|
+
* comment wrappers (for Markdown). */
|
|
5
|
+
export declare function parseManagedHeader(content: string): ManagedHeader | null;
|
|
6
|
+
export interface HookPackInstallOptions {
|
|
7
|
+
readonly repoRoot: string;
|
|
8
|
+
/** When true, allow overwriting unmanaged or drifted files. */
|
|
9
|
+
readonly overwrite?: boolean;
|
|
10
|
+
/** When true, leave drifted/unmanaged files in place and report. */
|
|
11
|
+
readonly adopt?: boolean;
|
|
12
|
+
/** Override the pack template root (used by tests). */
|
|
13
|
+
readonly packRootOverride?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Install a pack into repoRoot. Pure with respect to its inputs except
|
|
16
|
+
* for the filesystem writes it performs. Returns a typed result the
|
|
17
|
+
* caller renders. */
|
|
18
|
+
export declare function installHookPack(pack: HookPackV1, options: HookPackInstallOptions): HookPackInstallResult;
|
|
19
|
+
/** Result of inspecting `.claude/settings.json` for hook wiring. */
|
|
20
|
+
export type SettingsWiringStatus =
|
|
21
|
+
/** settings.json is absent. Caller should print the canonical snippet
|
|
22
|
+
* and instruct the user to create the file. */
|
|
23
|
+
{
|
|
24
|
+
readonly kind: 'absent';
|
|
25
|
+
}
|
|
26
|
+
/** settings.json exists and references all four canonical dispatch
|
|
27
|
+
* entrypoints. No action needed. */
|
|
28
|
+
| {
|
|
29
|
+
readonly kind: 'wired';
|
|
30
|
+
}
|
|
31
|
+
/** settings.json exists but is missing one or more canonical entries.
|
|
32
|
+
* Caller should print which entries are missing and the snippet to add. */
|
|
33
|
+
| {
|
|
34
|
+
readonly kind: 'partial';
|
|
35
|
+
readonly missing: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
/** settings.json exists but could not be parsed as JSON. Caller should
|
|
38
|
+
* surface the parse error and refuse to suggest changes. */
|
|
39
|
+
| {
|
|
40
|
+
readonly kind: 'invalid';
|
|
41
|
+
readonly error: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Inspect `.claude/settings.json` and report whether the canonical
|
|
45
|
+
* Claude Code hook wiring is present. Install is non-destructive on
|
|
46
|
+
* settings.json — this function just surfaces the state so the CLI can
|
|
47
|
+
* tell the user exactly what to add.
|
|
48
|
+
*/
|
|
49
|
+
export declare function inspectClaudeSettings(repoRoot: string): SettingsWiringStatus;
|
|
50
|
+
/** Canonical settings.json wiring snippet, returned as a JSON string
|
|
51
|
+
* ready to print or copy. Mirrors the snippet in CLAUDE.md. */
|
|
52
|
+
export declare const CANONICAL_SETTINGS_SNIPPET: string;
|
|
53
|
+
//# sourceMappingURL=hook-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-install.d.ts","sourceRoot":"","sources":["../../src/init/hook-install.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAGV,qBAAqB,EACrB,UAAU,EAEV,aAAa,EACd,MAAM,oBAAoB,CAAC;AAgC5B;;uCAEuC;AACvC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAmExE;AAoED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAsFD;;sBAEsB;AACtB,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CAyCvB;AAED,oEAAoE;AACpE,MAAM,MAAM,oBAAoB;AAC9B;gDACgD;AAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE;AAC7B;qCACqC;GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE;AAC5B;4EAC4E;GAC1E;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE;AACnE;6DAC6D;GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GACf,oBAAoB,CAoDtB;AAED;gEACgE;AAChE,eAAO,MAAM,0BAA0B,QAyDtC,CAAC"}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Hook-pack install logic. Managed-marker aware; non-destructive by default.
|
|
3
|
+
//
|
|
4
|
+
// Install policy:
|
|
5
|
+
// - absent → create the file from the pack's bundled template.
|
|
6
|
+
// - managed_clean → no-op (same pack/version, content matches).
|
|
7
|
+
// - managed_old_version → update (replace with new bundled content).
|
|
8
|
+
// - managed_drift → refuse unless adopt/overwrite is passed.
|
|
9
|
+
// - unmanaged_collision → refuse unless adopt/overwrite is passed.
|
|
10
|
+
//
|
|
11
|
+
// settings.json is intentionally NOT in the pack manifest. If a user
|
|
12
|
+
// already has .claude/settings.json, this module surfaces the canonical
|
|
13
|
+
// wiring snippet for them to merge by hand. If they have no settings.json,
|
|
14
|
+
// it emits the snippet to put into a new file.
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.CANONICAL_SETTINGS_SNIPPET = void 0;
|
|
50
|
+
exports.parseManagedHeader = parseManagedHeader;
|
|
51
|
+
exports.installHookPack = installHookPack;
|
|
52
|
+
exports.inspectClaudeSettings = inspectClaudeSettings;
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
/** Location of the pack templates relative to the caws-cli package root.
|
|
56
|
+
* Resolved at runtime from __dirname so it works both in dev (running
|
|
57
|
+
* ts-node against src/) and from the dist build. */
|
|
58
|
+
function packTemplateRoot(packId) {
|
|
59
|
+
// The templates live alongside the built dist/ at the package root.
|
|
60
|
+
// From dist/, walk up to the package root and down into templates.
|
|
61
|
+
// From src/init/hook-install.ts ts-node mode, the same walk works.
|
|
62
|
+
// We tolerate both: src/init -> package root is two levels up;
|
|
63
|
+
// dist -> package root is one level up.
|
|
64
|
+
const here = __dirname;
|
|
65
|
+
const candidates = [
|
|
66
|
+
path.resolve(here, '..', '..', 'templates', 'hook-packs', packId),
|
|
67
|
+
path.resolve(here, '..', 'templates', 'hook-packs', packId),
|
|
68
|
+
path.resolve(here, '..', '..', '..', 'templates', 'hook-packs', packId),
|
|
69
|
+
];
|
|
70
|
+
for (const c of candidates) {
|
|
71
|
+
if (fs.existsSync(c))
|
|
72
|
+
return c;
|
|
73
|
+
}
|
|
74
|
+
// Fall through to the first candidate even if missing; downstream will
|
|
75
|
+
// emit a clean "template file missing" diagnostic.
|
|
76
|
+
return candidates[0] ?? '';
|
|
77
|
+
}
|
|
78
|
+
// ─── Managed header parsing ──────────────────────────────────────────────
|
|
79
|
+
/** Match a managed-header block at the top of a file. The block consists
|
|
80
|
+
* of consecutive `# CAWS-...` lines after an optional shebang or
|
|
81
|
+
* HTML/JSDoc comment opener. */
|
|
82
|
+
const HEADER_MARKER = 'CAWS-MANAGED-HOOK';
|
|
83
|
+
/** Parse a managed header from file content. Returns null when not
|
|
84
|
+
* present. Tolerant of leading shebang and of `<!--`/`-->`-style
|
|
85
|
+
* comment wrappers (for Markdown). */
|
|
86
|
+
function parseManagedHeader(content) {
|
|
87
|
+
// Search the first ~30 lines for the marker. This is large enough to
|
|
88
|
+
// tolerate shebang + HTML comment wrapper but small enough to stay
|
|
89
|
+
// fast on big files.
|
|
90
|
+
const lines = content.split('\n').slice(0, 30);
|
|
91
|
+
let inBlock = false;
|
|
92
|
+
let hookPack = '';
|
|
93
|
+
let hookPackVersion = 0;
|
|
94
|
+
let cawsMinMajor = 0;
|
|
95
|
+
let lineageRefs = [];
|
|
96
|
+
let sawMarker = false;
|
|
97
|
+
for (const raw of lines) {
|
|
98
|
+
const line = raw.trim().replace(/^<!--\s*/, '').replace(/\s*-->\s*$/, '');
|
|
99
|
+
if (!line)
|
|
100
|
+
continue;
|
|
101
|
+
if (line.includes(HEADER_MARKER)) {
|
|
102
|
+
sawMarker = true;
|
|
103
|
+
inBlock = true;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (!inBlock)
|
|
107
|
+
continue;
|
|
108
|
+
// The block consists of `# key: value` lines. First non-comment
|
|
109
|
+
// line ends the block.
|
|
110
|
+
if (!line.startsWith('#'))
|
|
111
|
+
break;
|
|
112
|
+
const stripped = line.replace(/^#\s*/, '');
|
|
113
|
+
const colon = stripped.indexOf(':');
|
|
114
|
+
if (colon < 0)
|
|
115
|
+
continue;
|
|
116
|
+
const key = stripped.slice(0, colon).trim();
|
|
117
|
+
const value = stripped.slice(colon + 1).trim();
|
|
118
|
+
switch (key) {
|
|
119
|
+
case 'hook_pack':
|
|
120
|
+
hookPack = value;
|
|
121
|
+
break;
|
|
122
|
+
case 'hook_pack_version': {
|
|
123
|
+
const n = Number.parseInt(value, 10);
|
|
124
|
+
if (!Number.isNaN(n))
|
|
125
|
+
hookPackVersion = n;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case 'caws_min_major': {
|
|
129
|
+
const n = Number.parseInt(value, 10);
|
|
130
|
+
if (!Number.isNaN(n))
|
|
131
|
+
cawsMinMajor = n;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
case 'lineage_refs': {
|
|
135
|
+
lineageRefs = value
|
|
136
|
+
.split(',')
|
|
137
|
+
.map((s) => s.trim())
|
|
138
|
+
.filter((s) => s.length > 0)
|
|
139
|
+
.map((s) => Number.parseInt(s, 10))
|
|
140
|
+
.filter((n) => !Number.isNaN(n));
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
// 'do_not_edit_directly' is informational; ignored here.
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (!sawMarker || !hookPack || hookPackVersion <= 0)
|
|
147
|
+
return null;
|
|
148
|
+
return {
|
|
149
|
+
hookPack,
|
|
150
|
+
hookPackVersion,
|
|
151
|
+
cawsMinMajor,
|
|
152
|
+
lineageRefs,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// ─── Per-file state evaluation ───────────────────────────────────────────
|
|
156
|
+
function readBytes(p) {
|
|
157
|
+
try {
|
|
158
|
+
return fs.readFileSync(p);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function bytesEqual(a, b) {
|
|
165
|
+
if (a.length !== b.length)
|
|
166
|
+
return false;
|
|
167
|
+
return a.compare(b) === 0;
|
|
168
|
+
}
|
|
169
|
+
function evaluateFileState(repoRoot, packRoot, packId, packVersion, file) {
|
|
170
|
+
const destAbs = path.join(repoRoot, file.destPath);
|
|
171
|
+
const localBytes = readBytes(destAbs);
|
|
172
|
+
if (localBytes === null)
|
|
173
|
+
return { kind: 'absent' };
|
|
174
|
+
if (!file.managed) {
|
|
175
|
+
// Non-managed pack file (none currently exist, but we model the case).
|
|
176
|
+
// Treat any existing content as a collision; let the policy decide.
|
|
177
|
+
return { kind: 'unmanaged_collision' };
|
|
178
|
+
}
|
|
179
|
+
const localContent = localBytes.toString('utf8');
|
|
180
|
+
const header = parseManagedHeader(localContent);
|
|
181
|
+
if (!header)
|
|
182
|
+
return { kind: 'unmanaged_collision' };
|
|
183
|
+
if (header.hookPack !== packId) {
|
|
184
|
+
// A managed file from a different pack at our destPath. Treat as
|
|
185
|
+
// unmanaged collision so the user sees a clear refusal.
|
|
186
|
+
return { kind: 'unmanaged_collision' };
|
|
187
|
+
}
|
|
188
|
+
const sourceAbs = path.join(packRoot, file.sourcePath);
|
|
189
|
+
const sourceBytes = readBytes(sourceAbs);
|
|
190
|
+
if (sourceBytes === null) {
|
|
191
|
+
// Source template missing — this is a bug in the install, not a
|
|
192
|
+
// collision. Surface as drift so we don't silently no-op.
|
|
193
|
+
return { kind: 'managed_drift', header };
|
|
194
|
+
}
|
|
195
|
+
if (header.hookPackVersion < packVersion) {
|
|
196
|
+
return {
|
|
197
|
+
kind: 'managed_old_version',
|
|
198
|
+
header,
|
|
199
|
+
currentVersion: header.hookPackVersion,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (bytesEqual(localBytes, sourceBytes)) {
|
|
203
|
+
return { kind: 'managed_clean', header };
|
|
204
|
+
}
|
|
205
|
+
return { kind: 'managed_drift', header };
|
|
206
|
+
}
|
|
207
|
+
function ensureDir(target) {
|
|
208
|
+
fs.mkdirSync(target, { recursive: true });
|
|
209
|
+
}
|
|
210
|
+
function writeFile(destAbs, sourceAbs, executable) {
|
|
211
|
+
ensureDir(path.dirname(destAbs));
|
|
212
|
+
fs.copyFileSync(sourceAbs, destAbs);
|
|
213
|
+
if (executable) {
|
|
214
|
+
try {
|
|
215
|
+
fs.chmodSync(destAbs, 0o755);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// chmod can fail on some filesystems (Windows). Non-fatal.
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function applyOne(ctx, file) {
|
|
223
|
+
const destAbs = path.join(ctx.repoRoot, file.destPath);
|
|
224
|
+
const sourceAbs = path.join(ctx.packRoot, file.sourcePath);
|
|
225
|
+
const state = evaluateFileState(ctx.repoRoot, ctx.packRoot, ctx.pack.id, ctx.pack.packVersion, file);
|
|
226
|
+
switch (state.kind) {
|
|
227
|
+
case 'absent':
|
|
228
|
+
writeFile(destAbs, sourceAbs, file.executable);
|
|
229
|
+
return { destPath: file.destPath, action: 'created' };
|
|
230
|
+
case 'managed_clean':
|
|
231
|
+
return { destPath: file.destPath, action: 'unchanged' };
|
|
232
|
+
case 'managed_old_version':
|
|
233
|
+
writeFile(destAbs, sourceAbs, file.executable);
|
|
234
|
+
return { destPath: file.destPath, action: 'updated' };
|
|
235
|
+
case 'managed_drift':
|
|
236
|
+
if (ctx.overwrite) {
|
|
237
|
+
writeFile(destAbs, sourceAbs, file.executable);
|
|
238
|
+
return { destPath: file.destPath, action: 'updated' };
|
|
239
|
+
}
|
|
240
|
+
if (ctx.adopt) {
|
|
241
|
+
return { destPath: file.destPath, action: 'unchanged' };
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
destPath: file.destPath,
|
|
245
|
+
action: 'refused',
|
|
246
|
+
refusalReason: 'managed_drift',
|
|
247
|
+
};
|
|
248
|
+
case 'unmanaged_collision':
|
|
249
|
+
if (ctx.overwrite) {
|
|
250
|
+
writeFile(destAbs, sourceAbs, file.executable);
|
|
251
|
+
return { destPath: file.destPath, action: 'updated' };
|
|
252
|
+
}
|
|
253
|
+
if (ctx.adopt) {
|
|
254
|
+
return { destPath: file.destPath, action: 'unchanged' };
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
destPath: file.destPath,
|
|
258
|
+
action: 'refused',
|
|
259
|
+
refusalReason: 'unmanaged_collision',
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/** Install a pack into repoRoot. Pure with respect to its inputs except
|
|
264
|
+
* for the filesystem writes it performs. Returns a typed result the
|
|
265
|
+
* caller renders. */
|
|
266
|
+
function installHookPack(pack, options) {
|
|
267
|
+
const ctx = {
|
|
268
|
+
repoRoot: options.repoRoot,
|
|
269
|
+
packRoot: options.packRootOverride ?? packTemplateRoot(pack.id),
|
|
270
|
+
pack,
|
|
271
|
+
overwrite: options.overwrite === true,
|
|
272
|
+
adopt: options.adopt === true,
|
|
273
|
+
};
|
|
274
|
+
const actions = [];
|
|
275
|
+
for (const file of pack.installedFiles) {
|
|
276
|
+
actions.push(applyOne(ctx, file));
|
|
277
|
+
}
|
|
278
|
+
// Determine outcome.
|
|
279
|
+
const anyRefused = actions.some((a) => a.action === 'refused');
|
|
280
|
+
const allUnchanged = actions.every((a) => a.action === 'unchanged');
|
|
281
|
+
let outcome;
|
|
282
|
+
if (anyRefused) {
|
|
283
|
+
// Even a single refusal blocks the outcome from being clean —
|
|
284
|
+
// 'installed' on partial success would imply more than was done.
|
|
285
|
+
// Caller reads action[].refusalReason to decide diagnostic.
|
|
286
|
+
outcome = 'installed';
|
|
287
|
+
}
|
|
288
|
+
else if (allUnchanged) {
|
|
289
|
+
outcome = 'already_installed';
|
|
290
|
+
}
|
|
291
|
+
else if (actions.some((a) => a.action === 'updated') &&
|
|
292
|
+
!actions.some((a) => a.action === 'created')) {
|
|
293
|
+
outcome = 'updated';
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
outcome = 'installed';
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
outcome,
|
|
300
|
+
pack,
|
|
301
|
+
actions,
|
|
302
|
+
activation: pack.activation,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Inspect `.claude/settings.json` and report whether the canonical
|
|
307
|
+
* Claude Code hook wiring is present. Install is non-destructive on
|
|
308
|
+
* settings.json — this function just surfaces the state so the CLI can
|
|
309
|
+
* tell the user exactly what to add.
|
|
310
|
+
*/
|
|
311
|
+
function inspectClaudeSettings(repoRoot) {
|
|
312
|
+
const settingsPath = path.join(repoRoot, '.claude', 'settings.json');
|
|
313
|
+
if (!fs.existsSync(settingsPath)) {
|
|
314
|
+
return { kind: 'absent' };
|
|
315
|
+
}
|
|
316
|
+
let parsed;
|
|
317
|
+
try {
|
|
318
|
+
parsed = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
319
|
+
}
|
|
320
|
+
catch (e) {
|
|
321
|
+
return { kind: 'invalid', error: e.message };
|
|
322
|
+
}
|
|
323
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
324
|
+
return { kind: 'invalid', error: 'settings.json root is not an object' };
|
|
325
|
+
}
|
|
326
|
+
const hooks = parsed.hooks;
|
|
327
|
+
if (!hooks || typeof hooks !== 'object') {
|
|
328
|
+
return {
|
|
329
|
+
kind: 'partial',
|
|
330
|
+
missing: ['PreToolUse', 'PostToolUse', 'SessionStart', 'Stop'],
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
const required = ['PreToolUse', 'PostToolUse', 'SessionStart', 'Stop'];
|
|
334
|
+
const missing = [];
|
|
335
|
+
for (const key of required) {
|
|
336
|
+
const entry = hooks[key];
|
|
337
|
+
if (!Array.isArray(entry) || entry.length === 0) {
|
|
338
|
+
missing.push(key);
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
// A canonical entry has a hook whose command path references
|
|
342
|
+
// .claude/hooks/dispatch/<key snake_case>.sh
|
|
343
|
+
const snake = key
|
|
344
|
+
.replace(/([a-z])([A-Z])/g, '$1_$2')
|
|
345
|
+
.toLowerCase();
|
|
346
|
+
const expectedTail = `.claude/hooks/dispatch/${snake}.sh`;
|
|
347
|
+
let found = false;
|
|
348
|
+
for (const block of entry) {
|
|
349
|
+
const hookList = block.hooks;
|
|
350
|
+
if (!Array.isArray(hookList))
|
|
351
|
+
continue;
|
|
352
|
+
for (const h of hookList) {
|
|
353
|
+
const cmd = h.command;
|
|
354
|
+
if (typeof cmd === 'string' && cmd.includes(expectedTail)) {
|
|
355
|
+
found = true;
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (found)
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
if (!found)
|
|
363
|
+
missing.push(key);
|
|
364
|
+
}
|
|
365
|
+
if (missing.length === 0)
|
|
366
|
+
return { kind: 'wired' };
|
|
367
|
+
return { kind: 'partial', missing };
|
|
368
|
+
}
|
|
369
|
+
/** Canonical settings.json wiring snippet, returned as a JSON string
|
|
370
|
+
* ready to print or copy. Mirrors the snippet in CLAUDE.md. */
|
|
371
|
+
exports.CANONICAL_SETTINGS_SNIPPET = JSON.stringify({
|
|
372
|
+
hooks: {
|
|
373
|
+
PreToolUse: [
|
|
374
|
+
{
|
|
375
|
+
matcher: 'Bash|Read|Write|Edit|Glob|Grep|NotebookEdit',
|
|
376
|
+
hooks: [
|
|
377
|
+
{
|
|
378
|
+
type: 'command',
|
|
379
|
+
command: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/dispatch/pre_tool_use.sh',
|
|
380
|
+
timeout: 45,
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
},
|
|
384
|
+
],
|
|
385
|
+
PostToolUse: [
|
|
386
|
+
{
|
|
387
|
+
matcher: 'Write|Edit|Bash|ExitPlanMode',
|
|
388
|
+
hooks: [
|
|
389
|
+
{
|
|
390
|
+
type: 'command',
|
|
391
|
+
command: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/dispatch/post_tool_use.sh',
|
|
392
|
+
timeout: 60,
|
|
393
|
+
},
|
|
394
|
+
],
|
|
395
|
+
},
|
|
396
|
+
],
|
|
397
|
+
SessionStart: [
|
|
398
|
+
{
|
|
399
|
+
hooks: [
|
|
400
|
+
{
|
|
401
|
+
type: 'command',
|
|
402
|
+
command: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/dispatch/session_start.sh',
|
|
403
|
+
timeout: 30,
|
|
404
|
+
},
|
|
405
|
+
],
|
|
406
|
+
},
|
|
407
|
+
],
|
|
408
|
+
Stop: [
|
|
409
|
+
{
|
|
410
|
+
hooks: [
|
|
411
|
+
{
|
|
412
|
+
type: 'command',
|
|
413
|
+
command: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/dispatch/stop.sh',
|
|
414
|
+
timeout: 30,
|
|
415
|
+
},
|
|
416
|
+
],
|
|
417
|
+
},
|
|
418
|
+
],
|
|
419
|
+
},
|
|
420
|
+
}, null, 2);
|
|
421
|
+
//# sourceMappingURL=hook-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-install.js","sourceRoot":"","sources":["../../src/init/hook-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-claude-code.d.ts","sourceRoot":"","sources":["../../../src/init/hook-packs/manifest-claude-code.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAO1C,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,eAAO,MAAM,gBAAgB,EAAE,UA2K9B,CAAC"}
|