@pleri/olam-cli 0.1.158 → 0.1.160
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-stream/agent-sdk-to-chunks.js +3 -0
- package/dist/agent-stream/driver-runner.js +9 -4
- package/dist/agent-stream/host-driver-launch.js +48 -0
- package/dist/commands/doctor.d.ts +21 -10
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +95 -39
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/flywheel/check-persona-skeleton.d.ts +30 -2
- package/dist/commands/flywheel/check-persona-skeleton.d.ts.map +1 -1
- package/dist/commands/flywheel/check-persona-skeleton.js +143 -6
- package/dist/commands/flywheel/check-persona-skeleton.js.map +1 -1
- package/dist/commands/flywheel/diversity-check.d.ts +12 -2
- package/dist/commands/flywheel/diversity-check.d.ts.map +1 -1
- package/dist/commands/flywheel/diversity-check.js +56 -6
- package/dist/commands/flywheel/diversity-check.js.map +1 -1
- package/dist/commands/flywheel/index.d.ts.map +1 -1
- package/dist/commands/flywheel/index.js +2 -0
- package/dist/commands/flywheel/index.js.map +1 -1
- package/dist/commands/flywheel/install-shims.d.ts +36 -3
- package/dist/commands/flywheel/install-shims.d.ts.map +1 -1
- package/dist/commands/flywheel/install-shims.js +118 -7
- package/dist/commands/flywheel/install-shims.js.map +1 -1
- package/dist/commands/flywheel/k10-measure.d.ts +12 -2
- package/dist/commands/flywheel/k10-measure.d.ts.map +1 -1
- package/dist/commands/flywheel/k10-measure.js +55 -6
- package/dist/commands/flywheel/k10-measure.js.map +1 -1
- package/dist/commands/flywheel/migrate-overlays.d.ts +115 -0
- package/dist/commands/flywheel/migrate-overlays.d.ts.map +1 -0
- package/dist/commands/flywheel/migrate-overlays.js +766 -0
- package/dist/commands/flywheel/migrate-overlays.js.map +1 -0
- package/dist/commands/flywheel/sanitize-persona-output.d.ts +33 -2
- package/dist/commands/flywheel/sanitize-persona-output.d.ts.map +1 -1
- package/dist/commands/flywheel/sanitize-persona-output.js +94 -6
- package/dist/commands/flywheel/sanitize-persona-output.js.map +1 -1
- package/dist/commands/memory/index.d.ts.map +1 -1
- package/dist/commands/memory/index.js +2 -0
- package/dist/commands/memory/index.js.map +1 -1
- package/dist/commands/memory/install-hooks.d.ts +22 -0
- package/dist/commands/memory/install-hooks.d.ts.map +1 -0
- package/dist/commands/memory/install-hooks.js +156 -0
- package/dist/commands/memory/install-hooks.js.map +1 -0
- package/dist/commands/skills-doctor.js +2 -2
- package/dist/commands/skills-doctor.js.map +1 -1
- package/dist/commands/skills-source.d.ts.map +1 -1
- package/dist/commands/skills-source.js +10 -0
- package/dist/commands/skills-source.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +169 -1
- package/dist/commands/skills.js.map +1 -1
- package/dist/image-digests.json +7 -7
- package/dist/index.js +3592 -905
- package/dist/index.js.map +1 -1
- package/dist/lib/flywheel-probes.d.ts +58 -0
- package/dist/lib/flywheel-probes.d.ts.map +1 -0
- package/dist/lib/flywheel-probes.js +163 -0
- package/dist/lib/flywheel-probes.js.map +1 -0
- package/dist/lib/host-side-proxy.d.ts +67 -0
- package/dist/lib/host-side-proxy.d.ts.map +1 -0
- package/dist/lib/host-side-proxy.js +177 -0
- package/dist/lib/host-side-proxy.js.map +1 -0
- package/dist/lib/shim-generator.d.ts +51 -0
- package/dist/lib/shim-generator.d.ts.map +1 -0
- package/dist/lib/shim-generator.js +88 -0
- package/dist/lib/shim-generator.js.map +1 -0
- package/dist/lib/skills-apply-overlays.d.ts +35 -0
- package/dist/lib/skills-apply-overlays.d.ts.map +1 -0
- package/dist/lib/skills-apply-overlays.js +243 -0
- package/dist/lib/skills-apply-overlays.js.map +1 -0
- package/dist/lib/upgrade-kubernetes.d.ts +13 -12
- package/dist/lib/upgrade-kubernetes.d.ts.map +1 -1
- package/dist/lib/upgrade-kubernetes.js +87 -134
- package/dist/lib/upgrade-kubernetes.js.map +1 -1
- package/dist/mcp-server.js +1106 -453
- package/hermes-bundle/version.json +1 -1
- package/host-cp/k8s/host-side/docker-socket-proxy.compose.yaml +58 -0
- package/host-cp/k8s/manifests/50-deployment.yaml +47 -70
- package/host-cp/k8s/manifests/auth-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/docker-socket-proxy/60-service.yaml +37 -0
- package/host-cp/k8s/manifests/kg-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/mcp-auth-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/memory-service/30-configmap.yaml +11 -0
- package/host-cp/k8s/manifests/memory-service/35-configmap-iii-config.yaml +76 -0
- package/host-cp/k8s/manifests/memory-service/50-deployment.yaml +11 -1
- package/host-cp/src/crystallize-planning.mjs +261 -0
- package/host-cp/src/plan-chat-service.mjs +84 -2
- package/host-cp/src/planning-sessions.mjs +270 -0
- package/host-cp/src/server.mjs +9 -0
- package/host-cp/src/tasks-route.mjs +191 -0
- package/package.json +1 -1
|
@@ -1,14 +1,151 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `olam flywheel check-persona-skeleton` —
|
|
3
|
-
*
|
|
2
|
+
* `olam flywheel check-persona-skeleton` — D12 skeleton conformance checker.
|
|
3
|
+
*
|
|
4
|
+
* Port of `shared/engineering/scripts/check-persona-skeleton.py`. Validates
|
|
5
|
+
* persona-file conformance:
|
|
6
|
+
* 1. Frontmatter has `name`, `description`, `allowed-tools`.
|
|
7
|
+
* 2-5. Body has `## Role`, `## Cognitive patterns`, `## Scoring rubric`,
|
|
8
|
+
* `## Output format`.
|
|
9
|
+
* 6. `## Cognitive patterns` has ≥5 named patterns (### headings or bullets).
|
|
10
|
+
* 7. Token count (chars/4 approx) ≤ K10 cap (6000).
|
|
11
|
+
*
|
|
12
|
+
* Note on merged-result measurement: the Python predecessor imports
|
|
13
|
+
* apply-overlays.py's `merge_markdown` to measure overlay+upstream merged
|
|
14
|
+
* results. This TypeScript port currently measures STANDALONE only — overlay
|
|
15
|
+
* files needing merged-result measurement emit a warning + are checked
|
|
16
|
+
* against their standalone content. The merge-aware measurement lands when
|
|
17
|
+
* Phase A step 9 (apply-overlays port) ships; see follow-up task A7-merge.
|
|
18
|
+
*
|
|
19
|
+
* CLI:
|
|
20
|
+
* olam flywheel check-persona-skeleton <file> [<file> ...]
|
|
21
|
+
* Exit 0 = all PASS; Exit 1 = any FAIL.
|
|
22
|
+
*
|
|
23
|
+
* Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A7
|
|
4
24
|
*/
|
|
25
|
+
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
26
|
+
import { homedir } from 'node:os';
|
|
27
|
+
import { basename, join } from 'node:path';
|
|
28
|
+
import { parse as parseYAML } from 'yaml';
|
|
29
|
+
const CHARS_PER_TOKEN = 4;
|
|
30
|
+
const K10_TOKEN_CAP = 6000;
|
|
31
|
+
const AGENTS_DIR = join(homedir(), '.claude', 'agents');
|
|
32
|
+
const REQUIRED_FRONTMATTER_KEYS = ['name', 'description', 'allowed-tools'];
|
|
33
|
+
const REQUIRED_SECTIONS = [
|
|
34
|
+
'## Role',
|
|
35
|
+
'## Cognitive patterns',
|
|
36
|
+
'## Scoring rubric',
|
|
37
|
+
'## Output format',
|
|
38
|
+
];
|
|
39
|
+
function parseFile(text) {
|
|
40
|
+
const cleaned = text.replace(/^/, '');
|
|
41
|
+
if (!cleaned.startsWith('---'))
|
|
42
|
+
return { fm: {}, body: cleaned };
|
|
43
|
+
const closeIdx = cleaned.indexOf('\n---', 3);
|
|
44
|
+
if (closeIdx === -1)
|
|
45
|
+
return { fm: {}, body: cleaned };
|
|
46
|
+
const fmRaw = cleaned.slice(4, closeIdx);
|
|
47
|
+
const body = cleaned.slice(closeIdx + 4).replace(/^\n/, '');
|
|
48
|
+
try {
|
|
49
|
+
const fm = parseYAML(fmRaw) ?? {};
|
|
50
|
+
return { fm, body };
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return { fm: {}, body };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function countH2(body, heading) {
|
|
57
|
+
const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
58
|
+
const pattern = new RegExp(`^${escaped}\\s*$`, 'gm');
|
|
59
|
+
return (body.match(pattern) ?? []).length;
|
|
60
|
+
}
|
|
61
|
+
function sectionBody(body, heading) {
|
|
62
|
+
const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
63
|
+
const pattern = new RegExp(`^${escaped}\\s*\\n([\\s\\S]*?)(?=^## |$(?![\\r\\n]))`, 'm');
|
|
64
|
+
const match = body.match(pattern);
|
|
65
|
+
return match?.[1] ?? '';
|
|
66
|
+
}
|
|
67
|
+
function countNamedPatterns(sectionText) {
|
|
68
|
+
const h3Count = (sectionText.match(/^###\s+\S/gm) ?? []).length;
|
|
69
|
+
if (h3Count >= 5)
|
|
70
|
+
return h3Count;
|
|
71
|
+
const bulletCount = (sectionText.match(/^\s*[-*]\s+\S/gm) ?? []).length;
|
|
72
|
+
return Math.max(h3Count, bulletCount);
|
|
73
|
+
}
|
|
74
|
+
export function checkFile(filepath) {
|
|
75
|
+
if (!existsSync(filepath) || !statSync(filepath).isFile()) {
|
|
76
|
+
return { passed: false, failures: [`file not found: ${filepath}`], tokens: 0, mergedSkipped: false };
|
|
77
|
+
}
|
|
78
|
+
const text = readFileSync(filepath, 'utf8');
|
|
79
|
+
const { fm, body } = parseFile(text);
|
|
80
|
+
const failures = [];
|
|
81
|
+
// 1. Frontmatter required keys.
|
|
82
|
+
for (const key of REQUIRED_FRONTMATTER_KEYS) {
|
|
83
|
+
const val = fm[key];
|
|
84
|
+
if (val === undefined || val === null || val === '') {
|
|
85
|
+
failures.push(`frontmatter missing \`${key}:\``);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Determine whether to attempt merged measurement.
|
|
89
|
+
const isNewAgent = fm['overlay-intent'] === 'new-agent';
|
|
90
|
+
const agentName = typeof fm.name === 'string' ? fm.name : '';
|
|
91
|
+
let mergedSkipped = false;
|
|
92
|
+
if (!isNewAgent && agentName !== '') {
|
|
93
|
+
const upstreamPath = join(AGENTS_DIR, `${agentName}.md`);
|
|
94
|
+
if (existsSync(upstreamPath)) {
|
|
95
|
+
// Merged-result measurement requires A9 apply-overlays port.
|
|
96
|
+
// For now: warn + fall back to standalone measurement.
|
|
97
|
+
mergedSkipped = true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// 2-5. Required sections.
|
|
101
|
+
for (const heading of REQUIRED_SECTIONS) {
|
|
102
|
+
if (countH2(body, heading) === 0) {
|
|
103
|
+
failures.push(`missing section: '${heading}'`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// 6. ≥5 named patterns.
|
|
107
|
+
const cogBody = sectionBody(body, '## Cognitive patterns');
|
|
108
|
+
if (cogBody !== '') {
|
|
109
|
+
const patternCount = countNamedPatterns(cogBody);
|
|
110
|
+
if (patternCount < 5) {
|
|
111
|
+
failures.push(`'## Cognitive patterns' has ${patternCount} named pattern(s); need >= 5`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// 7. Token cap.
|
|
115
|
+
const tokens = Math.floor(text.length / CHARS_PER_TOKEN);
|
|
116
|
+
if (tokens > K10_TOKEN_CAP) {
|
|
117
|
+
failures.push(`K10 cap exceeded: ${tokens} > ${K10_TOKEN_CAP} tokens`);
|
|
118
|
+
}
|
|
119
|
+
return { passed: failures.length === 0, failures, tokens, mergedSkipped };
|
|
120
|
+
}
|
|
5
121
|
export function registerFlywheelCheckPersonaSkeleton(parent) {
|
|
6
122
|
parent
|
|
7
123
|
.command('check-persona-skeleton')
|
|
8
|
-
.description('Validate
|
|
9
|
-
.
|
|
10
|
-
|
|
11
|
-
|
|
124
|
+
.description('Validate D12 skeleton conformance of persona files (frontmatter + required sections + cognitive patterns + K10 cap)')
|
|
125
|
+
.argument('<file...>', 'one or more persona files to check')
|
|
126
|
+
.action((files) => {
|
|
127
|
+
let passCount = 0;
|
|
128
|
+
let failCount = 0;
|
|
129
|
+
for (const filepath of files) {
|
|
130
|
+
const result = checkFile(filepath);
|
|
131
|
+
const label = basename(filepath);
|
|
132
|
+
if (result.passed) {
|
|
133
|
+
process.stdout.write(`PASS: ${label} -- D12 skeleton valid; tokens=${result.tokens}/${K10_TOKEN_CAP}`);
|
|
134
|
+
if (result.mergedSkipped) {
|
|
135
|
+
process.stdout.write(' (merged measurement deferred to A9 apply-overlays port)');
|
|
136
|
+
}
|
|
137
|
+
process.stdout.write('\n');
|
|
138
|
+
passCount += 1;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
for (const detail of result.failures) {
|
|
142
|
+
process.stdout.write(`FAIL: ${label} -- ${detail}\n`);
|
|
143
|
+
}
|
|
144
|
+
failCount += 1;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
process.stdout.write(`\nResults: ${passCount} passed, ${failCount} failed\n`);
|
|
148
|
+
process.exit(failCount > 0 ? 1 : 0);
|
|
12
149
|
});
|
|
13
150
|
}
|
|
14
151
|
//# sourceMappingURL=check-persona-skeleton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-persona-skeleton.js","sourceRoot":"","sources":["../../../src/commands/flywheel/check-persona-skeleton.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"check-persona-skeleton.js","sourceRoot":"","sources":["../../../src/commands/flywheel/check-persona-skeleton.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `olam flywheel diversity-check` —
|
|
3
|
-
*
|
|
2
|
+
* `olam flywheel diversity-check` — cross-persona Jaccard similarity CLI.
|
|
3
|
+
*
|
|
4
|
+
* Reads persona-prompt files from a glob; computes pairwise Jaccard; reports
|
|
5
|
+
* pairs exceeding the threshold (default 0.7). Used by /10x:learn write-path
|
|
6
|
+
* to detect silent convergence collapse across K1 personas.
|
|
7
|
+
*
|
|
8
|
+
* Exit codes:
|
|
9
|
+
* 0 = no convergence (all pairs below threshold)
|
|
10
|
+
* 1 = convergence detected (one or more pairs above threshold)
|
|
11
|
+
* 2 = unexpected error (no matching files / read failure)
|
|
12
|
+
*
|
|
13
|
+
* Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A8
|
|
4
14
|
*/
|
|
5
15
|
import type { Command } from 'commander';
|
|
6
16
|
export declare function registerFlywheelDiversityCheck(parent: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diversity-check.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/diversity-check.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"diversity-check.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/diversity-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAkDpE"}
|
|
@@ -1,14 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `olam flywheel diversity-check` —
|
|
3
|
-
*
|
|
2
|
+
* `olam flywheel diversity-check` — cross-persona Jaccard similarity CLI.
|
|
3
|
+
*
|
|
4
|
+
* Reads persona-prompt files from a glob; computes pairwise Jaccard; reports
|
|
5
|
+
* pairs exceeding the threshold (default 0.7). Used by /10x:learn write-path
|
|
6
|
+
* to detect silent convergence collapse across K1 personas.
|
|
7
|
+
*
|
|
8
|
+
* Exit codes:
|
|
9
|
+
* 0 = no convergence (all pairs below threshold)
|
|
10
|
+
* 1 = convergence detected (one or more pairs above threshold)
|
|
11
|
+
* 2 = unexpected error (no matching files / read failure)
|
|
12
|
+
*
|
|
13
|
+
* Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A8
|
|
4
14
|
*/
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
import { basename } from 'node:path';
|
|
17
|
+
import { globSync } from 'node:fs';
|
|
18
|
+
import { crossPersonaCheck, formatRedivergencePrompt, DIVERSITY_THRESHOLD, } from '@olam/core/src/lib/diversity-check.js';
|
|
5
19
|
export function registerFlywheelDiversityCheck(parent) {
|
|
6
20
|
parent
|
|
7
21
|
.command('diversity-check')
|
|
8
|
-
.description('Cross-
|
|
9
|
-
.
|
|
10
|
-
|
|
11
|
-
|
|
22
|
+
.description('Cross-persona Jaccard similarity guard — flag persona pairs above threshold')
|
|
23
|
+
.requiredOption('--glob <pattern>', 'glob pattern matching persona-prompt files')
|
|
24
|
+
.option('--threshold <0.0-1.0>', 'Jaccard threshold (default 0.7)')
|
|
25
|
+
.option('--json', 'emit findings as JSON instead of human-readable')
|
|
26
|
+
.action((opts) => {
|
|
27
|
+
const threshold = opts.threshold !== undefined ? Number.parseFloat(opts.threshold) : DIVERSITY_THRESHOLD;
|
|
28
|
+
if (!Number.isFinite(threshold) || threshold < 0 || threshold > 1) {
|
|
29
|
+
process.stderr.write(`[diversity-check-reject] --threshold must be 0.0-1.0; got ${JSON.stringify(opts.threshold)}\n`);
|
|
30
|
+
process.exit(2);
|
|
31
|
+
}
|
|
32
|
+
// Use Node 22+'s native glob (no extra dep).
|
|
33
|
+
const files = globSync(opts.glob);
|
|
34
|
+
if (files.length === 0) {
|
|
35
|
+
process.stderr.write(`[diversity-check-reject] no files matched glob: ${opts.glob}\n`);
|
|
36
|
+
process.exit(2);
|
|
37
|
+
}
|
|
38
|
+
const personas = new Map();
|
|
39
|
+
for (const filepath of files) {
|
|
40
|
+
try {
|
|
41
|
+
const body = readFileSync(filepath, 'utf8');
|
|
42
|
+
if (body.trim().length > 0) {
|
|
43
|
+
personas.set(basename(filepath, '.md'), body);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
process.stderr.write(`[diversity-check-error] cannot read ${filepath}: ${err instanceof Error ? err.message : 'unknown'}\n`);
|
|
48
|
+
process.exit(2);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const flagged = crossPersonaCheck(personas, threshold);
|
|
52
|
+
if (opts.json) {
|
|
53
|
+
process.stdout.write(JSON.stringify({ threshold, persona_count: personas.size, flagged }) + '\n');
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
process.stdout.write(`[diversity-check] ${personas.size} personas; threshold ${threshold}; ${flagged.length} pair(s) over threshold\n`);
|
|
57
|
+
for (const { persona_a, persona_b, score } of flagged) {
|
|
58
|
+
process.stdout.write(`\n${formatRedivergencePrompt(persona_a, persona_b, score, undefined, undefined, threshold)}\n`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
process.exit(flagged.length > 0 ? 1 : 0);
|
|
12
62
|
});
|
|
13
63
|
}
|
|
14
64
|
//# sourceMappingURL=diversity-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diversity-check.js","sourceRoot":"","sources":["../../../src/commands/flywheel/diversity-check.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"diversity-check.js","sourceRoot":"","sources":["../../../src/commands/flywheel/diversity-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;AAYzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiBvD"}
|
|
@@ -31,6 +31,7 @@ import { registerFlywheelCheckPersonaSkeleton } from './check-persona-skeleton.j
|
|
|
31
31
|
import { registerFlywheelDiversityCheck } from './diversity-check.js';
|
|
32
32
|
import { registerFlywheelPing } from './ping.js';
|
|
33
33
|
import { registerFlywheelInstallShims } from './install-shims.js';
|
|
34
|
+
import { registerFlywheelMigrateOverlays } from './migrate-overlays.js';
|
|
34
35
|
export function registerFlywheel(program) {
|
|
35
36
|
const flywheel = program
|
|
36
37
|
.command('flywheel')
|
|
@@ -44,5 +45,6 @@ export function registerFlywheel(program) {
|
|
|
44
45
|
registerFlywheelDiversityCheck(flywheel);
|
|
45
46
|
registerFlywheelPing(flywheel);
|
|
46
47
|
registerFlywheelInstallShims(flywheel);
|
|
48
|
+
registerFlywheelMigrateOverlays(flywheel);
|
|
47
49
|
}
|
|
48
50
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +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;
|
|
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;AAClE,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAExE,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;IACvC,+BAA+B,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1,8 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `olam flywheel install-shims` —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* `olam flywheel install-shims` — write backwards-compat shims to ~/.claude/scripts/.
|
|
3
|
+
*
|
|
4
|
+
* Generates a bash shim per spec in SHIM_SPECS and writes it to
|
|
5
|
+
* ~/.claude/scripts/<basename>. Detects existing non-shim files (operator's
|
|
6
|
+
* own scripts or atlas-toolbox-shipped originals) and prompts/backs-up
|
|
7
|
+
* before overwriting. Idempotent — re-runs produce no diff when content
|
|
8
|
+
* matches.
|
|
9
|
+
*
|
|
10
|
+
* Replaces the A1 stub.
|
|
11
|
+
*
|
|
12
|
+
* Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A14
|
|
13
|
+
* Closes part of K1 OQ20 (correct hook-point for shim installation).
|
|
5
14
|
*/
|
|
6
15
|
import type { Command } from 'commander';
|
|
16
|
+
export interface InstallShimsOptions {
|
|
17
|
+
force?: boolean;
|
|
18
|
+
dryRun?: boolean;
|
|
19
|
+
targetDir?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ShimInstallStatus {
|
|
22
|
+
basename: string;
|
|
23
|
+
action: 'written' | 'overwritten' | 'unchanged' | 'preserved-existing';
|
|
24
|
+
targetPath: string;
|
|
25
|
+
backupPath?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface RefreshShimsResult {
|
|
28
|
+
results: ShimInstallStatus[];
|
|
29
|
+
written: number;
|
|
30
|
+
overwritten: number;
|
|
31
|
+
unchanged: number;
|
|
32
|
+
preserved: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Programmatic API for refreshing all shims. Used by:
|
|
36
|
+
* - `olam flywheel install-shims` CLI action (this file).
|
|
37
|
+
* - `olam skills source pull` post-step (B2 hook point).
|
|
38
|
+
*/
|
|
39
|
+
export declare function refreshShims(opts?: InstallShimsOptions): RefreshShimsResult;
|
|
7
40
|
export declare function registerFlywheelInstallShims(parent: Command): void;
|
|
8
41
|
//# sourceMappingURL=install-shims.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-shims.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/install-shims.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"install-shims.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/install-shims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,oBAAoB,CAAC;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,kBAAkB,CAkB/E;AA8CD,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAoClE"}
|
|
@@ -1,15 +1,126 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `olam flywheel install-shims` —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* `olam flywheel install-shims` — write backwards-compat shims to ~/.claude/scripts/.
|
|
3
|
+
*
|
|
4
|
+
* Generates a bash shim per spec in SHIM_SPECS and writes it to
|
|
5
|
+
* ~/.claude/scripts/<basename>. Detects existing non-shim files (operator's
|
|
6
|
+
* own scripts or atlas-toolbox-shipped originals) and prompts/backs-up
|
|
7
|
+
* before overwriting. Idempotent — re-runs produce no diff when content
|
|
8
|
+
* matches.
|
|
9
|
+
*
|
|
10
|
+
* Replaces the A1 stub.
|
|
11
|
+
*
|
|
12
|
+
* Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A14
|
|
13
|
+
* Closes part of K1 OQ20 (correct hook-point for shim installation).
|
|
5
14
|
*/
|
|
15
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { SHIM_SPECS, generateShim } from '../../lib/shim-generator.js';
|
|
19
|
+
const SHIM_HEADER_MARKER = '# AUTO-GENERATED by `olam flywheel install-shims`';
|
|
20
|
+
/**
|
|
21
|
+
* Programmatic API for refreshing all shims. Used by:
|
|
22
|
+
* - `olam flywheel install-shims` CLI action (this file).
|
|
23
|
+
* - `olam skills source pull` post-step (B2 hook point).
|
|
24
|
+
*/
|
|
25
|
+
export function refreshShims(opts = {}) {
|
|
26
|
+
const targetDir = opts.targetDir ?? join(homedir(), '.claude', 'scripts');
|
|
27
|
+
const results = [];
|
|
28
|
+
let written = 0;
|
|
29
|
+
let overwritten = 0;
|
|
30
|
+
let unchanged = 0;
|
|
31
|
+
let preserved = 0;
|
|
32
|
+
for (const spec of SHIM_SPECS) {
|
|
33
|
+
const result = installOne(spec, targetDir, opts);
|
|
34
|
+
results.push(result);
|
|
35
|
+
switch (result.action) {
|
|
36
|
+
case 'written':
|
|
37
|
+
written += 1;
|
|
38
|
+
break;
|
|
39
|
+
case 'overwritten':
|
|
40
|
+
overwritten += 1;
|
|
41
|
+
break;
|
|
42
|
+
case 'unchanged':
|
|
43
|
+
unchanged += 1;
|
|
44
|
+
break;
|
|
45
|
+
case 'preserved-existing':
|
|
46
|
+
preserved += 1;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { results, written, overwritten, unchanged, preserved };
|
|
51
|
+
}
|
|
52
|
+
function isOlamGeneratedShim(text) {
|
|
53
|
+
return text.includes(SHIM_HEADER_MARKER);
|
|
54
|
+
}
|
|
55
|
+
function installOne(spec, targetDir, opts) {
|
|
56
|
+
const targetPath = join(targetDir, spec.basename);
|
|
57
|
+
const newContent = generateShim(spec);
|
|
58
|
+
if (!existsSync(targetPath)) {
|
|
59
|
+
if (opts.dryRun !== true) {
|
|
60
|
+
mkdirSync(dirname(targetPath), { recursive: true });
|
|
61
|
+
writeFileSync(targetPath, newContent, { mode: 0o755 });
|
|
62
|
+
}
|
|
63
|
+
return { basename: spec.basename, action: 'written', targetPath };
|
|
64
|
+
}
|
|
65
|
+
const existing = readFileSync(targetPath, 'utf8');
|
|
66
|
+
if (existing === newContent) {
|
|
67
|
+
return { basename: spec.basename, action: 'unchanged', targetPath };
|
|
68
|
+
}
|
|
69
|
+
// Existing file with different content. If it's our generated shim (older
|
|
70
|
+
// version), overwrite freely. Otherwise it's operator/atlas-toolbox content
|
|
71
|
+
// — back up unless --force.
|
|
72
|
+
if (isOlamGeneratedShim(existing)) {
|
|
73
|
+
if (opts.dryRun !== true) {
|
|
74
|
+
writeFileSync(targetPath, newContent, { mode: 0o755 });
|
|
75
|
+
}
|
|
76
|
+
return { basename: spec.basename, action: 'overwritten', targetPath };
|
|
77
|
+
}
|
|
78
|
+
if (opts.force === true) {
|
|
79
|
+
const backupPath = `${targetPath}.shim-backup-${Math.floor(Date.now() / 1000)}`;
|
|
80
|
+
if (opts.dryRun !== true) {
|
|
81
|
+
copyFileSync(targetPath, backupPath);
|
|
82
|
+
writeFileSync(targetPath, newContent, { mode: 0o755 });
|
|
83
|
+
}
|
|
84
|
+
return { basename: spec.basename, action: 'overwritten', targetPath, backupPath };
|
|
85
|
+
}
|
|
86
|
+
// Without --force, preserve existing.
|
|
87
|
+
return { basename: spec.basename, action: 'preserved-existing', targetPath };
|
|
88
|
+
}
|
|
6
89
|
export function registerFlywheelInstallShims(parent) {
|
|
7
90
|
parent
|
|
8
91
|
.command('install-shims')
|
|
9
|
-
.description('
|
|
10
|
-
.
|
|
11
|
-
|
|
12
|
-
|
|
92
|
+
.description('Install backwards-compat bash shims under ~/.claude/scripts/ that delegate to olam flywheel <subcmd>')
|
|
93
|
+
.option('--force', 'overwrite existing non-shim files (backs them up to .shim-backup-<ts>)')
|
|
94
|
+
.option('--dry-run', 'preview which shims would be written without modifying disk')
|
|
95
|
+
.option('--target-dir <path>', 'override target directory (default: ~/.claude/scripts/); for tests')
|
|
96
|
+
.action((opts) => {
|
|
97
|
+
const targetDir = opts.targetDir ?? join(homedir(), '.claude', 'scripts');
|
|
98
|
+
const summary = refreshShims(opts);
|
|
99
|
+
const lines = [];
|
|
100
|
+
const dryRunSuffix = opts.dryRun === true ? ' (dry-run)' : '';
|
|
101
|
+
for (const result of summary.results) {
|
|
102
|
+
switch (result.action) {
|
|
103
|
+
case 'written':
|
|
104
|
+
lines.push(` WRITTEN ${result.targetPath}${dryRunSuffix}`);
|
|
105
|
+
break;
|
|
106
|
+
case 'overwritten':
|
|
107
|
+
lines.push(` OVERWRITTEN ${result.targetPath}${dryRunSuffix}${result.backupPath !== undefined ? ` (backup: ${result.backupPath})` : ''}`);
|
|
108
|
+
break;
|
|
109
|
+
case 'unchanged':
|
|
110
|
+
lines.push(` UNCHANGED ${result.targetPath}`);
|
|
111
|
+
break;
|
|
112
|
+
case 'preserved-existing':
|
|
113
|
+
lines.push(` PRESERVED ${result.targetPath} (existing non-shim file; use --force to overwrite + backup)`);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
process.stdout.write(`olam flywheel install-shims → ${targetDir}\n`);
|
|
118
|
+
for (const line of lines)
|
|
119
|
+
process.stdout.write(line + '\n');
|
|
120
|
+
process.stdout.write(`\nwritten: ${summary.written}, overwritten: ${summary.overwritten}, unchanged: ${summary.unchanged}, preserved: ${summary.preserved}\n`);
|
|
121
|
+
// Preserved files indicate operator action needed; exit 1 to surface.
|
|
122
|
+
if (summary.preserved > 0)
|
|
123
|
+
process.exit(1);
|
|
13
124
|
});
|
|
14
125
|
}
|
|
15
126
|
//# sourceMappingURL=install-shims.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-shims.js","sourceRoot":"","sources":["../../../src/commands/flywheel/install-shims.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"install-shims.js","sourceRoot":"","sources":["../../../src/commands/flywheel/install-shims.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `olam flywheel k10-measure` —
|
|
3
|
-
*
|
|
2
|
+
* `olam flywheel k10-measure` — K10 token-budget measurement CLI.
|
|
3
|
+
*
|
|
4
|
+
* Reads `--upstream <path>` + optional `--overlay <path>`; counts tokens via
|
|
5
|
+
* the len/CHARS_PER_TOKEN heuristic; emits PASS/REJECT verdict matching the
|
|
6
|
+
* Python predecessor's compute_budget contract.
|
|
7
|
+
*
|
|
8
|
+
* Exit codes:
|
|
9
|
+
* 0 = PASS (within budget OR no overlay)
|
|
10
|
+
* 1 = REJECT (over budget)
|
|
11
|
+
* 2 = unexpected error (cannot read upstream file)
|
|
12
|
+
*
|
|
13
|
+
* Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A5
|
|
4
14
|
*/
|
|
5
15
|
import type { Command } from 'commander';
|
|
6
16
|
export declare function registerFlywheelK10Measure(parent: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"k10-measure.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/k10-measure.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"k10-measure.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/k10-measure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAgDhE"}
|
|
@@ -1,14 +1,63 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `olam flywheel k10-measure` —
|
|
3
|
-
*
|
|
2
|
+
* `olam flywheel k10-measure` — K10 token-budget measurement CLI.
|
|
3
|
+
*
|
|
4
|
+
* Reads `--upstream <path>` + optional `--overlay <path>`; counts tokens via
|
|
5
|
+
* the len/CHARS_PER_TOKEN heuristic; emits PASS/REJECT verdict matching the
|
|
6
|
+
* Python predecessor's compute_budget contract.
|
|
7
|
+
*
|
|
8
|
+
* Exit codes:
|
|
9
|
+
* 0 = PASS (within budget OR no overlay)
|
|
10
|
+
* 1 = REJECT (over budget)
|
|
11
|
+
* 2 = unexpected error (cannot read upstream file)
|
|
12
|
+
*
|
|
13
|
+
* Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A5
|
|
4
14
|
*/
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
import { computeBudget, tokensFromText } from '@olam/core/src/lib/k10-budget.js';
|
|
5
17
|
export function registerFlywheelK10Measure(parent) {
|
|
6
18
|
parent
|
|
7
19
|
.command('k10-measure')
|
|
8
|
-
.description('
|
|
9
|
-
.
|
|
10
|
-
|
|
11
|
-
|
|
20
|
+
.description('Measure K10 token budget for upstream + optional overlay; emit PASS/REJECT verdict')
|
|
21
|
+
.requiredOption('--upstream <path>', 'path to upstream file (e.g. persona prompt)')
|
|
22
|
+
.option('--overlay <path>', 'path to overlay file (omit if none — PASS without enforcement)')
|
|
23
|
+
.option('--json', 'emit verdict as JSON instead of human-readable')
|
|
24
|
+
.action((opts) => {
|
|
25
|
+
let upstreamText;
|
|
26
|
+
try {
|
|
27
|
+
upstreamText = readFileSync(opts.upstream, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
process.stderr.write(`[k10-measure-error] cannot read upstream ${opts.upstream}: ${err instanceof Error ? err.message : 'unknown'}\n`);
|
|
31
|
+
process.exit(2);
|
|
32
|
+
}
|
|
33
|
+
const upstreamTokens = tokensFromText(upstreamText);
|
|
34
|
+
let overlayTokens = null;
|
|
35
|
+
if (opts.overlay !== undefined) {
|
|
36
|
+
try {
|
|
37
|
+
const overlayText = readFileSync(opts.overlay, 'utf8');
|
|
38
|
+
overlayTokens = tokensFromText(overlayText);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
process.stderr.write(`[k10-measure-error] cannot read overlay ${opts.overlay}: ${err instanceof Error ? err.message : 'unknown'}\n`);
|
|
42
|
+
process.exit(2);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const result = computeBudget(upstreamTokens, overlayTokens);
|
|
46
|
+
if (opts.json) {
|
|
47
|
+
process.stdout.write(JSON.stringify(result) + '\n');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
process.stdout.write(`${result.verdict}: ${result.message}\n`);
|
|
51
|
+
process.stdout.write(` upstream_tokens: ${result.upstream_tokens}\n`);
|
|
52
|
+
if (result.overlay_tokens !== null) {
|
|
53
|
+
process.stdout.write(` overlay_tokens: ${result.overlay_tokens}\n`);
|
|
54
|
+
}
|
|
55
|
+
if (result.merged !== null) {
|
|
56
|
+
process.stdout.write(` merged: ${result.merged}\n`);
|
|
57
|
+
}
|
|
58
|
+
process.stdout.write(` remaining: ${result.remaining} of ${5500} cap\n`);
|
|
59
|
+
}
|
|
60
|
+
process.exit(result.verdict === 'PASS' ? 0 : 1);
|
|
12
61
|
});
|
|
13
62
|
}
|
|
14
63
|
//# sourceMappingURL=k10-measure.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"k10-measure.js","sourceRoot":"","sources":["../../../src/commands/flywheel/k10-measure.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"k10-measure.js","sourceRoot":"","sources":["../../../src/commands/flywheel/k10-measure.ts"],"names":[],"mappings":"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"}
|