@tech-leads-club/harness-toolkit 0.15.2 → 0.15.3
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/bin/tlc-cli.ts +13 -1
- package/dist/compact-before.mjs +89 -78
- package/dist/doctor.mjs +88 -77
- package/dist/prompt-submit.mjs +89 -78
- package/dist/response-after.mjs +89 -78
- package/dist/run.mjs +89 -78
- package/dist/session-end.mjs +76 -76
- package/dist/session-start.mjs +74 -74
- package/dist/ship-gate.mjs +69 -69
- package/dist/stop.mjs +94 -83
- package/dist/subagent-start.mjs +89 -78
- package/dist/subagent-stop.mjs +90 -79
- package/dist/support.mjs +86 -86
- package/dist/tlc-cli.mjs +1 -1
- package/dist/tool-after.mjs +93 -82
- package/dist/tool-before.mjs +94 -83
- package/dist/tool-failure.mjs +89 -78
- package/docs/log.md +4 -0
- package/package.json +1 -1
- package/src/entrypoints/support.ts +15 -13
- package/src/providers/claude/index.ts +2 -0
- package/src/providers/cursor/index.ts +2 -0
- package/src/providers/index.ts +0 -2
- package/src/providers/provider.port.ts +1 -0
package/dist/tlc-cli.mjs
CHANGED
|
@@ -210,5 +210,5 @@ PROJECT
|
|
|
210
210
|
`)}function TV($){if(!K9($,n()))return[`tlc not linked — ${$} is not this machine's runtime home`];let Z=G9(),Q=C($,"bin","tlc");if(!N(Q))return[`tlc not linked — ${Q} is missing from the runtime`];let J=yJ(Q,C(Z,"tlc"));if(J.kind==="refused")return[`tlc not linked — ${J.reason}`];let q=[`tlc → ${J.target}`];if(!H9(Z))q.push(`${Z} is not on PATH — add it, or use the shim npm installed`);return q}function PV($,Z){let Q=[],J=vJ($);if(J.seeded)Q.push(`config seeded → ${J.path}`);if(!N(C($,"skills","harness-init")))return{lines:Q,missingSkill:!0};let q=K.skill.skillLinks($,V9(),N);if(q.length===0)Q.push("no provider config dir found — skill not linked");for(let Y of q){let W=wJ(Y.source,Y.target);Q.push(W.kind==="refused"?`skill not linked — ${W.reason}`:`skill → ${W.target}`)}if(Q.push(...TV($)),(O(process.execPath,[C($,"bin","write-user-hooks.mjs")],{stdio:"inherit",env:{...process.env,TLC_HOME:Z}}).status??1)!==0)Q.push("hooks unchanged (merge manually or: node bin/write-user-hooks.mjs --force)");return{lines:Q,missingSkill:!1}}function o5(){return C(u$(),"bin","tlc-exec.mjs")}function t5(){return C(u$(),"bin","tlc-build.mjs")}function AV($){let Z=($[0]??"status").toLowerCase();switch(Z){case"status":case"st":case"s":return{kind:"status"};case"build":case"rebuild":return{kind:"build"};case"update":case"upgrade":{let Q=$.slice(1);if(Q.includes("--check"))return{kind:"update-check"};let J=m$(Q);if(J.length>0)throw new I(J[0]==="--force"?`update takes no --force: a managed runtime is already reset to upstream, and a linked clone is never written to. If update cannot move it, install the package instead: npm i -g ${f}@latest.`:`unknown flag: ${J[0]}
|
|
211
211
|
usage: tlc harness update [--check]`);return{kind:"update"}}case"version":case"--version":return{kind:"version"};case"test":return{kind:"test"};case"grind":case"g":{let Q=($[1]??"on").toLowerCase();if(Q==="on"||Q==="1"||Q==="true")return{kind:"grind",on:!0};if(Q==="off"||Q==="0"||Q==="false")return{kind:"grind",on:!1};throw new I("usage: tlc harness grind [on|off]")}case"pause":case"p":return{kind:"pause"};case"resume":case"r":return{kind:"resume"};case"reset":return{kind:"reset"};case"mode":case"m":{let Q=$[1];if(!Q)throw new I("usage: tlc harness mode <solo|paired|focus>");return{kind:"mode",value:Q}}case"attest":return{kind:"attest"};case"handoff":return{kind:"handoff"};case"policy":{let Q=($[1]??"").toLowerCase();if(!Q)return{kind:"policy",accept:[]};if(Q!=="accept")throw new I("usage: tlc harness policy [accept <path> [path...]]");return{kind:"policy",accept:$.slice(2)}}case"gate":{let Q=FV[($[1]??"").toLowerCase()];if(!Q)throw new I("usage: tlc harness gate <test-command|lint-command> <command> [args...]");return{kind:"gate",field:Q,argv:$.slice(2)}}case"prices":{let Q=($[1]??"").toLowerCase();if(!Q||Q==="help"||Q==="-h"||Q==="--help")return{kind:"prices-help"};if(Q==="refresh")return{kind:"prices-refresh",scope:$[2]??"all"};if(Q==="lookup"||Q==="get"){let J=$[2];if(!J)throw new I(`usage: tlc harness prices lookup <model-id> [provider]
|
|
212
212
|
detail: tlc harness help prices`);return{kind:"prices-lookup",modelId:J,provider:$[3]??""}}throw new I(`usage: tlc harness prices refresh [all|cursor|litellm] | tlc harness prices lookup <model>
|
|
213
|
-
detail: tlc harness help prices`)}case"obs":case"o":return{kind:"entry",entry:"obs-cli",args:$.slice(1)};case"doctor":case"doc":return{kind:"entry",entry:"doctor",args:$.slice(1)};case"lessons":case"lesson":return{kind:"entry",entry:"lessons-cli",args:$.slice(1)};case"init":return{kind:"entry",entry:"init-project",args:$.slice(1)};case"install":return{kind:"install",args:$.slice(1)};case"uninstall":return{kind:"entry",entry:"uninstall-runtime",args:$.slice(1)};case"why":return{kind:"entry",entry:"obs-cli",args:["why",...$.slice(1)]};case"help":case"-h":case"--help":{let Q=$[1];if(!Q)return{kind:"help"};return{kind:"entry",entry:"help-topic",args:[Q]}}default:return{kind:"unknown",cmd:Z}}}var hJ=["--import","./tools/test-env.mjs"],RV=80;function EV(){return[{label:"biome check",bin:"npx",args:["biome","check","--error-on-warnings"]},{label:"tsc --noEmit",bin:"npx",args:["tsc","--noEmit"]},{label:"src suite",bin:"node",args:[...hJ,"--test","src/**/__test__/*.test.ts"]},{label:"tools suite",bin:"node",args:[...hJ,"--test","tools/__test__/*.test.ts"]},{label:"knip: dead files and dependencies",bin:"npx",args:["knip","--files","--dependencies"]},{label:"knip: unused exports do not grow",bin:"npx",args:["knip","--exports","--max-issues",String(RV)]},{label:"check-boundaries",bin:"node",args:["tools/dev/check-boundaries.ts"]},{label:"check-suppressions",bin:"node",args:["tools/dev/check-suppressions.ts"]},{label:"check-wiring",bin:"node",args:["tools/dev/check-wiring.ts"]},{label:"check-docs-bundle",bin:"node",args:["tools/dev/check-docs-bundle.ts"]},{label:"check-decisions",bin:"node",args:["tools/dev/check-decisions.ts"]},{label:"check-screens",bin:"node",args:["tools/dev/check-screens.ts"]},{label:"check-obs-contract",bin:"node",args:["tools/dev/check-obs-contract.ts"]},{label:"check-manifest",bin:"node",args:["tools/dev/check-manifest.ts"]},{label:"capabilities in sync",bin:"node",args:["tools/dev/render-capabilities.ts","--check"]},{label:"provider docs in sync",bin:"node",args:["tools/dev/render-provider-docs.ts","--check"]},{label:"changelog in sync",bin:"node",args:["tools/dev/render-changelog.ts","--check"]},{label:"log in sync",bin:"node",args:["tools/dev/render-log.ts","--check"]},{label:"coverage in sync",bin:"node",args:["tools/dev/render-coverage.ts","--check"]}]}function kV($,Z,Q=(J,q,X)=>O(J,q,{cwd:X,stdio:"inherit"})){for(let J of $){console.log(`tlc harness test: running ${J.label}`);let X=Q(J.bin,J.args,Z).status??1;if(X!==0)return console.error(`tlc harness test: FAILED at "${J.label}" (exit ${X})`),X}return console.log("tlc harness test: all steps passed"),0}function xV($,Z){let Q=K.capability.loadCatalog(Z),J=K.capability.readProjectPolicyRaw($);if(!Q||!J)return;let q=K.capability.readRuntimeSeen($),X=K.capability.listNewlyAnnounceable(K.policy.loadPolicy($),Q,q.catalogVersion);if(X.length===0)return;console.log(""),console.log(K.capability.formatCapabilityDigest(X)),console.log(""),K.capability.writeRuntimeSeen($,Q.catalogVersion)}function SV($,Z,Q){let J=s8(Z).revision;if(J===null)return;let q=K.release.readReleaseSeen($)?.revision??Q;if(q===null||q===J){K.release.writeReleaseSeen($,J);return}let X=O("git",["-C",Z,"diff","--name-only","--diff-filter=A",`${q}..${J}`,"--","docs/decisions"],{encoding:"utf8",env:process.env});if((X.status??1)!==0){console.log(`update: cannot list what landed since ${q} — that revision is no longer in the checkout`),K.release.writeReleaseSeen($,J);return}let Y=(X.stdout??"").split(`
|
|
213
|
+
detail: tlc harness help prices`)}case"obs":case"o":return{kind:"entry",entry:"obs-cli",args:$.slice(1)};case"doctor":case"doc":return{kind:"entry",entry:"doctor",args:$.slice(1)};case"lessons":case"lesson":return{kind:"entry",entry:"lessons-cli",args:$.slice(1)};case"init":return{kind:"entry",entry:"init-project",args:$.slice(1)};case"install":return{kind:"install",args:$.slice(1)};case"uninstall":return{kind:"entry",entry:"uninstall-runtime",args:$.slice(1)};case"why":return{kind:"entry",entry:"obs-cli",args:["why",...$.slice(1)]};case"help":case"-h":case"--help":{let Q=$[1];if(!Q)return{kind:"help"};return{kind:"entry",entry:"help-topic",args:[Q]}}default:return{kind:"unknown",cmd:Z}}}var hJ=["--import","./tools/test-env.mjs"],RV=80;function EV(){return[{label:"biome check",bin:"npx",args:["biome","check","--error-on-warnings","--max-diagnostics=none"]},{label:"tsc --noEmit",bin:"npx",args:["tsc","--noEmit"]},{label:"src suite",bin:"node",args:[...hJ,"--test","src/**/__test__/*.test.ts"]},{label:"tools suite",bin:"node",args:[...hJ,"--test","tools/__test__/*.test.ts"]},{label:"knip: dead files and dependencies",bin:"npx",args:["knip","--files","--dependencies"]},{label:"knip: unused exports do not grow",bin:"npx",args:["knip","--exports","--max-issues",String(RV)]},{label:"check-boundaries",bin:"node",args:["tools/dev/check-boundaries.ts"]},{label:"check-complexity",bin:"node",args:["tools/dev/check-complexity.ts"]},{label:"check-suppressions",bin:"node",args:["tools/dev/check-suppressions.ts"]},{label:"check-wiring",bin:"node",args:["tools/dev/check-wiring.ts"]},{label:"check-docs-bundle",bin:"node",args:["tools/dev/check-docs-bundle.ts"]},{label:"check-decisions",bin:"node",args:["tools/dev/check-decisions.ts"]},{label:"check-screens",bin:"node",args:["tools/dev/check-screens.ts"]},{label:"check-obs-contract",bin:"node",args:["tools/dev/check-obs-contract.ts"]},{label:"check-manifest",bin:"node",args:["tools/dev/check-manifest.ts"]},{label:"capabilities in sync",bin:"node",args:["tools/dev/render-capabilities.ts","--check"]},{label:"provider docs in sync",bin:"node",args:["tools/dev/render-provider-docs.ts","--check"]},{label:"changelog in sync",bin:"node",args:["tools/dev/render-changelog.ts","--check"]},{label:"log in sync",bin:"node",args:["tools/dev/render-log.ts","--check"]},{label:"coverage in sync",bin:"node",args:["tools/dev/render-coverage.ts","--check"]}]}function kV($,Z,Q=(J,q,X)=>O(J,q,{cwd:X,stdio:"inherit"})){for(let J of $){console.log(`tlc harness test: running ${J.label}`);let X=Q(J.bin,J.args,Z).status??1;if(X!==0)return console.error(`tlc harness test: FAILED at "${J.label}" (exit ${X})`),X}return console.log("tlc harness test: all steps passed"),0}function xV($,Z){let Q=K.capability.loadCatalog(Z),J=K.capability.readProjectPolicyRaw($);if(!Q||!J)return;let q=K.capability.readRuntimeSeen($),X=K.capability.listNewlyAnnounceable(K.policy.loadPolicy($),Q,q.catalogVersion);if(X.length===0)return;console.log(""),console.log(K.capability.formatCapabilityDigest(X)),console.log(""),K.capability.writeRuntimeSeen($,Q.catalogVersion)}function SV($,Z,Q){let J=s8(Z).revision;if(J===null)return;let q=K.release.readReleaseSeen($)?.revision??Q;if(q===null||q===J){K.release.writeReleaseSeen($,J);return}let X=O("git",["-C",Z,"diff","--name-only","--diff-filter=A",`${q}..${J}`,"--","docs/decisions"],{encoding:"utf8",env:process.env});if((X.status??1)!==0){console.log(`update: cannot list what landed since ${q} — that revision is no longer in the checkout`),K.release.writeReleaseSeen($,J);return}let Y=(X.stdout??"").split(`
|
|
214
214
|
`).map((z)=>z.trim().split("/").pop()??"").filter(Boolean),W=K.release.formatDecisionDigest(K.release.readDecisions(Z,Y));if(W!=="")console.log(""),console.log(W),console.log("");K.release.writeReleaseSeen($,J)}function bV($){let Z=u$(),Q=s8(Z).revision,J=i(),q=gJ(Z);if(console.log(`update: runtime → ${Z} (${q??"unknown"})`),!N(C(Z,"bin","tlc-exec.mjs")))console.error(`update: missing install at ${J}`),console.error(`update: install once with \`npm i -g ${f}\`, then \`tlc harness install\`, then retry.`),process.exit(1);let X=XV(J);if(X==="linked")console.log(WV(J,Z===J?null:Z));else if(X==="npm"){let V=O("npm",["install","-g",`${f}@latest`],{stdio:"inherit",env:process.env,shell:!0});if((V.status??1)!==0)console.error(GV()),process.exit(V.status??1);let G=rJ();if(G===null)console.error(DV(J)),process.exit(1);let B=oJ(G),H=O(B.command,B.args,{stdio:"inherit",env:{...process.env,...B.env}});if((H.status??1)!==0)process.exit(H.status??1);console.log(LV(q,gJ(Z)))}else if(X==="unmanaged")console.log(VV(Z));else{let V=O("git",["-C",Z,"fetch","origin"],{stdio:"inherit",env:process.env});if((V.status??1)!==0)console.error(zV(Z)),process.exit(V.status??1);let G=aJ(Z),B=O("git",["-C",Z,"reset","--hard",G],{encoding:"utf8",env:process.env});if((B.status??1)!==0)console.error(BV(Z,G,`${B.stderr??""}${B.stdout??""}`)),process.exit(B.status??1);let H=s8(Z).revision;console.log(Q===H?`update: runtime already at ${H??"unknown"} — nothing to move`:`update: runtime ${Q??"unknown"} → ${H??"unknown"}`)}let Y=PV(Z,J);for(let V of Y.lines)console.log(`update: ${V}`);if(Y.missingSkill)console.error(`update: missing skill at ${C(Z,"skills","harness-init")}`),process.exit(1);let W=YV(Z);if(W.length===0)console.log("update: dist/ complete — no rebuild, so the runtime path stays clean");else if(N(t5())){if(console.log(`update: ${W.length} bundle(s) missing — building`),(O(process.execPath,[t5()],{stdio:"inherit",env:process.env}).status??1)!==0)console.log(`update: build failed — ${W.length} bundle(s) still missing from dist/`)}xV($,Z),SV($,Z,Q),O(process.execPath,[o5(),"refresh-model-prices","all","--if-stale"],{stdio:"inherit",env:{...process.env,TLC_PROJECT_DIR:$}}),console.log("update: running doctor…");let z=O(process.execPath,[o5(),"doctor"],{stdio:"inherit",env:{...process.env,TLC_PROJECT_DIR:$}});console.log("update: ok — reload if hooks/skill should refresh"),process.exit(z.status??0)}function a8($,Z,Q){let J=O(process.execPath,[o5(),$,...Z],{stdio:"inherit",env:{...process.env,TLC_PROJECT_DIR:Q}});process.exit(J.status??1)}function wV($,Z){let Q=$.includes("--link")?null:rJ();if(Q===null)a8("install-runtime",$,Z);let J=oJ(Q),q=O(J.command,[...J.args,...$],{stdio:"inherit",env:{...process.env,...J.env,TLC_PROJECT_DIR:Z}});process.exit(q.status??1)}async function yV($){let Z=vz();if(($[0]??"").toLowerCase()!=="harness")console.error(`unknown: ${$[0]??""}`),console.error("usage: tlc harness <status|doctor|help|grind|pause|resume|reset|mode|obs|prices|lessons|init|update|test|build>"),process.exit(1);let{json:J,rest:q}=RJ($.slice(1)),X;try{X=AV(q)}catch(Y){if(Y instanceof I)console.error(Y.message),process.exit(1);throw Y}switch(X.kind){case"status":{let Y=m$(q.slice(1));if(Y.length>0)console.error(`unknown flag: ${Y[0]}`),console.error("usage: tlc harness status [--json]"),process.exit(1);if(J)t(nJ(Z));else console.log(pz(Z,b()));break}case"handoff":{let Y=m$(q.slice(1));if(Y.length>0)console.error(`unknown flag: ${Y[0]}`),console.error("usage: tlc harness handoff [--json]"),process.exit(1);let W=nz(Z);if(J)t(W);else console.log(sz(W));break}case"attest":{let Y=m$(q.slice(1));if(Y.length>0)console.error(`unknown flag: ${Y[0]}`),console.error("usage: tlc harness attest [--json]"),process.exit(1);let W=tz(Z);if(J)t(W);else console.log(oz(Z,b()));process.exit(W.ok?0:1);break}case"policy":{if(X.accept.length===0&&!q.includes("accept")){if(J)t(QV(Z));else console.log(ZV(Z,b()));break}try{console.log(ez(Z,X.accept,Boolean(process.stdin.isTTY)))}catch(Y){if(Y instanceof I)console.error(Y.message),process.exit(1);throw Y}break}case"help":console.log(uJ(b()));break;case"build":{let Y=O(process.execPath,[t5()],{stdio:"inherit",env:process.env});process.exit(Y.status??1);break}case"version":if(J)t(sJ(Z));else console.log(HV(Z,b()));break;case"update-check":{let Y=u$(),W=KV(Y,aJ(Y));if(J)t(W);else console.log(CV(W,b()));break}case"update":bV(Z);break;case"test":{let Y=kV(EV(),process.cwd());process.exit(Y);break}case"grind":console.log(cz(Z,X.on));break;case"pause":console.log(mJ(Z,!0));break;case"resume":console.log(mJ(Z,!1));break;case"reset":console.log(await dz(Z));break;case"mode":try{console.log(iz(Z,X.value))}catch(Y){if(Y instanceof I)console.error(Y.message),process.exit(1);throw Y}break;case"gate":try{console.log(IV(Z,X.field,X.argv,process.stdin.isTTY===!0))}catch(Y){if(Y instanceof I)console.error(Y.message),process.exit(1);throw Y}break;case"prices-help":console.log(jV(b()));break;case"prices-refresh":a8("refresh-model-prices",[X.scope],Z);break;case"prices-lookup":a8("price-lookup",[X.modelId,...X.provider?[X.provider]:[],...J?[r5]:[]],Z);break;case"install":wV(X.args,Z);break;case"entry":a8(X.entry,J?[...X.args,r5]:X.args,Z);break;case"unknown":console.error(`unknown: ${X.cmd}`),console.log(uJ(b())),process.exit(1)}}if(X9.main==X9.module)yV(process.argv.slice(2)).catch(($)=>{console.error($ instanceof Error?$.message:String($)),process.exit(1)});export{PV as wireRuntime,HV as versionText,UV as versionScreen,LV as versionMoveLine,sJ as versionJson,aJ as upstreamRef,VV as unmanagedRuntimeMessage,pz as statusText,hz as statusScreen,nJ as statusJson,lJ as skipFlagPath,mJ as setPaused,iz as setMode,cz as setGrind,IV as setGateCommand,gJ as runtimeVersion,s8 as runtimeRevision,XV as runtimePathKind,kV as runTestSteps,AV as route,vz as resolveProjectRoot,u$ as resolveHarnessRoot,OV as resolveExecutable,dz as resetStuckState,BV as resetFailureMessage,NF as readMode,jV as pricesHelpText,NV as pricesHelpScreen,ZV as policyText,$V as policyScreen,QV as policyJson,KV as pendingUpdate,CV as pendingText,MV as pendingScreen,_F as pairedFlagPath,GV as npmUpdateFailureMessage,oJ as npmSyncPlan,DV as npmRootFailureMessage,mz as modeFilePath,YV as missingBundles,WV as linkedRuntimeMessage,TV as launcherLines,uJ as helpText,_V as helpScreen,sz as handoffText,az as handoffScreen,nz as handoffJson,jF as grindOn,uz as grindFlagPath,rJ as globalPackageRoot,gz as gatesPaused,IF as focusFlagPath,zV as fetchFailureMessage,o5 as execBinPath,$9 as ensureFlagsDir,qV as classifyRuntimePath,EV as buildTestSteps,t5 as buildBinPath,oz as attestText,rz as attestScreen,tz as attestJson,iJ as acceptedModes,ez as acceptPolicy,I as UsageError,hJ as TEST_ENV_IMPORT,f as NPM_PACKAGE,JV as NPM_MARKER,RV as KNIP_EXPORTS_CEILING};
|