autor3search-typescript 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +210 -0
  3. package/dist/benchproto/types.d.ts +32 -0
  4. package/dist/benchproto/types.js +28 -0
  5. package/dist/benchproto/types.js.map +1 -0
  6. package/dist/benchrun/child.d.ts +1 -0
  7. package/dist/benchrun/child.js +222 -0
  8. package/dist/benchrun/child.js.map +1 -0
  9. package/dist/benchrun/invoke.d.ts +61 -0
  10. package/dist/benchrun/invoke.js +152 -0
  11. package/dist/benchrun/invoke.js.map +1 -0
  12. package/dist/cli/cmd-baseline.d.ts +15 -0
  13. package/dist/cli/cmd-baseline.js +292 -0
  14. package/dist/cli/cmd-baseline.js.map +1 -0
  15. package/dist/cli/cmd-doctor.d.ts +11 -0
  16. package/dist/cli/cmd-doctor.js +26 -0
  17. package/dist/cli/cmd-doctor.js.map +1 -0
  18. package/dist/cli/cmd-eval.d.ts +30 -0
  19. package/dist/cli/cmd-eval.js +173 -0
  20. package/dist/cli/cmd-eval.js.map +1 -0
  21. package/dist/cli/cmd-init.d.ts +16 -0
  22. package/dist/cli/cmd-init.js +343 -0
  23. package/dist/cli/cmd-init.js.map +1 -0
  24. package/dist/cli/cmd-profile.d.ts +11 -0
  25. package/dist/cli/cmd-profile.js +140 -0
  26. package/dist/cli/cmd-profile.js.map +1 -0
  27. package/dist/cli/cmd-report.d.ts +15 -0
  28. package/dist/cli/cmd-report.js +70 -0
  29. package/dist/cli/cmd-report.js.map +1 -0
  30. package/dist/cli/cmd-status.d.ts +11 -0
  31. package/dist/cli/cmd-status.js +143 -0
  32. package/dist/cli/cmd-status.js.map +1 -0
  33. package/dist/cli/cmd-stop.d.ts +15 -0
  34. package/dist/cli/cmd-stop.js +143 -0
  35. package/dist/cli/cmd-stop.js.map +1 -0
  36. package/dist/cli/main.d.ts +31 -0
  37. package/dist/cli/main.js +133 -0
  38. package/dist/cli/main.js.map +1 -0
  39. package/dist/cli/runctx.d.ts +29 -0
  40. package/dist/cli/runctx.js +49 -0
  41. package/dist/cli/runctx.js.map +1 -0
  42. package/dist/cli/speedup.d.ts +14 -0
  43. package/dist/cli/speedup.js +25 -0
  44. package/dist/cli/speedup.js.map +1 -0
  45. package/dist/config/load.d.ts +6 -0
  46. package/dist/config/load.js +172 -0
  47. package/dist/config/load.js.map +1 -0
  48. package/dist/config/schema.d.ts +42 -0
  49. package/dist/config/schema.js +25 -0
  50. package/dist/config/schema.js.map +1 -0
  51. package/dist/discover/benchmarks.d.ts +26 -0
  52. package/dist/discover/benchmarks.js +88 -0
  53. package/dist/discover/benchmarks.js.map +1 -0
  54. package/dist/discover/files.d.ts +23 -0
  55. package/dist/discover/files.js +82 -0
  56. package/dist/discover/files.js.map +1 -0
  57. package/dist/doctor/doctor.d.ts +56 -0
  58. package/dist/doctor/doctor.js +255 -0
  59. package/dist/doctor/doctor.js.map +1 -0
  60. package/dist/freeze/freeze.d.ts +23 -0
  61. package/dist/freeze/freeze.js +107 -0
  62. package/dist/freeze/freeze.js.map +1 -0
  63. package/dist/freeze/manifest.d.ts +6 -0
  64. package/dist/freeze/manifest.js +9 -0
  65. package/dist/freeze/manifest.js.map +1 -0
  66. package/dist/freeze/safepath.d.ts +8 -0
  67. package/dist/freeze/safepath.js +22 -0
  68. package/dist/freeze/safepath.js.map +1 -0
  69. package/dist/gitx/git.d.ts +87 -0
  70. package/dist/gitx/git.js +235 -0
  71. package/dist/gitx/git.js.map +1 -0
  72. package/dist/measure/interleave.d.ts +32 -0
  73. package/dist/measure/interleave.js +42 -0
  74. package/dist/measure/interleave.js.map +1 -0
  75. package/dist/pipeline/eval.d.ts +67 -0
  76. package/dist/pipeline/eval.js +495 -0
  77. package/dist/pipeline/eval.js.map +1 -0
  78. package/dist/pm/detect.d.ts +17 -0
  79. package/dist/pm/detect.js +131 -0
  80. package/dist/pm/detect.js.map +1 -0
  81. package/dist/profile/profile.d.ts +53 -0
  82. package/dist/profile/profile.js +105 -0
  83. package/dist/profile/profile.js.map +1 -0
  84. package/dist/results/results.d.ts +65 -0
  85. package/dist/results/results.js +214 -0
  86. package/dist/results/results.js.map +1 -0
  87. package/dist/runner/exec.d.ts +69 -0
  88. package/dist/runner/exec.js +185 -0
  89. package/dist/runner/exec.js.map +1 -0
  90. package/dist/scope/scope.d.ts +20 -0
  91. package/dist/scope/scope.js +70 -0
  92. package/dist/scope/scope.js.map +1 -0
  93. package/dist/state/baseline.d.ts +35 -0
  94. package/dist/state/baseline.js +38 -0
  95. package/dist/state/baseline.js.map +1 -0
  96. package/dist/state/home.d.ts +9 -0
  97. package/dist/state/home.js +72 -0
  98. package/dist/state/home.js.map +1 -0
  99. package/dist/state/lock.d.ts +11 -0
  100. package/dist/state/lock.js +89 -0
  101. package/dist/state/lock.js.map +1 -0
  102. package/dist/state/runnaming.d.ts +27 -0
  103. package/dist/state/runnaming.js +47 -0
  104. package/dist/state/runnaming.js.map +1 -0
  105. package/dist/state/stop.d.ts +28 -0
  106. package/dist/state/stop.js +59 -0
  107. package/dist/state/stop.js.map +1 -0
  108. package/dist/stats/delta.d.ts +29 -0
  109. package/dist/stats/delta.js +41 -0
  110. package/dist/stats/delta.js.map +1 -0
  111. package/dist/stats/geomean.d.ts +4 -0
  112. package/dist/stats/geomean.js +21 -0
  113. package/dist/stats/geomean.js.map +1 -0
  114. package/dist/stats/mannwhitney.d.ts +27 -0
  115. package/dist/stats/mannwhitney.js +158 -0
  116. package/dist/stats/mannwhitney.js.map +1 -0
  117. package/dist/verdict/verdict.d.ts +46 -0
  118. package/dist/verdict/verdict.js +102 -0
  119. package/dist/verdict/verdict.js.map +1 -0
  120. package/dist/version.d.ts +2 -0
  121. package/dist/version.js +3 -0
  122. package/dist/version.js.map +1 -0
  123. package/package.json +35 -0
  124. package/templates/program.md +131 -0
@@ -0,0 +1,173 @@
1
+ import { appendFileSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { parseArgs } from 'node:util';
3
+ import { runEval } from '../pipeline/eval.js';
4
+ import { killActiveChildren } from '../runner/exec.js';
5
+ import { runDir } from '../state/home.js';
6
+ import { lockPath } from '../state/lock.js';
7
+ import { inferTagFromBranch } from '../state/runnaming.js';
8
+ import { EXIT_CODES } from '../verdict/verdict.js';
9
+ /**
10
+ * SIGTERM's default disposition kills node immediately -- once ANY listener
11
+ * is added, Node stops doing that for us, so this handler must actually
12
+ * terminate the process itself once it's done cleaning up.
13
+ *
14
+ * Both steps below are what `stop -force` (spec section 2 item 4) needs and
15
+ * does not otherwise get for free: `eval.ts` spawns every measurement child
16
+ * `detached: true` (its own process-group leader), so it is not reaped
17
+ * merely by `eval` itself dying; and the eval lock is a file this process
18
+ * would otherwise never release, since `acquireEvalLock`'s `finally` in
19
+ * `runEval` never runs if the process exits out from under it instead.
20
+ */
21
+ /** Exported for testing: see `cmd-eval.sigterm.test.ts`. */
22
+ export function installSigtermHandler(dir) {
23
+ const onSigterm = () => {
24
+ killActiveChildren('SIGTERM');
25
+ try {
26
+ rmSync(lockPath(dir), { force: true });
27
+ }
28
+ catch {
29
+ /* best effort -- exiting either way */
30
+ }
31
+ // 128 + 15 (SIGTERM), the conventional shell exit code for "killed by
32
+ // this signal" -- distinct from every real verdict's exit code (0-3),
33
+ // so a caller can tell "abandoned by -force" from any real outcome.
34
+ process.exit(143);
35
+ };
36
+ process.once('SIGTERM', onSigterm);
37
+ return () => process.off('SIGTERM', onSigterm);
38
+ }
39
+ function fail(message) {
40
+ process.stderr.write(`error: ${message}\n`);
41
+ return 2;
42
+ }
43
+ function messageOf(e) {
44
+ return e instanceof Error ? e.message : String(e);
45
+ }
46
+ function toJson(outcome, exitCode) {
47
+ return {
48
+ status: outcome.verdict.status,
49
+ exit_code: exitCode,
50
+ score: outcome.verdict.score,
51
+ reason: outcome.verdict.reason ?? '',
52
+ corrected_alpha: outcome.verdict.correctedAlpha,
53
+ warnings: outcome.warnings,
54
+ stop_requested: outcome.stopRequested,
55
+ benchmarks: outcome.deltas.map((d) => ({
56
+ name: d.name,
57
+ base_ns: d.baseNs,
58
+ cand_ns: d.candNs,
59
+ pct_change: d.pctChange,
60
+ p: d.p,
61
+ significant: d.significant,
62
+ })),
63
+ measure_commit: outcome.measureCommit,
64
+ frozen_commit: outcome.frozenCommit,
65
+ experiment: outcome.experiment,
66
+ failed_gate: outcome.failedGate ?? '',
67
+ message: outcome.message,
68
+ };
69
+ }
70
+ function printHuman(outcome, exitCode) {
71
+ for (const w of outcome.warnings)
72
+ process.stdout.write(`WARNING: ${w}\n`);
73
+ const status = outcome.verdict.status.toUpperCase();
74
+ process.stdout.write(`experiment ${outcome.experiment}: ${status} (exit ${exitCode})\n`);
75
+ if (outcome.failedGate)
76
+ process.stdout.write(` failed_gate: ${outcome.failedGate}\n`);
77
+ process.stdout.write(` ${outcome.message}\n`);
78
+ if (outcome.deltas.length > 0) {
79
+ process.stdout.write(' benchmarks:\n');
80
+ for (const d of outcome.deltas) {
81
+ const sig = d.significant ? 'significant' : 'not significant';
82
+ process.stdout.write(` ${d.name}: ${d.baseNs.toFixed(1)}ns -> ${d.candNs.toFixed(1)}ns ` +
83
+ `(${d.pctChange.toFixed(2)}%, p=${d.p.toExponential(2)}, ${sig})\n`);
84
+ }
85
+ }
86
+ process.stdout.write(` measure_commit: ${outcome.measureCommit}\n`);
87
+ process.stdout.write(` frozen_commit: ${outcome.frozenCommit}\n`);
88
+ if (outcome.stopRequested) {
89
+ process.stdout.write(' a stop has been requested: apply this verdict, then stop looping.\n');
90
+ }
91
+ }
92
+ /**
93
+ * `eval`: runs one experiment through the gate chain (`pipeline/eval.ts`)
94
+ * and reports the verdict. The exit code IS the signal an unattended agent
95
+ * loop acts on -- 0 KEEP, 1 DISCARD, 2 FAIL, 3 CRASH -- so every path here
96
+ * that can be reached after a real attempt returns whatever `EXIT_CODES`
97
+ * says for that outcome; only a usage error (bad flags, no resolvable tag)
98
+ * returns 2 without ever having attempted an experiment.
99
+ *
100
+ * Under `--json`, exactly one JSON object is printed to stdout and nothing
101
+ * else: subprocess transcripts go to `run.log`, and every warning is folded
102
+ * into the object's own `warnings` array rather than printed as a separate
103
+ * line. Human output prints those same warnings as `WARNING:` lines above
104
+ * the verdict instead.
105
+ */
106
+ export async function cmdEval(ctx, argv) {
107
+ let tag;
108
+ let json;
109
+ let desc;
110
+ try {
111
+ const normalized = argv.map((a) => (/^-[A-Za-z][A-Za-z-]+$/.test(a) ? `-${a}` : a));
112
+ const { values } = parseArgs({
113
+ args: normalized,
114
+ options: {
115
+ tag: { type: 'string' },
116
+ json: { type: 'boolean', default: false },
117
+ desc: { type: 'string', default: '' },
118
+ },
119
+ strict: true,
120
+ allowPositionals: false,
121
+ });
122
+ tag = values.tag;
123
+ json = values.json === true;
124
+ desc = values.desc ?? '';
125
+ }
126
+ catch (e) {
127
+ return fail(messageOf(e));
128
+ }
129
+ let resolvedTag;
130
+ try {
131
+ resolvedTag = tag ?? (await inferTagFromBranch(ctx.repoRoot));
132
+ }
133
+ catch (e) {
134
+ return fail(messageOf(e));
135
+ }
136
+ // A fresh transcript per invocation -- run.log is this run's own record,
137
+ // not a growing history. Best effort: a logging failure must never take
138
+ // down the experiment it is only observing.
139
+ try {
140
+ writeFileSync(ctx.logPath, '');
141
+ }
142
+ catch {
143
+ /* best effort */
144
+ }
145
+ const log = (chunk) => {
146
+ try {
147
+ appendFileSync(ctx.logPath, chunk);
148
+ }
149
+ catch {
150
+ /* best effort -- see above */
151
+ }
152
+ };
153
+ const removeSigtermHandler = installSigtermHandler(runDir(ctx.repoRoot, resolvedTag));
154
+ let outcome;
155
+ try {
156
+ outcome = await runEval({ ctx, tag: resolvedTag, description: desc, log });
157
+ }
158
+ catch (e) {
159
+ return fail(`eval failed before producing a verdict: ${messageOf(e)}`);
160
+ }
161
+ finally {
162
+ removeSigtermHandler();
163
+ }
164
+ const exitCode = EXIT_CODES[outcome.verdict.status];
165
+ if (json) {
166
+ process.stdout.write(`${JSON.stringify(toJson(outcome, exitCode))}\n`);
167
+ }
168
+ else {
169
+ printHuman(outcome, exitCode);
170
+ }
171
+ return exitCode;
172
+ }
173
+ //# sourceMappingURL=cmd-eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-eval.js","sourceRoot":"","sources":["../../src/cli/cmd-eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { RunCtx } from './runctx.js';
2
+ /** The `templates/` directory shipped alongside this package. */
3
+ export declare function templatesDir(): string;
4
+ /**
5
+ * `init`: writes `.autor3search/config.yaml`, `program.md` and appends the
6
+ * harness's own output paths to `.gitignore`.
7
+ *
8
+ * Every refusal below happens before anything is written -- a command that
9
+ * exits non-zero after writing half its output would be worse than one
10
+ * that fails cleanly, since a human re-running `init` would then be
11
+ * "fixing" a partially-initialised repository rather than starting clean.
12
+ * `init` never commits: `baseline` is what refuses a dirty tree, and that
13
+ * refusal is what forces a human to review what `init` produced before it
14
+ * becomes part of the run's frozen state.
15
+ */
16
+ export declare function cmdInit(ctx: RunCtx, argv: readonly string[]): Promise<number>;
@@ -0,0 +1,343 @@
1
+ import { access, appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { parseArgs } from 'node:util';
5
+ import { CONFIG_PATH } from '../config/schema.js';
6
+ import { defaultConfig, loadConfig } from '../config/load.js';
7
+ import { classify, walkRepo } from '../discover/files.js';
8
+ import { discoverBenchmarks } from '../discover/benchmarks.js';
9
+ import { currentBranch } from '../gitx/git.js';
10
+ import { detect } from '../pm/detect.js';
11
+ /**
12
+ * `.autor3search/*` plus a `!.autor3search/config.yaml` negation, NOT a
13
+ * blanket `.autor3search/` -- everything else under that directory (there is
14
+ * nothing else there today, but nothing prevents a future addition) stays
15
+ * gitignored, while `config.yaml` itself must be committed: it is the run
16
+ * configuration a KEEP has to stay reproducible and auditable against later
17
+ * (spec section 13), and only its HASH, not merely its presence on disk, is
18
+ * what the gate chain trusts (see `pipeline/eval.ts` gate 2). The negation
19
+ * line must stay listed after the pattern it un-ignores -- git applies
20
+ * `.gitignore` rules in file order.
21
+ */
22
+ const GITIGNORE_ENTRIES = [
23
+ '.autor3search/*',
24
+ '!.autor3search/config.yaml',
25
+ 'results.tsv',
26
+ 'run.log',
27
+ '*.cpuprofile',
28
+ ];
29
+ /** The `templates/` directory shipped alongside this package. */
30
+ export function templatesDir() {
31
+ const here = path.dirname(fileURLToPath(import.meta.url));
32
+ return path.resolve(here, '../../templates');
33
+ }
34
+ async function exists(p) {
35
+ try {
36
+ await access(p);
37
+ return true;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ /**
44
+ * The command that runs `tsc` through each package manager's own "run a
45
+ * locally-installed binary" mechanism. `npx tsc` alone would silently
46
+ * offer to fetch `typescript` from the registry on a repo that doesn't
47
+ * have it installed yet, which is a materially different (networked,
48
+ * slow, and non-reproducible) behaviour from every other gate.
49
+ */
50
+ function typecheckRunner(pm) {
51
+ switch (pm) {
52
+ case 'npm':
53
+ return 'npx';
54
+ case 'pnpm':
55
+ return 'pnpm exec';
56
+ case 'yarn':
57
+ return 'yarn exec';
58
+ case 'bun':
59
+ return 'bunx';
60
+ }
61
+ }
62
+ /**
63
+ * `['src/**']` when a `src/` directory exists (the overwhelmingly common
64
+ * case); otherwise the top-level directories that contain at least one
65
+ * file `classify` calls ordinary source -- so a repository laid out as
66
+ * `lib/`, `pkg/`, etc. still gets a scope that actually covers its code,
67
+ * rather than the `src/**` default that would match nothing in it.
68
+ */
69
+ async function deriveScope(root) {
70
+ if (await exists(path.join(root, 'src')))
71
+ return ['src/**'];
72
+ const files = await walkRepo(root);
73
+ const topDirs = new Set();
74
+ const topLevelSourceFiles = new Set();
75
+ for (const f of files) {
76
+ if (classify(f) !== 'source')
77
+ continue;
78
+ const slash = f.indexOf('/');
79
+ if (slash === -1) {
80
+ topLevelSourceFiles.add(f);
81
+ }
82
+ else {
83
+ topDirs.add(f.slice(0, slash));
84
+ }
85
+ }
86
+ if (topDirs.size > 0) {
87
+ return [...topDirs].sort().map((d) => `${d}/**`);
88
+ }
89
+ // No subdirectory holds source at all -- fall back to naming the
90
+ // top-level source files themselves, so scope is never empty (which
91
+ // `loadConfig` refuses outright) for a repository that keeps its code
92
+ // directly at the root.
93
+ return [...topLevelSourceFiles].sort();
94
+ }
95
+ async function readPackageScripts(root) {
96
+ const text = await readFile(path.join(root, 'package.json'), 'utf8');
97
+ const pkg = JSON.parse(text);
98
+ return pkg.scripts ?? {};
99
+ }
100
+ function yamlString(s) {
101
+ return JSON.stringify(s);
102
+ }
103
+ function yamlStringArray(a) {
104
+ return `[${a.map(yamlString).join(', ')}]`;
105
+ }
106
+ /**
107
+ * Renders the generated config as YAML, one comment explaining each key
108
+ * above the key itself. Hand-rolled rather than a generic YAML
109
+ * stringifier: `yaml`'s writer has no notion of a per-key doc comment, and
110
+ * the whole point of this file is that a human reads it before committing.
111
+ */
112
+ function renderConfigYaml(cfg) {
113
+ const fields = [
114
+ {
115
+ key: 'benchmarks',
116
+ comment: [
117
+ 'Benchmark ids ("<file>:<function>") to measure.',
118
+ 'Empty means "everything discoverBenchmarks finds" -- the default, so a new',
119
+ 'benchmark file is picked up automatically without editing this file.',
120
+ ],
121
+ value: yamlStringArray(cfg.benchmarks),
122
+ },
123
+ {
124
+ key: 'scope',
125
+ comment: [
126
+ 'Glob patterns of files the agent may modify. package.json, tsconfig.json',
127
+ 'and any lockfile are always off-limits, regardless of scope.',
128
+ ],
129
+ value: yamlStringArray(cfg.scope),
130
+ },
131
+ {
132
+ key: 'count',
133
+ comment: [
134
+ 'Measured rounds per side (baseline vs. candidate). Below 4 no result can',
135
+ 'ever reach significance, whatever the effect size.',
136
+ ],
137
+ value: String(cfg.count),
138
+ },
139
+ { key: 'benchtime', comment: ['Measured window per benchmark per round.'], value: yamlString(cfg.benchtime) },
140
+ {
141
+ key: 'warmup',
142
+ comment: ['Discarded warmup window before each measurement.'],
143
+ value: yamlString(cfg.warmup),
144
+ },
145
+ {
146
+ key: 'max_regress_pct',
147
+ comment: [
148
+ 'Largest tolerated regression on any one benchmark, percent. A significant',
149
+ 'regression past this discards the experiment regardless of overall gain.',
150
+ ],
151
+ value: String(cfg.maxRegressPct),
152
+ },
153
+ {
154
+ key: 'min_effect_pct',
155
+ comment: [
156
+ 'Smallest geomean improvement, percent, that a KEEP will accept -- guards',
157
+ 'against keeping a change that is "significant" only because of sample size.',
158
+ ],
159
+ value: String(cfg.minEffectPct),
160
+ },
161
+ {
162
+ key: 'timeout',
163
+ comment: ['Upper bound on each subprocess phase (build, test, typecheck, one measurement round).'],
164
+ value: yamlString(cfg.timeout),
165
+ },
166
+ {
167
+ key: 'typecheck_command',
168
+ comment: [
169
+ 'Typecheck gate, run before every measurement. Empty disables the gate --',
170
+ 'see the warning init printed if this repository has no tsconfig.json.',
171
+ ],
172
+ value: yamlString(cfg.typecheckCommand),
173
+ },
174
+ {
175
+ key: 'build_command',
176
+ comment: ['Optional build gate, run before tests. Empty means skip.'],
177
+ value: yamlString(cfg.buildCommand),
178
+ },
179
+ {
180
+ key: 'test_command',
181
+ comment: [
182
+ "Correctness gate: the repository's own test command. An experiment that",
183
+ 'breaks this FAILs before anything is measured.',
184
+ ],
185
+ value: yamlString(cfg.testCommand),
186
+ },
187
+ {
188
+ key: 'node_args',
189
+ comment: ['Extra flags passed to the measurement child process, e.g. ["--expose-gc"].'],
190
+ value: yamlStringArray(cfg.nodeArgs),
191
+ },
192
+ {
193
+ key: 'unfreeze',
194
+ comment: [
195
+ 'Test/bench files deliberately exempted from the freeze -- edit these at your',
196
+ 'own risk, since they define what "correct" and "measured" mean.',
197
+ ],
198
+ value: yamlStringArray(cfg.unfreeze),
199
+ },
200
+ ];
201
+ return (fields
202
+ .map((f) => `${f.comment.map((c) => `# ${c}`).join('\n')}\n${f.key}: ${f.value}\n`)
203
+ .join('\n'));
204
+ }
205
+ function renderProgramMd(template, benchmarkIds, runTag) {
206
+ const list = benchmarkIds.map((id) => `- \`${id}\``).join('\n');
207
+ return template.replace('{{BENCHMARKS}}', list).replace(/\{\{RUN_TAG\}\}/g, runTag);
208
+ }
209
+ async function ensureGitignore(root) {
210
+ const gitignorePath = path.join(root, '.gitignore');
211
+ let text = '';
212
+ try {
213
+ text = await readFile(gitignorePath, 'utf8');
214
+ }
215
+ catch (e) {
216
+ if (e.code !== 'ENOENT')
217
+ throw e;
218
+ }
219
+ const existingLines = new Set(text.split('\n').map((l) => l.trim()));
220
+ const missing = GITIGNORE_ENTRIES.filter((e) => !existingLines.has(e));
221
+ if (missing.length === 0)
222
+ return;
223
+ const prefix = text.length > 0 && !text.endsWith('\n') ? '\n' : '';
224
+ await appendFile(gitignorePath, `${prefix}${missing.join('\n')}\n`, 'utf8');
225
+ }
226
+ function fail(message) {
227
+ process.stderr.write(`error: ${message}\n`);
228
+ return 2;
229
+ }
230
+ /**
231
+ * `init`: writes `.autor3search/config.yaml`, `program.md` and appends the
232
+ * harness's own output paths to `.gitignore`.
233
+ *
234
+ * Every refusal below happens before anything is written -- a command that
235
+ * exits non-zero after writing half its output would be worse than one
236
+ * that fails cleanly, since a human re-running `init` would then be
237
+ * "fixing" a partially-initialised repository rather than starting clean.
238
+ * `init` never commits: `baseline` is what refuses a dirty tree, and that
239
+ * refusal is what forces a human to review what `init` produced before it
240
+ * becomes part of the run's frozen state.
241
+ */
242
+ export async function cmdInit(ctx, argv) {
243
+ let force;
244
+ try {
245
+ const normalized = argv.map((a) => (/^-[A-Za-z][A-Za-z-]+$/.test(a) ? `-${a}` : a));
246
+ const { values } = parseArgs({
247
+ args: normalized,
248
+ options: { force: { type: 'boolean', default: false } },
249
+ strict: true,
250
+ allowPositionals: false,
251
+ });
252
+ force = values.force === true;
253
+ }
254
+ catch (e) {
255
+ return fail(e.message);
256
+ }
257
+ try {
258
+ // 1. detect the package manager -- surfaces workspace/lockfile refusals
259
+ // before anything else runs, let alone is written.
260
+ const detected = await detect(ctx.repoRoot);
261
+ // 2. discover benchmarks. Nothing is written past this point unless at
262
+ // least one exists: a tool whose whole purpose is measuring benchmarks
263
+ // has nothing to do, and no config or program.md to hand an agent, if
264
+ // there are none.
265
+ const benchmarks = await discoverBenchmarks(ctx.repoRoot);
266
+ if (benchmarks.length === 0) {
267
+ return fail('no benchmarks found: looked for exported `bench*` functions in `*.bench.ts` files ' +
268
+ 'and found none. Without at least one benchmark this tool has nothing to measure ' +
269
+ 'and nothing to optimize -- add a benchmark (e.g. src/foo.bench.ts exporting ' +
270
+ '`benchFoo()`) and run init again.');
271
+ }
272
+ // 3. refuse to clobber an existing config without -force.
273
+ if ((await exists(ctx.configPath)) && !force) {
274
+ return fail(`${CONFIG_PATH} already exists; pass -force to overwrite it`);
275
+ }
276
+ // 4. derive scope.
277
+ const scope = await deriveScope(ctx.repoRoot);
278
+ // 5. derive commands from package.json scripts, using the DETECTED
279
+ // package manager -- never hardcoding npm, which resolves differently
280
+ // (or not at all) against a pnpm or yarn lockfile.
281
+ const scripts = await readPackageScripts(ctx.repoRoot);
282
+ if (!scripts.test) {
283
+ return fail('package.json has no "test" script: the correctness gate has nothing to run before ' +
284
+ 'a change is measured. Add a "test" script and run init again.');
285
+ }
286
+ // `run` is load-bearing, not decoration: `bun test` is a reserved Bun
287
+ // subcommand that invokes Bun's own built-in test runner rather than
288
+ // falling through to the package.json "test" script the way `npm test`,
289
+ // `pnpm test` and `yarn test` all do. `<pm> run test` invokes the actual
290
+ // package script uniformly on all four managers, so it is used
291
+ // everywhere rather than special-casing bun (Ruling 33).
292
+ const testCommand = `${detected.pm} run test`;
293
+ const buildCommand = scripts.build ? `${detected.pm} run build` : '';
294
+ const hasTsconfig = await exists(path.join(ctx.repoRoot, 'tsconfig.json'));
295
+ const typecheckCommand = hasTsconfig ? `${typecheckRunner(detected.pm)} tsc --noEmit` : '';
296
+ if (!hasTsconfig) {
297
+ process.stderr.write('warning: no tsconfig.json found; the typecheck gate is disabled for this run\n');
298
+ }
299
+ const cfg = { ...defaultConfig(), scope, testCommand, buildCommand, typecheckCommand };
300
+ // 6. write .autor3search/config.yaml.
301
+ await mkdir(path.dirname(ctx.configPath), { recursive: true });
302
+ await writeFile(ctx.configPath, renderConfigYaml(cfg), 'utf8');
303
+ // Round-trip guard, immediately after writing: a config init itself
304
+ // cannot load back is a bug that would otherwise only surface at the
305
+ // user's first eval. Checked here, before program.md or .gitignore are
306
+ // touched, so "every refusal happens before anything [else] is written"
307
+ // stays true even on this defensive path.
308
+ await loadConfig(ctx.configPath);
309
+ // 7. copy templates/program.md, substituting the benchmark list and tag.
310
+ const template = await readFile(path.join(templatesDir(), 'program.md'), 'utf8');
311
+ let runTag = 'this-branch';
312
+ try {
313
+ runTag = await currentBranch(ctx.repoRoot);
314
+ }
315
+ catch {
316
+ // Detached HEAD or some other reason `git rev-parse --abbrev-ref HEAD`
317
+ // fails -- the placeholder text above is still a readable fallback.
318
+ }
319
+ const programMd = renderProgramMd(template, benchmarks.map((b) => b.id), runTag);
320
+ await writeFile(path.join(ctx.repoRoot, 'program.md'), programMd, 'utf8');
321
+ // 8. append gitignore entries.
322
+ await ensureGitignore(ctx.repoRoot);
323
+ // 9. report what happened and what to do next.
324
+ process.stdout.write('discovered benchmarks:\n');
325
+ for (const b of benchmarks)
326
+ process.stdout.write(` - ${b.id}\n`);
327
+ process.stdout.write('\nwrote .autor3search/config.yaml and program.md. Review both, then:\n' +
328
+ // .autor3search/config.yaml is the one file under .autor3search/
329
+ // meant to be committed -- it is the run configuration a KEEP must
330
+ // stay reproducible and auditable against later (spec section 13).
331
+ // Everything else the harness writes (baselines, locks, stop
332
+ // requests) lives outside the repository entirely; nothing else
333
+ // under .autor3search/ exists to commit.
334
+ ' 1. git add .autor3search/config.yaml program.md .gitignore && git commit\n' +
335
+ ' 2. autor3search-typescript baseline\n' +
336
+ ' 3. hand this repository and program.md to your coding agent\n');
337
+ return 0;
338
+ }
339
+ catch (e) {
340
+ return fail(e.message);
341
+ }
342
+ }
343
+ //# sourceMappingURL=cmd-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-init.js","sourceRoot":"","sources":["../../src/cli/cmd-init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjF,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAe,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAuB,MAAM,iBAAiB,CAAA;AAG7D;;;;;;;;;;GAUG;AACH,MAAM,iBAAiB,GAAG;IACxB,iBAAiB;IACjB,4BAA4B;IAC5B,aAAa;IACb,SAAS;IACT,cAAc;CACf,CAAA;AAED,iEAAiE;AACjE,MAAM,UAAU,YAAY;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;AAC9C,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,CAAC,CAAA;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,EAAkB;IACzC,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,KAAK;YACR,OAAO,KAAK,CAAA;QACd,KAAK,MAAM;YACT,OAAO,WAAW,CAAA;QACpB,KAAK,MAAM;YACT,OAAO,WAAW,CAAA;QACpB,KAAK,KAAK;YACR,OAAO,MAAM,CAAA;IACjB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE3D,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IACjC,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ;YAAE,SAAQ;QACtC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAClD,CAAC;IACD,iEAAiE;IACjE,oEAAoE;IACpE,sEAAsE;IACtE,wBAAwB;IACxB,OAAO,CAAC,GAAG,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAA;AACxC,CAAC;AAOD,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAA;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAyC,CAAA;IACpE,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,CAAA;AAC1B,CAAC;AASD,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,CAAoB;IAC3C,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,MAAM,GAAkB;QAC5B;YACE,GAAG,EAAE,YAAY;YACjB,OAAO,EAAE;gBACP,iDAAiD;gBACjD,4EAA4E;gBAC5E,sEAAsE;aACvE;YACD,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;SACvC;QACD;YACE,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE;gBACP,0EAA0E;gBAC1E,8DAA8D;aAC/D;YACD,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;SAClC;QACD;YACE,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE;gBACP,0EAA0E;gBAC1E,oDAAoD;aACrD;YACD,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;SACzB;QACD,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,0CAA0C,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QAC7G;YACE,GAAG,EAAE,QAAQ;YACb,OAAO,EAAE,CAAC,kDAAkD,CAAC;YAC7D,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;SAC9B;QACD;YACE,GAAG,EAAE,iBAAiB;YACtB,OAAO,EAAE;gBACP,2EAA2E;gBAC3E,0EAA0E;aAC3E;YACD,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;SACjC;QACD;YACE,GAAG,EAAE,gBAAgB;YACrB,OAAO,EAAE;gBACP,0EAA0E;gBAC1E,6EAA6E;aAC9E;YACD,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;SAChC;QACD;YACE,GAAG,EAAE,SAAS;YACd,OAAO,EAAE,CAAC,uFAAuF,CAAC;YAClG,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;SAC/B;QACD;YACE,GAAG,EAAE,mBAAmB;YACxB,OAAO,EAAE;gBACP,0EAA0E;gBAC1E,uEAAuE;aACxE;YACD,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC;SACxC;QACD;YACE,GAAG,EAAE,eAAe;YACpB,OAAO,EAAE,CAAC,0DAA0D,CAAC;YACrE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC;SACpC;QACD;YACE,GAAG,EAAE,cAAc;YACnB,OAAO,EAAE;gBACP,yEAAyE;gBACzE,gDAAgD;aACjD;YACD,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC;SACnC;QACD;YACE,GAAG,EAAE,WAAW;YAChB,OAAO,EAAE,CAAC,4EAA4E,CAAC;YACvF,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;SACrC;QACD;YACE,GAAG,EAAE,UAAU;YACf,OAAO,EAAE;gBACP,8EAA8E;gBAC9E,iEAAiE;aAClE;YACD,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;SACrC;KACF,CAAA;IAED,OAAO,CACL,MAAM;SACH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC;SAClF,IAAI,CAAC,IAAI,CAAC,CACd,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,YAA+B,EAAE,MAAc;IACxF,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;AACrF,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IACnD,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,CAAA;IAC7D,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACpE,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IAClE,MAAM,UAAU,CAAC,aAAa,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,IAAI,CAAC,OAAe;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAA;IAC3C,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAuB;IAChE,IAAI,KAAc,CAAA;IAClB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACnF,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;YAC3B,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACvD,MAAM,EAAE,IAAI;YACZ,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAA;QACF,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,IAAI,CAAA;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,IAAI,CAAE,CAAW,CAAC,OAAO,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,CAAC;QACH,wEAAwE;QACxE,mDAAmD;QACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE3C,uEAAuE;QACvE,uEAAuE;QACvE,sEAAsE;QACtE,kBAAkB;QAClB,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACzD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CACT,oFAAoF;gBAClF,kFAAkF;gBAClF,8EAA8E;gBAC9E,mCAAmC,CACtC,CAAA;QACH,CAAC;QAED,0DAA0D;QAC1D,IAAI,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC,GAAG,WAAW,8CAA8C,CAAC,CAAA;QAC3E,CAAC;QAED,mBAAmB;QACnB,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE7C,mEAAmE;QACnE,sEAAsE;QACtE,mDAAmD;QACnD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACtD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CACT,oFAAoF;gBAClF,+DAA+D,CAClE,CAAA;QACH,CAAC;QACD,sEAAsE;QACtE,qEAAqE;QACrE,wEAAwE;QACxE,yEAAyE;QACzE,+DAA+D;QAC/D,yDAAyD;QACzD,MAAM,WAAW,GAAG,GAAG,QAAQ,CAAC,EAAE,WAAW,CAAA;QAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAA;QACpE,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAA;QAC1E,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1F,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gFAAgF,CACjF,CAAA;QACH,CAAC;QAED,MAAM,GAAG,GAAW,EAAE,GAAG,aAAa,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAA;QAE9F,sCAAsC;QACtC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9D,MAAM,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;QAE9D,oEAAoE;QACpE,qEAAqE;QACrE,uEAAuE;QACvE,wEAAwE;QACxE,0CAA0C;QAC1C,MAAM,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAEhC,yEAAyE;QACzE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAA;QAChF,IAAI,MAAM,GAAG,aAAa,CAAA;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,oEAAoE;QACtE,CAAC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;QAChF,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAEzE,+BAA+B;QAC/B,MAAM,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAEnC,+CAA+C;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAChD,KAAK,MAAM,CAAC,IAAI,UAAU;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wEAAwE;YACtE,iEAAiE;YACjE,mEAAmE;YACnE,mEAAmE;YACnE,6DAA6D;YAC7D,gEAAgE;YAChE,yCAAyC;YACzC,8EAA8E;YAC9E,yCAAyC;YACzC,iEAAiE,CACpE,CAAA;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,IAAI,CAAE,CAAW,CAAC,OAAO,CAAC,CAAA;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { RunCtx } from './runctx.js';
2
+ /**
3
+ * `profile`: runs the declared benchmarks under Node's built-in `--cpu-prof`
4
+ * sampling profiler and prints where time actually goes.
5
+ *
6
+ * Deliberately does not touch `baseline` or the state home at all: this is
7
+ * reconnaissance a human runs BEFORE starting the loop, to decide whether
8
+ * the benchmarks even point at the right code, so it must work with only
9
+ * `.autor3search/config.yaml` in place.
10
+ */
11
+ export declare function cmdProfile(ctx: RunCtx, argv: readonly string[]): Promise<number>;