@lmctl-ai/lmctl 0.1.69 → 0.1.70
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/cli/index.js +32 -7
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1821,10 +1821,12 @@ services. Help exits before any port binding or daemon startup.
|
|
|
1821
1821
|
local identity. Mailbox store defaults to
|
|
1822
1822
|
~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
|
|
1823
1823
|
`;ja=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},sb=Bd});var db={};le(db,{runIntake:()=>i1});async function i1(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(o1),0):r==="scan"?a1(n,e):r==="config"?l1(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
|
|
1824
|
-
`),1)}async function a1(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=x(r,"--project");return L(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await du({dal:s,project:o});return B(e,{project_id:o.id,project_name:o.name,...i}),0}return B(e,await gn(s)),0})}async function l1(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=x(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=x(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=x(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return L(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return B(e,d),0})}var o1,fb=b(()=>{"use strict";ji();ke();o1=`usage: lmctl intake
|
|
1824
|
+
`),1)}async function a1(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=x(r,"--project");return L(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await du({dal:s,project:o});return B(e,{project_id:o.id,project_name:o.name,...i}),0}return B(e,await gn(s)),0})}async function l1(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=x(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=x(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=x(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return L(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return B(e,d),0})}var o1,fb=b(()=>{"use strict";ji();ke();o1=`usage: lmctl intake scan [--project NAME] [--json]
|
|
1825
|
+
lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all] [--json]
|
|
1825
1826
|
|
|
1826
1827
|
Scan configured project GitHub issues into lmctl, or update per-project
|
|
1827
1828
|
intake settings such as enabled state, labels, and issue state filters.
|
|
1829
|
+
scan writes JSON output; --project limits the scan to one project.
|
|
1828
1830
|
`});import{createHash as c1}from"node:crypto";import{existsSync as Os,mkdirSync as u1,readFileSync as hb,realpathSync as d1,writeFileSync as f1}from"node:fs";import{basename as mb,dirname as _b,resolve as gb}from"node:path";function Ne(t,e){let r=gb(t);if(Os(r))return d1(r);if(e!==void 0){let n=h1(t,r,e);if(n!==null)return n}return r}function pb(t,e){let r=_b(e),n=jd(t,ba(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=gb(r,s.sessiondir));return n}function Pr(t,e){let r=Ne(t,p1(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Os(r)&&"upsertRootTeam"in e&&(u1(_b(r),{recursive:!0}),f1(r,n.raw_text,"utf8")),pb(n.raw_text,r);if(Os(r)){let s=hb(r,"utf8"),o=pb(s,r);return"upsertRootTeam"in e&&_1(o)&&g1(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Os(r))throw new Error(`teamfile not found: ${t}`);return Le(r)}function wb(t,e,r){let n=Ne(t,e),s=e.getRootTeam(n);s===null||!Os(n)||hb(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function p1(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function h1(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=mb(t),o=ba(t),i=r.listRootTeams().filter(l=>mb(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function _1(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=m1)}function g1(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:c1("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var m1,mr=b(()=>{"use strict";Jt();m1=5});import{existsSync as w1}from"node:fs";import{dirname as yb}from"node:path";function b1(t){return y1.test(t)||E1.test(t)}function Eb(t){return Aa.test(t)}function Ls(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Aa.test(n)?null:{teamfile:r,alias:n}}function Nt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!Eb(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Aa.source}).`);let n=Ne(t,r);if(r===void 0&&!w1(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=Pr(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=Ta(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
|
|
1829
1831
|
Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=Rd(o,yb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
|
|
1830
1832
|
Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??yb(n),isLead:It(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function pr(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=Ls(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?Eb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Aa.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
@@ -2046,13 +2048,17 @@ ${sn}`:sn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=on(xe(p),m.sessionid
|
|
|
2046
2048
|
`);try{await hi({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
|
|
2047
2049
|
`)}}}return M(s,"--json")?B(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
2048
2050
|
`),d?1:0}function SU(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function kU(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--interpreter"),a=x(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
2049
|
-
`),0}var _U,xT=b(()=>{"use strict";Ye();Lo();ss();$c();Ue();an();Xc();Gi();ke();xc();_U=`usage: lmctl team <
|
|
2051
|
+
`),0}var _U,xT=b(()=>{"use strict";Ye();Lo();ss();$c();Ue();an();Xc();Gi();ke();xc();_U=`usage: lmctl team create <name>
|
|
2052
|
+
lmctl team list [--json]
|
|
2053
|
+
lmctl team show <name> [--json]
|
|
2054
|
+
lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
|
|
2055
|
+
lmctl team seed <team-name> [--alias A] [--json]
|
|
2056
|
+
lmctl team refresh <team-name> --alias A [--json]
|
|
2057
|
+
lmctl team companion <team-name> --interpreter A --of B[,C]
|
|
2058
|
+
lmctl team list-roots [--json]
|
|
2050
2059
|
|
|
2051
2060
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
2052
2061
|
refresh to create/update native provider sessions for team members.
|
|
2053
|
-
|
|
2054
|
-
Root team registry:
|
|
2055
|
-
list-roots [--json] List .lmctl root teams registered by lmctl seed.
|
|
2056
2062
|
`});var jT={};le(jT,{runInfo:()=>xU});import{execFileSync as Zd}from"node:child_process";import{dirname as vU}from"node:path";function $U(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function xU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${NU}
|
|
2057
2063
|
`),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await L(e,async u=>AU(e,u,c,n))}catch(u){return me(e,u)}}let o=pr(IU,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:x(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await L(e,u=>Ne(o.teamfile,u))}catch(u){return w(e,`health: ${u instanceof Error?u.message:String(u)}`)}return RU(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await L(e,u=>Nt(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await ri(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return jU(e,i,a,l,n)}async function jU(t,e,r,n,s){let o;try{o=await Ar(r,e)}catch(a){return w(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(B(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
2058
2064
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
@@ -2354,10 +2360,18 @@ remote https:// workflow after a trust prompt.
|
|
|
2354
2360
|
`),2;let c=r.spawn??OS,u=On.map(p=>If(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${On.join("|")} first
|
|
2355
2361
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2356
2362
|
`),2;let d=e.dal===void 0,f=e.dal??pe({path:ue()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Mn()??yr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
2357
|
-
`),0}var KB,On,r2,n2,DS=b(()=>{"use strict";Ue();xS();ke();Ye();KB=`usage: lmctl workspace
|
|
2363
|
+
`),0}var KB,On,r2,n2,DS=b(()=>{"use strict";Ue();xS();ke();Ye();KB=`usage: lmctl workspace list [--json]
|
|
2364
|
+
lmctl workspace create <name> [--docroot PATH] [--json]
|
|
2365
|
+
lmctl workspace use <name> [--json]
|
|
2366
|
+
lmctl workspace show <name> [--json]
|
|
2367
|
+
lmctl workspace delete <name> --confirm [--force] [--json]
|
|
2368
|
+
lmctl workspace migrate [--json]
|
|
2369
|
+
lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P] [--json]
|
|
2370
|
+
lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>
|
|
2358
2371
|
|
|
2359
2372
|
Manage isolated workspace state directories, active workspace selection,
|
|
2360
2373
|
legacy profile migration, and configured provider slots.
|
|
2374
|
+
delete requires --confirm; deleting default or active workspaces also requires --force.
|
|
2361
2375
|
`;On=["claude","codex","gemini","qwen"],r2={provider1:"claude",provider2:"codex",provider3:"gemini"},n2={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var US={};le(US,{runProject:()=>l2});import{existsSync as o2,statSync as i2}from"node:fs";import{join as FS}from"node:path";async function l2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(a2),0;try{return await L(e,s=>{switch(r){case"create":return g2(n,e,s);case"list":return w2(n,e,s);case"show":return h2(n,e,s);case"status":return _2(n,e,s);case"workflow":return c2(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function c2(t,e,r){let[n,...s]=t;switch(n){case"add":return u2(s,e,r);case"list":return d2(s,e,r);case"show":return f2(s,e,r);case"remove":return m2(s,e,r);case"enable":return PS(s,e,r,!0);case"disable":return PS(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function u2(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=x(n,"--condition")??null;if(l!==null)try{ar(l)}catch{return w(e,"invalid --condition JEXL")}let c=p2(x(n,"--params"));if(typeof c=="string")return w(e,c);let u=x(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?B(e,f):e.stdout.write(`added project workflow ${f.id}
|
|
2362
2376
|
`),0}function d2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?B(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
|
|
2363
2377
|
`)}${i.length>0?`
|
|
@@ -2369,10 +2383,21 @@ legacy profile migration, and configured provider slots.
|
|
|
2369
2383
|
`),0}function g2(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=x(n,"--owner"),i=x(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=x(n,"--local-path")??(l!==null?FS(l,u):void 0),f=x(n,"--workflow"),m=x(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=x(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every($=>typeof $=="string")||k.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return w(e,"--test-argv must be valid JSON")}let _=x(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:y2(d)||ns(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?B(e,E):e.stdout.write(`created project ${E.name}
|
|
2370
2384
|
`),0}function w2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
|
|
2371
2385
|
`)}${s.length>0?`
|
|
2372
|
-
`:""}`),0}function y2(t){try{let e=FS(t,"durable-memory");return o2(e)&&i2(e).isDirectory()}catch{return!1}}var a2,WS=b(()=>{"use strict";ke();fn();ss();a2=`usage: lmctl project <
|
|
2386
|
+
`:""}`),0}function y2(t){try{let e=FS(t,"durable-memory");return o2(e)&&i2(e).isDirectory()}catch{return!1}}var a2,WS=b(()=>{"use strict";ke();fn();ss();a2=`usage: lmctl project create <name> [--local-path P] --workflow W --team T [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2387
|
+
lmctl project create --owner OWNER --repo REPO --workflow W --team T [--local-path P] [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2388
|
+
lmctl project list [--json]
|
|
2389
|
+
lmctl project show <name> [--json]
|
|
2390
|
+
lmctl project status <name> [--json]
|
|
2391
|
+
lmctl project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N] [--json]
|
|
2392
|
+
lmctl project workflow list <project> [--json]
|
|
2393
|
+
lmctl project workflow show <id> [--json]
|
|
2394
|
+
lmctl project workflow remove <id>
|
|
2395
|
+
lmctl project workflow enable <id> [--json]
|
|
2396
|
+
lmctl project workflow disable <id> [--json]
|
|
2373
2397
|
|
|
2374
2398
|
Create, list, inspect, and check projects. The workflow subcommand manages
|
|
2375
2399
|
per-project workflow bindings and routing conditions.
|
|
2400
|
+
If project create omits --local-path, project.docroot must be configured.
|
|
2376
2401
|
`});import{createHash as E2,randomBytes as b2}from"node:crypto";import{readFile as T2}from"node:fs/promises";function BS(t=new Date,e=b2(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function S2(t){return E2("sha256").update(t).digest("hex")}async function qS(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await T2(n);return{path:r,sha256:S2(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function HS(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var Af=b(()=>{"use strict"});import{spawnSync as JS}from"node:child_process";import{mkdir as Rf,writeFile as XS,readFile as k2,rm as GS}from"node:fs/promises";import{tmpdir as v2}from"node:os";import{dirname as KS,join as Of}from"node:path";async function VS(t){let e=t.stagingDir??Of(v2(),`lmctl-diag-${t.ticketId}`),r=Of(e,`diagnostic-${t.ticketId}`);await Rf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Of(r,d);if(await Rf(KS(m),{recursive:!0}),typeof f=="string")await XS(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await XS(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
|
|
2377
2402
|
`;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
|
|
2378
2403
|
`:`${d.pid}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.70",
|
|
4
4
|
"description": "A provider-agnostic control plane for teams of AI coding agents — across providers, with independent review and durable memory.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://lmctl.com",
|