@kitelev/exocortex-cli 16.47.1 → 16.47.2

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.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // @kitelev/exocortex-cli v16.47.1
2
+ // @kitelev/exocortex-cli v16.47.2
3
3
  // CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
4
4
  // License: MIT
5
5
 
@@ -766,7 +766,7 @@ ${r}`}a(nZ,"serializeFile");function LN(n,e,t={}){let r=Ty.default.dirname(n),i=
766
766
  `).map(s=>s.trim()).filter(Boolean)){let s=iZ.exec(i);if(s){r.push({sessionName:i,uuid:s[1],type:"full"});continue}let o=sZ.exec(i);o&&r.push({sessionName:i,uuid:o[1],type:"short"})}return r}a(aZ,"listClaudeChildSessions");function lZ(n,e,t){let r=null,i=e.toLowerCase();function s(o){if(r)return;let l;try{l=(0,Iy.readdirSync)(o,{withFileTypes:!0})}catch{return}for(let c of l){if(r)return;if(c.name.startsWith(".")||c.name==="node_modules")continue;let u=(0,kN.join)(o,c.name);if(c.isDirectory())s(u);else if(c.name.endsWith(".md")){let f=c.name.slice(0,-3).toLowerCase();(t==="full"&&f===i||t==="short"&&f.startsWith(i))&&(r=u)}}}return a(s,"walk"),s(n),r}a(lZ,"findVaultFile");function cZ(n,e){try{let i=(e??(s=>(0,Iy.readFileSync)(s,"utf8")))(n).match(/ems__Effort_status\s*:.*\[\[([^\]]+)\]\]/);return i?i[1].includes(oZ):!1}catch{return!1}}a(cZ,"isTaskDoing");async function jN(n,e=Ay.exec,t){let r=await aZ(e),i=[];for(let s of r){let o=lZ(n,s.uuid,s.type);if(!o){i.push({sessionName:s.sessionName,taskUuid:s.uuid,taskFilePath:null,reason:"vault task not found"});continue}cZ(o,t)||i.push({sessionName:s.sessionName,taskUuid:s.uuid,taskFilePath:o,reason:"vault task status != Doing"})}return i}a(jN,"detectOrphans");async function $N(n,e,t=Ay.exec,r=LN){let i=MN(t);if(e)return{ok:!0};let s=new Date().toISOString();if(n.taskFilePath)try{r(n.taskFilePath,{ems__Effort_status:"[[ems__EffortStatusFailed]]",aiTask__Task_lastError:`orphan recovery: ${n.reason}`,exo__Asset_updatedAt:s})}catch(o){return{ok:!1,error:`vault update failed: ${o.message}`}}try{await i(`tmux kill-session -t ${JSON.stringify(n.sessionName)}`)}catch{}return{ok:!0}}a($N,"recoverOrphan");function uZ(){return process.env.EXOCORTEX_VAULT??(0,xy.join)((0,VN.homedir)(),"vault-2025")}a(uZ,"defaultVault");function BN(){return new ve("recover").description("Detect and recover orphaned claude-child tmux sessions. A session is orphaned when the corresponding vault task is not in Doing status. Default mode: dry-run (no changes). Use --apply to perform recovery.").option("--vault <path>","Path to Obsidian vault",uZ()).option("--dry-run","List orphans without applying changes (default)",!1).option("--apply","Apply orphan recovery: set Failed + kill tmux session",!1).action(async n=>{let e=(0,xy.resolve)(n.vault);if(!(0,UN.existsSync)(e)){console.error(`[recover] vault not found: ${e}`),process.exitCode=1;return}let t=!n.apply;console.log(`[recover] vault=${e} mode=${t?"dry-run":"apply"}`);let r=await jN(e);if(r.length===0){console.log("[recover] No orphaned claude-child sessions found.");return}console.log(`[recover] Found ${r.length} orphan(s):`);for(let o of r){let l=o.taskFilePath??"(not found in vault)";console.log(` session=${o.sessionName} uuid=${o.taskUuid} reason=${o.reason}`),console.log(` file=${l}`)}if(t){console.log("[recover] Dry-run mode: no changes applied. Use --apply to recover.");return}let i=0,s=0;for(let o of r){let l=await $N(o,!1);l.ok?(i++,console.log(`[recover] RECOVERED: ${o.sessionName}`)):(s++,console.error(`[recover] ERROR recovering ${o.sessionName}: ${l.error}`))}console.log(`[recover] Done: recovered=${i} errors=${s}`),s>0&&(process.exitCode=1)})}a(BN,"recoverCommand");var a2=require("fs"),yd=require("path"),Xn=se(or());function fZ(n,e){return e.concat([n])}a(fZ,"collectAlso");var dZ="https://exocortex.my/ontology/find#Alias_sparql",hZ="https://exocortex.my/ontology/exo#Asset_label";function gu(n){if(n&&typeof n=="object"&&"value"in n){let e=n.value;return typeof e=="string"?e:String(e)}return String(n)}a(gu,"nodeValue");async function pZ(n,e){let t=await n.match(void 0,void 0,void 0),r=[];for(let s of t)gu(s.predicate)!==hZ||gu(s.object)!==e||r.push(gu(s.subject));if(r.length===0)return null;let i=[];for(let s of r)for(let o of t)gu(o.predicate)===dZ&&gu(o.subject)===s&&i.push(gu(o.object));if(i.length===0)return null;if(i.length>1)throw new qt(`Ambiguous find__Alias "${e}" \u2014 ${i.length} instances define a sparql fragment`,`Ensure exactly one find__Alias asset has exo:Asset_label "${e}"`);return i[0]}a(pZ,"resolveAliasFragment");var mZ=/^([a-z][a-zA-Z0-9]*)__([A-Za-z0-9_]+)$/,gZ="https://exocortex.my/ontology/";function yZ(n,e){let t=mZ.exec(e);if(t){let i=`<${gZ}${t[1]}#${t[2]}>`;return n.replace(/\?value\b/g,i)}let r=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return n.replace(/\?value\b/g,`"${r}"`)}a(yZ,"bindValueLiteral");function qN(){return new ve("find").description("Find vault assets via SPARQL \u2014 outputs file paths one per line (RFC 8e83442b T1.1)").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--also <path>","Additional vault to include (repeatable)",fZ,[]).option("--sparql <query>","SPARQL SELECT query (must bind ?path)").option("--class <value>","Filter by class label via find__Alias 'class' (e.g. ems__Task)").option("--profile <uid>","FocusProfile UID \u2014 restrict graph to effective AssetSpace set (RFC 0a0791c1)").action(async n=>{ae.setFormat("text");try{if(n.sparql&&n.class)throw new qt("--sparql and --class are mutually exclusive","Pass either a raw --sparql query or a find__Alias-backed flag like --class");if(!n.sparql&&!n.class)throw new qt("one of --sparql <query> or --class <value> is required",'exocortex find --class ems__Task OR exocortex find --sparql "SELECT ?path WHERE { ... }"');let e=(0,yd.resolve)(n.vault);if(!(0,a2.existsSync)(e))throw new Ne(e);let t=n.also||[],r=await da({profileUid:n.profile,primaryVaultPath:e,alsoVaultPaths:t.map(I=>(0,yd.resolve)(I)),outputFormat:"text"}),i=r!==null?{effectiveOntologies:r.effective,assetSpaceFolderToUid:r.folderMap}:{},s=new Mt(e),l=await new Xn.NoteToRDFConverter(s).convertVault(i);for(let I of t){let D=(0,yd.resolve)(I);if(!(0,a2.existsSync)(D))throw new Ne(D);let L=new Mt(D),te=await new Xn.NoteToRDFConverter(L).convertVault(i);l=l.concat(te)}let c=new Xn.InMemoryTripleStore;await c.addAll(l);let u;if(n.class){let I=await pZ(c,"class");if(I===null)throw new qt('No find__Alias with exo:Asset_label "class" was found in the vault',"Seed a find__Alias asset (label=class) or fall back to exocortex find --sparql");u=`SELECT ?path WHERE { ${yZ(I,n.class)} }`}else u=n.sparql;let f=au(u);f=ua(f);let d=new Xn.ExoQLParser,h=fa(ca(e));for(let I of t){let D=fa(ca((0,yd.resolve)(I)));for(let[L,K]of D)h.has(L)||h.set(L,K)}h.size>0&&d.setVaultPrefixes(h);let p=d.parse(f),_=new Xn.ExoQLAlgebraTranslator().translate(p);_.type!=="construct"&&(_=new Xn.AlgebraOptimizer().optimize(_));let w=await new Xn.ExoQLQueryExecutor(c).executeAll(_),E="obsidian://vault/";for(let I of w){let L=I.toJSON().path;if(typeof L!="string"||!L.startsWith(E))continue;let K=L.slice(E.length),te;try{te=decodeURIComponent(K)}catch{te=K}process.stdout.write(te+`
767
767
  `)}}catch(e){ae.handle(e),process.exit(5)}})}a(qN,"findCommand");var f2=require("fs"),d2=require("path"),Oe=se(or());var YN=se(or()),Dt=se(zN());var HN="obsidian://vault/";function PZ(n){let e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;return{async resolveTargetPath(t){if(!t)throw new Error("Cannot resolve empty targetIRI to a vault path");let r=t;if(r.startsWith(HN))r=decodeURI(r.slice(HN.length));else if(e.test(r)){let i=await n.findFileByUID(r);if(!i)throw new Error(`No vault file found for UID: ${r}`);r=i}if(r.endsWith(".md")||(r=`${r}.md`),!await n.fileExists(r))throw new Error(`Cannot resolve target file for IRI "${t}" (tried "${r}")`);return r}}}a(PZ,"createCliPathResolver");var FZ=["openFile","sparqlSelect","getActiveFileIRI","getActiveFilePath","trashFile","duplicateFile"],u2=class extends Error{constructor(t){super(`Service "${t}" is not implemented in the CLI (no-op stub). dyncommand exec on this service_call grounding cannot change vault state. See CLI parity issues #2865-#2868 for port status.`);this.serviceId=t;this.name="CliServiceNotImplementedError"}static{a(this,"CliServiceNotImplementedError")}};function QN(n){return{async execute(){throw new u2(n)}}}a(QN,"notImplementedService");function DZ(n){return e=>{let t=n.getFirstLinkpathDest(e,"");if(!t||!("basename"in t))return null;let i=n.getFrontmatter(t)?.exo__Asset_label;return typeof i=="string"&&i.length>0?i:null}}a(DZ,"createCliClassResolver");function KN(n,e){for(let t of FZ)n.register(t,QN(t));for(let t of["updateProperty","removeProperty","setStatus","createAsset"])n.register(t,QN(t));if(e){if(e.fsAdapter){let t=new YN.FrontmatterService,r=PZ(e.fsAdapter);n.register("updateProperty",(0,Dt.createUpdatePropertyService)(e.fsAdapter,t,r)),n.register("removeProperty",(0,Dt.createRemovePropertyService)(e.fsAdapter,t,r)),n.register("setStatus",(0,Dt.createSetStatusService)(e.fsAdapter,t,r)),n.register("createAsset",(0,Dt.createCreateAssetService)(e.vaultAdapter,e.fsAdapter,DZ(e.vaultAdapter)))}n.register("createRelatedTask",(0,Dt.createCreateRelatedTaskService)(e.vaultAdapter,e.genericAssetCreationService)),n.register("createRelatedProject",(0,Dt.createCreateRelatedProjectService)(e.vaultAdapter,e.genericAssetCreationService)),n.register("archiveAsset",(0,Dt.createArchiveAssetService)(e.vaultAdapter,e.archiveAssetService)),n.register("planForEvening",(0,Dt.createPlanForEveningService)(e.vaultAdapter,e.taskStatusService)),n.register("cleanProperties",(0,Dt.createCleanPropertiesService)(e.vaultAdapter,e.propertyCleanupService)),n.register("renameToUid",(0,Dt.createRenameToUidService)(e.vaultAdapter,e.renameToUidService)),n.register("repairFolder",(0,Dt.createRepairFolderService)(e.vaultAdapter,e.folderRepairService)),n.register("fixMissingLabel",(0,Dt.createFixMissingLabelService)(e.vaultAdapter,e.fixMissingLabelService))}}a(KN,"populateCliServiceRegistry");var NZ=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function LZ(){if(process.stdin.isTTY)return[];let n=[];for await(let t of process.stdin)n.push(t);return Buffer.concat(n).toString("utf-8").split(`
768
768
  `).map(t=>t.trim()).filter(t=>t.length>0)}a(LZ,"readStdinLines");function Cy(n){if(n&&typeof n=="object"&&"value"in n){let e=n.value;return typeof e=="string"?e:String(e)}return String(n)}a(Cy,"nodeValue");async function kZ(n,e){let t=new Oe.IRI("https://exocortex.my/ontology/exocmd#Command_cliName"),r=await n.match(void 0,t,void 0),i=[];for(let s of r)if(Cy(s.object)===e){let c=Cy(s.subject).match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.md$/i);c&&i.push(c[1])}if(i.length===0)return null;if(i.length>1)throw new qt(`Ambiguous cliName "${e}" \u2014 resolves to ${i.length} commands: ${i.join(", ")}`,"Use the UUID directly: exocortex apply <uuid> <path>");return i[0]}a(kZ,"resolveSlugToUuid");async function MZ(n,e){let t=new Oe.IRI("https://exocortex.my/ontology/exocmd#Command_destructive"),r=await n.match(void 0,t,void 0);for(let i of r)if(Cy(i.subject).includes(e)){let o=Cy(i.object);if(o==="true"||o==="True")return!0}return!1}a(MZ,"isDestructive");async function jZ(n,e,t,r,i,s,o,l){let c=(0,d2.resolve)(n,i);if(!(0,f2.existsSync)(c))return console.error(`\u274C Target file not found: ${i}`),!1;let u=new Oe.CommandResolver(e),f=await u.loadCommand(r);if(!f)return console.error(`\u274C Command with UID "${r}" not found.`),!1;if(await MZ(e,r)&&!s.dryRun&&!s.yes)return console.error(`\u274C Command "${f.name}" is marked destructive. Add --dry-run to preview, or --yes to apply.`),!1;let h=(0,Oe.vaultPathToIRI)(i);if(!await new Oe.PreconditionEvaluator(e,void 0,{clock:o}).evaluate(f.precondition,h))return console.error(`\u274C Precondition not satisfied for "${f.name}" on "${i}".`),!1;if(s.dryRun)return console.log(`\u{1F50D} Dry-run: would apply "${f.name}" to "${i}" (precondition passed).`),!0;let _=new Oe.ServiceRegistry,v=new Mt(n),w=new Oe.GenericAssetCreationService(v).withDeterminism({clock:o,uidGenerator:l}),E=new Oe.ArchiveAssetService(v),I=new Oe.PropertyCleanupService(v),D=new Oe.FixMissingLabelService(v),L=new Oe.RenameToUidService(v),K=new Oe.FolderRepairService(v),te=new Oe.TaskStatusService(v,new Oe.EffortStatusWorkflow,new Oe.StatusTimestampService(v)),xe=new _r(n);KN(_,{vaultAdapter:v,fsAdapter:xe,genericAssetCreationService:w,archiveAssetService:E,taskStatusService:te,propertyCleanupService:I,fixMissingLabelService:D,renameToUidService:L,folderRepairService:K});let N=new Oe.GroundingExecutor(xe,xe,_,(0,Oe.createVaultFrontmatterClassLabelResolver)(xe),{clock:o,uidGenerator:l,workflowResolver:t,groundingLoader:a(Z=>u.loadGroundingByUid(Z),"groundingLoader")}),F;if(s.input)try{let Z=JSON.parse(s.input);if(typeof Z!="object"||Z===null||Array.isArray(Z))throw new Error("must be a JSON object");F=Z}catch(Z){let ee=Z instanceof Error?Z.message:String(Z);return console.error(`\u274C --input: invalid JSON object (${ee})`),!1}let j=await N.execute(f.grounding,h,i,F);if(j.success){let Z=f.successMessage??`Applied "${f.name}" to "${i}".`;return console.log(`\u2705 ${Z}`),!0}else return console.error(`\u274C "${f.name}" failed on "${i}": ${j.error}`),!1}a(jZ,"executeOnTarget");function XN(){return new ve("apply").description("Apply an exocmd__Command to one or more vault assets (RFC 8e83442b T1.2). Pass a path arg or pipe paths via stdin.").argument("<cmd>","Command UUID or cliName slug").argument("[path]","Vault-relative path to target asset (omit to read paths from stdin)").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--dry-run","Preview without writing").option("--yes","Skip destructive-command confirmation").option("--input <json>","JSON userInput for service_call groundings").option("--seed <uuid>","Deterministic UID seed for test/replay (uses seededUidGenerator)").option("--frozen-clock <iso>","Freeze clock to ISO timestamp for test/replay (uses frozenClock)").action(async(n,e,t)=>{ae.setFormat("text");try{let r=(0,d2.resolve)(t.vault);if(!(0,f2.existsSync)(r))throw new Ne(r);py(r);let i=t.frozenClock?(0,Oe.frozenClock)(t.frozenClock):(0,Oe.liveClock)(),s=t.seed?(0,Oe.seededUidGenerator)(t.seed):(0,Oe.liveUidGenerator)(),o=new Mt(r),c=await new Oe.NoteToRDFConverter(o).convertVault(),u=new Oe.InMemoryTripleStore;await u.addAll(c);let f=new Oe.WorkflowResolver(u),d;if(NZ.test(n))d=n;else{let _=await kZ(u,n);_||(console.error(`\u274C No command found with UUID or cliName "${n}".`),process.exit(3)),d=_}let h;if(e)h=[e];else if(h=await LZ(),h.length===0)throw new qt("No target path provided and stdin is empty.","exocortex apply <uuid> <path> OR exocortex find ... | exocortex apply <uuid>");let p=0,y=0;for(let _ of h)await jZ(r,u,f,d,_,t,i,s)?p++:y++;h.length>1&&console.log(`
769
- \u{1F4CA} Applied to ${p}/${h.length} target(s) (${y} failed).`),y>0&&process.exit(5)}catch(r){ae.handle(r),process.exit(5)}})}a(XN,"applyCommand");var pa=require("fs"),yu=require("path");var JN=/^---\s*$/,$Z=/^exocmd__Grounding_type:\s*(.+?)\s*$/,UZ=/^"?\[\[[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?:\|[^\]]*)?\]\]"?$/i,VZ=new Set(["node_modules"]);function BZ(n){return n.startsWith(".")||VZ.has(n)}a(BZ,"shouldSkipDir");function*ZN(n){let e;try{e=(0,pa.readdirSync)(n,{withFileTypes:!0})}catch(t){let r=t;if(r.code==="EPERM"||r.code==="EACCES"||r.code==="ENOENT")return;throw t}for(let t of e){let r=(0,yu.join)(n,t.name);if(t.isDirectory()){if(BZ(t.name))continue;yield*ZN(r)}else t.isFile()&&t.name.endsWith(".md")&&(yield r)}}a(ZN,"walkMarkdownFiles");function qZ(n){let e=n.split(/\r?\n/);if(e.length<2||!JN.test(e[0]))return null;for(let t=1;t<e.length;t++)if(JN.test(e[t]))return{lines:e.slice(1,t),startLine:2};return null}a(qZ,"extractFrontmatter");function GZ(n){let e=n.trim();return e===""||e==="null"||e==="~"?!1:!UZ.test(e)}a(GZ,"isLiteralForm");function WZ(n){let e=[];for(let t of ZN(n)){let r;try{r=(0,pa.readFileSync)(t,"utf-8")}catch{continue}let i=qZ(r);if(i)for(let s=0;s<i.lines.length;s++){let o=i.lines[s].match($Z);if(!o)continue;let l=o[1];GZ(l)&&e.push({path:(0,yu.relative)(n,t),line:i.startLine+s,value:l})}}return e}a(WZ,"scanVaultForLiteralForm");function eL(){return new ve("grounding-type-literal-form").description("Detect post-Phase-4+1 regressions: any exocmd__Grounding_type literal-string form (not wikilink) in vault frontmatter").requiredOption("--vault <path>","Vault root directory").option("--output <type>","Response format: text|json","text").action(n=>{let e=n.output??"text";ae.setFormat(e);try{let t=(0,yu.resolve)(n.vault);if(!(0,pa.existsSync)(t)||!(0,pa.statSync)(t).isDirectory())throw new Ne(t);let r=WZ(t);if(e==="json")console.log(JSON.stringify({vaultPath:t,violationCount:r.length,violations:r,clean:r.length===0},null,2));else if(r.length===0)console.log(`OK ${t}: 0 exocmd__Grounding_type literal-form violations`);else{console.error(`FAIL ${t}: ${r.length} exocmd__Grounding_type literal-form violation(s):`);for(let i of r)console.error(` ${i.path}:${i.line} \u2014 value: ${i.value}`);console.error("\nRFC 9d20c91f Phase 3 migrated all values to wikilink form `[[<uid>]]`. Re-run the Phase 3 migration script or hand-edit offending files.")}r.length>0&&(process.exitCode=1)}catch(t){ae.handle(t)}})}a(eL,"auditGroundingTypeLiteralFormCommand");function tL(){let n=new ve("audit").description("Audit vault for regression patterns (RFC cutover detectors)");return n.addCommand(eL()),n}a(tL,"auditCommand");function rL(n){let e=new ve;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.47.1"),e.addCommand(qN()),e.addCommand(XN()),e.addCommand(yD()),e.addCommand(wD()),e.addCommand(HD()),e.addCommand(TD()),e.addCommand(AD()),e.addCommand(OD()),e.addCommand(KD()),e.addCommand(aN()),e.addCommand(uN()),e.addCommand(fN()),e.addCommand(hN()),e.addCommand(TN()),e.addCommand(AN()),e.addCommand(FN()),e.addCommand(BN()),e.addCommand(tL()),e}a(rL,"createProgram");rL().parse();0&&(module.exports={createProgram});
769
+ \u{1F4CA} Applied to ${p}/${h.length} target(s) (${y} failed).`),y>0&&process.exit(5)}catch(r){ae.handle(r),process.exit(5)}})}a(XN,"applyCommand");var pa=require("fs"),yu=require("path");var JN=/^---\s*$/,$Z=/^exocmd__Grounding_type:\s*(.+?)\s*$/,UZ=/^"?\[\[[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?:\|[^\]]*)?\]\]"?$/i,VZ=new Set(["node_modules"]);function BZ(n){return n.startsWith(".")||VZ.has(n)}a(BZ,"shouldSkipDir");function*ZN(n){let e;try{e=(0,pa.readdirSync)(n,{withFileTypes:!0})}catch(t){let r=t;if(r.code==="EPERM"||r.code==="EACCES"||r.code==="ENOENT")return;throw t}for(let t of e){let r=(0,yu.join)(n,t.name);if(t.isDirectory()){if(BZ(t.name))continue;yield*ZN(r)}else t.isFile()&&t.name.endsWith(".md")&&(yield r)}}a(ZN,"walkMarkdownFiles");function qZ(n){let e=n.split(/\r?\n/);if(e.length<2||!JN.test(e[0]))return null;for(let t=1;t<e.length;t++)if(JN.test(e[t]))return{lines:e.slice(1,t),startLine:2};return null}a(qZ,"extractFrontmatter");function GZ(n){let e=n.trim();return e===""||e==="null"||e==="~"?!1:!UZ.test(e)}a(GZ,"isLiteralForm");function WZ(n){let e=[];for(let t of ZN(n)){let r;try{r=(0,pa.readFileSync)(t,"utf-8")}catch{continue}let i=qZ(r);if(i)for(let s=0;s<i.lines.length;s++){let o=i.lines[s].match($Z);if(!o)continue;let l=o[1];GZ(l)&&e.push({path:(0,yu.relative)(n,t),line:i.startLine+s,value:l})}}return e}a(WZ,"scanVaultForLiteralForm");function eL(){return new ve("grounding-type-literal-form").description("Detect post-Phase-4+1 regressions: any exocmd__Grounding_type literal-string form (not wikilink) in vault frontmatter").requiredOption("--vault <path>","Vault root directory").option("--output <type>","Response format: text|json","text").action(n=>{let e=n.output??"text";ae.setFormat(e);try{let t=(0,yu.resolve)(n.vault);if(!(0,pa.existsSync)(t)||!(0,pa.statSync)(t).isDirectory())throw new Ne(t);let r=WZ(t);if(e==="json")console.log(JSON.stringify({vaultPath:t,violationCount:r.length,violations:r,clean:r.length===0},null,2));else if(r.length===0)console.log(`OK ${t}: 0 exocmd__Grounding_type literal-form violations`);else{console.error(`FAIL ${t}: ${r.length} exocmd__Grounding_type literal-form violation(s):`);for(let i of r)console.error(` ${i.path}:${i.line} \u2014 value: ${i.value}`);console.error("\nRFC 9d20c91f Phase 3 migrated all values to wikilink form `[[<uid>]]`. Re-run the Phase 3 migration script or hand-edit offending files.")}r.length>0&&(process.exitCode=1)}catch(t){ae.handle(t)}})}a(eL,"auditGroundingTypeLiteralFormCommand");function tL(){let n=new ve("audit").description("Audit vault for regression patterns (RFC cutover detectors)");return n.addCommand(eL()),n}a(tL,"auditCommand");function rL(n){let e=new ve;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.47.2"),e.addCommand(qN()),e.addCommand(XN()),e.addCommand(yD()),e.addCommand(wD()),e.addCommand(HD()),e.addCommand(TD()),e.addCommand(AD()),e.addCommand(OD()),e.addCommand(KD()),e.addCommand(aN()),e.addCommand(uN()),e.addCommand(fN()),e.addCommand(hN()),e.addCommand(TN()),e.addCommand(AN()),e.addCommand(FN()),e.addCommand(BN()),e.addCommand(tL()),e}a(rL,"createProgram");rL().parse();0&&(module.exports={createProgram});
770
770
  /*! Bundled license information:
771
771
 
772
772
  reflect-metadata/Reflect.js:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitelev/exocortex-cli",
3
- "version": "16.47.1",
3
+ "version": "16.47.2",
4
4
  "description": "CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more",
5
5
  "main": "dist/index.js",
6
6
  "bin": {