@percepta/kaizen 0.9.1 → 0.10.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.
- package/dist/dashboard/pages/api/langfuse-action.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-dataset-item.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-dataset-mutation.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-dataset.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-datasets.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-trace-memberships.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-trace.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-traces.js.map +1 -1
- package/dist/dashboard/pages/api/linear-ideas.js.map +1 -1
- package/dist/dashboard/pages/api/run-events.js.map +1 -1
- package/dist/dashboard/pages/api/run-failures.js.map +1 -1
- package/dist/dashboard/pages/api/run-traces.js.map +1 -1
- package/dist/dashboard/pages/api/runs.js.map +1 -1
- package/dist/dashboard/pages/api/systems.js +1 -1
- package/dist/dashboard/pages/api/systems.js.map +1 -1
- package/dist/dashboard/pages/api/trace-renderer-version.js +10 -3
- package/dist/dashboard/pages/api/trace-renderer-version.js.map +1 -1
- package/dist/dashboard/pages/api/trace-renderer.js +12 -26
- package/dist/dashboard/pages/api/trace-renderer.js.map +1 -1
- package/dist/dashboard/src/lib/bundle-custom-renderer.js +167 -0
- package/dist/dashboard/src/lib/bundle-custom-renderer.js.map +1 -0
- package/dist/dashboard/src/lib/custom-renderer-files.js.map +1 -1
- package/dist/dashboard/src/lib/custom-renderer-metadata.js.map +1 -1
- package/dist/dashboard/src/lib/custom-view-paths.js.map +1 -1
- package/dist/dashboard/src/lib/dataset-item-labeling.js.map +1 -1
- package/dist/dashboard/src/lib/env.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-cache.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-creds.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-demo.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-errors.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-helpers.js.map +1 -1
- package/dist/dashboard/src/lib/run-api.js.map +1 -1
- package/dist/dashboard/src/lib/run-store.js.map +1 -1
- package/dist/dashboard/src/lib/types.js.map +1 -1
- package/dist/dashboard/src/lib/workspace-env.js.map +1 -1
- package/dist/dashboard/src/lib/workspace.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/langfuse.d.ts.map +1 -1
- package/dist/langfuse.js.map +1 -1
- package/dist/package.js +2 -2
- package/dist/shared/env-file.js.map +1 -1
- package/dist/shared/linear-ideas.js.map +1 -1
- package/dist/shared/linear-issue.js.map +1 -1
- package/dist/shared/view-types.d.ts.map +1 -1
- package/dist/shared/workspace-paths.js.map +1 -1
- package/dist/src/commands/create-view.js.map +1 -1
- package/dist/src/commands/guide.js.map +1 -1
- package/dist/src/commands/ideas.js.map +1 -1
- package/dist/src/commands/init-system.js.map +1 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/log.js.map +1 -1
- package/dist/src/commands/rebuild.js.map +1 -1
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/studio.js.map +1 -1
- package/dist/src/lib/bootstrap.js.map +1 -1
- package/dist/src/lib/cli.js.map +1 -1
- package/dist/src/lib/events.js +2 -0
- package/dist/src/lib/events.js.map +1 -1
- package/dist/src/lib/fs-utils.js.map +1 -1
- package/dist/src/lib/leaderboard.js.map +1 -1
- package/dist/src/lib/parse-args.js.map +1 -1
- package/dist/src/lib/paths.js.map +1 -1
- package/dist/src/lib/promotion.js.map +1 -1
- package/dist/src/lib/prompt.js.map +1 -1
- package/dist/src/lib/run-dir.js.map +1 -1
- package/dist/src/lib/runner.js.map +1 -1
- package/dist/src/lib/system.js.map +1 -1
- package/dist/studio/client/assets/index-ElL5OoiH.js +9 -0
- package/dist/studio/client/index.html +1 -1
- package/dist/studio/server.d.ts.map +1 -1
- package/dist/studio/server.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/studio/client/assets/index-D5r9lQ7l.js +0 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-types.d.ts","names":["
|
|
1
|
+
{"version":3,"file":"view-types.d.ts","names":["id","name","tags","timestamp","metadata","input","output","key","trace","TraceData","context","TraceRendererContext","actions","TraceRendererActions","datasetItem","DatasetItemData","DatasetItemRendererActions","expectedOutput","Record","systemId","surface","datasetName","runId","createScore","traceId","value","comment","Promise","updateDatasetItem","itemId","sourceTraceId","status","createDatasetRunItem","datasetItemId","runName","runDescription"],"sources":["../../shared/view-types.d.ts"],"mappings":";;UACiB,SAAA;EACfA,EAAAA;EACAC,IAAAA;EACAC,IAAAA;EACAC,SAAAA;EACAC,QAAAA;EACAC,KAAAA;EACAC,MAAAA;EAAAA,CACCC,GAAAA;AAAAA;;UAIc,kBAAA;EACfC,KAAAA,EAAO,SAAA;EACPE,OAAAA,EAAS,oBAAA;EACTE,OAAAA,EAAS,oBAAA;AAAA;AAAA,UAGM,wBAAA;EACfE,WAAAA,EAAa,eAAA;EACbN,KAAAA,GAAQ,SAAA;EACRE,OAAAA,EAAS,oBAAA;EACTE,OAAAA,EAAS,0BAAA;AAAA;AAAA,UAGM,eAAA;EACfZ,EAAAA;EACAK,KAAAA;EACAY,cAAAA;EACAb,QAAAA,GAAW,MAAM;EAAA,CAChBG,GAAAA;AAAAA;AAAAA,UAGc,oBAAA;EACfY,QAAAA;EACAC,OAAAA;EACAC,WAAAA;EACAC,KAAAA;AAAAA;AAAAA,UAGe,oBAAA;EACfC,WAAAA,CAAYlB,KAAAA;IACVmB,OAAAA;IACAvB,IAAAA;IACAwB,KAAAA;IACAC,OAAAA;IACAtB,QAAAA,GAAW,MAAA;EAAA,IACT,OAAO;AAAA;AAAA,UAGI,0BAAA,SAAmC,oBAAA;EAClDwB,iBAAAA,CAAkBvB,KAAAA;IAChBgB,WAAAA;IACAQ,MAAAA;IACAZ,cAAAA;IACAb,QAAAA,GAAW,MAAA;IACXC,KAAAA;IACAyB,aAAAA;IACAC,MAAAA;EAAAA,IACE,OAAA;EACJC,oBAAAA,CAAqB3B,KAAAA;IACnB4B,aAAAA;IACAT,OAAAA;IACAU,OAAAA;IACAC,cAAAA;IACA/B,QAAAA,GAAW,MAAA;EAAA,IACT,OAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-paths.js","names":[],"sources":["../../shared/workspace-paths.js"],"sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\nexport const KAIZEN_DIR = \"kaizen\";\nexport const KAIZEN_CONFIG = \"config.ts\";\nexport const KAIZEN_STATE_DIR = \".kaizen\";\nexport const KAIZEN_SYSTEMS_DIR = \"systems\";\n\nexport function kaizenDir(workspaceRoot) {\n return join(workspaceRoot, KAIZEN_DIR);\n}\n\nexport function kaizenConfigPath(workspaceRoot) {\n return join(kaizenDir(workspaceRoot), KAIZEN_CONFIG);\n}\n\nexport function kaizenSystemsDir(workspaceRoot) {\n return join(kaizenDir(workspaceRoot), KAIZEN_SYSTEMS_DIR);\n}\n\nexport function kaizenSystemDir(workspaceRoot, systemId) {\n return join(kaizenSystemsDir(workspaceRoot), systemId);\n}\n\nexport function kaizenSystemPath(workspaceRoot, systemId) {\n return join(kaizenSystemDir(workspaceRoot, systemId), \"system.md\");\n}\n\nexport function defaultKaizenStateDir(workspaceRoot) {\n return join(primaryWorktreeRoot(workspaceRoot), KAIZEN_DIR, KAIZEN_STATE_DIR);\n}\n\nexport function resolveKaizenStateDir(workspaceRoot) {\n const raw = process.env.KAIZEN_STATE_DIR;\n return raw\n ? resolve(workspaceRoot, raw)\n : defaultKaizenStateDir(workspaceRoot);\n}\n\nexport function primaryWorktreeRoot(workspaceRoot) {\n const normalizedWorkspace = canonicalPath(workspaceRoot);\n const gitRoot = gitTopLevel(normalizedWorkspace);\n if (!gitRoot || canonicalPath(gitRoot) !== normalizedWorkspace) {\n return normalizedWorkspace;\n }\n\n try {\n const out = execFileSync(\n \"git\",\n [\"-C\", normalizedWorkspace, \"worktree\", \"list\", \"--porcelain\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n const first = out.split(\"\\n\").find((line) => line.startsWith(\"worktree \"));\n return first\n ? canonicalPath(first.slice(\"worktree \".length))\n : normalizedWorkspace;\n } catch {\n return normalizedWorkspace;\n }\n}\n\nfunction gitTopLevel(workspaceRoot) {\n try {\n return execFileSync(\n \"git\",\n [\"-C\", workspaceRoot, \"rev-parse\", \"--show-toplevel\"],\n {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n ).trim();\n } catch {\n return null;\n }\n}\n\nfunction canonicalPath(path) {\n try {\n return realpathSync(path);\n } catch {\n return resolve(path);\n }\n}\n"],"mappings":";;;;AAIA,MAAa,aAAa;AAC1B,MAAa,gBAAgB;AAC7B,MAAa,mBAAmB;AAChC,MAAa,qBAAqB;AAElC,SAAgB,UAAU,eAAe;
|
|
1
|
+
{"version":3,"file":"workspace-paths.js","names":[],"sources":["../../shared/workspace-paths.js"],"sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\nexport const KAIZEN_DIR = \"kaizen\";\nexport const KAIZEN_CONFIG = \"config.ts\";\nexport const KAIZEN_STATE_DIR = \".kaizen\";\nexport const KAIZEN_SYSTEMS_DIR = \"systems\";\n\nexport function kaizenDir(workspaceRoot) {\n return join(workspaceRoot, KAIZEN_DIR);\n}\n\nexport function kaizenConfigPath(workspaceRoot) {\n return join(kaizenDir(workspaceRoot), KAIZEN_CONFIG);\n}\n\nexport function kaizenSystemsDir(workspaceRoot) {\n return join(kaizenDir(workspaceRoot), KAIZEN_SYSTEMS_DIR);\n}\n\nexport function kaizenSystemDir(workspaceRoot, systemId) {\n return join(kaizenSystemsDir(workspaceRoot), systemId);\n}\n\nexport function kaizenSystemPath(workspaceRoot, systemId) {\n return join(kaizenSystemDir(workspaceRoot, systemId), \"system.md\");\n}\n\nexport function defaultKaizenStateDir(workspaceRoot) {\n return join(primaryWorktreeRoot(workspaceRoot), KAIZEN_DIR, KAIZEN_STATE_DIR);\n}\n\nexport function resolveKaizenStateDir(workspaceRoot) {\n const raw = process.env.KAIZEN_STATE_DIR;\n return raw\n ? resolve(workspaceRoot, raw)\n : defaultKaizenStateDir(workspaceRoot);\n}\n\nexport function primaryWorktreeRoot(workspaceRoot) {\n const normalizedWorkspace = canonicalPath(workspaceRoot);\n const gitRoot = gitTopLevel(normalizedWorkspace);\n if (!gitRoot || canonicalPath(gitRoot) !== normalizedWorkspace) {\n return normalizedWorkspace;\n }\n\n try {\n const out = execFileSync(\n \"git\",\n [\"-C\", normalizedWorkspace, \"worktree\", \"list\", \"--porcelain\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n const first = out.split(\"\\n\").find((line) => line.startsWith(\"worktree \"));\n return first\n ? canonicalPath(first.slice(\"worktree \".length))\n : normalizedWorkspace;\n } catch {\n return normalizedWorkspace;\n }\n}\n\nfunction gitTopLevel(workspaceRoot) {\n try {\n return execFileSync(\n \"git\",\n [\"-C\", workspaceRoot, \"rev-parse\", \"--show-toplevel\"],\n {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n ).trim();\n } catch {\n return null;\n }\n}\n\nfunction canonicalPath(path) {\n try {\n return realpathSync(path);\n } catch {\n return resolve(path);\n }\n}\n"],"mappings":";;;;AAIA,MAAa,aAAa;AAC1B,MAAa,gBAAgB;AAC7B,MAAa,mBAAmB;AAChC,MAAa,qBAAqB;AAElC,SAAgB,UAAU,eAAe;CACvC,OAAO,KAAK,eAAe,UAAU;AACvC;AAEA,SAAgB,iBAAiB,eAAe;CAC9C,OAAO,KAAK,UAAU,aAAa,GAAG,aAAa;AACrD;AAEA,SAAgB,iBAAiB,eAAe;CAC9C,OAAO,KAAK,UAAU,aAAa,GAAG,kBAAkB;AAC1D;AAEA,SAAgB,gBAAgB,eAAe,UAAU;CACvD,OAAO,KAAK,iBAAiB,aAAa,GAAG,QAAQ;AACvD;AAEA,SAAgB,iBAAiB,eAAe,UAAU;CACxD,OAAO,KAAK,gBAAgB,eAAe,QAAQ,GAAG,WAAW;AACnE;AAEA,SAAgB,sBAAsB,eAAe;CACnD,OAAO,KAAK,oBAAoB,aAAa,GAAG,YAAY,gBAAgB;AAC9E;AAEA,SAAgB,sBAAsB,eAAe;CACnD,MAAM,MAAM,QAAQ,IAAI;CACxB,OAAO,MACH,QAAQ,eAAe,GAAG,IAC1B,sBAAsB,aAAa;AACzC;AAEA,SAAgB,oBAAoB,eAAe;CACjD,MAAM,sBAAsB,cAAc,aAAa;CACvD,MAAM,UAAU,YAAY,mBAAmB;CAC/C,IAAI,CAAC,WAAW,cAAc,OAAO,MAAM,qBACzC,OAAO;CAGT,IAAI;EAMF,MAAM,QALM,aACV,OACA;GAAC;GAAM;GAAqB;GAAY;GAAQ;EAAa,GAC7D;GAAE,UAAU;GAAS,OAAO;IAAC;IAAU;IAAQ;GAAQ;EAAE,CAE3C,EAAE,MAAM,IAAI,EAAE,MAAM,SAAS,KAAK,WAAW,WAAW,CAAC;EACzE,OAAO,QACH,cAAc,MAAM,MAAM,CAAkB,CAAC,IAC7C;CACN,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,YAAY,eAAe;CAClC,IAAI;EACF,OAAO,aACL,OACA;GAAC;GAAM;GAAe;GAAa;EAAiB,GACpD;GACE,UAAU;GACV,OAAO;IAAC;IAAU;IAAQ;GAAQ;EACpC,CACF,EAAE,KAAK;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,cAAc,MAAM;CAC3B,IAAI;EACF,OAAO,aAAa,IAAI;CAC1B,QAAQ;EACN,OAAO,QAAQ,IAAI;CACrB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-view.js","names":[],"sources":["../../../src/commands/create-view.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isSystemId, requireKaizenWorkspace } from \"../lib/cli.js\";\nimport { applyVars, ensureDir, writeFileSafely } from \"../lib/fs-utils.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport {\n kaizenSystemDir,\n kaizenSystemPath,\n templatesDir,\n workspaceRoot,\n} from \"../lib/paths.js\";\n\nconst VIEW_TYPES = [\"trace\", \"dataset-item\"] as const;\ntype ViewType = (typeof VIEW_TYPES)[number];\n\nexport async function runCreateView(argv: string[]): Promise<number> {\n const { positional, flags } = parseFlags(argv);\n const root = workspaceRoot();\n const force = boolFlag(flags, \"force\");\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const systemId = strFlag(flags, \"system\") ?? positional[0];\n if (!systemId || !isSystemId(systemId)) {\n process.stderr.write(\n `invalid system name: \"${systemId ?? \"\"}\". use kebab-case (e.g. cost-savings).\\n`,\n );\n return 1;\n }\n\n const systemPath = kaizenSystemPath(root, systemId);\n if (!existsSync(systemPath)) {\n process.stderr.write(\n `system \"${systemId}\" not found at kaizen/systems/${systemId}/system.md.\\n` +\n `run \\`kaizen create system ${systemId}\\` first.\\n`,\n );\n return 1;\n }\n\n const typeFlag = strFlag(flags, \"type\");\n if (!typeFlag) {\n process.stderr.write(\n `kaizen create view: --type <${VIEW_TYPES.join(\"|\")}> is required.\\n`,\n );\n return 1;\n }\n const type = normalizeType(typeFlag);\n if (!type) {\n process.stderr.write(\n `invalid view type. use one of: ${VIEW_TYPES.join(\", \")}.\\n`,\n );\n return 1;\n }\n\n const dir = kaizenSystemDir(root, systemId);\n const viewPath = join(dir, `${type}.tsx`);\n if (existsSync(viewPath) && !force) {\n process.stderr.write(\n `refusing to overwrite ${viewPath}. pass --force to replace.\\n`,\n );\n return 1;\n }\n\n ensureDir(dir);\n const templatePath = join(templatesDir(), \"view\", `${type}.tsx`);\n const template = readFileSync(templatePath, \"utf-8\");\n writeFileSafely(viewPath, applyVars(template, { system_id: systemId }), {\n overwrite: force,\n });\n\n process.stdout.write(`scaffolded ${type} view for \"${systemId}\":\\n`);\n process.stdout.write(` kaizen/systems/${systemId}/${type}.tsx\\n`);\n process.stdout.write(\n [\n \"\",\n \"Kaizen Studio loads this file by convention beside system.md.\",\n \"Refresh the browser or focus the Studio window after edits to reload the view.\",\n \"\",\n ].join(\"\\n\"),\n );\n\n return 0;\n}\n\nfunction normalizeType(value: string): ViewType | null {\n return (VIEW_TYPES as readonly string[]).includes(value)\n ? (value as ViewType)\n : null;\n}\n"],"mappings":";;;;;;;;AAYA,MAAM,aAAa,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"create-view.js","names":[],"sources":["../../../src/commands/create-view.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isSystemId, requireKaizenWorkspace } from \"../lib/cli.js\";\nimport { applyVars, ensureDir, writeFileSafely } from \"../lib/fs-utils.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport {\n kaizenSystemDir,\n kaizenSystemPath,\n templatesDir,\n workspaceRoot,\n} from \"../lib/paths.js\";\n\nconst VIEW_TYPES = [\"trace\", \"dataset-item\"] as const;\ntype ViewType = (typeof VIEW_TYPES)[number];\n\nexport async function runCreateView(argv: string[]): Promise<number> {\n const { positional, flags } = parseFlags(argv);\n const root = workspaceRoot();\n const force = boolFlag(flags, \"force\");\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const systemId = strFlag(flags, \"system\") ?? positional[0];\n if (!systemId || !isSystemId(systemId)) {\n process.stderr.write(\n `invalid system name: \"${systemId ?? \"\"}\". use kebab-case (e.g. cost-savings).\\n`,\n );\n return 1;\n }\n\n const systemPath = kaizenSystemPath(root, systemId);\n if (!existsSync(systemPath)) {\n process.stderr.write(\n `system \"${systemId}\" not found at kaizen/systems/${systemId}/system.md.\\n` +\n `run \\`kaizen create system ${systemId}\\` first.\\n`,\n );\n return 1;\n }\n\n const typeFlag = strFlag(flags, \"type\");\n if (!typeFlag) {\n process.stderr.write(\n `kaizen create view: --type <${VIEW_TYPES.join(\"|\")}> is required.\\n`,\n );\n return 1;\n }\n const type = normalizeType(typeFlag);\n if (!type) {\n process.stderr.write(\n `invalid view type. use one of: ${VIEW_TYPES.join(\", \")}.\\n`,\n );\n return 1;\n }\n\n const dir = kaizenSystemDir(root, systemId);\n const viewPath = join(dir, `${type}.tsx`);\n if (existsSync(viewPath) && !force) {\n process.stderr.write(\n `refusing to overwrite ${viewPath}. pass --force to replace.\\n`,\n );\n return 1;\n }\n\n ensureDir(dir);\n const templatePath = join(templatesDir(), \"view\", `${type}.tsx`);\n const template = readFileSync(templatePath, \"utf-8\");\n writeFileSafely(viewPath, applyVars(template, { system_id: systemId }), {\n overwrite: force,\n });\n\n process.stdout.write(`scaffolded ${type} view for \"${systemId}\":\\n`);\n process.stdout.write(` kaizen/systems/${systemId}/${type}.tsx\\n`);\n process.stdout.write(\n [\n \"\",\n \"Kaizen Studio loads this file by convention beside system.md.\",\n \"Refresh the browser or focus the Studio window after edits to reload the view.\",\n \"\",\n ].join(\"\\n\"),\n );\n\n return 0;\n}\n\nfunction normalizeType(value: string): ViewType | null {\n return (VIEW_TYPES as readonly string[]).includes(value)\n ? (value as ViewType)\n : null;\n}\n"],"mappings":";;;;;;;;AAYA,MAAM,aAAa,CAAC,SAAS,cAAc;AAG3C,eAAsB,cAAc,MAAiC;CACnE,MAAM,EAAE,YAAY,UAAU,WAAW,IAAI;CAC7C,MAAM,OAAO,cAAc;CAC3B,MAAM,QAAQ,SAAS,OAAO,OAAO;CAErC,IAAI,CAAC,uBAAuB,IAAI,GAAG,OAAO;CAE1C,MAAM,WAAW,QAAQ,OAAO,QAAQ,KAAK,WAAW;CACxD,IAAI,CAAC,YAAY,CAAC,WAAW,QAAQ,GAAG;EACtC,QAAQ,OAAO,MACb,yBAAyB,YAAY,GAAG,yCAC1C;EACA,OAAO;CACT;CAGA,IAAI,CAAC,WADc,iBAAiB,MAAM,QACjB,CAAC,GAAG;EAC3B,QAAQ,OAAO,MACb,WAAW,SAAS,gCAAgC,SAAS,0CAC7B,SAAS,YAC3C;EACA,OAAO;CACT;CAEA,MAAM,WAAW,QAAQ,OAAO,MAAM;CACtC,IAAI,CAAC,UAAU;EACb,QAAQ,OAAO,MACb,+BAA+B,WAAW,KAAK,GAAG,EAAE,iBACtD;EACA,OAAO;CACT;CACA,MAAM,OAAO,cAAc,QAAQ;CACnC,IAAI,CAAC,MAAM;EACT,QAAQ,OAAO,MACb,kCAAkC,WAAW,KAAK,IAAI,EAAE,IAC1D;EACA,OAAO;CACT;CAEA,MAAM,MAAM,gBAAgB,MAAM,QAAQ;CAC1C,MAAM,WAAW,KAAK,KAAK,GAAG,KAAK,KAAK;CACxC,IAAI,WAAW,QAAQ,KAAK,CAAC,OAAO;EAClC,QAAQ,OAAO,MACb,yBAAyB,SAAS,6BACpC;EACA,OAAO;CACT;CAEA,UAAU,GAAG;CAGb,gBAAgB,UAAU,UADT,aADI,KAAK,aAAa,GAAG,QAAQ,GAAG,KAAK,KACjB,GAAG,OACD,GAAG,EAAE,WAAW,SAAS,CAAC,GAAG,EACtE,WAAW,MACb,CAAC;CAED,QAAQ,OAAO,MAAM,cAAc,KAAK,aAAa,SAAS,KAAK;CACnE,QAAQ,OAAO,MAAM,oBAAoB,SAAS,GAAG,KAAK,OAAO;CACjE,QAAQ,OAAO,MACb;EACE;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI,CACb;CAEA,OAAO;AACT;AAEA,SAAS,cAAc,OAAgC;CACrD,OAAQ,WAAiC,SAAS,KAAK,IAClD,QACD;AACN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guide.js","names":[],"sources":["../../../src/commands/guide.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { packageRoot } from \"../lib/paths.js\";\n\ninterface GuideTopic {\n file: string;\n description: string;\n}\n\nconst TOPICS: Record<string, GuideTopic> = {\n overview: {\n file: \"overview.md\",\n description: \"canonical agent workflow, commands, files, evals, and views\",\n },\n evals: {\n file: \"evals.md\",\n description: \"eval script invocation, NDJSON events, and baseline runs\",\n },\n views: {\n file: \"views.md\",\n description: \"custom trace and dataset item view paths, props, and actions\",\n },\n \"claude-command\": {\n file: \"claude-command.md\",\n description: \"Claude Code slash-command instructions\",\n },\n \"variant-builder\": {\n file: \"variant-builder.md\",\n description: \"single-variant worktree agent instructions\",\n },\n};\n\nexport function runGuide(argv: string[]): number {\n const [rawTopic] = argv.filter((arg) => !arg.startsWith(\"-\"));\n const topic = rawTopic ?? \"overview\";\n\n if (topic === \"topics\" || topic === \"list\") {\n process.stdout.write(renderTopicList());\n return 0;\n }\n\n if (topic === \"all\") {\n process.stdout.write(\n Object.keys(TOPICS)\n .map((name) => readGuide(name))\n .join(\"\\n\\n---\\n\\n\"),\n );\n process.stdout.write(\"\\n\");\n return 0;\n }\n\n if (!isGuideTopic(topic)) {\n process.stderr.write(\n `unknown guide topic: ${topic}\\n\\n${renderTopicList()}`,\n );\n return 1;\n }\n\n process.stdout.write(readGuide(topic));\n process.stdout.write(\"\\n\");\n return 0;\n}\n\nfunction readGuide(topic: string): string {\n const guide = TOPICS[topic];\n return readFileSync(join(packageRoot(), \"agent\", guide.file), \"utf-8\");\n}\n\nfunction isGuideTopic(topic: string): boolean {\n return Object.prototype.hasOwnProperty.call(TOPICS, topic);\n}\n\nfunction renderTopicList(): string {\n return [\n \"kaizen guide topics:\",\n \"\",\n ...Object.entries(TOPICS).map(\n ([name, guide]) => ` ${name.padEnd(15)} ${guide.description}`,\n ),\n \" all print every guide topic\",\n \"\",\n ].join(\"\\n\");\n}\n"],"mappings":";;;;AASA,MAAM,SAAqC;CACzC,UAAU;EACR,MAAM;EACN,aAAa;
|
|
1
|
+
{"version":3,"file":"guide.js","names":[],"sources":["../../../src/commands/guide.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { packageRoot } from \"../lib/paths.js\";\n\ninterface GuideTopic {\n file: string;\n description: string;\n}\n\nconst TOPICS: Record<string, GuideTopic> = {\n overview: {\n file: \"overview.md\",\n description: \"canonical agent workflow, commands, files, evals, and views\",\n },\n evals: {\n file: \"evals.md\",\n description: \"eval script invocation, NDJSON events, and baseline runs\",\n },\n views: {\n file: \"views.md\",\n description: \"custom trace and dataset item view paths, props, and actions\",\n },\n \"claude-command\": {\n file: \"claude-command.md\",\n description: \"Claude Code slash-command instructions\",\n },\n \"variant-builder\": {\n file: \"variant-builder.md\",\n description: \"single-variant worktree agent instructions\",\n },\n};\n\nexport function runGuide(argv: string[]): number {\n const [rawTopic] = argv.filter((arg) => !arg.startsWith(\"-\"));\n const topic = rawTopic ?? \"overview\";\n\n if (topic === \"topics\" || topic === \"list\") {\n process.stdout.write(renderTopicList());\n return 0;\n }\n\n if (topic === \"all\") {\n process.stdout.write(\n Object.keys(TOPICS)\n .map((name) => readGuide(name))\n .join(\"\\n\\n---\\n\\n\"),\n );\n process.stdout.write(\"\\n\");\n return 0;\n }\n\n if (!isGuideTopic(topic)) {\n process.stderr.write(\n `unknown guide topic: ${topic}\\n\\n${renderTopicList()}`,\n );\n return 1;\n }\n\n process.stdout.write(readGuide(topic));\n process.stdout.write(\"\\n\");\n return 0;\n}\n\nfunction readGuide(topic: string): string {\n const guide = TOPICS[topic];\n return readFileSync(join(packageRoot(), \"agent\", guide.file), \"utf-8\");\n}\n\nfunction isGuideTopic(topic: string): boolean {\n return Object.prototype.hasOwnProperty.call(TOPICS, topic);\n}\n\nfunction renderTopicList(): string {\n return [\n \"kaizen guide topics:\",\n \"\",\n ...Object.entries(TOPICS).map(\n ([name, guide]) => ` ${name.padEnd(15)} ${guide.description}`,\n ),\n \" all print every guide topic\",\n \"\",\n ].join(\"\\n\");\n}\n"],"mappings":";;;;AASA,MAAM,SAAqC;CACzC,UAAU;EACR,MAAM;EACN,aAAa;CACf;CACA,OAAO;EACL,MAAM;EACN,aAAa;CACf;CACA,OAAO;EACL,MAAM;EACN,aAAa;CACf;CACA,kBAAkB;EAChB,MAAM;EACN,aAAa;CACf;CACA,mBAAmB;EACjB,MAAM;EACN,aAAa;CACf;AACF;AAEA,SAAgB,SAAS,MAAwB;CAC/C,MAAM,CAAC,YAAY,KAAK,QAAQ,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC;CAC5D,MAAM,QAAQ,YAAY;CAE1B,IAAI,UAAU,YAAY,UAAU,QAAQ;EAC1C,QAAQ,OAAO,MAAM,gBAAgB,CAAC;EACtC,OAAO;CACT;CAEA,IAAI,UAAU,OAAO;EACnB,QAAQ,OAAO,MACb,OAAO,KAAK,MAAM,EACf,KAAK,SAAS,UAAU,IAAI,CAAC,EAC7B,KAAK,aAAa,CACvB;EACA,QAAQ,OAAO,MAAM,IAAI;EACzB,OAAO;CACT;CAEA,IAAI,CAAC,aAAa,KAAK,GAAG;EACxB,QAAQ,OAAO,MACb,wBAAwB,MAAM,MAAM,gBAAgB,GACtD;EACA,OAAO;CACT;CAEA,QAAQ,OAAO,MAAM,UAAU,KAAK,CAAC;CACrC,QAAQ,OAAO,MAAM,IAAI;CACzB,OAAO;AACT;AAEA,SAAS,UAAU,OAAuB;CACxC,MAAM,QAAQ,OAAO;CACrB,OAAO,aAAa,KAAK,YAAY,GAAG,SAAS,MAAM,IAAI,GAAG,OAAO;AACvE;AAEA,SAAS,aAAa,OAAwB;CAC5C,OAAO,OAAO,UAAU,eAAe,KAAK,QAAQ,KAAK;AAC3D;AAEA,SAAS,kBAA0B;CACjC,OAAO;EACL;EACA;EACA,GAAG,OAAO,QAAQ,MAAM,EAAE,KACvB,CAAC,MAAM,WAAW,KAAK,KAAK,OAAO,EAAE,EAAE,GAAG,MAAM,aACnD;EACA;EACA;CACF,EAAE,KAAK,IAAI;AACb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ideas.js","names":[],"sources":["../../../src/commands/ideas.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { readEnvFile } from \"../../shared/env-file.js\";\nimport {\n buildIssueFilter,\n ISSUE_QUERY,\n KAIZEN_LINEAR_LABEL,\n linearProjectRefFromFields,\n linearHttpMessage,\n parseLinearBody,\n resolveLinearEnv,\n resolveLinearProject,\n type LinearIdea,\n type LinearProject,\n type LinearProjectRef,\n} from \"../../shared/linear-ideas.js\";\nimport { pad } from \"../lib/cli.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { workspaceRoot } from \"../lib/paths.js\";\nimport { loadSystem } from \"../lib/system.js\";\n\nexport async function runIdeas(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const root = workspaceRoot();\n const systemId = strFlag(flags, \"system\");\n const json = boolFlag(flags, \"json\");\n const limit = parseLimit(strFlag(flags, \"limit\") ?? strFlag(flags, \"n\"));\n\n if (!systemId) {\n process.stderr.write(\"kaizen ideas: --system <id> is required\\n\");\n return 1;\n }\n if (limit === null) {\n process.stderr.write(\"kaizen ideas: --limit must be a positive integer\\n\");\n return 1;\n }\n\n const system = loadSystem(root, systemId);\n const projectRef = linearProjectRefFromFields({\n project: stringFrontmatter(system.frontmatter.linear_project),\n projectId: stringFrontmatter(system.frontmatter.linear_project_id),\n projectUrl: stringFrontmatter(system.frontmatter.linear_project_url),\n });\n if (!projectRef) {\n process.stderr.write(\n `kaizen ideas: system \"${systemId}\" is missing linear_project in frontmatter.\\n` +\n \"Add the Linear project URL or project ID to scope ideas for this system.\\n\",\n );\n return 1;\n }\n\n const envPath = join(root, \".env.local\");\n const linearEnv = resolveLinearEnv(readEnvFile(envPath), {});\n const token = linearEnv.apiKey;\n if (!token) {\n process.stderr.write(\n `kaizen ideas: LINEAR_API_KEY is missing. Add it to ${envPath}.\\n`,\n );\n return 1;\n }\n\n const config = {\n system: systemId,\n projectRef,\n team:\n stringFrontmatter(system.frontmatter.linear_team) ?? linearEnv.teamKey,\n label: KAIZEN_LINEAR_LABEL,\n limit,\n };\n\n const { project, ideas } = await fetchLinearIdeas(token, config);\n const outputConfig = {\n ...config,\n project,\n };\n\n if (json) {\n process.stdout.write(\n JSON.stringify({ config: outputConfig, ideas }, null, 2) + \"\\n\",\n );\n return 0;\n }\n\n printIdeas(outputConfig, ideas);\n return 0;\n}\n\nfunction parseLimit(raw: string | undefined): number | null {\n if (!raw) return 50;\n const n = Number(raw);\n return Number.isInteger(n) && n > 0 ? n : null;\n}\n\nasync function fetchLinearIdeas(\n token: string,\n config: {\n projectRef: LinearProjectRef;\n team: string | null;\n label: string;\n limit: number;\n },\n): Promise<{ project: LinearProject; ideas: LinearIdea[] }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 30_000);\n try {\n const project = await resolveLinearProject(\n token,\n config.projectRef,\n controller.signal,\n );\n if (!project) {\n throw new Error(\n `Linear project ${config.projectRef.value} was not found`,\n );\n }\n\n const res = await fetch(\"https://api.linear.app/graphql\", {\n method: \"POST\",\n headers: {\n Authorization: token,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: ISSUE_QUERY,\n variables: {\n first: config.limit,\n filter: buildIssueFilter({\n projectId: project.id,\n teamKey: config.team,\n label: config.label,\n }),\n },\n }),\n signal: controller.signal,\n });\n\n const text = await res.text();\n const body = parseLinearBody(text);\n if (!res.ok || body.errors?.length) {\n throw new Error(linearHttpMessage(res, body.errors));\n }\n return { project, ideas: body.data?.issues?.nodes ?? [] };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction printIdeas(\n config: {\n system: string;\n project: LinearProject;\n team: string | null;\n label: string;\n },\n ideas: LinearIdea[],\n): void {\n process.stdout.write(\n `system: ${config.system} project: ${config.project.name} label: ${config.label}\\n`,\n );\n if (config.team) process.stdout.write(`team: ${config.team}\\n`);\n if (ideas.length === 0) {\n process.stdout.write(\"no ideas found.\\n\");\n return;\n }\n\n process.stdout.write(\"\\n\");\n process.stdout.write(\n pad(\"issue\", 12) +\n pad(\"priority\", 10) +\n pad(\"status\", 18) +\n pad(\"assignee\", 18) +\n pad(\"updated\", 13) +\n \"title\\n\",\n );\n for (const idea of ideas) {\n process.stdout.write(\n pad(idea.identifier, 12) +\n pad(priorityLabel(idea.priority), 10) +\n pad(idea.state?.name ?? \"No status\", 18) +\n pad(idea.assignee?.name ?? \"Unassigned\", 18) +\n pad(formatDate(idea.updatedAt), 13) +\n idea.title +\n \"\\n\",\n );\n }\n process.stdout.write(\n \"\\nUse `kaizen ideas --system \" +\n config.system +\n \" --json` for URLs and full issue details.\\n\",\n );\n}\n\nfunction stringFrontmatter(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction priorityLabel(priority: number): string {\n if (priority === 1) return \"Urgent\";\n if (priority === 2) return \"High\";\n if (priority === 3) return \"Normal\";\n if (priority === 4) return \"Low\";\n return \"None\";\n}\n\nfunction formatDate(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value.slice(0, 10);\n return date.toISOString().slice(0, 10);\n}\n"],"mappings":";;;;;;;;AAoBA,eAAsB,SAAS,MAAiC;CAC9D,MAAM,EAAE,UAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"ideas.js","names":[],"sources":["../../../src/commands/ideas.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { readEnvFile } from \"../../shared/env-file.js\";\nimport {\n buildIssueFilter,\n ISSUE_QUERY,\n KAIZEN_LINEAR_LABEL,\n linearProjectRefFromFields,\n linearHttpMessage,\n parseLinearBody,\n resolveLinearEnv,\n resolveLinearProject,\n type LinearIdea,\n type LinearProject,\n type LinearProjectRef,\n} from \"../../shared/linear-ideas.js\";\nimport { pad } from \"../lib/cli.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { workspaceRoot } from \"../lib/paths.js\";\nimport { loadSystem } from \"../lib/system.js\";\n\nexport async function runIdeas(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const root = workspaceRoot();\n const systemId = strFlag(flags, \"system\");\n const json = boolFlag(flags, \"json\");\n const limit = parseLimit(strFlag(flags, \"limit\") ?? strFlag(flags, \"n\"));\n\n if (!systemId) {\n process.stderr.write(\"kaizen ideas: --system <id> is required\\n\");\n return 1;\n }\n if (limit === null) {\n process.stderr.write(\"kaizen ideas: --limit must be a positive integer\\n\");\n return 1;\n }\n\n const system = loadSystem(root, systemId);\n const projectRef = linearProjectRefFromFields({\n project: stringFrontmatter(system.frontmatter.linear_project),\n projectId: stringFrontmatter(system.frontmatter.linear_project_id),\n projectUrl: stringFrontmatter(system.frontmatter.linear_project_url),\n });\n if (!projectRef) {\n process.stderr.write(\n `kaizen ideas: system \"${systemId}\" is missing linear_project in frontmatter.\\n` +\n \"Add the Linear project URL or project ID to scope ideas for this system.\\n\",\n );\n return 1;\n }\n\n const envPath = join(root, \".env.local\");\n const linearEnv = resolveLinearEnv(readEnvFile(envPath), {});\n const token = linearEnv.apiKey;\n if (!token) {\n process.stderr.write(\n `kaizen ideas: LINEAR_API_KEY is missing. Add it to ${envPath}.\\n`,\n );\n return 1;\n }\n\n const config = {\n system: systemId,\n projectRef,\n team:\n stringFrontmatter(system.frontmatter.linear_team) ?? linearEnv.teamKey,\n label: KAIZEN_LINEAR_LABEL,\n limit,\n };\n\n const { project, ideas } = await fetchLinearIdeas(token, config);\n const outputConfig = {\n ...config,\n project,\n };\n\n if (json) {\n process.stdout.write(\n JSON.stringify({ config: outputConfig, ideas }, null, 2) + \"\\n\",\n );\n return 0;\n }\n\n printIdeas(outputConfig, ideas);\n return 0;\n}\n\nfunction parseLimit(raw: string | undefined): number | null {\n if (!raw) return 50;\n const n = Number(raw);\n return Number.isInteger(n) && n > 0 ? n : null;\n}\n\nasync function fetchLinearIdeas(\n token: string,\n config: {\n projectRef: LinearProjectRef;\n team: string | null;\n label: string;\n limit: number;\n },\n): Promise<{ project: LinearProject; ideas: LinearIdea[] }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 30_000);\n try {\n const project = await resolveLinearProject(\n token,\n config.projectRef,\n controller.signal,\n );\n if (!project) {\n throw new Error(\n `Linear project ${config.projectRef.value} was not found`,\n );\n }\n\n const res = await fetch(\"https://api.linear.app/graphql\", {\n method: \"POST\",\n headers: {\n Authorization: token,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: ISSUE_QUERY,\n variables: {\n first: config.limit,\n filter: buildIssueFilter({\n projectId: project.id,\n teamKey: config.team,\n label: config.label,\n }),\n },\n }),\n signal: controller.signal,\n });\n\n const text = await res.text();\n const body = parseLinearBody(text);\n if (!res.ok || body.errors?.length) {\n throw new Error(linearHttpMessage(res, body.errors));\n }\n return { project, ideas: body.data?.issues?.nodes ?? [] };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction printIdeas(\n config: {\n system: string;\n project: LinearProject;\n team: string | null;\n label: string;\n },\n ideas: LinearIdea[],\n): void {\n process.stdout.write(\n `system: ${config.system} project: ${config.project.name} label: ${config.label}\\n`,\n );\n if (config.team) process.stdout.write(`team: ${config.team}\\n`);\n if (ideas.length === 0) {\n process.stdout.write(\"no ideas found.\\n\");\n return;\n }\n\n process.stdout.write(\"\\n\");\n process.stdout.write(\n pad(\"issue\", 12) +\n pad(\"priority\", 10) +\n pad(\"status\", 18) +\n pad(\"assignee\", 18) +\n pad(\"updated\", 13) +\n \"title\\n\",\n );\n for (const idea of ideas) {\n process.stdout.write(\n pad(idea.identifier, 12) +\n pad(priorityLabel(idea.priority), 10) +\n pad(idea.state?.name ?? \"No status\", 18) +\n pad(idea.assignee?.name ?? \"Unassigned\", 18) +\n pad(formatDate(idea.updatedAt), 13) +\n idea.title +\n \"\\n\",\n );\n }\n process.stdout.write(\n \"\\nUse `kaizen ideas --system \" +\n config.system +\n \" --json` for URLs and full issue details.\\n\",\n );\n}\n\nfunction stringFrontmatter(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction priorityLabel(priority: number): string {\n if (priority === 1) return \"Urgent\";\n if (priority === 2) return \"High\";\n if (priority === 3) return \"Normal\";\n if (priority === 4) return \"Low\";\n return \"None\";\n}\n\nfunction formatDate(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value.slice(0, 10);\n return date.toISOString().slice(0, 10);\n}\n"],"mappings":";;;;;;;;AAoBA,eAAsB,SAAS,MAAiC;CAC9D,MAAM,EAAE,UAAU,WAAW,IAAI;CACjC,MAAM,OAAO,cAAc;CAC3B,MAAM,WAAW,QAAQ,OAAO,QAAQ;CACxC,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,MAAM,QAAQ,WAAW,QAAQ,OAAO,OAAO,KAAK,QAAQ,OAAO,GAAG,CAAC;CAEvE,IAAI,CAAC,UAAU;EACb,QAAQ,OAAO,MAAM,2CAA2C;EAChE,OAAO;CACT;CACA,IAAI,UAAU,MAAM;EAClB,QAAQ,OAAO,MAAM,oDAAoD;EACzE,OAAO;CACT;CAEA,MAAM,SAAS,WAAW,MAAM,QAAQ;CACxC,MAAM,aAAa,2BAA2B;EAC5C,SAAS,kBAAkB,OAAO,YAAY,cAAc;EAC5D,WAAW,kBAAkB,OAAO,YAAY,iBAAiB;EACjE,YAAY,kBAAkB,OAAO,YAAY,kBAAkB;CACrE,CAAC;CACD,IAAI,CAAC,YAAY;EACf,QAAQ,OAAO,MACb,yBAAyB,SAAS;CAEpC;EACA,OAAO;CACT;CAEA,MAAM,UAAU,KAAK,MAAM,YAAY;CACvC,MAAM,YAAY,iBAAiB,YAAY,OAAO,GAAG,CAAC,CAAC;CAC3D,MAAM,QAAQ,UAAU;CACxB,IAAI,CAAC,OAAO;EACV,QAAQ,OAAO,MACb,sDAAsD,QAAQ,IAChE;EACA,OAAO;CACT;CAEA,MAAM,SAAS;EACb,QAAQ;EACR;EACA,MACE,kBAAkB,OAAO,YAAY,WAAW,KAAK,UAAU;EACjE,OAAO;EACP;CACF;CAEA,MAAM,EAAE,SAAS,UAAU,MAAM,iBAAiB,OAAO,MAAM;CAC/D,MAAM,eAAe;EACnB,GAAG;EACH;CACF;CAEA,IAAI,MAAM;EACR,QAAQ,OAAO,MACb,KAAK,UAAU;GAAE,QAAQ;GAAc;EAAM,GAAG,MAAM,CAAC,IAAI,IAC7D;EACA,OAAO;CACT;CAEA,WAAW,cAAc,KAAK;CAC9B,OAAO;AACT;AAEA,SAAS,WAAW,KAAwC;CAC1D,IAAI,CAAC,KAAK,OAAO;CACjB,MAAM,IAAI,OAAO,GAAG;CACpB,OAAO,OAAO,UAAU,CAAC,KAAK,IAAI,IAAI,IAAI;AAC5C;AAEA,eAAe,iBACb,OACA,QAM0D;CAC1D,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,UAAU,iBAAiB,WAAW,MAAM,GAAG,GAAM;CAC3D,IAAI;EACF,MAAM,UAAU,MAAM,qBACpB,OACA,OAAO,YACP,WAAW,MACb;EACA,IAAI,CAAC,SACH,MAAM,IAAI,MACR,kBAAkB,OAAO,WAAW,MAAM,eAC5C;EAGF,MAAM,MAAM,MAAM,MAAM,kCAAkC;GACxD,QAAQ;GACR,SAAS;IACP,eAAe;IACf,gBAAgB;GAClB;GACA,MAAM,KAAK,UAAU;IACnB,OAAO;IACP,WAAW;KACT,OAAO,OAAO;KACd,QAAQ,iBAAiB;MACvB,WAAW,QAAQ;MACnB,SAAS,OAAO;MAChB,OAAO,OAAO;KAChB,CAAC;IACH;GACF,CAAC;GACD,QAAQ,WAAW;EACrB,CAAC;EAGD,MAAM,OAAO,gBAAgB,MADV,IAAI,KAAK,CACK;EACjC,IAAI,CAAC,IAAI,MAAM,KAAK,QAAQ,QAC1B,MAAM,IAAI,MAAM,kBAAkB,KAAK,KAAK,MAAM,CAAC;EAErD,OAAO;GAAE;GAAS,OAAO,KAAK,MAAM,QAAQ,SAAS,CAAC;EAAE;CAC1D,UAAU;EACR,aAAa,OAAO;CACtB;AACF;AAEA,SAAS,WACP,QAMA,OACM;CACN,QAAQ,OAAO,MACb,WAAW,OAAO,OAAO,cAAc,OAAO,QAAQ,KAAK,YAAY,OAAO,MAAM,GACtF;CACA,IAAI,OAAO,MAAM,QAAQ,OAAO,MAAM,SAAS,OAAO,KAAK,GAAG;CAC9D,IAAI,MAAM,WAAW,GAAG;EACtB,QAAQ,OAAO,MAAM,mBAAmB;EACxC;CACF;CAEA,QAAQ,OAAO,MAAM,IAAI;CACzB,QAAQ,OAAO,MACb,IAAI,SAAS,EAAE,IACb,IAAI,YAAY,EAAE,IAClB,IAAI,UAAU,EAAE,IAChB,IAAI,YAAY,EAAE,IAClB,IAAI,WAAW,EAAE,IACjB,SACJ;CACA,KAAK,MAAM,QAAQ,OACjB,QAAQ,OAAO,MACb,IAAI,KAAK,YAAY,EAAE,IACrB,IAAI,cAAc,KAAK,QAAQ,GAAG,EAAE,IACpC,IAAI,KAAK,OAAO,QAAQ,aAAa,EAAE,IACvC,IAAI,KAAK,UAAU,QAAQ,cAAc,EAAE,IAC3C,IAAI,WAAW,KAAK,SAAS,GAAG,EAAE,IAClC,KAAK,QACL,IACJ;CAEF,QAAQ,OAAO,MACb,kCACE,OAAO,SACP,6CACJ;AACF;AAEA,SAAS,kBAAkB,OAA+B;CACxD,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,cAAc,UAA0B;CAC/C,IAAI,aAAa,GAAG,OAAO;CAC3B,IAAI,aAAa,GAAG,OAAO;CAC3B,IAAI,aAAa,GAAG,OAAO;CAC3B,IAAI,aAAa,GAAG,OAAO;CAC3B,OAAO;AACT;AAEA,SAAS,WAAW,OAAuB;CACzC,MAAM,OAAO,IAAI,KAAK,KAAK;CAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG,OAAO,MAAM,MAAM,GAAG,EAAE;CAC1D,OAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AACvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-system.js","names":[],"sources":["../../../src/commands/init-system.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isSystemId, requireKaizenWorkspace } from \"../lib/cli.js\";\nimport { applyVars, ensureDir, writeFileSafely } from \"../lib/fs-utils.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { kaizenSystemDir, templatesDir, workspaceRoot } from \"../lib/paths.js\";\nimport { prompt, promptChoice } from \"../lib/prompt.js\";\n\nconst EVAL_STYLES = [\"ground-truth\", \"llm-as-judge\", \"hybrid\"] as const;\ntype EvalStyle = (typeof EVAL_STYLES)[number];\nconst EVAL_LANGUAGES = [\"python\", \"typescript\"] as const;\ntype EvalLanguage = (typeof EVAL_LANGUAGES)[number];\n\nexport async function runInitSystem(argv: string[]): Promise<number> {\n const { positional, flags } = parseFlags(argv);\n const root = workspaceRoot();\n const force = boolFlag(flags, \"force\");\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const name =\n strFlag(flags, \"name\") ??\n positional[0] ??\n (await prompt(\"system name (kebab-case)\"));\n if (!name || !isSystemId(name)) {\n process.stderr.write(\n `invalid system name: \"${name}\". use kebab-case (e.g. cost-savings).\\n`,\n );\n return 1;\n }\n\n const description =\n strFlag(flags, \"description\") ??\n (await prompt(\"one-line description\", `${name} system`));\n\n const evalStyle = (strFlag(flags, \"eval-style\") ??\n (await promptChoice(\n \"eval style\",\n [...EVAL_STYLES],\n \"ground-truth\",\n ))) as EvalStyle;\n\n const evalLanguage = normalizeEvalLanguage(\n strFlag(flags, \"eval-language\") ?? strFlag(flags, \"language\") ?? \"python\",\n );\n if (!evalLanguage) {\n process.stderr.write(\n `invalid eval language. use one of: ${EVAL_LANGUAGES.join(\", \")}, py, ts.\\n`,\n );\n return 1;\n }\n\n const primaryMetric =\n strFlag(flags, \"metric\") ??\n (await prompt(\n \"primary metric name\",\n evalStyle === \"ground-truth\" ? \"accuracy\" : \"score\",\n ));\n\n const target =\n strFlag(flags, \"target\") ?? (await prompt(\"target score (0-1)\", \"0.90\"));\n\n const vars: Record<string, string> = {\n name,\n description,\n eval_style: evalStyle,\n primary_metric: primaryMetric,\n target,\n eval_ext: evalLanguage === \"typescript\" ? \"ts\" : \"py\",\n eval_file: `eval.${evalLanguage === \"typescript\" ? \"ts\" : \"py\"}`,\n rubric_frontmatter:\n evalStyle === \"ground-truth\"\n ? \"\"\n : `rubric: kaizen/systems/${name}/rubric.md\\n`,\n iso_now: new Date().toISOString(),\n };\n\n const systemDir = kaizenSystemDir(root, name);\n const systemPath = join(systemDir, \"system.md\");\n const evalPath = join(systemDir, vars.eval_file);\n const rubricPath = join(systemDir, \"rubric.md\");\n\n if (!force) {\n for (const p of [\n systemPath,\n evalPath,\n ...(evalStyle !== \"ground-truth\" ? [rubricPath] : []),\n ]) {\n if (existsSync(p)) {\n process.stderr.write(\n `refusing to overwrite ${p}. pass --force to replace.\\n`,\n );\n return 1;\n }\n }\n }\n\n ensureDir(systemDir);\n\n const tpl = templatesDir();\n writeFileSafely(\n systemPath,\n applyVars(readFileSync(join(tpl, \"system\", \"system.md\"), \"utf-8\"), vars),\n { overwrite: force },\n );\n writeFileSafely(\n evalPath,\n applyVars(\n readFileSync(\n join(\n tpl,\n \"system\",\n evalLanguage === \"typescript\" ? \"eval.ts\" : \"eval.py\",\n ),\n \"utf-8\",\n ),\n vars,\n ),\n { overwrite: force },\n );\n\n if (evalStyle !== \"ground-truth\") {\n writeFileSafely(\n rubricPath,\n applyVars(readFileSync(join(tpl, \"system\", \"rubric.md\"), \"utf-8\"), vars),\n { overwrite: force },\n );\n }\n\n process.stdout.write(`scaffolded system \"${name}\":\\n`);\n process.stdout.write(` kaizen/systems/${name}/system.md\\n`);\n process.stdout.write(` kaizen/systems/${name}/${vars.eval_file}\\n`);\n if (evalStyle !== \"ground-truth\")\n process.stdout.write(` kaizen/systems/${name}/rubric.md\\n`);\n process.stdout.write(\n [\n \"\",\n \"the starter eval emits a working NDJSON event stream against 3 dummy items.\",\n \"edit it to load your dataset and produce real scores, then:\",\n \"\",\n ` kaizen run --system ${name} --variant baseline --hypothesis \"starting baseline\"`,\n \"\",\n ].join(\"\\n\"),\n );\n\n return 0;\n}\n\nfunction normalizeEvalLanguage(raw: string): EvalLanguage | null {\n const normalized = raw.toLowerCase();\n if (normalized === \"python\" || normalized === \"py\") return \"python\";\n if (normalized === \"typescript\" || normalized === \"ts\") return \"typescript\";\n return null;\n}\n"],"mappings":";;;;;;;;;AAQA,MAAM,cAAc;CAAC;CAAgB;CAAgB;
|
|
1
|
+
{"version":3,"file":"init-system.js","names":[],"sources":["../../../src/commands/init-system.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isSystemId, requireKaizenWorkspace } from \"../lib/cli.js\";\nimport { applyVars, ensureDir, writeFileSafely } from \"../lib/fs-utils.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { kaizenSystemDir, templatesDir, workspaceRoot } from \"../lib/paths.js\";\nimport { prompt, promptChoice } from \"../lib/prompt.js\";\n\nconst EVAL_STYLES = [\"ground-truth\", \"llm-as-judge\", \"hybrid\"] as const;\ntype EvalStyle = (typeof EVAL_STYLES)[number];\nconst EVAL_LANGUAGES = [\"python\", \"typescript\"] as const;\ntype EvalLanguage = (typeof EVAL_LANGUAGES)[number];\n\nexport async function runInitSystem(argv: string[]): Promise<number> {\n const { positional, flags } = parseFlags(argv);\n const root = workspaceRoot();\n const force = boolFlag(flags, \"force\");\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const name =\n strFlag(flags, \"name\") ??\n positional[0] ??\n (await prompt(\"system name (kebab-case)\"));\n if (!name || !isSystemId(name)) {\n process.stderr.write(\n `invalid system name: \"${name}\". use kebab-case (e.g. cost-savings).\\n`,\n );\n return 1;\n }\n\n const description =\n strFlag(flags, \"description\") ??\n (await prompt(\"one-line description\", `${name} system`));\n\n const evalStyle = (strFlag(flags, \"eval-style\") ??\n (await promptChoice(\n \"eval style\",\n [...EVAL_STYLES],\n \"ground-truth\",\n ))) as EvalStyle;\n\n const evalLanguage = normalizeEvalLanguage(\n strFlag(flags, \"eval-language\") ?? strFlag(flags, \"language\") ?? \"python\",\n );\n if (!evalLanguage) {\n process.stderr.write(\n `invalid eval language. use one of: ${EVAL_LANGUAGES.join(\", \")}, py, ts.\\n`,\n );\n return 1;\n }\n\n const primaryMetric =\n strFlag(flags, \"metric\") ??\n (await prompt(\n \"primary metric name\",\n evalStyle === \"ground-truth\" ? \"accuracy\" : \"score\",\n ));\n\n const target =\n strFlag(flags, \"target\") ?? (await prompt(\"target score (0-1)\", \"0.90\"));\n\n const vars: Record<string, string> = {\n name,\n description,\n eval_style: evalStyle,\n primary_metric: primaryMetric,\n target,\n eval_ext: evalLanguage === \"typescript\" ? \"ts\" : \"py\",\n eval_file: `eval.${evalLanguage === \"typescript\" ? \"ts\" : \"py\"}`,\n rubric_frontmatter:\n evalStyle === \"ground-truth\"\n ? \"\"\n : `rubric: kaizen/systems/${name}/rubric.md\\n`,\n iso_now: new Date().toISOString(),\n };\n\n const systemDir = kaizenSystemDir(root, name);\n const systemPath = join(systemDir, \"system.md\");\n const evalPath = join(systemDir, vars.eval_file);\n const rubricPath = join(systemDir, \"rubric.md\");\n\n if (!force) {\n for (const p of [\n systemPath,\n evalPath,\n ...(evalStyle !== \"ground-truth\" ? [rubricPath] : []),\n ]) {\n if (existsSync(p)) {\n process.stderr.write(\n `refusing to overwrite ${p}. pass --force to replace.\\n`,\n );\n return 1;\n }\n }\n }\n\n ensureDir(systemDir);\n\n const tpl = templatesDir();\n writeFileSafely(\n systemPath,\n applyVars(readFileSync(join(tpl, \"system\", \"system.md\"), \"utf-8\"), vars),\n { overwrite: force },\n );\n writeFileSafely(\n evalPath,\n applyVars(\n readFileSync(\n join(\n tpl,\n \"system\",\n evalLanguage === \"typescript\" ? \"eval.ts\" : \"eval.py\",\n ),\n \"utf-8\",\n ),\n vars,\n ),\n { overwrite: force },\n );\n\n if (evalStyle !== \"ground-truth\") {\n writeFileSafely(\n rubricPath,\n applyVars(readFileSync(join(tpl, \"system\", \"rubric.md\"), \"utf-8\"), vars),\n { overwrite: force },\n );\n }\n\n process.stdout.write(`scaffolded system \"${name}\":\\n`);\n process.stdout.write(` kaizen/systems/${name}/system.md\\n`);\n process.stdout.write(` kaizen/systems/${name}/${vars.eval_file}\\n`);\n if (evalStyle !== \"ground-truth\")\n process.stdout.write(` kaizen/systems/${name}/rubric.md\\n`);\n process.stdout.write(\n [\n \"\",\n \"the starter eval emits a working NDJSON event stream against 3 dummy items.\",\n \"edit it to load your dataset and produce real scores, then:\",\n \"\",\n ` kaizen run --system ${name} --variant baseline --hypothesis \"starting baseline\"`,\n \"\",\n ].join(\"\\n\"),\n );\n\n return 0;\n}\n\nfunction normalizeEvalLanguage(raw: string): EvalLanguage | null {\n const normalized = raw.toLowerCase();\n if (normalized === \"python\" || normalized === \"py\") return \"python\";\n if (normalized === \"typescript\" || normalized === \"ts\") return \"typescript\";\n return null;\n}\n"],"mappings":";;;;;;;;;AAQA,MAAM,cAAc;CAAC;CAAgB;CAAgB;AAAQ;AAE7D,MAAM,iBAAiB,CAAC,UAAU,YAAY;AAG9C,eAAsB,cAAc,MAAiC;CACnE,MAAM,EAAE,YAAY,UAAU,WAAW,IAAI;CAC7C,MAAM,OAAO,cAAc;CAC3B,MAAM,QAAQ,SAAS,OAAO,OAAO;CAErC,IAAI,CAAC,uBAAuB,IAAI,GAAG,OAAO;CAE1C,MAAM,OACJ,QAAQ,OAAO,MAAM,KACrB,WAAW,MACV,MAAM,OAAO,0BAA0B;CAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,GAAG;EAC9B,QAAQ,OAAO,MACb,yBAAyB,KAAK,yCAChC;EACA,OAAO;CACT;CAEA,MAAM,cACJ,QAAQ,OAAO,aAAa,KAC3B,MAAM,OAAO,wBAAwB,GAAG,KAAK,QAAQ;CAExD,MAAM,YAAa,QAAQ,OAAO,YAAY,KAC3C,MAAM,aACL,cACA,CAAC,GAAG,WAAW,GACf,cACF;CAEF,MAAM,eAAe,sBACnB,QAAQ,OAAO,eAAe,KAAK,QAAQ,OAAO,UAAU,KAAK,QACnE;CACA,IAAI,CAAC,cAAc;EACjB,QAAQ,OAAO,MACb,sCAAsC,eAAe,KAAK,IAAI,EAAE,YAClE;EACA,OAAO;CACT;CAYA,MAAM,OAA+B;EACnC;EACA;EACA,YAAY;EACZ,gBAbA,QAAQ,OAAO,QAAQ,KACtB,MAAM,OACL,uBACA,cAAc,iBAAiB,aAAa,OAC9C;EAUA,QAPA,QAAQ,OAAO,QAAQ,KAAM,MAAM,OAAO,sBAAsB,MAAM;EAQtE,UAAU,iBAAiB,eAAe,OAAO;EACjD,WAAW,QAAQ,iBAAiB,eAAe,OAAO;EAC1D,oBACE,cAAc,iBACV,KACA,0BAA0B,KAAK;EACrC,0BAAS,IAAI,KAAK,GAAE,YAAY;CAClC;CAEA,MAAM,YAAY,gBAAgB,MAAM,IAAI;CAC5C,MAAM,aAAa,KAAK,WAAW,WAAW;CAC9C,MAAM,WAAW,KAAK,WAAW,KAAK,SAAS;CAC/C,MAAM,aAAa,KAAK,WAAW,WAAW;CAE9C,IAAI,CAAC;OACE,MAAM,KAAK;GACd;GACA;GACA,GAAI,cAAc,iBAAiB,CAAC,UAAU,IAAI,CAAC;EACrD,GACE,IAAI,WAAW,CAAC,GAAG;GACjB,QAAQ,OAAO,MACb,yBAAyB,EAAE,6BAC7B;GACA,OAAO;EACT;;CAIJ,UAAU,SAAS;CAEnB,MAAM,MAAM,aAAa;CACzB,gBACE,YACA,UAAU,aAAa,KAAK,KAAK,UAAU,WAAW,GAAG,OAAO,GAAG,IAAI,GACvE,EAAE,WAAW,MAAM,CACrB;CACA,gBACE,UACA,UACE,aACE,KACE,KACA,UACA,iBAAiB,eAAe,YAAY,SAC9C,GACA,OACF,GACA,IACF,GACA,EAAE,WAAW,MAAM,CACrB;CAEA,IAAI,cAAc,gBAChB,gBACE,YACA,UAAU,aAAa,KAAK,KAAK,UAAU,WAAW,GAAG,OAAO,GAAG,IAAI,GACvE,EAAE,WAAW,MAAM,CACrB;CAGF,QAAQ,OAAO,MAAM,sBAAsB,KAAK,KAAK;CACrD,QAAQ,OAAO,MAAM,oBAAoB,KAAK,aAAa;CAC3D,QAAQ,OAAO,MAAM,oBAAoB,KAAK,GAAG,KAAK,UAAU,GAAG;CACnE,IAAI,cAAc,gBAChB,QAAQ,OAAO,MAAM,oBAAoB,KAAK,aAAa;CAC7D,QAAQ,OAAO,MACb;EACE;EACA;EACA;EACA;EACA,yBAAyB,KAAK;EAC9B;CACF,EAAE,KAAK,IAAI,CACb;CAEA,OAAO;AACT;AAEA,SAAS,sBAAsB,KAAkC;CAC/D,MAAM,aAAa,IAAI,YAAY;CACnC,IAAI,eAAe,YAAY,eAAe,MAAM,OAAO;CAC3D,IAAI,eAAe,gBAAgB,eAAe,MAAM,OAAO;CAC/D,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","names":[],"sources":["../../../src/commands/init.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n appendIfMissing,\n ensureDir,\n writeFileSafely,\n} from \"../lib/fs-utils.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport {\n kaizenConfigPath,\n kaizenDir,\n kaizenSystemsDir,\n resolveStateDir,\n workspaceRoot,\n} from \"../lib/paths.js\";\nimport { prompt } from \"../lib/prompt.js\";\n\nexport async function runInit(argv: string[]): Promise<number> {\n const { positional, flags } = parseFlags(argv);\n if (positional.length > 0) {\n process.stderr.write(\n `kaizen init does not take positional arguments. Run \\`kaizen create system <name>\\` to add a system.\\n`,\n );\n return 1;\n }\n const force = boolFlag(flags, \"force\");\n const root = workspaceRoot();\n const configPath = kaizenConfigPath(root);\n const stateDir = resolveStateDir(root);\n\n if (existsSync(configPath) && !force) {\n process.stdout.write(\n `kaizen/config.ts already exists at ${configPath}\\n` +\n `re-run with --force to overwrite, or run \\`kaizen create system <name>\\` to add a system.\\n`,\n );\n return 1;\n }\n\n process.stdout.write(\"kaizen init — scaffolding a workspace\\n\\n\");\n\n const customerName =\n strFlag(flags, \"customer-name\") ??\n strFlag(flags, \"customer\") ??\n (await prompt(\"customer display name\", inferCustomerName(root)));\n\n const vars: Record<string, string> = {\n customer_name: customerName,\n };\n\n // 1) kaizen/config.ts\n ensureDir(kaizenDir(root));\n writeFileSafely(configPath, renderConfig(vars), { overwrite: force });\n\n // 2) directory tree\n ensureDir(kaizenSystemsDir(root));\n writeFileSafely(join(kaizenSystemsDir(root), \".gitkeep\"), \"\");\n ensureDir(stateDir);\n\n // 3) kaizen/.kaizen/.gitignore — ignore bulky generated state but keep durable summaries.\n writeFileSafely(\n join(stateDir, \".gitignore\"),\n [\n \"# Kaizen-managed run state. Runs are large and per-machine; commit only the durable summaries.\",\n \"runs/\",\n \"dist/\",\n \"!hypotheses/\",\n \"\",\n ].join(\"\\n\"),\n );\n\n // 4) project .gitignore additions\n appendIfMissing(join(root, \".gitignore\"), \"# Kaizen\");\n appendIfMissing(join(root, \".gitignore\"), \"kaizen/.kaizen/runs/\");\n appendIfMissing(join(root, \".gitignore\"), \"kaizen/.kaizen/dist/\");\n\n process.stdout.write(\"\\nscaffolded:\\n\");\n process.stdout.write(` ${rel(root, configPath)}\\n`);\n process.stdout.write(` kaizen/systems/\\n`);\n process.stdout.write(` ${rel(root, join(stateDir, \".gitignore\"))}\\n`);\n process.stdout.write(\n ` package-owned agent guide available via \\`kaizen guide\\`\\n`,\n );\n\n process.stdout.write(\n [\n \"\",\n \"next:\",\n \" kaizen guide # print agent instructions from the installed package\",\n \" kaizen create system <name> # add your first system\",\n \" kaizen create view <name> --type trace\",\n \" kaizen create view <name> --type dataset-item\",\n \" kaizen studio # open the dashboard\",\n \"\",\n ].join(\"\\n\"),\n );\n\n return 0;\n}\n\nfunction inferCustomerName(root: string): string {\n const name = root.split(\"/\").pop() ?? \"\";\n return name || \"Customer\";\n}\n\nfunction rel(root: string, p: string): string {\n return p.startsWith(root) ? p.slice(root.length + 1) : p;\n}\n\nfunction renderConfig(vars: Record<string, string>): string {\n // JSON.stringify escapes quotes/backslashes/newlines correctly so user input\n // with characters like O'Brien or paths with backslashes don't produce\n // invalid TypeScript.\n return `import type { KaizenConfig } from \"@percepta/kaizen\";\n\nconst config: KaizenConfig = {\n customer: {\n name: ${JSON.stringify(vars.customer_name)},\n },\n};\n\nexport default config;\n`;\n}\n"],"mappings":";;;;;;;;AAiBA,eAAsB,QAAQ,MAAiC;CAC7D,MAAM,EAAE,YAAY,UAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"init.js","names":[],"sources":["../../../src/commands/init.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n appendIfMissing,\n ensureDir,\n writeFileSafely,\n} from \"../lib/fs-utils.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport {\n kaizenConfigPath,\n kaizenDir,\n kaizenSystemsDir,\n resolveStateDir,\n workspaceRoot,\n} from \"../lib/paths.js\";\nimport { prompt } from \"../lib/prompt.js\";\n\nexport async function runInit(argv: string[]): Promise<number> {\n const { positional, flags } = parseFlags(argv);\n if (positional.length > 0) {\n process.stderr.write(\n `kaizen init does not take positional arguments. Run \\`kaizen create system <name>\\` to add a system.\\n`,\n );\n return 1;\n }\n const force = boolFlag(flags, \"force\");\n const root = workspaceRoot();\n const configPath = kaizenConfigPath(root);\n const stateDir = resolveStateDir(root);\n\n if (existsSync(configPath) && !force) {\n process.stdout.write(\n `kaizen/config.ts already exists at ${configPath}\\n` +\n `re-run with --force to overwrite, or run \\`kaizen create system <name>\\` to add a system.\\n`,\n );\n return 1;\n }\n\n process.stdout.write(\"kaizen init — scaffolding a workspace\\n\\n\");\n\n const customerName =\n strFlag(flags, \"customer-name\") ??\n strFlag(flags, \"customer\") ??\n (await prompt(\"customer display name\", inferCustomerName(root)));\n\n const vars: Record<string, string> = {\n customer_name: customerName,\n };\n\n // 1) kaizen/config.ts\n ensureDir(kaizenDir(root));\n writeFileSafely(configPath, renderConfig(vars), { overwrite: force });\n\n // 2) directory tree\n ensureDir(kaizenSystemsDir(root));\n writeFileSafely(join(kaizenSystemsDir(root), \".gitkeep\"), \"\");\n ensureDir(stateDir);\n\n // 3) kaizen/.kaizen/.gitignore — ignore bulky generated state but keep durable summaries.\n writeFileSafely(\n join(stateDir, \".gitignore\"),\n [\n \"# Kaizen-managed run state. Runs are large and per-machine; commit only the durable summaries.\",\n \"runs/\",\n \"dist/\",\n \"!hypotheses/\",\n \"\",\n ].join(\"\\n\"),\n );\n\n // 4) project .gitignore additions\n appendIfMissing(join(root, \".gitignore\"), \"# Kaizen\");\n appendIfMissing(join(root, \".gitignore\"), \"kaizen/.kaizen/runs/\");\n appendIfMissing(join(root, \".gitignore\"), \"kaizen/.kaizen/dist/\");\n\n process.stdout.write(\"\\nscaffolded:\\n\");\n process.stdout.write(` ${rel(root, configPath)}\\n`);\n process.stdout.write(` kaizen/systems/\\n`);\n process.stdout.write(` ${rel(root, join(stateDir, \".gitignore\"))}\\n`);\n process.stdout.write(\n ` package-owned agent guide available via \\`kaizen guide\\`\\n`,\n );\n\n process.stdout.write(\n [\n \"\",\n \"next:\",\n \" kaizen guide # print agent instructions from the installed package\",\n \" kaizen create system <name> # add your first system\",\n \" kaizen create view <name> --type trace\",\n \" kaizen create view <name> --type dataset-item\",\n \" kaizen studio # open the dashboard\",\n \"\",\n ].join(\"\\n\"),\n );\n\n return 0;\n}\n\nfunction inferCustomerName(root: string): string {\n const name = root.split(\"/\").pop() ?? \"\";\n return name || \"Customer\";\n}\n\nfunction rel(root: string, p: string): string {\n return p.startsWith(root) ? p.slice(root.length + 1) : p;\n}\n\nfunction renderConfig(vars: Record<string, string>): string {\n // JSON.stringify escapes quotes/backslashes/newlines correctly so user input\n // with characters like O'Brien or paths with backslashes don't produce\n // invalid TypeScript.\n return `import type { KaizenConfig } from \"@percepta/kaizen\";\n\nconst config: KaizenConfig = {\n customer: {\n name: ${JSON.stringify(vars.customer_name)},\n },\n};\n\nexport default config;\n`;\n}\n"],"mappings":";;;;;;;;AAiBA,eAAsB,QAAQ,MAAiC;CAC7D,MAAM,EAAE,YAAY,UAAU,WAAW,IAAI;CAC7C,IAAI,WAAW,SAAS,GAAG;EACzB,QAAQ,OAAO,MACb,wGACF;EACA,OAAO;CACT;CACA,MAAM,QAAQ,SAAS,OAAO,OAAO;CACrC,MAAM,OAAO,cAAc;CAC3B,MAAM,aAAa,iBAAiB,IAAI;CACxC,MAAM,WAAW,gBAAgB,IAAI;CAErC,IAAI,WAAW,UAAU,KAAK,CAAC,OAAO;EACpC,QAAQ,OAAO,MACb,sCAAsC,WAAW,8FAEnD;EACA,OAAO;CACT;CAEA,QAAQ,OAAO,MAAM,2CAA2C;CAOhE,MAAM,OAA+B,EACnC,eALA,QAAQ,OAAO,eAAe,KAC9B,QAAQ,OAAO,UAAU,KACxB,MAAM,OAAO,yBAAyB,kBAAkB,IAAI,CAAC,EAIhE;CAGA,UAAU,UAAU,IAAI,CAAC;CACzB,gBAAgB,YAAY,aAAa,IAAI,GAAG,EAAE,WAAW,MAAM,CAAC;CAGpE,UAAU,iBAAiB,IAAI,CAAC;CAChC,gBAAgB,KAAK,iBAAiB,IAAI,GAAG,UAAU,GAAG,EAAE;CAC5D,UAAU,QAAQ;CAGlB,gBACE,KAAK,UAAU,YAAY,GAC3B;EACE;EACA;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI,CACb;CAGA,gBAAgB,KAAK,MAAM,YAAY,GAAG,UAAU;CACpD,gBAAgB,KAAK,MAAM,YAAY,GAAG,sBAAsB;CAChE,gBAAgB,KAAK,MAAM,YAAY,GAAG,sBAAsB;CAEhE,QAAQ,OAAO,MAAM,iBAAiB;CACtC,QAAQ,OAAO,MAAM,KAAK,IAAI,MAAM,UAAU,EAAE,GAAG;CACnD,QAAQ,OAAO,MAAM,qBAAqB;CAC1C,QAAQ,OAAO,MAAM,KAAK,IAAI,MAAM,KAAK,UAAU,YAAY,CAAC,EAAE,GAAG;CACrE,QAAQ,OAAO,MACb,8DACF;CAEA,QAAQ,OAAO,MACb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI,CACb;CAEA,OAAO;AACT;AAEA,SAAS,kBAAkB,MAAsB;CAE/C,QADa,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,OACvB;AACjB;AAEA,SAAS,IAAI,MAAc,GAAmB;CAC5C,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,IAAI;AACzD;AAEA,SAAS,aAAa,MAAsC;CAI1D,OAAO;;;;YAIG,KAAK,UAAU,KAAK,aAAa,EAAE;;;;;;AAM/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","names":[],"sources":["../../../src/commands/log.ts"],"sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { pad, requireKaizenWorkspace } from \"../lib/cli.js\";\nimport {\n type RunSummary,\n currentBaseline,\n listRuns,\n} from \"../lib/leaderboard.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { resolveStateDir, workspaceRoot } from \"../lib/paths.js\";\nimport { reapStaleRuns } from \"../lib/runner.js\";\n\nexport async function runLog(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const root = workspaceRoot();\n const stateDir = resolveStateDir(root);\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const single = strFlag(flags, \"system\");\n const n = Number(strFlag(flags, \"n\") ?? \"10\");\n const json = boolFlag(flags, \"json\");\n\n const systems = single ? [single] : discoverSystems(stateDir);\n if (systems.length === 0) {\n process.stdout.write(\"no systems found.\\n\");\n return 0;\n }\n\n if (json) {\n const out = systems.map((s) => buildSystemReport(stateDir, s, n));\n process.stdout.write(JSON.stringify(out, null, 2) + \"\\n\");\n return 0;\n }\n\n for (let i = 0; i < systems.length; i++) {\n if (i > 0) process.stdout.write(\"\\n\");\n printSystem(stateDir, systems[i], n);\n }\n return 0;\n}\n\nfunction discoverSystems(stateDir: string): string[] {\n const runsRoot = join(stateDir, \"runs\");\n if (!existsSync(runsRoot)) return [];\n return readdirSync(runsRoot).filter((d) => {\n try {\n return statSync(join(runsRoot, d)).isDirectory();\n } catch {\n return false;\n }\n });\n}\n\ninterface SystemReport {\n system: string;\n baseline: {\n run_id: string;\n variant: string;\n score: number;\n n: number | null;\n eval_version: number;\n dataset_version: string;\n } | null;\n totals: {\n all: number;\n complete: number;\n crashed: number;\n aborted: number;\n running: number;\n };\n recent: RunSummary[];\n}\n\nfunction buildSystemReport(\n stateDir: string,\n systemId: string,\n n: number,\n): SystemReport {\n reapStaleRuns(stateDir, systemId);\n const runs = listRuns(stateDir, systemId);\n const baseline = pickBaseline(runs);\n const totals = countByStatus(runs);\n const recent = runs.slice(0, n);\n return {\n system: systemId,\n baseline: baseline\n ? {\n run_id: baseline.run_id,\n variant: baseline.variant,\n score: baseline.score!,\n n: baseline.n,\n eval_version: baseline.eval_version,\n dataset_version: baseline.dataset_version,\n }\n : null,\n totals,\n recent,\n };\n}\n\nfunction pickBaseline(runs: RunSummary[]): RunSummary | null {\n // Use the eval/dataset versions of the most recent complete run as the \"current\" anchor.\n const newest = runs.find((r) => r.status === \"complete\");\n if (!newest) return null;\n return currentBaseline(runs, newest.eval_version, newest.dataset_version);\n}\n\nfunction countByStatus(runs: RunSummary[]) {\n const c = {\n all: runs.length,\n complete: 0,\n crashed: 0,\n aborted: 0,\n running: 0,\n };\n for (const r of runs) {\n if (r.status === \"complete\") c.complete++;\n else if (r.status === \"crashed\") c.crashed++;\n else if (r.status === \"aborted\") c.aborted++;\n else if (r.status === \"running\") c.running++;\n }\n return c;\n}\n\nfunction printSystem(stateDir: string, systemId: string, n: number): void {\n const report = buildSystemReport(stateDir, systemId, n);\n const baseHeader = report.baseline\n ? `promoted baseline: ${report.baseline.run_id} ${report.baseline.variant} (score ${report.baseline.score.toFixed(4)}, n=${report.baseline.n ?? \"?\"}, eval_v=${report.baseline.eval_version}, dataset=${report.baseline.dataset_version})`\n : \"promoted baseline: <none>\";\n process.stdout.write(`system: ${systemId} ${baseHeader}\\n`);\n const t = report.totals;\n process.stdout.write(\n `total runs: ${t.all} completed: ${t.complete} crashed: ${t.crashed} aborted: ${t.aborted} running: ${t.running}\\n`,\n );\n if (report.recent.length === 0) {\n process.stdout.write(\"(no runs yet)\\n\");\n return;\n }\n process.stdout.write(\"\\n\");\n process.stdout.write(\n pad(\"#\", 4) +\n pad(\"run_id\", 14) +\n pad(\"variant\", 22) +\n pad(\"score\", 8) +\n pad(\"status\", 11) +\n pad(\"promoted\", 9) +\n pad(\"started_at\", 21) +\n \"hypothesis\\n\",\n );\n for (let i = 0; i < report.recent.length; i++) {\n const r = report.recent[i];\n const idx = report.totals.all - i;\n const score = r.score === null ? \"—\" : r.score.toFixed(3);\n const promoted = r.promoted === null ? \"—\" : r.promoted ? \"yes\" : \"no\";\n process.stdout.write(\n pad(String(idx), 4) +\n pad(r.run_id, 14) +\n pad(r.variant, 22) +\n pad(score, 8) +\n pad(r.status, 11) +\n pad(promoted, 9) +\n pad(r.started_at.replace(\"T\", \" \").slice(0, 19), 21) +\n (r.hypothesis || \"\") +\n \"\\n\",\n );\n }\n}\n"],"mappings":";;;;;;;;AAYA,eAAsB,OAAO,MAAiC;CAC5D,MAAM,EAAE,UAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"log.js","names":[],"sources":["../../../src/commands/log.ts"],"sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { pad, requireKaizenWorkspace } from \"../lib/cli.js\";\nimport {\n type RunSummary,\n currentBaseline,\n listRuns,\n} from \"../lib/leaderboard.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { resolveStateDir, workspaceRoot } from \"../lib/paths.js\";\nimport { reapStaleRuns } from \"../lib/runner.js\";\n\nexport async function runLog(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const root = workspaceRoot();\n const stateDir = resolveStateDir(root);\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const single = strFlag(flags, \"system\");\n const n = Number(strFlag(flags, \"n\") ?? \"10\");\n const json = boolFlag(flags, \"json\");\n\n const systems = single ? [single] : discoverSystems(stateDir);\n if (systems.length === 0) {\n process.stdout.write(\"no systems found.\\n\");\n return 0;\n }\n\n if (json) {\n const out = systems.map((s) => buildSystemReport(stateDir, s, n));\n process.stdout.write(JSON.stringify(out, null, 2) + \"\\n\");\n return 0;\n }\n\n for (let i = 0; i < systems.length; i++) {\n if (i > 0) process.stdout.write(\"\\n\");\n printSystem(stateDir, systems[i], n);\n }\n return 0;\n}\n\nfunction discoverSystems(stateDir: string): string[] {\n const runsRoot = join(stateDir, \"runs\");\n if (!existsSync(runsRoot)) return [];\n return readdirSync(runsRoot).filter((d) => {\n try {\n return statSync(join(runsRoot, d)).isDirectory();\n } catch {\n return false;\n }\n });\n}\n\ninterface SystemReport {\n system: string;\n baseline: {\n run_id: string;\n variant: string;\n score: number;\n n: number | null;\n eval_version: number;\n dataset_version: string;\n } | null;\n totals: {\n all: number;\n complete: number;\n crashed: number;\n aborted: number;\n running: number;\n };\n recent: RunSummary[];\n}\n\nfunction buildSystemReport(\n stateDir: string,\n systemId: string,\n n: number,\n): SystemReport {\n reapStaleRuns(stateDir, systemId);\n const runs = listRuns(stateDir, systemId);\n const baseline = pickBaseline(runs);\n const totals = countByStatus(runs);\n const recent = runs.slice(0, n);\n return {\n system: systemId,\n baseline: baseline\n ? {\n run_id: baseline.run_id,\n variant: baseline.variant,\n score: baseline.score!,\n n: baseline.n,\n eval_version: baseline.eval_version,\n dataset_version: baseline.dataset_version,\n }\n : null,\n totals,\n recent,\n };\n}\n\nfunction pickBaseline(runs: RunSummary[]): RunSummary | null {\n // Use the eval/dataset versions of the most recent complete run as the \"current\" anchor.\n const newest = runs.find((r) => r.status === \"complete\");\n if (!newest) return null;\n return currentBaseline(runs, newest.eval_version, newest.dataset_version);\n}\n\nfunction countByStatus(runs: RunSummary[]) {\n const c = {\n all: runs.length,\n complete: 0,\n crashed: 0,\n aborted: 0,\n running: 0,\n };\n for (const r of runs) {\n if (r.status === \"complete\") c.complete++;\n else if (r.status === \"crashed\") c.crashed++;\n else if (r.status === \"aborted\") c.aborted++;\n else if (r.status === \"running\") c.running++;\n }\n return c;\n}\n\nfunction printSystem(stateDir: string, systemId: string, n: number): void {\n const report = buildSystemReport(stateDir, systemId, n);\n const baseHeader = report.baseline\n ? `promoted baseline: ${report.baseline.run_id} ${report.baseline.variant} (score ${report.baseline.score.toFixed(4)}, n=${report.baseline.n ?? \"?\"}, eval_v=${report.baseline.eval_version}, dataset=${report.baseline.dataset_version})`\n : \"promoted baseline: <none>\";\n process.stdout.write(`system: ${systemId} ${baseHeader}\\n`);\n const t = report.totals;\n process.stdout.write(\n `total runs: ${t.all} completed: ${t.complete} crashed: ${t.crashed} aborted: ${t.aborted} running: ${t.running}\\n`,\n );\n if (report.recent.length === 0) {\n process.stdout.write(\"(no runs yet)\\n\");\n return;\n }\n process.stdout.write(\"\\n\");\n process.stdout.write(\n pad(\"#\", 4) +\n pad(\"run_id\", 14) +\n pad(\"variant\", 22) +\n pad(\"score\", 8) +\n pad(\"status\", 11) +\n pad(\"promoted\", 9) +\n pad(\"started_at\", 21) +\n \"hypothesis\\n\",\n );\n for (let i = 0; i < report.recent.length; i++) {\n const r = report.recent[i];\n const idx = report.totals.all - i;\n const score = r.score === null ? \"—\" : r.score.toFixed(3);\n const promoted = r.promoted === null ? \"—\" : r.promoted ? \"yes\" : \"no\";\n process.stdout.write(\n pad(String(idx), 4) +\n pad(r.run_id, 14) +\n pad(r.variant, 22) +\n pad(score, 8) +\n pad(r.status, 11) +\n pad(promoted, 9) +\n pad(r.started_at.replace(\"T\", \" \").slice(0, 19), 21) +\n (r.hypothesis || \"\") +\n \"\\n\",\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebuild.js","names":[],"sources":["../../../src/commands/rebuild.ts"],"sourcesContent":["import { existsSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { requireKaizenWorkspace } from \"../lib/cli.js\";\nimport { type Event, findTerminal } from \"../lib/events.js\";\nimport type { ManifestFile, StateFile } from \"../lib/leaderboard.js\";\nimport { parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { resolveStateDir, workspaceRoot } from \"../lib/paths.js\";\nimport {\n readJsonIfExists,\n readNdjson,\n writeJsonAtomic,\n} from \"../lib/run-dir.js\";\n\nexport async function runRebuild(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const root = workspaceRoot();\n const stateDir = resolveStateDir(root);\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const single = strFlag(flags, \"system\");\n const runsRoot = join(stateDir, \"runs\");\n if (!existsSync(runsRoot)) {\n process.stdout.write(\"nothing to rebuild (no kaizen/.kaizen/runs/).\\n\");\n return 0;\n }\n\n const systems = single ? [single] : readdirSync(runsRoot);\n let touched = 0;\n let scanned = 0;\n for (const system of systems) {\n const pdir = join(runsRoot, system);\n if (!existsSync(pdir)) continue;\n for (const runId of readdirSync(pdir)) {\n const dir = join(pdir, runId);\n const manifest = readJsonIfExists<ManifestFile>(\n join(dir, \"manifest.json\"),\n );\n if (!manifest) continue;\n scanned++;\n const events = readNdjson<Event>(join(dir, \"events.jsonl\"));\n const newState = deriveState(manifest, events);\n const oldState = readJsonIfExists<StateFile>(join(dir, \"state.json\"));\n if (JSON.stringify(oldState) === JSON.stringify(newState)) continue;\n writeJsonAtomic(join(dir, \"state.json\"), newState);\n touched++;\n }\n }\n process.stdout.write(\n `rebuild: scanned ${scanned} run(s), updated ${touched} state.json file(s).\\n`,\n );\n return 0;\n}\n\nfunction deriveState(\n manifest: ManifestFile,\n events: Event[],\n): StateFile & {\n system: string;\n variant: string;\n eval_version: number;\n dataset_version: string;\n started_at: string;\n updated_at: string;\n} {\n let nTotal: number | null = null;\n let nDone = 0;\n let score: number | null = null;\n let promoted: boolean | null = null;\n let lastTs: number | null = null;\n for (const e of events) {\n if (e.type === \"start\") nTotal = e.n;\n else if (e.type === \"item\") nDone++;\n else if (e.type === \"complete\") score = e.score;\n else if (e.type === \"promotion\")\n promoted = (e as { promoted?: boolean }).promoted ?? null;\n if (typeof e.ts === \"number\") lastTs = e.ts;\n }\n const terminal = findTerminal(events);\n let status: StateFile[\"status\"] = \"running\";\n if (terminal) {\n if (terminal.type === \"complete\") status = \"complete\";\n else if (terminal.type === \"crashed\") status = \"crashed\";\n else if (terminal.type === \"aborted\") status = \"aborted\";\n }\n const endedAt =\n terminal && lastTs ? new Date(lastTs * 1000).toISOString() : null;\n return {\n run_id: manifest.run_id,\n system: manifest.system,\n variant: manifest.variant,\n status,\n score,\n n_total: nTotal,\n n_done: nDone,\n promoted,\n started_at: manifest.started_at,\n updated_at: endedAt ?? new Date().toISOString(),\n ended_at: endedAt,\n eval_version: manifest.eval_version,\n dataset_version: manifest.dataset_version,\n };\n}\n"],"mappings":";;;;;;;;AAaA,eAAsB,WAAW,MAAiC;CAChE,MAAM,EAAE,UAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"rebuild.js","names":[],"sources":["../../../src/commands/rebuild.ts"],"sourcesContent":["import { existsSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { requireKaizenWorkspace } from \"../lib/cli.js\";\nimport { type Event, findTerminal } from \"../lib/events.js\";\nimport type { ManifestFile, StateFile } from \"../lib/leaderboard.js\";\nimport { parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { resolveStateDir, workspaceRoot } from \"../lib/paths.js\";\nimport {\n readJsonIfExists,\n readNdjson,\n writeJsonAtomic,\n} from \"../lib/run-dir.js\";\n\nexport async function runRebuild(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const root = workspaceRoot();\n const stateDir = resolveStateDir(root);\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const single = strFlag(flags, \"system\");\n const runsRoot = join(stateDir, \"runs\");\n if (!existsSync(runsRoot)) {\n process.stdout.write(\"nothing to rebuild (no kaizen/.kaizen/runs/).\\n\");\n return 0;\n }\n\n const systems = single ? [single] : readdirSync(runsRoot);\n let touched = 0;\n let scanned = 0;\n for (const system of systems) {\n const pdir = join(runsRoot, system);\n if (!existsSync(pdir)) continue;\n for (const runId of readdirSync(pdir)) {\n const dir = join(pdir, runId);\n const manifest = readJsonIfExists<ManifestFile>(\n join(dir, \"manifest.json\"),\n );\n if (!manifest) continue;\n scanned++;\n const events = readNdjson<Event>(join(dir, \"events.jsonl\"));\n const newState = deriveState(manifest, events);\n const oldState = readJsonIfExists<StateFile>(join(dir, \"state.json\"));\n if (JSON.stringify(oldState) === JSON.stringify(newState)) continue;\n writeJsonAtomic(join(dir, \"state.json\"), newState);\n touched++;\n }\n }\n process.stdout.write(\n `rebuild: scanned ${scanned} run(s), updated ${touched} state.json file(s).\\n`,\n );\n return 0;\n}\n\nfunction deriveState(\n manifest: ManifestFile,\n events: Event[],\n): StateFile & {\n system: string;\n variant: string;\n eval_version: number;\n dataset_version: string;\n started_at: string;\n updated_at: string;\n} {\n let nTotal: number | null = null;\n let nDone = 0;\n let score: number | null = null;\n let promoted: boolean | null = null;\n let lastTs: number | null = null;\n for (const e of events) {\n if (e.type === \"start\") nTotal = e.n;\n else if (e.type === \"item\") nDone++;\n else if (e.type === \"complete\") score = e.score;\n else if (e.type === \"promotion\")\n promoted = (e as { promoted?: boolean }).promoted ?? null;\n if (typeof e.ts === \"number\") lastTs = e.ts;\n }\n const terminal = findTerminal(events);\n let status: StateFile[\"status\"] = \"running\";\n if (terminal) {\n if (terminal.type === \"complete\") status = \"complete\";\n else if (terminal.type === \"crashed\") status = \"crashed\";\n else if (terminal.type === \"aborted\") status = \"aborted\";\n }\n const endedAt =\n terminal && lastTs ? new Date(lastTs * 1000).toISOString() : null;\n return {\n run_id: manifest.run_id,\n system: manifest.system,\n variant: manifest.variant,\n status,\n score,\n n_total: nTotal,\n n_done: nDone,\n promoted,\n started_at: manifest.started_at,\n updated_at: endedAt ?? new Date().toISOString(),\n ended_at: endedAt,\n eval_version: manifest.eval_version,\n dataset_version: manifest.dataset_version,\n };\n}\n"],"mappings":";;;;;;;;AAaA,eAAsB,WAAW,MAAiC;CAChE,MAAM,EAAE,UAAU,WAAW,IAAI;CACjC,MAAM,OAAO,cAAc;CAC3B,MAAM,WAAW,gBAAgB,IAAI;CAErC,IAAI,CAAC,uBAAuB,IAAI,GAAG,OAAO;CAE1C,MAAM,SAAS,QAAQ,OAAO,QAAQ;CACtC,MAAM,WAAW,KAAK,UAAU,MAAM;CACtC,IAAI,CAAC,WAAW,QAAQ,GAAG;EACzB,QAAQ,OAAO,MAAM,iDAAiD;EACtE,OAAO;CACT;CAEA,MAAM,UAAU,SAAS,CAAC,MAAM,IAAI,YAAY,QAAQ;CACxD,IAAI,UAAU;CACd,IAAI,UAAU;CACd,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,OAAO,KAAK,UAAU,MAAM;EAClC,IAAI,CAAC,WAAW,IAAI,GAAG;EACvB,KAAK,MAAM,SAAS,YAAY,IAAI,GAAG;GACrC,MAAM,MAAM,KAAK,MAAM,KAAK;GAC5B,MAAM,WAAW,iBACf,KAAK,KAAK,eAAe,CAC3B;GACA,IAAI,CAAC,UAAU;GACf;GAEA,MAAM,WAAW,YAAY,UADd,WAAkB,KAAK,KAAK,cAAc,CACb,CAAC;GAC7C,MAAM,WAAW,iBAA4B,KAAK,KAAK,YAAY,CAAC;GACpE,IAAI,KAAK,UAAU,QAAQ,MAAM,KAAK,UAAU,QAAQ,GAAG;GAC3D,gBAAgB,KAAK,KAAK,YAAY,GAAG,QAAQ;GACjD;EACF;CACF;CACA,QAAQ,OAAO,MACb,oBAAoB,QAAQ,mBAAmB,QAAQ,uBACzD;CACA,OAAO;AACT;AAEA,SAAS,YACP,UACA,QAQA;CACA,IAAI,SAAwB;CAC5B,IAAI,QAAQ;CACZ,IAAI,QAAuB;CAC3B,IAAI,WAA2B;CAC/B,IAAI,SAAwB;CAC5B,KAAK,MAAM,KAAK,QAAQ;EACtB,IAAI,EAAE,SAAS,SAAS,SAAS,EAAE;OAC9B,IAAI,EAAE,SAAS,QAAQ;OACvB,IAAI,EAAE,SAAS,YAAY,QAAQ,EAAE;OACrC,IAAI,EAAE,SAAS,aAClB,WAAY,EAA6B,YAAY;EACvD,IAAI,OAAO,EAAE,OAAO,UAAU,SAAS,EAAE;CAC3C;CACA,MAAM,WAAW,aAAa,MAAM;CACpC,IAAI,SAA8B;CAClC,IAAI;MACE,SAAS,SAAS,YAAY,SAAS;OACtC,IAAI,SAAS,SAAS,WAAW,SAAS;OAC1C,IAAI,SAAS,SAAS,WAAW,SAAS;CAAA;CAEjD,MAAM,UACJ,YAAY,0BAAS,IAAI,KAAK,SAAS,GAAI,GAAE,YAAY,IAAI;CAC/D,OAAO;EACL,QAAQ,SAAS;EACjB,QAAQ,SAAS;EACjB,SAAS,SAAS;EAClB;EACA;EACA,SAAS;EACT,QAAQ;EACR;EACA,YAAY,SAAS;EACrB,YAAY,4BAAW,IAAI,KAAK,GAAE,YAAY;EAC9C,UAAU;EACV,cAAc,SAAS;EACvB,iBAAiB,SAAS;CAC5B;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","names":[],"sources":["../../../src/commands/run.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { normalizeLinearIssue } from \"../../shared/linear-issue.js\";\nimport { requireKaizenWorkspace } from \"../lib/cli.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { workspaceRoot } from \"../lib/paths.js\";\nimport { runExperiment } from \"../lib/runner.js\";\n\nexport async function runRun(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const root = workspaceRoot();\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const system = strFlag(flags, \"system\");\n const variant = strFlag(flags, \"variant\");\n if (!system) {\n process.stderr.write(\"kaizen run: --system <id> is required\\n\");\n return 1;\n }\n if (!variant) {\n process.stderr.write(\"kaizen run: --variant <id> is required\\n\");\n return 1;\n }\n\n const parent = strFlag(flags, \"parent\") ?? null;\n const hypothesis = strFlag(flags, \"hypothesis\") ?? \"\";\n const diagnostic = boolFlag(flags, \"diagnostic\");\n const noAutoPromote = boolFlag(flags, \"no-auto-promote\");\n const maxItemsFlag = strFlag(flags, \"max-items\");\n const maxItems = maxItemsFlag ? Number(maxItemsFlag) : null;\n if (maxItems !== null && (!Number.isFinite(maxItems) || maxItems <= 0)) {\n process.stderr.write(\n `kaizen run: --max-items must be a positive integer\\n`,\n );\n return 1;\n }\n const linearIssueInput =\n strFlag(flags, \"idea\") ??\n strFlag(flags, \"linear-issue\") ??\n strFlag(flags, \"linear-ticket\") ??\n null;\n const linearIssue = normalizeLinearIssue(linearIssueInput);\n if (linearIssueInput && !linearIssue) {\n process.stderr.write(\n \"kaizen run: --idea must be a Linear issue id like KZN-123 or a Linear issue URL\\n\",\n );\n return 1;\n }\n\n const result = await runExperiment({\n workspace: root,\n systemId: system,\n variant,\n parent,\n hypothesis,\n diagnostic,\n noAutoPromote,\n maxItems,\n kaizenVersion: getKaizenVersion(),\n linearIssue,\n });\n\n // Single summary line on stdout — the agent reads this.\n const score = result.score === null ? \"null\" : result.score.toFixed(4);\n const promoted = result.promoted === null ? \"null\" : String(result.promoted);\n process.stdout.write(\n `score=${score} run_id=${result.runId} status=${result.status} promoted=${promoted}\\n`,\n );\n return result.exitCode;\n}\n\nfunction getKaizenVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n // src/commands -> package root\n const pkgPath = resolve(here, \"..\", \"..\", \"package.json\");\n return (\n JSON.parse(readFileSync(pkgPath, \"utf-8\")).version ?? \"0.0.0-unknown\"\n );\n } catch {\n return \"0.0.0-unknown\";\n }\n}\n"],"mappings":";;;;;;;;;AASA,eAAsB,OAAO,MAAiC;CAC5D,MAAM,EAAE,UAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"run.js","names":[],"sources":["../../../src/commands/run.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { normalizeLinearIssue } from \"../../shared/linear-issue.js\";\nimport { requireKaizenWorkspace } from \"../lib/cli.js\";\nimport { boolFlag, parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { workspaceRoot } from \"../lib/paths.js\";\nimport { runExperiment } from \"../lib/runner.js\";\n\nexport async function runRun(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const root = workspaceRoot();\n\n if (!requireKaizenWorkspace(root)) return 1;\n\n const system = strFlag(flags, \"system\");\n const variant = strFlag(flags, \"variant\");\n if (!system) {\n process.stderr.write(\"kaizen run: --system <id> is required\\n\");\n return 1;\n }\n if (!variant) {\n process.stderr.write(\"kaizen run: --variant <id> is required\\n\");\n return 1;\n }\n\n const parent = strFlag(flags, \"parent\") ?? null;\n const hypothesis = strFlag(flags, \"hypothesis\") ?? \"\";\n const diagnostic = boolFlag(flags, \"diagnostic\");\n const noAutoPromote = boolFlag(flags, \"no-auto-promote\");\n const maxItemsFlag = strFlag(flags, \"max-items\");\n const maxItems = maxItemsFlag ? Number(maxItemsFlag) : null;\n if (maxItems !== null && (!Number.isFinite(maxItems) || maxItems <= 0)) {\n process.stderr.write(\n `kaizen run: --max-items must be a positive integer\\n`,\n );\n return 1;\n }\n const linearIssueInput =\n strFlag(flags, \"idea\") ??\n strFlag(flags, \"linear-issue\") ??\n strFlag(flags, \"linear-ticket\") ??\n null;\n const linearIssue = normalizeLinearIssue(linearIssueInput);\n if (linearIssueInput && !linearIssue) {\n process.stderr.write(\n \"kaizen run: --idea must be a Linear issue id like KZN-123 or a Linear issue URL\\n\",\n );\n return 1;\n }\n\n const result = await runExperiment({\n workspace: root,\n systemId: system,\n variant,\n parent,\n hypothesis,\n diagnostic,\n noAutoPromote,\n maxItems,\n kaizenVersion: getKaizenVersion(),\n linearIssue,\n });\n\n // Single summary line on stdout — the agent reads this.\n const score = result.score === null ? \"null\" : result.score.toFixed(4);\n const promoted = result.promoted === null ? \"null\" : String(result.promoted);\n process.stdout.write(\n `score=${score} run_id=${result.runId} status=${result.status} promoted=${promoted}\\n`,\n );\n return result.exitCode;\n}\n\nfunction getKaizenVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n // src/commands -> package root\n const pkgPath = resolve(here, \"..\", \"..\", \"package.json\");\n return (\n JSON.parse(readFileSync(pkgPath, \"utf-8\")).version ?? \"0.0.0-unknown\"\n );\n } catch {\n return \"0.0.0-unknown\";\n }\n}\n"],"mappings":";;;;;;;;;AASA,eAAsB,OAAO,MAAiC;CAC5D,MAAM,EAAE,UAAU,WAAW,IAAI;CACjC,MAAM,OAAO,cAAc;CAE3B,IAAI,CAAC,uBAAuB,IAAI,GAAG,OAAO;CAE1C,MAAM,SAAS,QAAQ,OAAO,QAAQ;CACtC,MAAM,UAAU,QAAQ,OAAO,SAAS;CACxC,IAAI,CAAC,QAAQ;EACX,QAAQ,OAAO,MAAM,yCAAyC;EAC9D,OAAO;CACT;CACA,IAAI,CAAC,SAAS;EACZ,QAAQ,OAAO,MAAM,0CAA0C;EAC/D,OAAO;CACT;CAEA,MAAM,SAAS,QAAQ,OAAO,QAAQ,KAAK;CAC3C,MAAM,aAAa,QAAQ,OAAO,YAAY,KAAK;CACnD,MAAM,aAAa,SAAS,OAAO,YAAY;CAC/C,MAAM,gBAAgB,SAAS,OAAO,iBAAiB;CACvD,MAAM,eAAe,QAAQ,OAAO,WAAW;CAC/C,MAAM,WAAW,eAAe,OAAO,YAAY,IAAI;CACvD,IAAI,aAAa,SAAS,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,IAAI;EACtE,QAAQ,OAAO,MACb,sDACF;EACA,OAAO;CACT;CACA,MAAM,mBACJ,QAAQ,OAAO,MAAM,KACrB,QAAQ,OAAO,cAAc,KAC7B,QAAQ,OAAO,eAAe,KAC9B;CACF,MAAM,cAAc,qBAAqB,gBAAgB;CACzD,IAAI,oBAAoB,CAAC,aAAa;EACpC,QAAQ,OAAO,MACb,mFACF;EACA,OAAO;CACT;CAEA,MAAM,SAAS,MAAM,cAAc;EACjC,WAAW;EACX,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,eAAe,iBAAiB;EAChC;CACF,CAAC;CAGD,MAAM,QAAQ,OAAO,UAAU,OAAO,SAAS,OAAO,MAAM,QAAQ,CAAC;CACrE,MAAM,WAAW,OAAO,aAAa,OAAO,SAAS,OAAO,OAAO,QAAQ;CAC3E,QAAQ,OAAO,MACb,SAAS,MAAM,UAAU,OAAO,MAAM,UAAU,OAAO,OAAO,YAAY,SAAS,GACrF;CACA,OAAO,OAAO;AAChB;AAEA,SAAS,mBAA2B;CAClC,IAAI;EAGF,MAAM,UAAU,QAFH,QAAQ,cAAc,OAAO,KAAK,GAAG,CAEvB,GAAG,MAAM,MAAM,cAAc;EACxD,OACE,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC,EAAE,WAAW;CAE1D,QAAQ;EACN,OAAO;CACT;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"studio.js","names":[],"sources":["../../../src/commands/studio.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { packageRoot, resolveStateDir, workspaceRoot } from \"../lib/paths.js\";\n\nexport async function runStudio(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const port = strFlag(flags, \"port\") ?? \"6789\";\n const root = workspaceRoot();\n const stateDir = resolveStateDir(root);\n const serverPath = join(packageRoot(), \"dist\", \"studio\", \"server.js\");\n\n if (!existsSync(serverPath)) {\n process.stderr.write(\n `kaizen studio: bundled Studio server not found at ${serverPath}.\\n` +\n \"Build the package first with `pnpm --filter @percepta/kaizen build`.\\n\",\n );\n return 1;\n }\n\n const env = {\n ...process.env,\n PORT: port,\n KAIZEN_WORKSPACE: root,\n KAIZEN_STATE_DIR: stateDir,\n };\n\n const studio = spawn(process.execPath, [serverPath], {\n cwd: root,\n env,\n stdio: \"inherit\",\n });\n\n const shutdown = () => studio.kill(\"SIGTERM\");\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n return await new Promise<number>((resolve) => {\n studio.on(\"exit\", (code) => resolve(code ?? 0));\n });\n}\n"],"mappings":";;;;;;AAMA,eAAsB,UAAU,MAAiC;CAC/D,MAAM,EAAE,UAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"studio.js","names":[],"sources":["../../../src/commands/studio.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseFlags, strFlag } from \"../lib/parse-args.js\";\nimport { packageRoot, resolveStateDir, workspaceRoot } from \"../lib/paths.js\";\n\nexport async function runStudio(argv: string[]): Promise<number> {\n const { flags } = parseFlags(argv);\n const port = strFlag(flags, \"port\") ?? \"6789\";\n const root = workspaceRoot();\n const stateDir = resolveStateDir(root);\n const serverPath = join(packageRoot(), \"dist\", \"studio\", \"server.js\");\n\n if (!existsSync(serverPath)) {\n process.stderr.write(\n `kaizen studio: bundled Studio server not found at ${serverPath}.\\n` +\n \"Build the package first with `pnpm --filter @percepta/kaizen build`.\\n\",\n );\n return 1;\n }\n\n const env = {\n ...process.env,\n PORT: port,\n KAIZEN_WORKSPACE: root,\n KAIZEN_STATE_DIR: stateDir,\n };\n\n const studio = spawn(process.execPath, [serverPath], {\n cwd: root,\n env,\n stdio: \"inherit\",\n });\n\n const shutdown = () => studio.kill(\"SIGTERM\");\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n return await new Promise<number>((resolve) => {\n studio.on(\"exit\", (code) => resolve(code ?? 0));\n });\n}\n"],"mappings":";;;;;;AAMA,eAAsB,UAAU,MAAiC;CAC/D,MAAM,EAAE,UAAU,WAAW,IAAI;CACjC,MAAM,OAAO,QAAQ,OAAO,MAAM,KAAK;CACvC,MAAM,OAAO,cAAc;CAC3B,MAAM,WAAW,gBAAgB,IAAI;CACrC,MAAM,aAAa,KAAK,YAAY,GAAG,QAAQ,UAAU,WAAW;CAEpE,IAAI,CAAC,WAAW,UAAU,GAAG;EAC3B,QAAQ,OAAO,MACb,qDAAqD,WAAW;CAElE;EACA,OAAO;CACT;CAEA,MAAM,MAAM;EACV,GAAG,QAAQ;EACX,MAAM;EACN,kBAAkB;EAClB,kBAAkB;CACpB;CAEA,MAAM,SAAS,MAAM,QAAQ,UAAU,CAAC,UAAU,GAAG;EACnD,KAAK;EACL;EACA,OAAO;CACT,CAAC;CAED,MAAM,iBAAiB,OAAO,KAAK,SAAS;CAC5C,QAAQ,GAAG,UAAU,QAAQ;CAC7B,QAAQ,GAAG,WAAW,QAAQ;CAE9B,OAAO,MAAM,IAAI,SAAiB,YAAY;EAC5C,OAAO,GAAG,SAAS,SAAS,QAAQ,QAAQ,CAAC,CAAC;CAChD,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","names":[],"sources":["../../../src/lib/bootstrap.ts"],"sourcesContent":["// Paired bootstrap on per-item score deltas.\n// Returns a 95% CI on the mean delta. Auto-promotion rule: lower bound > 0.\n//\n// Why bootstrap and not a t-test:\n// - No normality assumption (judge scores are bounded, often skewed)\n// - Works on tiny n (we typically have 30 items)\n// - Two-sided 95% CI is the right shape for the auto-promotion gate\n// - Trivially implementable in vanilla JS — no scipy / numpy / jStat dep\n\nexport interface BootstrapResult {\n mean_delta: number;\n ci_low: number;\n ci_high: number;\n n: number;\n}\n\n/**\n * Bootstrap a 95% CI for the mean of `deltas`.\n * Uses 10000 resamples by default; deterministic for a given `seed`.\n */\nexport function bootstrapMeanCI(\n deltas: number[],\n opts: { resamples?: number; seed?: number; alpha?: number } = {},\n): BootstrapResult {\n const resamples = opts.resamples ?? 10000;\n const alpha = opts.alpha ?? 0.05;\n const n = deltas.length;\n if (n === 0) {\n return { mean_delta: 0, ci_low: 0, ci_high: 0, n: 0 };\n }\n const observed = mean(deltas);\n const rng = mulberry32(opts.seed ?? 0xc0ffee);\n const means = new Float64Array(resamples);\n for (let r = 0; r < resamples; r++) {\n let sum = 0;\n for (let i = 0; i < n; i++) {\n sum += deltas[(rng() * n) | 0];\n }\n means[r] = sum / n;\n }\n const sorted = Array.from(means).sort((a, b) => a - b);\n const loIdx = Math.floor((alpha / 2) * resamples);\n const hiIdx = Math.min(\n resamples - 1,\n Math.ceil((1 - alpha / 2) * resamples) - 1,\n );\n return {\n mean_delta: observed,\n ci_low: sorted[loIdx],\n ci_high: sorted[hiIdx],\n n,\n };\n}\n\n/** Pair item scores from new run with baseline scores by id. Returns deltas only for matched ids. */\nexport function pairDeltas(\n newScores: Map<string, number>,\n baselineScores: Map<string, number>,\n): { deltas: number[]; matchedIds: string[] } {\n const deltas: number[] = [];\n const matchedIds: string[] = [];\n for (const [id, s] of newScores) {\n const b = baselineScores.get(id);\n if (b === undefined) continue;\n deltas.push(s - b);\n matchedIds.push(id);\n }\n return { deltas, matchedIds };\n}\n\nfunction mean(xs: number[]): number {\n if (xs.length === 0) return 0;\n let s = 0;\n for (const x of xs) s += x;\n return s / xs.length;\n}\n\n// Small deterministic PRNG (mulberry32). Public domain.\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return function () {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n"],"mappings":";;;;;AAoBA,SAAgB,gBACd,QACA,OAA8D,
|
|
1
|
+
{"version":3,"file":"bootstrap.js","names":[],"sources":["../../../src/lib/bootstrap.ts"],"sourcesContent":["// Paired bootstrap on per-item score deltas.\n// Returns a 95% CI on the mean delta. Auto-promotion rule: lower bound > 0.\n//\n// Why bootstrap and not a t-test:\n// - No normality assumption (judge scores are bounded, often skewed)\n// - Works on tiny n (we typically have 30 items)\n// - Two-sided 95% CI is the right shape for the auto-promotion gate\n// - Trivially implementable in vanilla JS — no scipy / numpy / jStat dep\n\nexport interface BootstrapResult {\n mean_delta: number;\n ci_low: number;\n ci_high: number;\n n: number;\n}\n\n/**\n * Bootstrap a 95% CI for the mean of `deltas`.\n * Uses 10000 resamples by default; deterministic for a given `seed`.\n */\nexport function bootstrapMeanCI(\n deltas: number[],\n opts: { resamples?: number; seed?: number; alpha?: number } = {},\n): BootstrapResult {\n const resamples = opts.resamples ?? 10000;\n const alpha = opts.alpha ?? 0.05;\n const n = deltas.length;\n if (n === 0) {\n return { mean_delta: 0, ci_low: 0, ci_high: 0, n: 0 };\n }\n const observed = mean(deltas);\n const rng = mulberry32(opts.seed ?? 0xc0ffee);\n const means = new Float64Array(resamples);\n for (let r = 0; r < resamples; r++) {\n let sum = 0;\n for (let i = 0; i < n; i++) {\n sum += deltas[(rng() * n) | 0];\n }\n means[r] = sum / n;\n }\n const sorted = Array.from(means).sort((a, b) => a - b);\n const loIdx = Math.floor((alpha / 2) * resamples);\n const hiIdx = Math.min(\n resamples - 1,\n Math.ceil((1 - alpha / 2) * resamples) - 1,\n );\n return {\n mean_delta: observed,\n ci_low: sorted[loIdx],\n ci_high: sorted[hiIdx],\n n,\n };\n}\n\n/** Pair item scores from new run with baseline scores by id. Returns deltas only for matched ids. */\nexport function pairDeltas(\n newScores: Map<string, number>,\n baselineScores: Map<string, number>,\n): { deltas: number[]; matchedIds: string[] } {\n const deltas: number[] = [];\n const matchedIds: string[] = [];\n for (const [id, s] of newScores) {\n const b = baselineScores.get(id);\n if (b === undefined) continue;\n deltas.push(s - b);\n matchedIds.push(id);\n }\n return { deltas, matchedIds };\n}\n\nfunction mean(xs: number[]): number {\n if (xs.length === 0) return 0;\n let s = 0;\n for (const x of xs) s += x;\n return s / xs.length;\n}\n\n// Small deterministic PRNG (mulberry32). Public domain.\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return function () {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n"],"mappings":";;;;;AAoBA,SAAgB,gBACd,QACA,OAA8D,CAAC,GAC9C;CACjB,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,IAAI,OAAO;CACjB,IAAI,MAAM,GACR,OAAO;EAAE,YAAY;EAAG,QAAQ;EAAG,SAAS;EAAG,GAAG;CAAE;CAEtD,MAAM,WAAW,KAAK,MAAM;CAC5B,MAAM,MAAM,WAAW,KAAK,QAAQ,QAAQ;CAC5C,MAAM,QAAQ,IAAI,aAAa,SAAS;CACxC,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;EAClC,IAAI,MAAM;EACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACrB,OAAO,OAAQ,IAAI,IAAI,IAAK;EAE9B,MAAM,KAAK,MAAM;CACnB;CACA,MAAM,SAAS,MAAM,KAAK,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;CACrD,MAAM,QAAQ,KAAK,MAAO,QAAQ,IAAK,SAAS;CAChD,MAAM,QAAQ,KAAK,IACjB,YAAY,GACZ,KAAK,MAAM,IAAI,QAAQ,KAAK,SAAS,IAAI,CAC3C;CACA,OAAO;EACL,YAAY;EACZ,QAAQ,OAAO;EACf,SAAS,OAAO;EAChB;CACF;AACF;;AAGA,SAAgB,WACd,WACA,gBAC4C;CAC5C,MAAM,SAAmB,CAAC;CAC1B,MAAM,aAAuB,CAAC;CAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,WAAW;EAC/B,MAAM,IAAI,eAAe,IAAI,EAAE;EAC/B,IAAI,MAAM,KAAA,GAAW;EACrB,OAAO,KAAK,IAAI,CAAC;EACjB,WAAW,KAAK,EAAE;CACpB;CACA,OAAO;EAAE;EAAQ;CAAW;AAC9B;AAEA,SAAS,KAAK,IAAsB;CAClC,IAAI,GAAG,WAAW,GAAG,OAAO;CAC5B,IAAI,IAAI;CACR,KAAK,MAAM,KAAK,IAAI,KAAK;CACzB,OAAO,IAAI,GAAG;AAChB;AAGA,SAAS,WAAW,MAA4B;CAC9C,IAAI,IAAI,SAAS;CACjB,OAAO,WAAY;EACjB,IAAK,IAAI,eAAgB;EACzB,IAAI,IAAI;EACR,IAAI,KAAK,KAAK,IAAK,MAAM,IAAK,IAAI,CAAC;EACnC,KAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,IAAI,EAAE;EACxC,SAAS,IAAK,MAAM,QAAS,KAAK;CACpC;AACF"}
|
package/dist/src/lib/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":[],"sources":["../../../src/lib/cli.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { kaizenConfigPath } from \"./paths.js\";\n\nexport function requireKaizenWorkspace(root: string): boolean {\n if (existsSync(kaizenConfigPath(root))) return true;\n process.stderr.write(\n `no kaizen/config.ts in ${root}. run \\`kaizen init\\` first.\\n`,\n );\n return false;\n}\n\nexport function isSystemId(value: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(value);\n}\n\nexport function pad(s: string, w: number): string {\n if (s.length >= w) return s.slice(0, w - 1) + \" \";\n return s + \" \".repeat(w - s.length);\n}\n"],"mappings":";;;;AAGA,SAAgB,uBAAuB,MAAuB;
|
|
1
|
+
{"version":3,"file":"cli.js","names":[],"sources":["../../../src/lib/cli.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { kaizenConfigPath } from \"./paths.js\";\n\nexport function requireKaizenWorkspace(root: string): boolean {\n if (existsSync(kaizenConfigPath(root))) return true;\n process.stderr.write(\n `no kaizen/config.ts in ${root}. run \\`kaizen init\\` first.\\n`,\n );\n return false;\n}\n\nexport function isSystemId(value: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(value);\n}\n\nexport function pad(s: string, w: number): string {\n if (s.length >= w) return s.slice(0, w - 1) + \" \";\n return s + \" \".repeat(w - s.length);\n}\n"],"mappings":";;;;AAGA,SAAgB,uBAAuB,MAAuB;CAC5D,IAAI,WAAW,iBAAiB,IAAI,CAAC,GAAG,OAAO;CAC/C,QAAQ,OAAO,MACb,0BAA0B,KAAK,+BACjC;CACA,OAAO;AACT;AAEA,SAAgB,WAAW,OAAwB;CACjD,OAAO,oBAAoB,KAAK,KAAK;AACvC;AAEA,SAAgB,IAAI,GAAW,GAAmB;CAChD,IAAI,EAAE,UAAU,GAAG,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI;CAC9C,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE,MAAM;AACpC"}
|
package/dist/src/lib/events.js
CHANGED
|
@@ -54,6 +54,8 @@ function findTerminal(events) {
|
|
|
54
54
|
}
|
|
55
55
|
/** Stream-mode NDJSON parser. Feed `push(chunk)` from a Readable; receive parsed events via `onEvent`. */
|
|
56
56
|
var NdjsonReader = class {
|
|
57
|
+
onEvent;
|
|
58
|
+
onParseError;
|
|
57
59
|
buffer = "";
|
|
58
60
|
constructor(onEvent, onParseError) {
|
|
59
61
|
this.onEvent = onEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","names":[],"sources":["../../../src/lib/events.ts"],"sourcesContent":["// Event schema for the NDJSON contract between eval scripts and the runner.\n\ninterface BaseEvent {\n type: string;\n ts?: number;\n}\n\ninterface StartEvent extends BaseEvent {\n type: \"start\";\n n: number;\n eval_version: number;\n dataset_version: string;\n variant?: string;\n}\n\nexport interface ItemEvent extends BaseEvent {\n type: \"item\";\n id: string;\n score: number;\n breakdown?: Record<string, number>;\n trace_id?: string | null;\n why?: string;\n subgroup?: Record<string, string>;\n}\n\ninterface ProgressEvent extends BaseEvent {\n type: \"progress\";\n done: number;\n total: number;\n}\n\nexport interface CompleteEvent extends BaseEvent {\n type: \"complete\";\n score: number;\n breakdown?: Record<string, number>;\n n: number;\n worst_traces?: Array<{ id: string; score: number; trace_id?: string | null }>;\n}\n\ninterface ErrorEvent extends BaseEvent {\n type: \"error\";\n message: string;\n}\n\n// Synthesized by the runner, not emitted by the eval.\nexport interface CrashedEvent extends BaseEvent {\n type: \"crashed\";\n exit_code: number | null;\n signal?: string | null;\n stderr_tail?: string;\n reason: string;\n}\n\ninterface AbortedEvent extends BaseEvent {\n type: \"aborted\";\n reason: string;\n}\n\nexport interface PromotionEvent extends BaseEvent {\n type: \"promotion\";\n promoted: boolean;\n rule:\n | \"auto\"\n | \"force\"\n | \"no_baseline\"\n | \"version_mismatch\"\n | \"stat_insufficient\"\n | \"subgroup_regression\";\n ci_low?: number;\n ci_high?: number;\n mean_delta?: number;\n n_compared?: number;\n parent_run_id?: string;\n details?: string;\n}\n\nexport type Event =\n | StartEvent\n | ItemEvent\n | ProgressEvent\n | CompleteEvent\n | ErrorEvent\n | CrashedEvent\n | AbortedEvent\n | PromotionEvent;\n\nexport function validateEvent(value: unknown): Event {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"event must be an object\");\n }\n const e = value as Record<string, unknown>;\n if (typeof e.type !== \"string\") {\n throw new Error(\"event.type must be a string\");\n }\n\n switch (e.type) {\n case \"start\":\n requireNumber(e, \"n\");\n requireNumber(e, \"eval_version\");\n requireString(e, \"dataset_version\");\n break;\n case \"item\":\n requireString(e, \"id\");\n requireNumber(e, \"score\");\n break;\n case \"progress\":\n requireNumber(e, \"done\");\n requireNumber(e, \"total\");\n break;\n case \"complete\":\n requireNumber(e, \"score\");\n requireNumber(e, \"n\");\n break;\n case \"error\":\n requireString(e, \"message\");\n break;\n case \"crashed\":\n requireString(e, \"reason\");\n break;\n case \"aborted\":\n requireString(e, \"reason\");\n break;\n case \"promotion\":\n if (typeof e.promoted !== \"boolean\")\n throw new Error(\"promotion.promoted must be boolean\");\n requireString(e, \"rule\");\n break;\n default:\n throw new Error(`unknown event type: ${e.type}`);\n }\n\n if (e.ts !== undefined && typeof e.ts !== \"number\") {\n throw new Error(`${e.type}.ts must be a number when present`);\n }\n return e as unknown as Event;\n}\n\nfunction requireString(e: Record<string, unknown>, key: string): void {\n if (typeof e[key] !== \"string\" || e[key] === \"\") {\n throw new Error(`${String(e.type)}.${key} must be a non-empty string`);\n }\n}\n\nfunction requireNumber(e: Record<string, unknown>, key: string): void {\n if (typeof e[key] !== \"number\" || !Number.isFinite(e[key])) {\n throw new Error(`${String(e.type)}.${key} must be a finite number`);\n }\n}\n\nfunction isTerminal(\n e: Event,\n): e is CompleteEvent | CrashedEvent | AbortedEvent {\n return e.type === \"complete\" || e.type === \"crashed\" || e.type === \"aborted\";\n}\n\nexport function findTerminal(\n events: Event[],\n): CompleteEvent | CrashedEvent | AbortedEvent | null {\n for (let i = events.length - 1; i >= 0; i--) {\n if (isTerminal(events[i]))\n return events[i] as CompleteEvent | CrashedEvent | AbortedEvent;\n }\n return null;\n}\n\n/** Stream-mode NDJSON parser. Feed `push(chunk)` from a Readable; receive parsed events via `onEvent`. */\nexport class NdjsonReader {\n private buffer = \"\";\n public constructor(\n private onEvent: (e: Event) => void,\n private onParseError?: (line: string, err: unknown) => void,\n ) {}\n\n public push(chunk: string | Buffer): void {\n this.buffer += typeof chunk === \"string\" ? chunk : chunk.toString(\"utf-8\");\n let nl: number;\n while ((nl = this.buffer.indexOf(\"\\n\")) !== -1) {\n const line = this.buffer.slice(0, nl);\n this.buffer = this.buffer.slice(nl + 1);\n if (!line.trim()) continue;\n try {\n this.onEvent(validateEvent(JSON.parse(line)));\n } catch (err) {\n this.onParseError?.(line, err);\n }\n }\n }\n\n /** Flush any remaining unterminated content as a best-effort parse. */\n public end(): void {\n const tail = this.buffer.trim();\n this.buffer = \"\";\n if (!tail) return;\n try {\n this.onEvent(validateEvent(JSON.parse(tail)));\n } catch (err) {\n this.onParseError?.(tail, err);\n }\n }\n}\n"],"mappings":";AAsFA,SAAgB,cAAc,OAAuB;
|
|
1
|
+
{"version":3,"file":"events.js","names":[],"sources":["../../../src/lib/events.ts"],"sourcesContent":["// Event schema for the NDJSON contract between eval scripts and the runner.\n\ninterface BaseEvent {\n type: string;\n ts?: number;\n}\n\ninterface StartEvent extends BaseEvent {\n type: \"start\";\n n: number;\n eval_version: number;\n dataset_version: string;\n variant?: string;\n}\n\nexport interface ItemEvent extends BaseEvent {\n type: \"item\";\n id: string;\n score: number;\n breakdown?: Record<string, number>;\n trace_id?: string | null;\n why?: string;\n subgroup?: Record<string, string>;\n}\n\ninterface ProgressEvent extends BaseEvent {\n type: \"progress\";\n done: number;\n total: number;\n}\n\nexport interface CompleteEvent extends BaseEvent {\n type: \"complete\";\n score: number;\n breakdown?: Record<string, number>;\n n: number;\n worst_traces?: Array<{ id: string; score: number; trace_id?: string | null }>;\n}\n\ninterface ErrorEvent extends BaseEvent {\n type: \"error\";\n message: string;\n}\n\n// Synthesized by the runner, not emitted by the eval.\nexport interface CrashedEvent extends BaseEvent {\n type: \"crashed\";\n exit_code: number | null;\n signal?: string | null;\n stderr_tail?: string;\n reason: string;\n}\n\ninterface AbortedEvent extends BaseEvent {\n type: \"aborted\";\n reason: string;\n}\n\nexport interface PromotionEvent extends BaseEvent {\n type: \"promotion\";\n promoted: boolean;\n rule:\n | \"auto\"\n | \"force\"\n | \"no_baseline\"\n | \"version_mismatch\"\n | \"stat_insufficient\"\n | \"subgroup_regression\";\n ci_low?: number;\n ci_high?: number;\n mean_delta?: number;\n n_compared?: number;\n parent_run_id?: string;\n details?: string;\n}\n\nexport type Event =\n | StartEvent\n | ItemEvent\n | ProgressEvent\n | CompleteEvent\n | ErrorEvent\n | CrashedEvent\n | AbortedEvent\n | PromotionEvent;\n\nexport function validateEvent(value: unknown): Event {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"event must be an object\");\n }\n const e = value as Record<string, unknown>;\n if (typeof e.type !== \"string\") {\n throw new Error(\"event.type must be a string\");\n }\n\n switch (e.type) {\n case \"start\":\n requireNumber(e, \"n\");\n requireNumber(e, \"eval_version\");\n requireString(e, \"dataset_version\");\n break;\n case \"item\":\n requireString(e, \"id\");\n requireNumber(e, \"score\");\n break;\n case \"progress\":\n requireNumber(e, \"done\");\n requireNumber(e, \"total\");\n break;\n case \"complete\":\n requireNumber(e, \"score\");\n requireNumber(e, \"n\");\n break;\n case \"error\":\n requireString(e, \"message\");\n break;\n case \"crashed\":\n requireString(e, \"reason\");\n break;\n case \"aborted\":\n requireString(e, \"reason\");\n break;\n case \"promotion\":\n if (typeof e.promoted !== \"boolean\")\n throw new Error(\"promotion.promoted must be boolean\");\n requireString(e, \"rule\");\n break;\n default:\n throw new Error(`unknown event type: ${e.type}`);\n }\n\n if (e.ts !== undefined && typeof e.ts !== \"number\") {\n throw new Error(`${e.type}.ts must be a number when present`);\n }\n return e as unknown as Event;\n}\n\nfunction requireString(e: Record<string, unknown>, key: string): void {\n if (typeof e[key] !== \"string\" || e[key] === \"\") {\n throw new Error(`${String(e.type)}.${key} must be a non-empty string`);\n }\n}\n\nfunction requireNumber(e: Record<string, unknown>, key: string): void {\n if (typeof e[key] !== \"number\" || !Number.isFinite(e[key])) {\n throw new Error(`${String(e.type)}.${key} must be a finite number`);\n }\n}\n\nfunction isTerminal(\n e: Event,\n): e is CompleteEvent | CrashedEvent | AbortedEvent {\n return e.type === \"complete\" || e.type === \"crashed\" || e.type === \"aborted\";\n}\n\nexport function findTerminal(\n events: Event[],\n): CompleteEvent | CrashedEvent | AbortedEvent | null {\n for (let i = events.length - 1; i >= 0; i--) {\n if (isTerminal(events[i]))\n return events[i] as CompleteEvent | CrashedEvent | AbortedEvent;\n }\n return null;\n}\n\n/** Stream-mode NDJSON parser. Feed `push(chunk)` from a Readable; receive parsed events via `onEvent`. */\nexport class NdjsonReader {\n private buffer = \"\";\n public constructor(\n private onEvent: (e: Event) => void,\n private onParseError?: (line: string, err: unknown) => void,\n ) {}\n\n public push(chunk: string | Buffer): void {\n this.buffer += typeof chunk === \"string\" ? chunk : chunk.toString(\"utf-8\");\n let nl: number;\n while ((nl = this.buffer.indexOf(\"\\n\")) !== -1) {\n const line = this.buffer.slice(0, nl);\n this.buffer = this.buffer.slice(nl + 1);\n if (!line.trim()) continue;\n try {\n this.onEvent(validateEvent(JSON.parse(line)));\n } catch (err) {\n this.onParseError?.(line, err);\n }\n }\n }\n\n /** Flush any remaining unterminated content as a best-effort parse. */\n public end(): void {\n const tail = this.buffer.trim();\n this.buffer = \"\";\n if (!tail) return;\n try {\n this.onEvent(validateEvent(JSON.parse(tail)));\n } catch (err) {\n this.onParseError?.(tail, err);\n }\n }\n}\n"],"mappings":";AAsFA,SAAgB,cAAc,OAAuB;CACnD,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,MAAM,IAAI,MAAM,yBAAyB;CAE3C,MAAM,IAAI;CACV,IAAI,OAAO,EAAE,SAAS,UACpB,MAAM,IAAI,MAAM,6BAA6B;CAG/C,QAAQ,EAAE,MAAV;EACE,KAAK;GACH,cAAc,GAAG,GAAG;GACpB,cAAc,GAAG,cAAc;GAC/B,cAAc,GAAG,iBAAiB;GAClC;EACF,KAAK;GACH,cAAc,GAAG,IAAI;GACrB,cAAc,GAAG,OAAO;GACxB;EACF,KAAK;GACH,cAAc,GAAG,MAAM;GACvB,cAAc,GAAG,OAAO;GACxB;EACF,KAAK;GACH,cAAc,GAAG,OAAO;GACxB,cAAc,GAAG,GAAG;GACpB;EACF,KAAK;GACH,cAAc,GAAG,SAAS;GAC1B;EACF,KAAK;GACH,cAAc,GAAG,QAAQ;GACzB;EACF,KAAK;GACH,cAAc,GAAG,QAAQ;GACzB;EACF,KAAK;GACH,IAAI,OAAO,EAAE,aAAa,WACxB,MAAM,IAAI,MAAM,oCAAoC;GACtD,cAAc,GAAG,MAAM;GACvB;EACF,SACE,MAAM,IAAI,MAAM,uBAAuB,EAAE,MAAM;CACnD;CAEA,IAAI,EAAE,OAAO,KAAA,KAAa,OAAO,EAAE,OAAO,UACxC,MAAM,IAAI,MAAM,GAAG,EAAE,KAAK,kCAAkC;CAE9D,OAAO;AACT;AAEA,SAAS,cAAc,GAA4B,KAAmB;CACpE,IAAI,OAAO,EAAE,SAAS,YAAY,EAAE,SAAS,IAC3C,MAAM,IAAI,MAAM,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,4BAA4B;AAEzE;AAEA,SAAS,cAAc,GAA4B,KAAmB;CACpE,IAAI,OAAO,EAAE,SAAS,YAAY,CAAC,OAAO,SAAS,EAAE,IAAI,GACvD,MAAM,IAAI,MAAM,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,yBAAyB;AAEtE;AAEA,SAAS,WACP,GACkD;CAClD,OAAO,EAAE,SAAS,cAAc,EAAE,SAAS,aAAa,EAAE,SAAS;AACrE;AAEA,SAAgB,aACd,QACoD;CACpD,KAAK,IAAI,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KACtC,IAAI,WAAW,OAAO,EAAE,GACtB,OAAO,OAAO;CAElB,OAAO;AACT;;AAGA,IAAa,eAAb,MAA0B;CAGd;CACA;CAHV,SAAiB;CACjB,YACE,SACA,cACA;EAFQ,KAAA,UAAA;EACA,KAAA,eAAA;CACP;CAEH,KAAY,OAA8B;EACxC,KAAK,UAAU,OAAO,UAAU,WAAW,QAAQ,MAAM,SAAS,OAAO;EACzE,IAAI;EACJ,QAAQ,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,IAAI;GAC9C,MAAM,OAAO,KAAK,OAAO,MAAM,GAAG,EAAE;GACpC,KAAK,SAAS,KAAK,OAAO,MAAM,KAAK,CAAC;GACtC,IAAI,CAAC,KAAK,KAAK,GAAG;GAClB,IAAI;IACF,KAAK,QAAQ,cAAc,KAAK,MAAM,IAAI,CAAC,CAAC;GAC9C,SAAS,KAAK;IACZ,KAAK,eAAe,MAAM,GAAG;GAC/B;EACF;CACF;;CAGA,MAAmB;EACjB,MAAM,OAAO,KAAK,OAAO,KAAK;EAC9B,KAAK,SAAS;EACd,IAAI,CAAC,MAAM;EACX,IAAI;GACF,KAAK,QAAQ,cAAc,KAAK,MAAM,IAAI,CAAC,CAAC;EAC9C,SAAS,KAAK;GACZ,KAAK,eAAe,MAAM,GAAG;EAC/B;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-utils.js","names":[],"sources":["../../../src/lib/fs-utils.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nexport function ensureDir(p: string): void {\n mkdirSync(p, { recursive: true });\n}\n\nexport function writeFileSafely(\n p: string,\n contents: string,\n opts: { overwrite?: boolean } = {},\n): boolean {\n if (existsSync(p) && !opts.overwrite) return false;\n ensureDir(dirname(p));\n writeFileSync(p, contents);\n return true;\n}\n\nexport function applyVars(text: string, vars: Record<string, string>): string {\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (m, key) =>\n key in vars ? vars[key] : m,\n );\n}\n\nexport function appendIfMissing(path: string, line: string): boolean {\n const existing = existsSync(path) ? readFileSync(path, \"utf-8\") : \"\";\n if (existing.split(\"\\n\").some((l) => l.trim() === line.trim())) return false;\n ensureDir(dirname(path));\n const sep = existing.length === 0 || existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n writeFileSync(path, existing + sep + line + \"\\n\");\n return true;\n}\n"],"mappings":";;;AAGA,SAAgB,UAAU,GAAiB;
|
|
1
|
+
{"version":3,"file":"fs-utils.js","names":[],"sources":["../../../src/lib/fs-utils.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nexport function ensureDir(p: string): void {\n mkdirSync(p, { recursive: true });\n}\n\nexport function writeFileSafely(\n p: string,\n contents: string,\n opts: { overwrite?: boolean } = {},\n): boolean {\n if (existsSync(p) && !opts.overwrite) return false;\n ensureDir(dirname(p));\n writeFileSync(p, contents);\n return true;\n}\n\nexport function applyVars(text: string, vars: Record<string, string>): string {\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (m, key) =>\n key in vars ? vars[key] : m,\n );\n}\n\nexport function appendIfMissing(path: string, line: string): boolean {\n const existing = existsSync(path) ? readFileSync(path, \"utf-8\") : \"\";\n if (existing.split(\"\\n\").some((l) => l.trim() === line.trim())) return false;\n ensureDir(dirname(path));\n const sep = existing.length === 0 || existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n writeFileSync(path, existing + sep + line + \"\\n\");\n return true;\n}\n"],"mappings":";;;AAGA,SAAgB,UAAU,GAAiB;CACzC,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAClC;AAEA,SAAgB,gBACd,GACA,UACA,OAAgC,CAAC,GACxB;CACT,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,WAAW,OAAO;CAC7C,UAAU,QAAQ,CAAC,CAAC;CACpB,cAAc,GAAG,QAAQ;CACzB,OAAO;AACT;AAEA,SAAgB,UAAU,MAAc,MAAsC;CAC5E,OAAO,KAAK,QAAQ,yBAAyB,GAAG,QAC9C,OAAO,OAAO,KAAK,OAAO,CAC5B;AACF;AAEA,SAAgB,gBAAgB,MAAc,MAAuB;CACnE,MAAM,WAAW,WAAW,IAAI,IAAI,aAAa,MAAM,OAAO,IAAI;CAClE,IAAI,SAAS,MAAM,IAAI,EAAE,MAAM,MAAM,EAAE,KAAK,MAAM,KAAK,KAAK,CAAC,GAAG,OAAO;CACvE,UAAU,QAAQ,IAAI,CAAC;CAEvB,cAAc,MAAM,YADR,SAAS,WAAW,KAAK,SAAS,SAAS,IAAI,IAAI,KAAK,QAC/B,OAAO,IAAI;CAChD,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leaderboard.js","names":[],"sources":["../../../src/lib/leaderboard.ts"],"sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { systemRunsDir, readJsonIfExists } from \"./run-dir.js\";\n\nexport interface RunSummary {\n run_id: string;\n system: string;\n variant: string;\n parent_id: string | null;\n hypothesis: string;\n status: \"complete\" | \"crashed\" | \"aborted\" | \"running\";\n score: number | null;\n n: number | null;\n promoted: boolean | null;\n started_at: string;\n ended_at: string | null;\n eval_version: number;\n dataset_version: string;\n events_path: string;\n state_path: string;\n manifest_path: string;\n linear_issue_id?: string | null;\n linear_issue_url?: string | null;\n}\n\nexport interface ManifestFile {\n run_id: string;\n system: string;\n variant: string;\n parent_id: string | null;\n hypothesis: string;\n git_sha?: string | null;\n git_branch?: string | null;\n worktree_root?: string | null;\n git_common_dir?: string | null;\n eval_version: number;\n dataset_version: string;\n started_at: string;\n host?: string;\n kaizen_version?: string;\n state_dir?: string;\n diagnostic?: boolean;\n linear_issue_id?: string | null;\n linear_issue_url?: string | null;\n}\n\nexport interface StateFile {\n run_id: string;\n status: RunSummary[\"status\"];\n score: number | null;\n n_total?: number | null;\n n_done?: number;\n promoted?: boolean | null;\n ended_at?: string | null;\n}\n\nexport function listRuns(stateDir: string, systemId: string): RunSummary[] {\n const dir = systemRunsDir(stateDir, systemId);\n if (!existsSync(dir)) return [];\n const out: RunSummary[] = [];\n for (const entry of readdirSync(dir)) {\n const runDir = join(dir, entry);\n if (!statSync(runDir).isDirectory()) continue;\n const manifest_path = join(runDir, \"manifest.json\");\n const state_path = join(runDir, \"state.json\");\n const events_path = join(runDir, \"events.jsonl\");\n const manifest = readJsonIfExists<ManifestFile>(manifest_path);\n if (!manifest) continue;\n const state = readJsonIfExists<StateFile>(state_path);\n out.push({\n run_id: manifest.run_id,\n system: manifest.system,\n variant: manifest.variant,\n parent_id: manifest.parent_id,\n hypothesis: manifest.hypothesis,\n status: state?.status ?? \"running\",\n score: state?.score ?? null,\n n: state?.n_total ?? null,\n promoted: state?.promoted ?? null,\n started_at: manifest.started_at,\n ended_at: state?.ended_at ?? null,\n eval_version: manifest.eval_version,\n dataset_version: manifest.dataset_version,\n events_path,\n state_path,\n manifest_path,\n linear_issue_id: manifest.linear_issue_id ?? null,\n linear_issue_url: manifest.linear_issue_url ?? null,\n });\n }\n // Newest first\n out.sort((a, b) => (b.started_at < a.started_at ? -1 : 1));\n return out;\n}\n\n/**\n * Promoted baseline = the most recent run that was promoted, under matching versions.\n * Falls back to the highest-scored complete run if nothing has been promoted yet\n * (e.g. the very first run before promotion semantics kick in).\n */\nexport function currentBaseline(\n runs: RunSummary[],\n evalVersion: number,\n datasetVersion: string,\n): RunSummary | null {\n const eligible = runs.filter(\n (r) =>\n r.status === \"complete\" &&\n r.score !== null &&\n r.eval_version === evalVersion &&\n r.dataset_version === datasetVersion,\n );\n if (eligible.length === 0) return null;\n // listRuns sorts newest-first; find the newest with promoted: true.\n const promoted = eligible.find((r) => r.promoted === true);\n if (promoted) return promoted;\n // Fallback: highest-scored eligible run when promotion data is unavailable.\n let best = eligible[0];\n for (const r of eligible) {\n if (r.score! > best.score!) best = r;\n }\n return best;\n}\n"],"mappings":";;;;AAwDA,SAAgB,SAAS,UAAkB,UAAgC;CACzE,MAAM,MAAM,cAAc,UAAU,
|
|
1
|
+
{"version":3,"file":"leaderboard.js","names":[],"sources":["../../../src/lib/leaderboard.ts"],"sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { systemRunsDir, readJsonIfExists } from \"./run-dir.js\";\n\nexport interface RunSummary {\n run_id: string;\n system: string;\n variant: string;\n parent_id: string | null;\n hypothesis: string;\n status: \"complete\" | \"crashed\" | \"aborted\" | \"running\";\n score: number | null;\n n: number | null;\n promoted: boolean | null;\n started_at: string;\n ended_at: string | null;\n eval_version: number;\n dataset_version: string;\n events_path: string;\n state_path: string;\n manifest_path: string;\n linear_issue_id?: string | null;\n linear_issue_url?: string | null;\n}\n\nexport interface ManifestFile {\n run_id: string;\n system: string;\n variant: string;\n parent_id: string | null;\n hypothesis: string;\n git_sha?: string | null;\n git_branch?: string | null;\n worktree_root?: string | null;\n git_common_dir?: string | null;\n eval_version: number;\n dataset_version: string;\n started_at: string;\n host?: string;\n kaizen_version?: string;\n state_dir?: string;\n diagnostic?: boolean;\n linear_issue_id?: string | null;\n linear_issue_url?: string | null;\n}\n\nexport interface StateFile {\n run_id: string;\n status: RunSummary[\"status\"];\n score: number | null;\n n_total?: number | null;\n n_done?: number;\n promoted?: boolean | null;\n ended_at?: string | null;\n}\n\nexport function listRuns(stateDir: string, systemId: string): RunSummary[] {\n const dir = systemRunsDir(stateDir, systemId);\n if (!existsSync(dir)) return [];\n const out: RunSummary[] = [];\n for (const entry of readdirSync(dir)) {\n const runDir = join(dir, entry);\n if (!statSync(runDir).isDirectory()) continue;\n const manifest_path = join(runDir, \"manifest.json\");\n const state_path = join(runDir, \"state.json\");\n const events_path = join(runDir, \"events.jsonl\");\n const manifest = readJsonIfExists<ManifestFile>(manifest_path);\n if (!manifest) continue;\n const state = readJsonIfExists<StateFile>(state_path);\n out.push({\n run_id: manifest.run_id,\n system: manifest.system,\n variant: manifest.variant,\n parent_id: manifest.parent_id,\n hypothesis: manifest.hypothesis,\n status: state?.status ?? \"running\",\n score: state?.score ?? null,\n n: state?.n_total ?? null,\n promoted: state?.promoted ?? null,\n started_at: manifest.started_at,\n ended_at: state?.ended_at ?? null,\n eval_version: manifest.eval_version,\n dataset_version: manifest.dataset_version,\n events_path,\n state_path,\n manifest_path,\n linear_issue_id: manifest.linear_issue_id ?? null,\n linear_issue_url: manifest.linear_issue_url ?? null,\n });\n }\n // Newest first\n out.sort((a, b) => (b.started_at < a.started_at ? -1 : 1));\n return out;\n}\n\n/**\n * Promoted baseline = the most recent run that was promoted, under matching versions.\n * Falls back to the highest-scored complete run if nothing has been promoted yet\n * (e.g. the very first run before promotion semantics kick in).\n */\nexport function currentBaseline(\n runs: RunSummary[],\n evalVersion: number,\n datasetVersion: string,\n): RunSummary | null {\n const eligible = runs.filter(\n (r) =>\n r.status === \"complete\" &&\n r.score !== null &&\n r.eval_version === evalVersion &&\n r.dataset_version === datasetVersion,\n );\n if (eligible.length === 0) return null;\n // listRuns sorts newest-first; find the newest with promoted: true.\n const promoted = eligible.find((r) => r.promoted === true);\n if (promoted) return promoted;\n // Fallback: highest-scored eligible run when promotion data is unavailable.\n let best = eligible[0];\n for (const r of eligible) {\n if (r.score! > best.score!) best = r;\n }\n return best;\n}\n"],"mappings":";;;;AAwDA,SAAgB,SAAS,UAAkB,UAAgC;CACzE,MAAM,MAAM,cAAc,UAAU,QAAQ;CAC5C,IAAI,CAAC,WAAW,GAAG,GAAG,OAAO,CAAC;CAC9B,MAAM,MAAoB,CAAC;CAC3B,KAAK,MAAM,SAAS,YAAY,GAAG,GAAG;EACpC,MAAM,SAAS,KAAK,KAAK,KAAK;EAC9B,IAAI,CAAC,SAAS,MAAM,EAAE,YAAY,GAAG;EACrC,MAAM,gBAAgB,KAAK,QAAQ,eAAe;EAClD,MAAM,aAAa,KAAK,QAAQ,YAAY;EAC5C,MAAM,cAAc,KAAK,QAAQ,cAAc;EAC/C,MAAM,WAAW,iBAA+B,aAAa;EAC7D,IAAI,CAAC,UAAU;EACf,MAAM,QAAQ,iBAA4B,UAAU;EACpD,IAAI,KAAK;GACP,QAAQ,SAAS;GACjB,QAAQ,SAAS;GACjB,SAAS,SAAS;GAClB,WAAW,SAAS;GACpB,YAAY,SAAS;GACrB,QAAQ,OAAO,UAAU;GACzB,OAAO,OAAO,SAAS;GACvB,GAAG,OAAO,WAAW;GACrB,UAAU,OAAO,YAAY;GAC7B,YAAY,SAAS;GACrB,UAAU,OAAO,YAAY;GAC7B,cAAc,SAAS;GACvB,iBAAiB,SAAS;GAC1B;GACA;GACA;GACA,iBAAiB,SAAS,mBAAmB;GAC7C,kBAAkB,SAAS,oBAAoB;EACjD,CAAC;CACH;CAEA,IAAI,MAAM,GAAG,MAAO,EAAE,aAAa,EAAE,aAAa,KAAK,CAAE;CACzD,OAAO;AACT;;;;;;AAOA,SAAgB,gBACd,MACA,aACA,gBACmB;CACnB,MAAM,WAAW,KAAK,QACnB,MACC,EAAE,WAAW,cACb,EAAE,UAAU,QACZ,EAAE,iBAAiB,eACnB,EAAE,oBAAoB,cAC1B;CACA,IAAI,SAAS,WAAW,GAAG,OAAO;CAElC,MAAM,WAAW,SAAS,MAAM,MAAM,EAAE,aAAa,IAAI;CACzD,IAAI,UAAU,OAAO;CAErB,IAAI,OAAO,SAAS;CACpB,KAAK,MAAM,KAAK,UACd,IAAI,EAAE,QAAS,KAAK,OAAQ,OAAO;CAErC,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-args.js","names":[],"sources":["../../../src/lib/parse-args.ts"],"sourcesContent":["export type Flags = Record<string, string | boolean>;\n\nexport function parseFlags(argv: string[]): {\n positional: string[];\n flags: Flags;\n} {\n const positional: string[] = [];\n const flags: Flags = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a.startsWith(\"--\")) {\n const eq = a.indexOf(\"=\");\n let key: string, valFromEq: string | undefined;\n if (eq >= 0) {\n key = a.slice(2, eq);\n valFromEq = a.slice(eq + 1);\n } else {\n key = a.slice(2);\n }\n if (valFromEq !== undefined) {\n flags[key] = valFromEq;\n continue;\n }\n const next = argv[i + 1];\n // A flag's value is the next token unless it looks like another flag (starts with `-`).\n if (next === undefined || next.startsWith(\"-\")) {\n flags[key] = true;\n } else {\n flags[key] = next;\n i++;\n }\n } else if (a.startsWith(\"-\") && a.length > 1) {\n // Short flag like `-n 3`. Treat similarly to long flags.\n const key = a.slice(1);\n const next = argv[i + 1];\n if (next === undefined || next.startsWith(\"-\")) {\n flags[key] = true;\n } else {\n flags[key] = next;\n i++;\n }\n } else {\n positional.push(a);\n }\n }\n return { positional, flags };\n}\n\nexport function strFlag(flags: Flags, key: string): string | undefined {\n const v = flags[key];\n return typeof v === \"string\" ? v : undefined;\n}\n\nexport function boolFlag(flags: Flags, key: string): boolean {\n return flags[key] === true || flags[key] === \"true\";\n}\n"],"mappings":";AAEA,SAAgB,WAAW,MAGzB;CACA,MAAM,aAAuB,
|
|
1
|
+
{"version":3,"file":"parse-args.js","names":[],"sources":["../../../src/lib/parse-args.ts"],"sourcesContent":["export type Flags = Record<string, string | boolean>;\n\nexport function parseFlags(argv: string[]): {\n positional: string[];\n flags: Flags;\n} {\n const positional: string[] = [];\n const flags: Flags = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a.startsWith(\"--\")) {\n const eq = a.indexOf(\"=\");\n let key: string, valFromEq: string | undefined;\n if (eq >= 0) {\n key = a.slice(2, eq);\n valFromEq = a.slice(eq + 1);\n } else {\n key = a.slice(2);\n }\n if (valFromEq !== undefined) {\n flags[key] = valFromEq;\n continue;\n }\n const next = argv[i + 1];\n // A flag's value is the next token unless it looks like another flag (starts with `-`).\n if (next === undefined || next.startsWith(\"-\")) {\n flags[key] = true;\n } else {\n flags[key] = next;\n i++;\n }\n } else if (a.startsWith(\"-\") && a.length > 1) {\n // Short flag like `-n 3`. Treat similarly to long flags.\n const key = a.slice(1);\n const next = argv[i + 1];\n if (next === undefined || next.startsWith(\"-\")) {\n flags[key] = true;\n } else {\n flags[key] = next;\n i++;\n }\n } else {\n positional.push(a);\n }\n }\n return { positional, flags };\n}\n\nexport function strFlag(flags: Flags, key: string): string | undefined {\n const v = flags[key];\n return typeof v === \"string\" ? v : undefined;\n}\n\nexport function boolFlag(flags: Flags, key: string): boolean {\n return flags[key] === true || flags[key] === \"true\";\n}\n"],"mappings":";AAEA,SAAgB,WAAW,MAGzB;CACA,MAAM,aAAuB,CAAC;CAC9B,MAAM,QAAe,CAAC;CACtB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,IAAI,KAAK;EACf,IAAI,EAAE,WAAW,IAAI,GAAG;GACtB,MAAM,KAAK,EAAE,QAAQ,GAAG;GACxB,IAAI,KAAa;GACjB,IAAI,MAAM,GAAG;IACX,MAAM,EAAE,MAAM,GAAG,EAAE;IACnB,YAAY,EAAE,MAAM,KAAK,CAAC;GAC5B,OACE,MAAM,EAAE,MAAM,CAAC;GAEjB,IAAI,cAAc,KAAA,GAAW;IAC3B,MAAM,OAAO;IACb;GACF;GACA,MAAM,OAAO,KAAK,IAAI;GAEtB,IAAI,SAAS,KAAA,KAAa,KAAK,WAAW,GAAG,GAC3C,MAAM,OAAO;QACR;IACL,MAAM,OAAO;IACb;GACF;EACF,OAAO,IAAI,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG;GAE5C,MAAM,MAAM,EAAE,MAAM,CAAC;GACrB,MAAM,OAAO,KAAK,IAAI;GACtB,IAAI,SAAS,KAAA,KAAa,KAAK,WAAW,GAAG,GAC3C,MAAM,OAAO;QACR;IACL,MAAM,OAAO;IACb;GACF;EACF,OACE,WAAW,KAAK,CAAC;CAErB;CACA,OAAO;EAAE;EAAY;CAAM;AAC7B;AAEA,SAAgB,QAAQ,OAAc,KAAiC;CACrE,MAAM,IAAI,MAAM;CAChB,OAAO,OAAO,MAAM,WAAW,IAAI,KAAA;AACrC;AAEA,SAAgB,SAAS,OAAc,KAAsB;CAC3D,OAAO,MAAM,SAAS,QAAQ,MAAM,SAAS;AAC/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","names":[],"sources":["../../../src/lib/paths.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n defaultKaizenStateDir,\n kaizenConfigPath,\n kaizenDir,\n kaizenSystemDir,\n kaizenSystemPath,\n kaizenSystemsDir,\n primaryWorktreeRoot,\n resolveKaizenStateDir,\n} from \"../../shared/workspace-paths.js\";\n\nconst HERE = dirname(fileURLToPath(import.meta.url));\n\nexport function packageRoot(): string {\n let dir = HERE;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n return resolve(HERE, \"..\", \"..\");\n}\n\nexport function templatesDir(): string {\n return resolve(packageRoot(), \"templates\");\n}\n\nexport function workspaceRoot(): string {\n const raw = process.env.KAIZEN_WORKSPACE;\n return raw ? resolve(raw) : process.cwd();\n}\n\nexport {\n defaultKaizenStateDir,\n kaizenConfigPath,\n kaizenDir,\n kaizenSystemDir,\n kaizenSystemPath,\n kaizenSystemsDir,\n primaryWorktreeRoot,\n};\n\nexport function resolveStateDir(workspace: string): string {\n return resolveKaizenStateDir(workspace);\n}\n"],"mappings":";;;;;AAcA,MAAM,OAAO,QAAQ,cAAc,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"paths.js","names":[],"sources":["../../../src/lib/paths.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n defaultKaizenStateDir,\n kaizenConfigPath,\n kaizenDir,\n kaizenSystemDir,\n kaizenSystemPath,\n kaizenSystemsDir,\n primaryWorktreeRoot,\n resolveKaizenStateDir,\n} from \"../../shared/workspace-paths.js\";\n\nconst HERE = dirname(fileURLToPath(import.meta.url));\n\nexport function packageRoot(): string {\n let dir = HERE;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n return resolve(HERE, \"..\", \"..\");\n}\n\nexport function templatesDir(): string {\n return resolve(packageRoot(), \"templates\");\n}\n\nexport function workspaceRoot(): string {\n const raw = process.env.KAIZEN_WORKSPACE;\n return raw ? resolve(raw) : process.cwd();\n}\n\nexport {\n defaultKaizenStateDir,\n kaizenConfigPath,\n kaizenDir,\n kaizenSystemDir,\n kaizenSystemPath,\n kaizenSystemsDir,\n primaryWorktreeRoot,\n};\n\nexport function resolveStateDir(workspace: string): string {\n return resolveKaizenStateDir(workspace);\n}\n"],"mappings":";;;;;AAcA,MAAM,OAAO,QAAQ,cAAc,OAAO,KAAK,GAAG,CAAC;AAEnD,SAAgB,cAAsB;CACpC,IAAI,MAAM;CACV,OAAO,QAAQ,QAAQ,GAAG,GAAG;EAC3B,IAAI,WAAW,KAAK,KAAK,cAAc,CAAC,GAAG,OAAO;EAClD,MAAM,QAAQ,GAAG;CACnB;CACA,OAAO,QAAQ,MAAM,MAAM,IAAI;AACjC;AAEA,SAAgB,eAAuB;CACrC,OAAO,QAAQ,YAAY,GAAG,WAAW;AAC3C;AAEA,SAAgB,gBAAwB;CACtC,MAAM,MAAM,QAAQ,IAAI;CACxB,OAAO,MAAM,QAAQ,GAAG,IAAI,QAAQ,IAAI;AAC1C;AAYA,SAAgB,gBAAgB,WAA2B;CACzD,OAAO,sBAAsB,SAAS;AACxC"}
|