prjct-cli 2.2.1 → 2.2.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.
- package/CHANGELOG.md +7 -0
- package/dist/bin/prjct-core.mjs +2 -2
- package/dist/daemon/entry.mjs +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -811,7 +811,7 @@ ${_d(f)}`);let b=await Bs.confirm({message:"Apply these changes?",initialValue:!
|
|
|
811
811
|
|
|
812
812
|
- removed: ${r.hooksRemoved}
|
|
813
813
|
- settings: \`${r.settingsPath}\`
|
|
814
|
-
`):g.done(o),{success:!0,hooksRemoved:r.hooksRemoved}}catch(r){let o=k(r);return g.fail(o),{success:!1,error:o}}}async status(e=null,t=process.cwd()){try{let s=await $m();return{success:!0,installed:s.installed,expected:s.expected}}catch(s){return{success:!1,error:k(s)}}}}});async function ti(n){let e=await I.getProjectId(n);return e?{ok:!0,value:e}:(g.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function qc(n,e={}){let t=await _.getCurrentTask(n);if(!t){let s='No active task \u2014 start one with `prjct task "<desc>"`';return e.md?console.log(`> ${s}`):g.warn("no active task"),{ok:!1,result:{success:!1,error:s}}}return{ok:!0,value:t}}var Mm=y(()=>{"use strict";ie();at();Me();c(ti,"requireProjectId");c(qc,"requireActiveTask")});import $S from"node:crypto";import Ir from"node:fs/promises";import NS from"node:os";import At from"node:path";async function Om(n){let e=await OS(n),t=At.basename(n),s=`obsidian://open?vault=${encodeURIComponent(t)}`,r=MS();if(!r)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:s,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await _S(r,n);return{bootstrapped:e,registered:o,vaultName:t,openUrl:s,obsidianConfigFound:!0,alreadyRegistered:i}}function MS(){let n=NS.homedir(),e;switch(process.platform){case"darwin":e=At.join(n,"Library","Application Support","obsidian");break;case"win32":e=At.join(process.env.APPDATA||At.join(n,"AppData","Roaming"),"obsidian");break;default:e=At.join(process.env.XDG_CONFIG_HOME||At.join(n,".config"),"obsidian");break}try{if(!Xe("node:fs").existsSync(e))return null}catch{return null}return At.join(e,"obsidian.json")}async function OS(n){let e=At.join(n,".obsidian"),t=At.join(e,"app.json");try{return await Ir.stat(t),!1}catch{}return await Ir.mkdir(e,{recursive:!0}),await Ir.writeFile(t,`${JSON.stringify({},null,2)}
|
|
814
|
+
`):g.done(o),{success:!0,hooksRemoved:r.hooksRemoved}}catch(r){let o=k(r);return g.fail(o),{success:!1,error:o}}}async status(e=null,t=process.cwd()){try{let s=await $m();return{success:!0,installed:s.installed,expected:s.expected}}catch(s){return{success:!1,error:k(s)}}}}});async function ti(n){let e=await I.getProjectId(n);return e?{ok:!0,value:e}:(g.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function qc(n,e={}){let t=await _.getCurrentTask(n);if(!t){let s='No active task \u2014 start one with `prjct task "<desc>"`';return e.md?console.log(`> ${s}`):g.warn("no active task"),{ok:!1,result:{success:!1,error:s}}}return{ok:!0,value:t}}var Mm=y(()=>{"use strict";ie();at();Me();c(ti,"requireProjectId");c(qc,"requireActiveTask")});import $S from"node:crypto";import Ir from"node:fs/promises";import NS from"node:os";import At from"node:path";async function Om(n){let e=await OS(n),t=At.basename(n),s=`obsidian://open?vault=${encodeURIComponent(t)}`,r=MS();if(!r)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:s,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await _S(r,n);return{bootstrapped:e,registered:o,vaultName:t,openUrl:s,obsidianConfigFound:!0,alreadyRegistered:i}}function MS(){let n=NS.homedir(),e,t=process.env.PRJCT_OBSIDIAN_CONFIG_DIR?.trim();if(t)e=t;else switch(process.platform){case"darwin":e=At.join(n,"Library","Application Support","obsidian");break;case"win32":e=At.join(process.env.APPDATA||At.join(n,"AppData","Roaming"),"obsidian");break;default:e=At.join(process.env.XDG_CONFIG_HOME||At.join(n,".config"),"obsidian");break}try{if(!Xe("node:fs").existsSync(e))return null}catch{return null}return At.join(e,"obsidian.json")}async function OS(n){let e=At.join(n,".obsidian"),t=At.join(e,"app.json");try{return await Ir.stat(t),!1}catch{}return await Ir.mkdir(e,{recursive:!0}),await Ir.writeFile(t,`${JSON.stringify({},null,2)}
|
|
815
815
|
`,"utf-8"),!0}async function _S(n,e){let t={};try{let a=await Ir.readFile(n,"utf-8");t=JSON.parse(a)}catch{}let s=t.vaults??{},r=At.resolve(e);for(let a of Object.values(s))if(At.resolve(a.path)===r)return{registered:!1,alreadyRegistered:!0};let o=$S.randomBytes(8).toString("hex");s[o]={path:r,ts:Date.now()};let i={...t,vaults:s};try{return await Ir.writeFile(n,JSON.stringify(i),"utf-8"),{registered:!0,alreadyRegistered:!1}}catch{return{registered:!1,alreadyRegistered:!1}}}var _m=y(()=>{"use strict";c(Om,"ensureObsidianVault");c(MS,"resolveObsidianConfigPath");c(OS,"bootstrapObsidianDir");c(_S,"registerVaultInObsidianConfig")});import It from"node:fs/promises";import An from"node:path";async function si(n){let e=await I.readConfig(n).catch(()=>null);if(e?.vaultPath&&e.vaultPath.trim().length>0)return{moved:!1,reason:"user-override"};let t=D.getLegacyWikiPath(n);if(!await Fm(t))return{moved:!1,reason:"no-legacy"};let r=D.getWikiPath(n);if(await Fm(r))return console.error(`\u26A0 prjct: legacy wiki at ${t} was NOT migrated \u2014 ${r} already has content.
|
|
816
816
|
Merge manually or set \`vaultPath\` in .prjct/prjct.config.json to choose one.`),{moved:!1,reason:"conflict",from:t,to:r};await It.mkdir(An.dirname(r),{recursive:!0});let i=await FS(t,r);return await US(n),console.error(`\u2139 prjct: migrated Obsidian vault
|
|
817
817
|
from: ${D.getDisplayPath(t)}
|
|
@@ -1308,7 +1308,7 @@ ${B.yellow(`Command '${n}' not found.`)}
|
|
|
1308
1308
|
|
|
1309
1309
|
Run 'prjct help' to see all available commands.
|
|
1310
1310
|
`}function PT(){let n=[];n.push(""),n.push(B.cyan.bold("All Commands")),n.push("");let e=Object.entries(Or).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let r=qn.filter(o=>o.group===t);if(r.length!==0){n.push(`${B.bold(s.title)} ${B.dim(`(${r.length} commands)`)}`),n.push(B.dim(s.description)),n.push("");for(let o of r){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;n.push(` ${i} ${a}`)}n.push("")}}return n.push(B.dim("Run 'prjct help <command>' for detailed help on a specific command.")),n.push(""),n.join(`
|
|
1311
|
-
`)}function jT(n){return n?n==="commands"||n==="all"?PT():CT(n):bT()}var ff,vT,yf=y(()=>{"use strict";Sl();qe();ff=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],vT=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];c(bT,"formatMainHelp");c(TT,"formatTerminalCommandHelp");c(ET,"formatAgentCommandHelp");c(CT,"formatCommandHelp");c(PT,"formatCommandList");c(jT,"getHelp")});var wf=Mf((AU,xT)=>{xT.exports={name:"prjct-cli",version:"2.2.
|
|
1311
|
+
`)}function jT(n){return n?n==="commands"||n==="all"?PT():CT(n):bT()}var ff,vT,yf=y(()=>{"use strict";Sl();qe();ff=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],vT=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];c(bT,"formatMainHelp");c(TT,"formatTerminalCommandHelp");c(ET,"formatAgentCommandHelp");c(CT,"formatCommandHelp");c(PT,"formatCommandList");c(jT,"getHelp")});var wf=Mf((AU,xT)=>{xT.exports={name:"prjct-cli",version:"2.2.2",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@hono/node-server":"1.19.14","@modelcontextprotocol/sdk":"1.28.0","better-sqlite3":"12.6.2",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1",hono:"4.12.14","jsonc-parser":"3.3.1",zod:"3.24.1"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5",hono:"4.12.14","@hono/node-server":"1.19.14"},devDependencies:{"@biomejs/biome":"2.3.13","@types/better-sqlite3":"7.6.13","@types/bun":"latest","@types/chokidar":"2.1.7",esbuild:"0.25.0",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.22.2"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var MT={};import kf from"node:os";import vi from"node:path";import Re from"chalk";async function RT(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let s=await Promise.resolve().then(()=>Of(wf()));await $T(s.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(NT(),process.exit(0)),n&&yi(n)&&!ne.getByName(n)){let s=hi[n];s&&(g.failWithHint({message:`'prjct ${n}' was removed in v2. ${s.note}`,hint:`Use: ${s.replacement}`}),process.exit(1))}if(n&&!ne.getByName(n)&&!(e.length===0&&Sf(n)!==null)){let r=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[r,...o]}let t=e.includes("--md");t||g.start();try{let s=ne.getByName(n);if(!s){let p=Sf(n),f=p?`Did you mean 'prjct ${p}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(hr("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:f})),t||g.end(),process.exit(1)}if(s.deprecated){let p=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${n}' is deprecated`,hint:p}),t||g.end(),process.exit(1)}s.implemented||(g.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||g.end(),process.exit(1));let{parsedArgs:r,options:o}=DT(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let a=AT(s,r);a&&(g.failWithHint(a),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await I.getProjectId(process.cwd()),l&&(await hn.expireIfStale(l),await hn.touch(l))}catch{}let d=new Es,m;if(n==="analyze")m=await d.analyze(o);else if(n==="setup")m=await d.setup(o);else if(n==="update")m=await d.update(o);else{let p=r.join(" ")||null,f=o.md===!0,j={task:c(b=>d.task(b,process.cwd(),{md:f}),"task"),init:c(b=>d.init({idea:b,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),ship:c(b=>d.ship(b,process.cwd(),{md:f}),"ship"),workflow:c(b=>d.workflowPrefs(b,process.cwd(),{md:f}),"workflow"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:f,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),start:c(()=>d.start(),"start"),context:c(b=>d.context(b),"context"),status:c(b=>d.status(b,process.cwd(),{md:f}),"status"),tag:c(b=>d.tag(b,process.cwd(),{md:f}),"tag"),remember:c(b=>d.remember(b,process.cwd(),{md:f,tags:o.tags?String(o.tags):void 0}),"remember"),login:c(()=>d.login({md:f,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(b=>d.auth(b,{md:f}),"auth"),seed:c(b=>d.seed(b,process.cwd(),{md:f}),"seed"),install:c(()=>d.install(null,process.cwd(),{md:f}),"install"),capture:c(b=>d.capture(b,process.cwd(),{md:f,tags:o.tags?String(o.tags):void 0,force:o.force===!0}),"capture")}[n];if(j)m=await j(p);else throw new Error(`Command '${n}' has no handler`)}if(l){let p=Date.now()-u;try{await hn.trackCommand(l,n,p)}catch{}try{await yr.recordTiming(l,"command_duration",p,{command:n});let f=globalThis.__perfStartNs;if(f){let v=Number(process.hrtime.bigint()-f)/1e6;await yr.recordTiming(l,"startup_time",v)}await yr.recordMemory(l,{command:n})}catch{}}m?.message&&console.log(m.message),t||g.end(),process.exit(m?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(ji(s)),t||g.end(),process.exit(1)}}function AT(n,e){if(!n.params)return null;let t=n.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),r=n.usage.terminal||`prjct ${n.name} ${n.params}`;return hr("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${r}`})}return null}function Sf(n){let e=ne.getAll().map(r=>r.name),t=null,s=1/0;for(let r of e){let o=IT(n.toLowerCase(),r.toLowerCase());o<s&&(s=o,t=r)}return s<=2?t:null}function IT(n,e){let t=n.length,s=e.length,r=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=s;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)r[o][i]=n[o-1]===e[i-1]?r[o-1][i-1]:1+Math.min(r[o-1][i],r[o][i-1],r[o-1][i-1]);return r[t][s]}function DT(n,e){let t=[],s={};for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("--")){let i=o.slice(2);r+1<e.length&&!e[r+1].startsWith("--")?s[i]=e[++r]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function $T(n){let e=await Jt(),t=vi.join(kf.homedir(),".claude","commands","p.md"),s=vi.join(kf.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([S(t),S(s),S(vi.join(process.cwd(),".cursor","commands","sync.md")),S(vi.join(process.cwd(),".cursor"))]),l=await tn();if(console.log(`
|
|
1312
1312
|
${Re.cyan("p/")} prjct v${n}
|
|
1313
1313
|
${Re.dim("Context layer for AI coding agents")}
|
|
1314
1314
|
|
package/dist/daemon/entry.mjs
CHANGED
|
@@ -788,7 +788,7 @@ Generated: ${new Date().toLocaleString()}
|
|
|
788
788
|
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:i,data:r}}catch(r){return console.error("\u274C Error:",y(r)),{success:!1,error:y(r)}}}async sync(e=process.cwd(),t={}){try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await I.getProjectId(e);if(!s)return g.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=R.getGlobalProjectPath(s),i=Date.now();if(t.package){let p=await R.detectMonorepo(e);if(!p.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let m=p.packages.find(S=>S.name===t.package||S.relativePath===t.package);if(!m){let S=p.packages.map(C=>C.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${S}`}}let f=await ir.sync(e,{packagePath:m.path,packageName:m.name});return t.json?console.log(JSON.stringify({success:f.success,package:m.name,path:m.relativePath})):t.md?console.log(M(ye(`Synced package: ${m.name}`))):g.done(`Synced package: ${m.name}`),{success:f.success}}let a=Fh.join(o,"context","CLAUDE.md"),l=null;try{l=await Kn.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(l&&!t.yes&&!u){u||g.spin("Analyzing changes...");let p=await ir.sync(e,{full:t.full});if(!p.success)return t.md?(console.log(M("## Sync Failed",`> ${p.error||"Unknown error"}`)),{success:!1,error:p.error}):u?(console.log(JSON.stringify({success:!1,error:p.error||"Sync failed"})),{success:!1,error:p.error}):(g.fail(p.error||"Sync failed"),{success:!1,error:p.error});let m;try{m=await Kn.readFile(a,"utf-8")}catch{m=""}let f=vl(l,m);if(u||g.stop(),!f.hasChanges)return t.md?(console.log(M(ye("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(g.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let S=c(async()=>{l!=null&&await Kn.writeFile(a,l,"utf-8")},"restoreOriginal");if(t.md){await S();let E=[];for(let k of f.added)E.push(`Added: ${k.name} (${k.lineCount} lines)`);for(let k of f.modified)E.push(`Modified: ${k.name} (${k.lineCount} lines)`);for(let k of f.removed)E.push(`Removed: ${k.name} (${k.lineCount} lines)`);let j=M("## Sync Preview",E.length>0?ne("Changes",xe(E)):"No section changes.",ar({"Tokens before":f.tokensBefore,"Tokens after":f.tokensAfter,"Token delta":f.tokenDelta>0?`+${f.tokenDelta}`:String(f.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(j),{success:!0,isPreview:!0,diff:f,message:"Preview complete (awaiting confirmation)"}}if(u){await S();let E={added:f.added.map(j=>({name:j.name,lineCount:j.lineCount})),modified:f.modified.map(j=>({name:j.name,lineCount:j.lineCount})),removed:f.removed.map(j=>({name:j.name,lineCount:j.lineCount})),preserved:f.preserved,tokensBefore:f.tokensBefore,tokensAfter:f.tokensAfter,tokenDelta:f.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:E,fullDiff:t.preview?{added:f.added,modified:f.modified,removed:f.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:f,message:"Preview complete (awaiting confirmation)"}}if(console.log(bl(f)),t.preview)return await S(),{success:!0,isPreview:!0,diff:f,message:"Preview complete (no changes applied)"};let C=await mr.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(mr.isCancel(C)||C==="cancel")return await S(),g.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(C==="diff"){console.log(`
|
|
789
789
|
${Tl(f)}`);let E=await mr.confirm({message:"Apply these changes?",initialValue:!0});if(mr.isCancel(E)||!E)return await S(),g.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return g.done("Changes applied"),Yi(p,i)}t.md||g.spin("Syncing project...");let d=await ir.sync(e,{full:t.full});if(!d.success)return t.md?console.log(M("## Sync Failed",`> ${d.error||"Unknown error"}`)):g.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||g.stop(),t.md){let p=Date.now()-i,m=d.generatedSkills?.generated?.length??0,f=null;try{let x=await Fe.diff(s);x?.hasChanges&&(f=Ho(x))}catch{}let S=d.git.recentCommits[0]?.hash??null,C=S&&Et.isCurrent(s,S),E=null;if(!C)try{let x=await ai(s,e,d.git,d.stats);E=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Pd,"```","### Data","```json",JSON.stringify(x),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`"].join(`
|
|
790
790
|
`)}catch{E="### Next: Run `prjct analysis-payload --md` to update project analysis"}let j=Fn("sync",!0),k=d.syncMetrics?.indexes,_={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(k?.bm25Files){let x=k.bm25Files*(k.bm25AvgTokens||0);_["Tokens indexed"]=`${Math.round(x/1e3)}K`,_["Import edges"]=k.importEdges||0,_["Co-change commits"]=k.cochangeCommits||0}let ee=M(ye("Sync Complete"),ar(_),f,d.git.hasChanges?Wu("Uncommitted changes detected"):null,E,Ie(j.map(x=>({label:x.desc,command:x.cmd}))));return console.log(ee),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return Yi(d,i)}catch(r){return t.md?console.log(M("## Sync Failed",`> ${y(r)}`)):g.fail(y(r)),{success:!1,error:y(r)}}}async analysisPayload(e=process.cwd(),t={}){try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await I.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await ir.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Et.isCurrent(s,i))return t.md?console.log(M(ye("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await ai(s,e,o.git,o.stats);return t.md?console.log(M("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Pd,"```","### Data","```json",JSON.stringify(a),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(r){return{success:!1,error:y(r)}}}async saveLlmAnalysis(e,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await I.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Et.save(o,i),r.md?console.log(M(ye("LLM Analysis Saved"),ar({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(s){return{success:!1,error:y(s)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await I.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=Et.getActive(s);if(!o)return t.md?console.log(M("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[ye(`LLM Analysis (${o.architecture.style})`),""];if(o.architecture.insights.length>0&&i.push(ne("Architecture Insights",xe(o.architecture.insights.slice(0,5)))),o.patterns.length>0){let a=o.patterns.slice(0,8);i.push(ne(`Patterns (${o.patterns.length})`,xe(a.map(l=>`**${l.name}** \u2014 ${l.description} (${l.category})`))))}if(o.antiPatterns.length>0){let a=o.antiPatterns.slice(0,5);i.push(ne(`Anti-Patterns (${o.antiPatterns.length})`,xe(a.map(l=>`[${l.severity}] ${l.issue} \u2014 ${l.suggestion}`))))}if(o.techDebt.length>0){let a=o.techDebt.slice(0,5);i.push(ne(`Tech Debt (${o.techDebt.length})`,xe(a.map(l=>`[${l.priority}/${l.effort}] ${l.description}`))))}o.conventions.length>0&&i.push(ne("Conventions",xe(o.conventions.slice(0,5).map(a=>`**${a.category}**: ${a.rule}`)))),console.log(M(...i))}else{let i={...o,patterns:o.patterns.slice(0,10),antiPatterns:o.antiPatterns.slice(0,6),techDebt:o.techDebt.slice(0,6),conventions:o.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:i}))}return{success:!0,data:o}}catch(r){return{success:!1,error:y(r)}}}async stats(e=process.cwd(),t={}){try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await I.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await jt.getSummary(s),i=await jt.getDailyStats(s,30),a=await Xu(s),l={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(t.json){let m={session:a,patterns:l,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents.slice(0,5),last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(m)),{success:!0,data:m}}let u="Unknown";try{u=w.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await jt.read(s),p=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${p.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let m=a.agentsUsed.slice(0,3).map(f=>`${f.name} (${f.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}if(console.log(""),(l.decisions>0||l.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${l.learnedDecisions} confirmed (${l.decisions} total)`),console.log(` Preferences: ${l.preferences} saved`),console.log(` Workflows: ${l.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Or(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${fn(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Qi(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let m=o.topAgents.reduce((f,S)=>f+S.usageCount,0);for(let f of o.topAgents){let S=m>0?(f.usageCount/m*100).toFixed(0):0;console.log(` ${f.agentName.padEnd(12)}: ${S}% (${f.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let m=Ku(i);if(console.log(` ${m} ${Or(o.last30DaysTokens)} tokens saved`),o.trend!==0){let f=o.trend>0?"\u2191":"\u2193",S=o.trend>0?"+":"";console.log(` ${f} ${S}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let m=Yu(o,i,u,p,a,l);return console.log(m),{success:!0,data:{markdown:m}}}return{success:!0,data:{...o,session:a,patterns:l}}}catch(r){return console.error("\u274C Error:",y(r)),{success:!1,error:y(r)}}}async diff(e=process.cwd(),t={}){try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await I.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Fe.diff(s);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(M("## Analysis Diff",`> ${i}`)):g.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(M(Ho(o))),{success:!0,data:o};if(!o.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(Jc(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),g.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(r){let s=y(r);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(M("## Diff Failed",`> ${s}`)):g.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await I.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Fe.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(g.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(g.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(r){let s=y(r);return t.json?console.log(JSON.stringify({success:!1,error:s})):g.fail(s),{success:!1,error:s}}}async rollback(e=process.cwd(),t={}){try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await I.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Fe.rollback(s);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(M(ye("Analysis Rolled Back"),ar({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(M("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(g.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(g.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(r){let s=y(r);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(M("## Rollback Failed",`> ${s}`)):g.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await I.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Fe.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?g.done(o.message):g.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(r){let s=y(r);return g.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await I.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):g.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=w.getDoc(s,"project")?.repoPath||e}catch{}let i=await Fe.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(g.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(g.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let l=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${l} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(r){let s=y(r);return t.json?console.log(JSON.stringify({success:!1,error:s})):g.fail(s),{success:!1,error:s}}}}});var Cd,Sa,va,jd,Rs,Yn=v(()=>{"use strict";Cd="memory.",Sa="remember.",va=`${Cd}${Sa}`,jd=`${Cd}task.tagged`,Rs="status.changed"});function xd(n,e){try{return JSON.parse(n)}catch{return e}}function Vh(n){let e=n.type.slice(va.length),t=xd(n.data,{});return{id:`mem_${n.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:n.timestamp,source:t.source,provenance:t.provenance??"declared"}}function qh(n){let e=n.data?xd(n.data,{}):{},t=e.tags??{};return n.type&&(t.type=n.type),{id:`ship_${n.id}`,type:"shipped",content:n.name,tags:t,rememberedAt:n.shipped_at,source:e.taskId,provenance:"extracted"}}function Bh(n,e){let t=e.toLowerCase();if(n.content.toLowerCase().includes(t))return!0;for(let r of Object.values(n.tags))if(r.toLowerCase().includes(t))return!0;return!1}function Jh(n,e){for(let[t,r]of Object.entries(e))if(n.tags[t]!==r)return!1;return!0}function Is(n){if(n.length===0)return"> No matching memory entries.";let e=new Map;for(let o of n){let i=e.get(o.type)??[];i.push(o),e.set(o.type,i)}let t=["decision","learning","anti-pattern","gotcha","pattern","fact","shipped"],r=[],s={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"};for(let o of t){let i=e.get(o);if(!(!i||i.length===0)){r.push(`### ${o.toUpperCase()}`);for(let a of i){let l=Object.entries(a.tags).map(([p,m])=>`${p}=${m}`).join(" "),u=l?` _(${l})_`:"",d=s[a.provenance];r.push(`- \`${d}\` [${a.id}] ${a.content}${u}`)}r.push("")}}return r.join(`
|
|
791
|
-
`).trim()}var Uh,As,Hh,Wh,Gh,Gt,Ds=v(()=>{"use strict";or();ce();Yn();Uh=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person"],As=Uh,Hh=25,Wh=4,Gh=100;c(xd,"safeJson");c(Vh,"rowToEntry");c(qh,"shippedRowToEntry");c(Bh,"matchesTopic");c(Jh,"matchesTags");Gt={async remember(n,e){await ze.log(n,`${Sa}${e.type}`,{content:e.content,tags:e.tags??{},source:e.source,provenance:e.provenance??"declared"})},recall(n,e={}){let t=e.limit??Hh,r=Math.max(t*Wh,Gh),s=F.query(n,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${va}%`,r),o=F.query(n,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",r),i=[...s.map(Vh),...o.map(qh)];if(e.types&&e.types.length>0){let a=new Set(e.types);i=i.filter(l=>a.has(l.type))}return e.tags&&(i=i.filter(a=>Jh(a,e.tags??{}))),e.topic&&(i=i.filter(a=>Bh(a,e.topic))),i.sort((a,l)=>l.rememberedAt.localeCompare(a.rememberedAt)),i.slice(0,t)},similar(n,e,t=10){let r=e.toLowerCase().split(/[^a-z0-9]+/).filter(i=>i.length>3);return r.length===0?[]:Gt.recall(n,{limit:200}).map(i=>{let a=`${i.content} ${Object.values(i.tags).join(" ")}`.toLowerCase(),l=r.reduce((u,d)=>a.includes(d)?u+1:u,0);return{entry:i,hits:l}}).filter(i=>i.hits>0).sort((i,a)=>a.hits-i.hits).slice(0,t).map(i=>i.entry)}};c(Is,"formatMemoryMd")});function $s(n){let e=[];for(let{name:t,re:r}of zh)r.test(n)&&e.push(t);return e}var zh,Qn=v(()=>{"use strict";zh=[{name:"sk-\u2026 token",re:/\bsk-[A-Za-z0-9_-]{16,}/},{name:"GitHub PAT",re:/\bghp_[A-Za-z0-9]{30,}/},{name:"GitHub server PAT",re:/\bghs_[A-Za-z0-9]{30,}/},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"Slack token",re:/\bxox[abps]-[A-Za-z0-9-]{10,}/},{name:"bearer JWT-ish",re:/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/}];c($s,"scanForSecrets")});import Zh from"node:crypto";import Ns from"node:fs/promises";import ey from"node:os";import pt from"node:path";async function Md(n){let e=await ry(n),t=pt.basename(n),r=`obsidian://open?vault=${encodeURIComponent(t)}`,s=ty();if(!s)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:r,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await sy(s,n);return{bootstrapped:e,registered:o,vaultName:t,openUrl:r,obsidianConfigFound:!0,alreadyRegistered:i}}function ty(){let n=ey.homedir(),e;switch(process.platform){case"darwin":e=pt.join(n,"Library","Application Support","obsidian");break;case"win32":e=pt.join(process.env.APPDATA||pt.join(n,"AppData","Roaming"),"obsidian");break;default:e=pt.join(process.env.XDG_CONFIG_HOME||pt.join(n,".config"),"obsidian");break}try{if(!$e("node:fs").existsSync(e))return null}catch{return null}return pt.join(e,"obsidian.json")}async function ry(n){let e=pt.join(n,".obsidian"),t=pt.join(e,"app.json");try{return await Ns.stat(t),!1}catch{}return await Ns.mkdir(e,{recursive:!0}),await Ns.writeFile(t,`${JSON.stringify({},null,2)}
|
|
791
|
+
`).trim()}var Uh,As,Hh,Wh,Gh,Gt,Ds=v(()=>{"use strict";or();ce();Yn();Uh=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person"],As=Uh,Hh=25,Wh=4,Gh=100;c(xd,"safeJson");c(Vh,"rowToEntry");c(qh,"shippedRowToEntry");c(Bh,"matchesTopic");c(Jh,"matchesTags");Gt={async remember(n,e){await ze.log(n,`${Sa}${e.type}`,{content:e.content,tags:e.tags??{},source:e.source,provenance:e.provenance??"declared"})},recall(n,e={}){let t=e.limit??Hh,r=Math.max(t*Wh,Gh),s=F.query(n,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${va}%`,r),o=F.query(n,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",r),i=[...s.map(Vh),...o.map(qh)];if(e.types&&e.types.length>0){let a=new Set(e.types);i=i.filter(l=>a.has(l.type))}return e.tags&&(i=i.filter(a=>Jh(a,e.tags??{}))),e.topic&&(i=i.filter(a=>Bh(a,e.topic))),i.sort((a,l)=>l.rememberedAt.localeCompare(a.rememberedAt)),i.slice(0,t)},similar(n,e,t=10){let r=e.toLowerCase().split(/[^a-z0-9]+/).filter(i=>i.length>3);return r.length===0?[]:Gt.recall(n,{limit:200}).map(i=>{let a=`${i.content} ${Object.values(i.tags).join(" ")}`.toLowerCase(),l=r.reduce((u,d)=>a.includes(d)?u+1:u,0);return{entry:i,hits:l}}).filter(i=>i.hits>0).sort((i,a)=>a.hits-i.hits).slice(0,t).map(i=>i.entry)}};c(Is,"formatMemoryMd")});function $s(n){let e=[];for(let{name:t,re:r}of zh)r.test(n)&&e.push(t);return e}var zh,Qn=v(()=>{"use strict";zh=[{name:"sk-\u2026 token",re:/\bsk-[A-Za-z0-9_-]{16,}/},{name:"GitHub PAT",re:/\bghp_[A-Za-z0-9]{30,}/},{name:"GitHub server PAT",re:/\bghs_[A-Za-z0-9]{30,}/},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"Slack token",re:/\bxox[abps]-[A-Za-z0-9-]{10,}/},{name:"bearer JWT-ish",re:/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/}];c($s,"scanForSecrets")});import Zh from"node:crypto";import Ns from"node:fs/promises";import ey from"node:os";import pt from"node:path";async function Md(n){let e=await ry(n),t=pt.basename(n),r=`obsidian://open?vault=${encodeURIComponent(t)}`,s=ty();if(!s)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:r,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await sy(s,n);return{bootstrapped:e,registered:o,vaultName:t,openUrl:r,obsidianConfigFound:!0,alreadyRegistered:i}}function ty(){let n=ey.homedir(),e,t=process.env.PRJCT_OBSIDIAN_CONFIG_DIR?.trim();if(t)e=t;else switch(process.platform){case"darwin":e=pt.join(n,"Library","Application Support","obsidian");break;case"win32":e=pt.join(process.env.APPDATA||pt.join(n,"AppData","Roaming"),"obsidian");break;default:e=pt.join(process.env.XDG_CONFIG_HOME||pt.join(n,".config"),"obsidian");break}try{if(!$e("node:fs").existsSync(e))return null}catch{return null}return pt.join(e,"obsidian.json")}async function ry(n){let e=pt.join(n,".obsidian"),t=pt.join(e,"app.json");try{return await Ns.stat(t),!1}catch{}return await Ns.mkdir(e,{recursive:!0}),await Ns.writeFile(t,`${JSON.stringify({},null,2)}
|
|
792
792
|
`,"utf-8"),!0}async function sy(n,e){let t={};try{let a=await Ns.readFile(n,"utf-8");t=JSON.parse(a)}catch{}let r=t.vaults??{},s=pt.resolve(e);for(let a of Object.values(r))if(pt.resolve(a.path)===s)return{registered:!1,alreadyRegistered:!0};let o=Zh.randomBytes(8).toString("hex");r[o]={path:s,ts:Date.now()};let i={...t,vaults:r};try{return await Ns.writeFile(n,JSON.stringify(i),"utf-8"),{registered:!0,alreadyRegistered:!1}}catch{return{registered:!1,alreadyRegistered:!1}}}var Ld=v(()=>{"use strict";c(Md,"ensureObsidianVault");c(ty,"resolveObsidianConfigPath");c(ry,"bootstrapObsidianDir");c(sy,"registerVaultInObsidianConfig")});import mt from"node:fs/promises";import Hr from"node:path";async function to(n){let e=await I.readConfig(n).catch(()=>null);if(e?.vaultPath&&e.vaultPath.trim().length>0)return{moved:!1,reason:"user-override"};let t=R.getLegacyWikiPath(n);if(!await Ud(t))return{moved:!1,reason:"no-legacy"};let s=R.getWikiPath(n);if(await Ud(s))return console.error(`\u26A0 prjct: legacy wiki at ${t} was NOT migrated \u2014 ${s} already has content.
|
|
793
793
|
Merge manually or set \`vaultPath\` in .prjct/prjct.config.json to choose one.`),{moved:!1,reason:"conflict",from:t,to:s};await mt.mkdir(Hr.dirname(s),{recursive:!0});let i=await oy(t,s);return await iy(n),console.error(`\u2139 prjct: migrated Obsidian vault
|
|
794
794
|
from: ${R.getDisplayPath(t)}
|