@a5c-ai/hooks-mux-cli 5.0.1-staging.37ca18bd

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.
Files changed (41) hide show
  1. package/dist/cli/adapter-loader.d.ts +33 -0
  2. package/dist/cli/adapter-loader.d.ts.map +1 -0
  3. package/dist/cli/adapter-loader.js +80 -0
  4. package/dist/cli/adapter-loader.js.map +1 -0
  5. package/dist/cli/commands/bootstrap.d.ts +17 -0
  6. package/dist/cli/commands/bootstrap.d.ts.map +1 -0
  7. package/dist/cli/commands/bootstrap.js +77 -0
  8. package/dist/cli/commands/bootstrap.js.map +1 -0
  9. package/dist/cli/commands/clear-session.d.ts +13 -0
  10. package/dist/cli/commands/clear-session.d.ts.map +1 -0
  11. package/dist/cli/commands/clear-session.js +34 -0
  12. package/dist/cli/commands/clear-session.js.map +1 -0
  13. package/dist/cli/commands/doctor.d.ts +16 -0
  14. package/dist/cli/commands/doctor.d.ts.map +1 -0
  15. package/dist/cli/commands/doctor.js +333 -0
  16. package/dist/cli/commands/doctor.js.map +1 -0
  17. package/dist/cli/commands/exec.d.ts +18 -0
  18. package/dist/cli/commands/exec.d.ts.map +1 -0
  19. package/dist/cli/commands/exec.js +79 -0
  20. package/dist/cli/commands/exec.js.map +1 -0
  21. package/dist/cli/commands/invoke.d.ts +26 -0
  22. package/dist/cli/commands/invoke.d.ts.map +1 -0
  23. package/dist/cli/commands/invoke.js +196 -0
  24. package/dist/cli/commands/invoke.js.map +1 -0
  25. package/dist/cli/commands/show-session.d.ts +13 -0
  26. package/dist/cli/commands/show-session.d.ts.map +1 -0
  27. package/dist/cli/commands/show-session.js +53 -0
  28. package/dist/cli/commands/show-session.js.map +1 -0
  29. package/dist/cli/main.d.ts +3 -0
  30. package/dist/cli/main.d.ts.map +1 -0
  31. package/dist/cli/main.js +37 -0
  32. package/dist/cli/main.js.map +1 -0
  33. package/dist/cli/stdin.d.ts +9 -0
  34. package/dist/cli/stdin.d.ts.map +1 -0
  35. package/dist/cli/stdin.js +24 -0
  36. package/dist/cli/stdin.js.map +1 -0
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +6 -0
  40. package/dist/index.js.map +1 -0
  41. package/package.json +40 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Dynamic adapter resolution.
3
+ *
4
+ * Attempts to load a harness adapter package by convention:
5
+ * @a5c-ai/hooks-mux-adapter-<name>
6
+ *
7
+ * Each adapter package is expected to export:
8
+ * - createAdapter(): AdapterCapabilities
9
+ * - phase mappings (e.g. CLAUDE_PHASE_MAPPINGS / equivalent)
10
+ * - normalizer function
11
+ * - renderer function
12
+ * - session resolver
13
+ */
14
+ import type { AdapterCapabilities, PhaseMapping } from '@a5c-ai/hooks-mux-core';
15
+ export interface LoadedAdapter {
16
+ capabilities: AdapterCapabilities;
17
+ phaseMappings: PhaseMapping[];
18
+ /** Raw module exports for adapter-specific functions. */
19
+ module: Record<string, unknown>;
20
+ }
21
+ /**
22
+ * Attempt to load an adapter package by name.
23
+ *
24
+ * @param adapterName - Short adapter name (e.g. 'claude', 'codex', 'copilot').
25
+ * @returns The loaded adapter with capabilities, phase mappings, and raw module.
26
+ * @throws If the adapter package cannot be found or loaded.
27
+ */
28
+ export declare function loadAdapter(adapterName: string): LoadedAdapter;
29
+ /**
30
+ * List of known adapter names for discovery/doctor purposes.
31
+ */
32
+ export declare const KNOWN_ADAPTERS: readonly ["claude", "codex", "copilot", "cursor", "gemini", "oh-my-pi", "openclaw", "opencode", "pi"];
33
+ //# sourceMappingURL=adapter-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-loader.d.ts","sourceRoot":"","sources":["../../src/cli/adapter-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGhF,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAsD9D;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,uGAUjB,CAAC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * Dynamic adapter resolution.
4
+ *
5
+ * Attempts to load a harness adapter package by convention:
6
+ * @a5c-ai/hooks-mux-adapter-<name>
7
+ *
8
+ * Each adapter package is expected to export:
9
+ * - createAdapter(): AdapterCapabilities
10
+ * - phase mappings (e.g. CLAUDE_PHASE_MAPPINGS / equivalent)
11
+ * - normalizer function
12
+ * - renderer function
13
+ * - session resolver
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.KNOWN_ADAPTERS = void 0;
17
+ exports.loadAdapter = loadAdapter;
18
+ const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
19
+ /**
20
+ * Attempt to load an adapter package by name.
21
+ *
22
+ * @param adapterName - Short adapter name (e.g. 'claude', 'codex', 'copilot').
23
+ * @returns The loaded adapter with capabilities, phase mappings, and raw module.
24
+ * @throws If the adapter package cannot be found or loaded.
25
+ */
26
+ function loadAdapter(adapterName) {
27
+ // Auto-detection: probe env vars to determine the adapter
28
+ if (adapterName === 'auto') {
29
+ const detected = (0, hooks_mux_core_1.detectHarness)();
30
+ if (!detected) {
31
+ process.stderr.write('[hooks-mux] auto-detection failed: no harness signals found in environment\n');
32
+ process.exit(1);
33
+ }
34
+ process.stderr.write(`[hooks-mux] auto-detected adapter="${detected.adapter}" ` +
35
+ `confidence=${detected.confidence} evidence=[${detected.evidence.join(', ')}]\n`);
36
+ adapterName = detected.adapter;
37
+ }
38
+ const packageName = `@a5c-ai/hooks-mux-adapter-${adapterName}`;
39
+ let mod;
40
+ try {
41
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
42
+ mod = require(packageName);
43
+ }
44
+ catch (err) {
45
+ throw new Error(`Failed to load adapter "${adapterName}" (package: ${packageName}): ${err instanceof Error ? err.message : String(err)}`);
46
+ }
47
+ // Extract createAdapter function
48
+ const createAdapterFn = mod['createAdapter'];
49
+ if (typeof createAdapterFn !== 'function') {
50
+ throw new Error(`Adapter package "${packageName}" does not export a createAdapter function`);
51
+ }
52
+ const capabilities = createAdapterFn();
53
+ // Extract phase mappings -- convention: <ADAPTER>_PHASE_MAPPINGS or phaseMappings
54
+ let phaseMappings = [];
55
+ for (const key of Object.keys(mod)) {
56
+ if (key.endsWith('_PHASE_MAPPINGS') || key === 'phaseMappings') {
57
+ const candidate = mod[key];
58
+ if (Array.isArray(candidate)) {
59
+ phaseMappings = candidate;
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ return { capabilities, phaseMappings, module: mod };
65
+ }
66
+ /**
67
+ * List of known adapter names for discovery/doctor purposes.
68
+ */
69
+ exports.KNOWN_ADAPTERS = [
70
+ 'claude',
71
+ 'codex',
72
+ 'copilot',
73
+ 'cursor',
74
+ 'gemini',
75
+ 'oh-my-pi',
76
+ 'openclaw',
77
+ 'opencode',
78
+ 'pi',
79
+ ];
80
+ //# sourceMappingURL=adapter-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-loader.js","sourceRoot":"","sources":["../../src/cli/adapter-loader.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAmBH,kCAsDC;AAtED,2DAAuD;AASvD;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,WAAmB;IAC7C,0DAA0D;IAC1D,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAA,8BAAa,GAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8EAA8E,CAC/E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sCAAsC,QAAQ,CAAC,OAAO,IAAI;YAC1D,cAAc,QAAQ,CAAC,UAAU,cAAc,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CACjF,CAAC;QACF,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,MAAM,WAAW,GAAG,6BAA6B,WAAW,EAAE,CAAC;IAE/D,IAAI,GAA4B,CAAC;IACjC,IAAI,CAAC;QACH,8DAA8D;QAC9D,GAAG,GAAG,OAAO,CAAC,WAAW,CAA4B,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,2BAA2B,WAAW,eAAe,WAAW,MAC9D,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7C,IAAI,OAAO,eAAe,KAAK,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,oBAAoB,WAAW,4CAA4C,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,EAAyB,CAAC;IAE9D,kFAAkF;IAClF,IAAI,aAAa,GAAmB,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC/D,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,aAAa,GAAG,SAA2B,CAAC;gBAC5C,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACtD,CAAC;AAED;;GAEG;AACU,QAAA,cAAc,GAAG;IAC5B,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,UAAU;IACV,UAAU;IACV,IAAI;CACI,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * bootstrap command — Dedicated no-op context bootstrap.
3
+ *
4
+ * Spec section 18.3.
5
+ *
6
+ * Delegates to invoke with --bootstrap-only flag internally.
7
+ * Reads stdin for session discovery, creates/loads session, and persists it.
8
+ */
9
+ import type { CommandModule } from 'yargs';
10
+ interface BootstrapArgs {
11
+ adapter: string;
12
+ 'session-id'?: string;
13
+ json?: boolean;
14
+ }
15
+ export declare const bootstrapCommand: CommandModule<object, BootstrapArgs>;
16
+ export {};
17
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,MAAM,EAAE,aAAa,CAoEjE,CAAC"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * bootstrap command — Dedicated no-op context bootstrap.
4
+ *
5
+ * Spec section 18.3.
6
+ *
7
+ * Delegates to invoke with --bootstrap-only flag internally.
8
+ * Reads stdin for session discovery, creates/loads session, and persists it.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.bootstrapCommand = void 0;
12
+ const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
13
+ const adapter_loader_1 = require("../adapter-loader");
14
+ exports.bootstrapCommand = {
15
+ command: 'bootstrap',
16
+ describe: 'No-op context bootstrap — initialize session without running handlers',
17
+ builder: (yargs) => yargs
18
+ .option('adapter', {
19
+ type: 'string',
20
+ demandOption: true,
21
+ describe: 'Adapter name (e.g. claude, codex, copilot) or "auto" to detect from environment',
22
+ })
23
+ .option('session-id', {
24
+ type: 'string',
25
+ describe: 'Explicit session ID override',
26
+ })
27
+ .option('json', {
28
+ type: 'boolean',
29
+ default: false,
30
+ describe: 'Output JSON format',
31
+ }),
32
+ handler: async (args) => {
33
+ const loaded = (0, adapter_loader_1.loadAdapter)(args.adapter);
34
+ const env = process.env;
35
+ // Determine session ID
36
+ const sessionId = args['session-id']
37
+ ?? env['AGENT_SESSION_ID']
38
+ ?? `bootstrap-${Date.now()}`;
39
+ // Normalize a synthetic session.start event for context extraction
40
+ const event = (0, hooks_mux_core_1.normalizeEvent)({
41
+ adapter: args.adapter,
42
+ rawEventName: 'bootstrap',
43
+ env,
44
+ adapterMappings: loaded.phaseMappings,
45
+ });
46
+ // Load or create session
47
+ let session = await (0, hooks_mux_core_1.loadSession)(sessionId);
48
+ if (!session) {
49
+ session = {
50
+ version: 'a5c.hooks.session.v1',
51
+ sessionId,
52
+ adapter: args.adapter,
53
+ createdAt: new Date().toISOString(),
54
+ updatedAt: new Date().toISOString(),
55
+ cwd: event.execution.cwd ?? undefined,
56
+ persistedEnv: { ...event.env.persisted },
57
+ contextVars: {},
58
+ contextFragments: [],
59
+ metadata: {},
60
+ };
61
+ }
62
+ await (0, hooks_mux_core_1.saveSession)(session);
63
+ const output = {
64
+ status: 'bootstrapped',
65
+ sessionId,
66
+ adapter: args.adapter,
67
+ createdAt: session.createdAt,
68
+ };
69
+ if (args.json) {
70
+ process.stdout.write(JSON.stringify(output, null, 2) + '\n');
71
+ }
72
+ else {
73
+ console.log(`Session bootstrapped: ${sessionId} (adapter: ${args.adapter})`);
74
+ }
75
+ },
76
+ };
77
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/cli/commands/bootstrap.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAGH,2DAIgC;AAChC,sDAAgD;AAQnC,QAAA,gBAAgB,GAAyC;IACpE,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,uEAAuE;IACjF,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,SAAS,EAAE;QACjB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,iFAAiF;KAC5F,CAAC;SACD,MAAM,CAAC,YAAY,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,8BAA8B;KACzC,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,oBAAoB;KAC/B,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,IAAA,4BAAW,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAA6B,CAAC;QAElD,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;eAC/B,GAAG,CAAC,kBAAkB,CAAC;eACvB,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE/B,mEAAmE;QACnE,MAAM,KAAK,GAAG,IAAA,+BAAc,EAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,WAAW;YACzB,GAAG;YACH,eAAe,EAAE,MAAM,CAAC,aAAa;SACtC,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,OAAO,GAAG,MAAM,IAAA,4BAAW,EAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG;gBACR,OAAO,EAAE,sBAAsB;gBAC/B,SAAS;gBACT,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,SAAS;gBACrC,YAAY,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE;gBACxC,WAAW,EAAE,EAAE;gBACf,gBAAgB,EAAE,EAAE;gBACpB,QAAQ,EAAE,EAAE;aACb,CAAC;QACJ,CAAC;QAED,MAAM,IAAA,4BAAW,EAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,cAAc;YACtB,SAAS;YACT,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,cAAc,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * clear-session command — Delete one session state file.
3
+ *
4
+ * Spec section 18.5.
5
+ */
6
+ import type { CommandModule } from 'yargs';
7
+ interface ClearSessionArgs {
8
+ 'session-id': string;
9
+ json?: boolean;
10
+ }
11
+ export declare const clearSessionCommand: CommandModule<object, ClearSessionArgs>;
12
+ export {};
13
+ //# sourceMappingURL=clear-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-session.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/clear-session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,UAAU,gBAAgB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,MAAM,EAAE,gBAAgB,CA0BvE,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ /**
3
+ * clear-session command — Delete one session state file.
4
+ *
5
+ * Spec section 18.5.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.clearSessionCommand = void 0;
9
+ const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
10
+ exports.clearSessionCommand = {
11
+ command: 'clear-session',
12
+ describe: 'Delete a session state file',
13
+ builder: (yargs) => yargs
14
+ .option('session-id', {
15
+ type: 'string',
16
+ demandOption: true,
17
+ describe: 'Session ID to delete',
18
+ })
19
+ .option('json', {
20
+ type: 'boolean',
21
+ default: false,
22
+ describe: 'Output JSON format',
23
+ }),
24
+ handler: async (args) => {
25
+ await (0, hooks_mux_core_1.deleteSession)(args['session-id']);
26
+ if (args.json) {
27
+ process.stdout.write(JSON.stringify({ status: 'deleted', sessionId: args['session-id'] }) + '\n');
28
+ }
29
+ else {
30
+ console.log(`Session deleted: ${args['session-id']}`);
31
+ }
32
+ },
33
+ };
34
+ //# sourceMappingURL=clear-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-session.js","sourceRoot":"","sources":["../../../src/cli/commands/clear-session.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,2DAAuD;AAO1C,QAAA,mBAAmB,GAA4C;IAC1E,OAAO,EAAE,eAAe;IACxB,QAAQ,EAAE,6BAA6B;IACvC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,YAAY,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,sBAAsB;KACjC,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,oBAAoB;KAC/B,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,IAAA,8BAAa,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAExC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAC5E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * doctor command — Report adapter capability profile, integration warnings,
3
+ * session store health, and stale session detection.
4
+ *
5
+ * Spec section 18.6 (Phase 5 enhancement).
6
+ */
7
+ import type { CommandModule } from 'yargs';
8
+ interface DoctorArgs {
9
+ adapter?: string;
10
+ json?: boolean;
11
+ 'session-dir'?: string;
12
+ 'stale-threshold'?: number;
13
+ }
14
+ export declare const doctorCommand: CommandModule<object, DoctorArgs>;
15
+ export {};
16
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAO3C,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA0PD,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,CAoH3D,CAAC"}
@@ -0,0 +1,333 @@
1
+ "use strict";
2
+ /**
3
+ * doctor command — Report adapter capability profile, integration warnings,
4
+ * session store health, and stale session detection.
5
+ *
6
+ * Spec section 18.6 (Phase 5 enhancement).
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.doctorCommand = void 0;
43
+ const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
44
+ const adapter_loader_1 = require("../adapter-loader");
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const ALL_CANONICAL_PHASES = [
48
+ 'session.start', 'session.end', 'session.cwd_changed', 'session.file_changed',
49
+ 'session.config_changed', 'session.compact.before', 'session.compact.after',
50
+ 'turn.user_prompt_submitted', 'turn.before_agent', 'turn.after_agent',
51
+ 'turn.stop', 'turn.error',
52
+ 'model.before_request', 'model.after_response',
53
+ 'planner.before_tool_selection',
54
+ 'tool.before', 'tool.after', 'tool.error',
55
+ 'tool.permission_request', 'tool.permission_denied',
56
+ 'subagent.start', 'subagent.end',
57
+ 'notification', 'message.received', 'message.sending', 'message.sent',
58
+ 'mcp.elicitation', 'mcp.elicitation_result',
59
+ ];
60
+ function buildCapabilityProfile(mappings) {
61
+ const supported = new Set();
62
+ const blockable = new Set();
63
+ const mutable = new Set();
64
+ const lossy = new Set();
65
+ const emulated = new Set();
66
+ for (const m of mappings) {
67
+ supported.add(m.canonicalPhase);
68
+ if (m.blockCapability)
69
+ blockable.add(m.canonicalPhase);
70
+ if (m.mutationCapability)
71
+ mutable.add(m.canonicalPhase);
72
+ if (m.supportLevel === 'lossy')
73
+ lossy.add(m.canonicalPhase);
74
+ if (m.supportLevel === 'emulated')
75
+ emulated.add(m.canonicalPhase);
76
+ }
77
+ const unsupported = ALL_CANONICAL_PHASES.filter((p) => !supported.has(p));
78
+ return {
79
+ supportedPhases: [...supported],
80
+ unsupportedPhases: unsupported,
81
+ blockablePhases: [...blockable],
82
+ mutablePhases: [...mutable],
83
+ lossyPhases: [...lossy],
84
+ emulatedPhases: [...emulated],
85
+ };
86
+ }
87
+ function analyzeAdapter(name) {
88
+ const warnings = [];
89
+ const packageName = `@a5c-ai/hooks-mux-adapter-${name}`;
90
+ try {
91
+ const loaded = (0, adapter_loader_1.loadAdapter)(name);
92
+ const caps = loaded.capabilities;
93
+ const profile = buildCapabilityProfile(loaded.phaseMappings);
94
+ // Generate warnings based on capability gaps
95
+ if (!caps.supportsBlock) {
96
+ warnings.push('Adapter does not support blocking decisions (deny/ask will be downgraded to noop)');
97
+ }
98
+ if (!caps.supportsNativeAdditionalContext) {
99
+ warnings.push('Adapter does not support native additionalContext injection');
100
+ }
101
+ if (caps.envPersistenceMode === 'none') {
102
+ warnings.push('No env persistence -- session context will not propagate to downstream tools');
103
+ }
104
+ if (caps.sessionIdQuality === 'synthetic' || caps.sessionIdQuality === 'none') {
105
+ warnings.push('Session ID is synthetic or unavailable -- cross-hook state may be unreliable');
106
+ }
107
+ if (caps.toolInterceptionScope === 'none') {
108
+ warnings.push('No tool interception -- tool.before/tool.after phases will be unsupported');
109
+ }
110
+ if (loaded.phaseMappings.length === 0) {
111
+ warnings.push('No phase mappings found -- all events will map to "unknown" phase');
112
+ }
113
+ // Capability gap warnings
114
+ if (profile.unsupportedPhases.length > 0) {
115
+ warnings.push(`${profile.unsupportedPhases.length} canonical phases are unsupported: ${profile.unsupportedPhases.slice(0, 5).join(', ')}${profile.unsupportedPhases.length > 5 ? '...' : ''}`);
116
+ }
117
+ if (profile.lossyPhases.length > 0) {
118
+ warnings.push(`${profile.lossyPhases.length} phases have lossy mapping: ${profile.lossyPhases.join(', ')}`);
119
+ }
120
+ if (!caps.supportsAsk && caps.supportsBlock) {
121
+ warnings.push('Adapter supports block but not ask -- interactive approval flows will not work');
122
+ }
123
+ if (!caps.supportsToolInputMutation && !caps.supportsToolResultMutation) {
124
+ warnings.push('No tool mutation support -- toolMutation results will be ignored');
125
+ }
126
+ if (caps.notes) {
127
+ for (const note of caps.notes) {
128
+ warnings.push(`Note: ${note}`);
129
+ }
130
+ }
131
+ const phaseSummaries = loaded.phaseMappings.map((m) => ({
132
+ canonicalPhase: m.canonicalPhase,
133
+ nativeHook: m.nativeHook,
134
+ supportLevel: m.supportLevel,
135
+ blockCapability: m.blockCapability,
136
+ mutationCapability: m.mutationCapability,
137
+ }));
138
+ return {
139
+ name,
140
+ available: true,
141
+ packageName,
142
+ capabilities: caps,
143
+ phaseMappings: phaseSummaries,
144
+ capabilityProfile: profile,
145
+ warnings,
146
+ };
147
+ }
148
+ catch (err) {
149
+ return {
150
+ name,
151
+ available: false,
152
+ packageName,
153
+ warnings: [],
154
+ error: err instanceof Error ? err.message : String(err),
155
+ };
156
+ }
157
+ }
158
+ async function checkSessionHealth(sessionDir, staleThresholdHours) {
159
+ const report = {
160
+ sessionDir,
161
+ dirExists: false,
162
+ sessionCount: 0,
163
+ staleSessions: [],
164
+ corruptSessions: [],
165
+ totalSizeBytes: 0,
166
+ errors: [],
167
+ };
168
+ try {
169
+ await fs.promises.access(sessionDir);
170
+ report.dirExists = true;
171
+ }
172
+ catch {
173
+ return report;
174
+ }
175
+ let entries;
176
+ try {
177
+ entries = await fs.promises.readdir(sessionDir);
178
+ }
179
+ catch (err) {
180
+ report.errors.push(`Failed to read session directory: ${err instanceof Error ? err.message : String(err)}`);
181
+ return report;
182
+ }
183
+ const jsonFiles = entries.filter((e) => e.endsWith('.json') && !e.includes('.corrupt.') && !e.endsWith('.lock'));
184
+ report.sessionCount = jsonFiles.length;
185
+ const now = Date.now();
186
+ for (const file of jsonFiles) {
187
+ const filePath = path.join(sessionDir, file);
188
+ try {
189
+ const stat = await fs.promises.stat(filePath);
190
+ report.totalSizeBytes += stat.size;
191
+ const raw = await fs.promises.readFile(filePath, 'utf-8');
192
+ const envelope = JSON.parse(raw);
193
+ const session = envelope.session;
194
+ if (!session || !session.updatedAt || !session.sessionId) {
195
+ report.corruptSessions.push(file);
196
+ continue;
197
+ }
198
+ const updatedAt = new Date(session.updatedAt).getTime();
199
+ const ageHours = (now - updatedAt) / (1000 * 60 * 60);
200
+ if (ageHours > staleThresholdHours) {
201
+ report.staleSessions.push({
202
+ sessionId: session.sessionId,
203
+ lastUpdated: session.updatedAt,
204
+ ageHours: Math.round(ageHours * 10) / 10,
205
+ adapter: session.adapter ?? 'unknown',
206
+ fileSizeBytes: stat.size,
207
+ });
208
+ }
209
+ }
210
+ catch {
211
+ report.corruptSessions.push(file);
212
+ }
213
+ }
214
+ // Check for corrupt backup files
215
+ const corruptBackups = entries.filter((e) => e.includes('.corrupt.'));
216
+ if (corruptBackups.length > 0) {
217
+ report.errors.push(`${corruptBackups.length} corrupt backup file(s) found in session directory`);
218
+ }
219
+ return report;
220
+ }
221
+ exports.doctorCommand = {
222
+ command: 'doctor',
223
+ describe: 'Report adapter capability profile, session health, and integration warnings',
224
+ builder: (yargs) => yargs
225
+ .option('adapter', {
226
+ type: 'string',
227
+ describe: 'Specific adapter to check (omit for all known adapters)',
228
+ })
229
+ .option('json', {
230
+ type: 'boolean',
231
+ default: false,
232
+ describe: 'Output JSON format',
233
+ })
234
+ .option('session-dir', {
235
+ type: 'string',
236
+ describe: 'Session store directory to check (defaults to platform default)',
237
+ })
238
+ .option('stale-threshold', {
239
+ type: 'number',
240
+ default: 24,
241
+ describe: 'Hours after which a session is considered stale',
242
+ }),
243
+ handler: async (args) => {
244
+ const adapterNames = args.adapter ? [args.adapter] : [...adapter_loader_1.KNOWN_ADAPTERS];
245
+ const adapterReports = adapterNames.map(analyzeAdapter);
246
+ const sessionDir = args['session-dir'] ?? (0, hooks_mux_core_1.getDefaultSessionDir)();
247
+ const sessionHealth = await checkSessionHealth(sessionDir, args['stale-threshold'] ?? 24);
248
+ const report = {
249
+ timestamp: new Date().toISOString(),
250
+ adapters: adapterReports,
251
+ sessionHealth,
252
+ };
253
+ if (args.json) {
254
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
255
+ return;
256
+ }
257
+ // Human-readable output
258
+ console.log('=== Hooks Proxy Doctor ===');
259
+ console.log('');
260
+ // Adapter reports
261
+ console.log('--- Adapters ---');
262
+ for (const r of adapterReports) {
263
+ if (!r.available) {
264
+ console.log(`[x] ${r.name} (${r.packageName}): not available`);
265
+ if (r.error) {
266
+ console.log(` ${r.error}`);
267
+ }
268
+ console.log('');
269
+ continue;
270
+ }
271
+ const caps = r.capabilities;
272
+ const profile = r.capabilityProfile;
273
+ console.log(`[ok] ${r.name} (${r.packageName})`);
274
+ console.log(` Family: ${caps.family}`);
275
+ console.log(` Session ID: ${caps.sessionIdQuality}`);
276
+ console.log(` Env persistence: ${caps.envPersistenceMode}`);
277
+ console.log(` Blocking: ${caps.supportsBlock ? 'yes' : 'no'}`);
278
+ console.log(` Ask: ${caps.supportsAsk ? 'yes' : 'no'}`);
279
+ console.log(` Tool scope: ${caps.toolInterceptionScope}`);
280
+ console.log(` Tool mutation: input=${caps.supportsToolInputMutation ? 'yes' : 'no'} result=${caps.supportsToolResultMutation ? 'yes' : 'no'}`);
281
+ console.log(` Phases: ${profile.supportedPhases.length} supported, ${profile.unsupportedPhases.length} unsupported`);
282
+ if (profile.lossyPhases.length > 0) {
283
+ console.log(` Lossy phases: ${profile.lossyPhases.join(', ')}`);
284
+ }
285
+ if (profile.emulatedPhases.length > 0) {
286
+ console.log(` Emulated phases: ${profile.emulatedPhases.join(', ')}`);
287
+ }
288
+ if (r.warnings.length > 0) {
289
+ console.log(' Warnings:');
290
+ for (const w of r.warnings) {
291
+ console.log(` - ${w}`);
292
+ }
293
+ }
294
+ console.log('');
295
+ }
296
+ // Session health
297
+ console.log('--- Session Store ---');
298
+ console.log(` Directory: ${sessionHealth.sessionDir}`);
299
+ console.log(` Exists: ${sessionHealth.dirExists ? 'yes' : 'no'}`);
300
+ if (sessionHealth.dirExists) {
301
+ console.log(` Sessions: ${sessionHealth.sessionCount}`);
302
+ console.log(` Total size: ${formatBytes(sessionHealth.totalSizeBytes)}`);
303
+ if (sessionHealth.staleSessions.length > 0) {
304
+ console.log(` Stale (>${args['stale-threshold'] ?? 24}h): ${sessionHealth.staleSessions.length}`);
305
+ for (const s of sessionHealth.staleSessions) {
306
+ console.log(` - ${s.sessionId} (${s.adapter}, ${s.ageHours}h old, ${formatBytes(s.fileSizeBytes)})`);
307
+ }
308
+ }
309
+ if (sessionHealth.corruptSessions.length > 0) {
310
+ console.log(` Corrupt: ${sessionHealth.corruptSessions.length}`);
311
+ for (const c of sessionHealth.corruptSessions) {
312
+ console.log(` - ${c}`);
313
+ }
314
+ }
315
+ if (sessionHealth.errors.length > 0) {
316
+ console.log(' Errors:');
317
+ for (const e of sessionHealth.errors) {
318
+ console.log(` - ${e}`);
319
+ }
320
+ }
321
+ }
322
+ console.log('');
323
+ },
324
+ };
325
+ function formatBytes(bytes) {
326
+ if (bytes === 0)
327
+ return '0 B';
328
+ const units = ['B', 'KB', 'MB', 'GB'];
329
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
330
+ const val = bytes / Math.pow(1024, i);
331
+ return `${val.toFixed(i > 0 ? 1 : 0)} ${units[i]}`;
332
+ }
333
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * exec command — Run a command with restored session context.
3
+ *
4
+ * Spec section 18.2.
5
+ *
6
+ * Pipeline:
7
+ * 1. Load session state
8
+ * 2. Materialize env/context into subprocess
9
+ * 3. Exec target command
10
+ */
11
+ import type { CommandModule } from 'yargs';
12
+ interface ExecArgs {
13
+ 'session-id': string;
14
+ _: (string | number)[];
15
+ }
16
+ export declare const execCommand: CommandModule<object, ExecArgs>;
17
+ export {};
18
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,UAAU,QAAQ;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAyEvD,CAAC"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * exec command — Run a command with restored session context.
4
+ *
5
+ * Spec section 18.2.
6
+ *
7
+ * Pipeline:
8
+ * 1. Load session state
9
+ * 2. Materialize env/context into subprocess
10
+ * 3. Exec target command
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.execCommand = void 0;
14
+ const child_process_1 = require("child_process");
15
+ const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
16
+ exports.execCommand = {
17
+ command: 'exec',
18
+ describe: 'Run a command with restored session context',
19
+ builder: (yargs) => yargs
20
+ .option('session-id', {
21
+ type: 'string',
22
+ demandOption: true,
23
+ describe: 'Session ID to load context from',
24
+ })
25
+ .parserConfiguration({ 'populate--': true })
26
+ .example('$0 exec --session-id abc123 -- echo hello', 'Run "echo hello" with session abc123 context'),
27
+ handler: async (args) => {
28
+ const sessionId = args['session-id'];
29
+ const command = args['--'] ?? [];
30
+ if (command.length === 0) {
31
+ console.error('Error: No command specified after --');
32
+ process.exitCode = 1;
33
+ return;
34
+ }
35
+ // Create a session store shim for materializeExecContext
36
+ const sessionStore = {
37
+ loadSession: (id) => (0, hooks_mux_core_1.loadSession)(id),
38
+ saveSession: async () => { },
39
+ };
40
+ // Materialize execution context
41
+ let childEnv;
42
+ try {
43
+ const materialized = await (0, hooks_mux_core_1.materializeExecContext)({
44
+ sessionId,
45
+ sessionStore,
46
+ });
47
+ // Merge materialized env with current process env
48
+ childEnv = {
49
+ ...process.env,
50
+ ...materialized.env,
51
+ };
52
+ }
53
+ catch {
54
+ // Fallback: inject at least AGENT_SESSION_ID even if session not found
55
+ childEnv = {
56
+ ...process.env,
57
+ AGENT_SESSION_ID: sessionId,
58
+ };
59
+ }
60
+ // Spawn the target command
61
+ const [cmd, ...cmdArgs] = command;
62
+ const child = (0, child_process_1.spawn)(cmd, cmdArgs, {
63
+ env: childEnv,
64
+ stdio: 'inherit',
65
+ });
66
+ child.on('error', (err) => {
67
+ console.error(`Failed to execute command: ${err.message}`);
68
+ process.exitCode = 1;
69
+ });
70
+ child.on('close', (code) => {
71
+ process.exitCode = code ?? 0;
72
+ });
73
+ // Wait for the child process to finish
74
+ await new Promise((resolve) => {
75
+ child.on('close', () => resolve());
76
+ });
77
+ },
78
+ };
79
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/cli/commands/exec.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAEH,iDAAsC;AAEtC,2DAGgC;AAOnB,QAAA,WAAW,GAAoC;IAC1D,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,6CAA6C;IACvD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,YAAY,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,iCAAiC;KAC5C,CAAC;SACD,mBAAmB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SAC3C,OAAO,CACN,2CAA2C,EAC3C,8CAA8C,CAC/C;IACL,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,OAAO,GAAI,IAAI,CAAC,IAAI,CAA0B,IAAI,EAAE,CAAC;QAE3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACtD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,yDAAyD;QACzD,MAAM,YAAY,GAAG;YACnB,WAAW,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAA,4BAAW,EAAC,EAAE,CAAC;YAC5C,WAAW,EAAE,KAAK,IAAI,EAAE,GAA6B,CAAC;SACvD,CAAC;QAEF,gCAAgC;QAChC,IAAI,QAA4C,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAA,uCAAsB,EAAC;gBAChD,SAAS;gBACT,YAAY;aACb,CAAC,CAAC;YAEH,kDAAkD;YAClD,QAAQ,GAAG;gBACT,GAAG,OAAO,CAAC,GAAG;gBACd,GAAG,YAAY,CAAC,GAAG;aACpB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,QAAQ,GAAG;gBACT,GAAG,OAAO,CAAC,GAAG;gBACd,gBAAgB,EAAE,SAAS;aAC5B,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,MAAM,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC;QAClC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,GAAG,EAAE,OAAO,EAAE;YAChC,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * invoke command — Primary hook entrypoint.
3
+ *
4
+ * Spec section 18.1.
5
+ *
6
+ * Pipeline:
7
+ * 1. Read stdin when adapter expects it
8
+ * 2. Normalize event via core normalizeEvent
9
+ * 3. Resolve/load session context via core session store
10
+ * 4. Run handler or fan-out plan via core runPlan
11
+ * 5. Merge results via core mergeResults
12
+ * 6. Persist session store
13
+ * 7. Apply propagation backend
14
+ * 8. Emit adapter-native output
15
+ */
16
+ import type { CommandModule } from 'yargs';
17
+ interface InvokeArgs {
18
+ adapter: string;
19
+ handler?: string[];
20
+ 'bootstrap-only'?: boolean;
21
+ 'session-id'?: string;
22
+ json?: boolean;
23
+ }
24
+ export declare const invokeCommand: CommandModule<object, InvokeArgs>;
25
+ export {};
26
+ //# sourceMappingURL=invoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAgB3C,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA6CD,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,CAiJ3D,CAAC"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * invoke command — Primary hook entrypoint.
4
+ *
5
+ * Spec section 18.1.
6
+ *
7
+ * Pipeline:
8
+ * 1. Read stdin when adapter expects it
9
+ * 2. Normalize event via core normalizeEvent
10
+ * 3. Resolve/load session context via core session store
11
+ * 4. Run handler or fan-out plan via core runPlan
12
+ * 5. Merge results via core mergeResults
13
+ * 6. Persist session store
14
+ * 7. Apply propagation backend
15
+ * 8. Emit adapter-native output
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.invokeCommand = void 0;
19
+ const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
20
+ const adapter_loader_1 = require("../adapter-loader");
21
+ const stdin_1 = require("../stdin");
22
+ /**
23
+ * Try to parse a string as JSON, returning undefined on failure.
24
+ */
25
+ function tryParseJson(raw) {
26
+ const trimmed = raw.trim();
27
+ if (!trimmed)
28
+ return undefined;
29
+ try {
30
+ return JSON.parse(trimmed);
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ /**
37
+ * Resolve the session ID from explicit flag, env, or stdin payload.
38
+ */
39
+ function resolveSessionId(explicitSessionId, stdinData, env) {
40
+ if (explicitSessionId)
41
+ return explicitSessionId;
42
+ if (env['AGENT_SESSION_ID'])
43
+ return env['AGENT_SESSION_ID'];
44
+ if (stdinData && typeof stdinData['session_id'] === 'string') {
45
+ return stdinData['session_id'];
46
+ }
47
+ return null;
48
+ }
49
+ /**
50
+ * Parse --handler values into HandlerRef objects.
51
+ * Format: "source:handler" or just "source" (handler defaults to "handler").
52
+ */
53
+ function parseHandlerArgs(handlers) {
54
+ return handlers.map((h) => {
55
+ const colonIdx = h.indexOf(':');
56
+ if (colonIdx >= 0) {
57
+ return { source: h.slice(0, colonIdx), handler: h.slice(colonIdx + 1) };
58
+ }
59
+ return { source: h, handler: 'handler' };
60
+ });
61
+ }
62
+ exports.invokeCommand = {
63
+ command: 'invoke',
64
+ describe: 'Primary hook entrypoint — normalize, execute, merge, propagate',
65
+ builder: (yargs) => yargs
66
+ .option('adapter', {
67
+ type: 'string',
68
+ demandOption: true,
69
+ describe: 'Adapter name (e.g. claude, codex, copilot) or "auto" to detect from environment',
70
+ })
71
+ .option('handler', {
72
+ type: 'array',
73
+ string: true,
74
+ describe: 'Shell command handler(s) in command:label format',
75
+ })
76
+ .option('bootstrap-only', {
77
+ type: 'boolean',
78
+ default: false,
79
+ describe: 'Only bootstrap session context, skip handler execution',
80
+ })
81
+ .option('session-id', {
82
+ type: 'string',
83
+ describe: 'Explicit session ID override',
84
+ })
85
+ .option('json', {
86
+ type: 'boolean',
87
+ default: false,
88
+ describe: 'Output JSON format',
89
+ }),
90
+ handler: async (args) => {
91
+ // 1. Load adapter
92
+ const loaded = (0, adapter_loader_1.loadAdapter)(args.adapter);
93
+ // 2. Read stdin
94
+ const rawStdin = await (0, stdin_1.readStdin)();
95
+ const stdinPayload = tryParseJson(rawStdin);
96
+ const stdinData = (typeof stdinPayload === 'object' && stdinPayload !== null && !Array.isArray(stdinPayload))
97
+ ? stdinPayload
98
+ : undefined;
99
+ // Determine raw event name from env or stdin
100
+ const env = process.env;
101
+ const rawEventName = env['HOOKS_PROXY_EVENT_NAME']
102
+ ?? stdinData?.['event_name']
103
+ ?? 'unknown';
104
+ // 3. Normalize event
105
+ const event = (0, hooks_mux_core_1.normalizeEvent)({
106
+ adapter: args.adapter,
107
+ rawEventName,
108
+ stdinPayload,
109
+ env,
110
+ adapterMappings: loaded.phaseMappings,
111
+ });
112
+ // 4. Resolve session
113
+ const sessionId = resolveSessionId(args['session-id'], stdinData, env);
114
+ let session = null;
115
+ if (sessionId) {
116
+ session = await (0, hooks_mux_core_1.loadSession)(sessionId);
117
+ if (!session) {
118
+ // Create a new session
119
+ session = {
120
+ version: 'a5c.hooks.session.v1',
121
+ sessionId,
122
+ adapter: args.adapter,
123
+ createdAt: new Date().toISOString(),
124
+ updatedAt: new Date().toISOString(),
125
+ cwd: event.execution.cwd ?? undefined,
126
+ transcriptPath: event.execution.transcriptPath ?? undefined,
127
+ persistedEnv: { ...event.env.persisted },
128
+ contextVars: {},
129
+ contextFragments: [],
130
+ metadata: {},
131
+ };
132
+ }
133
+ // Inject session context into event execution
134
+ event.execution.sessionId = sessionId;
135
+ if (session.persistedEnv) {
136
+ Object.assign(event.execution.persistedEnv, session.persistedEnv);
137
+ }
138
+ }
139
+ // 5. Bootstrap-only mode: persist session and exit
140
+ if (args['bootstrap-only']) {
141
+ if (session) {
142
+ await (0, hooks_mux_core_1.saveSession)(session);
143
+ }
144
+ if (args.json) {
145
+ process.stdout.write(JSON.stringify({ status: 'bootstrapped', sessionId }, null, 2) + '\n');
146
+ }
147
+ return;
148
+ }
149
+ // 6. Resolve execution plan
150
+ const handlers = args.handler ? parseHandlerArgs(args.handler) : [];
151
+ const plan = (0, hooks_mux_core_1.resolveHookPlan)({
152
+ phase: event.phase,
153
+ handlers,
154
+ });
155
+ // 7. Run plan and merge
156
+ let merged;
157
+ if (plan.length > 0) {
158
+ const results = await (0, hooks_mux_core_1.runPlan)(event, plan, { capabilities: loaded.capabilities });
159
+ merged = (0, hooks_mux_core_1.mergeResults)(results);
160
+ }
161
+ else {
162
+ // No handlers: produce a noop result
163
+ merged = (0, hooks_mux_core_1.mergeResults)([{ decision: 'noop' }]);
164
+ }
165
+ // 8. Persist session updates
166
+ if (session && sessionId) {
167
+ if (Object.keys(merged.persistEnv).length > 0) {
168
+ session.persistedEnv = { ...session.persistedEnv, ...merged.persistEnv };
169
+ }
170
+ if (Object.keys(merged.contextVars).length > 0) {
171
+ session.contextVars = { ...session.contextVars, ...merged.contextVars };
172
+ }
173
+ for (const key of merged.unsetEnv) {
174
+ delete session.persistedEnv[key];
175
+ }
176
+ session.updatedAt = new Date().toISOString();
177
+ await (0, hooks_mux_core_1.saveSession)(session);
178
+ }
179
+ // 9. Apply propagation backend
180
+ if (Object.keys(merged.persistEnv).length > 0) {
181
+ const backend = loaded.capabilities.envPersistenceMode;
182
+ await (0, hooks_mux_core_1.propagateEnv)(backend, merged.persistEnv, {
183
+ nativeEnvFilePath: env['CLAUDE_ENV_FILE'] ?? env['HOOKS_PROXY_ENV_FILE'],
184
+ });
185
+ }
186
+ // 10. Emit adapter-native output
187
+ const adapted = (0, hooks_mux_core_1.adaptOutput)({
188
+ adapter: args.adapter,
189
+ mergedResult: merged,
190
+ nativeInput: stdinPayload,
191
+ capabilities: loaded.capabilities,
192
+ });
193
+ process.stdout.write(JSON.stringify(adapted.output, null, args.json ? 2 : 0) + '\n');
194
+ },
195
+ };
196
+ //# sourceMappingURL=invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../../src/cli/commands/invoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * show-session command — Inspect current session state.
3
+ *
4
+ * Spec section 18.4.
5
+ */
6
+ import type { CommandModule } from 'yargs';
7
+ interface ShowSessionArgs {
8
+ 'session-id': string;
9
+ json?: boolean;
10
+ }
11
+ export declare const showSessionCommand: CommandModule<object, ShowSessionArgs>;
12
+ export {};
13
+ //# sourceMappingURL=show-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-session.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/show-session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC,MAAM,EAAE,eAAe,CA0CrE,CAAC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * show-session command — Inspect current session state.
4
+ *
5
+ * Spec section 18.4.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.showSessionCommand = void 0;
9
+ const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
10
+ exports.showSessionCommand = {
11
+ command: 'show-session',
12
+ describe: 'Inspect current session state',
13
+ builder: (yargs) => yargs
14
+ .option('session-id', {
15
+ type: 'string',
16
+ demandOption: true,
17
+ describe: 'Session ID to inspect',
18
+ })
19
+ .option('json', {
20
+ type: 'boolean',
21
+ default: false,
22
+ describe: 'Output JSON format',
23
+ }),
24
+ handler: async (args) => {
25
+ const session = await (0, hooks_mux_core_1.loadSession)(args['session-id']);
26
+ if (!session) {
27
+ if (args.json) {
28
+ process.stdout.write(JSON.stringify({ error: 'Session not found', sessionId: args['session-id'] }) + '\n');
29
+ }
30
+ else {
31
+ console.error(`Session not found: ${args['session-id']}`);
32
+ }
33
+ process.exitCode = 1;
34
+ return;
35
+ }
36
+ if (args.json) {
37
+ process.stdout.write(JSON.stringify(session, null, 2) + '\n');
38
+ }
39
+ else {
40
+ console.log(`Session: ${session.sessionId}`);
41
+ console.log(` Adapter: ${session.adapter}`);
42
+ console.log(` Created: ${session.createdAt}`);
43
+ console.log(` Updated: ${session.updatedAt}`);
44
+ if (session.cwd)
45
+ console.log(` CWD: ${session.cwd}`);
46
+ const envCount = Object.keys(session.persistedEnv).length;
47
+ console.log(` Env vars: ${envCount}`);
48
+ const varCount = Object.keys(session.contextVars).length;
49
+ console.log(` Context: ${varCount} vars, ${session.contextFragments.length} fragments`);
50
+ }
51
+ },
52
+ };
53
+ //# sourceMappingURL=show-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-session.js","sourceRoot":"","sources":["../../../src/cli/commands/show-session.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,2DAAqD;AAOxC,QAAA,kBAAkB,GAA2C;IACxE,OAAO,EAAE,cAAc;IACvB,QAAQ,EAAE,+BAA+B;IACzC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,YAAY,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,uBAAuB;KAClC,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,oBAAoB;KAC/B,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,MAAM,IAAA,4BAAW,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAEtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7G,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAChD,IAAI,OAAO,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,UAAU,OAAO,CAAC,gBAAgB,CAAC,MAAM,YAAY,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(argv?: string[]): Promise<void>;
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAWA,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvE"}
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.main = main;
8
+ const yargs_1 = __importDefault(require("yargs"));
9
+ const helpers_1 = require("yargs/helpers");
10
+ const invoke_1 = require("./commands/invoke");
11
+ const exec_1 = require("./commands/exec");
12
+ const bootstrap_1 = require("./commands/bootstrap");
13
+ const show_session_1 = require("./commands/show-session");
14
+ const clear_session_1 = require("./commands/clear-session");
15
+ const doctor_1 = require("./commands/doctor");
16
+ async function main(argv = process.argv) {
17
+ await (0, yargs_1.default)((0, helpers_1.hideBin)(argv))
18
+ .scriptName('a5c-hooks-mux')
19
+ .usage('$0 <command> [options]')
20
+ .command(invoke_1.invokeCommand)
21
+ .command(exec_1.execCommand)
22
+ .command(bootstrap_1.bootstrapCommand)
23
+ .command(show_session_1.showSessionCommand)
24
+ .command(clear_session_1.clearSessionCommand)
25
+ .command(doctor_1.doctorCommand)
26
+ .demandCommand(1, 'You must provide a command')
27
+ .strict()
28
+ .help()
29
+ .parseAsync();
30
+ }
31
+ if (require.main === module) {
32
+ main().catch((err) => {
33
+ console.error(err);
34
+ process.exit(1);
35
+ });
36
+ }
37
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";;;;;;AAWA,oBAcC;AAvBD,kDAA0B;AAC1B,2CAAwC;AACxC,8CAAkD;AAClD,0CAA8C;AAC9C,oDAAwD;AACxD,0DAA6D;AAC7D,4DAA+D;AAC/D,8CAAkD;AAE3C,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI;IACtD,MAAM,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,IAAI,CAAC,CAAC;SACvB,UAAU,CAAC,eAAe,CAAC;SAC3B,KAAK,CAAC,wBAAwB,CAAC;SAC/B,OAAO,CAAC,sBAAa,CAAC;SACtB,OAAO,CAAC,kBAAW,CAAC;SACpB,OAAO,CAAC,4BAAgB,CAAC;SACzB,OAAO,CAAC,iCAAkB,CAAC;SAC3B,OAAO,CAAC,mCAAmB,CAAC;SAC5B,OAAO,CAAC,sBAAa,CAAC;SACtB,aAAa,CAAC,CAAC,EAAE,4BAA4B,CAAC;SAC9C,MAAM,EAAE;SACR,IAAI,EAAE;SACN,UAAU,EAAE,CAAC;AAClB,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Stdin reading utility.
3
+ */
4
+ /**
5
+ * Read all of stdin as a string.
6
+ * Returns empty string if stdin is a TTY (interactive terminal).
7
+ */
8
+ export declare function readStdin(): Promise<string>;
9
+ //# sourceMappingURL=stdin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../../src/cli/stdin.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAc3C"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * Stdin reading utility.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readStdin = readStdin;
7
+ /**
8
+ * Read all of stdin as a string.
9
+ * Returns empty string if stdin is a TTY (interactive terminal).
10
+ */
11
+ function readStdin() {
12
+ return new Promise((resolve, reject) => {
13
+ const chunks = [];
14
+ const stdin = process.stdin;
15
+ if (stdin.isTTY) {
16
+ resolve('');
17
+ return;
18
+ }
19
+ stdin.on('data', (chunk) => chunks.push(chunk));
20
+ stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
21
+ stdin.on('error', reject);
22
+ });
23
+ }
24
+ //# sourceMappingURL=stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/cli/stdin.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAMH,8BAcC;AAlBD;;;GAGG;AACH,SAAgB,SAAS;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { main } from './cli/main';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.main = void 0;
4
+ var main_1 = require("./cli/main");
5
+ Object.defineProperty(exports, "main", { enumerable: true, get: function () { return main_1.main; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAAzB,4FAAA,IAAI,OAAA"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@a5c-ai/hooks-mux-cli",
3
+ "version": "5.0.1-staging.37ca18bd",
4
+ "description": "CLI entrypoint for the hooks-mux system",
5
+ "license": "UNLICENSED",
6
+ "type": "commonjs",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "bin": {
10
+ "a5c-hooks-mux": "dist/cli/main.js"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/a5c-ai/babysitter.git",
18
+ "directory": "packages/hooks-mux/cli"
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc -p tsconfig.json",
25
+ "clean": "rimraf dist",
26
+ "lint": "eslint \"src/**/*.ts\" --max-warnings=0",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest"
29
+ },
30
+ "dependencies": {
31
+ "@a5c-ai/hooks-mux-core": "5.0.1-staging.37ca18bd",
32
+ "yargs": "^17.0.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/yargs": "^17.0.0",
36
+ "typescript": "^5.7.0",
37
+ "vitest": "^3.0.0",
38
+ "rimraf": "^6.0.0"
39
+ }
40
+ }