@team-semicolon/semicolony-cli 4.18.85 → 4.18.86
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
|
@@ -3248,7 +3248,7 @@ ${e}`}function OHn(t={}){let e=Buffer.alloc(0);process.stdin.on("data",n=>{e=Buf
|
|
|
3248
3248
|
AND r.profile_id = wp.profile_id
|
|
3249
3249
|
WHERE wp.profile_id = $1
|
|
3250
3250
|
`,[r]),i=n[0];if(!i)throw new Error(`workspace profile not found: ${r}`);let s=typeof i.active_release_id=="string"?{release_id:i.active_release_id,version:String(i.active_release_version),status:"active",manifest_sha256:String(i.manifest_sha256),source_commit:String(i.source_commit),activated_at:typeof i.activated_at=="string"?i.activated_at:null,activated_by:typeof i.activated_by=="string"?i.activated_by:null}:null,o=(await RK({profileId:r},e)).map(C2);return{profile_id:r,active_release:s,devices:o}}function A5n(t){let e=t.active_release,r=["",If.default.cyan.bold(`SEMO Ops worker release: ${t.profile_id}`)];e?(r.push(` active=${e.version} (${e.release_id})`),r.push(If.default.gray(` activated=${e.activated_at??"-"} by=${e.activated_by??"-"}`))):r.push(If.default.yellow(" active=none")),t.devices.length||r.push(If.default.gray(" registered devices=none"));for(let n of t.devices){let i=n.applied_release_version??n.applied_release_id??"none",s=n.installation_kind==="agent-runtime"?`${n.installation_id} [agent-runtime]`:`${n.worker_id}/${n.device_id}`;r.push(` ${s} \xB7 applied=${i} \xB7 doctor=${n.last_doctor_status}`)}return r.push(""),r.join(`
|
|
3251
|
-
`)}function GVt(t,e){let r=t.command("release").description("immutable worker profile release operator commands");r.command("stage").description("rendered immutable manifest\uB97C staged release\uB85C \uC800\uC7A5\uD569\uB2C8\uB2E4").requiredOption("--profile <id>","workspace profile id").requiredOption("--release-version <version>","release version").requiredOption("--manifest <file>","already-rendered manifest JSON file").requiredOption("--source-commit <sha>","reviewed source commit SHA").action(async n=>{try{let i=await c5n({profileId:n.profile,version:n.releaseVersion,manifestPath:n.manifest,sourceCommit:n.sourceCommit});console.log(If.default.green(`\u2714 staged worker release ${i.profile_id}@${i.version} (${i.release_id})`))}catch(i){console.error(If.default.red(`${e} worker release stage failed: ${i instanceof Error?i.message:i}`)),process.exitCode=1}finally{await Q()}}),r.command("activate <release-id>").description("staged release\uB97C \uD574\uB2F9 profile\uC758 desired release\uB85C \uD65C\uC131\uD654\uD569\uB2C8\uB2E4").requiredOption("--activated-by <actor>","operator identity").action(async(n,i)=>{try{await f5n({releaseId:n,activatedBy:i.activatedBy}),console.log(If.default.green(`\u2714 activated worker release ${n}`))}catch(s){console.error(If.default.red(`${e} worker release activate failed: ${s instanceof Error?s.message:s}`)),process.exitCode=1}finally{await Q()}}),r.command("status").description("profile desired release\uC640 registered device rollout \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4").requiredOption("--profile <id>","workspace profile id").option("--require-capability <name>","preflight every active or pending-setup worker for a required release capability").option("--json","JSON output").action(async n=>{try{let i=await d5n({profileId:n.profile,requireCapability:n.requireCapability,json:n.json});console.log(i.output),i.exitCode!==0&&(process.exitCode=i.exitCode)}catch(i){console.error(If.default.red(`${e} worker release status failed: ${i instanceof Error?i.message:i}`)),process.exitCode=1}finally{await Q()}})}var e7=require("node:fs"),u3t=v(require("node:os")),od=require("node:path"),d3t=v($$());L1();NA();var nn=v(require("fs")),ls=v(require("path")),ZVt=require("node:crypto");Yg();var p5n=/^[a-z][a-z0-9-]{0,99}$/,g5n=/^(?!.*\.\.)(?!.*[~^:?*\[\\])[A-Za-z0-9._/-]+$/,m5n="gitlab.semi-colon.space",y5n="project-workspace-v1",b5n=new Set(["single-app","monorepo","infra","content","mixed"]),E5n=/^[a-z][a-z0-9-]{0,99}$/,w5n=/^(?!\/)(?![A-Za-z]:[/\\])(?!.*(?:^|\/)\.{1,2}(?:\/|$))[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)
|
|
3251
|
+
`)}function GVt(t,e){let r=t.command("release").description("immutable worker profile release operator commands");r.command("stage").description("rendered immutable manifest\uB97C staged release\uB85C \uC800\uC7A5\uD569\uB2C8\uB2E4").requiredOption("--profile <id>","workspace profile id").requiredOption("--release-version <version>","release version").requiredOption("--manifest <file>","already-rendered manifest JSON file").requiredOption("--source-commit <sha>","reviewed source commit SHA").action(async n=>{try{let i=await c5n({profileId:n.profile,version:n.releaseVersion,manifestPath:n.manifest,sourceCommit:n.sourceCommit});console.log(If.default.green(`\u2714 staged worker release ${i.profile_id}@${i.version} (${i.release_id})`))}catch(i){console.error(If.default.red(`${e} worker release stage failed: ${i instanceof Error?i.message:i}`)),process.exitCode=1}finally{await Q()}}),r.command("activate <release-id>").description("staged release\uB97C \uD574\uB2F9 profile\uC758 desired release\uB85C \uD65C\uC131\uD654\uD569\uB2C8\uB2E4").requiredOption("--activated-by <actor>","operator identity").action(async(n,i)=>{try{await f5n({releaseId:n,activatedBy:i.activatedBy}),console.log(If.default.green(`\u2714 activated worker release ${n}`))}catch(s){console.error(If.default.red(`${e} worker release activate failed: ${s instanceof Error?s.message:s}`)),process.exitCode=1}finally{await Q()}}),r.command("status").description("profile desired release\uC640 registered device rollout \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4").requiredOption("--profile <id>","workspace profile id").option("--require-capability <name>","preflight every active or pending-setup worker for a required release capability").option("--json","JSON output").action(async n=>{try{let i=await d5n({profileId:n.profile,requireCapability:n.requireCapability,json:n.json});console.log(i.output),i.exitCode!==0&&(process.exitCode=i.exitCode)}catch(i){console.error(If.default.red(`${e} worker release status failed: ${i instanceof Error?i.message:i}`)),process.exitCode=1}finally{await Q()}})}var e7=require("node:fs"),u3t=v(require("node:os")),od=require("node:path"),d3t=v($$());L1();NA();var nn=v(require("fs")),ls=v(require("path")),ZVt=require("node:crypto");Yg();var p5n=/^[a-z][a-z0-9-]{0,99}$/,g5n=/^(?!.*\.\.)(?!.*[~^:?*\[\\])[A-Za-z0-9._/-]+$/,m5n="gitlab.semi-colon.space",y5n="project-workspace-v1",b5n=new Set(["single-app","monorepo","infra","content","mixed"]),E5n=/^[a-z][a-z0-9-]{0,99}$/,w5n=/^(?:\.|(?!\/)(?![A-Za-z]:[/\\])(?!.*(?:^|\/)\.{1,2}(?:\/|$))[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*)$/,_5n=/^[a-z][a-z0-9_]{0,63}$/,C5n=["default_branch","domain","remote"].join(","),I5n=["bootstrap","default_branch","domain","readiness","remote"].join(","),v5n=["default_branch","domain","missing","readiness","remote"].join(","),k5n=["capabilities","layout","name","profile","source_roots","version"].join(",");function TK(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function I2(t){if(typeof t!="string"||t.length===0)return!1;try{let e=new URL(t);return e.protocol==="https:"&&e.hostname===m5n&&e.port===""&&e.username===""&&e.password===""&&e.search===""&&e.hash===""&&e.pathname.length>1}catch{return!1}}function x5n(t){if(!TK(t)||Object.keys(t).sort().join(",")!==k5n)return!1;let e=t.capabilities,r=t.source_roots;return t.version===1&&t.profile===y5n&&typeof t.name=="string"&&E5n.test(t.name)&&typeof t.layout=="string"&&b5n.has(t.layout)&&Array.isArray(r)&&r.length>0&&r.length<=32&&new Set(r).size===r.length&&r.every(n=>typeof n=="string"&&w5n.test(n))&&TK(e)&&Object.keys(e).sort().join(",")==="resources,skills"&&typeof e.skills=="boolean"&&typeof e.resources=="boolean"}function B5n(t){return typeof t.domain=="string"&&p5n.test(t.domain)&&I2(t.remote)&&typeof t.default_branch=="string"&&t.default_branch.length<=200&&g5n.test(t.default_branch)}function S5n(t){if(!TK(t)||!B5n(t))return!1;let e=Object.keys(t).sort().join(",");return e===C5n?!0:e===I5n?t.readiness==="init_ready"&&x5n(t.bootstrap):e===v5n?t.readiness==="metadata_incomplete"&&Array.isArray(t.missing)&&t.missing.length>0&&t.missing.length<=32&&t.missing.every(r=>typeof r=="string"&&_5n.test(r)):!1}function Q5n(t){if(!TK(t)||Object.keys(t).length!==1||!Array.isArray(t.items))throw new Error("workspace catalog Gateway response is invalid");if(!t.items.every(S5n))throw new Error("workspace catalog Gateway response is invalid");let e=new Set;for(let r of t.items){if(e.has(r.domain))throw new Error("workspace catalog Gateway response is invalid");e.add(r.domain)}return t.items}function VVt(t){return t.readiness==="init_ready"&&t.bootstrap!==void 0}async function HVt(t,e,r){let n=t.baseUrl.replace(/\/+$/,"");try{return await e(`${n}/workspace/catalog/list`,{method:"POST",headers:{authorization:`Bearer ${t.token}`,"content-type":"application/json"},body:r})}catch{throw new Error("workspace catalog Gateway unavailable")}}async function YVt(t,e=fetch){let r=await HVt(t,e,'{"include":["bootstrap"]}');if(r.status===400&&(r=await HVt(t,e,"{}")),r.status!==200)throw new Error(`workspace catalog Gateway failed with HTTP ${r.status}`);try{return Q5n(await r.json())}catch(n){throw n instanceof Error&&n.message==="workspace catalog Gateway response is invalid"?n:new Error("workspace catalog Gateway response is invalid")}}var D5n=/^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/,R5n=/^[a-f0-9]{64}$/i,JVt=ls.join(".claude","semo","worker","init-state.json"),T5n=new Set(["paired","setup","release","root","root_layout"]),M5n=new Set(["cloned","validated","bootstrapped","requires_adoption","conflict","failed"]),KVt="semo workspace adopt";function MK(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function XVt(t){let e=JSON.stringify(t);if(/wck_[A-Za-z0-9_-]*/i.test(e)||/DATABASE_URL/i.test(e)||/postgres(?:ql)?:\/\//i.test(e))throw new Error("init state must not contain credential material")}function v2(t,e){if(typeof t!="string"||!D5n.test(t))throw new Error(`init state ${e} must be a safe identifier`);return t}function QSe(t,e){if(typeof t!="string"||!ls.isAbsolute(t)||ls.resolve(t)!==t)throw new Error(`init state ${e} must be an absolute resolved path`);return t}function O5n(t){if(typeof t!="string"||!Number.isFinite(Date.parse(t)))throw new Error("init state updated_at must be a valid timestamp");return t}function DSe(t){if(t===null||typeof t=="boolean"||typeof t=="number"||typeof t=="string")return JSON.stringify(t);if(Array.isArray(t))return`[${t.map(DSe).join(",")}]`;if(!MK(t))throw new Error("init state receipt must be JSON serializable");return`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${DSe(t[e])}`).join(",")}}`}function P5n(t){if(!I2(t))throw new Error("init state project remote must be an approved Semicolon GitLab HTTPS remote");return t}function OK(t){if(XVt(t),!MK(t)||t.schema_version!==1)throw new Error("init state schema_version must be 1");let e=new Set(["schema_version","root_path","worker_id","device_id","release_id","release_manifest_sha256","completed","projects","last_error_code","updated_at"]);if(Object.keys(t).some(s=>!e.has(s)))throw new Error("init state contains unsupported fields");if(!Array.isArray(t.completed)||t.completed.some(s=>!T5n.has(s)))throw new Error("init state completed must contain only known steps");if(new Set(t.completed).size!==t.completed.length)throw new Error("init state completed must not repeat a step");if(!MK(t.projects))throw new Error("init state projects must be an object");let r={};for(let[s,o]of Object.entries(t.projects)){if(v2(s,"project id"),!MK(o)||Object.keys(o).some(a=>!["target_path","remote","status","next_action"].includes(a)))throw new Error("init state project has unsupported fields");if(!M5n.has(o.status))throw new Error("init state project status is invalid");if(o.status==="requires_adoption"&&o.next_action!==KVt||o.status!=="requires_adoption"&&o.next_action!==void 0)throw new Error("init state project adoption action is invalid");r[s]={target_path:QSe(o.target_path,"project target_path"),remote:P5n(o.remote),status:o.status,...o.status==="requires_adoption"?{next_action:KVt}:{}}}let n=t.release_id===void 0?void 0:v2(t.release_id,"release_id"),i=t.release_manifest_sha256;if(i!==void 0&&(typeof i!="string"||!R5n.test(i)))throw new Error("init state release_manifest_sha256 must be a SHA-256 digest");return t.last_error_code!==void 0&&v2(t.last_error_code,"last_error_code"),{schema_version:1,root_path:QSe(t.root_path,"root_path"),worker_id:v2(t.worker_id,"worker_id"),device_id:v2(t.device_id,"device_id"),...n===void 0?{}:{release_id:n},...i===void 0?{}:{release_manifest_sha256:i},completed:[...t.completed],projects:r,...t.last_error_code===void 0?{}:{last_error_code:t.last_error_code},updated_at:O5n(t.updated_at)}}function RSe(t){let e=ls.resolve(t);return e.endsWith(JVt)?e.slice(0,-JVt.length).replace(/[\\/]$/,""):null}function N5n(t){try{let e=nn.lstatSync(t);if(!e.isFile()||e.isSymbolicLink())throw new Error("init state target must be a regular file")}catch(e){if(e.code!=="ENOENT")throw e}}function zVt(t){try{let e=nn.lstatSync(t);if(!e.isFile()||e.isSymbolicLink())throw new Error("init state target must be a regular file");return JSON.parse(nn.readFileSync(t,"utf8"))}catch(e){if(e.code==="ENOENT")return null;throw e}}function e4t(t){let e=RSe(t);if(e){let n=xa(e,ls.resolve(t),ls.resolve(t));if(n.status==="absent")return null;if(n.status==="rejected")throw new Error(`init state path rejected: ${n.reason}`);return OK(zVt(n.filePath))}let r=zVt(t);return r===null?null:OK(r)}function t4t(t,e){let r=OK(e),n=RSe(t);n?lh(n,t):N5n(t),nn.mkdirSync(ls.dirname(t),{recursive:!0});let i=ls.join(ls.dirname(t),`.${ls.basename(t)}.${process.pid}.${Date.now()}.tmp`);try{nn.writeFileSync(i,`${JSON.stringify(r,null,2)}
|
|
3252
3252
|
`,{encoding:"utf8",flag:"wx",mode:384}),nn.chmodSync(i,384),nn.renameSync(i,t),nn.chmodSync(t,384)}finally{nn.rmSync(i,{force:!0})}}function F5n(t,e){let r=e.toISOString().replace(/[:.]/g,""),n=(0,ZVt.createHash)("sha256").update(DSe(t)).digest("hex").slice(0,16);return`${r}-${n}.json`}function L5n(t,e){let r=(()=>{try{return nn.lstatSync(e)}catch(n){if(n.code==="ENOENT")return null;throw n}})();if(r&&(!r.isDirectory()||r.isSymbolicLink()))throw new Error("worker init migration receipt history must be a private non-symlink directory");lh(t,ls.join(e,"receipt.json")),nn.mkdirSync(e,{recursive:!0,mode:448}),lh(t,ls.join(e,"receipt.json")),nn.chmodSync(e,448)}function r4t(t,e,r,n){let i=OK(e),s=RSe(t);if(!s)throw new Error("worker init migration receipt requires canonical state path");if(!(n instanceof Date)||!Number.isFinite(n.getTime()))throw new Error("worker init migration receipt timestamp is invalid");let o=QSe(r,"new_root_path"),a={schema_version:1,kind:"worker-init-root-migration",previous_state:i,new_root_path:o,migrated_at:n.toISOString()};XVt(a),lh(s,t);let c=ls.join(ls.dirname(t),"init-history");L5n(s,c);let l=ls.join(c,F5n(i,n));lh(s,l);try{throw nn.lstatSync(l),new Error("worker init migration receipt already exists")}catch(d){if(d.code!=="ENOENT")throw d}let u=ls.join(c,`.${ls.basename(l)}.${process.pid}.${Date.now()}.tmp`);try{nn.writeFileSync(u,`${JSON.stringify(a,null,2)}
|
|
3253
3253
|
`,{encoding:"utf8",flag:"wx",mode:384}),nn.chmodSync(u,384);let d=nn.openSync(u,"r");try{nn.fsyncSync(d)}finally{nn.closeSync(d)}return nn.linkSync(u,l),nn.chmodSync(l,384),l}finally{nn.rmSync(u,{force:!0})}}var id=require("node:fs"),BJt=v(LD()),SJt=require("node:child_process"),za=require("node:path");var Y9t=require("node:crypto"),$l=require("node:fs/promises"),II=require("node:fs"),xf=require("node:path");var RE=require("node:fs"),kf=require("node:path"),H9t=v(LD());var Mz="semicolon.dev/v1alpha1",Oz="ProjectWorkspace",UD=["single-app","monorepo","infra","content","mixed"],Pr=class extends Error{constructor(r,n){super(`${r}: ${n}`);this.code=r;this.name="WorkspaceContractError"}};var ADe=(0,kf.join)(".semo","project.yaml"),h9n=/^[a-z][a-z0-9-]{0,99}$/,A9n=/^(?!\/)(?![A-Za-z]:[/\\])(?!.*(?:^|\/)\.\.(?:\/|$))[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*$/;function p9n(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function rF(t,e){if(!p9n(t))throw new Pr("WSP003",`${e} must be an object`);return t}function nF(t,e,r){let n=Object.keys(t).sort(),i=[...e].sort();if(n.length!==i.length||n.some((s,o)=>s!==i[o]))throw new Pr("WSP003",`${r} keys must be exactly ${i.join(", ")}`)}function G9t(t,e){if(typeof t!="string"||!h9n.test(t))throw new Pr("WSP003",`${e} must be a lowercase slug`);return t}function hDe(t,e){if(typeof t!="boolean")throw new Pr("WSP006",`${e} must be boolean`);return t}function g9n(t,e){if(typeof t!="string"||!A9n.test(t))throw new Pr("WSP004",`${e} must be a normalized repository-relative path`);return t}function m9n(t){if(typeof t!="string"||!UD.includes(t))throw new Pr("WSP005",`spec.layout must be one of ${UD.join(", ")}`);return t}function rd(t=process.cwd()){let e=(0,kf.resolve)(t);(0,RE.existsSync)(e)&&(0,RE.statSync)(e).isFile()&&(e=(0,kf.dirname)(e));let r=(0,kf.parse)(e).root;for(;;){if((0,RE.existsSync)((0,kf.join)(e,ADe)))return e;if(e===r)return null;e=(0,kf.dirname)(e)}}function pDe(t){let e=(0,H9t.parseDocument)(t,{prettyErrors:!0,uniqueKeys:!0});if(e.errors.length>0)throw new Pr("WSP003",`invalid .semo/project.yaml: ${e.errors[0].message}`);let r;try{r=e.toJS({maxAliasCount:0})}catch{throw new Pr("WSP003","YAML aliases are not allowed")}let n=rF(r,"workspace");if(nF(n,["apiVersion","kind","metadata","spec"],"workspace"),n.apiVersion!==Mz||n.kind!==Oz)throw new Pr("WSP001",`expected ${Mz} ${Oz}`);let i=rF(n.metadata,"metadata");nF(i,["domain","name"],"metadata");let s=G9t(i.domain,"metadata.domain"),o=G9t(i.name,"metadata.name"),a=rF(n.spec,"spec");nF(a,["layout","sourceRoots","knowledge","capabilities"],"spec");let c=m9n(a.layout);if(!Array.isArray(a.sourceRoots)||a.sourceRoots.length===0)throw new Pr("WSP004","spec.sourceRoots must not be empty");let l=a.sourceRoots.map((h,A)=>g9n(h,`spec.sourceRoots[${A}]`));if(new Set(l).size!==l.length)throw new Pr("WSP004","spec.sourceRoots must be unique");let u=rF(a.knowledge,"spec.knowledge");nF(u,["pipelineConfig"],"spec.knowledge");let d=u.pipelineConfig;if(d!==`${s}/pipeline/config`)throw new Pr("WSP002","metadata.domain and spec.knowledge.pipelineConfig do not match");let f=rF(a.capabilities,"spec.capabilities");return nF(f,["skills","resources","credentials"],"spec.capabilities"),{apiVersion:Mz,kind:Oz,metadata:{domain:s,name:o},spec:{layout:c,sourceRoots:l,knowledge:{pipelineConfig:d},capabilities:{skills:hDe(f.skills,"spec.capabilities.skills"),resources:hDe(f.resources,"spec.capabilities.resources"),credentials:hDe(f.credentials,"spec.capabilities.credentials")}}}}function ny(t){let e=(0,kf.join)((0,kf.resolve)(t),ADe);if(!(0,RE.existsSync)(e))throw new Pr("WSP001",`missing ${ADe}`);return pDe((0,RE.readFileSync)(e,"utf8"))}var y9n=[".env",".env.*","!.env.example","!.env.*.example",".env.e2e.local",".semo/state.json",".semo/state/",".semo/cache/",".semo/staging/","resources/cache/","skills/*/","!skills/manifest.yaml"],b9n=Object.freeze({".gitignore":"merge-only",".semo/project.yaml":"exact-managed","AGENTS.md":"seed-if-missing","CLAUDE.md":"exact-managed","README.md":"seed-if-missing","resources/manifest.yaml":"seed-if-missing","skills/manifest.yaml":"seed-if-missing"});function V9t(t){try{return(0,II.lstatSync)(t)}catch(e){if(e.code==="ENOENT")return null;throw e}}function gDe(t,e){let r=(0,xf.resolve)(t),n=(0,xf.resolve)(r,e),i=(0,xf.relative)(r,n);if(i===".."||i.startsWith(`..${xf.sep}`)||i.startsWith(xf.sep))throw new Pr("WSP004",`path escapes workspace: ${e}`);return n}function E9n(t){let e=`apiVersion: semicolon.dev/v1alpha1
|
|
3254
3254
|
kind: ProjectWorkspace
|