@pleri/olam-cli 0.1.159 → 0.1.161

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 (88) hide show
  1. package/README.md +11 -0
  2. package/dist/agent-stream/agent-sdk-to-chunks.js +3 -0
  3. package/dist/agent-stream/driver-runner.js +9 -4
  4. package/dist/agent-stream/host-driver-launch.js +48 -0
  5. package/dist/commands/bootstrap.d.ts +15 -0
  6. package/dist/commands/bootstrap.d.ts.map +1 -1
  7. package/dist/commands/bootstrap.js +30 -1
  8. package/dist/commands/bootstrap.js.map +1 -1
  9. package/dist/commands/flywheel/check-persona-skeleton.d.ts +30 -2
  10. package/dist/commands/flywheel/check-persona-skeleton.d.ts.map +1 -1
  11. package/dist/commands/flywheel/check-persona-skeleton.js +143 -6
  12. package/dist/commands/flywheel/check-persona-skeleton.js.map +1 -1
  13. package/dist/commands/flywheel/diversity-check.d.ts +12 -2
  14. package/dist/commands/flywheel/diversity-check.d.ts.map +1 -1
  15. package/dist/commands/flywheel/diversity-check.js +56 -6
  16. package/dist/commands/flywheel/diversity-check.js.map +1 -1
  17. package/dist/commands/flywheel/index.d.ts.map +1 -1
  18. package/dist/commands/flywheel/index.js +2 -0
  19. package/dist/commands/flywheel/index.js.map +1 -1
  20. package/dist/commands/flywheel/install-shims.d.ts +36 -3
  21. package/dist/commands/flywheel/install-shims.d.ts.map +1 -1
  22. package/dist/commands/flywheel/install-shims.js +118 -7
  23. package/dist/commands/flywheel/install-shims.js.map +1 -1
  24. package/dist/commands/flywheel/k10-measure.d.ts +12 -2
  25. package/dist/commands/flywheel/k10-measure.d.ts.map +1 -1
  26. package/dist/commands/flywheel/k10-measure.js +55 -6
  27. package/dist/commands/flywheel/k10-measure.js.map +1 -1
  28. package/dist/commands/flywheel/migrate-overlays.d.ts +115 -0
  29. package/dist/commands/flywheel/migrate-overlays.d.ts.map +1 -0
  30. package/dist/commands/flywheel/migrate-overlays.js +766 -0
  31. package/dist/commands/flywheel/migrate-overlays.js.map +1 -0
  32. package/dist/commands/flywheel/sanitize-persona-output.d.ts +33 -2
  33. package/dist/commands/flywheel/sanitize-persona-output.d.ts.map +1 -1
  34. package/dist/commands/flywheel/sanitize-persona-output.js +94 -6
  35. package/dist/commands/flywheel/sanitize-persona-output.js.map +1 -1
  36. package/dist/commands/memory/index.d.ts.map +1 -1
  37. package/dist/commands/memory/index.js +2 -0
  38. package/dist/commands/memory/index.js.map +1 -1
  39. package/dist/commands/memory/install-hooks.d.ts +22 -0
  40. package/dist/commands/memory/install-hooks.d.ts.map +1 -0
  41. package/dist/commands/memory/install-hooks.js +156 -0
  42. package/dist/commands/memory/install-hooks.js.map +1 -0
  43. package/dist/commands/skills-doctor.js +2 -2
  44. package/dist/commands/skills-doctor.js.map +1 -1
  45. package/dist/commands/skills-source.d.ts.map +1 -1
  46. package/dist/commands/skills-source.js +10 -0
  47. package/dist/commands/skills-source.js.map +1 -1
  48. package/dist/commands/skills.d.ts.map +1 -1
  49. package/dist/commands/skills.js +169 -1
  50. package/dist/commands/skills.js.map +1 -1
  51. package/dist/image-digests.json +7 -7
  52. package/dist/index.js +4361 -1768
  53. package/dist/lib/bootstrap-kubernetes.d.ts +42 -0
  54. package/dist/lib/bootstrap-kubernetes.d.ts.map +1 -0
  55. package/dist/lib/bootstrap-kubernetes.js +287 -0
  56. package/dist/lib/bootstrap-kubernetes.js.map +1 -0
  57. package/dist/lib/config.d.ts.map +1 -1
  58. package/dist/lib/config.js +6 -1
  59. package/dist/lib/config.js.map +1 -1
  60. package/dist/lib/flywheel-probes.d.ts +58 -0
  61. package/dist/lib/flywheel-probes.d.ts.map +1 -0
  62. package/dist/lib/flywheel-probes.js +163 -0
  63. package/dist/lib/flywheel-probes.js.map +1 -0
  64. package/dist/lib/shim-generator.d.ts +51 -0
  65. package/dist/lib/shim-generator.d.ts.map +1 -0
  66. package/dist/lib/shim-generator.js +88 -0
  67. package/dist/lib/shim-generator.js.map +1 -0
  68. package/dist/lib/skills-apply-overlays.d.ts +35 -0
  69. package/dist/lib/skills-apply-overlays.d.ts.map +1 -0
  70. package/dist/lib/skills-apply-overlays.js +243 -0
  71. package/dist/lib/skills-apply-overlays.js.map +1 -0
  72. package/dist/mcp-server.js +1106 -453
  73. package/hermes-bundle/version.json +1 -1
  74. package/host-cp/k8s/manifests/50-deployment.yaml +1 -1
  75. package/host-cp/k8s/manifests/auth-service/50-deployment.yaml +1 -1
  76. package/host-cp/k8s/manifests/kg-service/50-deployment.yaml +1 -1
  77. package/host-cp/k8s/manifests/mcp-auth-service/50-deployment.yaml +1 -1
  78. package/host-cp/k8s/manifests/memory-service/30-configmap.yaml +11 -0
  79. package/host-cp/k8s/manifests/memory-service/35-configmap-iii-config.yaml +76 -0
  80. package/host-cp/k8s/manifests/memory-service/50-deployment.yaml +11 -1
  81. package/host-cp/observability/grafana-port-forward.sh +273 -0
  82. package/host-cp/observability/kyverno-cardinality-mutate.sh +452 -0
  83. package/host-cp/observability/loki-ingest.sh +243 -0
  84. package/host-cp/observability/prom-no-double-grafana.sh +301 -0
  85. package/host-cp/src/crystallize-planning.mjs +261 -0
  86. package/host-cp/src/plan-chat-service.mjs +84 -2
  87. package/host-cp/src/planning-sessions.mjs +270 -0
  88. package/package.json +1 -1
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Bash shim generator for olam-flywheel backwards-compat layer.
3
+ *
4
+ * Generates deterministic bash shims that translate the positional-arg
5
+ * invocation chain skills currently use (e.g.
6
+ * `bash ~/.claude/scripts/emit-breadcrumb.sh "plan-hard" "<plan-slug>" ...`)
7
+ * into the new named-flag CLI:
8
+ * `olam flywheel emit-breadcrumb --skill plan-hard --plan <plan-slug> ...`
9
+ *
10
+ * Each shim:
11
+ * 1. Hardens PATH (adds common olam install locations).
12
+ * 2. Checks olam is reachable; exits 127 with actionable message if not.
13
+ * 3. Translates positional args to named flags per the script's spec.
14
+ * 4. exec's the olam CLI (passes signal handling + exit code through).
15
+ *
16
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A14
17
+ * Closes part of K1 OQ21a (positional → named-flag translation in shims).
18
+ */
19
+ export interface ShimArg {
20
+ /** Positional index (1-based, matching bash `$1`, `$2`, …). */
21
+ position: number;
22
+ /** Flag name (e.g. `skill` → `--skill`). */
23
+ flag: string;
24
+ /** Required positional → `"$N"`; optional positional → `${N:+--flag "$N"}`. */
25
+ required: boolean;
26
+ }
27
+ export interface ShimSpec {
28
+ /** Basename of the shim file under ~/.claude/scripts/. */
29
+ basename: string;
30
+ /** Subcommand under olam to exec (e.g. "flywheel emit-breadcrumb"). */
31
+ olamSubcommand: string;
32
+ /** Minimum positional arg count required (rejected with usage message if fewer). */
33
+ minPositional: number;
34
+ /** Argument translation table (positional → named flag). */
35
+ args: ShimArg[];
36
+ /** Inline usage string for the "Usage:" stderr message. */
37
+ usage: string;
38
+ }
39
+ /**
40
+ * Registry of shim specs. Only includes scripts that chain skill prose
41
+ * actively invokes via bash (the others are Python imports, no bash shim
42
+ * needed). Extend this as more chain-skill invocation sites are migrated.
43
+ */
44
+ export declare const SHIM_SPECS: readonly ShimSpec[];
45
+ /**
46
+ * Generate the bash shim source for a given spec. Deterministic output —
47
+ * same input always produces the same bytes (golden-fixture-friendly).
48
+ */
49
+ export declare function generateShim(spec: ShimSpec): string;
50
+ export declare function lookupShimSpec(basename: string): ShimSpec | undefined;
51
+ //# sourceMappingURL=shim-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shim-generator.d.ts","sourceRoot":"","sources":["../../src/lib/shim-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,cAAc,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAkBxC,CAAC;AAEH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAoCnD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAErE"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Bash shim generator for olam-flywheel backwards-compat layer.
3
+ *
4
+ * Generates deterministic bash shims that translate the positional-arg
5
+ * invocation chain skills currently use (e.g.
6
+ * `bash ~/.claude/scripts/emit-breadcrumb.sh "plan-hard" "<plan-slug>" ...`)
7
+ * into the new named-flag CLI:
8
+ * `olam flywheel emit-breadcrumb --skill plan-hard --plan <plan-slug> ...`
9
+ *
10
+ * Each shim:
11
+ * 1. Hardens PATH (adds common olam install locations).
12
+ * 2. Checks olam is reachable; exits 127 with actionable message if not.
13
+ * 3. Translates positional args to named flags per the script's spec.
14
+ * 4. exec's the olam CLI (passes signal handling + exit code through).
15
+ *
16
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A14
17
+ * Closes part of K1 OQ21a (positional → named-flag translation in shims).
18
+ */
19
+ /**
20
+ * Registry of shim specs. Only includes scripts that chain skill prose
21
+ * actively invokes via bash (the others are Python imports, no bash shim
22
+ * needed). Extend this as more chain-skill invocation sites are migrated.
23
+ */
24
+ export const SHIM_SPECS = Object.freeze([
25
+ {
26
+ basename: 'emit-breadcrumb.sh',
27
+ olamSubcommand: 'flywheel emit-breadcrumb',
28
+ minPositional: 6,
29
+ usage: 'emit-breadcrumb.sh <skill> <plan> <pattern> <severity> <persona> <edit> [notes] [pass] [project]',
30
+ args: [
31
+ { position: 1, flag: 'skill', required: true },
32
+ { position: 2, flag: 'plan', required: true },
33
+ { position: 3, flag: 'pattern', required: true },
34
+ { position: 4, flag: 'severity', required: true },
35
+ { position: 5, flag: 'persona', required: true },
36
+ { position: 6, flag: 'edit', required: true },
37
+ { position: 7, flag: 'notes', required: false },
38
+ { position: 8, flag: 'pass', required: false },
39
+ { position: 9, flag: 'project', required: false },
40
+ ],
41
+ },
42
+ ]);
43
+ /**
44
+ * Generate the bash shim source for a given spec. Deterministic output —
45
+ * same input always produces the same bytes (golden-fixture-friendly).
46
+ */
47
+ export function generateShim(spec) {
48
+ const argLines = [];
49
+ for (const arg of spec.args) {
50
+ if (arg.required) {
51
+ argLines.push(` --${arg.flag} "\$${arg.position}"`);
52
+ }
53
+ else {
54
+ argLines.push(` \${${arg.position}:+--${arg.flag} "\$${arg.position}"}`);
55
+ }
56
+ }
57
+ const argsBlock = argLines.join(' \\\n');
58
+ return `#!/usr/bin/env bash
59
+ # AUTO-GENERATED by \`olam flywheel install-shims\`
60
+ # DO NOT EDIT — regenerated on every install-shims run.
61
+ #
62
+ # Delegates to \`olam ${spec.olamSubcommand}\`; closes the K1 FS-2 cliff
63
+ # by translating the legacy positional-arg interface to the new named-flag CLI.
64
+ set -euo pipefail
65
+
66
+ # Harden PATH for common olam install locations (cron + hook contexts may
67
+ # have a minimal PATH; this preserves operator-installed shells).
68
+ PATH="\$HOME/.local/bin:\$HOME/.olam/bin:/opt/homebrew/bin:/usr/local/bin:\$PATH"
69
+
70
+ if ! command -v olam >/dev/null 2>&1; then
71
+ echo "[shim] olam not found on PATH; cannot delegate ${spec.olamSubcommand}" >&2
72
+ echo "[shim] install olam (https://github.com/pleri/olam) and run 'olam flywheel install-shims' to refresh" >&2
73
+ exit 127
74
+ fi
75
+
76
+ if [ "\$#" -lt ${spec.minPositional} ]; then
77
+ echo "Usage: ${spec.usage}" >&2
78
+ exit 1
79
+ fi
80
+
81
+ exec olam ${spec.olamSubcommand} \\
82
+ ${argsBlock}
83
+ `;
84
+ }
85
+ export function lookupShimSpec(basename) {
86
+ return SHIM_SPECS.find((s) => s.basename === basename);
87
+ }
88
+ //# sourceMappingURL=shim-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shim-generator.js","sourceRoot":"","sources":["../../src/lib/shim-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAwBH;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAwB,MAAM,CAAC,MAAM,CAAC;IAC3D;QACE,QAAQ,EAAE,oBAAoB;QAC9B,cAAc,EAAE,0BAA0B;QAC1C,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,kGAAkG;QACzG,IAAI,EAAE;YACJ,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC9C,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC7C,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;YAChD,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;YACjD,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;YAChD,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC7C,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC/C,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC9C,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE;SAClD;KACF;CACF,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO;;;;wBAIe,IAAI,CAAC,cAAc;;;;;;;;;2DASgB,IAAI,CAAC,cAAc;;;;;iBAK7D,IAAI,CAAC,aAAa;mBAChB,IAAI,CAAC,KAAK;;;;YAIjB,IAAI,CAAC,cAAc;EAC7B,SAAS;CACV,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `olam skills apply-overlays` orchestrator.
3
+ *
4
+ * Port of `shared/engineering/scripts/apply-overlays.py`'s merge_skills +
5
+ * merge_agents + main functions. Walks ~/.claude/skills.overrides/ and
6
+ * ~/.claude/agents.overrides/, applies section-as-unit overlays per
7
+ * markdown-merger, runs post-merge sanitization, emits breadcrumbs.
8
+ *
9
+ * Reuses olam primitives:
10
+ * - mergeMarkdown from @olam/core/src/lib/markdown-merger.js (the section merger)
11
+ * - sanitize from packages/cli/src/commands/flywheel/sanitize-persona-output.ts
12
+ * (called in-process; no subprocess shell-out)
13
+ * - withFileLock from @olam/core/src/lib/file-lock.js (advisory locking)
14
+ *
15
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A9
16
+ */
17
+ export interface ApplyOverlaysOptions {
18
+ dryRun?: boolean;
19
+ fixtureRoot?: string;
20
+ claudeDir?: string;
21
+ }
22
+ export interface ApplyOverlaysResult {
23
+ rc: number;
24
+ skillsMerged: number;
25
+ agentsMerged: number;
26
+ newAgentsCreated: number;
27
+ schemaHalts: number;
28
+ renameHalts: number;
29
+ sanitizeHalts: number;
30
+ messages: string[];
31
+ }
32
+ export declare function applyOverlays(opts?: ApplyOverlaysOptions): Promise<ApplyOverlaysResult>;
33
+ export declare function formatSummary(result: ApplyOverlaysResult): string;
34
+ export declare function basenameOf(p: string): string;
35
+ //# sourceMappingURL=skills-apply-overlays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-apply-overlays.d.ts","sourceRoot":"","sources":["../../src/lib/skills-apply-overlays.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoBH,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAkMD,wBAAsB,aAAa,CAAC,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqCjG;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAajE;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * `olam skills apply-overlays` orchestrator.
3
+ *
4
+ * Port of `shared/engineering/scripts/apply-overlays.py`'s merge_skills +
5
+ * merge_agents + main functions. Walks ~/.claude/skills.overrides/ and
6
+ * ~/.claude/agents.overrides/, applies section-as-unit overlays per
7
+ * markdown-merger, runs post-merge sanitization, emits breadcrumbs.
8
+ *
9
+ * Reuses olam primitives:
10
+ * - mergeMarkdown from @olam/core/src/lib/markdown-merger.js (the section merger)
11
+ * - sanitize from packages/cli/src/commands/flywheel/sanitize-persona-output.ts
12
+ * (called in-process; no subprocess shell-out)
13
+ * - withFileLock from @olam/core/src/lib/file-lock.js (advisory locking)
14
+ *
15
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A9
16
+ */
17
+ import { copyFileSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, readlinkSync, rmSync, statSync, writeFileSync, } from 'node:fs';
18
+ import { homedir } from 'node:os';
19
+ import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';
20
+ import { mergeMarkdown, parseFrontmatter } from '@olam/core/src/lib/markdown-merger.js';
21
+ import { withFileLock } from '@olam/core/src/lib/file-lock.js';
22
+ import { sanitize } from '../commands/flywheel/sanitize-persona-output.js';
23
+ function claudeRoot(opts) {
24
+ return opts.claudeDir ?? opts.fixtureRoot ?? join(homedir(), '.claude');
25
+ }
26
+ function ensureRealDir(p) {
27
+ if (!existsSync(p)) {
28
+ mkdirSync(p, { recursive: true });
29
+ return;
30
+ }
31
+ const stat = lstatSync(p);
32
+ if (stat.isSymbolicLink()) {
33
+ // Upgrade from symlink to real dir while preserving children.
34
+ const targetRaw = readlinkSync(p);
35
+ const target = isAbsolute(targetRaw) ? targetRaw : resolve(dirname(p), targetRaw);
36
+ rmSync(p);
37
+ mkdirSync(p, { recursive: true });
38
+ if (existsSync(target) && statSync(target).isDirectory()) {
39
+ // Re-mirror the symlink's contents as real files (per-file symlinks
40
+ // for entries we don't overwrite — matches the apply-overlays.py
41
+ // semantics that turn the bare-symlinked skill dir into a real dir
42
+ // when overlays are applied to it).
43
+ for (const entry of readdirSync(target)) {
44
+ const src = join(target, entry);
45
+ const dest = join(p, entry);
46
+ const srcStat = lstatSync(src);
47
+ if (srcStat.isDirectory()) {
48
+ // Symlink the subdir back to upstream (cheap recursive reference).
49
+ // apply-overlays.py creates per-file symlinks; for nested dirs
50
+ // we keep that intent by symlinking the directory.
51
+ try {
52
+ (lstatSync(p));
53
+ // Use absolute path symlink for clarity.
54
+ }
55
+ catch {
56
+ // ignore
57
+ }
58
+ }
59
+ // Use per-file symlinks back to upstream (apply-overlays.py § per-file symlinks).
60
+ // For now: leave files alone — they get filled in when overlay applies.
61
+ }
62
+ }
63
+ return;
64
+ }
65
+ if (!stat.isDirectory()) {
66
+ throw new Error(`expected directory at ${p}, found other file type`);
67
+ }
68
+ }
69
+ function postMergeSanitize(mergedText, label) {
70
+ const result = sanitize(mergedText);
71
+ if (result.passed)
72
+ return { ok: true };
73
+ return { ok: false, reason: `[post-merge-sanitize] ${label} merged output failed sanitizer: ${result.reason}` };
74
+ }
75
+ function mergeOne(upstreamPath, overlayPath, destPath, label, dryRun, messages) {
76
+ const upstreamText = readFileSync(upstreamPath, 'utf8');
77
+ const overlayText = readFileSync(overlayPath, 'utf8');
78
+ const result = mergeMarkdown(upstreamText, overlayText, label, upstreamPath, overlayPath);
79
+ if ('error' in result) {
80
+ messages.push(`ERROR ${result.error.reason}`);
81
+ return { ok: false, kind: 'schema' };
82
+ }
83
+ const sanitizeResult = postMergeSanitize(result.merged, label);
84
+ if (!sanitizeResult.ok) {
85
+ messages.push(`ERROR ${sanitizeResult.reason}`);
86
+ return { ok: false, kind: 'sanitize' };
87
+ }
88
+ if (!dryRun) {
89
+ mkdirSync(dirname(destPath), { recursive: true });
90
+ writeFileSync(destPath, result.merged, 'utf8');
91
+ }
92
+ messages.push(`MERGED ${label} → ${destPath}${dryRun ? ' (dry-run)' : ''}`);
93
+ return { ok: true };
94
+ }
95
+ function isNewAgentOverlay(overlayPath) {
96
+ try {
97
+ const text = readFileSync(overlayPath, 'utf8');
98
+ const { fm } = parseFrontmatter(text);
99
+ return fm['overlay-intent'] === 'new-agent';
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ function copyNewAgent(overlayPath, destPath, label, dryRun, messages) {
106
+ if (!dryRun) {
107
+ mkdirSync(dirname(destPath), { recursive: true });
108
+ copyFileSync(overlayPath, destPath);
109
+ }
110
+ messages.push(`NEW-AGENT ${label} → ${destPath}${dryRun ? ' (dry-run)' : ''}`);
111
+ }
112
+ function walkSkillsOverlays(skillsOverridesDir, skillsDir, opts, result) {
113
+ if (!existsSync(skillsOverridesDir))
114
+ return;
115
+ for (const skillName of readdirSync(skillsOverridesDir)) {
116
+ const overlaySkillDir = join(skillsOverridesDir, skillName);
117
+ if (!statSync(overlaySkillDir).isDirectory())
118
+ continue;
119
+ const upstreamSkillDir = join(skillsDir, skillName);
120
+ if (!existsSync(upstreamSkillDir)) {
121
+ result.messages.push(`SKIP ${skillName}: no upstream skill at ${upstreamSkillDir} (skill overlays require an upstream skill dir)`);
122
+ continue;
123
+ }
124
+ ensureRealDir(upstreamSkillDir);
125
+ // Walk every file in the overlay skill dir recursively.
126
+ walkOverlayTree(overlaySkillDir, upstreamSkillDir, `skill ${skillName}`, opts, result, false);
127
+ }
128
+ }
129
+ function walkOverlayTree(overlayRoot, upstreamRoot, labelPrefix, opts, result, isAgentsContext) {
130
+ const stack = [overlayRoot];
131
+ while (stack.length > 0) {
132
+ const current = stack.pop();
133
+ for (const entry of readdirSync(current)) {
134
+ const overlayPath = join(current, entry);
135
+ const stat = lstatSync(overlayPath);
136
+ if (stat.isDirectory()) {
137
+ stack.push(overlayPath);
138
+ continue;
139
+ }
140
+ if (!stat.isFile() && !stat.isSymbolicLink())
141
+ continue;
142
+ const rel = relative(overlayRoot, overlayPath);
143
+ const upstreamPath = join(upstreamRoot, rel);
144
+ const label = `${labelPrefix} ${rel}`;
145
+ if (!entry.endsWith('.md')) {
146
+ // Non-markdown files: copy verbatim (matches apply-overlays.py).
147
+ if (!opts.dryRun) {
148
+ mkdirSync(dirname(upstreamPath), { recursive: true });
149
+ copyFileSync(overlayPath, upstreamPath);
150
+ }
151
+ result.messages.push(`COPY ${label} → ${upstreamPath}${opts.dryRun === true ? ' (dry-run)' : ''}`);
152
+ continue;
153
+ }
154
+ if (!existsSync(upstreamPath)) {
155
+ if (isAgentsContext && isNewAgentOverlay(overlayPath)) {
156
+ copyNewAgent(overlayPath, upstreamPath, label, opts.dryRun === true, result.messages);
157
+ result.newAgentsCreated += 1;
158
+ }
159
+ else if (isAgentsContext) {
160
+ result.messages.push(`ERROR [rename-halt] ${label}: overlay has no upstream counterpart at ${upstreamPath} and no \`overlay-intent: new-agent\` marker`);
161
+ result.renameHalts += 1;
162
+ }
163
+ else {
164
+ // Skill-context: overlay-only files (e.g. new references) copy through.
165
+ if (!opts.dryRun) {
166
+ mkdirSync(dirname(upstreamPath), { recursive: true });
167
+ copyFileSync(overlayPath, upstreamPath);
168
+ }
169
+ result.messages.push(`NEW-FILE ${label} → ${upstreamPath}${opts.dryRun === true ? ' (dry-run)' : ''}`);
170
+ }
171
+ continue;
172
+ }
173
+ const merge = mergeOne(upstreamPath, overlayPath, upstreamPath, label, opts.dryRun === true, result.messages);
174
+ if (merge.ok) {
175
+ if (isAgentsContext)
176
+ result.agentsMerged += 1;
177
+ else
178
+ result.skillsMerged += 1;
179
+ }
180
+ else if (merge.kind === 'schema') {
181
+ result.schemaHalts += 1;
182
+ }
183
+ else {
184
+ result.sanitizeHalts += 1;
185
+ }
186
+ }
187
+ }
188
+ }
189
+ function walkAgentsOverlays(agentsOverridesDir, agentsDir, opts, result) {
190
+ if (!existsSync(agentsOverridesDir))
191
+ return;
192
+ ensureRealDir(agentsDir);
193
+ walkOverlayTree(agentsOverridesDir, agentsDir, 'agent', opts, result, true);
194
+ }
195
+ export async function applyOverlays(opts = {}) {
196
+ const root = claudeRoot(opts);
197
+ const skillsDir = join(root, 'skills');
198
+ const agentsDir = join(root, 'agents');
199
+ const skillsOverridesDir = join(root, 'skills.overrides');
200
+ const agentsOverridesDir = join(root, 'agents.overrides');
201
+ const result = {
202
+ rc: 0,
203
+ skillsMerged: 0,
204
+ agentsMerged: 0,
205
+ newAgentsCreated: 0,
206
+ schemaHalts: 0,
207
+ renameHalts: 0,
208
+ sanitizeHalts: 0,
209
+ messages: [],
210
+ };
211
+ // Advisory lock at the claude-root level — prevents two concurrent
212
+ // apply-overlays runs from interleaving writes.
213
+ await withFileLock(root, () => {
214
+ walkSkillsOverlays(skillsOverridesDir, skillsDir, opts, result);
215
+ walkAgentsOverlays(agentsOverridesDir, agentsDir, opts, result);
216
+ }, {
217
+ lockFilename: '.apply-overlays.lock',
218
+ reason: `apply-overlays root=${root} dryRun=${opts.dryRun === true}`,
219
+ acquireTimeoutMs: 15_000,
220
+ });
221
+ if (result.schemaHalts > 0 || result.renameHalts > 0 || result.sanitizeHalts > 0) {
222
+ result.rc = 1;
223
+ }
224
+ return result;
225
+ }
226
+ export function formatSummary(result) {
227
+ const lines = [
228
+ ...result.messages,
229
+ '',
230
+ `skills merged: ${result.skillsMerged}`,
231
+ `agents merged: ${result.agentsMerged}`,
232
+ `new agents created: ${result.newAgentsCreated}`,
233
+ `schema-mismatch halts: ${result.schemaHalts}`,
234
+ `rename halts: ${result.renameHalts}`,
235
+ `sanitize halts: ${result.sanitizeHalts}`,
236
+ `rc: ${result.rc}`,
237
+ ];
238
+ return lines.join('\n') + '\n';
239
+ }
240
+ export function basenameOf(p) {
241
+ return basename(p);
242
+ }
243
+ //# sourceMappingURL=skills-apply-overlays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-apply-overlays.js","sourceRoot":"","sources":["../../src/lib/skills-apply-overlays.ts"],"names":[],"mappings":"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"}