exocortex-cli 13.159.0 → 13.160.0
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 +7 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// exocortex-cli v13.
|
|
2
|
+
// exocortex-cli v13.160.0
|
|
3
3
|
// CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
|
|
4
4
|
// License: MIT
|
|
5
5
|
|
|
@@ -58,7 +58,11 @@ ${Object.entries(t).map(([a,c])=>`${a}: ${c}`).join(`
|
|
|
58
58
|
`)}
|
|
59
59
|
---`,s=e.startsWith(`
|
|
60
60
|
`)?"":`
|
|
61
|
-
`;return`${n}${s}${e}`}getPropertyValue(e,t){let i=new RegExp(`${this.escapeRegex(t)}:\\s*(.*)$`,"m"),n=e.match(i);return n?n[1].trim():null}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}};ou.FrontmatterService=au;au.FRONTMATTER_REGEX=/^---\n([\s\S]*?)\n---/});var cu=y(is=>{"use strict";var hA=is&&is.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s};Object.defineProperty(is,"__esModule",{value:!0});is.EffortStatusWorkflow=void 0;var dA=Qe(),br=qt(),dd=class{static{o(this,"EffortStatusWorkflow")}getPreviousStatus(e,t){let i=this.normalizeStatus(e);if(i===br.EffortStatus.DRAFT)return null;if(i===br.EffortStatus.BACKLOG)return this.wrapStatus(br.EffortStatus.DRAFT);if(i===br.EffortStatus.ANALYSIS)return this.wrapStatus(br.EffortStatus.BACKLOG);if(i===br.EffortStatus.TODO)return this.wrapStatus(br.EffortStatus.ANALYSIS);if(i===br.EffortStatus.DOING)return this.hasInstanceClass(t,br.AssetClass.PROJECT)?this.wrapStatus(br.EffortStatus.TODO):this.wrapStatus(br.EffortStatus.BACKLOG);if(i===br.EffortStatus.DONE)return this.wrapStatus(br.EffortStatus.DOING)}normalizeStatus(e){return e.replace(/["'[\]]/g,"").trim()}wrapStatus(e){return`"[[${e}]]"`}hasInstanceClass(e,t){return e?(Array.isArray(e)?e:[e]).some(n=>n.replace(/["'[\]]/g,"").trim()===t):!1}};is.EffortStatusWorkflow=dd;is.EffortStatusWorkflow=dd=hA([(0,dA.injectable)()],dd)});var uu=y(Gr=>{"use strict";var pA=Gr&&Gr.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},mA=Gr&&Gr.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},gA=Gr&&Gr.__param||function(r,e){return function(t,i){e(t,i,r)}};Object.defineProperty(Gr,"__esModule",{value:!0});Gr.StatusTimestampService=void 0;var f2=Qe(),yA=ks(),Za=gr(),vA=it(),pd=class{static{o(this,"StatusTimestampService")}constructor(e){this.vault=e,this.frontmatterService=new yA.FrontmatterService}async addStartTimestamp(e){let t=await this.vault.read(e),i=Za.DateFormatter.toLocalTimestamp(new Date),n=this.frontmatterService.updateProperty(t,"ems__Effort_startTimestamp",i);await this.vault.modify(e,n)}async addEndTimestamp(e,t){let i=await this.vault.read(e),n=t||new Date,s=Za.DateFormatter.toLocalTimestamp(n),a=this.frontmatterService.updateProperty(i,"ems__Effort_endTimestamp",s);await this.vault.modify(e,a)}async addResolutionTimestamp(e){let t=await this.vault.read(e),i=Za.DateFormatter.toLocalTimestamp(new Date),n=this.frontmatterService.updateProperty(t,"ems__Effort_resolutionTimestamp",i);await this.vault.modify(e,n)}async addEndAndResolutionTimestamps(e,t){let i=await this.vault.read(e),n=t||new Date,s=Za.DateFormatter.toLocalTimestamp(n),a=this.frontmatterService.updateProperty(i,"ems__Effort_endTimestamp",s);a=this.frontmatterService.updateProperty(a,"ems__Effort_resolutionTimestamp",s),await this.vault.modify(e,a)}async removeStartTimestamp(e){let t=await this.vault.read(e),i=this.frontmatterService.removeProperty(t,"ems__Effort_startTimestamp");await this.vault.modify(e,i)}async removeEndTimestamp(e){let t=await this.vault.read(e),i=this.frontmatterService.removeProperty(t,"ems__Effort_endTimestamp");await this.vault.modify(e,i)}async removeResolutionTimestamp(e){let t=await this.vault.read(e),i=this.frontmatterService.removeProperty(t,"ems__Effort_resolutionTimestamp");await this.vault.modify(e,i)}async removeEndAndResolutionTimestamps(e){let t=await this.vault.read(e),i=this.frontmatterService.removeProperty(t,"ems__Effort_endTimestamp");i=this.frontmatterService.removeProperty(i,"ems__Effort_resolutionTimestamp"),await this.vault.modify(e,i)}async shiftPlannedEndTimestamp(e,t){let i=await this.vault.read(e),n=this.frontmatterService.parse(i);if(!n.exists)return;let s=this.frontmatterService.getPropertyValue(n.content,"ems__Effort_plannedEndTimestamp");if(!s)return;let a=new Date(s.replace(/["']/g,""));if(isNaN(a.getTime()))return;let c=new Date(a.getTime()+t),u=Za.DateFormatter.toLocalTimestamp(c),f=this.frontmatterService.updateProperty(i,"ems__Effort_plannedEndTimestamp",u);await this.vault.modify(e,f)}};Gr.StatusTimestampService=pd;Gr.StatusTimestampService=pd=pA([(0,f2.injectable)(),gA(0,(0,f2.inject)(vA.DI_TOKENS.IVaultAdapter)),mA("design:paramtypes",[Object])],pd)});var gd=y(Wr=>{"use strict";var _A=Wr&&Wr.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},SA=Wr&&Wr.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},wA=Wr&&Wr.__param||function(r,e){return function(t,i){e(t,i,r)}};Object.defineProperty(Wr,"__esModule",{value:!0});Wr.TaskStatusService=void 0;var h2=Qe(),bA=ks(),ns=gr(),EA=cu(),TA=uu(),xA=it(),md=class{static{o(this,"TaskStatusService")}constructor(e,t,i){this.vault=e,this.workflow=t,this.timestampService=i,this.frontmatterService=new bA.FrontmatterService}async setDraftStatus(e){await this.updateStatus(e,"ems__EffortStatusDraft")}async moveToBacklog(e){await this.updateStatus(e,"ems__EffortStatusBacklog")}async moveToAnalysis(e){await this.updateStatus(e,"ems__EffortStatusAnalysis")}async moveToToDo(e){await this.updateStatus(e,"ems__EffortStatusToDo")}async startEffort(e){let t=await this.vault.read(e),i=ns.DateFormatter.toLocalTimestamp(new Date),n=this.frontmatterService.updateProperty(t,"ems__Effort_status",'"[[ems__EffortStatusDoing]]"');n=this.frontmatterService.updateProperty(n,"ems__Effort_startTimestamp",i),await this.vault.modify(e,n)}async markTaskAsDone(e){let t=await this.vault.read(e),i=ns.DateFormatter.toLocalTimestamp(new Date),n=this.frontmatterService.updateProperty(t,"ems__Effort_status",'"[[ems__EffortStatusDone]]"');n=this.frontmatterService.updateProperty(n,"ems__Effort_endTimestamp",i),n=this.frontmatterService.updateProperty(n,"ems__Effort_resolutionTimestamp",i),await this.vault.modify(e,n)}async syncEffortEndTimestamp(e,t){await this.timestampService.addEndAndResolutionTimestamps(e,t)}async shiftPlannedEndTimestamp(e,t){await this.timestampService.shiftPlannedEndTimestamp(e,t)}async trashEffort(e){let
|
|
61
|
+
`;return`${n}${s}${e}`}getPropertyValue(e,t){let i=new RegExp(`${this.escapeRegex(t)}:\\s*(.*)$`,"m"),n=e.match(i);return n?n[1].trim():null}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}};ou.FrontmatterService=au;au.FRONTMATTER_REGEX=/^---\n([\s\S]*?)\n---/});var cu=y(is=>{"use strict";var hA=is&&is.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s};Object.defineProperty(is,"__esModule",{value:!0});is.EffortStatusWorkflow=void 0;var dA=Qe(),br=qt(),dd=class{static{o(this,"EffortStatusWorkflow")}getPreviousStatus(e,t){let i=this.normalizeStatus(e);if(i===br.EffortStatus.DRAFT)return null;if(i===br.EffortStatus.BACKLOG)return this.wrapStatus(br.EffortStatus.DRAFT);if(i===br.EffortStatus.ANALYSIS)return this.wrapStatus(br.EffortStatus.BACKLOG);if(i===br.EffortStatus.TODO)return this.wrapStatus(br.EffortStatus.ANALYSIS);if(i===br.EffortStatus.DOING)return this.hasInstanceClass(t,br.AssetClass.PROJECT)?this.wrapStatus(br.EffortStatus.TODO):this.wrapStatus(br.EffortStatus.BACKLOG);if(i===br.EffortStatus.DONE)return this.wrapStatus(br.EffortStatus.DOING)}normalizeStatus(e){return e.replace(/["'[\]]/g,"").trim()}wrapStatus(e){return`"[[${e}]]"`}hasInstanceClass(e,t){return e?(Array.isArray(e)?e:[e]).some(n=>n.replace(/["'[\]]/g,"").trim()===t):!1}};is.EffortStatusWorkflow=dd;is.EffortStatusWorkflow=dd=hA([(0,dA.injectable)()],dd)});var uu=y(Gr=>{"use strict";var pA=Gr&&Gr.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},mA=Gr&&Gr.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},gA=Gr&&Gr.__param||function(r,e){return function(t,i){e(t,i,r)}};Object.defineProperty(Gr,"__esModule",{value:!0});Gr.StatusTimestampService=void 0;var f2=Qe(),yA=ks(),Za=gr(),vA=it(),pd=class{static{o(this,"StatusTimestampService")}constructor(e){this.vault=e,this.frontmatterService=new yA.FrontmatterService}async addStartTimestamp(e){let t=await this.vault.read(e),i=Za.DateFormatter.toLocalTimestamp(new Date),n=this.frontmatterService.updateProperty(t,"ems__Effort_startTimestamp",i);await this.vault.modify(e,n)}async addEndTimestamp(e,t){let i=await this.vault.read(e),n=t||new Date,s=Za.DateFormatter.toLocalTimestamp(n),a=this.frontmatterService.updateProperty(i,"ems__Effort_endTimestamp",s);await this.vault.modify(e,a)}async addResolutionTimestamp(e){let t=await this.vault.read(e),i=Za.DateFormatter.toLocalTimestamp(new Date),n=this.frontmatterService.updateProperty(t,"ems__Effort_resolutionTimestamp",i);await this.vault.modify(e,n)}async addEndAndResolutionTimestamps(e,t){let i=await this.vault.read(e),n=t||new Date,s=Za.DateFormatter.toLocalTimestamp(n),a=this.frontmatterService.updateProperty(i,"ems__Effort_endTimestamp",s);a=this.frontmatterService.updateProperty(a,"ems__Effort_resolutionTimestamp",s),await this.vault.modify(e,a)}async removeStartTimestamp(e){let t=await this.vault.read(e),i=this.frontmatterService.removeProperty(t,"ems__Effort_startTimestamp");await this.vault.modify(e,i)}async removeEndTimestamp(e){let t=await this.vault.read(e),i=this.frontmatterService.removeProperty(t,"ems__Effort_endTimestamp");await this.vault.modify(e,i)}async removeResolutionTimestamp(e){let t=await this.vault.read(e),i=this.frontmatterService.removeProperty(t,"ems__Effort_resolutionTimestamp");await this.vault.modify(e,i)}async removeEndAndResolutionTimestamps(e){let t=await this.vault.read(e),i=this.frontmatterService.removeProperty(t,"ems__Effort_endTimestamp");i=this.frontmatterService.removeProperty(i,"ems__Effort_resolutionTimestamp"),await this.vault.modify(e,i)}async shiftPlannedEndTimestamp(e,t){let i=await this.vault.read(e),n=this.frontmatterService.parse(i);if(!n.exists)return;let s=this.frontmatterService.getPropertyValue(n.content,"ems__Effort_plannedEndTimestamp");if(!s)return;let a=new Date(s.replace(/["']/g,""));if(isNaN(a.getTime()))return;let c=new Date(a.getTime()+t),u=Za.DateFormatter.toLocalTimestamp(c),f=this.frontmatterService.updateProperty(i,"ems__Effort_plannedEndTimestamp",u);await this.vault.modify(e,f)}};Gr.StatusTimestampService=pd;Gr.StatusTimestampService=pd=pA([(0,f2.injectable)(),gA(0,(0,f2.inject)(vA.DI_TOKENS.IVaultAdapter)),mA("design:paramtypes",[Object])],pd)});var gd=y(Wr=>{"use strict";var _A=Wr&&Wr.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},SA=Wr&&Wr.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},wA=Wr&&Wr.__param||function(r,e){return function(t,i){e(t,i,r)}};Object.defineProperty(Wr,"__esModule",{value:!0});Wr.TaskStatusService=void 0;var h2=Qe(),bA=ks(),ns=gr(),EA=cu(),TA=uu(),xA=it(),md=class{static{o(this,"TaskStatusService")}constructor(e,t,i){this.vault=e,this.workflow=t,this.timestampService=i,this.frontmatterService=new bA.FrontmatterService}async setDraftStatus(e){await this.updateStatus(e,"ems__EffortStatusDraft")}async moveToBacklog(e){await this.updateStatus(e,"ems__EffortStatusBacklog")}async moveToAnalysis(e){await this.updateStatus(e,"ems__EffortStatusAnalysis")}async moveToToDo(e){await this.updateStatus(e,"ems__EffortStatusToDo")}async startEffort(e){let t=await this.vault.read(e),i=ns.DateFormatter.toLocalTimestamp(new Date),n=this.frontmatterService.updateProperty(t,"ems__Effort_status",'"[[ems__EffortStatusDoing]]"');n=this.frontmatterService.updateProperty(n,"ems__Effort_startTimestamp",i),await this.vault.modify(e,n)}async markTaskAsDone(e){let t=await this.vault.read(e),i=ns.DateFormatter.toLocalTimestamp(new Date),n=this.frontmatterService.updateProperty(t,"ems__Effort_status",'"[[ems__EffortStatusDone]]"');n=this.frontmatterService.updateProperty(n,"ems__Effort_endTimestamp",i),n=this.frontmatterService.updateProperty(n,"ems__Effort_resolutionTimestamp",i),await this.vault.modify(e,n)}async syncEffortEndTimestamp(e,t){await this.timestampService.addEndAndResolutionTimestamps(e,t)}async shiftPlannedEndTimestamp(e,t){await this.timestampService.shiftPlannedEndTimestamp(e,t)}async trashEffort(e,t){let i=await this.vault.read(e),n=ns.DateFormatter.toLocalTimestamp(new Date),s=this.frontmatterService.updateProperty(i,"ems__Effort_status",'"[[ems__EffortStatusTrashed]]"');s=this.frontmatterService.updateProperty(s,"ems__Effort_resolutionTimestamp",n),t&&(s=this.appendTrashReason(s,t)),await this.vault.modify(e,s)}appendTrashReason(e,t){let i=`
|
|
62
|
+
|
|
63
|
+
## Trash Reason
|
|
64
|
+
|
|
65
|
+
${t}`;return e.trimEnd()+i}async archiveTask(e){let t=await this.vault.read(e),i=this.frontmatterService.updateProperty(t,"archived","true");i=this.frontmatterService.removeProperty(i,"aliases"),await this.vault.modify(e,i)}async planOnToday(e){let t=await this.vault.read(e),i=ns.DateFormatter.getTodayStartTimestamp(),n=this.frontmatterService.updateProperty(t,"ems__Effort_plannedStartTimestamp",i);await this.vault.modify(e,n)}async planForEvening(e){let t=await this.vault.read(e),i=new Date;i.setHours(19,0,0,0);let n=ns.DateFormatter.toLocalTimestamp(i),s=this.frontmatterService.updateProperty(t,"ems__Effort_plannedStartTimestamp",n);await this.vault.modify(e,s)}async shiftDayBackward(e){await this.shiftDay(e,-1)}async shiftDayForward(e){await this.shiftDay(e,1)}async rollbackStatus(e){let t=await this.vault.read(e),i=this.extractCurrentStatus(t),n=this.extractInstanceClass(t);if(!i)throw new Error("No current status to rollback from");let s=this.workflow.getPreviousStatus(i,n);if(s===void 0)throw new Error("Cannot rollback from current status");let a=t;s===null?a=this.frontmatterService.removeProperty(a,"ems__Effort_status"):a=this.frontmatterService.updateProperty(a,"ems__Effort_status",s);let c=this.workflow.normalizeStatus(i);c==="ems__EffortStatusDone"?(a=this.frontmatterService.removeProperty(a,"ems__Effort_endTimestamp"),a=this.frontmatterService.removeProperty(a,"ems__Effort_resolutionTimestamp")):c==="ems__EffortStatusDoing"&&(a=this.frontmatterService.removeProperty(a,"ems__Effort_startTimestamp")),await this.vault.modify(e,a)}async updateStatus(e,t){let i=await this.vault.read(e),n=this.frontmatterService.updateProperty(i,"ems__Effort_status",`"[[${t}]]"`);await this.vault.modify(e,n)}async shiftDay(e,t){let i=await this.vault.read(e),n=this.extractPlannedStartTimestamp(i);if(!n)throw new Error("ems__Effort_plannedStartTimestamp property not found");let s=this.parseDateFromTimestamp(n);if(!s)throw new Error("Invalid date format in ems__Effort_plannedStartTimestamp");let a=ns.DateFormatter.addDays(s,t);a.setHours(0,0,0,0);let c=ns.DateFormatter.toLocalTimestamp(a),u=this.frontmatterService.updateProperty(i,"ems__Effort_plannedStartTimestamp",c);await this.vault.modify(e,u)}parseDateFromTimestamp(e){let t=new Date(e);return isNaN(t.getTime())?null:t}extractPlannedStartTimestamp(e){let t=this.frontmatterService.parse(e);return t.exists?this.frontmatterService.getPropertyValue(t.content,"ems__Effort_plannedStartTimestamp"):null}extractCurrentStatus(e){let t=this.frontmatterService.parse(e);return t.exists?this.frontmatterService.getPropertyValue(t.content,"ems__Effort_status"):null}extractInstanceClass(e){let t=this.frontmatterService.parse(e);if(!t.exists)return null;let i=t.content.match(/exo__Instance_class:\s*\n((?:\s*-\s*.*\n?)+)/);return i?i[1].split(`
|
|
62
66
|
`).filter(s=>s.trim()).map(s=>s.replace(/^\s*-\s*/,"").trim()):this.frontmatterService.getPropertyValue(t.content,"exo__Instance_class")}};Wr.TaskStatusService=md;Wr.TaskStatusService=md=_A([(0,h2.injectable)(),wA(0,(0,h2.inject)(xA.DI_TOKENS.IVaultAdapter)),SA("design:paramtypes",[Object,EA.EffortStatusWorkflow,TA.StatusTimestampService])],md)});var vd=y(Hr=>{"use strict";var AA=Hr&&Hr.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},CA=Hr&&Hr.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},OA=Hr&&Hr.__param||function(r,e){return function(t,i){e(t,i,r)}};Object.defineProperty(Hr,"__esModule",{value:!0});Hr.AreaCreationService=void 0;var d2=Qe(),p2=Dr(),FA=qt(),PA=gr(),RA=Xa(),m2=Ur(),IA=it(),yd=class{static{o(this,"AreaCreationService")}constructor(e){this.vault=e}async createChildArea(e,t,i){let n=(0,p2.v4)(),s=`${n}.md`,a=this.generateChildAreaFrontmatter(t,e.basename,i,n),c=m2.MetadataHelpers.buildFileContent(a),u=e.parent?.path||"",f=u?`${u}/${s}`:s;return await this.vault.create(f,c)}generateChildAreaFrontmatter(e,t,i,n){let s=new Date,a=PA.DateFormatter.toLocalTimestamp(s),c=RA.MetadataExtractor.extractIsDefinedBy(e),u={};if(u.exo__Asset_isDefinedBy=m2.MetadataHelpers.ensureQuoted(c),u.exo__Asset_uid=n||(0,p2.v4)(),u.exo__Asset_createdAt=a,u.exo__Instance_class=[`"[[${FA.AssetClass.AREA}]]"`],u.ems__Area_parent=`"[[${t}]]"`,i&&i.trim()!==""){let f=i.trim();u.exo__Asset_label=f,u.aliases=[f]}return u}};Hr.AreaCreationService=yd;Hr.AreaCreationService=yd=AA([(0,d2.injectable)(),OA(0,(0,d2.inject)(IA.DI_TOKENS.IVaultAdapter)),CA("design:paramtypes",[Object])],yd)});var Sd=y(zr=>{"use strict";var DA=zr&&zr.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},NA=zr&&zr.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},kA=zr&&zr.__param||function(r,e){return function(t,i){e(t,i,r)}};Object.defineProperty(zr,"__esModule",{value:!0});zr.AreaHierarchyBuilder=void 0;var g2=Qe(),y2=qt(),jA=it(),_d=class{static{o(this,"AreaHierarchyBuilder")}constructor(e){this.vault=e}buildHierarchy(e,t){let i=this.vault.getAbstractFileByPath(e);if(!this.isFile(i))return null;let n=this.vault.getFrontmatter(i)||{};if(this.extractInstanceClass(n)!==y2.AssetClass.AREA)return null;let a=this.collectAllAreasFromVault(),c=new Set;return this.buildTree(e,a,c,0)}isFile(e){return e&&typeof e=="object"&&"basename"in e&&"path"in e}extractInstanceClass(e){let t=e.exo__Instance_class||"";return Array.isArray(t)?this.cleanWikiLink(t[0]||""):this.cleanWikiLink(t)}cleanWikiLink(e){return typeof e!="string"?"":e.replace(/^\[\[|\]\]$/g,"").trim()}collectAllAreasFromVault(){let e=new Map,t=new Map,i=this.vault.getAllFiles();for(let n of i){let s=this.vault.getFrontmatter(n)||{};if(this.extractInstanceClass(s)===y2.AssetClass.AREA){let c=this.extractParentPath(s);e.set(n.path,{path:n.path,title:n.basename,label:s.exo__Asset_label||void 0,isArchived:this.isArchived(s),depth:0,parentPath:c||void 0}),t.set(n.basename,n.path)}}for(let[,n]of e.entries())n.parentPath&&t.has(n.parentPath)&&(n.parentPath=t.get(n.parentPath));return e}extractParentPath(e){let t=e.ems__Area_parent;if(!t)return null;if(Array.isArray(t)){let i=t[0]||"";return this.cleanWikiLink(i)}return this.cleanWikiLink(t)}isArchived(e){let t=e.exo__Asset_archived;if(t===!0||t==="true")return!0;if(Array.isArray(t)&&t.length>0){let i=t[0];return i===!0||i==="true"}return!1}buildTree(e,t,i,n){if(i.has(e))return null;i.add(e);let s=t.get(e);if(!s)return null;let a=[];for(let[c,u]of t.entries())if(u.parentPath===e){let f=this.buildTree(c,t,i,n+1);f&&a.push(f)}return a.sort((c,u)=>{let f=c.label||c.title,l=u.label||u.title;return f.localeCompare(l)}),{path:s.path,title:s.title,label:s.label,isArchived:s.isArchived,depth:n,parentPath:s.parentPath,children:a}}};zr.AreaHierarchyBuilder=_d;zr.AreaHierarchyBuilder=_d=DA([(0,g2.injectable)(),kA(0,(0,g2.inject)(jA.DI_TOKENS.IVaultAdapter)),NA("design:paramtypes",[Object])],_d)});var bd=y(Kr=>{"use strict";var LA=Kr&&Kr.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},MA=Kr&&Kr.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},VA=Kr&&Kr.__param||function(r,e){return function(t,i){e(t,i,r)}};Object.defineProperty(Kr,"__esModule",{value:!0});Kr.ClassCreationService=void 0;var v2=Qe(),qA=Dr(),$A=gr(),UA=Ur(),BA=it(),wd=class{static{o(this,"ClassCreationService")}constructor(e){this.vault=e}async createSubclass(e,t,i){let n=(0,qA.v4)(),s=this.generateFileName(t),a=s.endsWith(".md")?s:`${s}.md`,c=this.generateClassFrontmatter(e.basename,t,n,i),u=UA.MetadataHelpers.buildFileContent(c),f="classes",l=`${f}/${a}`;return this.vault.getAbstractFileByPath(f)||await this.vault.createFolder(f),await this.vault.create(l,u)}generateFileName(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}generateClassFrontmatter(e,t,i,n){let s=new Date,a=$A.DateFormatter.toLocalTimestamp(s),c={};c.exo__Asset_uid=i,c.exo__Asset_label=t,c.exo__Asset_createdAt=a,c.exo__Instance_class=['"[[exo__Class]]"'],c.exo__Class_superClass=`"[[${e}]]"`;let u=n.exo__Asset_isDefinedBy||'"[[Ontology/EXO]]"';return c.exo__Asset_isDefinedBy=u,c.aliases=[t],c}};Kr.ClassCreationService=wd;Kr.ClassCreationService=wd=LA([(0,v2.injectable)(),VA(0,(0,v2.inject)(BA.DI_TOKENS.IVaultAdapter)),MA("design:paramtypes",[Object])],wd)});var Td=y(Yr=>{"use strict";var GA=Yr&&Yr.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},WA=Yr&&Yr.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},HA=Yr&&Yr.__param||function(r,e){return function(t,i){e(t,i,r)}};Object.defineProperty(Yr,"__esModule",{value:!0});Yr.ConceptCreationService=void 0;var _2=Qe(),zA=Dr(),KA=gr(),YA=Ur(),QA=qt(),JA=it(),Ed=class{static{o(this,"ConceptCreationService")}constructor(e){this.vault=e}async createNarrowerConcept(e,t,i,n){let s=(0,zA.v4)(),a=t.endsWith(".md")?t:`${t}.md`,c=this.generateConceptFrontmatter(e.basename,i,n,s),u=YA.MetadataHelpers.buildFileContent(c),f="concepts",l=`${f}/${a}`;return this.vault.getAbstractFileByPath(f)||await this.vault.createFolder(f),await this.vault.create(l,u)}generateConceptFrontmatter(e,t,i,n){let s=new Date,a=KA.DateFormatter.toLocalTimestamp(s),c={};return c.exo__Asset_isDefinedBy='"[[!concepts]]"',c.exo__Asset_uid=n,c.exo__Asset_createdAt=a,c.exo__Instance_class=[`"[[${QA.AssetClass.CONCEPT}]]"`],c.ims__Concept_broader=`"[[${e}]]"`,c.ims__Concept_definition=t,i.length>0&&(c.aliases=i),c}};Yr.ConceptCreationService=Ed;Yr.ConceptCreationService=Ed=GA([(0,_2.injectable)(),HA(0,(0,_2.inject)(JA.DI_TOKENS.IVaultAdapter)),WA("design:paramtypes",[Object])],Ed)});var Ad=y(Qr=>{"use strict";var XA=Qr&&Qr.__decorate||function(r,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,i);else for(var c=r.length-1;c>=0;c--)(a=r[c])&&(s=(n<3?a(s):n>3?a(e,t,s):a(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},ZA=Qr&&Qr.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},e4=Qr&&Qr.__param||function(r,e){return function(t,i){e(t,i,r)}};Object.defineProperty(Qr,"__esModule",{value:!0});Qr.EffortVotingService=void 0;var S2=Qe(),t4=it(),xd=class{static{o(this,"EffortVotingService")}constructor(e){this.vault=e}async incrementEffortVotes(e){let t=await this.vault.read(e),n=this.extractVoteCount(t)+1,s=this.updateFrontmatterWithVotes(t,n);return await this.vault.modify(e,s),n}extractVoteCount(e){let t=/^---\r?\n([\s\S]*?)\r?\n---/,i=e.match(t);if(!i)return 0;let s=i[1].match(/ems__Effort_votes:\s*(\d+)/);return s&&s[1]?parseInt(s[1],10):0}updateFrontmatterWithVotes(e,t){let i=/^---\r?\n([\s\S]*?)\r?\n---/,n=e.match(i),s=e.includes(`\r
|
|
63
67
|
`)?`\r
|
|
64
68
|
`:`
|
|
@@ -279,7 +283,7 @@ globstar while`,e,p,t,g,S),this.matchOne(e.slice(p),t.slice(g),i))return this.de
|
|
|
279
283
|
\u{1F4DD} Note: Actual command execution will be implemented in follow-up issues.`),console.log(" This PR establishes the infrastructure foundation."),process.exit(0)}catch(n){Ee.handle(n)}}getVaultRoot(){return this.context.pathResolver.getVaultRoot()}async executeStart(e){return this.statusExecutor.executeStart(e)}async executeComplete(e){return this.statusExecutor.executeComplete(e)}async executeTrash(e){return this.statusExecutor.executeTrash(e)}async executeArchive(e){return this.statusExecutor.executeArchive(e)}async executeMoveToBacklog(e){return this.statusExecutor.executeMoveToBacklog(e)}async executeMoveToAnalysis(e){return this.statusExecutor.executeMoveToAnalysis(e)}async executeMoveToToDo(e){return this.statusExecutor.executeMoveToToDo(e)}async executeCreateTask(e,t,i={}){return this.creationExecutor.executeCreateTask(e,t,i)}async executeCreateMeeting(e,t,i={}){return this.creationExecutor.executeCreateMeeting(e,t,i)}async executeCreateProject(e,t,i={}){return this.creationExecutor.executeCreateProject(e,t,i)}async executeCreateArea(e,t,i={}){return this.creationExecutor.executeCreateArea(e,t,i)}async executeRenameToUid(e){return this.propertyExecutor.executeRenameToUid(e)}async executeUpdateLabel(e,t){return this.propertyExecutor.executeUpdateLabel(e,t)}async executeSchedule(e,t){return this.propertyExecutor.executeSchedule(e,t)}async executeSetDeadline(e,t){return this.propertyExecutor.executeSetDeadline(e,t)}async executeRepairFolder(e){return this.folderRepairExecutor.executeRepairFolder(e)}};function Vt(r,e,t,i,n){if(r==="json"){let s={command:e,filepath:t,action:i,...n&&{changes:n}},a=gt.success(s);console.log(JSON.stringify(a,null,2))}else console.log(`\u2705 ${i}`)}o(Vt,"outputResult");function _s(r,e,t,i){let n=new tt(`--${e} option is required for ${t} command`,i,{command:t,missingOption:e});Ee.handle(n)}o(_s,"handleMissingOption");function sw(){return new Pr("command").description("Execute plugin command on single asset").argument("<command-name>","Command to execute (rename-to-uid, start, complete, schedule, set-deadline, etc.)").argument("<filepath>","Path to asset file (relative to vault root or absolute)").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--label <value>","Asset label (required for update-label and creation commands)").option("--prototype <uid>","Prototype UID for inheritance (creation commands)").option("--area <uid>","Area UID for effort linkage (creation commands)").option("--parent <uid>","Parent UID for effort linkage (creation commands)").option("--date <value>","Date in YYYY-MM-DD format (required for schedule and set-deadline commands)").option("--dry-run","Preview changes without modifying files").option("--format <type>","Output format: text|json (default: text)","text").action(async(r,e,t)=>{let i=t.format||"text";Ee.setFormat(i);try{let n=(0,nw.resolve)(t.vault),s=new Xl(n,t.dryRun);switch(r){case"rename-to-uid":await s.executeRenameToUid(e),Vt(i,r,e,"Renamed file to UID-based name");break;case"update-label":t.label||_s(i,"label","update-label",'exocortex command update-label <filepath> --label "<value>"'),await s.executeUpdateLabel(e,t.label),Vt(i,r,e,`Updated label to "${t.label}"`,{label:t.label});break;case"start":await s.executeStart(e),Vt(i,r,e,"Started task");break;case"complete":await s.executeComplete(e),Vt(i,r,e,"Completed task");break;case"trash":await s.executeTrash(e),Vt(i,r,e,"Moved task to trash");break;case"archive":await s.executeArchive(e),Vt(i,r,e,"Archived task");break;case"move-to-backlog":await s.executeMoveToBacklog(e),Vt(i,r,e,"Moved task to backlog");break;case"move-to-analysis":await s.executeMoveToAnalysis(e),Vt(i,r,e,"Moved task to analysis");break;case"move-to-todo":await s.executeMoveToToDo(e),Vt(i,r,e,"Moved task to todo");break;case"create-task":t.label||_s(i,"label","create-task",'exocortex command create-task <filepath> --label "<value>"'),await s.executeCreateTask(e,t.label,{prototype:t.prototype,area:t.area,parent:t.parent}),Vt(i,r,e,`Created task "${t.label}"`,{label:t.label,prototype:t.prototype,area:t.area,parent:t.parent});break;case"create-meeting":t.label||_s(i,"label","create-meeting",'exocortex command create-meeting <filepath> --label "<value>"'),await s.executeCreateMeeting(e,t.label,{prototype:t.prototype,area:t.area,parent:t.parent}),Vt(i,r,e,`Created meeting "${t.label}"`,{label:t.label,prototype:t.prototype,area:t.area,parent:t.parent});break;case"create-project":t.label||_s(i,"label","create-project",'exocortex command create-project <filepath> --label "<value>"'),await s.executeCreateProject(e,t.label,{prototype:t.prototype,area:t.area,parent:t.parent}),Vt(i,r,e,`Created project "${t.label}"`,{label:t.label,prototype:t.prototype,area:t.area,parent:t.parent});break;case"create-area":t.label||_s(i,"label","create-area",'exocortex command create-area <filepath> --label "<value>"'),await s.executeCreateArea(e,t.label,{prototype:t.prototype,area:t.area,parent:t.parent}),Vt(i,r,e,`Created area "${t.label}"`,{label:t.label,prototype:t.prototype,area:t.area,parent:t.parent});break;case"schedule":t.date||_s(i,"date","schedule",'exocortex command schedule <filepath> --date "YYYY-MM-DD"'),await s.executeSchedule(e,t.date),Vt(i,r,e,`Scheduled task for ${t.date}`,{date:t.date});break;case"set-deadline":t.date||_s(i,"date","set-deadline",'exocortex command set-deadline <filepath> --date "YYYY-MM-DD"'),await s.executeSetDeadline(e,t.date),Vt(i,r,e,`Set deadline to ${t.date}`,{date:t.date});break;case"repair-folder":{let a=await s.executeRepairFolder(e);Vt(i,r,e,a.moved?`Moved to correct folder: ${a.newPath}`:"Already in correct folder",{moved:a.moved,oldPath:a.oldPath,newPath:a.newPath,expectedFolder:a.expectedFolder});break}default:await s.execute(r,e,t),Vt(i,r,e,`Executed ${r}`);break}}catch(n){Ee.handle(n)}})}o(sw,"commandCommand");var ow=require("path");var cn=Ke(require("fs")),b1=Ke(require("path")),aw=require("events");var uI={watch:cn.default.watch.bind(cn.default),existsSync:cn.default.existsSync.bind(cn.default),statSync:cn.default.statSync.bind(cn.default),readFileSync:cn.default.readFileSync.bind(cn.default)},Zl=class extends aw.EventEmitter{constructor(t,i={}){super();this.watcher=null;this.debounceTimers=new Map;this.isRunning=!1;this.vaultPath=b1.default.resolve(t),this.fsAdapter=i.fsAdapter??uI,this.options={pattern:i.pattern??"**/*.md",assetType:i.assetType??"",debounceMs:i.debounceMs??100,recursive:i.recursive??!0}}static{o(this,"FileSystemWatcher")}start(){this.isRunning||(this.watcher=this.fsAdapter.watch(this.vaultPath,{recursive:this.options.recursive},(t,i)=>{i&&this.handleFileEvent(t,i.toString())}),this.watcher.on("error",t=>{this.emit("error",t)}),this.isRunning=!0,this.emit("started"))}stop(){if(this.isRunning){for(let t of this.debounceTimers.values())clearTimeout(t);this.debounceTimers.clear(),this.watcher&&(this.watcher.close(),this.watcher=null),this.isRunning=!1,this.emit("stopped")}}isWatching(){return this.isRunning}handleFileEvent(t,i){let n=b1.default.join(this.vaultPath,i),s=i;if(!this.matchesPattern(s))return;let a=this.debounceTimers.get(n);a&&clearTimeout(a);let c=setTimeout(()=>{this.debounceTimers.delete(n),this.processFileEvent(n,s)},this.options.debounceMs);this.debounceTimers.set(n,c)}processFileEvent(t,i){let n=this.fsAdapter.existsSync(t),s;if(!n)s="delete";else{let u=this.fsAdapter.statSync(t);s=Date.now()-u.birthtimeMs<1e3?"create":"modify"}let a;if(n&&t.endsWith(".md")&&(a=this.extractAssetType(t)),this.options.assetType&&a!==this.options.assetType)return;let c={type:s,path:t,relativePath:i,timestamp:new Date().toISOString(),assetType:a};this.emit("change",c)}matchesPattern(t){return this.options.pattern?Lt(t,this.options.pattern):!0}extractAssetType(t){try{let n=this.fsAdapter.readFileSync(t,"utf-8").match(/^---\n([\s\S]*?)\n---/);if(!n)return;let a=n[1].match(/exo__Instance_class:\s*(?:\[?"?\[\[([^\]]+)\]\]"?\]?|"?\[\[([^\]]+)\]\]"?)/);return a?a[1]||a[2]:void 0}catch{return}}};var E1=Ke(require("fs"));function cw(){return new Pr("watch").description("Watch vault for file changes and emit NDJSON events").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--pattern <glob>","Glob pattern to filter files (e.g., '*.md', 'tasks/**')").option("--asset-type <type>","Filter by asset type (e.g., 'ems__Task', 'ems__Project')").option("--debounce <ms>","Debounce interval in milliseconds","100").action(async r=>{Ee.setFormat("json");try{let e=(0,ow.resolve)(r.vault);if(!E1.default.existsSync(e))throw new sn(e);if(!E1.default.statSync(e).isDirectory())throw new tt(`Vault path is not a directory: ${e}`,"Provide a path to a directory, not a file",{vaultPath:e});let t=parseInt(r.debounce?.toString()??"100",10);if(isNaN(t)||t<0)throw new tt("--debounce must be a non-negative integer","Use a positive integer value for debounce",{debounce:r.debounce});let i=new Zl(e,{pattern:r.pattern,assetType:r.assetType,debounceMs:t});i.on("change",s=>{console.log(JSON.stringify(s))}),i.on("error",s=>{let a=gt.error("INTERNAL_OPERATION_FAILED",s.message,5,{recovery:{message:"Check file permissions and vault access",suggestion:"Ensure the vault directory is accessible"}});console.log(JSON.stringify(a))});let n=o(()=>{i.stop(),process.exit(0)},"shutdown");process.on("SIGINT",n),process.on("SIGTERM",n),console.error(`Watching vault: ${e}`),r.pattern&&console.error(` Pattern filter: ${r.pattern}`),r.assetType&&console.error(` Asset type filter: ${r.assetType}`),console.error(` Debounce: ${t}ms`),console.error("Press Ctrl+C to stop"),i.start()}catch(e){Ee.handle(e)}})}o(cw,"watchCommand");var x1=require("path"),A1=Ke(ca());var Ca=Ke(bn());var pi=Ke(ca()),T1=Ke(require("crypto"));var ef=class{constructor(){this.backups=new Map;this.fileHashes=new Map}static{o(this,"TransactionManager")}async begin(e){if(!pi.default.existsSync(e))throw new Error(`Cannot backup non-existent file: ${e}`);let t=await pi.default.readFile(e,"utf-8"),i=T1.default.createHash("sha256").update(t).digest("hex");this.fileHashes.set(e,i);let n=`${e}.backup.${Date.now()}`;await pi.default.writeFile(n,t,"utf-8"),this.backups.set(e,n)}async verify(e){let t=this.fileHashes.get(e);if(!t)return!0;if(!pi.default.existsSync(e))return!1;let i=await pi.default.readFile(e,"utf-8");return T1.default.createHash("sha256").update(i).digest("hex")===t}async commit(){for(let e of this.backups.values())pi.default.existsSync(e)&&await pi.default.remove(e);this.backups.clear(),this.fileHashes.clear()}async rollback(){for(let[e,t]of this.backups.entries())pi.default.existsSync(t)&&(await pi.default.copy(t,e,{overwrite:!0}),await pi.default.remove(t));this.backups.clear(),this.fileHashes.clear()}getTrackedFiles(){return Array.from(this.backups.keys())}};var Ko=class{static{o(this,"BatchExecutor")}constructor(e,t=!1){this.pathResolver=new xa(e),this.fsAdapter=new Ta(e),this.frontmatterService=new Ca.FrontmatterService,this.transactionManager=new ef,this.dryRun=t}async executeBatch(e,t=!1){let i=Date.now(),n=[],s=0,a=0,c=!1;if(e.length===0)return{success:!0,total:0,succeeded:0,failed:0,results:[],durationMs:Date.now()-i,atomic:t};if(t&&!this.dryRun)try{await this.backupAllFiles(e)}catch(f){return{success:!1,total:e.length,succeeded:0,failed:e.length,results:e.map(l=>({success:!1,command:l.command,filepath:l.filepath,error:`Backup failed: ${f.message}`})),durationMs:Date.now()-i,atomic:t}}for(let f of e){let l=await this.executeSingleOperation(f);if(n.push(l),l.success)s++;else if(a++,t&&!this.dryRun){await this.transactionManager.rollback(),c=!0;let h=n.length;for(let p=h;p<e.length;p++)n.push({success:!1,command:e[p].command,filepath:e[p].filepath,error:"Not executed due to atomic rollback"}),a++;return{success:!1,total:e.length,succeeded:0,failed:e.length,results:n,durationMs:Date.now()-i,atomic:t,rolledBack:!0}}}return t&&!this.dryRun&&!c&&await this.transactionManager.commit(),{success:a===0,total:e.length,succeeded:s,failed:a,results:n,durationMs:Date.now()-i,atomic:t,...t&&{rolledBack:c}}}static parseInput(e){try{let t=JSON.parse(e);if(!Array.isArray(t))throw new tt("Batch input must be a JSON array of operations",`exo batch --input '[{"command":"start","filepath":"task.md"}]'`);for(let i of t){if(!i.command||typeof i.command!="string")throw new tt('Each operation must have a "command" string property','{"command":"start","filepath":"task.md"}');if(!i.filepath||typeof i.filepath!="string")throw new tt('Each operation must have a "filepath" string property','{"command":"start","filepath":"task.md"}')}return t}catch(t){throw t instanceof tt?t:new tt(`Failed to parse batch input: ${t.message}`,`exo batch --input '[{"command":"start","filepath":"task.md"}]'`)}}async backupAllFiles(e){let t=new Set;for(let i of e){let n=this.pathResolver.resolve(i.filepath);t.add(n)}for(let i of t)await this.transactionManager.begin(i)}async executeSingleOperation(e){try{let t=this.pathResolver.resolve(e.filepath);this.pathResolver.validate(t);let i=t.replace(this.pathResolver.getVaultRoot()+"/",""),n=await this.fsAdapter.readFile(i);if(this.dryRun)return{success:!0,command:e.command,filepath:e.filepath,action:`Would execute ${e.command} (dry-run)`};switch(e.command){case"start":return await this.executeStart(i,e);case"complete":return await this.executeComplete(i,e);case"trash":return await this.executeTrash(i,e);case"archive":return await this.executeArchive(i,e);case"move-to-backlog":return await this.executeStatusUpdate(i,e,"ems__EffortStatusBacklog","Moved to backlog");case"move-to-analysis":return await this.executeStatusUpdate(i,e,"ems__EffortStatusAnalysis","Moved to analysis");case"move-to-todo":return await this.executeStatusUpdate(i,e,"ems__EffortStatusToDo","Moved to todo");case"update-label":return await this.executeUpdateLabel(i,e);case"schedule":return await this.executeSchedule(i,e);case"set-deadline":return await this.executeSetDeadline(i,e);default:return{success:!1,command:e.command,filepath:e.filepath,error:`Unknown command: ${e.command}`}}}catch(t){return{success:!1,command:e.command,filepath:e.filepath,error:t.message}}}getCurrentTimestamp(){return Ca.DateFormatter.toLocalTimestamp(new Date)}async executeStart(e,t){let i=await this.fsAdapter.readFile(e),n=this.getCurrentTimestamp(),s=this.frontmatterService.updateProperty(i,"ems__Effort_status",'"[[ems__EffortStatusDoing]]"');return s=this.frontmatterService.updateProperty(s,"ems__Effort_startTimestamp",n),await this.fsAdapter.updateFile(e,s),{success:!0,command:t.command,filepath:t.filepath,action:"Started task",changes:{status:"Doing",startTimestamp:n}}}async executeComplete(e,t){let i=await this.fsAdapter.readFile(e),n=this.getCurrentTimestamp(),s=this.frontmatterService.updateProperty(i,"ems__Effort_status",'"[[ems__EffortStatusDone]]"');return s=this.frontmatterService.updateProperty(s,"ems__Effort_endTimestamp",n),s=this.frontmatterService.updateProperty(s,"ems__Effort_resolutionTimestamp",n),await this.fsAdapter.updateFile(e,s),{success:!0,command:t.command,filepath:t.filepath,action:"Completed task",changes:{status:"Done",endTimestamp:n,resolutionTimestamp:n}}}async executeTrash(e,t){let i=await this.fsAdapter.readFile(e),n=this.getCurrentTimestamp(),s=this.frontmatterService.updateProperty(i,"ems__Effort_status",'"[[ems__EffortStatusTrashed]]"');return s=this.frontmatterService.updateProperty(s,"ems__Effort_resolutionTimestamp",n),await this.fsAdapter.updateFile(e,s),{success:!0,command:t.command,filepath:t.filepath,action:"Trashed task",changes:{status:"Trashed",resolutionTimestamp:n}}}async executeArchive(e,t){let i=await this.fsAdapter.readFile(e),n=this.frontmatterService.updateProperty(i,"archived","true");return n=this.frontmatterService.removeProperty(n,"aliases"),await this.fsAdapter.updateFile(e,n),{success:!0,command:t.command,filepath:t.filepath,action:"Archived task",changes:{archived:!0,aliasesRemoved:!0}}}async executeStatusUpdate(e,t,i,n){let s=await this.fsAdapter.readFile(e),a=this.frontmatterService.updateProperty(s,"ems__Effort_status",`"[[${i}]]"`);return await this.fsAdapter.updateFile(e,a),{success:!0,command:t.command,filepath:t.filepath,action:n,changes:{status:i.replace("ems__EffortStatus","")}}}async executeUpdateLabel(e,t){let i=t.options?.label;if(!i||i.trim()==="")return{success:!1,command:t.command,filepath:t.filepath,error:'Missing required option: "label"'};let n=i.trim(),s=await this.fsAdapter.readFile(e),a=this.frontmatterService.updateProperty(s,"exo__Asset_label",`"${n}"`);return await this.fsAdapter.updateFile(e,a),{success:!0,command:t.command,filepath:t.filepath,action:`Updated label to "${n}"`,changes:{label:n}}}async executeSchedule(e,t){let i=t.options?.date;if(!i)return{success:!1,command:t.command,filepath:t.filepath,error:'Missing required option: "date"'};if(!/^\d{4}-\d{2}-\d{2}$/.test(i))return{success:!1,command:t.command,filepath:t.filepath,error:`Invalid date format: ${i}. Expected YYYY-MM-DD`};let n=await this.fsAdapter.readFile(e),s=Ca.DateFormatter.toTimestampAtStartOfDay(i),a=this.frontmatterService.updateProperty(n,"ems__Effort_scheduledTimestamp",s);return await this.fsAdapter.updateFile(e,a),{success:!0,command:t.command,filepath:t.filepath,action:`Scheduled for ${i}`,changes:{scheduledTimestamp:s}}}async executeSetDeadline(e,t){let i=t.options?.date;if(!i)return{success:!1,command:t.command,filepath:t.filepath,error:'Missing required option: "date"'};if(!/^\d{4}-\d{2}-\d{2}$/.test(i))return{success:!1,command:t.command,filepath:t.filepath,error:`Invalid date format: ${i}. Expected YYYY-MM-DD`};let n=await this.fsAdapter.readFile(e),s=Ca.DateFormatter.toTimestampAtStartOfDay(i),a=this.frontmatterService.updateProperty(n,"ems__Effort_deadlineTimestamp",s);return await this.fsAdapter.updateFile(e,a),{success:!0,command:t.command,filepath:t.filepath,action:`Set deadline to ${i}`,changes:{deadlineTimestamp:s}}}};function lI(r,e){if(r==="json"){let t=gt.success(e,{durationMs:e.durationMs,itemCount:e.total});console.log(JSON.stringify(t,null,2))}else{if(console.log(`
|
|
280
284
|
\u{1F4E6} Batch Execution ${e.success?"Complete":"Failed"}`),console.log(` Total: ${e.total} operations`),console.log(` \u2705 Succeeded: ${e.succeeded}`),console.log(` \u274C Failed: ${e.failed}`),console.log(` \u23F1\uFE0F Duration: ${e.durationMs}ms`),e.atomic&&console.log(` \u{1F512} Atomic mode: ${e.rolledBack?"Rolled back":"Committed"}`),e.failed>0){console.log(`
|
|
281
285
|
\u{1F4CB} Failed Operations:`);for(let t of e.results.filter(i=>!i.success))console.log(` \u274C ${t.command} ${t.filepath}: ${t.error}`)}if(e.succeeded>0&&r==="text"){console.log(`
|
|
282
|
-
\u{1F4CB} Successful Operations:`);for(let t of e.results.filter(i=>i.success))console.log(` \u2705 ${t.command} ${t.filepath}: ${t.action}`)}}}o(lI,"outputResult");function uw(){return new Pr("batch").description("Execute multiple operations in a single CLI invocation").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--input <json>","JSON array of operations to execute").option("--file <path>","Path to JSON file containing operations").option("--atomic","All-or-nothing execution (rollback on any failure)").option("--dry-run","Preview changes without modifying files").option("--format <type>","Output format: text|json (default: text)","text").action(async r=>{let e=r.format||"text";Ee.setFormat(e);try{let t=(0,x1.resolve)(r.vault),i;if(r.input)i=r.input;else if(r.file){let c=(0,x1.resolve)(r.file);if(!A1.default.existsSync(c))throw new tt(`Batch file not found: ${c}`,"exocortex batch --file operations.json");i=await A1.default.readFile(c,"utf-8")}else throw new tt("Either --input or --file option is required",`exocortex batch --input '[{"command":"start","filepath":"task.md"}]' or exocortex batch --file operations.json`);let n=Ko.parseInput(i);if(n.length===0)throw new tt("Batch input contains no operations",`exocortex batch --input '[{"command":"start","filepath":"task.md"}]'`);let a=await new Ko(t,r.dryRun).executeBatch(n,r.atomic);lI(e,a),process.exit(a.success?0:5)}catch(t){Ee.handle(t)}})}o(uw,"batchCommand");var tf=require("fs"),mi=require("path");function lw(){return new Pr("resolve").description("Resolve UUID to file path").argument("<uuid>","Full or partial UUID to resolve").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--format <type>","Output format: uri|path|json (default: uri)","uri").option("--output <type>","Response format: text|json (for MCP tools)","text").option("--partial","Match partial UUIDs (returns all matches)").action(async(r,e)=>{let t=e.output||"text";Ee.setFormat(t);try{let i=Date.now();if(!fI(r))throw new tt(`Invalid UUID format: ${r}`,"exocortex resolve <uuid> [--format uri|path|json] [--partial]",{uuid:r});let n=(0,mi.resolve)(e.vault);if(!(0,tf.existsSync)(n))throw new sn(n);let s=hI(n,r,e.partial??!1),a=Date.now()-i;if(s.length===0){if(t==="json"){let c=gt.error("VALIDATION_FILE_NOT_FOUND",`UUID not found: ${r}`,3,{context:{uuid:r}});console.log(JSON.stringify(c,null,2))}else console.error(`UUID not found: ${r}`);process.exit(1)}e.partial||s.length>1?pI(s,n,e.format,t,r,a):dI(s[0],n,e.format,t,r,a)}catch(i){Ee.handle(i)}})}o(lw,"resolveCommand");function fI(r){if(r.length<4)return!1;let e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,t=/^[0-9a-f-]+$/i;return e.test(r)||t.test(r)}o(fI,"isValidUuidFormat");function hI(r,e,t){let i=[],n=e.toLowerCase();function s(a){let c=(0,tf.readdirSync)(a,{withFileTypes:!0});for(let u of c){let f=(0,mi.join)(a,u.name);if(u.isDirectory())!u.name.startsWith(".")&&u.name!=="node_modules"&&s(f);else if(u.isFile()&&u.name.endsWith(".md")){let l=u.name.toLowerCase();t?l.includes(n)&&i.push(f):(l.startsWith(n+".md")||l.startsWith(n+" ")||l.startsWith(n+"-"))&&i.push(f)}}}return o(s,"walk"),s(r),i}o(hI,"findFilesWithUuid");function fw(r){return`obsidian://vault/${encodeURI(r)}`}o(fw,"pathToObsidianUri");function hw(r){let e=r.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);return e?e[1]:(0,mi.basename)(r,".md")}o(hw,"extractUuidFromFilename");function dI(r,e,t,i,n,s){let a=(0,mi.relative)(e,r),c=fw(a),u=hw((0,mi.basename)(r));if(i==="json"){let f={uuid:u,path:a,absolutePath:r,uri:c},l=gt.success(f,{durationMs:s,searchUuid:n});console.log(JSON.stringify(l,null,2))}else switch(t){case"path":console.log(r);break;case"json":console.log(JSON.stringify({uuid:u,path:a,absolutePath:r,uri:c},null,2));break;case"uri":default:console.log(c);break}}o(dI,"outputSingleResult");function pI(r,e,t,i,n,s){let a=r.map(c=>{let u=(0,mi.relative)(e,c),f=fw(u);return{uuid:hw((0,mi.basename)(c)),path:u,absolutePath:c,uri:f}});if(i==="json"){let c=gt.success({matches:a,count:a.length},{durationMs:s,searchUuid:n,itemCount:a.length});console.log(JSON.stringify(c,null,2))}else switch(t){case"path":for(let c of a)console.log(c.absolutePath);break;case"json":console.log(JSON.stringify(a,null,2));break;case"uri":default:for(let c of a)console.log(c.uri);break}}o(pI,"outputMultipleResults");var Ss=new Pr;Ss.name("exocortex").description("CLI tool for Exocortex knowledge management system").version("13.
|
|
286
|
+
\u{1F4CB} Successful Operations:`);for(let t of e.results.filter(i=>i.success))console.log(` \u2705 ${t.command} ${t.filepath}: ${t.action}`)}}}o(lI,"outputResult");function uw(){return new Pr("batch").description("Execute multiple operations in a single CLI invocation").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--input <json>","JSON array of operations to execute").option("--file <path>","Path to JSON file containing operations").option("--atomic","All-or-nothing execution (rollback on any failure)").option("--dry-run","Preview changes without modifying files").option("--format <type>","Output format: text|json (default: text)","text").action(async r=>{let e=r.format||"text";Ee.setFormat(e);try{let t=(0,x1.resolve)(r.vault),i;if(r.input)i=r.input;else if(r.file){let c=(0,x1.resolve)(r.file);if(!A1.default.existsSync(c))throw new tt(`Batch file not found: ${c}`,"exocortex batch --file operations.json");i=await A1.default.readFile(c,"utf-8")}else throw new tt("Either --input or --file option is required",`exocortex batch --input '[{"command":"start","filepath":"task.md"}]' or exocortex batch --file operations.json`);let n=Ko.parseInput(i);if(n.length===0)throw new tt("Batch input contains no operations",`exocortex batch --input '[{"command":"start","filepath":"task.md"}]'`);let a=await new Ko(t,r.dryRun).executeBatch(n,r.atomic);lI(e,a),process.exit(a.success?0:5)}catch(t){Ee.handle(t)}})}o(uw,"batchCommand");var tf=require("fs"),mi=require("path");function lw(){return new Pr("resolve").description("Resolve UUID to file path").argument("<uuid>","Full or partial UUID to resolve").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--format <type>","Output format: uri|path|json (default: uri)","uri").option("--output <type>","Response format: text|json (for MCP tools)","text").option("--partial","Match partial UUIDs (returns all matches)").action(async(r,e)=>{let t=e.output||"text";Ee.setFormat(t);try{let i=Date.now();if(!fI(r))throw new tt(`Invalid UUID format: ${r}`,"exocortex resolve <uuid> [--format uri|path|json] [--partial]",{uuid:r});let n=(0,mi.resolve)(e.vault);if(!(0,tf.existsSync)(n))throw new sn(n);let s=hI(n,r,e.partial??!1),a=Date.now()-i;if(s.length===0){if(t==="json"){let c=gt.error("VALIDATION_FILE_NOT_FOUND",`UUID not found: ${r}`,3,{context:{uuid:r}});console.log(JSON.stringify(c,null,2))}else console.error(`UUID not found: ${r}`);process.exit(1)}e.partial||s.length>1?pI(s,n,e.format,t,r,a):dI(s[0],n,e.format,t,r,a)}catch(i){Ee.handle(i)}})}o(lw,"resolveCommand");function fI(r){if(r.length<4)return!1;let e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,t=/^[0-9a-f-]+$/i;return e.test(r)||t.test(r)}o(fI,"isValidUuidFormat");function hI(r,e,t){let i=[],n=e.toLowerCase();function s(a){let c=(0,tf.readdirSync)(a,{withFileTypes:!0});for(let u of c){let f=(0,mi.join)(a,u.name);if(u.isDirectory())!u.name.startsWith(".")&&u.name!=="node_modules"&&s(f);else if(u.isFile()&&u.name.endsWith(".md")){let l=u.name.toLowerCase();t?l.includes(n)&&i.push(f):(l.startsWith(n+".md")||l.startsWith(n+" ")||l.startsWith(n+"-"))&&i.push(f)}}}return o(s,"walk"),s(r),i}o(hI,"findFilesWithUuid");function fw(r){return`obsidian://vault/${encodeURI(r)}`}o(fw,"pathToObsidianUri");function hw(r){let e=r.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);return e?e[1]:(0,mi.basename)(r,".md")}o(hw,"extractUuidFromFilename");function dI(r,e,t,i,n,s){let a=(0,mi.relative)(e,r),c=fw(a),u=hw((0,mi.basename)(r));if(i==="json"){let f={uuid:u,path:a,absolutePath:r,uri:c},l=gt.success(f,{durationMs:s,searchUuid:n});console.log(JSON.stringify(l,null,2))}else switch(t){case"path":console.log(r);break;case"json":console.log(JSON.stringify({uuid:u,path:a,absolutePath:r,uri:c},null,2));break;case"uri":default:console.log(c);break}}o(dI,"outputSingleResult");function pI(r,e,t,i,n,s){let a=r.map(c=>{let u=(0,mi.relative)(e,c),f=fw(u);return{uuid:hw((0,mi.basename)(c)),path:u,absolutePath:c,uri:f}});if(i==="json"){let c=gt.success({matches:a,count:a.length},{durationMs:s,searchUuid:n,itemCount:a.length});console.log(JSON.stringify(c,null,2))}else switch(t){case"path":for(let c of a)console.log(c.absolutePath);break;case"json":console.log(JSON.stringify(a,null,2));break;case"uri":default:for(let c of a)console.log(c.uri);break}}o(pI,"outputMultipleResults");var Ss=new Pr;Ss.name("exocortex").description("CLI tool for Exocortex knowledge management system").version("13.160.0");Ss.command("sparql").description("SPARQL query execution").addCommand(X_());Ss.addCommand(sw());Ss.addCommand(cw());Ss.addCommand(uw());Ss.addCommand(lw());Ss.parse();
|
|
283
287
|
/*! Bundled license information:
|
|
284
288
|
|
|
285
289
|
reflect-metadata/Reflect.js:
|