@team-semicolon/semicolony-cli 4.18.63 → 4.18.64
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/bundle.js +1 -1
- package/package.json +1 -1
package/dist/bundle.js
CHANGED
|
@@ -3174,7 +3174,7 @@ ${a}${i}`;if(s===0){let d=t.length===0||t.endsWith(`
|
|
|
3174
3174
|
`,r)&&(r+=1),t.slice(r,e.end)}function lWt(t,e){return uI(t)===e?!0:t.endsWith(`
|
|
3175
3175
|
`)&&uI(t.slice(0,-1))===e}function uWt(t,e){let n=GJ(e,"BEGIN"),r=GJ(e,"END"),i=t.indexOf(n),s=t.indexOf(r,i+n.length);if(i<0||s<i)throw new Error(`worker release context ${e} has unpaired managed markers`);return`${t.slice(0,i)}${t.slice(s+r.length)}`}function yWt(t,e,n,r){let i=aWt(t,"Claude"),s=aWt(e,"Codex"),o=new Set(n.manifest.contexts.map(({id:l})=>l)),a=new Set([...i.keys(),...s.keys()]),c=[];for(let l of a){if(!i.has(l)||!s.has(l))throw new Error(`worker release context ${l} is not present in both harnesses`);if(!o.has(l)){let u=r?.managed_target_digests[`context:claude:${l}`],d=r?.managed_target_digests[`context:codex:${l}`];if(!u||!d)throw new Error(`worker release context ${l} is an orphan managed marker`);if(!lWt(cWt(t,i.get(l)),u)||!lWt(cWt(e,s.get(l)),d))throw new Error(`worker release context ${l} changed since the prior managed snapshot; refusing removal`);c.push(l)}}return c}function HJ(t){let e=ph(t);if(!e)return"";if(!e.isFile()||e.isSymbolicLink())throw new Error("worker release context target is not a regular file");return bt.readFileSync(t,"utf8")}function Wqr(t,e,n){let r=Ft.join(t,".claude","CLAUDE.md"),i=Ft.join(t,".codex","AGENTS.md"),s=HJ(r),o=HJ(i),a=yWt(s,o,e,n);for(let c of a)s=uWt(s,c),o=uWt(o,c);for(let c of e.manifest.contexts)s=oWt(s,c.id,c.claude_content),o=oWt(o,c.id,c.codex_content);return[{key:"context-file:claude",targetPath:r,content:Buffer.from(s),mode:384},{key:"context-file:codex",targetPath:i,content:Buffer.from(o),mode:384},...e.manifest.skills.flatMap(c=>[{key:`skill:claude:${c.name}`,targetPath:Ft.join(t,".claude","skills",c.name,"SKILL.md"),content:Buffer.from(c.content),mode:420},{key:`skill:agents:${c.name}`,targetPath:Ft.join(t,".agents","skills",c.name,"SKILL.md"),content:Buffer.from(c.content),mode:420}]),...e.manifest.assets.map(c=>({key:`asset:${c.target}`,targetPath:cBe(t,c.target),content:c.content,mode:c.mode==="0755"?493:420}))]}function Vqr(t,e){yWt(HJ(Ft.join(t,".claude","CLAUDE.md")),HJ(Ft.join(t,".codex","AGENTS.md")),e,null)}function Yqr(t,e){let n=/^skill:(claude|agents):([a-z0-9][a-z0-9-]*)$/.exec(e);if(n){let r=n[1]==="claude"?".claude":".agents";return Ft.join(t,r,"skills",n[2],"SKILL.md")}if(e.startsWith("asset:")){let r=e.slice(6);if(!gWt.has(r))throw new Error(`worker release prior state has an unknown managed asset target: ${r}`);return cBe(t,r)}if(/^context:(claude|codex):[a-z0-9][a-z0-9-]*$/.test(e))return null;throw new Error(`worker release prior state has an unknown managed target: ${e}`)}function Jqr(t,e,n){if(!n)return[];let r=EWt(e),i=[];for(let[s,o]of Object.entries(n.managed_target_digests)){let a=Yqr(t,s);if(r[s]||a===null)continue;Su(t,a);let c=ph(a);if(c){if(!c.isFile()||c.isSymbolicLink())throw new Error(`worker release managed target ${s} is not a regular file`);if(uI(bt.readFileSync(a))!==o)throw new Error(`worker release managed target ${s} digest changed; refusing removal`);i.push({key:s,targetPath:a})}}return i}function Kqr(t,e){let n=new Map,r=Ft.join(t,"staged");return bt.mkdirSync(r,{recursive:!0,mode:448}),e.forEach((i,s)=>{let o=Ft.join(r,`target-${s}`);bt.writeFileSync(o,i.content,{mode:i.mode}),bt.chmodSync(o,i.mode),n.set(i.key,o)}),n}function lBe(t,e){let n=[],r=Ft.dirname(t);for(;!ph(r);){n.push(r);let i=Ft.dirname(r);if(i===r)break;r=i}bt.mkdirSync(Ft.dirname(t),{recursive:!0,mode:448}),e.push(...n.reverse())}function zqr(t,e,n){let r=Ft.join(t,"backup");return bt.mkdirSync(r,{recursive:!0,mode:448}),e.map((i,s)=>{let o=ph(i),a=Ft.join(r,`target-${s}`);if(!o)return{targetPath:i,backupPath:a,existed:!1};if(!o.isFile()||o.isSymbolicLink())throw new Error("worker release backup target is not a regular file");return lBe(a,n),bt.copyFileSync(i,a),bt.chmodSync(a,o.mode&511),{targetPath:i,backupPath:a,existed:!0,mode:o.mode&511}})}function bWt(t,e,n){let r=Ft.join(Ft.dirname(e),`.semo-worker-release-${process.pid}-${Date.now()}.tmp`);try{bt.copyFileSync(t,r),bt.chmodSync(r,n),bt.renameSync(r,e)}catch(i){try{bt.unlinkSync(r)}catch(s){s.code}throw i}}function Zqr(t,e,n){for(let r of t){let i=e.get(r.key);if(!i)throw new Error("worker release staged target is missing");lBe(r.targetPath,n),bWt(i,r.targetPath,r.mode)}}function Xqr(t){for(let e of t){let n=ph(e.targetPath);if(n){if(!n.isFile()||n.isSymbolicLink())throw new Error(`worker release managed target ${e.key} cannot be removed safely`);bt.unlinkSync(e.targetPath)}}}function EWt(t){let e={};for(let n of t.manifest.contexts)e[`context:claude:${n.id}`]=uI(n.claude_content),e[`context:codex:${n.id}`]=uI(n.codex_content);for(let n of t.manifest.skills)e[`skill:claude:${n.name}`]=n.sha256.toLowerCase(),e[`skill:agents:${n.name}`]=n.sha256.toLowerCase();for(let n of t.manifest.assets)e[`asset:${n.target}`]=n.sha256.toLowerCase();return e}function ejr(t){let e={};for(let n of t.manifest.skills)e[`skill:claude:${n.name}`]="0644",e[`skill:agents:${n.name}`]="0644";for(let n of t.manifest.assets)e[`asset:${n.target}`]=n.mode;return e}function dWt(t,e){if(t.exitCode!==0||t.summary.fail>0)return"fail";let n=new Map(t.checks.map(r=>[r.id,r.level]));return e.some(r=>n.get(r)!=="ok")?"fail":t.summary.warn>0||t.checks.some(r=>r.level==="warn")?"warn":"pass"}function aBe(t,e="doctor"){return{phase:e,summary:t.summary,checks:t.checks.map(({id:n,level:r})=>({id:n,level:r}))}}function tjr(t,e,n){Su(t,e),bt.mkdirSync(Ft.dirname(e),{recursive:!0,mode:448}),Su(t,e);let r;try{r=bt.openSync(e,"wx",384)}catch(s){throw s.code==="EEXIST"?new Error("worker release update is already in progress"):s}try{bt.writeFileSync(r,`${JSON.stringify({schema_version:1,pid:process.pid,started_at:n.toISOString()})}
|
|
3176
3176
|
`,"utf8"),bt.fsyncSync(r)}catch(s){try{bt.closeSync(r)}catch{}try{bt.unlinkSync(e)}catch{}throw s}let i=bt.fstatSync(r);return()=>{let s=!0;try{bt.closeSync(r)}catch{s=!1}try{Su(t,e);let o=ph(e);if(!o)return s;if(o.isSymbolicLink()||!o.isFile()||o.dev!==i.dev||o.ino!==i.ino)return!1;bt.unlinkSync(e)}catch{s=!1}return s}}function njr(t){for(let e of[...t].reverse())try{bt.rmdirSync(e)}catch(n){if(!["ENOENT","ENOTEMPTY"].includes(n.code??""))throw n}}function rjr(t,e,n){for(let r of[...e].reverse()){Su(t,r.targetPath);let i=ph(r.targetPath);if(i?.isDirectory())throw new Error("worker release rollback target became a directory");i&&bt.unlinkSync(r.targetPath),r.existed&&(lBe(r.targetPath,n),bWt(r.backupPath,r.targetPath,r.mode??384))}njr(n)}function ijr(t,e){let n=Ft.resolve(jo(t).root),r=Ft.relative(n,Ft.resolve(e));if(r===""||r.startsWith("..")||Ft.isAbsolute(r))throw new Error("worker release diagnostic escapes the worker root")}function sjr(t,e,n,r){ijr(t,e),Su(t,e),bt.mkdirSync(Ft.dirname(e),{recursive:!0,mode:448}),Su(t,e);let i=Ft.join(Ft.dirname(e),`.release-update-rollback-failure-${process.pid}-${Date.now()}.tmp`);Su(t,i);let s=`${JSON.stringify({schema_version:1,release_id:n,rollback_failed:!0,recorded_at:r.toISOString()},null,2)}
|
|
3177
|
-
`,o;try{o=bt.openSync(i,"wx",384),bt.writeFileSync(o,s,"utf8"),bt.fsyncSync(o),bt.closeSync(o),o=void 0,Su(t,e),bt.renameSync(i,e)}catch(a){if(o!==void 0)try{bt.closeSync(o)}catch{}try{bt.unlinkSync(i)}catch{}throw a}}function sBe(t,e){try{Su(t,Ft.join(e,".cleanup-safety-check"));let n=ph(e);return n?!n.isDirectory()||n.isSymbolicLink()?!1:(bt.rmSync(e,{recursive:!0,force:!0}),!0):!0}catch{return!1}}function AWt(t,e){try{Su(t,e);let n=ph(e);return n?!n.isFile()||n.isSymbolicLink()?!1:(bt.unlinkSync(e),!0):!0}catch{return!1}}async function bb(t,e,n,r={}){let i={release_id:e.releaseId,manifest_sha256:e.manifestSha256,doctor_status:r.doctorStatus??"fail",doctor_summary:r.doctorReport?{...aBe(r.doctorReport,n),rollback:r.rollback??"not-needed"}:{phase:n,rollback:r.rollback??"not-needed"}};try{await t.reportUpdate(i)}catch{}}async function wWt(t){let e=t.env??process.env,n=t.homeDir??e.HOME??fWt.homedir(),r=t.surface??"semicolony",i=t.client??qH({env:e,surface:r,fetchImpl:t.fetchImpl}),s=t.doctor??(h=>aT({env:e,homeDir:n,surface:r,fetchImpl:t.fetchImpl,runExternalChecks:!
|
|
3177
|
+
`,o;try{o=bt.openSync(i,"wx",384),bt.writeFileSync(o,s,"utf8"),bt.fsyncSync(o),bt.closeSync(o),o=void 0,Su(t,e),bt.renameSync(i,e)}catch(a){if(o!==void 0)try{bt.closeSync(o)}catch{}try{bt.unlinkSync(i)}catch{}throw a}}function sBe(t,e){try{Su(t,Ft.join(e,".cleanup-safety-check"));let n=ph(e);return n?!n.isDirectory()||n.isSymbolicLink()?!1:(bt.rmSync(e,{recursive:!0,force:!0}),!0):!0}catch{return!1}}function AWt(t,e){try{Su(t,e);let n=ph(e);return n?!n.isFile()||n.isSymbolicLink()?!1:(bt.unlinkSync(e),!0):!0}catch{return!1}}async function bb(t,e,n,r={}){let i={release_id:e.releaseId,manifest_sha256:e.manifestSha256,doctor_status:r.doctorStatus??"fail",doctor_summary:r.doctorReport?{...aBe(r.doctorReport,n),rollback:r.rollback??"not-needed"}:{phase:n,rollback:r.rollback??"not-needed"}};try{await t.reportUpdate(i)}catch{}}async function wWt(t){let e=t.env??process.env,n=t.homeDir??e.HOME??fWt.homedir(),r=t.surface??"semicolony",i=t.client??qH({env:e,surface:r,fetchImpl:t.fetchImpl}),s=t.doctor??(h=>aT({env:e,homeDir:n,surface:r,fetchImpl:t.fetchImpl,runExternalChecks:!0,commandRunner:t.commandRunner,updateInProgress:h?.updateInProgress===!0})),o=await i.fetchActiveRelease(),a=mWt(o),c;try{c=Gqr(o)}catch(h){throw t.check||await bb(i,a,"validation"),h}try{sWt(n,c)}catch(h){throw t.check||await bb(i,a,"preflight"),h}let l=jo(n);if(t.check){let h=ew(l.releaseState),f=h?.applied_release_id===c.releaseId&&h.manifest_sha256===c.manifestSha256;return{mode:"check",installed:h?.applied_release_version??null,target:c.version,up_to_date:f,status:f?"pass":"available"}}let u=(t.now??(()=>new Date))(),d=tjr(n,l.updateLock,u),A={mode:"update",installed:c.version,target:c.version,up_to_date:!0,status:"pass"};try{try{sWt(n,c)}catch(V){throw await bb(i,a,"preflight"),V}let h=ew(l.releaseState);if(h?.applied_release_id===c.releaseId&&h.manifest_sha256===c.manifestSha256){try{Vqr(n,c)}catch(K){throw await bb(i,a,"projection-validation"),K}let V;try{V=await s({updateInProgress:!1});let K=dWt(V,c.manifest.required_doctor_checks);if(K!=="pass")throw await bb(i,a,"doctor",{doctorStatus:K,doctorReport:V}),new fQ(K,V);let z=await i.reportUpdate({release_id:c.releaseId,manifest_sha256:c.manifestSha256,doctor_status:"pass",doctor_summary:aBe(V),applied_at:u.toISOString()});if(!z.reported||!z.applied)throw new Error("worker release Gateway did not accept the pass report");return A}catch(K){throw K instanceof fQ||await bb(i,a,V?"report":"doctor",{doctorReport:V}),K}}let g=Ft.join(n,".semo","staging","worker-release",c.releaseId),m={schema_version:1,profile_id:ud(l.workerState)?.profile_id??YG,applied_release_id:c.releaseId,applied_release_version:c.version,manifest_sha256:c.manifestSha256,managed_target_digests:EWt(c),managed_target_modes:ejr(c),applied_at:u.toISOString(),last_doctor_status:"pass",last_doctor_at:u.toISOString()},y,b;try{y=Wqr(n,c,h),b=Jqr(n,c,h)}catch(V){throw await bb(i,a,"projection-validation"),V}let w=[l.workerState,l.releaseState],E=[],C=[],v=!1,O="staging",R,Q=!1;try{Su(n,g);let V=Kqr(g,y);C=zqr(g,[...new Set([...y.map(({targetPath:ut})=>ut),...b.map(({targetPath:ut})=>ut),...w])],E),O="swap",Zqr(y,V,E),Xqr(b),v=!0,O="doctor",R=await s({updateInProgress:!0});let K=dWt(R,c.manifest.required_doctor_checks);if(K!=="pass")throw new fQ(K,R);O="state";let z=ud(l.workerState);z&&!ph(l.workerState)&&wx(l.workerState,z),nKe(l.releaseState,m),O="report";let fe=await i.reportUpdate({release_id:c.releaseId,manifest_sha256:c.manifestSha256,doctor_status:"pass",doctor_summary:aBe(R),applied_at:u.toISOString()});if(!fe.reported||!fe.applied)throw new Error("worker release Gateway did not accept the pass report");return Q=!0,sBe(n,g),AWt(n,l.rollbackFailure),A}catch(V){if(Q)return sBe(n,g),AWt(n,l.rollbackFailure),A;let K="not-needed";if(v||C.length>0)try{rjr(n,C,E),K="pass"}catch{K="fail";try{sjr(n,l.rollbackFailure,c.releaseId,u)}catch{}}sBe(n,g);let z=V instanceof fQ?V:null;throw await bb(i,a,O,{doctorStatus:z?.doctorStatus,doctorReport:z?.report??R,rollback:K}),V}}finally{d()}}function CWt(t){return[`installed=${t.installed??"none"}`,`target=${t.target}`,`up_to_date=${String(t.up_to_date)}`,`status=${t.status}`].join(`
|
|
3178
3178
|
`)}function IWt(t,e={}){let n=e.surface??"semicolony",r=qA(n),i=t.command("worker").description(n==="semo-ops"?"SEMO Ops worker device setup, verification, and sync":"Worker operator-kit setup, verification, and sync");iWt(i,r),i.command("update").description("\uD65C\uC131 SEMO Ops worker release\uB97C Gateway\uC5D0\uC11C \uD655\uC778\uD558\uAC70\uB098 \uBA85\uC2DC\uC801\uC73C\uB85C \uC801\uC6A9\uD569\uB2C8\uB2E4").option("--check","\uD65C\uC131 release\uC640 local release state\uB9CC \uBE44\uAD50\uD558\uACE0 \uC544\uBB34\uAC83\uB3C4 \uC4F0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4").option("--json","JSON \uCD9C\uB825").action(async o=>{try{let a=await wWt({check:o.check,surface:n});console.log(o.json?JSON.stringify(a,null,2):CWt(a)),process.exitCode=0}catch(a){console.error(im.default.red(`${r} worker update \uC2E4\uD328: ${a instanceof Error?a.message:a}`)),process.exitCode=1}}),i.command("register").description("SEMO Ops worker device\uB97C \uC911\uC559 DB registry\uC5D0 \uB4F1\uB85D/\uAC31\uC2E0\uD569\uB2C8\uB2E4").requiredOption("--worker <id>","worker id/domain, \uC608: roki").requiredOption("--device <id>","device id, \uC608: roki-pc").option("--display-name <name>","\uD45C\uC2DC\uBA85").option("--hostname <name>","\uD638\uC2A4\uD2B8\uBA85 (\uBBF8\uC9C0\uC815 \uC2DC \uD604\uC7AC \uBA38\uC2E0)").option("--os <name>","OS \uC124\uBA85 (\uBBF8\uC9C0\uC815 \uC2DC \uD604\uC7AC \uBA38\uC2E0)").option("--shell <path>","\uAE30\uBCF8 shell").option("--workspace-root <path>","workspace root").option("--profile-id <id>","installed profile id","semo-ops-worker").option("--profile-version <version>","installed profile version").option("--adapter <csv>","\uD65C\uC131 \uB3C4\uAD6C \uC5B4\uB311\uD130, \uC608: codex,claude-code").option("--kb-access-mode <mode>","worker-gateway|direct-db-bootstrap|kb-portable|none","worker-gateway").option("--credential-id <uuid>","gateway_credentials.id (\uD3C9\uBB38 \uD1A0\uD070 \uAE08\uC9C0)").option("--doctor-status <status>","unknown|pending|pass|warn|fail","pending").option("--doctor-summary-json <json>","doctor summary JSON object").option("--progress <key=value>","setup progress pair (repeatable)",(o,a)=>(a.push(o),a),[]).option("--progress-json <json>","setup progress JSON object").option("--status <status>","pending-auth|pending-setup|active|blocked|stale|revoked|retired","pending-setup").option("--metadata-json <json>","metadata JSON object").option("--json","JSON \uCD9C\uB825").action(async o=>{try{let a=tWt(o),c=await XHt({workerId:o.worker,deviceId:o.device,displayName:o.displayName,hostname:o.hostname,osName:o.os,shell:o.shell,workspaceRoot:o.workspaceRoot,installedProfileId:o.profileId,installedProfileVersion:o.profileVersion,toolAdaptersEnabled:a.toolAdaptersEnabled??[],kbAccessMode:o.kbAccessMode,gatewayCredentialId:o.credentialId,lastDoctorStatus:o.doctorStatus,lastDoctorSummary:a.lastDoctorSummary,setupProgress:a.setupProgress,status:o.status,metadata:a.metadata});o.json?console.log(JSON.stringify(HN(c),null,2)):console.log(nBe([c]))}catch(a){console.error(im.default.red(`${r} worker register \uC2E4\uD328: ${a instanceof Error?a.message:a}`)),process.exitCode=1}finally{await S()}}),i.command("status").description("\uC911\uC559 DB registry\uC758 SEMO Ops worker device \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4").option("--worker <id>","worker id/domain").option("--device <id>","device id").option("--json","JSON \uCD9C\uB825").action(async o=>{try{let a=await NJ({workerId:o.worker,deviceId:o.device});o.json?console.log(JSON.stringify(a.map(HN),null,2)):console.log(nBe(a))}catch(a){console.error(im.default.red(`${r} worker status \uC2E4\uD328: ${a instanceof Error?a.message:a}`)),process.exitCode=1}finally{await S()}}),i.command("local-hive").description("\uC608\uC678\uC801\uC778 local hive workload \uB4F1\uB85D/\uC870\uD68C").command("register").description("worker device\uC5D0 local hive exception\uC744 \uB4F1\uB85D/\uAC31\uC2E0\uD569\uB2C8\uB2E4").requiredOption("--hive <id>","local hive id").requiredOption("--device <id>","device id").requiredOption("--worker <id>","worker id/domain").requiredOption("--workload-type <type>","hive-bridge|hive-agent|hive-cron|hive-link|hive-watch|other").requiredOption("--reason <text>","\uB85C\uCEEC\uC5D0 \uB0A8\uACA8\uC57C \uD558\uB294 \uC774\uC720").requiredOption("--migration-target <target>","\uCD5C\uC885 \uC774\uAD00 \uB300\uC0C1, \uC608: hive@workstation").option("--cannot-move-reason <text>","\uC9C0\uAE08 \uC774\uAD00\uD560 \uC218 \uC5C6\uB294 \uC0C1\uC138 \uC0AC\uC720").option("--expiry-at <iso>","\uC608\uC678 \uB9CC\uB8CC \uC2DC\uAC01").option("--status <status>","approved|expiring|migrated|retired","approved").option("--json","JSON \uCD9C\uB825").action(async o=>{try{let a=await eWt({localHiveId:o.hive,deviceId:o.device,workerId:o.worker,workloadType:o.workloadType,reason:o.reason,migrationTarget:o.migrationTarget,cannotMoveReason:o.cannotMoveReason,expiryAt:o.expiryAt,status:o.status});o.json?console.log(JSON.stringify(a,null,2)):console.log(im.default.green(`\u2714 local hive \uB4F1\uB85D: ${a.local_hive_id}`))}catch(a){console.error(im.default.red(`${r} worker local-hive register \uC2E4\uD328: ${a instanceof Error?a.message:a}`)),process.exitCode=1}finally{await S()}}),i.command("setup").description("SEMO Ops worker device \uD658\uACBD\uC744 \uC124\uC815\uD569\uB2C8\uB2E4").option("--gateway-url <url>","worker profile KB gateway URL").option("--worker-token-env <name>","worker token env var name").option("--worker <id>","worker id/domain, \uC608: roki").option("--device <id>","device id, \uC608: roki-pc").option("--profile-version <version>","workspace profile version").option("--with-kb-mcp","read-only KB MCP config \uC0DD\uC131").option("-f, --force","\uAE30\uC874 worker env \uB36E\uC5B4\uC4F0\uAE30").action(async o=>{try{let a=await TJ({force:o.force,gatewayUrl:o.gatewayUrl,tokenEnv:o.workerTokenEnv,workerId:o.worker,deviceId:o.device,profileVersion:o.profileVersion,withKbMcp:o.withKbMcp,surface:n});console.log(OJ(a))}catch(a){console.error(im.default.red(`${r} worker setup \uC2E4\uD328: ${a instanceof Error?a.message:a}`)),process.exitCode=1}}),i.command("sync").description("\uD65C\uC131 SEMO Ops worker release\uC640 local release state\uB97C \uC810\uAC80\uD569\uB2C8\uB2E4").option("--dry-run","Gateway release\uC640 local state\uB97C \uBE44\uAD50\uD558\uACE0 \uC544\uBB34\uAC83\uB3C4 \uC4F0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4").action(async o=>{try{let a=o.dryRun?await sT({surface:n}):await Ynt({surface:n});console.log($H(a)),process.exitCode=a.summary.fail>0?1:0}catch(a){console.error(im.default.red(`${r} worker sync \uC2E4\uD328: ${a instanceof Error?a.message:a}`)),process.exitCode=1}}),i.command("daily-check").description("Claude/Codex \uC138\uC158 \uC2DC\uC791 \uC2DC \uD558\uB8E8 1\uD68C worker profile drift\uB97C \uC810\uAC80\uD569\uB2C8\uB2E4").option("--force","\uC624\uB298 \uC774\uBBF8 \uC810\uAC80\uD588\uC5B4\uB3C4 \uB2E4\uC2DC \uC2E4\uD589").option("--json","JSON \uCD9C\uB825").option("--quiet","\uC815\uC0C1/\uC2A4\uD0B5 \uACB0\uACFC\uB294 \uCD9C\uB825\uD558\uC9C0 \uC54A\uACE0 \uACBD\uACE0 \uC774\uC0C1\uB9CC \uCD9C\uB825").action(async o=>{try{let a=await JHt({surface:n,force:o.force});o.json?console.log(JSON.stringify(a,null,2)):(!o.quiet||!a.skipped&&a.state.status!=="ok")&&console.log(KHt(a)),process.exitCode=0}catch(a){o.quiet||console.error(im.default.red(`${r} worker daily-check \uC2E4\uD328: ${a instanceof Error?a.message:a}`)),process.exitCode=1}}),i.command("doctor").description("SEMO Ops worker device \uC124\uC815\uC744 \uAC80\uC99D\uD569\uB2C8\uB2E4").option("--json","JSON \uC73C\uB85C \uCD9C\uB825 (\uBA38\uC2E0 \uD30C\uC2F1\uC6A9)").option("--strict","warn \uB3C4 \uC2E4\uD328\uB85C \uAC04\uC8FC (CI \uC6A9)").action(async o=>{let a=await aT({strict:o.strict,surface:n,runExternalChecks:!0});o.json?console.log(JSON.stringify(a,null,2)):console.log(WH(a)),process.exitCode=a.exitCode})}var Mb=require("node:fs"),Rb=require("node:path"),H8t=require("node:child_process"),W8t=x(G3());var Qb=require("node:fs"),Jd=require("node:path"),h8t=x(G3());var H3="semicolon.dev/v1alpha1",W3="ProjectWorkspace",xQ=["single-app","monorepo","infra","content","mixed"],sr=class extends Error{constructor(n,r){super(`${n}: ${r}`);this.code=n;this.name="WorkspaceContractError"}};var Hke=(0,Jd.join)(".semo","project.yaml"),MHr=/^[a-z][a-z0-9-]{0,99}$/,THr=/^(?!\/)(?![A-Za-z]:[/\\])(?!.*(?:^|\/)\.\.(?:\/|$))[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*$/;function OHr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function vP(t,e){if(!OHr(t))throw new sr("WSP003",`${e} must be an object`);return t}function xP(t,e,n){let r=Object.keys(t).sort(),i=[...e].sort();if(r.length!==i.length||r.some((s,o)=>s!==i[o]))throw new sr("WSP003",`${n} keys must be exactly ${i.join(", ")}`)}function A8t(t,e){if(typeof t!="string"||!MHr.test(t))throw new sr("WSP003",`${e} must be a lowercase slug`);return t}function Gke(t,e){if(typeof t!="boolean")throw new sr("WSP006",`${e} must be boolean`);return t}function NHr(t,e){if(typeof t!="string"||!THr.test(t))throw new sr("WSP004",`${e} must be a normalized repository-relative path`);return t}function PHr(t){if(typeof t!="string"||!xQ.includes(t))throw new sr("WSP005",`spec.layout must be one of ${xQ.join(", ")}`);return t}function Qu(t=process.cwd()){let e=(0,Jd.resolve)(t);(0,Qb.existsSync)(e)&&(0,Qb.statSync)(e).isFile()&&(e=(0,Jd.dirname)(e));let n=(0,Jd.parse)(e).root;for(;;){if((0,Qb.existsSync)((0,Jd.join)(e,Hke)))return e;if(e===n)return null;e=(0,Jd.dirname)(e)}}function Wke(t){let e=(0,h8t.parseDocument)(t,{prettyErrors:!0,uniqueKeys:!0});if(e.errors.length>0)throw new sr("WSP003",`invalid .semo/project.yaml: ${e.errors[0].message}`);let n;try{n=e.toJS({maxAliasCount:0})}catch{throw new sr("WSP003","YAML aliases are not allowed")}let r=vP(n,"workspace");if(xP(r,["apiVersion","kind","metadata","spec"],"workspace"),r.apiVersion!==H3||r.kind!==W3)throw new sr("WSP001",`expected ${H3} ${W3}`);let i=vP(r.metadata,"metadata");xP(i,["domain","name"],"metadata");let s=A8t(i.domain,"metadata.domain"),o=A8t(i.name,"metadata.name"),a=vP(r.spec,"spec");xP(a,["layout","sourceRoots","knowledge","capabilities"],"spec");let c=PHr(a.layout);if(!Array.isArray(a.sourceRoots)||a.sourceRoots.length===0)throw new sr("WSP004","spec.sourceRoots must not be empty");let l=a.sourceRoots.map((h,f)=>NHr(h,`spec.sourceRoots[${f}]`));if(new Set(l).size!==l.length)throw new sr("WSP004","spec.sourceRoots must be unique");let u=vP(a.knowledge,"spec.knowledge");xP(u,["pipelineConfig"],"spec.knowledge");let d=u.pipelineConfig;if(d!==`${s}/pipeline/config`)throw new sr("WSP002","metadata.domain and spec.knowledge.pipelineConfig do not match");let A=vP(a.capabilities,"spec.capabilities");return xP(A,["skills","resources","credentials"],"spec.capabilities"),{apiVersion:H3,kind:W3,metadata:{domain:s,name:o},spec:{layout:c,sourceRoots:l,knowledge:{pipelineConfig:d},capabilities:{skills:Gke(A.skills,"spec.capabilities.skills"),resources:Gke(A.resources,"spec.capabilities.resources"),credentials:Gke(A.credentials,"spec.capabilities.credentials")}}}}function am(t){let e=(0,Jd.join)((0,Jd.resolve)(t),Hke);if(!(0,Qb.existsSync)(e))throw new sr("WSP001",`missing ${Hke}`);return Wke((0,Qb.readFileSync)(e,"utf8"))}var f8t=require("node:crypto"),Cl=require("node:fs/promises"),Du=require("node:fs"),Kd=require("node:path");var FHr=[".env",".env.*","!.env.example",".env.e2e.local",".semo/state.json",".semo/state/",".semo/cache/",".semo/staging/","resources/cache/","skills/*/","!skills/manifest.yaml"];function Vke(t,e){let n=(0,Kd.resolve)(t),r=(0,Kd.resolve)(n,e),i=(0,Kd.relative)(n,r);if(i===".."||i.startsWith(`..${Kd.sep}`)||i.startsWith(Kd.sep))throw new sr("WSP004",`path escapes workspace: ${e}`);return r}function LHr(t){let e=`apiVersion: semicolon.dev/v1alpha1
|
|
3179
3179
|
kind: ProjectWorkspace
|
|
3180
3180
|
metadata:
|