@kitelev/exocortex-cli 16.69.6 → 16.69.7
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/index.js +3 -3
- 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.69.
|
|
2
|
+
// @kitelev/exocortex-cli v16.69.7
|
|
3
3
|
// CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
|
|
4
4
|
// License: MIT
|
|
5
5
|
|
|
@@ -774,7 +774,7 @@ ${r}`}a(mZ,"serializeFile");function KN(n,e,t={}){let r=_y.default.dirname(n),i=
|
|
|
774
774
|
`).map(s=>s.trim()).filter(Boolean)){let s=gZ.exec(i);if(s){r.push({sessionName:i,uuid:s[1],type:"full"});continue}let o=yZ.exec(i);o&&r.push({sessionName:i,uuid:o[1],type:"short"})}return r}a(bZ,"listClaudeChildSessions");function wZ(n,e,t){let r=null,i=e.toLowerCase();function s(o){if(r)return;let l;try{l=(0,wy.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,JN.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(wZ,"findVaultFile");function SZ(n,e){try{let i=(e??(s=>(0,wy.readFileSync)(s,"utf8")))(n).match(/ems__Effort_status\s*:.*\[\[([^\]]+)\]\]/);return i?i[1].includes(_Z):!1}catch{return!1}}a(SZ,"isTaskDoing");async function eL(n,e=by.exec,t){let r=await bZ(e),i=[];for(let s of r){let o=wZ(n,s.uuid,s.type);if(!o){i.push({sessionName:s.sessionName,taskUuid:s.uuid,taskFilePath:null,reason:"vault task not found"});continue}SZ(o,t)||i.push({sessionName:s.sessionName,taskUuid:s.uuid,taskFilePath:o,reason:"vault task status != Doing"})}return i}a(eL,"detectOrphans");async function tL(n,e,t=by.exec,r=KN){let i=ZN(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(tL,"recoverOrphan");function vZ(){return process.env.EXOCORTEX_VAULT??(0,Sy.join)((0,nL.homedir)(),"vault-2025")}a(vZ,"defaultVault");function iL(){return new ne("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",vZ()).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,Sy.resolve)(n.vault);if(!(0,rL.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 eL(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 tL(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(iL,"recoverCommand");var d2=require("fs"),vy=require("path"),Yn=Y(vt());function EZ(n,e){return e.concat([n])}a(EZ,"collectAlso");var TZ="https://exocortex.my/ontology/find#Alias_sparql",IZ="https://exocortex.my/ontology/exo#Asset_label";function du(n){if(n&&typeof n=="object"&&"value"in n){let e=n.value;return typeof e=="string"?e:String(e)}return String(n)}a(du,"nodeValue");async function xZ(n,e){let t=await n.match(void 0,void 0,void 0),r=[];for(let s of t)du(s.predicate)!==IZ||du(s.object)!==e||r.push(du(s.subject));if(r.length===0)return null;let i=[];for(let s of r)for(let o of t)du(o.predicate)===TZ&&du(o.subject)===s&&i.push(du(o.object));if(i.length===0)return null;if(i.length>1)throw new Le(`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(xZ,"resolveAliasFragment");var AZ=/^([a-z][a-zA-Z0-9]*)__([A-Za-z0-9_]+)$/,RZ="https://exocortex.my/ontology/";function CZ(n,e){let t=AZ.exec(e);if(t){let i=`<${RZ}${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(CZ,"bindValueLiteral");function sL(){return new ne("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)",EZ,[]).option("--sparql <query>","SPARQL SELECT query (must bind ?path)").option("--class <value>","Filter by class label via find__Alias 'class' (e.g. ems__Task)").action(async n=>{ee.setFormat("text");try{if(n.sparql&&n.class)throw new Le("--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 Le("one of --sparql <query> or --class <value> is required",'exocortex find --class ems__Task OR exocortex find --sparql "SELECT ?path WHERE { ... }"');let e=(0,vy.resolve)(n.vault);if(!(0,d2.existsSync)(e))throw new ce(e);let t=n.also||[],r=new gt(e),s=await new Yn.NoteToRDFConverter(r).convertVault();for(let S of t){let v=(0,vy.resolve)(S);if(!(0,d2.existsSync)(v))throw new ce(v);let I=new gt(v),C=await new Yn.NoteToRDFConverter(I).convertVault();s=s.concat(C)}let o=new Yn.InMemoryTripleStore;await o.addAll(s);let l;if(n.class){let S=await xZ(o,"class");if(S===null)throw new Le('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");l=`SELECT ?path WHERE { ${CZ(S,n.class)} }`}else l=n.sparql;let c=ru(l);c=oa(c);let u=new Yn.ExoQLParser,f=aa(sa(e));for(let S of t){let v=aa(sa((0,vy.resolve)(S)));for(let[I,O]of v)f.has(I)||f.set(I,O)}f.size>0&&u.setVaultPrefixes(f);let d=u.parse(c),p=new Yn.ExoQLAlgebraTranslator().translate(d);p.type!=="construct"&&(p=new Yn.AlgebraOptimizer().optimize(p));let _=await new Yn.ExoQLQueryExecutor(o).executeAll(p),E="obsidian://vault/";for(let S of _){let I=S.toJSON().path;if(typeof I!="string"||!I.startsWith(E))continue;let O=I.slice(E.length),C;try{C=decodeURIComponent(O)}catch{C=O}process.stdout.write(C+`
|
|
775
775
|
`)}}catch(e){ee.handle(e),process.exit(5)}})}a(sL,"findCommand");var m2=require("fs"),g2=require("path"),Re=Y(vt());var oL=Y(vt());function aL(n,e){return t=>{let r=typeof t.filePath=="string"&&t.filePath.length>0?t.filePath:null;if(r===null)return!1;let i=n.getAbstractFileByPath(r);if(i===null||!("basename"in i))return!1;let s=i,o=n.getFrontmatter(s)??{},l=e.getExpectedFolderSync(s,o),c=typeof t.currentFolder=="string"?t.currentFolder:s.parent?.path??"";return(0,oL.needsFolderRepair)(c,l)}}a(aL,"createIsInWrongFolderHostFunction");var hL=Y(vt()),Lt=Y(uL());var fL="obsidian://vault/";function GZ(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(fL))r=decodeURI(r.slice(fL.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(GZ,"createCliPathResolver");var qZ=["openFile","sparqlSelect","getActiveFileIRI","getActiveFilePath","trashFile","duplicateFile"],p2=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 dL(n){return{async execute(){throw new p2(n)}}}a(dL,"notImplementedService");function WZ(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(WZ,"createCliClassResolver");function pL(n,e){for(let t of qZ)n.register(t,dL(t));for(let t of["updateProperty","removeProperty","setStatus","createAsset"])n.register(t,dL(t));if(e){if(e.fsAdapter){let t=new hL.FrontmatterService,r=GZ(e.fsAdapter);n.register("updateProperty",(0,Lt.createUpdatePropertyService)(e.fsAdapter,t,r)),n.register("removeProperty",(0,Lt.createRemovePropertyService)(e.fsAdapter,t,r)),n.register("setStatus",(0,Lt.createSetStatusService)(e.fsAdapter,t,r)),n.register("createAsset",(0,Lt.createCreateAssetService)(e.vaultAdapter,e.fsAdapter,WZ(e.vaultAdapter)))}n.register("createRelatedTask",(0,Lt.createCreateRelatedTaskService)(e.vaultAdapter,e.genericAssetCreationService)),n.register("createRelatedProject",(0,Lt.createCreateRelatedProjectService)(e.vaultAdapter,e.genericAssetCreationService)),n.register("archiveAsset",(0,Lt.createArchiveAssetService)(e.vaultAdapter,e.archiveAssetService)),n.register("planForEvening",(0,Lt.createPlanForEveningService)(e.vaultAdapter,e.taskStatusService)),n.register("cleanProperties",(0,Lt.createCleanPropertiesService)(e.vaultAdapter,e.propertyCleanupService)),n.register("renameToUid",(0,Lt.createRenameToUidService)(e.vaultAdapter,e.renameToUidService)),n.register("repairFolder",(0,Lt.createRepairFolderService)(e.vaultAdapter,e.folderRepairService)),n.register("fixMissingLabel",(0,Lt.createFixMissingLabelService)(e.vaultAdapter,e.fixMissingLabelService))}}a(pL,"populateCliServiceRegistry");var zZ=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function HZ(){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(`
|
|
776
776
|
`).map(t=>t.trim()).filter(t=>t.length>0)}a(HZ,"readStdinLines");function Iy(n){if(n&&typeof n=="object"&&"value"in n){let e=n.value;return typeof e=="string"?e:String(e)}return String(n)}a(Iy,"nodeValue");async function QZ(n,e){let t=new Re.IRI("https://exocortex.my/ontology/exocmd#Command_cliName"),r=await n.match(void 0,t,void 0),i=[];for(let s of r)if(Iy(s.object)===e){let c=Iy(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 Le(`Ambiguous cliName "${e}" \u2014 resolves to ${i.length} commands: ${i.join(", ")}`,"Use the UUID directly: exocortex apply <uuid> <path>");return i[0]}a(QZ,"resolveSlugToUuid");async function XZ(n,e){let t=new Re.IRI("https://exocortex.my/ontology/exocmd#Command_destructive"),r=await n.match(void 0,t,void 0);for(let i of r)if(Iy(i.subject).includes(e)){let o=Iy(i.object);if(o==="true"||o==="True")return!0}return!1}a(XZ,"isDestructive");async function YZ(n,e,t,r,i,s,o,l){let c=(0,g2.resolve)(n,i);if(!(0,m2.existsSync)(c))return console.error(`\u274C Target file not found: ${i}`),!1;let u=new Re.CommandResolver(e),f=await u.loadCommand(r);if(!f)return console.error(`\u274C Command with UID "${r}" not found.`),!1;if(await XZ(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,Re.vaultPathToIRI)(i),p=new gt(n),g=new Re.FolderRepairService(p),_=new Re.PreconditionEvaluator(e,void 0,{clock:o});(0,Re.registerDefaultHostFunctions)(_),_.registerHostFunction("isInWrongFolder",aL(p,g));let E=p.getAbstractFileByPath(i),S=E!==null&&"basename"in E?E:null,v=S?p.getFrontmatter(S):null,I=v&&typeof v=="object"?v.exo__Asset_uid:void 0,O={targetIRI:h,filePath:i,fileBasename:S?.basename,assetUid:typeof I=="string"?I:void 0};if(!await _.evaluate(f.precondition,h,O))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 B=new Re.ServiceRegistry,ie=new Re.GenericAssetCreationService(p).withDeterminism({clock:o,uidGenerator:l}),Ne=new Re.ArchiveAssetService(p),L=new Re.PropertyCleanupService(p),N=new Re.FixMissingLabelService(p),G=new Re.RenameToUidService(p),te=new Re.TaskStatusService(p,new Re.EffortStatusWorkflow,new Re.StatusTimestampService(p)),W=new Jt(n);pL(B,{vaultAdapter:p,fsAdapter:W,genericAssetCreationService:ie,archiveAssetService:Ne,taskStatusService:te,propertyCleanupService:L,fixMissingLabelService:N,renameToUidService:G,folderRepairService:g});let se=new Re.GroundingExecutor(W,W,B,(0,Re.createVaultFrontmatterClassLabelResolver)(W),{clock:o,uidGenerator:l,workflowResolver:t,groundingLoader:a(K=>u.loadGroundingByUid(K),"groundingLoader")}),he;if(s.input)try{let K=JSON.parse(s.input);if(typeof K!="object"||K===null||Array.isArray(K))throw new Error("must be a JSON object");he=K}catch(K){let V=K instanceof Error?K.message:String(K);return console.error(`\u274C --input: invalid JSON object (${V})`),!1}let He=await se.execute(f.grounding,h,i,he);if(He.success){let K=f.successMessage??`Applied "${f.name}" to "${i}".`;return console.log(`\u2705 ${K}`),!0}else return console.error(`\u274C "${f.name}" failed on "${i}": ${He.error}`),!1}a(YZ,"executeOnTarget");function mL(){return new ne("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)=>{ee.setFormat("text");try{let r=(0,g2.resolve)(t.vault);if(!(0,m2.existsSync)(r))throw new ce(r);ly(r);let i=t.frozenClock?(0,Re.frozenClock)(t.frozenClock):(0,Re.liveClock)(),s=t.seed?(0,Re.seededUidGenerator)(t.seed):(0,Re.liveUidGenerator)(),o=new gt(r),c=await new Re.NoteToRDFConverter(o).convertVault(),u=new Re.InMemoryTripleStore;await u.addAll(c);let f=new Re.WorkflowResolver(u),d;if(zZ.test(n))d=n;else{let _=await QZ(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 HZ(),h.length===0)throw new Le("No target path provided and stdin is empty.","exocortex apply <uuid> <path> OR exocortex find ... | exocortex apply <uuid>");let p=0,g=0;for(let _ of h)await YZ(r,u,f,d,_,t,i,s)?p++:g++;h.length>1&&console.log(`
|
|
777
|
-
\u{1F4CA} Applied to ${p}/${h.length} target(s) (${g} failed).`),g>0&&process.exit(5)}catch(r){ee.handle(r),process.exit(5)}})}a(mL,"applyCommand");var ca=require("fs"),hu=require("path");var gL=/^---\s*$/,KZ=/^exocmd__Grounding_type:\s*(.+?)\s*$/,JZ=/^"?\[\[[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?:\|[^\]]*)?\]\]"?$/i,ZZ=new Set(["node_modules"]);function eee(n){return n.startsWith(".")||ZZ.has(n)}a(eee,"shouldSkipDir");function*yL(n){let e;try{e=(0,ca.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,hu.join)(n,t.name);if(t.isDirectory()){if(eee(t.name))continue;yield*yL(r)}else t.isFile()&&t.name.endsWith(".md")&&(yield r)}}a(yL,"walkMarkdownFiles");function tee(n){let e=n.split(/\r?\n/);if(e.length<2||!gL.test(e[0]))return null;for(let t=1;t<e.length;t++)if(gL.test(e[t]))return{lines:e.slice(1,t),startLine:2};return null}a(tee,"extractFrontmatter");function ree(n){let e=n.trim();return e===""||e==="null"||e==="~"?!1:!JZ.test(e)}a(ree,"isLiteralForm");function nee(n){let e=[];for(let t of yL(n)){let r;try{r=(0,ca.readFileSync)(t,"utf-8")}catch{continue}let i=tee(r);if(i)for(let s=0;s<i.lines.length;s++){let o=i.lines[s].match(KZ);if(!o)continue;let l=o[1];ree(l)&&e.push({path:(0,hu.relative)(n,t),line:i.startLine+s,value:l})}}return e}a(nee,"scanVaultForLiteralForm");function _L(){return new ne("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";ee.setFormat(e);try{let t=(0,hu.resolve)(n.vault);if(!(0,ca.existsSync)(t)||!(0,ca.statSync)(t).isDirectory())throw new ce(t);let r=nee(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){ee.handle(t)}})}a(_L,"auditGroundingTypeLiteralFormCommand");var Ry=require("fs"),b2=Y(require("path")),wL=require("path"),SL=Y(vt());var xy=class n extends Jt{constructor(t){super(t);this.indexed=!1;this.uidToPath=new Map;this.allPaths=[];this.pathSet=new Set;this.assets=[]}static{a(this,"CachingNodeFsAdapter")}async buildIndex(){if(this.indexed)return;let t=await super.getMarkdownFiles();for(let r of t){this.allPaths.push(r),this.pathSet.add(r);let i={};try{i=await super.getFileMetadata(r)}catch{i={}}let s=i?.exo__Asset_uid,o=Array.isArray(s)?s:[s];for(let l of o){let c=n.normalizeUid(l);c.length>0&&!this.uidToPath.has(c)&&this.uidToPath.set(c,r)}this.assets.push({path:r,metadata:i})}this.indexed=!0}async indexedAssets(){return await this.buildIndex(),this.assets}async getMarkdownFiles(t){return t?super.getMarkdownFiles(t):(await this.buildIndex(),this.allPaths)}async findFileByUID(t){return await this.buildIndex(),this.uidToPath.get(n.normalizeUid(t))??null}static normalizeUid(t){return t==null?"":String(t).replace(/["'[\]]/g,"").trim()}async fileExists(t){await this.buildIndex();let r=t.replace(/\\/g,"/").replace(/^\.\//,"");return this.pathSet.has(r)?!0:super.fileExists(t)}};var Ay=Y(require("path"));async function bL(n,e,t){let r=e.endsWith(".md")?e:`${e}.md`;if(e.includes("/")&&await n.fileExists(r))return r;let i=Ay.default.dirname(t),s=i!=="."?`${i}/${r}`:r;if(await n.fileExists(s))return s;let l=await n.findFileByUID(e);return l||(await n.getMarkdownFiles()).find(f=>{let d=Ay.default.basename(f,".md"),h=Ay.default.basename(r,".md");return d===h})||null}a(bL,"findReferencedFile");function y2(n){return n.replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/$/,"")}a(y2,"normalizePath");var iee=5;function _2(n,e,t){n[e].length<iee&&n[e].push(t)}a(_2,"addExample");async function see(n){let e=new xy(n),t=await e.indexedAssets(),r=[],i={"empty-isDefinedBy":0,"bang-prefix":0,unresolvable:0},s={"empty-isDefinedBy":[],"bang-prefix":[],unresolvable:[]},o=0;for(let{path:l,metadata:c}of t){if(l.split("/").includes("node_modules"))continue;let u=c.exo__Asset_isDefinedBy,f=(0,SL.extractAssetReference)(u);if(!f){i["empty-isDefinedBy"]++,_2(s,"empty-isDefinedBy",l);continue}if(f.startsWith("!")){i["bang-prefix"]++,_2(s,"bang-prefix",l);continue}let d=await bL(e,f,l);if(!d){i.unresolvable++,_2(s,"unresolvable",l);continue}o++;let h=y2(b2.default.dirname(d)),p=y2(b2.default.dirname(l));h!==p&&r.push({path:l,isDefinedBy:f,expectedFolder:h,actualFolder:p})}return{vaultPath:n,totalFiles:t.length,checked:o,violations:r,skips:i,skipExamples:s}}a(see,"scanVaultForCoLocation");function vL(){return new ne("co-location").description("Detect asset\u2013ontology co-location violations: any asset not in the folder of its exo__Asset_isDefinedBy ontology file (fail-open, skip-accounted)").requiredOption("--vault <path>","Vault root directory").option("--output <type>","Response format: text|json","text").action(async n=>{let e=n.output??"text";ee.setFormat(e);try{let t=(0,wL.resolve)(n.vault);if(!(0,Ry.existsSync)(t)||!(0,Ry.statSync)(t).isDirectory())throw new ce(t);let r=await see(t),i=r.skips["empty-isDefinedBy"]+r.skips["bang-prefix"]+r.skips.unresolvable;if(e==="json")console.log(JSON.stringify({vaultPath:r.vaultPath,totalFiles:r.totalFiles,checked:r.checked,violationCount:r.violations.length,violations:r.violations,skips:r.skips,skipTotal:i,skipExamples:r.skipExamples,clean:r.violations.length===0},null,2));else{if(r.violations.length===0)console.log(`OK ${t}: 0 co-location violations (${r.checked}/${r.totalFiles} checked)`);else{console.error(`FAIL ${t}: ${r.violations.length} co-location violation(s) (${r.checked}/${r.totalFiles} checked):`);for(let s of r.violations)console.error(` ${s.path}
|
|
777
|
+
\u{1F4CA} Applied to ${p}/${h.length} target(s) (${g} failed).`),g>0&&process.exit(5)}catch(r){ee.handle(r),process.exit(5)}})}a(mL,"applyCommand");var ca=require("fs"),hu=require("path");var gL=/^---\s*$/,KZ=/^exocmd__Grounding_type:\s*(.+?)\s*$/,JZ=/^"?\[\[[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?:\|[^\]]*)?\]\]"?$/i,ZZ=new Set(["node_modules"]);function eee(n){return n.startsWith(".")||ZZ.has(n)}a(eee,"shouldSkipDir");function*yL(n){let e;try{e=(0,ca.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,hu.join)(n,t.name);if(t.isDirectory()){if(eee(t.name))continue;yield*yL(r)}else t.isFile()&&t.name.endsWith(".md")&&(yield r)}}a(yL,"walkMarkdownFiles");function tee(n){let e=n.split(/\r?\n/);if(e.length<2||!gL.test(e[0]))return null;for(let t=1;t<e.length;t++)if(gL.test(e[t]))return{lines:e.slice(1,t),startLine:2};return null}a(tee,"extractFrontmatter");function ree(n){let e=n.trim();return e===""||e==="null"||e==="~"?!1:!JZ.test(e)}a(ree,"isLiteralForm");function nee(n){let e=[];for(let t of yL(n)){let r;try{r=(0,ca.readFileSync)(t,"utf-8")}catch{continue}let i=tee(r);if(i)for(let s=0;s<i.lines.length;s++){let o=i.lines[s].match(KZ);if(!o)continue;let l=o[1];ree(l)&&e.push({path:(0,hu.relative)(n,t),line:i.startLine+s,value:l})}}return e}a(nee,"scanVaultForLiteralForm");function _L(){return new ne("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";ee.setFormat(e);try{let t=(0,hu.resolve)(n.vault);if(!(0,ca.existsSync)(t)||!(0,ca.statSync)(t).isDirectory())throw new ce(t);let r=nee(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){ee.handle(t)}})}a(_L,"auditGroundingTypeLiteralFormCommand");var Ry=require("fs"),b2=Y(require("path")),wL=require("path"),SL=Y(vt());var xy=class n extends Jt{constructor(t){super(t);this.indexed=!1;this.uidToPath=new Map;this.allPaths=[];this.pathSet=new Set;this.assets=[]}static{a(this,"CachingNodeFsAdapter")}async buildIndex(){if(this.indexed)return;let t=await super.getMarkdownFiles();for(let r of t){this.allPaths.push(r),this.pathSet.add(r);let i={};try{i=await super.getFileMetadata(r)}catch{i={}}let s=i?.exo__Asset_uid,o=Array.isArray(s)?s:[s];for(let l of o){let c=n.normalizeUid(l);c.length>0&&!this.uidToPath.has(c)&&this.uidToPath.set(c,r)}this.assets.push({path:r,metadata:i})}this.indexed=!0}async indexedAssets(){return await this.buildIndex(),this.assets}async getMarkdownFiles(t){return t?super.getMarkdownFiles(t):(await this.buildIndex(),this.allPaths)}async findFileByUID(t){return await this.buildIndex(),this.uidToPath.get(n.normalizeUid(t))??null}static normalizeUid(t){return t==null?"":String(t).replace(/["'[\]]/g,"").trim()}async fileExists(t){await this.buildIndex();let r=t.replace(/\\/g,"/").replace(/^\.\//,"");return this.pathSet.has(r)?!0:super.fileExists(t)}};var Ay=Y(require("path"));async function bL(n,e,t){let r=e.endsWith(".md")?e:`${e}.md`;if(e.includes("/")&&await n.fileExists(r))return r;let i=Ay.default.dirname(t),s=i!=="."?`${i}/${r}`:r;if(await n.fileExists(s))return s;let l=await n.findFileByUID(e);return l||(await n.getMarkdownFiles()).find(f=>{let d=Ay.default.basename(f,".md"),h=Ay.default.basename(r,".md");return d===h})||null}a(bL,"findReferencedFile");function y2(n){return n.replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/$/,"")}a(y2,"normalizePath");var iee=5;function _2(n,e,t){n[e].length<iee&&n[e].push(t)}a(_2,"addExample");async function see(n){let e=new xy(n),t=await e.indexedAssets(),r=[],i={"empty-isDefinedBy":0,"bang-prefix":0,unresolvable:0},s={"empty-isDefinedBy":[],"bang-prefix":[],unresolvable:[]},o=0;for(let{path:l,metadata:c}of t){if(l.split("/").includes("node_modules")||l.split("/").includes("09 Templates"))continue;let u=c.exo__Asset_isDefinedBy,f=(0,SL.extractAssetReference)(u);if(!f){i["empty-isDefinedBy"]++,_2(s,"empty-isDefinedBy",l);continue}if(f.startsWith("!")){i["bang-prefix"]++,_2(s,"bang-prefix",l);continue}let d=await bL(e,f,l);if(!d){i.unresolvable++,_2(s,"unresolvable",l);continue}o++;let h=y2(b2.default.dirname(d)),p=y2(b2.default.dirname(l));h!==p&&r.push({path:l,isDefinedBy:f,expectedFolder:h,actualFolder:p})}return{vaultPath:n,totalFiles:t.length,checked:o,violations:r,skips:i,skipExamples:s}}a(see,"scanVaultForCoLocation");function vL(){return new ne("co-location").description("Detect asset\u2013ontology co-location violations: any asset not in the folder of its exo__Asset_isDefinedBy ontology file (fail-open, skip-accounted)").requiredOption("--vault <path>","Vault root directory").option("--output <type>","Response format: text|json","text").action(async n=>{let e=n.output??"text";ee.setFormat(e);try{let t=(0,wL.resolve)(n.vault);if(!(0,Ry.existsSync)(t)||!(0,Ry.statSync)(t).isDirectory())throw new ce(t);let r=await see(t),i=r.skips["empty-isDefinedBy"]+r.skips["bang-prefix"]+r.skips.unresolvable;if(e==="json")console.log(JSON.stringify({vaultPath:r.vaultPath,totalFiles:r.totalFiles,checked:r.checked,violationCount:r.violations.length,violations:r.violations,skips:r.skips,skipTotal:i,skipExamples:r.skipExamples,clean:r.violations.length===0},null,2));else{if(r.violations.length===0)console.log(`OK ${t}: 0 co-location violations (${r.checked}/${r.totalFiles} checked)`);else{console.error(`FAIL ${t}: ${r.violations.length} co-location violation(s) (${r.checked}/${r.totalFiles} checked):`);for(let s of r.violations)console.error(` ${s.path}
|
|
778
778
|
isDefinedBy=${s.isDefinedBy} expected=${s.expectedFolder}/ actual=${s.actualFolder}/`)}console.error(`
|
|
779
779
|
Skipped (fail-open, NOT verified): ${i} \u2014 empty-isDefinedBy=${r.skips["empty-isDefinedBy"]}, bang-prefix=${r.skips["bang-prefix"]}, unresolvable(cross-vault/missing)=${r.skips.unresolvable}`)}r.violations.length>0&&(process.exitCode=1)}catch(t){ee.handle(t)}})}a(vL,"auditCoLocationCommand");function EL(){let n=new ne("audit").description("Audit vault for regression patterns (RFC cutover detectors)");return n.addCommand(_L()),n.addCommand(vL()),n}a(EL,"auditCommand");var TL=require("fs"),IL=require("path");var Cy=Y(Yo()),Py=Y(require("path"));var oee="49fd2e56-4656-4ca7-a789-f472b16ea260",aee="c9c65b0f-1e01-47c1-a1f9-1bf70b11df6a",lee="0cde1557-6320-4bd0-a7c4-8b72afc38720",cee=new Set([oee,aee,lee]),uee="73bd00e4-ccc0-4f3f-b20d-c4388c4588fb",fee="3de846cd-1f0e-4f98-8613-b8587aa15174",dee=5,Oy=class{static{a(this,"CliFocusProfileResolver")}constructor(e){let t=e.alsoVaultPaths??[];this.vaultPaths=[e.vaultPath,...t].map(r=>Py.default.resolve(r)),this.maxExtendsDepth=e.maxExtendsDepth??dee,this.warn=e.warn??(()=>{})}async resolveFilter(e){if(e==null||e==="")return{outcome:"no-profile"};let t;try{t=await this.scanAllVaults()}catch(u){let f=`[CliFocusProfileResolver] vault scan threw \u2014 ${String(u)}`;return this.warn(f),{outcome:"error",reason:f}}if(t.profiles.get(e)===void 0)return this.warn(`[CliFocusProfileResolver] profileUid=${e} not found in any scanned vault \u2014 falling back to no-filter (full vault).`),{outcome:"missing-profile",profileUid:e};let i=new Set;try{this.walkProfileChain(e,t.profiles,i,new Set,0)}catch(u){let f=`[CliFocusProfileResolver] profile chain walk threw \u2014 ${String(u)}`;return this.warn(f),{outcome:"error",reason:f}}let s=new Set(t.folderMap.values()),o=new Set,l=[];for(let u of i){if(s.has(u)){o.add(u);continue}l.push(u)}for(let u of cee)o.add(u);if(!Array.from(o).some(u=>s.has(u))){let u=`[CliFocusProfileResolver] profileUid=${e} produced effective set with zero AssetSpace folder overlap (${o.size} AS UIDs incl. floor; ${t.folderMap.size} folders known). Likely cause: profile declares AssetSpace UIDs not present as descriptors, or vault has no scanned AssetSpaces. Falling back to no-filter (full vault indexed).`;return this.warn(u),{outcome:"degraded",reason:u}}return{outcome:"engaged",result:{effective:o,folderMap:t.folderMap,declaredOntologies:i,untranslated:l}}}walkProfileChain(e,t,r,i,s){if(s>this.maxExtendsDepth)throw new Error(`FocusProfile chain exceeds max depth ${this.maxExtendsDepth} at ${e} \u2014 possible cycle`);if(i.has(e))return;i.add(e);let o=t.get(e);if(o!==void 0){for(let l of o.includes)r.add(l);typeof o.extends=="string"&&o.extends.length>0&&this.walkProfileChain(o.extends,t,r,i,s+1)}}async scanAllVaults(){let e=new Map,t=new Map;for(let r of this.vaultPaths){if(!await Cy.default.pathExists(r)){this.warn(`[CliFocusProfileResolver] vault path does not exist: ${r} \u2014 skipping.`);continue}let i=await this.walkVault(r);for(let s of i){let o=w2(s.frontmatter.exo__Instance_class);if(o.some(l=>l===uee)){let l=pee(s.filePath,s.vaultRoot);l.length>0&&e.set(l,s.uid)}if(o.some(l=>l===fee)){let l={uid:s.uid,label:typeof s.frontmatter.exo__Asset_label=="string"?s.frontmatter.exo__Asset_label:void 0,includes:w2(s.frontmatter.exo__Profile_includes),extends:w2(s.frontmatter.exo__Profile_imports)[0]??null};t.set(s.uid,l)}}}return{folderMap:e,profiles:t}}async walkVault(e){let t=[],r=[e];for(;r.length>0;){let i=r.pop(),s;try{s=await Cy.default.readdir(i,{withFileTypes:!0})}catch{continue}for(let o of s){let l=Py.default.join(i,o.name);if(o.isDirectory()){if(o.name.startsWith(".")||o.name==="node_modules"||o.name===".obsidian"||o.name===".exocortex")continue;r.push(l);continue}if(!o.isFile()||!o.name.endsWith(".md"))continue;let c=await this.tryReadFrontmatter(l);if(c===null)continue;let u=c.exo__Asset_uid;typeof u!="string"||u.length===0||t.push({uid:u,filePath:l,vaultRoot:e,frontmatter:c})}}return t}async tryReadFrontmatter(e){let t;try{t=await Cy.default.readFile(e,"utf-8")}catch{return null}if(!t.startsWith("---"))return null;let r=t.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(r===null)return null;try{let i=Wt.load(r[1]);return i&&typeof i=="object"&&!Array.isArray(i)?i:null}catch{return null}}};function w2(n){if(n==null)return[];let e=Array.isArray(n)?n:[n],t=[];for(let r of e){if(typeof r!="string")continue;let i=hee(r);i!==null&&t.push(i)}return t}a(w2,"parseWikilinkArray");function hee(n){let e=n.trim().replace(/^\[\[/,"").replace(/\]\]$/,"").split("|")[0].trim();return e.length===0?null:e}a(hee,"extractUidFromWikilink");function pee(n,e){let t=Py.default.relative(e,n).replace(/\\/g,"/");if(!t.startsWith("assetspaces/"))return"";let r=t.slice(12),i=r.indexOf("/");return i<0?"":`assetspaces/${r.slice(0,i)}`}a(pee,"parentFolderRelative");var mee=a(n=>{process.stderr.write(`${n}
|
|
780
780
|
`)},"DEFAULT_LOG"),Fy=class{static{a(this,"HeadlessConfirmGate")}constructor(e){this.yes=e.yes,this.verbose=e.verbose??!1,this.log=e.log??mee}async confirmHardSwitch(e){if(this.verbose){let t=Array.from(e.filesToDestroy.values()).reduce((r,i)=>r+i.length,0);this.log(`[hard-switch] Target: ${e.targetProfileLabel} (${e.targetProfileUid})`),this.log(`[hard-switch] Source: ${e.sourceProfileLabel}`),this.log(`[hard-switch] ${t} files to remove, ${e.assetSpacesBeingTornDown.length} AS to tear down, ${e.assetSpacesBeingMaterialized.length} AS to materialize`)}return this.yes?!0:(this.log("[hard-switch] Refused: --yes flag required for headless mode (Decision #2 safety)."),!1)}};var gee="[hard-switch] CLI command scaffolded. hardSwitchProfile() implementation pending Phase 3.";function yee(n,e){return{targetProfileUid:n,targetProfileLabel:e,sourceProfileUid:null,sourceProfileLabel:"<unknown>",filesToDestroy:new Map,assetSpacesBeingTornDown:[],assetSpacesBeingMaterialized:[]}}a(yee,"buildScaffoldPlan");async function _ee(n,e,t={}){let r=[],i=[],s=t.out??(_=>process.stdout.write(`${_}
|
|
@@ -812,7 +812,7 @@ Next steps:
|
|
|
812
812
|
`),process.stdout.write(` File: ${e.file}
|
|
813
813
|
`),process.stdout.write(` Commit: ${e.sha}
|
|
814
814
|
`),process.stdout.write(` URL: ${e.url}
|
|
815
|
-
`)),process.exit(0)}catch(e){let t=e instanceof Error?e:new Error(String(e)),r=new pu;t.message=r.redact(t.message),t.stack&&(t.stack=r.redact(t.stack)),ee.handle(t)}})}a(xee,"restPushCommand");function $L(n){let e=new ne;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.69.
|
|
815
|
+
`)),process.exit(0)}catch(e){let t=e instanceof Error?e:new Error(String(e)),r=new pu;t.message=r.redact(t.message),t.stack&&(t.stack=r.redact(t.stack)),ee.handle(t)}})}a(xee,"restPushCommand");function $L(n){let e=new ne;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.69.7"),e.addCommand(sL()),e.addCommand(mL()),e.addCommand(LD()),e.addCommand(jD()),e.addCommand(hN()),e.addCommand(BD()),e.addCommand(GD()),e.addCommand(QD()),e.addCommand(gN()),e.addCommand(EN()),e.addCommand(xN()),e.addCommand(AN()),e.addCommand(CN()),e.addCommand(UN()),e.addCommand(VN()),e.addCommand(QN()),e.addCommand(iL()),e.addCommand(EL()),e.addCommand(xL()),e.addCommand(OL()),e.addCommand(DL()),e.addCommand(jL()),e}a($L,"createProgram");$L().parse();0&&(module.exports={createProgram});
|
|
816
816
|
/*! Bundled license information:
|
|
817
817
|
|
|
818
818
|
reflect-metadata/Reflect.js:
|