@pleri/olam-cli 0.1.153 → 0.1.158

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 (121) hide show
  1. package/dist/commands/bootstrap.d.ts +2 -1
  2. package/dist/commands/bootstrap.d.ts.map +1 -1
  3. package/dist/commands/bootstrap.js +8 -10
  4. package/dist/commands/bootstrap.js.map +1 -1
  5. package/dist/commands/doctor.d.ts +22 -0
  6. package/dist/commands/doctor.d.ts.map +1 -1
  7. package/dist/commands/doctor.js +110 -7
  8. package/dist/commands/doctor.js.map +1 -1
  9. package/dist/commands/flywheel/check-persona-skeleton.d.ts +7 -0
  10. package/dist/commands/flywheel/check-persona-skeleton.d.ts.map +1 -0
  11. package/dist/commands/flywheel/check-persona-skeleton.js +14 -0
  12. package/dist/commands/flywheel/check-persona-skeleton.js.map +1 -0
  13. package/dist/commands/flywheel/diversity-check.d.ts +7 -0
  14. package/dist/commands/flywheel/diversity-check.d.ts.map +1 -0
  15. package/dist/commands/flywheel/diversity-check.js +14 -0
  16. package/dist/commands/flywheel/diversity-check.js.map +1 -0
  17. package/dist/commands/flywheel/emit-breadcrumb.d.ts +20 -0
  18. package/dist/commands/flywheel/emit-breadcrumb.d.ts.map +1 -0
  19. package/dist/commands/flywheel/emit-breadcrumb.js +137 -0
  20. package/dist/commands/flywheel/emit-breadcrumb.js.map +1 -0
  21. package/dist/commands/flywheel/index.d.ts +27 -0
  22. package/dist/commands/flywheel/index.d.ts.map +1 -0
  23. package/dist/commands/flywheel/index.js +48 -0
  24. package/dist/commands/flywheel/index.js.map +1 -0
  25. package/dist/commands/flywheel/install-shims.d.ts +8 -0
  26. package/dist/commands/flywheel/install-shims.d.ts.map +1 -0
  27. package/dist/commands/flywheel/install-shims.js +15 -0
  28. package/dist/commands/flywheel/install-shims.js.map +1 -0
  29. package/dist/commands/flywheel/k10-measure.d.ts +7 -0
  30. package/dist/commands/flywheel/k10-measure.d.ts.map +1 -0
  31. package/dist/commands/flywheel/k10-measure.js +14 -0
  32. package/dist/commands/flywheel/k10-measure.js.map +1 -0
  33. package/dist/commands/flywheel/k5-score.d.ts +14 -0
  34. package/dist/commands/flywheel/k5-score.d.ts.map +1 -0
  35. package/dist/commands/flywheel/k5-score.js +59 -0
  36. package/dist/commands/flywheel/k5-score.js.map +1 -0
  37. package/dist/commands/flywheel/k5-validate.d.ts +15 -0
  38. package/dist/commands/flywheel/k5-validate.d.ts.map +1 -0
  39. package/dist/commands/flywheel/k5-validate.js +185 -0
  40. package/dist/commands/flywheel/k5-validate.js.map +1 -0
  41. package/dist/commands/flywheel/ping.d.ts +21 -0
  42. package/dist/commands/flywheel/ping.d.ts.map +1 -0
  43. package/dist/commands/flywheel/ping.js +79 -0
  44. package/dist/commands/flywheel/ping.js.map +1 -0
  45. package/dist/commands/flywheel/sanitize-persona-output.d.ts +7 -0
  46. package/dist/commands/flywheel/sanitize-persona-output.d.ts.map +1 -0
  47. package/dist/commands/flywheel/sanitize-persona-output.js +14 -0
  48. package/dist/commands/flywheel/sanitize-persona-output.js.map +1 -0
  49. package/dist/commands/hermes-kg-hook.d.ts +36 -0
  50. package/dist/commands/hermes-kg-hook.d.ts.map +1 -0
  51. package/dist/commands/hermes-kg-hook.js +80 -0
  52. package/dist/commands/hermes-kg-hook.js.map +1 -0
  53. package/dist/commands/hermes.d.ts +46 -0
  54. package/dist/commands/hermes.d.ts.map +1 -0
  55. package/dist/commands/hermes.js +320 -0
  56. package/dist/commands/hermes.js.map +1 -0
  57. package/dist/commands/kg-install-hook.d.ts +7 -1
  58. package/dist/commands/kg-install-hook.d.ts.map +1 -1
  59. package/dist/commands/kg-install-hook.js +122 -6
  60. package/dist/commands/kg-install-hook.js.map +1 -1
  61. package/dist/commands/memory/_paths.d.ts +13 -3
  62. package/dist/commands/memory/_paths.d.ts.map +1 -1
  63. package/dist/commands/memory/_paths.js +25 -22
  64. package/dist/commands/memory/_paths.js.map +1 -1
  65. package/dist/commands/memory/logs.d.ts +8 -4
  66. package/dist/commands/memory/logs.d.ts.map +1 -1
  67. package/dist/commands/memory/logs.js +18 -13
  68. package/dist/commands/memory/logs.js.map +1 -1
  69. package/dist/commands/memory/mode.d.ts.map +1 -1
  70. package/dist/commands/memory/mode.js +7 -3
  71. package/dist/commands/memory/mode.js.map +1 -1
  72. package/dist/commands/memory/start.d.ts +16 -14
  73. package/dist/commands/memory/start.d.ts.map +1 -1
  74. package/dist/commands/memory/start.js +55 -189
  75. package/dist/commands/memory/start.js.map +1 -1
  76. package/dist/commands/memory/status.d.ts +10 -8
  77. package/dist/commands/memory/status.d.ts.map +1 -1
  78. package/dist/commands/memory/status.js +35 -38
  79. package/dist/commands/memory/status.js.map +1 -1
  80. package/dist/commands/memory/stop.d.ts +5 -4
  81. package/dist/commands/memory/stop.d.ts.map +1 -1
  82. package/dist/commands/memory/stop.js +26 -55
  83. package/dist/commands/memory/stop.js.map +1 -1
  84. package/dist/commands/memory-service-container.d.ts +78 -0
  85. package/dist/commands/memory-service-container.d.ts.map +1 -0
  86. package/dist/commands/memory-service-container.js +187 -0
  87. package/dist/commands/memory-service-container.js.map +1 -0
  88. package/dist/commands/services.d.ts +16 -1
  89. package/dist/commands/services.d.ts.map +1 -1
  90. package/dist/commands/services.js +88 -12
  91. package/dist/commands/services.js.map +1 -1
  92. package/dist/image-digests.json +7 -7
  93. package/dist/index.js +2570 -1384
  94. package/dist/index.js.map +1 -1
  95. package/dist/lib/k8s-secret-render.d.ts.map +1 -1
  96. package/dist/lib/k8s-secret-render.js +7 -4
  97. package/dist/lib/k8s-secret-render.js.map +1 -1
  98. package/dist/lib/memory-host-process-migration.d.ts +56 -0
  99. package/dist/lib/memory-host-process-migration.d.ts.map +1 -0
  100. package/dist/lib/memory-host-process-migration.js +156 -0
  101. package/dist/lib/memory-host-process-migration.js.map +1 -0
  102. package/dist/lib/upgrade-kubernetes.d.ts +22 -0
  103. package/dist/lib/upgrade-kubernetes.d.ts.map +1 -1
  104. package/dist/lib/upgrade-kubernetes.js +195 -2
  105. package/dist/lib/upgrade-kubernetes.js.map +1 -1
  106. package/dist/mcp-server.js +56 -22
  107. package/hermes-bundle/kg-first.sh +100 -0
  108. package/hermes-bundle/version.json +4 -0
  109. package/host-cp/k8s/manifests/50-deployment.yaml +54 -27
  110. package/host-cp/k8s/manifests/auth-service/30-configmap.yaml +5 -0
  111. package/host-cp/k8s/manifests/auth-service/50-deployment.yaml +5 -1
  112. package/host-cp/k8s/manifests/kg-service/30-configmap.yaml +5 -0
  113. package/host-cp/k8s/manifests/kg-service/50-deployment.yaml +5 -1
  114. package/host-cp/k8s/manifests/mcp-auth-service/30-configmap.yaml +4 -0
  115. package/host-cp/k8s/manifests/mcp-auth-service/50-deployment.yaml +5 -1
  116. package/host-cp/k8s/manifests/memory-service/30-configmap.yaml +4 -0
  117. package/host-cp/k8s/manifests/memory-service/50-deployment.yaml +5 -1
  118. package/host-cp/src/metrics.mjs +281 -0
  119. package/host-cp/src/server.mjs +22 -2
  120. package/package.json +3 -4
  121. package/memory-service-bundle/scripts/ensure-iii-engine.mjs +0 -179
@@ -0,0 +1,137 @@
1
+ /**
2
+ * `olam flywheel emit-breadcrumb` — K7 breadcrumb emitter (D24/D27/D28 compliant).
3
+ *
4
+ * Port of `shared/engineering/scripts/emit-breadcrumb.py`. Matches the same record
5
+ * schema, exit codes, and stdout message format. Adds `fcntl.flock`-equivalent
6
+ * cross-process locking via `withFileLock` from `@olam/core/lib/file-lock` —
7
+ * closes K1 adversarial finding #1 (the parallel K7 write corruption scenario
8
+ * where two concurrent personas writing >4KB payloads interleave bytes).
9
+ *
10
+ * Lock semantics: per-target-directory advisory lock. Lock file is
11
+ * `<breadcrumb-dir>/.flywheel-emit.lock` (distinct filename from skill-sync's
12
+ * `.olam-sync.lock` so the two domains don't collide if their lock-dirs ever
13
+ * overlap).
14
+ *
15
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A3
16
+ * Closes: K1 pass-1 adversarial finding FS-1 (P1/likely/risk-3.0).
17
+ */
18
+ import { mkdirSync, appendFileSync } from 'node:fs';
19
+ import { homedir } from 'node:os';
20
+ import { dirname, join } from 'node:path';
21
+ import { randomUUID } from 'node:crypto';
22
+ import { withFileLock } from '@olam/core/src/lib/file-lock.js';
23
+ const VALID_SEVERITIES = new Set(['critical', 'high', 'medium', 'low', 'info', 'warn']);
24
+ const PROMPT_FEEDING_FIELDS = ['extracted_pattern', 'severity', 'affected_persona', 'proposed_edit'];
25
+ const BREADCRUMBS_BASE = join(homedir(), '.local', 'share', 'claude', 'breadcrumbs');
26
+ const LOCK_FILENAME = '.flywheel-emit.lock';
27
+ function buildRecord(opts) {
28
+ const rec = {
29
+ breadcrumb_id: randomUUID().replace(/-/g, ''),
30
+ emitted_at: new Date().toISOString(),
31
+ emitted_by_skill: opts.skill,
32
+ pass_number: opts.pass !== undefined ? Number.parseInt(opts.pass, 10) : 0,
33
+ plan_slug: opts.plan,
34
+ project_slug: opts.project ?? 'claude-skills',
35
+ extracted_pattern: opts.pattern,
36
+ severity: opts.severity,
37
+ affected_persona: opts.persona,
38
+ proposed_edit: opts.edit,
39
+ notes: opts.notes ?? '',
40
+ raw_body: opts.rawBody ?? '',
41
+ attribution: opts.attribution ?? '',
42
+ schema_version: '1',
43
+ };
44
+ // K5 fields: present-only-when-supplied. Use key absence to distinguish "not scored"
45
+ // from "scored zero" (K4 readers depend on this).
46
+ if (opts.k5ScoresJson !== undefined) {
47
+ try {
48
+ rec.k5_scores = JSON.parse(opts.k5ScoresJson);
49
+ }
50
+ catch (err) {
51
+ process.stderr.write(`[K7-reject] --k5-scores-json is not valid JSON: ${err instanceof Error ? err.message : 'unknown'}\n`);
52
+ process.exit(2);
53
+ }
54
+ }
55
+ if (opts.k5Boost !== undefined)
56
+ rec.k5_boost = Number.parseFloat(opts.k5Boost);
57
+ if (opts.k5Composite !== undefined)
58
+ rec.k5_composite = Number.parseInt(opts.k5Composite, 10);
59
+ if (opts.k5ScoredAt !== undefined)
60
+ rec.k5_scored_at = opts.k5ScoredAt;
61
+ return rec;
62
+ }
63
+ function validatePromptFeeding(rec) {
64
+ const missing = [];
65
+ for (const field of PROMPT_FEEDING_FIELDS) {
66
+ const val = rec[field];
67
+ if (val === undefined || val === null || (typeof val === 'string' && val.trim() === '')) {
68
+ missing.push(field);
69
+ }
70
+ }
71
+ return missing;
72
+ }
73
+ function destPath(projectSlug) {
74
+ const today = new Date().toISOString().slice(0, 10); // UTC YYYY-MM-DD
75
+ return join(BREADCRUMBS_BASE, projectSlug, `${today}.jsonl`);
76
+ }
77
+ async function emitBreadcrumb(opts) {
78
+ if (!VALID_SEVERITIES.has(opts.severity)) {
79
+ process.stderr.write(`[K7-reject] invalid severity '${opts.severity}'; expected one of: ${Array.from(VALID_SEVERITIES).sort().join(', ')}\n`);
80
+ process.exit(2);
81
+ }
82
+ const rec = buildRecord(opts);
83
+ const missing = validatePromptFeeding(rec);
84
+ if (missing.length > 0) {
85
+ process.stderr.write(`[K7-reject] missing or empty prompt-feeding fields: ${JSON.stringify(missing.sort())}\n`);
86
+ process.exit(2);
87
+ }
88
+ const path = destPath(rec.project_slug);
89
+ const lockDir = dirname(path);
90
+ mkdirSync(lockDir, { recursive: true });
91
+ // withFileLock serializes concurrent emitters writing to the same project/date
92
+ // file. POSIX O_APPEND is only atomic for payloads ≤PIPE_BUF (~4KB); large
93
+ // raw_body fields would interleave without this. K1 epic dispatch (11 parallel
94
+ // personas) is exactly the case the original Python script's comment flagged
95
+ // as "add fcntl.flock if parallel emitters exist".
96
+ const line = JSON.stringify(rec) + '\n';
97
+ await withFileLock(lockDir, () => {
98
+ appendFileSync(path, line, 'utf8');
99
+ }, {
100
+ lockFilename: LOCK_FILENAME,
101
+ reason: `flywheel emit-breadcrumb skill=${opts.skill} plan=${opts.plan}`,
102
+ // Tight timeout — breadcrumb writes are <100ms; long backoff is a sign
103
+ // of pathology, not contention. 5s gives 200 retries at 25ms each.
104
+ acquireTimeoutMs: 5_000,
105
+ });
106
+ process.stdout.write(`[K7-emit] ${path}: ${rec.extracted_pattern} (${rec.severity})\n`);
107
+ }
108
+ export function registerFlywheelEmitBreadcrumb(parent) {
109
+ parent
110
+ .command('emit-breadcrumb')
111
+ .description('Append a K7 breadcrumb JSONL row (parallel-safe via withFileLock)')
112
+ .requiredOption('--skill <slug>', 'Chain skill slug (e.g. plan-hard)')
113
+ .requiredOption('--plan <slug>', 'Plan slug (e.g. olam-flywheel-cli-namespace)')
114
+ .requiredOption('--pattern <name>', 'Pattern name (concise slug-like label)')
115
+ .requiredOption('--severity <level>', 'Severity: critical | high | medium | low | info | warn')
116
+ .requiredOption('--persona <slug>', "Affected persona slug or 'chain'")
117
+ .requiredOption('--edit <text>', 'Structured patch description')
118
+ .option('--notes <text>', 'Free-form operator notes (display-only)')
119
+ .option('--pass <int>', 'Pass number (display-only)')
120
+ .option('--project <slug>', 'Project slug', 'claude-skills')
121
+ .option('--raw-body <text>', 'Free-form markdown context (display-only)')
122
+ .option('--attribution <text>', 'Source attribution (display-only)')
123
+ .option('--k5-scores-json <json>', 'K5 sub-scores as JSON (display-only; omitted if not supplied)')
124
+ .option('--k5-boost <float>', 'K5 boost multiplier (display-only; omitted if not supplied)')
125
+ .option('--k5-composite <int>', 'K5 composite score (display-only; omitted if not supplied)')
126
+ .option('--k5-scored-at <date>', 'ISO date of most recent K5 scoring pass')
127
+ .action(async (opts) => {
128
+ try {
129
+ await emitBreadcrumb(opts);
130
+ }
131
+ catch (err) {
132
+ process.stderr.write(`[K7-error] emit-breadcrumb failed: ${err instanceof Error ? err.message : 'unknown error'}\n`);
133
+ process.exit(1);
134
+ }
135
+ });
136
+ }
137
+ //# sourceMappingURL=emit-breadcrumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-breadcrumb.js","sourceRoot":"","sources":["../../../src/commands/flywheel/emit-breadcrumb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * olam flywheel — chain-runtime helpers.
3
+ *
4
+ * Migrates atlas-toolbox's `shared/engineering/scripts/` chain-runtime scripts
5
+ * (breadcrumb emission, K5/K10 scoring, persona sanitization, skeleton
6
+ * validation, diversity aggregation, shim installation) into olam under a
7
+ * nested CLI namespace.
8
+ *
9
+ * Follows the existing nested-namespace convention established by
10
+ * `olam kg`, `olam memory`, `olam mcp`, `olam worldspec`.
11
+ *
12
+ * Subcommands:
13
+ * emit-breadcrumb — write K7 breadcrumb (with flock for parallel-safe writes)
14
+ * k5-score — compute K5 composite + boost from sub-scores
15
+ * k5-validate — schema-check a plan's frontmatter k5_scores block
16
+ * k10-measure — compute K1 budget ratio from plan + persona output
17
+ * sanitize-persona-output — stdin→stdout pipe; reject header-injection / slug-mismatch
18
+ * check-persona-skeleton — validate persona agent file structure
19
+ * diversity-check — cross-plan breadcrumb diversity aggregator
20
+ * ping — no-op cold-start telemetry surface
21
+ * install-shims — write delegating shims to ~/.claude/scripts/<name>
22
+ *
23
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/README.md
24
+ */
25
+ import type { Command } from 'commander';
26
+ export declare function registerFlywheel(program: Command): void;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgBvD"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * olam flywheel — chain-runtime helpers.
3
+ *
4
+ * Migrates atlas-toolbox's `shared/engineering/scripts/` chain-runtime scripts
5
+ * (breadcrumb emission, K5/K10 scoring, persona sanitization, skeleton
6
+ * validation, diversity aggregation, shim installation) into olam under a
7
+ * nested CLI namespace.
8
+ *
9
+ * Follows the existing nested-namespace convention established by
10
+ * `olam kg`, `olam memory`, `olam mcp`, `olam worldspec`.
11
+ *
12
+ * Subcommands:
13
+ * emit-breadcrumb — write K7 breadcrumb (with flock for parallel-safe writes)
14
+ * k5-score — compute K5 composite + boost from sub-scores
15
+ * k5-validate — schema-check a plan's frontmatter k5_scores block
16
+ * k10-measure — compute K1 budget ratio from plan + persona output
17
+ * sanitize-persona-output — stdin→stdout pipe; reject header-injection / slug-mismatch
18
+ * check-persona-skeleton — validate persona agent file structure
19
+ * diversity-check — cross-plan breadcrumb diversity aggregator
20
+ * ping — no-op cold-start telemetry surface
21
+ * install-shims — write delegating shims to ~/.claude/scripts/<name>
22
+ *
23
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/README.md
24
+ */
25
+ import { registerFlywheelEmitBreadcrumb } from './emit-breadcrumb.js';
26
+ import { registerFlywheelK5Score } from './k5-score.js';
27
+ import { registerFlywheelK5Validate } from './k5-validate.js';
28
+ import { registerFlywheelK10Measure } from './k10-measure.js';
29
+ import { registerFlywheelSanitizePersonaOutput } from './sanitize-persona-output.js';
30
+ import { registerFlywheelCheckPersonaSkeleton } from './check-persona-skeleton.js';
31
+ import { registerFlywheelDiversityCheck } from './diversity-check.js';
32
+ import { registerFlywheelPing } from './ping.js';
33
+ import { registerFlywheelInstallShims } from './install-shims.js';
34
+ export function registerFlywheel(program) {
35
+ const flywheel = program
36
+ .command('flywheel')
37
+ .description('Chain-runtime helpers: breadcrumbs, K5/K10 scoring, persona ops, shims (emit-breadcrumb, k5-score, k5-validate, k10-measure, sanitize-persona-output, check-persona-skeleton, diversity-check, ping, install-shims)');
38
+ registerFlywheelEmitBreadcrumb(flywheel);
39
+ registerFlywheelK5Score(flywheel);
40
+ registerFlywheelK5Validate(flywheel);
41
+ registerFlywheelK10Measure(flywheel);
42
+ registerFlywheelSanitizePersonaOutput(flywheel);
43
+ registerFlywheelCheckPersonaSkeleton(flywheel);
44
+ registerFlywheelDiversityCheck(flywheel);
45
+ registerFlywheelPing(flywheel);
46
+ registerFlywheelInstallShims(flywheel);
47
+ }
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/flywheel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,qCAAqC,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,oCAAoC,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAElE,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CACV,qNAAqN,CACtN,CAAC;IAEJ,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACzC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAClC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACrC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACrC,qCAAqC,CAAC,QAAQ,CAAC,CAAC;IAChD,oCAAoC,CAAC,QAAQ,CAAC,CAAC;IAC/C,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACzC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/B,4BAA4B,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `olam flywheel install-shims` — stub registered in task A1.
3
+ * Implementation lands in task A14 (writes delegating shims to ~/.claude/scripts/<name>;
4
+ * detects existing non-shim files; auto-invoked as post-step in `olam skills source pull`).
5
+ */
6
+ import type { Command } from 'commander';
7
+ export declare function registerFlywheelInstallShims(parent: Command): void;
8
+ //# sourceMappingURL=install-shims.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-shims.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/install-shims.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAUlE"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `olam flywheel install-shims` — stub registered in task A1.
3
+ * Implementation lands in task A14 (writes delegating shims to ~/.claude/scripts/<name>;
4
+ * detects existing non-shim files; auto-invoked as post-step in `olam skills source pull`).
5
+ */
6
+ export function registerFlywheelInstallShims(parent) {
7
+ parent
8
+ .command('install-shims')
9
+ .description('Write delegating shims to ~/.claude/scripts/<name> (stub — implemented in task A14)')
10
+ .action(() => {
11
+ console.error('olam flywheel install-shims: not yet implemented (task A14). See docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md');
12
+ process.exit(2);
13
+ });
14
+ }
15
+ //# sourceMappingURL=install-shims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-shims.js","sourceRoot":"","sources":["../../../src/commands/flywheel/install-shims.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,UAAU,4BAA4B,CAAC,MAAe;IAC1D,MAAM;SACH,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,qFAAqF,CAAC;SAClG,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,KAAK,CACX,0HAA0H,CAC3H,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `olam flywheel k10-measure` — stub registered in task A1.
3
+ * Implementation lands in task A5 (port from `shared/engineering/scripts/k10_budget.py`).
4
+ */
5
+ import type { Command } from 'commander';
6
+ export declare function registerFlywheelK10Measure(parent: Command): void;
7
+ //# sourceMappingURL=k10-measure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k10-measure.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/k10-measure.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAUhE"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `olam flywheel k10-measure` — stub registered in task A1.
3
+ * Implementation lands in task A5 (port from `shared/engineering/scripts/k10_budget.py`).
4
+ */
5
+ export function registerFlywheelK10Measure(parent) {
6
+ parent
7
+ .command('k10-measure')
8
+ .description('Compute K1 budget ratio from plan + persona output (stub — implemented in task A5)')
9
+ .action(() => {
10
+ console.error('olam flywheel k10-measure: not yet implemented (task A5). See docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md');
11
+ process.exit(2);
12
+ });
13
+ }
14
+ //# sourceMappingURL=k10-measure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k10-measure.js","sourceRoot":"","sources":["../../../src/commands/flywheel/k10-measure.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,0BAA0B,CAAC,MAAe;IACxD,MAAM;SACH,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,oFAAoF,CAAC;SACjG,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,KAAK,CACX,uHAAuH,CACxH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `olam flywheel k5-score` — compute K5 composite + boost from sub-scores.
3
+ *
4
+ * Per `references/k5-rubric-schema.md` from the /10x: planning chain:
5
+ * k5_boost = min(2.0, cited_ratio * 4.0)
6
+ * k5_composite = min(100, min(k5_scores.values()) * k5_boost)
7
+ *
8
+ * Output: JSON object on stdout.
9
+ *
10
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A4
11
+ */
12
+ import type { Command } from 'commander';
13
+ export declare function registerFlywheelK5Score(parent: Command): void;
14
+ //# sourceMappingURL=k5-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k5-score.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/k5-score.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDzC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAsB7D"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * `olam flywheel k5-score` — compute K5 composite + boost from sub-scores.
3
+ *
4
+ * Per `references/k5-rubric-schema.md` from the /10x: planning chain:
5
+ * k5_boost = min(2.0, cited_ratio * 4.0)
6
+ * k5_composite = min(100, min(k5_scores.values()) * k5_boost)
7
+ *
8
+ * Output: JSON object on stdout.
9
+ *
10
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A4
11
+ */
12
+ function parseScore(raw, name) {
13
+ const n = Number.parseInt(raw, 10);
14
+ if (!Number.isFinite(n) || n < 0 || n > 100) {
15
+ process.stderr.write(`[k5-score-reject] --${name} must be integer 0-100, got: ${JSON.stringify(raw)}\n`);
16
+ process.exit(2);
17
+ }
18
+ return n;
19
+ }
20
+ function parseCitedRatio(raw) {
21
+ if (raw === undefined)
22
+ return 0.0;
23
+ const n = Number.parseFloat(raw);
24
+ if (!Number.isFinite(n) || n < 0.0 || n > 1.0) {
25
+ process.stderr.write(`[k5-score-reject] --cited-ratio must be 0.0-1.0, got: ${JSON.stringify(raw)}\n`);
26
+ process.exit(2);
27
+ }
28
+ return n;
29
+ }
30
+ function computeK5(scores, citedRatio) {
31
+ const boost = Math.min(2.0, citedRatio * 4.0);
32
+ const minScore = Math.min(scores.direction, scores.approach, scores.open_questions, scores.constraints, scores.reuse);
33
+ const composite = Math.min(100, Math.round(minScore * boost));
34
+ return { k5_scores: scores, k5_boost: boost, k5_composite: composite };
35
+ }
36
+ export function registerFlywheelK5Score(parent) {
37
+ parent
38
+ .command('k5-score')
39
+ .description('Compute K5 composite + boost from sub-scores (min-of-5 × boost, capped at 100)')
40
+ .requiredOption('--direction <0-100>', 'Direction sub-score')
41
+ .requiredOption('--approach <0-100>', 'Approach sub-score')
42
+ .requiredOption('--open-questions <0-100>', 'Open questions sub-score')
43
+ .requiredOption('--constraints <0-100>', 'Constraints sub-score')
44
+ .requiredOption('--reuse <0-100>', 'Reuse sub-score')
45
+ .option('--cited-ratio <0.0-1.0>', 'Cited fact ratio (default 0.0 → boost = 0)')
46
+ .action((opts) => {
47
+ const scores = {
48
+ direction: parseScore(opts.direction, 'direction'),
49
+ approach: parseScore(opts.approach, 'approach'),
50
+ open_questions: parseScore(opts.openQuestions, 'open-questions'),
51
+ constraints: parseScore(opts.constraints, 'constraints'),
52
+ reuse: parseScore(opts.reuse, 'reuse'),
53
+ };
54
+ const citedRatio = parseCitedRatio(opts.citedRatio);
55
+ const result = computeK5(scores, citedRatio);
56
+ process.stdout.write(JSON.stringify(result) + '\n');
57
+ });
58
+ }
59
+ //# sourceMappingURL=k5-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k5-score.js","sourceRoot":"","sources":["../../../src/commands/flywheel/k5-score.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyBH,SAAS,UAAU,CAAC,GAAW,EAAE,IAAY;IAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,gCAAgC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,eAAe,CAAC,GAAuB;IAC9C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yDAAyD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,MAAkC,EAAE,UAAkB;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,KAAK,CACb,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;IAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAe;IACrD,MAAM;SACH,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,gFAAgF,CAAC;SAC7F,cAAc,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;SAC5D,cAAc,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;SAC1D,cAAc,CAAC,0BAA0B,EAAE,0BAA0B,CAAC;SACtE,cAAc,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;SAChE,cAAc,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;SACpD,MAAM,CAAC,yBAAyB,EAAE,4CAA4C,CAAC;SAC/E,MAAM,CAAC,CAAC,IAA4B,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;YAClD,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;YAC/C,cAAc,EAAE,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC;YAChE,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC;YACxD,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;SACvC,CAAC;QACF,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `olam flywheel k5-validate` — port of `shared/engineering/scripts/k5-rubric-helper.py`
3
+ * validate mode. Schema-checks a plan's frontmatter `k5_scores` / `k5_boost` /
4
+ * `k5_composite` / `k5_scored_at` block.
5
+ *
6
+ * Exit codes mirror the Python script:
7
+ * 0 = valid (or all k5 fields absent — absence is acceptable for legacy plans)
8
+ * 1 = malformed (one or more present k5 fields fail validation)
9
+ * 2 = unexpected error (cannot stat / read / oversize file)
10
+ *
11
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A4
12
+ */
13
+ import type { Command } from 'commander';
14
+ export declare function registerFlywheelK5Validate(parent: Command): void;
15
+ //# sourceMappingURL=k5-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k5-validate.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/k5-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkKzC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAoBhE"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * `olam flywheel k5-validate` — port of `shared/engineering/scripts/k5-rubric-helper.py`
3
+ * validate mode. Schema-checks a plan's frontmatter `k5_scores` / `k5_boost` /
4
+ * `k5_composite` / `k5_scored_at` block.
5
+ *
6
+ * Exit codes mirror the Python script:
7
+ * 0 = valid (or all k5 fields absent — absence is acceptable for legacy plans)
8
+ * 1 = malformed (one or more present k5 fields fail validation)
9
+ * 2 = unexpected error (cannot stat / read / oversize file)
10
+ *
11
+ * Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A4
12
+ */
13
+ import { readFileSync, statSync } from 'node:fs';
14
+ import { parse as parseYAML } from 'yaml';
15
+ const K5_DIMS = ['direction', 'approach', 'open_questions', 'constraints', 'reuse'];
16
+ const MAX_PLAN_BYTES = 1_048_576;
17
+ function extractFrontmatter(text) {
18
+ // BOM strip
19
+ const cleaned = text.replace(/^/, '');
20
+ if (!cleaned.startsWith('---'))
21
+ return null;
22
+ const closeIdx = cleaned.indexOf('\n---', 3);
23
+ if (closeIdx === -1)
24
+ return null;
25
+ const fmRaw = cleaned.slice(4, closeIdx);
26
+ try {
27
+ const parsed = parseYAML(fmRaw);
28
+ return parsed ?? {};
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ function validateK5Scores(scores) {
35
+ if (typeof scores !== 'object' || scores === null) {
36
+ return `k5_scores must be a mapping with keys ${K5_DIMS.join(', ')}`;
37
+ }
38
+ const obj = scores;
39
+ for (const dim of K5_DIMS) {
40
+ if (!(dim in obj))
41
+ return `k5_scores missing key '${dim}' (required: ${K5_DIMS.join(', ')})`;
42
+ const val = obj[dim];
43
+ const n = typeof val === 'number' ? val : Number.parseInt(String(val), 10);
44
+ if (!Number.isFinite(n) || !Number.isInteger(n)) {
45
+ return `k5_scores.${dim} must be an integer 0-100, got: ${JSON.stringify(val)}`;
46
+ }
47
+ if (n < 0 || n > 100) {
48
+ return `k5_scores.${dim} out of range 0-100: ${n}`;
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+ function validateK5Boost(boost) {
54
+ const n = typeof boost === 'number' ? boost : Number.parseFloat(String(boost));
55
+ if (!Number.isFinite(n))
56
+ return `k5_boost must be a float 0.0-2.0, got: ${JSON.stringify(boost)}`;
57
+ if (n < 0.0 || n > 2.0)
58
+ return `k5_boost out of range 0.0-2.0: ${n}`;
59
+ return null;
60
+ }
61
+ function validateK5Composite(composite) {
62
+ const n = typeof composite === 'number' ? composite : Number.parseInt(String(composite), 10);
63
+ if (!Number.isFinite(n) || !Number.isInteger(n)) {
64
+ return `k5_composite must be an integer 0-100, got: ${JSON.stringify(composite)}`;
65
+ }
66
+ if (n < 0 || n > 100)
67
+ return `k5_composite out of range 0-100: ${n}`;
68
+ return null;
69
+ }
70
+ function validateK5ScoredAt(scoredAt) {
71
+ if (typeof scoredAt !== 'string') {
72
+ return `k5_scored_at must be a string date YYYY-MM-DD, got: ${JSON.stringify(scoredAt)}`;
73
+ }
74
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(scoredAt.trim())) {
75
+ return `k5_scored_at must be ISO date YYYY-MM-DD, got: ${JSON.stringify(scoredAt)}`;
76
+ }
77
+ return null;
78
+ }
79
+ function validatePlan(path) {
80
+ let stat;
81
+ try {
82
+ stat = statSync(path);
83
+ }
84
+ catch (err) {
85
+ return { ok: false, message: `FAIL cannot stat ${path}: ${err instanceof Error ? err.message : 'unknown'}` };
86
+ }
87
+ if (stat.size > MAX_PLAN_BYTES) {
88
+ return { ok: false, message: `FAIL ${path}: plan file exceeds 1MB (${stat.size} bytes); refusing to parse` };
89
+ }
90
+ let text;
91
+ try {
92
+ text = readFileSync(path, 'utf8');
93
+ }
94
+ catch (err) {
95
+ return { ok: false, message: `FAIL cannot read ${path}: ${err instanceof Error ? err.message : 'unknown'}` };
96
+ }
97
+ if (!text.replace(/^/, '').startsWith('---')) {
98
+ return { ok: false, message: `FAIL ${path}: no YAML frontmatter (missing opening --- marker)` };
99
+ }
100
+ if (!text.includes('\n---', 3)) {
101
+ return { ok: false, message: `FAIL ${path}: frontmatter block never closed (missing closing --- marker)` };
102
+ }
103
+ const fm = extractFrontmatter(text);
104
+ if (fm === null) {
105
+ return { ok: false, message: `FAIL ${path}: frontmatter could not be parsed as YAML` };
106
+ }
107
+ const hasScores = 'k5_scores' in fm;
108
+ const hasBoost = 'k5_boost' in fm;
109
+ const hasComposite = 'k5_composite' in fm;
110
+ const hasScoredAt = 'k5_scored_at' in fm;
111
+ if (!hasScores && !hasBoost && !hasComposite && !hasScoredAt) {
112
+ return { ok: true, message: `PASS ${path}: k5_scores absent (acceptable — legacy plan)` };
113
+ }
114
+ const errors = [];
115
+ if (hasScores) {
116
+ const err = validateK5Scores(fm.k5_scores);
117
+ if (err !== null)
118
+ errors.push(err);
119
+ }
120
+ if (hasBoost) {
121
+ const err = validateK5Boost(fm.k5_boost);
122
+ if (err !== null)
123
+ errors.push(err);
124
+ }
125
+ if (hasComposite) {
126
+ const err = validateK5Composite(fm.k5_composite);
127
+ if (err !== null)
128
+ errors.push(err);
129
+ }
130
+ if (hasScoredAt) {
131
+ const err = validateK5ScoredAt(fm.k5_scored_at);
132
+ if (err !== null)
133
+ errors.push(err);
134
+ }
135
+ if (errors.length > 0) {
136
+ return { ok: false, message: `FAIL ${path}: ${errors.join('; ')}` };
137
+ }
138
+ const lines = [`PASS ${path}: k5_scores valid`];
139
+ if (hasScores && typeof fm.k5_scores === 'object' && fm.k5_scores !== null) {
140
+ const scoresObj = fm.k5_scores;
141
+ const vals = [];
142
+ for (const dim of K5_DIMS) {
143
+ const raw = scoresObj[dim];
144
+ const n = typeof raw === 'number' ? raw : Number.parseInt(String(raw), 10);
145
+ vals.push(n);
146
+ lines.push(` ${dim}: ${n}`);
147
+ }
148
+ lines.push(` min(k5_scores): ${Math.min(...vals)}`);
149
+ }
150
+ if (hasBoost) {
151
+ const n = typeof fm.k5_boost === 'number' ? fm.k5_boost : Number.parseFloat(String(fm.k5_boost));
152
+ lines.push(` k5_boost: ${n.toFixed(2)}`);
153
+ }
154
+ if (hasComposite)
155
+ lines.push(` k5_composite: ${String(fm.k5_composite)}`);
156
+ if (hasScoredAt)
157
+ lines.push(` k5_scored_at: ${String(fm.k5_scored_at)}`);
158
+ if ('confidence' in fm)
159
+ lines.push(` confidence (existing): ${String(fm.confidence)}`);
160
+ return { ok: true, message: lines.join('\n') };
161
+ }
162
+ export function registerFlywheelK5Validate(parent) {
163
+ parent
164
+ .command('k5-validate')
165
+ .description("Schema-check a plan's frontmatter k5_scores / k5_boost / k5_composite / k5_scored_at")
166
+ .argument('<plan-path>', 'path to the plan markdown file')
167
+ .action((planPath) => {
168
+ try {
169
+ const result = validatePlan(planPath);
170
+ if (result.ok) {
171
+ process.stdout.write(result.message + '\n');
172
+ process.exit(0);
173
+ }
174
+ else {
175
+ process.stderr.write(result.message + '\n');
176
+ process.exit(1);
177
+ }
178
+ }
179
+ catch (err) {
180
+ process.stderr.write(`FAIL ${planPath}: unexpected error: ${err instanceof Error ? err.message : 'unknown'}\n`);
181
+ process.exit(2);
182
+ }
183
+ });
184
+ }
185
+ //# sourceMappingURL=k5-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k5-validate.js","sourceRoot":"","sources":["../../../src/commands/flywheel/k5-validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `olam flywheel ping` — no-op subcommand for cold-start telemetry.
3
+ *
4
+ * Establishes the measurement baseline OQ12 references: before porting any
5
+ * subcommand from atlas-toolbox to olam, we need to know what cold-start
6
+ * overhead the shim → olam binary path adds vs the current bash-invoked
7
+ * scripts. Operators run `time olam flywheel ping` on a representative
8
+ * machine + record the result.
9
+ *
10
+ * Branch decision (per plan A2):
11
+ * ≤200ms total invocation → full-port for A3+ subcommands (drop hybrid hedge S2)
12
+ * 200-500ms → full-port with follow-up perf-investigation tagged
13
+ * >500ms → escalate to hybrid model (heavy helpers ported;
14
+ * emit-breadcrumb stays as native script delegating)
15
+ *
16
+ * Telemetry baseline written to ~/.local/share/olam/flywheel-baseline.json.
17
+ * Permanent telemetry surface for `olam doctor` (promoted in task A13).
18
+ */
19
+ import type { Command } from 'commander';
20
+ export declare function registerFlywheelPing(parent: Command): void;
21
+ //# sourceMappingURL=ping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/ping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwCzC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAqC1D"}