prjct-cli 2.23.6 → 2.23.8

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.
@@ -4,35 +4,35 @@ import { dirname as __pathDirname } from 'path';
4
4
  var require = __createRequire(import.meta.url);
5
5
  var __filename = __fileURLToPath(import.meta.url);
6
6
  var __dirname = __pathDirname(__filename);
7
- var fE=Object.create;var oo=Object.defineProperty;var hE=Object.getOwnPropertyDescriptor;var yE=Object.getOwnPropertyNames;var wE=Object.getPrototypeOf,kE=Object.prototype.hasOwnProperty;var c=(s,e)=>oo(s,"name",{value:e,configurable:!0}),qe=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});var h=(s,e)=>()=>(s&&(e=s(s=0)),e);var vE=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),D=(s,e)=>{for(var t in e)oo(s,t,{get:e[t],enumerable:!0})},Fm=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of yE(e))!kE.call(s,r)&&r!==t&&oo(s,r,{get:()=>e[r],enumerable:!(n=hE(e,r))||n.enumerable});return s};var bE=(s,e,t)=>(t=s!=null?fE(wE(s)):{},Fm(e||!s||!s.__esModule?oo(t,"default",{value:s,enumerable:!0}):t,s)),st=s=>Fm(oo({},"__esModule",{value:!0}),s);import Uc from"node:fs";import SE from"node:os";import Hm from"node:path";function Gc(){try{let s=Uc.readFileSync(Wc,"utf-8"),e=JSON.parse(s);if(e&&typeof e=="object"&&!Array.isArray(e))return e}catch{}return{}}function TE(s){Uc.mkdirSync(Um,{recursive:!0}),Uc.writeFileSync(Wc,`${JSON.stringify(s,null,2)}
8
- `,"utf-8")}function io(s){return Gc()[s]}function Wm(){return Gc()}function ao(s,e){let t=Gc();e===void 0?delete t[s]:t[s]=e,TE(t)}function Gm(s){ao(s,void 0)}function Bm(){return Wc}var Um,Wc,Bc=h(()=>{"use strict";Um=Hm.join(SE.homedir(),".prjct-cli","config"),Wc=Hm.join(Um,"global.json");c(Gc,"readRaw");c(TE,"writeRaw");c(io,"getConfig");c(Wm,"getAll");c(ao,"setConfig");c(Gm,"unsetConfig");c(Bm,"configPath")});var qc={};D(qc,{_internal:()=>IE,maybeAutoUpdate:()=>AE,runBackgroundCheck:()=>jE});import{execFile as EE,spawn as CE}from"node:child_process";import Js from"node:fs";import Vm from"node:os";import co from"node:path";import{promisify as RE}from"node:util";function AE(s){if(!s||process.env.PRJCT_NO_AUTO_UPDATE==="1"||io("auto-update")!=="on")return;let e=io("auto-update-last-check");if(e&&Date.now()-Date.parse(e)<Jm)return;ao("auto-update-last-check",new Date().toISOString()),CE(process.execPath,[process.argv[1],"__internal-auto-update",s],{detached:!0,stdio:"ignore"}).unref()}async function jE(s){try{let e=await Xm();if(!e)return;if(Km(e,s)<=0){pi(`current ${s} >= latest ${e}, no-op`);return}let t=zm();pi(`upgrade available: ${s} \u2192 ${e} (source: ${t})`),await $E(t,e),pi(`upgrade complete: ${s} \u2192 ${e}`)}catch(e){pi(`auto-update failed: ${e.message}`)}}async function Xm(){try{let s=new AbortController,e=setTimeout(()=>s.abort(),6e3),t=await fetch(xE,{signal:s.signal});if(clearTimeout(e),!t.ok)return null;let n=await t.json();return typeof n.version=="string"?n.version:null}catch{return null}}function zm(){let s=co.join(Vm.homedir(),".prjct-cli","bin","prjct");if(Js.existsSync(s))try{if(Js.statSync(s).size>1024*1024)return"binary"}catch{}try{let e=String(qe("node:child_process").execSync("npm root -g")).trim();if(e&&Js.existsSync(co.join(e,"prjct-cli")))return"npm"}catch{}try{let e=String(qe("node:child_process").execSync("bun pm bin -g")).trim();if(e&&Js.existsSync(co.join(e,"prjct")))return"bun"}catch{}return"unknown"}async function $E(s,e){if(s==="binary"){await Vc("bash",["-c","curl -sSL 'https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh' | bash"],{timeout:12e4,maxBuffer:4*1024*1024});return}if(s==="bun"){await Vc("bun",["install","-g","prjct-cli@latest"],{timeout:12e4});return}if(s==="npm"||s==="unknown"){await Vc("npm",["install","-g","prjct-cli@latest"],{timeout:12e4});return}}function Km(s,e){let t=s.split(".").map(r=>Number.parseInt(r,10)||0),n=e.split(".").map(r=>Number.parseInt(r,10)||0);for(let r=0;r<3;r++){if((t[r]??0)>(n[r]??0))return 1;if((t[r]??0)<(n[r]??0))return-1}return 0}function pi(s){try{Js.mkdirSync(qm,{recursive:!0}),Js.appendFileSync(PE,`${new Date().toISOString()} ${s}
9
- `)}catch{}}var Vc,qm,PE,Jm,xE,IE,Jc=h(()=>{"use strict";Bc();Vc=RE(EE),qm=co.join(Vm.homedir(),".prjct-cli","state"),PE=co.join(qm,"auto-update.log"),Jm=60*60*1e3,xE="https://registry.npmjs.org/prjct-cli/latest";c(AE,"maybeAutoUpdate");c(jE,"runBackgroundCheck");c(Xm,"fetchLatestVersion");c(zm,"detectInstallSource");c($E,"applyUpgrade");c(Km,"compareSemver");c(pi,"log");IE={fetchLatestVersion:Xm,detectInstallSource:zm,compareSemver:Km,THROTTLE_MS:Jm}});var lo,Fn,mi=h(()=>{"use strict";lo={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Fn=[{name:"init",group:"core",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"task",group:"core",routing:{group:"workflow",method:"now"},description:"Register a task (or show the active one)",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or falls back to current work"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"/p:regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",routing:{group:"primitives",method:"status"},description:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"/p:status <value>",terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"core",routing:{group:"primitives",method:"tag"},description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"/p:tag type:bug",terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",routing:{group:"primitives",method:"remember"},description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'/p:remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'/p:capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",routing:{group:"seed",method:"seed"},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"/p:seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",routing:{group:"mcp",method:"mcp"},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"/p:mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",routing:{group:"install",method:"install"},description:"Install Claude Code hooks (~/.claude/settings.json merge-safe)",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Writes 7 passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Remove with `prjct claude uninstall`"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist an analysis JSON blob produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <jsonPath>"},params:"<jsonPathOrInline>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",routing:{group:"setup",method:"start"},description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",routing:{group:"context",method:"context"},description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",routing:{group:"uninstall",method:"uninstall"},description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]},{name:"team",group:"core",routing:{group:"team",method:"team"},description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"/p:team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"config",group:"core",routing:{group:"config",method:"config"},description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"/p:config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'/p:spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to ~/Documents/prjct/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"/p:audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]}]});var Ym={};D(Ym,{REGISTERED_VERBS_SET:()=>_E});var _E,Qm=h(()=>{"use strict";mi();_E=new Set(Fn.filter(s=>s.routing).map(s=>s.name))});function DE(s){return s instanceof Error&&"code"in s}function L(s){return DE(s)&&s.code==="ENOENT"}function b(s){return s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}function Xc(s){if(s instanceof Error)return s.stack}var F=h(()=>{"use strict";c(DE,"isNodeError");c(L,"isNotFoundError");c(b,"getErrorMessage");c(Xc,"getErrorStack")});var Zm,eg,tg,zc=h(()=>{"use strict";Zm=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct",".worktrees"]),eg=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],tg=/(?:import|from)\s+['"]([^'"]+)['"]/g});import rg from"node:fs/promises";async function og(s,e){let t;try{t=await rg.readFile(s,"utf-8")}catch(o){if(L(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await ng(s,t),sg(s,"Malformed JSON"),null}let r=e.safeParse(n);return r.success?n:(await ng(s,t),sg(s,ME(r.error)),null)}async function ng(s,e){let t=`${s}.backup`;try{await rg.writeFile(t,e,{encoding:"utf-8",flag:"wx"})}catch{}}function sg(s,e){console.error(`[prjct] Warning: Corrupted storage file: ${s}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function ME(s){return s.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var ig=h(()=>{"use strict";F();c(og,"safeRead");c(ng,"createBackup");c(sg,"logCorruption");c(ME,"formatZodError")});var rn={};D(rn,{batchProcess:()=>us,dirExists:()=>vn,ensureDir:()=>sn,fileExists:()=>C,listFiles:()=>bn,readFile:()=>Tt,readJson:()=>xe,walkDir:()=>wn,writeFile:()=>kn,writeFileAtomic:()=>ds,writeJson:()=>ke});import ht from"node:fs/promises";import uo from"node:path";async function wn(s,e={}){let t=[],n=e.maxFiles??1/0,r=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=n)return;let a=await ht.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of a){if(t.length>=n)break;let u=String(l.name);if(Zm.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!r||!r.has(u)))continue;let d=uo.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(uo.relative(s,d))}}return c(o,"walk"),await o(s),t}async function us(s,e,t){let n=[];for(let r=0;r<s.length;r+=e){let o=await Promise.all(s.slice(r,r+e).map(t));for(let i of o)i!==null&&n.push(i)}return n}async function xe(s,e=null,t){if(t)return await og(s,t)??e;try{let n=await ht.readFile(s,"utf-8");return JSON.parse(n)}catch(n){if(L(n))return e;throw n}}async function ke(s,e,t=2){let n=uo.dirname(s);await ht.mkdir(n,{recursive:!0});let r=`${JSON.stringify(e,null,t)}
10
- `;await ht.writeFile(s,r,"utf-8")}async function Tt(s,e=""){try{return await ht.readFile(s,"utf-8")}catch(t){if(L(t))return e;throw t}}async function kn(s,e){let t=uo.dirname(s);await ht.mkdir(t,{recursive:!0}),await ht.writeFile(s,e,"utf-8")}async function ds(s,e){let t=uo.dirname(s);await ht.mkdir(t,{recursive:!0});let n=`${s}.tmp`;await ht.writeFile(n,e,"utf-8"),await ht.rename(n,s)}async function C(s){try{return await ht.access(s),!0}catch(e){if(L(e))return!1;throw e}}async function vn(s){try{return(await ht.stat(s)).isDirectory()}catch(e){if(L(e))return!1;throw e}}async function sn(s){await ht.mkdir(s,{recursive:!0})}async function bn(s,e={}){try{let n=await ht.readdir(s,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(r=>r.isFile())),e.dirsOnly&&(n=n.filter(r=>r.isDirectory())),e.extension&&(n=n.filter(r=>r.name.endsWith(e.extension))),n.map(r=>r.name)}catch(t){if(L(t))return[];throw t}}var V=h(()=>{"use strict";zc();ig();F();c(wn,"walkDir");c(us,"batchProcess");c(xe,"readJson");c(ke,"writeJson");c(Tt,"readFile");c(kn,"writeFile");c(ds,"writeFileAtomic");c(C,"fileExists");c(vn,"dirExists");c(sn,"ensureDir");c(bn,"listFiles")});var ms={};D(ms,{PACKAGE_ROOT:()=>Et,VERSION:()=>le,getPackageRoot:()=>Yc,getVersion:()=>fi,resetPackageRoot:()=>Qc});import Kc from"node:fs";import gi from"node:path";function Yc(){if(Xs)return Xs;let s=__dirname;for(let e=0;e<5;e++){let t=gi.join(s,"package.json");if(Kc.existsSync(t))try{if(JSON.parse(Kc.readFileSync(t,"utf-8")).name==="prjct-cli")return Xs=s,s}catch{}s=gi.dirname(s)}return Xs=gi.join(__dirname,"..","..",".."),Xs}function fi(){if(ps)return ps;let s=process.env.PRJCT_VERSION;if(s&&/^\d+\.\d+\.\d+/.test(s))return ps=s,ps;try{let e=gi.join(Yc(),"package.json");return ps=JSON.parse(Kc.readFileSync(e,"utf-8")).version,ps}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",b(e)),"0.0.0"}}function Qc(s){Xs=s,ps=null}var ps,Xs,le,Et,We=h(()=>{"use strict";F();ps=null,Xs=null;c(Yc,"getPackageRoot");c(fi,"getVersion");c(Qc,"resetPackageRoot");le=fi(),Et=Yc()});import{formatDistanceToNowStrict as bM}from"date-fns";function ag(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0"),n=s.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function cg(s){return{year:s.getFullYear().toString(),month:(s.getMonth()+1).toString().padStart(2,"0"),day:s.getDate().toString().padStart(2,"0")}}function R(){return new Date().toISOString()}function zs(s){let e=new Date;return e.setDate(e.getDate()-s),e}function po(s){let e=Math.floor(s/1e3),t=Math.floor(e/60),n=Math.floor(t/60),r=Math.floor(n/24);return r>0?`${r}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}var ue=h(()=>{"use strict";c(ag,"formatDate");c(cg,"getYearMonthDay");c(R,"getTimestamp");c(zs,"getDaysAgo");c(po,"formatDuration")});import Ks from"node:fs/promises";import lt from"node:path";import{globSync as OE}from"glob";async function Zc(s){let e={isMonorepo:!1,type:null,rootPath:s,packages:[]},t=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of t)if(await C(lt.join(s,n.file))){e.isMonorepo=!0,e.type=n.type;break}if(!e.isMonorepo){let n=lt.join(s,"package.json");if(await C(n))try{JSON.parse(await Ks.readFile(n,"utf-8")).workspaces&&(e.isMonorepo=!0,e.type="npm")}catch{}}return e.isMonorepo&&(e.packages=await el(s,e.type)),e}async function el(s,e){let t=[],n=[];try{if(e==="pnpm"){let o=(await Ks.readFile(lt.join(s,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);o&&(n=o[1].split(`
11
- `).map(i=>i.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(e==="npm"||e==="lerna"){let r=lt.join(s,"package.json"),o=JSON.parse(await Ks.readFile(r,"utf-8"));if(Array.isArray(o.workspaces)?n=o.workspaces:o.workspaces?.packages&&(n=o.workspaces.packages),e==="lerna"){let i=lt.join(s,"lerna.json");if(await C(i)){let a=JSON.parse(await Ks.readFile(i,"utf-8"));a.packages&&(n=a.packages)}}}else if(e==="nx")n=["apps/*","libs/*","packages/*"];else if(e==="turborepo"){let r=lt.join(s,"package.json"),o=JSON.parse(await Ks.readFile(r,"utf-8"));Array.isArray(o.workspaces)&&(n=o.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let r of n){if(r.startsWith("!"))continue;let o=OE(r,{cwd:s,absolute:!1});for(let i of o){let a=lt.join(s,i),l=lt.join(a,"package.json");if(await C(l))try{let u=JSON.parse(await Ks.readFile(l,"utf-8")),d=lt.join(a,"PRJCT.md");t.push({name:u.name||lt.basename(i),path:a,relativePath:i,hasPrjctMd:await C(d)})}catch{}}}}catch{}return t}async function lg(s,e){if(!e.isMonorepo)return null;let t=lt.resolve(s);for(let n of e.packages){let r=lt.resolve(n.path);if(t.startsWith(r))return n}return null}async function ug(s){let e=lt.resolve(s),t=lt.parse(e).root;for(;e!==t;){if((await Zc(e)).isMonorepo)return e;e=lt.dirname(e)}return null}var dg=h(()=>{"use strict";V();c(Zc,"detectMonorepo");c(el,"discoverMonorepoPackages");c(lg,"findContainingPackage");c(ug,"findMonorepoRoot")});var tl={};D(tl,{execAsync:()=>U,execFileAsync:()=>Le});import{exec as NE,execFile as LE}from"node:child_process";import{promisify as pg}from"node:util";var U,Le,Fe=h(()=>{"use strict";U=pg(NE),Le=pg(LE)});var hi={};D(hi,{default:()=>FE,worktreeService:()=>gg});import nl from"node:fs/promises";import on from"node:path";var mg,sl,gg,FE,yi=h(()=>{"use strict";Fe();V();mg=".worktrees",sl=class{static{c(this,"WorktreeService")}async create(e,t,n={}){let r=await this.getMainWorktree(e),o=on.join(r,mg,t),i=n.branch||`feat/${t}`;await nl.mkdir(on.join(r,mg),{recursive:!0});let a=n.baseBranch?` ${n.baseBranch}`:"";await U(`git worktree add "${o}" -b "${i}"${a}`,{cwd:r});let{stdout:l}=await U("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let n=await this.getMainWorktree(e),r;if(t)try{let{stdout:o}=await U("git rev-parse --abbrev-ref HEAD",{cwd:e});r=o.trim()}catch{}if(await U(`git worktree remove "${e}" --force`,{cwd:n}),t&&r&&r!=="main"&&r!=="master")try{await U(`git branch -D "${r}"`,{cwd:n})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:n}=await U("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(n,t)}async detect(e){try{let{stdout:t}=await U("git rev-parse --git-common-dir",{cwd:e}),{stdout:n}=await U("git rev-parse --git-dir",{cwd:e}),r=on.resolve(e,t.trim()),o=on.resolve(e,n.trim());if(r!==o){let{stdout:i}=await U("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await U("git rev-parse HEAD",{cwd:e}),{stdout:l}=await U("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=on.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:n}=await U("git worktree list --porcelain",{cwd:e}),r=n.split(`
12
- `)[0];if(r?.startsWith("worktree "))return r.replace("worktree ","").trim()}catch{}let{stdout:t}=await U("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let n=on.join(t,".env");await C(n)&&await nl.copyFile(n,on.join(e,".env"));let r=on.join(t,".prjct"),o=on.join(e,".prjct");await C(r)&&!await C(o)&&await nl.symlink(r,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),n=[],r=await this.getMainWorktree(e);await U("git worktree prune",{cwd:r});for(let o of t)o.isMain||await C(o.path)||n.push(o.slug);return n}parsePorcelainOutput(e,t){let n=[],r=e.trim().split(`
7
+ var fE=Object.create;var oo=Object.defineProperty;var hE=Object.getOwnPropertyDescriptor;var yE=Object.getOwnPropertyNames;var wE=Object.getPrototypeOf,kE=Object.prototype.hasOwnProperty;var c=(s,e)=>oo(s,"name",{value:e,configurable:!0}),qe=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});var h=(s,e)=>()=>(s&&(e=s(s=0)),e);var vE=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),D=(s,e)=>{for(var t in e)oo(s,t,{get:e[t],enumerable:!0})},Fm=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of yE(e))!kE.call(s,r)&&r!==t&&oo(s,r,{get:()=>e[r],enumerable:!(n=hE(e,r))||n.enumerable});return s};var bE=(s,e,t)=>(t=s!=null?fE(wE(s)):{},Fm(e||!s||!s.__esModule?oo(t,"default",{value:s,enumerable:!0}):t,s)),st=s=>Fm(oo({},"__esModule",{value:!0}),s);import Wc from"node:fs";import SE from"node:os";import Hm from"node:path";function Bc(){try{let s=Wc.readFileSync(Gc,"utf-8"),e=JSON.parse(s);if(e&&typeof e=="object"&&!Array.isArray(e))return e}catch{}return{}}function TE(s){Wc.mkdirSync(Um,{recursive:!0}),Wc.writeFileSync(Gc,`${JSON.stringify(s,null,2)}
8
+ `,"utf-8")}function io(s){return Bc()[s]}function Wm(){return Bc()}function ao(s,e){let t=Bc();e===void 0?delete t[s]:t[s]=e,TE(t)}function Gm(s){ao(s,void 0)}function Bm(){return Gc}var Um,Gc,Vc=h(()=>{"use strict";Um=Hm.join(SE.homedir(),".prjct-cli","config"),Gc=Hm.join(Um,"global.json");c(Bc,"readRaw");c(TE,"writeRaw");c(io,"getConfig");c(Wm,"getAll");c(ao,"setConfig");c(Gm,"unsetConfig");c(Bm,"configPath")});var Jc={};D(Jc,{_internal:()=>IE,maybeAutoUpdate:()=>AE,runBackgroundCheck:()=>jE});import{execFile as EE,spawn as CE}from"node:child_process";import Js from"node:fs";import Vm from"node:os";import co from"node:path";import{promisify as RE}from"node:util";function AE(s){if(!s||process.env.PRJCT_NO_AUTO_UPDATE==="1"||io("auto-update")!=="on")return;let e=io("auto-update-last-check");if(e&&Date.now()-Date.parse(e)<Jm)return;ao("auto-update-last-check",new Date().toISOString()),CE(process.execPath,[process.argv[1],"__internal-auto-update",s],{detached:!0,stdio:"ignore"}).unref()}async function jE(s){try{let e=await Xm();if(!e)return;if(Km(e,s)<=0){mi(`current ${s} >= latest ${e}, no-op`);return}let t=zm();mi(`upgrade available: ${s} \u2192 ${e} (source: ${t})`),await $E(t,e),mi(`upgrade complete: ${s} \u2192 ${e}`)}catch(e){mi(`auto-update failed: ${e.message}`)}}async function Xm(){try{let s=new AbortController,e=setTimeout(()=>s.abort(),6e3),t=await fetch(xE,{signal:s.signal});if(clearTimeout(e),!t.ok)return null;let n=await t.json();return typeof n.version=="string"?n.version:null}catch{return null}}function zm(){let s=co.join(Vm.homedir(),".prjct-cli","bin","prjct");if(Js.existsSync(s))try{if(Js.statSync(s).size>1024*1024)return"binary"}catch{}try{let e=String(qe("node:child_process").execSync("npm root -g")).trim();if(e&&Js.existsSync(co.join(e,"prjct-cli")))return"npm"}catch{}try{let e=String(qe("node:child_process").execSync("bun pm bin -g")).trim();if(e&&Js.existsSync(co.join(e,"prjct")))return"bun"}catch{}return"unknown"}async function $E(s,e){if(s==="binary"){await qc("bash",["-c","curl -sSL 'https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh' | bash"],{timeout:12e4,maxBuffer:4*1024*1024});return}if(s==="bun"){await qc("bun",["install","-g","prjct-cli@latest"],{timeout:12e4});return}if(s==="npm"||s==="unknown"){await qc("npm",["install","-g","prjct-cli@latest"],{timeout:12e4});return}}function Km(s,e){let t=s.split(".").map(r=>Number.parseInt(r,10)||0),n=e.split(".").map(r=>Number.parseInt(r,10)||0);for(let r=0;r<3;r++){if((t[r]??0)>(n[r]??0))return 1;if((t[r]??0)<(n[r]??0))return-1}return 0}function mi(s){try{Js.mkdirSync(qm,{recursive:!0}),Js.appendFileSync(PE,`${new Date().toISOString()} ${s}
9
+ `)}catch{}}var qc,qm,PE,Jm,xE,IE,Xc=h(()=>{"use strict";Vc();qc=RE(EE),qm=co.join(Vm.homedir(),".prjct-cli","state"),PE=co.join(qm,"auto-update.log"),Jm=60*60*1e3,xE="https://registry.npmjs.org/prjct-cli/latest";c(AE,"maybeAutoUpdate");c(jE,"runBackgroundCheck");c(Xm,"fetchLatestVersion");c(zm,"detectInstallSource");c($E,"applyUpgrade");c(Km,"compareSemver");c(mi,"log");IE={fetchLatestVersion:Xm,detectInstallSource:zm,compareSemver:Km,THROTTLE_MS:Jm}});var lo,Fn,gi=h(()=>{"use strict";lo={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Fn=[{name:"init",group:"core",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"task",group:"core",routing:{group:"workflow",method:"now"},description:"Register a task (or show the active one)",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or falls back to current work"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"/p:regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",routing:{group:"primitives",method:"status"},description:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"/p:status <value>",terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"core",routing:{group:"primitives",method:"tag"},description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"/p:tag type:bug",terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",routing:{group:"primitives",method:"remember"},description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'/p:remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'/p:capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",routing:{group:"seed",method:"seed"},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"/p:seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",routing:{group:"mcp",method:"mcp"},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"/p:mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",routing:{group:"install",method:"install"},description:"Install Claude Code hooks (~/.claude/settings.json merge-safe)",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Writes 7 passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Remove with `prjct claude uninstall`"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist an analysis JSON blob produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <jsonPath>"},params:"<jsonPathOrInline>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",routing:{group:"setup",method:"start"},description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",routing:{group:"context",method:"context"},description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",routing:{group:"uninstall",method:"uninstall"},description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]},{name:"team",group:"core",routing:{group:"team",method:"team"},description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"/p:team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"config",group:"core",routing:{group:"config",method:"config"},description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"/p:config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'/p:spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to ~/Documents/prjct/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"/p:audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]}]});var Ym={};D(Ym,{REGISTERED_VERBS_SET:()=>_E});var _E,Qm=h(()=>{"use strict";gi();_E=new Set(Fn.filter(s=>s.routing).map(s=>s.name))});function DE(s){return s instanceof Error&&"code"in s}function L(s){return DE(s)&&s.code==="ENOENT"}function b(s){return s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}function zc(s){if(s instanceof Error)return s.stack}var F=h(()=>{"use strict";c(DE,"isNodeError");c(L,"isNotFoundError");c(b,"getErrorMessage");c(zc,"getErrorStack")});var Zm,eg,tg,Kc=h(()=>{"use strict";Zm=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct",".worktrees"]),eg=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],tg=/(?:import|from)\s+['"]([^'"]+)['"]/g});import rg from"node:fs/promises";async function og(s,e){let t;try{t=await rg.readFile(s,"utf-8")}catch(o){if(L(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await ng(s,t),sg(s,"Malformed JSON"),null}let r=e.safeParse(n);return r.success?n:(await ng(s,t),sg(s,ME(r.error)),null)}async function ng(s,e){let t=`${s}.backup`;try{await rg.writeFile(t,e,{encoding:"utf-8",flag:"wx"})}catch{}}function sg(s,e){console.error(`[prjct] Warning: Corrupted storage file: ${s}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function ME(s){return s.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var ig=h(()=>{"use strict";F();c(og,"safeRead");c(ng,"createBackup");c(sg,"logCorruption");c(ME,"formatZodError")});var rn={};D(rn,{batchProcess:()=>us,dirExists:()=>vn,ensureDir:()=>sn,fileExists:()=>C,listFiles:()=>bn,readFile:()=>Tt,readJson:()=>xe,walkDir:()=>wn,writeFile:()=>kn,writeFileAtomic:()=>ds,writeJson:()=>ke});import ht from"node:fs/promises";import uo from"node:path";async function wn(s,e={}){let t=[],n=e.maxFiles??1/0,r=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=n)return;let a=await ht.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of a){if(t.length>=n)break;let u=String(l.name);if(Zm.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!r||!r.has(u)))continue;let d=uo.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(uo.relative(s,d))}}return c(o,"walk"),await o(s),t}async function us(s,e,t){let n=[];for(let r=0;r<s.length;r+=e){let o=await Promise.all(s.slice(r,r+e).map(t));for(let i of o)i!==null&&n.push(i)}return n}async function xe(s,e=null,t){if(t)return await og(s,t)??e;try{let n=await ht.readFile(s,"utf-8");return JSON.parse(n)}catch(n){if(L(n))return e;throw n}}async function ke(s,e,t=2){let n=uo.dirname(s);await ht.mkdir(n,{recursive:!0});let r=`${JSON.stringify(e,null,t)}
10
+ `;await ht.writeFile(s,r,"utf-8")}async function Tt(s,e=""){try{return await ht.readFile(s,"utf-8")}catch(t){if(L(t))return e;throw t}}async function kn(s,e){let t=uo.dirname(s);await ht.mkdir(t,{recursive:!0}),await ht.writeFile(s,e,"utf-8")}async function ds(s,e){let t=uo.dirname(s);await ht.mkdir(t,{recursive:!0});let n=`${s}.tmp`;await ht.writeFile(n,e,"utf-8"),await ht.rename(n,s)}async function C(s){try{return await ht.access(s),!0}catch(e){if(L(e))return!1;throw e}}async function vn(s){try{return(await ht.stat(s)).isDirectory()}catch(e){if(L(e))return!1;throw e}}async function sn(s){await ht.mkdir(s,{recursive:!0})}async function bn(s,e={}){try{let n=await ht.readdir(s,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(r=>r.isFile())),e.dirsOnly&&(n=n.filter(r=>r.isDirectory())),e.extension&&(n=n.filter(r=>r.name.endsWith(e.extension))),n.map(r=>r.name)}catch(t){if(L(t))return[];throw t}}var V=h(()=>{"use strict";Kc();ig();F();c(wn,"walkDir");c(us,"batchProcess");c(xe,"readJson");c(ke,"writeJson");c(Tt,"readFile");c(kn,"writeFile");c(ds,"writeFileAtomic");c(C,"fileExists");c(vn,"dirExists");c(sn,"ensureDir");c(bn,"listFiles")});var ms={};D(ms,{PACKAGE_ROOT:()=>Et,VERSION:()=>le,getPackageRoot:()=>Qc,getVersion:()=>hi,resetPackageRoot:()=>Zc});import Yc from"node:fs";import fi from"node:path";function Qc(){if(Xs)return Xs;let s=__dirname;for(let e=0;e<5;e++){let t=fi.join(s,"package.json");if(Yc.existsSync(t))try{if(JSON.parse(Yc.readFileSync(t,"utf-8")).name==="prjct-cli")return Xs=s,s}catch{}s=fi.dirname(s)}return Xs=fi.join(__dirname,"..","..",".."),Xs}function hi(){if(ps)return ps;let s=process.env.PRJCT_VERSION;if(s&&/^\d+\.\d+\.\d+/.test(s))return ps=s,ps;try{let e=fi.join(Qc(),"package.json");return ps=JSON.parse(Yc.readFileSync(e,"utf-8")).version,ps}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",b(e)),"0.0.0"}}function Zc(s){Xs=s,ps=null}var ps,Xs,le,Et,We=h(()=>{"use strict";F();ps=null,Xs=null;c(Qc,"getPackageRoot");c(hi,"getVersion");c(Zc,"resetPackageRoot");le=hi(),Et=Qc()});import{formatDistanceToNowStrict as TM}from"date-fns";function ag(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0"),n=s.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function cg(s){return{year:s.getFullYear().toString(),month:(s.getMonth()+1).toString().padStart(2,"0"),day:s.getDate().toString().padStart(2,"0")}}function R(){return new Date().toISOString()}function zs(s){let e=new Date;return e.setDate(e.getDate()-s),e}function po(s){let e=Math.floor(s/1e3),t=Math.floor(e/60),n=Math.floor(t/60),r=Math.floor(n/24);return r>0?`${r}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}var ue=h(()=>{"use strict";c(ag,"formatDate");c(cg,"getYearMonthDay");c(R,"getTimestamp");c(zs,"getDaysAgo");c(po,"formatDuration")});import Ks from"node:fs/promises";import lt from"node:path";import{globSync as OE}from"glob";async function el(s){let e={isMonorepo:!1,type:null,rootPath:s,packages:[]},t=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of t)if(await C(lt.join(s,n.file))){e.isMonorepo=!0,e.type=n.type;break}if(!e.isMonorepo){let n=lt.join(s,"package.json");if(await C(n))try{JSON.parse(await Ks.readFile(n,"utf-8")).workspaces&&(e.isMonorepo=!0,e.type="npm")}catch{}}return e.isMonorepo&&(e.packages=await tl(s,e.type)),e}async function tl(s,e){let t=[],n=[];try{if(e==="pnpm"){let o=(await Ks.readFile(lt.join(s,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);o&&(n=o[1].split(`
11
+ `).map(i=>i.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(e==="npm"||e==="lerna"){let r=lt.join(s,"package.json"),o=JSON.parse(await Ks.readFile(r,"utf-8"));if(Array.isArray(o.workspaces)?n=o.workspaces:o.workspaces?.packages&&(n=o.workspaces.packages),e==="lerna"){let i=lt.join(s,"lerna.json");if(await C(i)){let a=JSON.parse(await Ks.readFile(i,"utf-8"));a.packages&&(n=a.packages)}}}else if(e==="nx")n=["apps/*","libs/*","packages/*"];else if(e==="turborepo"){let r=lt.join(s,"package.json"),o=JSON.parse(await Ks.readFile(r,"utf-8"));Array.isArray(o.workspaces)&&(n=o.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let r of n){if(r.startsWith("!"))continue;let o=OE(r,{cwd:s,absolute:!1});for(let i of o){let a=lt.join(s,i),l=lt.join(a,"package.json");if(await C(l))try{let u=JSON.parse(await Ks.readFile(l,"utf-8")),d=lt.join(a,"PRJCT.md");t.push({name:u.name||lt.basename(i),path:a,relativePath:i,hasPrjctMd:await C(d)})}catch{}}}}catch{}return t}async function lg(s,e){if(!e.isMonorepo)return null;let t=lt.resolve(s);for(let n of e.packages){let r=lt.resolve(n.path);if(t.startsWith(r))return n}return null}async function ug(s){let e=lt.resolve(s),t=lt.parse(e).root;for(;e!==t;){if((await el(e)).isMonorepo)return e;e=lt.dirname(e)}return null}var dg=h(()=>{"use strict";V();c(el,"detectMonorepo");c(tl,"discoverMonorepoPackages");c(lg,"findContainingPackage");c(ug,"findMonorepoRoot")});var nl={};D(nl,{execAsync:()=>U,execFileAsync:()=>Le});import{exec as NE,execFile as LE}from"node:child_process";import{promisify as pg}from"node:util";var U,Le,Fe=h(()=>{"use strict";U=pg(NE),Le=pg(LE)});var yi={};D(yi,{default:()=>FE,worktreeService:()=>gg});import sl from"node:fs/promises";import on from"node:path";var mg,rl,gg,FE,wi=h(()=>{"use strict";Fe();V();mg=".worktrees",rl=class{static{c(this,"WorktreeService")}async create(e,t,n={}){let r=await this.getMainWorktree(e),o=on.join(r,mg,t),i=n.branch||`feat/${t}`;await sl.mkdir(on.join(r,mg),{recursive:!0});let a=n.baseBranch?` ${n.baseBranch}`:"";await U(`git worktree add "${o}" -b "${i}"${a}`,{cwd:r});let{stdout:l}=await U("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let n=await this.getMainWorktree(e),r;if(t)try{let{stdout:o}=await U("git rev-parse --abbrev-ref HEAD",{cwd:e});r=o.trim()}catch{}if(await U(`git worktree remove "${e}" --force`,{cwd:n}),t&&r&&r!=="main"&&r!=="master")try{await U(`git branch -D "${r}"`,{cwd:n})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:n}=await U("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(n,t)}async detect(e){try{let{stdout:t}=await U("git rev-parse --git-common-dir",{cwd:e}),{stdout:n}=await U("git rev-parse --git-dir",{cwd:e}),r=on.resolve(e,t.trim()),o=on.resolve(e,n.trim());if(r!==o){let{stdout:i}=await U("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await U("git rev-parse HEAD",{cwd:e}),{stdout:l}=await U("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=on.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:n}=await U("git worktree list --porcelain",{cwd:e}),r=n.split(`
12
+ `)[0];if(r?.startsWith("worktree "))return r.replace("worktree ","").trim()}catch{}let{stdout:t}=await U("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let n=on.join(t,".env");await C(n)&&await sl.copyFile(n,on.join(e,".env"));let r=on.join(t,".prjct"),o=on.join(e,".prjct");await C(r)&&!await C(o)&&await sl.symlink(r,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),n=[],r=await this.getMainWorktree(e);await U("git worktree prune",{cwd:r});for(let o of t)o.isMain||await C(o.path)||n.push(o.slug);return n}parsePorcelainOutput(e,t){let n=[],r=e.trim().split(`
13
13
 
14
14
  `);for(let o of r){if(!o.trim())continue;let i=o.trim().split(`
15
- `),a="",l="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?l=p.replace("HEAD ","").trim():p.startsWith("branch ")?u=p.replace("branch refs/heads/","").trim():p==="bare"?d=!0:p==="detached"&&(u="(detached)");if(a){let p=a===t||d;n.push({path:a,branch:u,commit:l,isMain:p,slug:p?"main":on.basename(a)})}}return n}},gg=new sl,FE=gg});import rl from"node:os";import an from"node:path";async function fg(s,e){if(e&&e.trim().length>0)return UE(s,e);let t=await HE(s),r=an.basename(an.resolve(t)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project";return an.join(rl.homedir(),"Documents","prjct",r)}function hg(s,e){let n=an.basename(an.resolve(s)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project",r=e.replace(/-/g,"").slice(0,8);return an.join(rl.homedir(),"Documents","prjct",`${n}-${r}`)}function yg(s){return an.join(s,".prjct","wiki")}async function HE(s){try{let{worktreeService:e}=await Promise.resolve().then(()=>(yi(),hi));return await e.detect(s)&&await e.getMainWorktree(s)||s}catch{return s}}function UE(s,e){let t=e.trim();return(t.startsWith("~/")||t==="~")&&(t=an.join(rl.homedir(),t.slice(1))),an.isAbsolute(t)||(t=an.resolve(s,t)),t}var wg=h(()=>{"use strict";c(fg,"getWikiPath");c(hg,"getWikiPathWithProjectHash");c(yg,"getLegacyWikiPath");c(HE,"resolveProjectRootPath");c(UE,"resolveVaultOverride")});var wi=h(()=>{"use strict"});import{z as mo}from"zod";function VE(s){return BE[s]??Hn}function kg(s){let e=VE(s);return e.model==="opus"&&e.effort==="max"?'Dispatch with the Agent tool using `model: "opus"` and full reasoning effort \u2014 this is the IMPLEMENTER; it writes code and needs the best model.':`Dispatch with the Agent tool using \`model: "${e.model}"\` (NOT the parent's max model). Apply ${e.effort}, not exhaustive, effort \u2014 this is an orchestration/review role: return the verdict, don't over-deliberate. A smaller model at decent effort is correct here and far faster.`}function vg(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=n[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var WE,GE,Hn,BE,go,fo=h(()=>{"use strict";WE={model:"opus",effort:"max"},GE={model:"haiku",effort:"decent"},Hn={model:"sonnet",effort:"decent"},BE={implementer:WE,orchestrator:GE,"strategic-review":Hn,"architecture-review":Hn,"design-review":Hn,review:Hn,security:Hn,investigate:Hn,reviewer:Hn};c(VE,"getAgentModelPolicy");c(kg,"renderModelDirective");go=mo.object({provider:mo.string(),model:mo.string(),cliVersion:mo.string().optional(),recordedAt:mo.string()});c(vg,"compareSemver")});function Ys(s,e){let t=typeof s=="string"?new Date(s).getTime():s;return Date.now()-t>e}var ki,ho=h(()=>{"use strict";c(Ys,"isExpired");ki=class{static{c(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,r)=>n[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Sg={};D(Sg,{invalidateProviderCache:()=>XE,readProviderCache:()=>il,writeProviderCache:()=>al});import bg from"node:fs/promises";import qE from"node:path";async function il(){try{let s=await bg.readFile(ol(),"utf-8"),e=JSON.parse(s);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ys(e.timestamp,JE)?null:e.detection}catch{return null}}async function al(s){let e={timestamp:new Date().toISOString(),detection:s};await ke(ol(),e)}async function XE(){try{await bg.unlink(ol())}catch{}}var ol,JE,cl=h(()=>{"use strict";ge();ho();V();ol=c(()=>qE.join(_.getCachePath(),"providers.json"),"cacheFile"),JE=10*60*1e3;c(il,"readProviderCache");c(al,"writeProviderCache");c(XE,"invalidateProviderCache")});var Ut={};D(Ut,{ClaudeProvider:()=>vi,CursorProvider:()=>Cg,GeminiProvider:()=>ll,Providers:()=>ut,detectAllProviders:()=>Tn,detectAntigravity:()=>yo,detectCodex:()=>gs,detectProvider:()=>bi,getActiveProvider:()=>YE,getProviderBranding:()=>Si,selectProvider:()=>ul,validateCliVersion:()=>xg});import Un from"node:os";import cn from"node:path";async function Pg(s){try{let{stdout:e}=await U(`which ${s}`,{timeout:2e3});return e.trim()}catch{return null}}async function KE(s){try{let{stdout:e}=await U(`${s} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function bi(s){let e=ut[s];if(!e.cliCommand)return{installed:!1};let t=await Pg(e.cliCommand);if(!t)return{installed:!1};let n=await KE(e.cliCommand),r=xg(s,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:r||void 0}}function xg(s,e){let t=ut[s];return!t.minCliVersion||!e?null:vg(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function Tn(s=!1){if(!s){let i=await il();if(i)return i}let[e,t,n]=await Promise.all([bi("claude"),bi("gemini"),gs()]),r={installed:n.installed},o={claude:e,gemini:t,codex:r};return await al(o).catch(()=>{}),o}async function YE(s){if(s&&ut[s])return ut[s];let e=await Tn();return e.claude.installed&&!e.gemini.installed?vi:e.gemini.installed&&!e.claude.installed?ll:vi}function Si(s){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[s]||"\u26A1 prjct"}}async function yo(){let s=Eg.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=cn.join(s,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([C(s),C(e)]);return{installed:t,skillInstalled:n,configPath:t?s:void 0}}async function gs(){let s=Rg.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=await Pg("codex"),t=cn.join(s,"skills","prjct","SKILL.md"),n=await C(t),r=!!e;return{installed:r,skillInstalled:n,configPath:r?s:void 0}}async function ul(){let s=await Tn(),e=s.claude.installed,t=s.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:s}:e&&!t?{provider:"claude",userSelected:!1,detection:s}:t&&!e?{provider:"gemini",userSelected:!1,detection:s}:{provider:"claude",userSelected:!0,detection:s}}var vi,ll,Eg,Cg,zE,Rg,ut,rt=h(()=>{"use strict";wi();fo();Fe();V();cl();vi={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:cn.join(Un.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:cn.join(Un.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},ll={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:cn.join(Un.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:cn.join(Un.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},Eg={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:cn.join(Un.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:cn.join(Un.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Cg={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},zE={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Rg={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:cn.join(Un.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:cn.join(Un.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},ut={claude:vi,gemini:ll,cursor:Cg,antigravity:Eg,windsurf:zE,codex:Rg};c(Pg,"whichCommand");c(KE,"getCliVersion");c(bi,"detectProvider");c(xg,"validateCliVersion");c(Tn,"detectAllProviders");c(YE,"getActiveProvider");c(Si,"getProviderBranding");c(yo,"detectAntigravity");c(gs,"detectCodex");c(ul,"selectProvider")});var ml={};D(ml,{default:()=>_});import QE from"node:crypto";import Ti from"node:fs/promises";import dl from"node:os";import me from"node:path";var pl,ZE,_,ge=h(()=>{"use strict";ue();V();dg();wg();pl=class{static{c(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?me.resolve(e):me.join(dl.homedir(),".prjct-cli"),this.globalProjectsDir=me.join(this.globalBaseDir,"projects"),this.globalConfigDir=me.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=me.resolve(e),this.globalProjectsDir=me.join(this.globalBaseDir,"projects"),this.globalConfigDir=me.join(this.globalBaseDir,"config")}generateProjectId(e){return QE.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return me.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return me.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return me.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return me.join(e,".prjct")}async hasLegacyStructure(e){return await vn(this.getLegacyPrjctPath(e))}async hasConfig(e){return await C(this.getLocalConfigPath(e))}async ensureGlobalStructure(){await sn(this.globalBaseDir),await sn(this.globalProjectsDir),await sn(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["analysis","memory"];for(let r of n)await sn(me.join(t,r));return await sn(me.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:r,day:o}=cg(t);return me.join(this.getGlobalProjectPath(e),"sessions",n,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await sn(n),n}async listSessions(e,t=null,n=null){let r=me.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Ti.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let l=me.join(r,a.name),u=await Ti.readdir(l,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let p=me.join(l,d.name),m=await Ti.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:me.join(p,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,l)=>l.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return me.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Ti.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){return await vn(this.getGlobalProjectPath(e))}getDisplayPath(e){let t=dl.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return me.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return me.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return me.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return me.join(this.globalBaseDir,".running")}getDocsPath(){return me.join(this.globalBaseDir,"docs")}getCachePath(){return me.join(this.globalBaseDir,"cache")}getStatePath(){return me.join(this.globalBaseDir,"state")}getStatusLinePath(){return me.join(this.globalBaseDir,"statusline")}async getAgentDir(){return(await(rt(),st(Ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(rt(),st(Ut)).getActiveProvider();return(rt(),st(Ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return me.join(dl.homedir(),".claude")}getClaudeSettingsPath(){return me.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return me.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return me.join(this.getGlobalProjectPath(e),"context")}async getWikiPath(e,t){return fg(e,t)}getWikiPathWithProjectHash(e,t){return hg(e,t)}getLegacyWikiPath(e){return yg(e)}async detectMonorepo(e){return Zc(e)}async discoverMonorepoPackages(e,t){return el(e,t)}async findContainingPackage(e,t){return lg(e,t)}async findMonorepoRoot(e){return ug(e)}},ZE=new pl,_=ZE});var _g={};D(_g,{UpdateChecker:()=>Ci,default:()=>Qs,getUpdateNotificationSync:()=>rC,triggerBackgroundRefreshIfStale:()=>oC});import{spawn as eC}from"node:child_process";import gl from"node:fs";import tC from"node:https";import Ei from"node:path";import Wn from"chalk";function sC(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]||0,i=n[r]||0;if(o>i)return 1;if(o<i)return-1}return 0}function $g(){try{let s=gl.readFileSync(jg(),"utf-8");return JSON.parse(s)}catch{return null}}function Ig(s,e){let t=`Update available! ${s} \u2192 ${e}`,n="prjct upgrade",r=Math.max(t.length,`Run: ${n}`.length)+4,o=`\u250C${"\u2500".repeat(r)}\u2510`,i=`\u2514${"\u2500".repeat(r)}\u2518`,a=c(l=>`\u2502 ${l}${" ".repeat(r-l.length-2)}\u2502`,"pad");return["",Wn.yellow(o),Wn.yellow(a("")),Wn.yellow(`\u2502 ${Wn.bold(t)}${" ".repeat(r-t.length-2)}\u2502`),Wn.yellow(`\u2502 Run: ${Wn.cyan(n)}${" ".repeat(r-n.length-7)}\u2502`),Wn.yellow(a("")),Wn.yellow(i),""].join(`
16
- `)}function rC(s){if(!s)return null;let e=$g();return!e?.latestVersion||sC(e.latestVersion,s)<=0?null:Ig(s,e.latestVersion)}function oC(){try{let e=$g();if(e?.lastCheck&&Date.now()-e.lastCheck<nC)return}catch{}try{gl.mkdirSync(Ag(),{recursive:!0})}catch{return}let s=Ei.join(Et,"assets","scripts","refresh-update.mjs");if(gl.existsSync(s))try{eC(process.execPath,[s,jg()],{detached:!0,stdio:"ignore"}).unref()}catch{}}var Ci,Qs,Ag,jg,nC,Ri=h(()=>{"use strict";F();V();We();ge();Ci=class{static{c(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=_.globalConfigDir,this.cacheFile=Ei.join(this.cacheDir,"update-cache.json"),this.checkInterval=24*60*60*1e3}async getCurrentVersion(){try{let e=Ei.join(__dirname,"..","..","package.json");return(await xe(e))?.version??null}catch(e){return console.error("Error reading package version:",b(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},r=tC.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=r[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await C(this.cacheFile))return await xe(this.cacheFile)}catch{}return null}async writeCache(e){try{await ke(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let r=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:Ig(e.currentVersion,e.latestVersion)}},Qs=Ci,Ag=c(()=>_.globalConfigDir,"updateCacheDir"),jg=c(()=>Ei.join(Ag(),"update-cache.json"),"updateCacheFile"),nC=24*60*60*1e3;c(sC,"compareSemver");c($g,"readCacheSync");c(Ig,"formatUpdateBanner");c(rC,"getUpdateNotificationSync");c(oC,"triggerBackgroundRefreshIfStale")});function iC(s){return s instanceof Zs}function Ge(s){return iC(s)||s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}var Zs,Pi,xi,wo,Gn=h(()=>{"use strict";Zs=class extends Error{static{c(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Pi=class s extends Zs{static{c(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new s("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new s(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new s(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},xi=class s extends Zs{static{c(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new s(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new s(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},wo=class s extends Zs{static{c(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new s(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new s(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};c(iC,"isPrjctError");c(Ge,"getErrorMessage")});var wl={};D(wl,{default:()=>gC,getTemplateContent:()=>Je,listTemplates:()=>tr,resetBundle:()=>pC});import hl from"node:fs";import aC from"node:fs/promises";import ji from"node:path";function yl(){if(fl)return Ai;fl=!0;let s=ji.join(Et,"dist","templates.json");try{let e=hl.readFileSync(s,"utf-8");return Ai=JSON.parse(e),Ai}catch{return null}}function lC(s){let e=fs.indexOf(s);e>-1&&fs.splice(e,1),fs.push(s)}function uC(){for(;er.size>=cC&&fs.length>0;){let s=fs.shift();s&&er.delete(s)}}function Dg(s){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=s.match(e);if(!t)return{frontmatter:{},content:s.trim()};let[,n,r]=t,o={};return n.split(`
17
- `).forEach(i=>{let[a,...l]=i.split(":");if(a&&l.length>0){let u=l.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:r.trim()}}async function Mg(s){if(er.has(s))return lC(s),er.get(s);let e,t=yl();if(t){let r=`commands/${s}.md`;e=t[r]}if(!e){let r=ji.join(Et,"templates","commands",`${s}.md`);try{e=await aC.readFile(r,"utf-8")}catch{throw xi.notFound(s)}}let n=Dg(e);return uC(),er.set(s,n),fs.push(s),n}async function dC(s){return(await Mg(s)).frontmatter["allowed-tools"]||[]}function Og(){er.clear(),fs.length=0}function pC(){Ai=null,fl=!1,Og()}function Je(s){let e=yl();if(e?.[s])return e[s];let t=ji.join(Et,"templates",s);try{return hl.readFileSync(t,"utf-8")}catch{return null}}function tr(s){let e=yl();if(e)return Object.keys(e).filter(n=>n.startsWith(s));let t=ji.join(Et,"templates",s);try{return hl.readdirSync(t).map(r=>`${s}${r}`)}catch{return[]}}var cC,er,fs,Ai,fl,mC,gC,En=h(()=>{"use strict";Gn();We();cC=50,er=new Map,fs=[],Ai=null,fl=!1;c(yl,"loadBundle");c(lC,"updateLruOrder");c(uC,"evictLru");c(Dg,"parseFrontmatter");c(Mg,"load");c(dC,"getAllowedTools");c(Og,"clearCache");c(pC,"resetBundle");c(Je,"getTemplateContent");c(tr,"listTemplates");mC={load:Mg,parseFrontmatter:Dg,getAllowedTools:dC,clearCache:Og,getTemplateContent:Je,listTemplates:tr},gC=mC});function nr(s,e,t,n){if(!s)return{content:e,action:"created"};if(!(s.includes(t)&&s.includes(n)))return{content:`${s}
15
+ `),a="",l="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?l=p.replace("HEAD ","").trim():p.startsWith("branch ")?u=p.replace("branch refs/heads/","").trim():p==="bare"?d=!0:p==="detached"&&(u="(detached)");if(a){let p=a===t||d;n.push({path:a,branch:u,commit:l,isMain:p,slug:p?"main":on.basename(a)})}}return n}},gg=new rl,FE=gg});import ol from"node:os";import an from"node:path";async function fg(s,e){if(e&&e.trim().length>0)return UE(s,e);let t=await HE(s),r=an.basename(an.resolve(t)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project";return an.join(ol.homedir(),"Documents","prjct",r)}function hg(s,e){let n=an.basename(an.resolve(s)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project",r=e.replace(/-/g,"").slice(0,8);return an.join(ol.homedir(),"Documents","prjct",`${n}-${r}`)}function yg(s){return an.join(s,".prjct","wiki")}async function HE(s){try{let{worktreeService:e}=await Promise.resolve().then(()=>(wi(),yi));return await e.detect(s)&&await e.getMainWorktree(s)||s}catch{return s}}function UE(s,e){let t=e.trim();return(t.startsWith("~/")||t==="~")&&(t=an.join(ol.homedir(),t.slice(1))),an.isAbsolute(t)||(t=an.resolve(s,t)),t}var wg=h(()=>{"use strict";c(fg,"getWikiPath");c(hg,"getWikiPathWithProjectHash");c(yg,"getLegacyWikiPath");c(HE,"resolveProjectRootPath");c(UE,"resolveVaultOverride")});var ki=h(()=>{"use strict"});import{z as mo}from"zod";function VE(s){return BE[s]??Hn}function kg(s){let e=VE(s);return e.model==="opus"&&e.effort==="max"?'Dispatch with the Agent tool using `model: "opus"` and full reasoning effort \u2014 this is the IMPLEMENTER; it writes code and needs the best model.':`Dispatch with the Agent tool using \`model: "${e.model}"\` (NOT the parent's max model). Apply ${e.effort}, not exhaustive, effort \u2014 this is an orchestration/review role: return the verdict, don't over-deliberate. A smaller model at decent effort is correct here and far faster.`}function vg(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=n[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var WE,GE,Hn,BE,go,fo=h(()=>{"use strict";WE={model:"opus",effort:"max"},GE={model:"haiku",effort:"decent"},Hn={model:"sonnet",effort:"decent"},BE={implementer:WE,orchestrator:GE,"strategic-review":Hn,"architecture-review":Hn,"design-review":Hn,review:Hn,security:Hn,investigate:Hn,reviewer:Hn};c(VE,"getAgentModelPolicy");c(kg,"renderModelDirective");go=mo.object({provider:mo.string(),model:mo.string(),cliVersion:mo.string().optional(),recordedAt:mo.string()});c(vg,"compareSemver")});function Ys(s,e){let t=typeof s=="string"?new Date(s).getTime():s;return Date.now()-t>e}var vi,ho=h(()=>{"use strict";c(Ys,"isExpired");vi=class{static{c(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,r)=>n[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Sg={};D(Sg,{invalidateProviderCache:()=>XE,readProviderCache:()=>al,writeProviderCache:()=>cl});import bg from"node:fs/promises";import qE from"node:path";async function al(){try{let s=await bg.readFile(il(),"utf-8"),e=JSON.parse(s);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ys(e.timestamp,JE)?null:e.detection}catch{return null}}async function cl(s){let e={timestamp:new Date().toISOString(),detection:s};await ke(il(),e)}async function XE(){try{await bg.unlink(il())}catch{}}var il,JE,ll=h(()=>{"use strict";ge();ho();V();il=c(()=>qE.join(_.getCachePath(),"providers.json"),"cacheFile"),JE=10*60*1e3;c(al,"readProviderCache");c(cl,"writeProviderCache");c(XE,"invalidateProviderCache")});var Ut={};D(Ut,{ClaudeProvider:()=>bi,CursorProvider:()=>Cg,GeminiProvider:()=>ul,Providers:()=>ut,detectAllProviders:()=>Tn,detectAntigravity:()=>yo,detectCodex:()=>gs,detectProvider:()=>Si,getActiveProvider:()=>YE,getProviderBranding:()=>Ti,selectProvider:()=>dl,validateCliVersion:()=>xg});import Un from"node:os";import cn from"node:path";async function Pg(s){try{let{stdout:e}=await U(`which ${s}`,{timeout:2e3});return e.trim()}catch{return null}}async function KE(s){try{let{stdout:e}=await U(`${s} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Si(s){let e=ut[s];if(!e.cliCommand)return{installed:!1};let t=await Pg(e.cliCommand);if(!t)return{installed:!1};let n=await KE(e.cliCommand),r=xg(s,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:r||void 0}}function xg(s,e){let t=ut[s];return!t.minCliVersion||!e?null:vg(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function Tn(s=!1){if(!s){let i=await al();if(i)return i}let[e,t,n]=await Promise.all([Si("claude"),Si("gemini"),gs()]),r={installed:n.installed},o={claude:e,gemini:t,codex:r};return await cl(o).catch(()=>{}),o}async function YE(s){if(s&&ut[s])return ut[s];let e=await Tn();return e.claude.installed&&!e.gemini.installed?bi:e.gemini.installed&&!e.claude.installed?ul:bi}function Ti(s){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[s]||"\u26A1 prjct"}}async function yo(){let s=Eg.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=cn.join(s,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([C(s),C(e)]);return{installed:t,skillInstalled:n,configPath:t?s:void 0}}async function gs(){let s=Rg.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=await Pg("codex"),t=cn.join(s,"skills","prjct","SKILL.md"),n=await C(t),r=!!e;return{installed:r,skillInstalled:n,configPath:r?s:void 0}}async function dl(){let s=await Tn(),e=s.claude.installed,t=s.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:s}:e&&!t?{provider:"claude",userSelected:!1,detection:s}:t&&!e?{provider:"gemini",userSelected:!1,detection:s}:{provider:"claude",userSelected:!0,detection:s}}var bi,ul,Eg,Cg,zE,Rg,ut,rt=h(()=>{"use strict";ki();fo();Fe();V();ll();bi={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:cn.join(Un.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:cn.join(Un.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},ul={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:cn.join(Un.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:cn.join(Un.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},Eg={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:cn.join(Un.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:cn.join(Un.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Cg={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},zE={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Rg={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:cn.join(Un.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:cn.join(Un.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},ut={claude:bi,gemini:ul,cursor:Cg,antigravity:Eg,windsurf:zE,codex:Rg};c(Pg,"whichCommand");c(KE,"getCliVersion");c(Si,"detectProvider");c(xg,"validateCliVersion");c(Tn,"detectAllProviders");c(YE,"getActiveProvider");c(Ti,"getProviderBranding");c(yo,"detectAntigravity");c(gs,"detectCodex");c(dl,"selectProvider")});var gl={};D(gl,{default:()=>_});import QE from"node:crypto";import Ei from"node:fs/promises";import pl from"node:os";import me from"node:path";var ml,ZE,_,ge=h(()=>{"use strict";ue();V();dg();wg();ml=class{static{c(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?me.resolve(e):me.join(pl.homedir(),".prjct-cli"),this.globalProjectsDir=me.join(this.globalBaseDir,"projects"),this.globalConfigDir=me.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=me.resolve(e),this.globalProjectsDir=me.join(this.globalBaseDir,"projects"),this.globalConfigDir=me.join(this.globalBaseDir,"config")}generateProjectId(e){return QE.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return me.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return me.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return me.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return me.join(e,".prjct")}async hasLegacyStructure(e){return await vn(this.getLegacyPrjctPath(e))}async hasConfig(e){return await C(this.getLocalConfigPath(e))}async ensureGlobalStructure(){await sn(this.globalBaseDir),await sn(this.globalProjectsDir),await sn(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["analysis","memory"];for(let r of n)await sn(me.join(t,r));return await sn(me.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:r,day:o}=cg(t);return me.join(this.getGlobalProjectPath(e),"sessions",n,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await sn(n),n}async listSessions(e,t=null,n=null){let r=me.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Ei.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let l=me.join(r,a.name),u=await Ei.readdir(l,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let p=me.join(l,d.name),m=await Ei.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:me.join(p,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,l)=>l.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return me.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Ei.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){return await vn(this.getGlobalProjectPath(e))}getDisplayPath(e){let t=pl.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return me.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return me.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return me.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return me.join(this.globalBaseDir,".running")}getDocsPath(){return me.join(this.globalBaseDir,"docs")}getCachePath(){return me.join(this.globalBaseDir,"cache")}getStatePath(){return me.join(this.globalBaseDir,"state")}getStatusLinePath(){return me.join(this.globalBaseDir,"statusline")}async getAgentDir(){return(await(rt(),st(Ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(rt(),st(Ut)).getActiveProvider();return(rt(),st(Ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return me.join(pl.homedir(),".claude")}getClaudeSettingsPath(){return me.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return me.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return me.join(this.getGlobalProjectPath(e),"context")}async getWikiPath(e,t){return fg(e,t)}getWikiPathWithProjectHash(e,t){return hg(e,t)}getLegacyWikiPath(e){return yg(e)}async detectMonorepo(e){return el(e)}async discoverMonorepoPackages(e,t){return tl(e,t)}async findContainingPackage(e,t){return lg(e,t)}async findMonorepoRoot(e){return ug(e)}},ZE=new ml,_=ZE});var _g={};D(_g,{UpdateChecker:()=>Ri,default:()=>Qs,getUpdateNotificationSync:()=>rC,triggerBackgroundRefreshIfStale:()=>oC});import{spawn as eC}from"node:child_process";import fl from"node:fs";import tC from"node:https";import Ci from"node:path";import Wn from"chalk";function sC(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]||0,i=n[r]||0;if(o>i)return 1;if(o<i)return-1}return 0}function $g(){try{let s=fl.readFileSync(jg(),"utf-8");return JSON.parse(s)}catch{return null}}function Ig(s,e){let t=`Update available! ${s} \u2192 ${e}`,n="prjct upgrade",r=Math.max(t.length,`Run: ${n}`.length)+4,o=`\u250C${"\u2500".repeat(r)}\u2510`,i=`\u2514${"\u2500".repeat(r)}\u2518`,a=c(l=>`\u2502 ${l}${" ".repeat(r-l.length-2)}\u2502`,"pad");return["",Wn.yellow(o),Wn.yellow(a("")),Wn.yellow(`\u2502 ${Wn.bold(t)}${" ".repeat(r-t.length-2)}\u2502`),Wn.yellow(`\u2502 Run: ${Wn.cyan(n)}${" ".repeat(r-n.length-7)}\u2502`),Wn.yellow(a("")),Wn.yellow(i),""].join(`
16
+ `)}function rC(s){if(!s)return null;let e=$g();return!e?.latestVersion||sC(e.latestVersion,s)<=0?null:Ig(s,e.latestVersion)}function oC(){try{let e=$g();if(e?.lastCheck&&Date.now()-e.lastCheck<nC)return}catch{}try{fl.mkdirSync(Ag(),{recursive:!0})}catch{return}let s=Ci.join(Et,"assets","scripts","refresh-update.mjs");if(fl.existsSync(s))try{eC(process.execPath,[s,jg()],{detached:!0,stdio:"ignore"}).unref()}catch{}}var Ri,Qs,Ag,jg,nC,Pi=h(()=>{"use strict";F();V();We();ge();Ri=class{static{c(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=_.globalConfigDir,this.cacheFile=Ci.join(this.cacheDir,"update-cache.json"),this.checkInterval=24*60*60*1e3}async getCurrentVersion(){try{let e=Ci.join(__dirname,"..","..","package.json");return(await xe(e))?.version??null}catch(e){return console.error("Error reading package version:",b(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},r=tC.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=r[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await C(this.cacheFile))return await xe(this.cacheFile)}catch{}return null}async writeCache(e){try{await ke(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let r=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:Ig(e.currentVersion,e.latestVersion)}},Qs=Ri,Ag=c(()=>_.globalConfigDir,"updateCacheDir"),jg=c(()=>Ci.join(Ag(),"update-cache.json"),"updateCacheFile"),nC=24*60*60*1e3;c(sC,"compareSemver");c($g,"readCacheSync");c(Ig,"formatUpdateBanner");c(rC,"getUpdateNotificationSync");c(oC,"triggerBackgroundRefreshIfStale")});function iC(s){return s instanceof Zs}function Ge(s){return iC(s)||s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}var Zs,xi,Ai,wo,Gn=h(()=>{"use strict";Zs=class extends Error{static{c(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},xi=class s extends Zs{static{c(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new s("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new s(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new s(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ai=class s extends Zs{static{c(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new s(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new s(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},wo=class s extends Zs{static{c(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new s(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new s(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};c(iC,"isPrjctError");c(Ge,"getErrorMessage")});var kl={};D(kl,{default:()=>gC,getTemplateContent:()=>Je,listTemplates:()=>tr,resetBundle:()=>pC});import yl from"node:fs";import aC from"node:fs/promises";import $i from"node:path";function wl(){if(hl)return ji;hl=!0;let s=$i.join(Et,"dist","templates.json");try{let e=yl.readFileSync(s,"utf-8");return ji=JSON.parse(e),ji}catch{return null}}function lC(s){let e=fs.indexOf(s);e>-1&&fs.splice(e,1),fs.push(s)}function uC(){for(;er.size>=cC&&fs.length>0;){let s=fs.shift();s&&er.delete(s)}}function Dg(s){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=s.match(e);if(!t)return{frontmatter:{},content:s.trim()};let[,n,r]=t,o={};return n.split(`
17
+ `).forEach(i=>{let[a,...l]=i.split(":");if(a&&l.length>0){let u=l.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:r.trim()}}async function Mg(s){if(er.has(s))return lC(s),er.get(s);let e,t=wl();if(t){let r=`commands/${s}.md`;e=t[r]}if(!e){let r=$i.join(Et,"templates","commands",`${s}.md`);try{e=await aC.readFile(r,"utf-8")}catch{throw Ai.notFound(s)}}let n=Dg(e);return uC(),er.set(s,n),fs.push(s),n}async function dC(s){return(await Mg(s)).frontmatter["allowed-tools"]||[]}function Og(){er.clear(),fs.length=0}function pC(){ji=null,hl=!1,Og()}function Je(s){let e=wl();if(e?.[s])return e[s];let t=$i.join(Et,"templates",s);try{return yl.readFileSync(t,"utf-8")}catch{return null}}function tr(s){let e=wl();if(e)return Object.keys(e).filter(n=>n.startsWith(s));let t=$i.join(Et,"templates",s);try{return yl.readdirSync(t).map(r=>`${s}${r}`)}catch{return[]}}var cC,er,fs,ji,hl,mC,gC,En=h(()=>{"use strict";Gn();We();cC=50,er=new Map,fs=[],ji=null,hl=!1;c(wl,"loadBundle");c(lC,"updateLruOrder");c(uC,"evictLru");c(Dg,"parseFrontmatter");c(Mg,"load");c(dC,"getAllowedTools");c(Og,"clearCache");c(pC,"resetBundle");c(Je,"getTemplateContent");c(tr,"listTemplates");mC={load:Mg,parseFrontmatter:Dg,getAllowedTools:dC,clearCache:Og,getTemplateContent:Je,listTemplates:tr},gC=mC});function nr(s,e,t,n){if(!s)return{content:e,action:"created"};if(!(s.includes(t)&&s.includes(n)))return{content:`${s}
18
18
 
19
- ${e}`,action:"appended"};let o=s.substring(0,s.indexOf(t)),i=s.substring(s.indexOf(n)+n.length),a;return e.includes(t)&&e.includes(n)?a=e.substring(e.indexOf(t),e.indexOf(n)+n.length):a=e,{content:o+a+i,action:"updated"}}var $i=h(()=>{"use strict";c(nr,"mergeWithMarkers")});import Cn from"node:fs/promises";import hs from"node:path";async function Lg(){try{let s=_.getDocsPath();await Cn.mkdir(s,{recursive:!0});let e=tr("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=Je(r);o&&await Cn.writeFile(hs.join(s,hs.basename(r)),o,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:t}=(We(),st(ms)),n=hs.join(t,"templates/global/docs");try{let r=await Cn.readdir(n);for(let o of r)if(o.endsWith(".md")){let i=await Cn.readFile(hs.join(n,o),"utf-8");await Cn.writeFile(hs.join(s,o),i,"utf-8")}}catch{}return{success:!0}}catch(s){return{success:!1,error:b(s)}}}async function kl(){let s=(rt(),st(Ut)),e=await s.getActiveProvider(),t=e.name;if(!(await s.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await Cn.mkdir(e.configDir,{recursive:!0});let r=hs.join(e.configDir,e.contextFile),o=Ng;if(t!=="claude"){let g=Je(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:k}=(We(),st(ms)),E=hs.join(k,"templates","global",e.contextFile);try{o=await Cn.readFile(E,"utf-8")}catch{t==="gemini"&&(o=Ng.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await Cn.readFile(r,"utf-8"),a=!0}catch(g){if(L(g))a=!1;else throw g}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(l)&&i.includes(u)){let g=i.substring(0,i.indexOf(l)),k=i.substring(i.indexOf(u)+u.length);i=`${(g+k).replace(/\n{3,}/g,`
19
+ ${e}`,action:"appended"};let o=s.substring(0,s.indexOf(t)),i=s.substring(s.indexOf(n)+n.length),a;return e.includes(t)&&e.includes(n)?a=e.substring(e.indexOf(t),e.indexOf(n)+n.length):a=e,{content:o+a+i,action:"updated"}}var Ii=h(()=>{"use strict";c(nr,"mergeWithMarkers")});import Cn from"node:fs/promises";import hs from"node:path";async function Lg(){try{let s=_.getDocsPath();await Cn.mkdir(s,{recursive:!0});let e=tr("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=Je(r);o&&await Cn.writeFile(hs.join(s,hs.basename(r)),o,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:t}=(We(),st(ms)),n=hs.join(t,"templates/global/docs");try{let r=await Cn.readdir(n);for(let o of r)if(o.endsWith(".md")){let i=await Cn.readFile(hs.join(n,o),"utf-8");await Cn.writeFile(hs.join(s,o),i,"utf-8")}}catch{}return{success:!0}}catch(s){return{success:!1,error:b(s)}}}async function vl(){let s=(rt(),st(Ut)),e=await s.getActiveProvider(),t=e.name;if(!(await s.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await Cn.mkdir(e.configDir,{recursive:!0});let r=hs.join(e.configDir,e.contextFile),o=Ng;if(t!=="claude"){let g=Je(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:k}=(We(),st(ms)),E=hs.join(k,"templates","global",e.contextFile);try{o=await Cn.readFile(E,"utf-8")}catch{t==="gemini"&&(o=Ng.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await Cn.readFile(r,"utf-8"),a=!0}catch(g){if(L(g))a=!1;else throw g}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(l)&&i.includes(u)){let g=i.substring(0,i.indexOf(l)),k=i.substring(i.indexOf(u)+u.length);i=`${(g+k).replace(/\n{3,}/g,`
20
20
 
21
21
  `).trim()}
22
- `}let m=nr(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Cn.writeFile(r,m.content,"utf-8"),{success:!0,action:m.action,path:r}}catch(r){return{success:!1,error:b(r),action:"failed"}}}var Ng,Fg=h(()=>{"use strict";En();F();$i();ge();Ng='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nYou are in a prjct project when any of these signs are present: `~/Documents/prjct/<slug>/_generated/` exists, OR `.prjct/` is in cwd, OR `~/.prjct-cli/projects/` has an entry for the current path.\n\n## Lookup FIRST, source LAST\n\nBefore reading source code or running broad searches for ANY question about the project (architecture, conventions, decisions, recent ships, bugs, patterns, tech debt, past analyses), READ these vault files first using Read/Glob \u2014 no CLI round-trip:\n\n- `~/Documents/prjct/<slug>/_generated/index.md` \u2014 overview, ships, memory counts, patterns count\n- `~/Documents/prjct/<slug>/_generated/architecture.md` \u2014 domains, conventions, key insights\n- `~/Documents/prjct/<slug>/_generated/{patterns,insights,tech-debt}.md` \u2014 inferred state of the project\n- `~/Documents/prjct/<slug>/_generated/memory/{decision,gotcha,learning,fact,inbox}.md` \u2014 captured knowledge\n- `~/Documents/prjct/<slug>/_generated/analysis/{anti-patterns,insights,patterns,refactors,risk-areas,tech-debt}/` \u2014 past analyses by category\n- `~/Documents/prjct/<slug>/_generated/{ships,releases,tags}/` \u2014 history & taxonomy\n\nOnly fall through to source/repo reading when the vault does not contain the answer.\n\n## Capture analyses BACK to prjct\n\nWhen you complete substantive work \u2014 analysis, decision, learning, gotcha discovered \u2014 persist it so the next session benefits:\n\n- `prjct remember decision "<choice + why>"` \u2014 choices made, with rationale\n- `prjct remember learning "<insight>"` \u2014 non-obvious insights gained\n- `prjct remember gotcha "<trap + how to avoid>"` \u2014 bugs/traps found\n- `prjct remember fact "<verifiable claim>"` \u2014 project facts (paths, conventions, IDs)\n- `prjct capture "<text>" --tags type:analysis,topic:<x>` \u2014 analytical dumps & inbox items\n\nTag with `--tags k:v,k:v` for searchability. Memory persists to SQLite; vault auto-regenerates. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.**\n\n## Workflow\n\n`prjct task "<desc>"` \u2192 work \u2192 `prjct status done` \u2192 `prjct ship`\nPause/resume: `prjct status paused` | `prjct status active` (also reopens completed tasks)\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `~/Documents/prjct/<slug>/_generated/` (Read/Glob freely; never hand-edit \u2014 fix the pipeline)\n- Project config: `.prjct/prjct.config.json` in repo root\n\nThe vault regenerates automatically on `remember`, `capture`, `ship`, `sync`, and the SessionStart/Stop hooks.\n\n**Auto-managed by prjct-cli** | https://prjct.app\n<!-- prjct:end - DO NOT REMOVE THIS MARKER -->\n';c(Lg,"installDocs");c(kl,"installGlobalConfig")});var Sl={};D(Sl,{CommandInstaller:()=>ln,default:()=>He,getProviderPaths:()=>bl,installGlobalConfig:()=>fC});import Bn from"node:fs/promises";import vl from"node:os";import Qe from"node:path";async function fC(){return kl()}function bl(){let s=vl.homedir();return{claude:{commands:Qe.join(s,".claude","commands"),config:Qe.join(s,".claude"),router:Qe.join(s,".claude","commands","p.md")},gemini:{commands:Qe.join(s,".gemini","commands"),config:Qe.join(s,".gemini"),router:Qe.join(s,".gemini","commands","p.toml")}}}var ln,hC,He,Wt=h(()=>{"use strict";F();V();Fg();c(fC,"installGlobalConfig");ln=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=vl.homedir()}async ensureInit(){if(this._initialized)return;let t=await(rt(),st(Ut)).getActiveProvider();this.commandsPath=Qe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),C(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),n=await(rt(),st(Ut)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${n.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let n=Qe.join(this.commandsPath,t);try{await Bn.unlink(n),e.push(t)}catch(r){if(r.code!=="ENOENT")return{success:!1,error:b(r)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:b(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:b(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let n=Qe.join(this.commandsPath,t);try{await Bn.unlink(n),e=!0}catch(r){r.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Qe.join(this.commandsPath,"p");try{if((await Bn.stat(e).catch(()=>null))?.isDirectory())return await Bn.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return kl()}async cleanupAllLegacy(){let e=vl.homedir(),t=[],n=[Qe.join(e,".claude","commands","p.md"),Qe.join(e,".claude","commands","p.toml"),Qe.join(e,".gemini","commands","p.md"),Qe.join(e,".gemini","commands","p.toml")];for(let i of n)try{await Bn.unlink(i),t.push(i)}catch{}let r=[Qe.join(e,".claude","commands","p"),Qe.join(e,".gemini","commands","p")];for(let i of r)try{(await Bn.stat(i).catch(()=>null))?.isDirectory()&&(await Bn.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Qe.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await Bn.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return Lg()}};c(bl,"getProviderPaths");hC=new ln,He=hC});var Bg={};D(Bg,{PRJCT_HOOKS:()=>ko,install:()=>Pl,status:()=>Al,uninstall:()=>xl});import Tl from"node:fs/promises";import yC from"node:os";import Ug from"node:path";function sr(){let s=process.env.HOME||yC.homedir();return Ug.join(s,".claude","settings.json")}async function Cl(){try{let s=await Tl.readFile(sr(),"utf-8"),e=JSON.parse(s);return e&&typeof e=="object"?e:{}}catch(s){if(s.code==="ENOENT")return{};throw s}}async function Wg(s){await Tl.mkdir(Ug.dirname(sr()),{recursive:!0}),await Tl.writeFile(sr(),`${JSON.stringify(s,null,2)}
23
- `,"utf-8")}function Gg(s){let e=process.env.PRJCT_BIN??"prjct";return`command -v ${e} >/dev/null 2>&1 && ${e} hook ${s} || exit 0`}function Rl(s){return s[El]===!0}function wC(s){if(s[El]===!0)return!1;let e=s.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function Hg(s){let e={type:"command",command:Gg(s.subcommand),[El]:!0};return"ifClause"in s&&s.ifClause&&(e.if=s.ifClause),e}async function Pl(){let s=await Cl(),e=s.hooks??{},t=0,n=0;for(let r of ko){let o=e[r.event]??[],i=Gg(r.subcommand),a=o.find(p=>(p.matcher??"")===r.matcher);a||(a={matcher:r.matcher,hooks:[]},o.push(a));let l=a.hooks.length;a.hooks=a.hooks.filter(p=>!wC(p));let u=l-a.hooks.length,d=a.hooks.find(p=>Rl(p));if(d){let p=Hg(r);d.command===p.command&&d.if===p.if&&u===0?n++:(d.command=p.command,d.if=p.if,t++)}else a.hooks.push(Hg(r)),t++;e[r.event]=o}return s.hooks=e,await Wg(s),{settingsPath:sr(),hooksWritten:t,alreadyPresent:n}}async function xl(){let s=await Cl();if(!s.hooks)return{settingsPath:sr(),hooksRemoved:0};let e=0;for(let[t,n]of Object.entries(s.hooks)){let r=[];for(let o of n){let i=o.hooks.filter(a=>Rl(a)?(e++,!1):!0);i.length>0&&r.push({...o,hooks:i})}r.length>0?s.hooks[t]=r:delete s.hooks[t]}return Object.keys(s.hooks).length===0&&delete s.hooks,await Wg(s),{settingsPath:sr(),hooksRemoved:e}}async function Al(){let e=(await Cl()).hooks??{},t=0;for(let n of Object.values(e))for(let r of n)for(let o of r.hooks)Rl(o)&&t++;return{installed:t,expected:ko.length}}var El,ko,jl=h(()=>{"use strict";c(sr,"settingsPath");El="_prjctManaged",ko=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(Cl,"readSettings");c(Wg,"writeSettings");c(Gg,"hookCommand");c(Rl,"isPrjctHook");c(wC,"isLegacyPrjctHook");c(Hg,"hookEntryFor");c(Pl,"install");c(xl,"uninstall");c(Al,"status")});var Dl={};D(Dl,{isSyncCurrent:()=>Il,runSelfHeal:()=>_l});import $l from"node:fs";import kC from"node:path";function vC(){try{return $l.readFileSync(qg(),"utf-8").trim()}catch{return null}}function bC(s){try{$l.mkdirSync(Vg(),{recursive:!0}),$l.writeFileSync(qg(),s,"utf-8")}catch{}}function Il(s){return s?vC()===s:!0}async function _l(s){if(s&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(Wt(),Sl));await e()}catch{}try{await(await Promise.resolve().then(()=>(jl(),Bg))).install()}catch{}bC(s)}}var Vg,qg,Ii=h(()=>{"use strict";ge();Vg=c(()=>_.getStatePath(),"stampDir"),qg=c(()=>kC.join(Vg(),"installed-version"),"stampPath");c(vC,"readStamp");c(bC,"writeStamp");c(Il,"isSyncCurrent");c(_l,"runSelfHeal")});var Nl={};D(Nl,{DAEMON_PATHS:()=>Ae,IDLE_TIMEOUT_MS:()=>Ml,MAX_BUFFER_SIZE:()=>Ol,encodeMessage:()=>ys});function ys(s){return Buffer.from(`${JSON.stringify(s)}
24
- `)}var Ae,Ml,Ol,rr=h(()=>{"use strict";Ae={runDir:c(()=>`${process.env.HOME||qe("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:c(()=>`${Ae.runDir()}/daemon.sock`,"socket"),pid:c(()=>`${Ae.runDir()}/daemon.pid`,"pid"),log:c(()=>`${Ae.runDir()}/daemon.log`,"log")},Ml=30*60*1e3,Ol=1024*1024;c(ys,"encodeMessage")});function Jg(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Xg(){return Jg()==="bun"}function Ll(){if(Jg()==="bun")return!0;try{let{execSync:s}=qe("node:child_process");return s("bun --version",{stdio:"ignore"}),!0}catch{return!1}}var Fl=h(()=>{"use strict";c(Jg,"detectRuntime");c(Xg,"isBun");c(Ll,"isBunAvailable")});var Gt={};D(Gt,{executeViaDaemon:()=>EC,forceKillDaemon:()=>RC,getDaemonStatus:()=>TC,isDaemonRunning:()=>zg,sendRequest:()=>vo,spawnDaemon:()=>Kg,stopDaemon:()=>CC});import _i from"node:crypto";import Xe from"node:fs";import{connect as SC}from"node:net";async function zg(){let s=Ae.socket();if(!Xe.existsSync(s))return!1;try{return(await vo({id:_i.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Xe.unlinkSync(s)}catch{}return!1}}async function TC(){let s=Ae.socket(),e=Ae.pid();if(!Xe.existsSync(s))return{running:!1};try{let t=await vo({id:_i.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Xe.existsSync(e)?{running:!1,pid:parseInt(Xe.readFileSync(e,"utf-8").trim(),10),socketPath:s}:{running:!1}}function vo(s){return new Promise((e,t)=>{let n=Ae.socket(),r=SC(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(ys(s))}),r.on("data",l=>{o+=l.toString();let u=o.indexOf(`
25
- `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(p)}catch(p){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),r.on("error",l=>{i||(i=!0,clearTimeout(a),t(l))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function EC(s,e,t,n,r,o=!0){let i=Ae.socket();if(!Xe.existsSync(i))return o&&Kg().catch(()=>{}),null;try{return await vo({id:_i.randomUUID(),command:s,args:e,options:t,cwd:n,perfStartNs:r})}catch{return null}}async function CC(){try{return(await vo({id:_i.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function RC(){let s=Ae.pid(),e=Ae.socket(),t=!1;if(Xe.existsSync(s)){let n=parseInt(Xe.readFileSync(s,"utf-8").trim(),10);if(!Number.isNaN(n))try{process.kill(n,"SIGKILL"),t=!0}catch{}}try{Xe.existsSync(s)&&Xe.unlinkSync(s)}catch{}try{Xe.existsSync(e)&&Xe.unlinkSync(e)}catch{}return t}async function Kg(){let{spawn:s}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Xe.existsSync(t))o=t,i="bun";else if(Xe.existsSync(n))o=n,i=Ll()?"bun":"node";else if(Xe.existsSync(r))o=r,i=Ll()?"bun":"node";else return!1;let a=Ae.runDir();Xe.mkdirSync(a,{recursive:!0});let l=Ae.log(),u=Xe.openSync(l,"a");s(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Xe.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await zg())return!0;return!1}var Bt=h(()=>{"use strict";Fl();rr();c(zg,"isDaemonRunning");c(TC,"getDaemonStatus");c(vo,"sendRequest");c(EC,"executeViaDaemon");c(CC,"stopDaemon");c(RC,"forceKillDaemon");c(Kg,"spawnDaemon")});async function Di(s){try{let{stdout:e}=await U(s,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function PC(){let s=await Di("gh api user --jq .login");return s.success&&s.output||(s=await Di("git config --global github.user"),s.success&&s.output)?s.output:null}async function xC(){let s=await Di("git config user.name");return s.success&&s.output?s.output:null}async function AC(){let s=await Di("git config user.email");return s.success&&s.output?s.output:null}async function or(){let[s,e,t]=await Promise.all([PC(),xC(),AC()]);return{github:s,email:t,name:e||s||"Unknown"}}var Mi=h(()=>{"use strict";Fe();c(Di,"execCommand");c(PC,"detectGitHubUsername");c(xC,"detectGitName");c(AC,"detectGitEmail");c(or,"detect")});var ws={};D(ws,{default:()=>I});import Ul from"node:fs/promises";import jC from"node:path";import*as Oi from"jsonc-parser";function Yg(s){let e=[],t=Oi.parse(s,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Oi.printParseErrorCode(n.error)}`)}return t}var Wl,$C,I,re=h(()=>{"use strict";Gn();F();ue();V();We();Mi();ge();c(Yg,"parseJsonc");Wl=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=_.getLocalConfigPath(e),n=await Ul.readFile(t,"utf-8");return Yg(n)}catch(t){return L(t)||console.warn(`Warning: Could not read config at ${e}: ${Ge(t)}`),null}}async writeConfig(e,t){let n=_.getLocalConfigPath(e);await ke(n,t)}async readGlobalConfig(e){try{let t=_.getGlobalProjectConfigPath(e),n=await Ul.readFile(t,"utf-8");return Yg(n)}catch(t){return L(t)||console.warn(`Warning: Could not read global config for ${e}: ${Ge(t)}`),null}}async writeGlobalConfig(e,t){let n=_.getGlobalProjectConfigPath(e);await ke(n,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=R();t={projectId:e,authors:[],version:le,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=_.generateProjectId(e),r=_.getGlobalProjectPath(n),o=_.getDisplayPath(r),i=R(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:le,created:i,lastSync:i};return await this.writeGlobalConfig(n,l),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=R(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await _.hasLegacyStructure(e))return!1;if(!await _.hasConfig(e))return!0;let r=await this.readConfig(e);if(!r||!r.projectId)return!0;let o=_.getGlobalProjectPath(r.projectId);try{return(await Ul.readdir(jC.join(o,"core"))).length===0}catch(i){return L(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:n}=await Promise.resolve().then(()=>(yi(),hi));if(await n.detect(e)){let o=await n.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return""}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(r=>r.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=R();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let r=n.authors.find(o=>o.github===t);r&&(r.lastActivity=R(),n.lastSync=r.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await or(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=_.generateProjectId(e);return{projectId:n,dataPath:_.getDisplayPath(_.getGlobalProjectPath(n))}}},$C=new Wl,I=$C});var Qg={};D(Qg,{default:()=>bo});import Gl from"node:fs/promises";import IC from"node:path";var Bl,_C,bo,Ni=h(()=>{"use strict";F();V();ge();Bl=class{static{c(this,"EditorsConfig")}get configDir(){return _.globalConfigDir}get configFile(){return IC.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Gl.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",b(e))}}async loadConfig(){try{let e=await Gl.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",b(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let r={version:e,provider:n,lastInstall:new Date().toISOString(),path:t};return await ke(this.configFile,r),!0}catch(r){return console.error("[editors-config] Error saving config:",b(r)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await ke(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",b(t)),!1}}async configExists(){return C(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Gl.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",b(e)),!1}}},_C=new Bl,bo=_C});import ks from"chalk";var Zg,DC,MC,Vt,ef=h(()=>{"use strict";rt();Zg=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],DC=80,MC={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Zg,speed:DC},cli:{header:c(()=>`${ks.cyan.bold("\u26A1")} ${ks.cyan("prjct")}`,"header"),footer:c(()=>ks.dim("\u26A1 prjct"),"footer"),spin:c((s,e)=>`${ks.cyan("\u26A1")} ${ks.cyan("prjct")} ${ks.cyan(Zg[s%10])} ${ks.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:c((s="claude")=>Si(s).commitFooter,"getCommitFooter"),getSignature:c((s="claude")=>Si(s).signature,"getSignature")},Vt=MC});function ir(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return OC[s]}var OC,Ot,Li=h(()=>{"use strict";OC={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};c(ir,"getTimeout");Ot={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80}});var tf,nf=h(()=>{"use strict";tf={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'prjct linear setup' to configure Linear MCP"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function So(s,e){return{...tf[s],...e}}function Fi(s,e,t){return{message:s,hint:e,...t}}var Hi=h(()=>{"use strict";nf();c(So,"getError");c(Fi,"createError")});var rf={};D(rf,{OUTPUT_TIERS:()=>sf,default:()=>f,formatForHuman:()=>HC,getOutputTier:()=>LC,getTierConfig:()=>Wi,limitLines:()=>Ui,setOutputTier:()=>NC,setQuietMode:()=>FC});import de from"chalk";function NC(s){cr=s}function LC(){return cr}function Wi(){return sf[cr]}function FC(s){yt=s}function Ui(s,e){let t=e??Wi().maxLines;if(t===1/0||t===0)return s;let n=s.split(`
22
+ `}let m=nr(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Cn.writeFile(r,m.content,"utf-8"),{success:!0,action:m.action,path:r}}catch(r){return{success:!1,error:b(r),action:"failed"}}}var Ng,Fg=h(()=>{"use strict";En();F();Ii();ge();Ng='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nYou are in a prjct project when any of these signs are present: `~/Documents/prjct/<slug>/_generated/` exists, OR `.prjct/` is in cwd, OR `~/.prjct-cli/projects/` has an entry for the current path.\n\n## Lookup FIRST, source LAST\n\nBefore reading source code or running broad searches for ANY question about the project (architecture, conventions, decisions, recent ships, bugs, patterns, tech debt, past analyses), READ these vault files first using Read/Glob \u2014 no CLI round-trip:\n\n- `~/Documents/prjct/<slug>/_generated/index.md` \u2014 overview, ships, memory counts, patterns count\n- `~/Documents/prjct/<slug>/_generated/architecture.md` \u2014 domains, conventions, key insights\n- `~/Documents/prjct/<slug>/_generated/{patterns,insights,tech-debt}.md` \u2014 inferred state of the project\n- `~/Documents/prjct/<slug>/_generated/memory/{decision,gotcha,learning,fact,inbox}.md` \u2014 captured knowledge\n- `~/Documents/prjct/<slug>/_generated/analysis/{anti-patterns,insights,patterns,refactors,risk-areas,tech-debt}/` \u2014 past analyses by category\n- `~/Documents/prjct/<slug>/_generated/{ships,releases,tags}/` \u2014 history & taxonomy\n\nOnly fall through to source/repo reading when the vault does not contain the answer.\n\n## Capture analyses BACK to prjct\n\nWhen you complete substantive work \u2014 analysis, decision, learning, gotcha discovered \u2014 persist it so the next session benefits:\n\n- `prjct remember decision "<choice + why>"` \u2014 choices made, with rationale\n- `prjct remember learning "<insight>"` \u2014 non-obvious insights gained\n- `prjct remember gotcha "<trap + how to avoid>"` \u2014 bugs/traps found\n- `prjct remember fact "<verifiable claim>"` \u2014 project facts (paths, conventions, IDs)\n- `prjct capture "<text>" --tags type:analysis,topic:<x>` \u2014 analytical dumps & inbox items\n\nTag with `--tags k:v,k:v` for searchability. Memory persists to SQLite; vault auto-regenerates. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.**\n\n## Workflow\n\n`prjct task "<desc>"` \u2192 work \u2192 `prjct status done` \u2192 `prjct ship`\nPause/resume: `prjct status paused` | `prjct status active` (also reopens completed tasks)\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `~/Documents/prjct/<slug>/_generated/` (Read/Glob freely; never hand-edit \u2014 fix the pipeline)\n- Project config: `.prjct/prjct.config.json` in repo root\n\nThe vault regenerates automatically on `remember`, `capture`, `ship`, `sync`, and the SessionStart/Stop hooks.\n\n**Auto-managed by prjct-cli** | https://prjct.app\n<!-- prjct:end - DO NOT REMOVE THIS MARKER -->\n';c(Lg,"installDocs");c(vl,"installGlobalConfig")});var Tl={};D(Tl,{CommandInstaller:()=>ln,default:()=>He,getProviderPaths:()=>Sl,installGlobalConfig:()=>fC});import Bn from"node:fs/promises";import bl from"node:os";import Qe from"node:path";async function fC(){return vl()}function Sl(){let s=bl.homedir();return{claude:{commands:Qe.join(s,".claude","commands"),config:Qe.join(s,".claude"),router:Qe.join(s,".claude","commands","p.md")},gemini:{commands:Qe.join(s,".gemini","commands"),config:Qe.join(s,".gemini"),router:Qe.join(s,".gemini","commands","p.toml")}}}var ln,hC,He,Wt=h(()=>{"use strict";F();V();Fg();c(fC,"installGlobalConfig");ln=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=bl.homedir()}async ensureInit(){if(this._initialized)return;let t=await(rt(),st(Ut)).getActiveProvider();this.commandsPath=Qe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),C(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),n=await(rt(),st(Ut)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${n.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let n=Qe.join(this.commandsPath,t);try{await Bn.unlink(n),e.push(t)}catch(r){if(r.code!=="ENOENT")return{success:!1,error:b(r)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:b(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:b(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let n=Qe.join(this.commandsPath,t);try{await Bn.unlink(n),e=!0}catch(r){r.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Qe.join(this.commandsPath,"p");try{if((await Bn.stat(e).catch(()=>null))?.isDirectory())return await Bn.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return vl()}async cleanupAllLegacy(){let e=bl.homedir(),t=[],n=[Qe.join(e,".claude","commands","p.md"),Qe.join(e,".claude","commands","p.toml"),Qe.join(e,".gemini","commands","p.md"),Qe.join(e,".gemini","commands","p.toml")];for(let i of n)try{await Bn.unlink(i),t.push(i)}catch{}let r=[Qe.join(e,".claude","commands","p"),Qe.join(e,".gemini","commands","p")];for(let i of r)try{(await Bn.stat(i).catch(()=>null))?.isDirectory()&&(await Bn.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Qe.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await Bn.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return Lg()}};c(Sl,"getProviderPaths");hC=new ln,He=hC});var Bg={};D(Bg,{PRJCT_HOOKS:()=>ko,install:()=>xl,status:()=>jl,uninstall:()=>Al});import El from"node:fs/promises";import yC from"node:os";import Ug from"node:path";function sr(){let s=process.env.HOME||yC.homedir();return Ug.join(s,".claude","settings.json")}async function Rl(){try{let s=await El.readFile(sr(),"utf-8"),e=JSON.parse(s);return e&&typeof e=="object"?e:{}}catch(s){if(s.code==="ENOENT")return{};throw s}}async function Wg(s){await El.mkdir(Ug.dirname(sr()),{recursive:!0}),await El.writeFile(sr(),`${JSON.stringify(s,null,2)}
23
+ `,"utf-8")}function Gg(s){let e=process.env.PRJCT_BIN??"prjct";return`command -v ${e} >/dev/null 2>&1 && ${e} hook ${s} || exit 0`}function Pl(s){return s[Cl]===!0}function wC(s){if(s[Cl]===!0)return!1;let e=s.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function Hg(s){let e={type:"command",command:Gg(s.subcommand),[Cl]:!0};return"ifClause"in s&&s.ifClause&&(e.if=s.ifClause),e}async function xl(){let s=await Rl(),e=s.hooks??{},t=0,n=0;for(let r of ko){let o=e[r.event]??[],i=Gg(r.subcommand),a=o.find(p=>(p.matcher??"")===r.matcher);a||(a={matcher:r.matcher,hooks:[]},o.push(a));let l=a.hooks.length;a.hooks=a.hooks.filter(p=>!wC(p));let u=l-a.hooks.length,d=a.hooks.find(p=>Pl(p));if(d){let p=Hg(r);d.command===p.command&&d.if===p.if&&u===0?n++:(d.command=p.command,d.if=p.if,t++)}else a.hooks.push(Hg(r)),t++;e[r.event]=o}return s.hooks=e,await Wg(s),{settingsPath:sr(),hooksWritten:t,alreadyPresent:n}}async function Al(){let s=await Rl();if(!s.hooks)return{settingsPath:sr(),hooksRemoved:0};let e=0;for(let[t,n]of Object.entries(s.hooks)){let r=[];for(let o of n){let i=o.hooks.filter(a=>Pl(a)?(e++,!1):!0);i.length>0&&r.push({...o,hooks:i})}r.length>0?s.hooks[t]=r:delete s.hooks[t]}return Object.keys(s.hooks).length===0&&delete s.hooks,await Wg(s),{settingsPath:sr(),hooksRemoved:e}}async function jl(){let e=(await Rl()).hooks??{},t=0;for(let n of Object.values(e))for(let r of n)for(let o of r.hooks)Pl(o)&&t++;return{installed:t,expected:ko.length}}var Cl,ko,$l=h(()=>{"use strict";c(sr,"settingsPath");Cl="_prjctManaged",ko=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(Rl,"readSettings");c(Wg,"writeSettings");c(Gg,"hookCommand");c(Pl,"isPrjctHook");c(wC,"isLegacyPrjctHook");c(Hg,"hookEntryFor");c(xl,"install");c(Al,"uninstall");c(jl,"status")});var Ml={};D(Ml,{isSyncCurrent:()=>_l,runSelfHeal:()=>Dl});import Il from"node:fs";import kC from"node:path";function vC(){try{return Il.readFileSync(qg(),"utf-8").trim()}catch{return null}}function bC(s){try{Il.mkdirSync(Vg(),{recursive:!0}),Il.writeFileSync(qg(),s,"utf-8")}catch{}}function _l(s){return s?vC()===s:!0}async function Dl(s){if(s&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(Wt(),Tl));await e()}catch{}try{await(await Promise.resolve().then(()=>($l(),Bg))).install()}catch{}bC(s)}}var Vg,qg,_i=h(()=>{"use strict";ge();Vg=c(()=>_.getStatePath(),"stampDir"),qg=c(()=>kC.join(Vg(),"installed-version"),"stampPath");c(vC,"readStamp");c(bC,"writeStamp");c(_l,"isSyncCurrent");c(Dl,"runSelfHeal")});var Ll={};D(Ll,{DAEMON_PATHS:()=>Ae,IDLE_TIMEOUT_MS:()=>Ol,MAX_BUFFER_SIZE:()=>Nl,encodeMessage:()=>ys});function ys(s){return Buffer.from(`${JSON.stringify(s)}
24
+ `)}var Ae,Ol,Nl,rr=h(()=>{"use strict";Ae={runDir:c(()=>`${process.env.HOME||qe("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:c(()=>`${Ae.runDir()}/daemon.sock`,"socket"),pid:c(()=>`${Ae.runDir()}/daemon.pid`,"pid"),log:c(()=>`${Ae.runDir()}/daemon.log`,"log")},Ol=30*60*1e3,Nl=1024*1024;c(ys,"encodeMessage")});function Jg(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Xg(){return Jg()==="bun"}function Fl(){if(Jg()==="bun")return!0;try{let{execSync:s}=qe("node:child_process");return s("bun --version",{stdio:"ignore"}),!0}catch{return!1}}var Hl=h(()=>{"use strict";c(Jg,"detectRuntime");c(Xg,"isBun");c(Fl,"isBunAvailable")});var Gt={};D(Gt,{executeViaDaemon:()=>EC,forceKillDaemon:()=>RC,getDaemonStatus:()=>TC,isDaemonRunning:()=>zg,sendRequest:()=>vo,spawnDaemon:()=>Kg,stopDaemon:()=>CC});import Di from"node:crypto";import Xe from"node:fs";import{connect as SC}from"node:net";async function zg(){let s=Ae.socket();if(!Xe.existsSync(s))return!1;try{return(await vo({id:Di.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Xe.unlinkSync(s)}catch{}return!1}}async function TC(){let s=Ae.socket(),e=Ae.pid();if(!Xe.existsSync(s))return{running:!1};try{let t=await vo({id:Di.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Xe.existsSync(e)?{running:!1,pid:parseInt(Xe.readFileSync(e,"utf-8").trim(),10),socketPath:s}:{running:!1}}function vo(s){return new Promise((e,t)=>{let n=Ae.socket(),r=SC(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(ys(s))}),r.on("data",l=>{o+=l.toString();let u=o.indexOf(`
25
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(p)}catch(p){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),r.on("error",l=>{i||(i=!0,clearTimeout(a),t(l))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function EC(s,e,t,n,r,o=!0){let i=Ae.socket();if(!Xe.existsSync(i))return o&&Kg().catch(()=>{}),null;try{return await vo({id:Di.randomUUID(),command:s,args:e,options:t,cwd:n,perfStartNs:r})}catch{return null}}async function CC(){try{return(await vo({id:Di.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function RC(){let s=Ae.pid(),e=Ae.socket(),t=!1;if(Xe.existsSync(s)){let n=parseInt(Xe.readFileSync(s,"utf-8").trim(),10);if(!Number.isNaN(n))try{process.kill(n,"SIGKILL"),t=!0}catch{}}try{Xe.existsSync(s)&&Xe.unlinkSync(s)}catch{}try{Xe.existsSync(e)&&Xe.unlinkSync(e)}catch{}return t}async function Kg(){let{spawn:s}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Xe.existsSync(t))o=t,i="bun";else if(Xe.existsSync(n))o=n,i=Fl()?"bun":"node";else if(Xe.existsSync(r))o=r,i=Fl()?"bun":"node";else return!1;let a=Ae.runDir();Xe.mkdirSync(a,{recursive:!0});let l=Ae.log(),u=Xe.openSync(l,"a");s(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Xe.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await zg())return!0;return!1}var Bt=h(()=>{"use strict";Hl();rr();c(zg,"isDaemonRunning");c(TC,"getDaemonStatus");c(vo,"sendRequest");c(EC,"executeViaDaemon");c(CC,"stopDaemon");c(RC,"forceKillDaemon");c(Kg,"spawnDaemon")});async function Mi(s){try{let{stdout:e}=await U(s,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function PC(){let s=await Mi("gh api user --jq .login");return s.success&&s.output||(s=await Mi("git config --global github.user"),s.success&&s.output)?s.output:null}async function xC(){let s=await Mi("git config user.name");return s.success&&s.output?s.output:null}async function AC(){let s=await Mi("git config user.email");return s.success&&s.output?s.output:null}async function or(){let[s,e,t]=await Promise.all([PC(),xC(),AC()]);return{github:s,email:t,name:e||s||"Unknown"}}var Oi=h(()=>{"use strict";Fe();c(Mi,"execCommand");c(PC,"detectGitHubUsername");c(xC,"detectGitName");c(AC,"detectGitEmail");c(or,"detect")});var ws={};D(ws,{default:()=>I});import Wl from"node:fs/promises";import jC from"node:path";import*as Ni from"jsonc-parser";function Yg(s){let e=[],t=Ni.parse(s,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Ni.printParseErrorCode(n.error)}`)}return t}var Gl,$C,I,re=h(()=>{"use strict";Gn();F();ue();V();We();Oi();ge();c(Yg,"parseJsonc");Gl=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=_.getLocalConfigPath(e),n=await Wl.readFile(t,"utf-8");return Yg(n)}catch(t){return L(t)||console.warn(`Warning: Could not read config at ${e}: ${Ge(t)}`),null}}async writeConfig(e,t){let n=_.getLocalConfigPath(e);await ke(n,t)}async readGlobalConfig(e){try{let t=_.getGlobalProjectConfigPath(e),n=await Wl.readFile(t,"utf-8");return Yg(n)}catch(t){return L(t)||console.warn(`Warning: Could not read global config for ${e}: ${Ge(t)}`),null}}async writeGlobalConfig(e,t){let n=_.getGlobalProjectConfigPath(e);await ke(n,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=R();t={projectId:e,authors:[],version:le,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=_.generateProjectId(e),r=_.getGlobalProjectPath(n),o=_.getDisplayPath(r),i=R(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:le,created:i,lastSync:i};return await this.writeGlobalConfig(n,l),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=R(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await _.hasLegacyStructure(e))return!1;if(!await _.hasConfig(e))return!0;let r=await this.readConfig(e);if(!r||!r.projectId)return!0;let o=_.getGlobalProjectPath(r.projectId);try{return(await Wl.readdir(jC.join(o,"core"))).length===0}catch(i){return L(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:n}=await Promise.resolve().then(()=>(wi(),yi));if(await n.detect(e)){let o=await n.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return""}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(r=>r.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=R();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let r=n.authors.find(o=>o.github===t);r&&(r.lastActivity=R(),n.lastSync=r.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await or(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=_.generateProjectId(e);return{projectId:n,dataPath:_.getDisplayPath(_.getGlobalProjectPath(n))}}},$C=new Gl,I=$C});var Qg={};D(Qg,{default:()=>bo});import Bl from"node:fs/promises";import IC from"node:path";var Vl,_C,bo,Li=h(()=>{"use strict";F();V();ge();Vl=class{static{c(this,"EditorsConfig")}get configDir(){return _.globalConfigDir}get configFile(){return IC.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Bl.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",b(e))}}async loadConfig(){try{let e=await Bl.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",b(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let r={version:e,provider:n,lastInstall:new Date().toISOString(),path:t};return await ke(this.configFile,r),!0}catch(r){return console.error("[editors-config] Error saving config:",b(r)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await ke(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",b(t)),!1}}async configExists(){return C(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Bl.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",b(e)),!1}}},_C=new Vl,bo=_C});import ks from"chalk";var Zg,DC,MC,Vt,ef=h(()=>{"use strict";rt();Zg=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],DC=80,MC={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Zg,speed:DC},cli:{header:c(()=>`${ks.cyan.bold("\u26A1")} ${ks.cyan("prjct")}`,"header"),footer:c(()=>ks.dim("\u26A1 prjct"),"footer"),spin:c((s,e)=>`${ks.cyan("\u26A1")} ${ks.cyan("prjct")} ${ks.cyan(Zg[s%10])} ${ks.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:c((s="claude")=>Ti(s).commitFooter,"getCommitFooter"),getSignature:c((s="claude")=>Ti(s).signature,"getSignature")},Vt=MC});function ir(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return OC[s]}var OC,Ot,Fi=h(()=>{"use strict";OC={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};c(ir,"getTimeout");Ot={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80}});var tf,nf=h(()=>{"use strict";tf={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'prjct linear setup' to configure Linear MCP"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function So(s,e){return{...tf[s],...e}}function Hi(s,e,t){return{message:s,hint:e,...t}}var Ui=h(()=>{"use strict";nf();c(So,"getError");c(Hi,"createError")});var rf={};D(rf,{OUTPUT_TIERS:()=>sf,default:()=>f,formatForHuman:()=>HC,getOutputTier:()=>LC,getTierConfig:()=>Gi,limitLines:()=>Wi,setOutputTier:()=>NC,setQuietMode:()=>FC});import de from"chalk";function NC(s){cr=s}function LC(){return cr}function Gi(){return sf[cr]}function FC(s){yt=s}function Wi(s,e){let t=e??Gi().maxLines;if(t===1/0||t===0)return s;let n=s.split(`
26
26
  `);if(n.length<=t)return s;let r=n.slice(0,t),o=n.length-t;return`${r.join(`
27
27
  `)}
28
- ${de.dim(`...${o} more lines`)}`}function HC(s){let e=Wi();if(cr==="silent")return"";if(cr==="verbose")return JSON.stringify(s,null,2);if(typeof s!="object"||s===null)return Nt(String(s),e.maxCharsPerLine);let t=s;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Nt(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&cr==="compact"&&o.push(de.dim(String(t.url))),Ui(o.join(`
28
+ ${de.dim(`...${o} more lines`)}`}function HC(s){let e=Gi();if(cr==="silent")return"";if(cr==="verbose")return JSON.stringify(s,null,2);if(typeof s!="object"||s===null)return Nt(String(s),e.maxCharsPerLine);let t=s;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Nt(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&cr==="compact"&&o.push(de.dim(String(t.url))),Wi(o.join(`
29
29
  `),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let l=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${Nt(String(a.title),Ot.ISSUE_TITLE)}${l}`});return o.length>e.maxLines&&i.push(de.dim(`...${o.length-e.maxLines} more`)),i.join(`
30
- `)}let r=["id","name","title","status","message","success","error"].filter(o=>o in t);return r.length>0?Ui(r.map(o=>`${o}: ${Nt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
31
- `),e.maxLines):Ui(JSON.stringify(s,null,2),e.maxLines)}var UN,Vl,sf,cr,vs,ar,ql,yt,Nt,UC,WC,f,pe=h(()=>{"use strict";ef();Li();Hi();UN=Vt.spinner.frames,Vl=Vt.spinner.speed,sf={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},cr="compact";c(NC,"setOutputTier");c(LC,"getOutputTier");c(Wi,"getTierConfig");vs={success:de.green("\u2713"),fail:de.red("\u2717"),warn:de.yellow("\u26A0"),info:de.blue("\u2139"),debug:de.dim("\u{1F527}"),bullet:de.dim("\u2022"),arrow:de.dim("\u2192"),check:de.green("\u2713"),cross:de.red("\u2717"),spinner:de.cyan("\u25D0")},ar=null,ql=0,yt=!1;c(FC,"setQuietMode");Nt=c((s,e)=>{let t=e??(Wi().maxCharsPerLine||Ot.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate");c(Ui,"limitLines");c(HC,"formatForHuman");UC=c(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ot.CLEAR_WIDTH)}\r`):!0,"clear"),WC={start(){return yt||console.log(Vt.cli.header()),this},end(){return yt||console.log(Vt.cli.footer()),this},spin(s){return yt?this:(this.stop(),process.stdout.isTTY?(ar=setInterval(()=>{process.stdout.write(`\r${Vt.cli.spin(ql++,Nt(s,Ot.SPINNER_MSG))}`)},Vl),this):(process.stdout.write(`${Vt.cli.spin(0,Nt(s,Ot.SPINNER_MSG))}
30
+ `)}let r=["id","name","title","status","message","success","error"].filter(o=>o in t);return r.length>0?Wi(r.map(o=>`${o}: ${Nt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
31
+ `),e.maxLines):Wi(JSON.stringify(s,null,2),e.maxLines)}var GN,ql,sf,cr,vs,ar,Jl,yt,Nt,UC,WC,f,pe=h(()=>{"use strict";ef();Fi();Ui();GN=Vt.spinner.frames,ql=Vt.spinner.speed,sf={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},cr="compact";c(NC,"setOutputTier");c(LC,"getOutputTier");c(Gi,"getTierConfig");vs={success:de.green("\u2713"),fail:de.red("\u2717"),warn:de.yellow("\u26A0"),info:de.blue("\u2139"),debug:de.dim("\u{1F527}"),bullet:de.dim("\u2022"),arrow:de.dim("\u2192"),check:de.green("\u2713"),cross:de.red("\u2717"),spinner:de.cyan("\u25D0")},ar=null,Jl=0,yt=!1;c(FC,"setQuietMode");Nt=c((s,e)=>{let t=e??(Gi().maxCharsPerLine||Ot.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate");c(Wi,"limitLines");c(HC,"formatForHuman");UC=c(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ot.CLEAR_WIDTH)}\r`):!0,"clear"),WC={start(){return yt||console.log(Vt.cli.header()),this},end(){return yt||console.log(Vt.cli.footer()),this},spin(s){return yt?this:(this.stop(),process.stdout.isTTY?(ar=setInterval(()=>{process.stdout.write(`\r${Vt.cli.spin(Jl++,Nt(s,Ot.SPINNER_MSG))}`)},ql),this):(process.stdout.write(`${Vt.cli.spin(0,Nt(s,Ot.SPINNER_MSG))}
32
32
  `),this))},done(s,e){if(this.stop(),!yt){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=de.dim(` [${n.join(" | ")}]`))}console.log(`${vs.success} ${Nt(s,Ot.DONE_MSG)}${t}`)}return this},fail(s){return this.stop(),console.error(`${vs.fail} ${Nt(s,Ot.FAIL_MSG)}`),this},failWithHint(s){this.stop();let e=typeof s=="string"?So(s):s;return console.error(),console.error(`${vs.fail} ${e.message}`),e.file&&console.error(de.dim(` File: ${e.file}`)),e.hint&&console.error(de.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(de.dim(` Docs: ${e.docs}`)),console.error(),this},warn(s){return this.stop(),yt||console.log(`${vs.warn} ${Nt(s,Ot.WARN_MSG)}`),this},info(s){return this.stop(),yt||console.log(`${vs.info} ${s}`),this},debug(s){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!yt&&e&&console.log(`${vs.debug} ${de.dim(s)}`),this},success(s,e){return this.done(s,e)},list(s,e={}){if(this.stop(),yt)return this;let t=e.bullet||vs.bullet,n=" ".repeat(e.indent||0);for(let r of s)console.log(`${n}${t} ${r}`);return this},table(s,e={}){if(this.stop(),yt||s.length===0)return this;let t=Object.keys(s[0]),n={};for(let r of t){n[r]=r.length;for(let o of s){let i=String(o[r]??"");i.length>n[r]&&(n[r]=i.length)}}if(e.header!==!1){let r=t.map(o=>o.padEnd(n[o])).join(" ");console.log(de.dim(r)),console.log(de.dim("\u2500".repeat(r.length)))}for(let r of s){let o=t.map(i=>String(r[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(s,e){if(this.stop(),yt)return this;let t=e.split(`
33
33
  `),n=Math.max(s.length,...t.map(o=>o.length)),r="\u2500".repeat(n+2);console.log(de.dim(`\u250C${r}\u2510`)),console.log(`${de.dim("\u2502")} ${de.bold(s.padEnd(n))} ${de.dim("\u2502")}`),console.log(de.dim(`\u251C${r}\u2524`));for(let o of t)console.log(`${de.dim("\u2502")} ${o.padEnd(n)} ${de.dim("\u2502")}`);return console.log(de.dim(`\u2514${r}\u2518`)),this},section(s){return this.stop(),yt?this:(console.log(`
34
- ${de.bold(s)}`),console.log(de.dim("\u2500".repeat(s.length))),this)},stop(){return ar&&(clearInterval(ar),ar=null,UC()),this},step(s,e,t){if(yt)return this;this.stop();let n=de.dim(`[${s}/${e}]`);return process.stdout.isTTY?(ar=setInterval(()=>{process.stdout.write(`\r${Vt.cli.spin(ql++,`${n} ${Nt(t,Ot.STEP_MSG)}`)}`)},Vl),this):(process.stdout.write(`${Vt.cli.spin(0,`${n} ${Nt(t,Ot.STEP_MSG)}`)}
35
- `),this)},progress(s,e,t){if(yt)return this;this.stop();let n=Math.round(s/e*100),r=Math.round(n/10),o=10-r,i=de.cyan("\u2588".repeat(r))+de.dim("\u2591".repeat(o)),a=t?` ${Nt(t,Ot.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(ar=setInterval(()=>{process.stdout.write(`\r${Vt.cli.spin(ql++,`[${i}] ${n}%${a}`)}`)},Vl),this):(process.stdout.write(`${Vt.cli.spin(0,`[${i}] ${n}%${a}`)}
34
+ ${de.bold(s)}`),console.log(de.dim("\u2500".repeat(s.length))),this)},stop(){return ar&&(clearInterval(ar),ar=null,UC()),this},step(s,e,t){if(yt)return this;this.stop();let n=de.dim(`[${s}/${e}]`);return process.stdout.isTTY?(ar=setInterval(()=>{process.stdout.write(`\r${Vt.cli.spin(Jl++,`${n} ${Nt(t,Ot.STEP_MSG)}`)}`)},ql),this):(process.stdout.write(`${Vt.cli.spin(0,`${n} ${Nt(t,Ot.STEP_MSG)}`)}
35
+ `),this)},progress(s,e,t){if(yt)return this;this.stop();let n=Math.round(s/e*100),r=Math.round(n/10),o=10-r,i=de.cyan("\u2588".repeat(r))+de.dim("\u2591".repeat(o)),a=t?` ${Nt(t,Ot.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(ar=setInterval(()=>{process.stdout.write(`\r${Vt.cli.spin(Jl++,`[${i}] ${n}%${a}`)}`)},ql),this):(process.stdout.write(`${Vt.cli.spin(0,`[${i}] ${n}%${a}`)}
36
36
  `),this)}},f=WC});var of,af=h(()=>{"use strict";of=`
37
37
  -- =======================================================================
38
38
  -- Document storage (backward-compatible with JSON file pattern)
@@ -553,34 +553,34 @@ CREATE TABLE velocity_sprints (
553
553
  applied_at TEXT NOT NULL,
554
554
  PRIMARY KEY (entity_type, entity_id)
555
555
  );
556
- `)},"up")}]});function Gi(s){let e=GC(s);return e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA busy_timeout = 5000"),e}function GC(s){if(Xg()){let{Database:r}=qe("bun:sqlite");return new r(s,{create:!0})}let e=qe("better-sqlite3"),t=new e(s),n=t.exec.bind(t);return t.run=r=>n(r),t}var Jl=h(()=>{"use strict";Fl();c(Gi,"openDatabase");c(GC,"openRaw")});var bs={};D(bs,{PrjctDatabase:()=>Bi,default:()=>A,prjctDb:()=>j});import Xl from"node:fs";import uf from"node:path";function df(s,e){let t=s.transaction(e);return typeof t.immediate=="function"?t.immediate(s):t(s)}var BC,Bi,j,A,Y=h(()=>{"use strict";ge();lf();Jl();c(df,"runImmediate");BC=3,Bi=class{static{c(this,"PrjctDatabase")}connections=new Map;accessOrder=[];statementCache=new WeakMap;prepareCached(e,t){let n=this.statementCache.get(e);n||(n=new Map,this.statementCache.set(e,n));let r=n.get(t);if(r)return r;let o=e.prepare(t);return n.set(t,o),o}getDbPath(e){return uf.join(_.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=BC&&this.evictLru();let n=this.getDbPath(e),r=uf.dirname(n);Xl.existsSync(r)||Xl.mkdirSync(r,{recursive:!0});let o=Gi(n);return o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(this.statementCache.delete(t),t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(n=>n!==e))}else this.connections.forEach(t=>{this.statementCache.delete(t),t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(this.statementCache.delete(t),t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{this.prepareCached(t,"PRAGMA wal_checkpoint(PASSIVE)").get()}catch{}}exists(e){return Xl.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e),r=this.prepareCached(n,"SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,n){let r=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();this.prepareCached(r,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}getDocWithStamp(e,t){let n=this.getDb(e),r=this.prepareCached(n,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(t);return r?{data:JSON.parse(r.data),updatedAt:r.updated_at}:null}nextKvStamp(e,t){let n=this.prepareCached(e,"SELECT updated_at FROM kv_store WHERE key = ?").get(t),r=new Date().toISOString(),o=n?.updated_at;return!o||r>o?r:new Date(new Date(o).getTime()+1).toISOString()}casSetDoc(e,t,n,r){let o=this.getDb(e),i=JSON.stringify(n),a=this.nextKvStamp(o,t);return r===null?this.prepareCached(o,"INSERT INTO kv_store (key, data, updated_at) VALUES (?, ?, ?) ON CONFLICT(key) DO NOTHING").run(t,i,a).changes===1:this.prepareCached(o,"UPDATE kv_store SET data = ?, updated_at = ? WHERE key = ? AND updated_at = ?").run(i,a,t,r).changes===1}deleteDoc(e,t){let n=this.getDb(e);this.prepareCached(n,"DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){let n=this.getDb(e);return this.prepareCached(n,"SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}listDocsByPrefix(e,t){let n=this.getDb(e);return this.prepareCached(n,"SELECT key, data FROM kv_store WHERE key LIKE ? || '%' ORDER BY key").all(t).map(o=>({key:o.key,data:JSON.parse(o.data)}))}appendEvent(e,t,n,r){let o=this.getDb(e),i=new Date().toISOString();this.prepareCached(o,"INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let r=this.getDb(e);return t?this.prepareCached(r,"SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):this.prepareCached(r,"SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).all(...n)}run(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).run(...n)}get(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return df(n,t)}runMigrations(e){e.run(`
556
+ `)},"up")}]});function Bi(s){let e=GC(s);return e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA busy_timeout = 5000"),e}function GC(s){if(Xg()){let{Database:r}=qe("bun:sqlite");return new r(s,{create:!0})}let e=qe("better-sqlite3"),t=new e(s),n=t.exec.bind(t);return t.run=r=>n(r),t}var Xl=h(()=>{"use strict";Hl();c(Bi,"openDatabase");c(GC,"openRaw")});var bs={};D(bs,{PrjctDatabase:()=>Vi,default:()=>A,prjctDb:()=>j});import zl from"node:fs";import uf from"node:path";function df(s,e){let t=s.transaction(e);return typeof t.immediate=="function"?t.immediate(s):t(s)}var BC,Vi,j,A,Y=h(()=>{"use strict";ge();lf();Xl();c(df,"runImmediate");BC=3,Vi=class{static{c(this,"PrjctDatabase")}connections=new Map;accessOrder=[];statementCache=new WeakMap;prepareCached(e,t){let n=this.statementCache.get(e);n||(n=new Map,this.statementCache.set(e,n));let r=n.get(t);if(r)return r;let o=e.prepare(t);return n.set(t,o),o}getDbPath(e){return uf.join(_.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=BC&&this.evictLru();let n=this.getDbPath(e),r=uf.dirname(n);zl.existsSync(r)||zl.mkdirSync(r,{recursive:!0});let o=Bi(n);return o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(this.statementCache.delete(t),t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(n=>n!==e))}else this.connections.forEach(t=>{this.statementCache.delete(t),t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(this.statementCache.delete(t),t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{this.prepareCached(t,"PRAGMA wal_checkpoint(PASSIVE)").get()}catch{}}exists(e){return zl.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e),r=this.prepareCached(n,"SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,n){let r=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();this.prepareCached(r,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}getDocWithStamp(e,t){let n=this.getDb(e),r=this.prepareCached(n,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(t);return r?{data:JSON.parse(r.data),updatedAt:r.updated_at}:null}nextKvStamp(e,t){let n=this.prepareCached(e,"SELECT updated_at FROM kv_store WHERE key = ?").get(t),r=new Date().toISOString(),o=n?.updated_at;return!o||r>o?r:new Date(new Date(o).getTime()+1).toISOString()}casSetDoc(e,t,n,r){let o=this.getDb(e),i=JSON.stringify(n),a=this.nextKvStamp(o,t);return r===null?this.prepareCached(o,"INSERT INTO kv_store (key, data, updated_at) VALUES (?, ?, ?) ON CONFLICT(key) DO NOTHING").run(t,i,a).changes===1:this.prepareCached(o,"UPDATE kv_store SET data = ?, updated_at = ? WHERE key = ? AND updated_at = ?").run(i,a,t,r).changes===1}deleteDoc(e,t){let n=this.getDb(e);this.prepareCached(n,"DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){let n=this.getDb(e);return this.prepareCached(n,"SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}listDocsByPrefix(e,t){let n=this.getDb(e);return this.prepareCached(n,"SELECT key, data FROM kv_store WHERE key LIKE ? || '%' ORDER BY key").all(t).map(o=>({key:o.key,data:JSON.parse(o.data)}))}appendEvent(e,t,n,r){let o=this.getDb(e),i=new Date().toISOString();this.prepareCached(o,"INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let r=this.getDb(e);return t?this.prepareCached(r,"SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):this.prepareCached(r,"SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).all(...n)}run(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).run(...n)}get(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return df(n,t)}runMigrations(e){e.run(`
557
557
  CREATE TABLE IF NOT EXISTS _migrations (
558
558
  version INTEGER PRIMARY KEY,
559
559
  name TEXT NOT NULL,
560
560
  applied_at TEXT NOT NULL
561
561
  )
562
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of cf)t.has(n.version)||df(e,()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},j=new Bi,A=j});var gf={};D(gf,{default:()=>qC,sessionTracker:()=>lr});var pf,mf,zl,lr,qC,Kl=h(()=>{"use strict";wi();Y();ho();ue();pf=50,mf=200,zl=class{static{c(this,"SessionTracker")}async read(e){try{return j.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){j.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Ys(e.lastActivity,t)}async touch(e){let t=await this.read(e),n=R();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let r={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=r,await this.write(e,t),r}async trackCommand(e,t,n){let r=await this.read(e);if(!r.current)return;let o=R();r.current.lastActivity=o,r.current.commands.push({command:t,timestamp:o,durationMs:n}),r.current.commands.length>pf&&(r.current.commands=r.current.commands.slice(-pf)),await this.write(e,r)}async trackFile(e,t,n){let r=await this.read(e);if(!r.current)return;let o=R();r.current.lastActivity=o,r.current.files.push({path:t,operation:n,timestamp:o}),r.current.files.length>mf&&(r.current.files=r.current.files.slice(-mf)),await this.write(e,r)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,r=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=r-i,l=t.config.idleTimeoutMs,u=Math.max(0,l-a),d=n.commands.map(g=>g.command),p=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:po(r-o),idleSince:n.lastActivity,idleMs:a,expiresIn:po(u),commandCount:n.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},lr=new zl,qC=lr});var hf={};D(hf,{default:()=>To,performanceTracker:()=>ff});var JC,Yl,ff,To,Ql=h(()=>{"use strict";Y();JC=BigInt(5*60*1e9),Yl=class{static{c(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,n]of this.marks)e-n>JC&&this.marks.delete(t)}recordTiming(e,t,n,r){A.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:r})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),r=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of r)A.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){A.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){A.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return A.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let r=this.getMetrics(e,n),o={period:`${t}d`},i=r.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,k)=>g+k,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=r.filter(m=>"metric"in m&&m.metric==="heap_used"),l=r.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=c(E=>Math.round(E/1048576*10)/10,"toMB"),g=a.map(E=>E.value),k=l.map(E=>E.value);o.memory={avgHeapMB:m(g.reduce((E,y)=>E+y,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:k.length>0?m(k.reduce((E,y)=>E+y,0)/k.length):0}}let u=r.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=r.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=r.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let k=g.context?.command||"unknown";m[k]||(m[k]=[]),m[k].push(g.value)}o.commandDurations={};for(let[g,k]of Object.entries(m))o.commandDurations[g]={avg:Math.round(k.reduce((E,y)=>E+y,0)/k.length),min:Math.min(...k),max:Math.max(...k),count:k.length,unit:"ms"}}return o}},ff=new Yl,To=ff});import Lt from"node:fs/promises";import qt from"node:path";var Zl,XC,ze,yf=h(()=>{"use strict";F();Fe();V();Zl=class{static{c(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=qt.join(this.projectPath,"package.json"),t=await Lt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(L(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=qt.join(this.projectPath,"Cargo.toml");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readRequirements(){try{let e=qt.join(this.projectPath,"requirements.txt");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readGoMod(){try{let e=qt.join(this.projectPath,"go.mod");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readGemfile(){try{let e=qt.join(this.projectPath,"Gemfile");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readMixExs(){try{let e=qt.join(this.projectPath,"mix.exs");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readPomXml(){try{let e=qt.join(this.projectPath,"pom.xml");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readComposerJson(){try{let e=qt.join(this.projectPath,"composer.json"),t=await Lt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(L(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=qt.join(this.projectPath,"pyproject.toml");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await U('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
562
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of cf)t.has(n.version)||df(e,()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},j=new Vi,A=j});var gf={};D(gf,{default:()=>qC,sessionTracker:()=>lr});var pf,mf,Kl,lr,qC,Yl=h(()=>{"use strict";ki();Y();ho();ue();pf=50,mf=200,Kl=class{static{c(this,"SessionTracker")}async read(e){try{return j.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){j.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Ys(e.lastActivity,t)}async touch(e){let t=await this.read(e),n=R();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let r={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=r,await this.write(e,t),r}async trackCommand(e,t,n){let r=await this.read(e);if(!r.current)return;let o=R();r.current.lastActivity=o,r.current.commands.push({command:t,timestamp:o,durationMs:n}),r.current.commands.length>pf&&(r.current.commands=r.current.commands.slice(-pf)),await this.write(e,r)}async trackFile(e,t,n){let r=await this.read(e);if(!r.current)return;let o=R();r.current.lastActivity=o,r.current.files.push({path:t,operation:n,timestamp:o}),r.current.files.length>mf&&(r.current.files=r.current.files.slice(-mf)),await this.write(e,r)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,r=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=r-i,l=t.config.idleTimeoutMs,u=Math.max(0,l-a),d=n.commands.map(g=>g.command),p=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:po(r-o),idleSince:n.lastActivity,idleMs:a,expiresIn:po(u),commandCount:n.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},lr=new Kl,qC=lr});var hf={};D(hf,{default:()=>To,performanceTracker:()=>ff});var JC,Ql,ff,To,Zl=h(()=>{"use strict";Y();JC=BigInt(5*60*1e9),Ql=class{static{c(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,n]of this.marks)e-n>JC&&this.marks.delete(t)}recordTiming(e,t,n,r){A.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:r})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),r=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of r)A.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){A.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){A.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return A.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let r=this.getMetrics(e,n),o={period:`${t}d`},i=r.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,k)=>g+k,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=r.filter(m=>"metric"in m&&m.metric==="heap_used"),l=r.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=c(E=>Math.round(E/1048576*10)/10,"toMB"),g=a.map(E=>E.value),k=l.map(E=>E.value);o.memory={avgHeapMB:m(g.reduce((E,y)=>E+y,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:k.length>0?m(k.reduce((E,y)=>E+y,0)/k.length):0}}let u=r.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=r.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=r.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let k=g.context?.command||"unknown";m[k]||(m[k]=[]),m[k].push(g.value)}o.commandDurations={};for(let[g,k]of Object.entries(m))o.commandDurations[g]={avg:Math.round(k.reduce((E,y)=>E+y,0)/k.length),min:Math.min(...k),max:Math.max(...k),count:k.length,unit:"ms"}}return o}},ff=new Ql,To=ff});import Lt from"node:fs/promises";import qt from"node:path";var eu,XC,ze,yf=h(()=>{"use strict";F();Fe();V();eu=class{static{c(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=qt.join(this.projectPath,"package.json"),t=await Lt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(L(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=qt.join(this.projectPath,"Cargo.toml");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readRequirements(){try{let e=qt.join(this.projectPath,"requirements.txt");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readGoMod(){try{let e=qt.join(this.projectPath,"go.mod");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readGemfile(){try{let e=qt.join(this.projectPath,"Gemfile");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readMixExs(){try{let e=qt.join(this.projectPath,"mix.exs");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readPomXml(){try{let e=qt.join(this.projectPath,"pom.xml");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async readComposerJson(){try{let e=qt.join(this.projectPath,"composer.json"),t=await Lt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(L(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=qt.join(this.projectPath,"pyproject.toml");return await Lt.readFile(e,"utf-8")}catch(e){if(L(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await U('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
563
563
  `).filter(Boolean).forEach(n=>{let r=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);r&&(t[r[2]]=parseInt(r[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Lt.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(r=>r.test(n)))}catch(e){if(L(e))return[];throw e}}async listDirectories(){try{return(await Lt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(L(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await U(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await U("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await U('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await U('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await U('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){return C(qt.join(this.projectPath,e))}async readFile(e){try{let t=qt.join(this.projectPath,e);return await Lt.readFile(t,"utf-8")}catch(t){if(L(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await U(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
564
- `).filter(Boolean)}catch{return[]}}},XC=new Zl,ze=XC});function wf(s,e){let t=[];Eo("Languages",s.languages,e.languages,t),Eo("Frameworks",s.frameworks,e.frameworks,t),(s.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:s.packageManager??"(none)",after:e.packageManager??"(none)"}),(s.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:s.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(s.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:s.testDir??"(none)",after:e.testDir??"(none)"}),Eo("Config files",s.configFiles,e.configFiles,t),s.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(s.fileCount),after:String(e.fileCount)});let n=s.patterns.map(d=>d.name),r=e.patterns.map(d=>d.name);Eo("Patterns",n,r,t);let o=s.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Eo("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,l=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:l,changed:u},beforeCommit:s.commitHash??null,afterCommit:e.commitHash??null}}function Vi(s){if(!s.hasChanges)return`## Analysis Diff
564
+ `).filter(Boolean)}catch{return[]}}},XC=new eu,ze=XC});function wf(s,e){let t=[];Eo("Languages",s.languages,e.languages,t),Eo("Frameworks",s.frameworks,e.frameworks,t),(s.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:s.packageManager??"(none)",after:e.packageManager??"(none)"}),(s.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:s.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(s.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:s.testDir??"(none)",after:e.testDir??"(none)"}),Eo("Config files",s.configFiles,e.configFiles,t),s.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(s.fileCount),after:String(e.fileCount)});let n=s.patterns.map(d=>d.name),r=e.patterns.map(d=>d.name);Eo("Patterns",n,r,t);let o=s.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Eo("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,l=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:l,changed:u},beforeCommit:s.commitHash??null,afterCommit:e.commitHash??null}}function qi(s){if(!s.hasChanges)return`## Analysis Diff
565
565
 
566
566
  No changes between runs.`;let e=[];e.push("## Analysis Diff"),(s.beforeCommit||s.afterCommit)&&e.push(`> \`${s.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${s.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let n of s.items){let r=n.type==="added"?"+":n.type==="removed"?"-":"~",o=n.type==="changed"?`${n.before} \u2192 ${n.after}`:n.after??n.before??"";e.push(`| ${r} | ${n.field} | ${o} |`)}e.push("");let t=[];return s.summary.added>0&&t.push(`${s.summary.added} added`),s.summary.removed>0&&t.push(`${s.summary.removed} removed`),s.summary.changed>0&&t.push(`${s.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
567
567
  `)}function kf(s){if(!s.hasChanges)return"No changes between analysis runs.";let e=[];(s.beforeCommit||s.afterCommit)&&(e.push(` ${s.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${s.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of s.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
568
- `)}function Eo(s,e,t,n){let r=new Set(e),o=new Set(t);for(let i of t)r.has(i)||n.push({field:s,type:"added",after:i});for(let i of e)o.has(i)||n.push({field:s,type:"removed",before:i})}var qi=h(()=>{"use strict";c(wf,"generateAnalysisDiff");c(Vi,"formatAnalysisDiffMd");c(kf,"formatAnalysisDiffText");c(Eo,"diffStringArray")});var eu=h(()=>{"use strict"});import zC from"node:fs/promises";import KC from"node:path";function ur(s){return s.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function YC(s,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of n)t.push(...ur(m));let r=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of r){let g;for(;(g=m.exec(s))!==null;)g[1]&&t.push(...ur(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(s))!==null;)g[1]&&t.push(...ur(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(s))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...ur(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...ur(g))}}let l=/\/\/\s*(.+)/g,u;for(;(u=l.exec(s))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(s))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!Sf.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function QC(s){return s.split(/\s+/).flatMap(e=>ur(e)).filter(e=>e.length>1&&!Sf.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function ZC(s){let e=await wn(s),t={},n={},r=0,o=await us(e,50,async a=>{try{let l=await zC.readFile(KC.join(s,a),"utf-8"),u=YC(l,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:l}of o){t[a]={tokens:l,length:l.length},r+=l.length;let u=new Map;for(let d of l)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)n[d]||(n[d]=[]),n[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function eR(s,e){return Math.log((e-s+.5)/(s+.5)+1)}function tR(s,e){let t=QC(s);if(t.length===0)return[];let n=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=eR(o.length,e.totalDocs);for(let{path:a,tf:l}of o){let u=e.documents[a];if(!u)continue;let d=l*(1.2+1),p=l+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);n.set(a,(n.get(a)||0)+m)}}return Array.from(n.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function nR(s,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,r])=>[n,r.length]))};A.setDoc(s,tu,t),Ji.delete(s)}function Xi(s){let e=A.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",tu);if(!e)return Ji.delete(s),null;let t=Ji.get(s);if(t&&t.updatedAt===e.updated_at)return t.index;let n=A.getDoc(s,tu);if(!n)return null;let r={};for(let[i,a]of Object.entries(n.docLengths))r[i]={tokens:[],length:a};let o={documents:r,invertedIndex:n.invertedIndex,avgDocLength:n.avgDocLength,totalDocs:n.totalDocs,builtAt:n.builtAt};return Ji.set(s,{index:o,updatedAt:e.updated_at}),o}async function Tf(s,e){let t=await ZC(s);return nR(e,t),t}function Ef(s,e,t=15){let n=Xi(s);return n?tR(e,n).slice(0,t):[]}var Sf,tu,Ji,zi=h(()=>{"use strict";eu();Y();V();Sf=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);c(ur,"splitIdentifier");c(YC,"tokenizeFile");c(QC,"tokenizeQuery");c(ZC,"buildIndex");c(eR,"idf");c(tR,"score");tu="bm25-index",Ji=new Map;c(nR,"saveIndex");c(Xi,"loadIndex");c(Tf,"indexProject");c(Ef,"queryFiles")});import nu from"node:fs/promises";import Vn from"node:path";import{z as Z}from"zod";async function aR(s,e){let t=Date.now();if(s.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=Vn.join(e,"package.json"),r=await nu.readFile(n,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],l=[];for(let u of s.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?l.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${l.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return L(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function cR(s,e){let t=Date.now();if(s.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await pR(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let l=iR[a];if(!l)continue;l.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function lR(s,e){let t=Date.now(),n=s.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of n){let a=i.location,l=Vn.join(e,a);await C(l)?o.push(a):r.push(`${i.name} (${a})`)}return r.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function uR(s,e){let t=Date.now();try{let n=await mR(e),r=s.fileCount,o=.1,i=Math.abs(n-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function dR(s,e){let t=Date.now();if(s.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],r=[];for(let o of s.antiPatterns){let i=Vn.join(e,o.file);await C(i)?r.push(o.file):n.push(`${o.issue} (${o.file})`)}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Cf(s,e){let t=Date.now(),n=await Promise.all([aR(s,e),cR(s,e),lR(s,e),uR(s,e),dR(s,e)]),r=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:r===0,checks:n,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function pR(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await nu.readdir(r,{withFileTypes:!0});for(let i of o){let a=Vn.join(r,i.name),l=Vn.relative(s,a);if(!t.some(u=>u.test(l))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Vn.extname(i.name);u&&e.add(u)}}}}catch{}}return c(n,"scanDir"),await n(s),Array.from(e)}async function mR(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await nu.readdir(r,{withFileTypes:!0});for(let i of o){let a=Vn.join(r,i.name),l=Vn.relative(s,a);t.some(u=>u.test(l))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return c(n,"scanDir"),await n(s),e}var sR,rR,oR,su,iR,Rf=h(()=>{"use strict";F();V();fo();sR=Z.enum(["draft","verified","sealed"]),rR=Z.object({name:Z.string(),description:Z.string(),location:Z.string().optional(),severity:Z.enum(["low","medium","high"]).optional(),language:Z.string().optional(),framework:Z.string().optional(),source:Z.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Z.number().min(0).max(1).optional()}),oR=Z.object({issue:Z.string(),file:Z.string(),suggestion:Z.string(),severity:Z.enum(["low","medium","high"]).optional(),language:Z.string().optional(),framework:Z.string().optional(),source:Z.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Z.number().min(0).max(1).optional()}),su=Z.object({projectId:Z.string(),languages:Z.array(Z.string()),frameworks:Z.array(Z.string()),packageManager:Z.string().optional(),sourceDir:Z.string().optional(),testDir:Z.string().optional(),configFiles:Z.array(Z.string()),fileCount:Z.number(),patterns:Z.array(rR),antiPatterns:Z.array(oR),analyzedAt:Z.string(),modelMetadata:go.optional(),status:sR.default("draft"),commitHash:Z.string().optional(),signature:Z.string().optional(),sealedAt:Z.string().optional(),verifiedAt:Z.string().optional()}),iR={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};c(aR,"verifyFrameworks");c(cR,"verifyLanguages");c(lR,"verifyPatternLocations");c(uR,"verifyFileCount");c(dR,"verifyAntiPatternFiles");c(Cf,"semanticVerify");c(pR,"getProjectExtensions");c(mR,"countProjectFiles")});import{createHash as gR}from"node:crypto";function Co(s){return gR("sha256").update(s).digest("hex")}function Pf(s){return Co(s).slice(0,16)}var Ki=h(()=>{"use strict";c(Co,"sha256");c(Pf,"sha256Short")});var ru,Ss,xf=h(()=>{"use strict";ue();Y();ru=class{static{c(this,"SyncPendingStorage")}append(e,t){let n=R(),r=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&A.run(e,`DELETE FROM sync_pending
568
+ `)}function Eo(s,e,t,n){let r=new Set(e),o=new Set(t);for(let i of t)r.has(i)||n.push({field:s,type:"added",after:i});for(let i of e)o.has(i)||n.push({field:s,type:"removed",before:i})}var Ji=h(()=>{"use strict";c(wf,"generateAnalysisDiff");c(qi,"formatAnalysisDiffMd");c(kf,"formatAnalysisDiffText");c(Eo,"diffStringArray")});var tu=h(()=>{"use strict"});import zC from"node:fs/promises";import KC from"node:path";function ur(s){return s.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function YC(s,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of n)t.push(...ur(m));let r=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of r){let g;for(;(g=m.exec(s))!==null;)g[1]&&t.push(...ur(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(s))!==null;)g[1]&&t.push(...ur(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(s))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...ur(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...ur(g))}}let l=/\/\/\s*(.+)/g,u;for(;(u=l.exec(s))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(s))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!Sf.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function QC(s){return s.split(/\s+/).flatMap(e=>ur(e)).filter(e=>e.length>1&&!Sf.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function ZC(s){let e=await wn(s),t={},n={},r=0,o=await us(e,50,async a=>{try{let l=await zC.readFile(KC.join(s,a),"utf-8"),u=YC(l,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:l}of o){t[a]={tokens:l,length:l.length},r+=l.length;let u=new Map;for(let d of l)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)n[d]||(n[d]=[]),n[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function eR(s,e){return Math.log((e-s+.5)/(s+.5)+1)}function tR(s,e){let t=QC(s);if(t.length===0)return[];let n=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=eR(o.length,e.totalDocs);for(let{path:a,tf:l}of o){let u=e.documents[a];if(!u)continue;let d=l*(1.2+1),p=l+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);n.set(a,(n.get(a)||0)+m)}}return Array.from(n.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function nR(s,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,r])=>[n,r.length]))};A.setDoc(s,nu,t),Xi.delete(s)}function zi(s){let e=A.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",nu);if(!e)return Xi.delete(s),null;let t=Xi.get(s);if(t&&t.updatedAt===e.updated_at)return t.index;let n=A.getDoc(s,nu);if(!n)return null;let r={};for(let[i,a]of Object.entries(n.docLengths))r[i]={tokens:[],length:a};let o={documents:r,invertedIndex:n.invertedIndex,avgDocLength:n.avgDocLength,totalDocs:n.totalDocs,builtAt:n.builtAt};return Xi.set(s,{index:o,updatedAt:e.updated_at}),o}async function Tf(s,e){let t=await ZC(s);return nR(e,t),t}function Ef(s,e,t=15){let n=zi(s);return n?tR(e,n).slice(0,t):[]}var Sf,nu,Xi,Ki=h(()=>{"use strict";tu();Y();V();Sf=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);c(ur,"splitIdentifier");c(YC,"tokenizeFile");c(QC,"tokenizeQuery");c(ZC,"buildIndex");c(eR,"idf");c(tR,"score");nu="bm25-index",Xi=new Map;c(nR,"saveIndex");c(zi,"loadIndex");c(Tf,"indexProject");c(Ef,"queryFiles")});import su from"node:fs/promises";import Vn from"node:path";import{z as Z}from"zod";async function aR(s,e){let t=Date.now();if(s.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=Vn.join(e,"package.json"),r=await su.readFile(n,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],l=[];for(let u of s.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?l.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${l.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return L(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function cR(s,e){let t=Date.now();if(s.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await pR(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let l=iR[a];if(!l)continue;l.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function lR(s,e){let t=Date.now(),n=s.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of n){let a=i.location,l=Vn.join(e,a);await C(l)?o.push(a):r.push(`${i.name} (${a})`)}return r.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function uR(s,e){let t=Date.now();try{let n=await mR(e),r=s.fileCount,o=.1,i=Math.abs(n-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function dR(s,e){let t=Date.now();if(s.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],r=[];for(let o of s.antiPatterns){let i=Vn.join(e,o.file);await C(i)?r.push(o.file):n.push(`${o.issue} (${o.file})`)}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Cf(s,e){let t=Date.now(),n=await Promise.all([aR(s,e),cR(s,e),lR(s,e),uR(s,e),dR(s,e)]),r=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:r===0,checks:n,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function pR(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await su.readdir(r,{withFileTypes:!0});for(let i of o){let a=Vn.join(r,i.name),l=Vn.relative(s,a);if(!t.some(u=>u.test(l))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Vn.extname(i.name);u&&e.add(u)}}}}catch{}}return c(n,"scanDir"),await n(s),Array.from(e)}async function mR(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await su.readdir(r,{withFileTypes:!0});for(let i of o){let a=Vn.join(r,i.name),l=Vn.relative(s,a);t.some(u=>u.test(l))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return c(n,"scanDir"),await n(s),e}var sR,rR,oR,ru,iR,Rf=h(()=>{"use strict";F();V();fo();sR=Z.enum(["draft","verified","sealed"]),rR=Z.object({name:Z.string(),description:Z.string(),location:Z.string().optional(),severity:Z.enum(["low","medium","high"]).optional(),language:Z.string().optional(),framework:Z.string().optional(),source:Z.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Z.number().min(0).max(1).optional()}),oR=Z.object({issue:Z.string(),file:Z.string(),suggestion:Z.string(),severity:Z.enum(["low","medium","high"]).optional(),language:Z.string().optional(),framework:Z.string().optional(),source:Z.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Z.number().min(0).max(1).optional()}),ru=Z.object({projectId:Z.string(),languages:Z.array(Z.string()),frameworks:Z.array(Z.string()),packageManager:Z.string().optional(),sourceDir:Z.string().optional(),testDir:Z.string().optional(),configFiles:Z.array(Z.string()),fileCount:Z.number(),patterns:Z.array(rR),antiPatterns:Z.array(oR),analyzedAt:Z.string(),modelMetadata:go.optional(),status:sR.default("draft"),commitHash:Z.string().optional(),signature:Z.string().optional(),sealedAt:Z.string().optional(),verifiedAt:Z.string().optional()}),iR={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};c(aR,"verifyFrameworks");c(cR,"verifyLanguages");c(lR,"verifyPatternLocations");c(uR,"verifyFileCount");c(dR,"verifyAntiPatternFiles");c(Cf,"semanticVerify");c(pR,"getProjectExtensions");c(mR,"countProjectFiles")});import{createHash as gR}from"node:crypto";function Co(s){return gR("sha256").update(s).digest("hex")}function Pf(s){return Co(s).slice(0,16)}var Yi=h(()=>{"use strict";c(Co,"sha256");c(Pf,"sha256Short")});var ou,Ss,xf=h(()=>{"use strict";ue();Y();ou=class{static{c(this,"SyncPendingStorage")}append(e,t){let n=R(),r=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&A.run(e,`DELETE FROM sync_pending
569
569
  WHERE project_id = ?
570
570
  AND entity_type = ?
571
571
  AND entity_id = ?
572
572
  AND content_hash = ?`,e,t.entityType,t.entityId,t.contentHash),A.run(e,`INSERT INTO sync_pending
573
573
  (project_id, entity_type, entity_id, event_type, content_hash, payload, enqueued_at)
574
- VALUES (?, ?, ?, ?, ?, ?, ?)`,e,t.entityType??null,t.entityId??null,t.eventType??null,t.contentHash??null,r,n),{id:A.get(e,"SELECT last_insert_rowid() AS id")?.id??0,event:t,enqueuedAt:n}}list(e,t){let n=t?"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC LIMIT ?":"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC";return(t?A.query(e,n,e,t):A.query(e,n,e)).map(o=>this.rowToEntry(o))}count(e){return A.get(e,"SELECT COUNT(*) AS n FROM sync_pending WHERE project_id = ?",e)?.n??0}clearUpTo(e,t){if(t<=0)return 0;let n=this.count(e);return A.run(e,"DELETE FROM sync_pending WHERE project_id = ? AND id <= ?",e,t),n-this.count(e)}clearAll(e){A.run(e,"DELETE FROM sync_pending WHERE project_id = ?",e)}clearByIds(e,t){if(t.length===0)return;let n=t.map(()=>"?").join(",");A.run(e,`DELETE FROM sync_pending WHERE project_id = ? AND id IN (${n})`,e,...t)}rowToEntry(e){let t;try{t=JSON.parse(e.payload)}catch{t={type:"unknown.corrupt",path:[],data:null,timestamp:e.enqueued_at,projectId:e.project_id}}return{id:e.id,event:t,enqueuedAt:e.enqueued_at}}},Ss=new ru});var ou,un,Yi=h(()=>{"use strict";ge();xf();ue();V();ou=class{static{c(this,"SyncEventBus")}async publish(e){Ss.append(e.projectId,e)}async getPending(e){return Ss.list(e).map(t=>t.event)}async clearPending(e){Ss.clearAll(e)}async getPendingEntries(e){return Ss.list(e)}async clearPendingUpTo(e,t){return Ss.clearUpTo(e,t)}async clearPendingByIds(e,t){Ss.clearByIds(e,t)}async updateLastSync(e){let t=_.getLastSyncPath(e),n={timestamp:R(),success:!0};await ke(t,n)}async getLastSync(e){let t=_.getLastSyncPath(e);return await xe(t,null)}},un=new ou});var au={};D(au,{default:()=>Ze});import fR from"node:crypto";import Af from"node:fs/promises";import jf from"node:os";import hR from"node:path";function If(){return fR.randomUUID()}var _f,$f,iu,yR,Ze,dr=h(()=>{"use strict";ge();V();_f="https://api.prjct.app",$f={apiKey:null,apiUrl:_f,userId:null,email:null,lastAuth:null};c(If,"freshDeviceId");iu=class{static{c(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=_.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await xe(this.configPath),t=e??{...$f},n=!1;if(t.deviceId||(t.deviceId=If(),n=!0),t.hostname||(t.hostname=jf.hostname(),n=!0),this.cachedConfig=t,n&&e)try{await ke(this.configPath,this.cachedConfig),await Af.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??If()}async getHostname(){return(await this.read()).hostname??jf.hostname()}async write(e){let n={...await this.read(),...e,lastAuth:new Date().toISOString()};await sn(hR.dirname(this.configPath)),await ke(this.configPath,n),await Af.chmod(this.configPath,384),this.cachedConfig=n}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||_f}async saveAuth(e,t,n){await this.write({apiKey:e,userId:t,email:n})}async clearAuth(){this.cachedConfig={...$f},await ke(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},yR=new iu,Ze=yR});import wR from"node:crypto";function kR(s){let[e,t]=s.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}function vR(s){if(!s||typeof s!="object")return;let e=s;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let n=e[t];if(typeof n=="string"&&n.length>0)return n}}function bR(s){let e=s&&typeof s=="object"&&!Array.isArray(s)?JSON.stringify(SR(s)):JSON.stringify(s);return wR.createHash("sha256").update(e).digest("hex")}function SR(s){let e={};for(let t of Object.keys(s).sort())e[t]=s[t];return e}async function TR(){if(Qi)return Qi;try{let{default:s}=await Promise.resolve().then(()=>(dr(),au)),e=s;return typeof e.getDeviceId=="function"?(Qi=await e.getDeviceId(),Qi):"unknown-device"}catch{return"unknown-device"}}var Qi,ot,qn=h(()=>{"use strict";Yi();ho();ue();Y();c(kR,"deriveEntityShape");c(vR,"entityIdOf");c(bR,"hashPayload");c(SR,"sortKeys");Qi=null;c(TR,"_resolveDeviceId");ot=class{static{c(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new ki({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1"||process.env.PRJCT_DAEMON==="1")){let n=this.cache.get(e);if(n!==null)return n}try{let n=j.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){j.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=this.getStoreKey(),r=8;for(let o=1;o<=r;o++){let i=j.getDocWithStamp(e,n),a=i?i.data:this.getDefault(),l=t(a);if(j.casSetDoc(e,n,l,i?.updatedAt??null))return this.cache.set(e,l),l}throw new Error(`StorageManager.update: unresolved write contention after ${r} attempts (key=${n})`)}async publishEvent(e,t,n){let r=kR(t),o={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:R(),projectId:e,entityType:r.entityType,entityId:vR(n),eventType:r.eventType,contentHash:bR(n),deviceId:await TR(),revisionCount:1};await un.publish(o)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:R()};await this.publishEvent(e,o,i)}async exists(e){try{return j.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var cu,Ke,Jn=h(()=>{"use strict";Rf();qi();ue();Ki();qn();cu=class extends ot{static{c(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};su.parse(n),await this.update(e,r=>({...r,draft:n,lastUpdated:R()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),r=R(),o={...t.draft,status:"sealed",signature:n,sealedAt:r};return su.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let n=R();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:wf(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),r=n.sealed??n.draft;return r?await Cf(r,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Co(JSON.stringify(t))}},Ke=new cu});var lu,ER,Ct,pr=h(()=>{"use strict";ue();Y();lu=class{static{c(this,"LLMAnalysisStorage")}save(e,t){let n=j.getDb(e),r=R();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),n.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=j.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?j.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getAllFull(e){return j.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(n=>({id:n.id,status:n.status,commitHash:n.commit_hash,analyzedAt:n.analyzed_at,supersededAt:n.superseded_at,analysis:JSON.parse(n.analysis)}))}getHistory(e,t=10){return j.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},ER=new lu,Ct=ER});import{z as x}from"zod";var CR,Zi,RR,PR,uu,Mf,Of,Nf,Lf,Df,xR,AR,jR,Ff,$R,Hf,ea=h(()=>{"use strict";fo();CR=x.enum(["low","medium","high","critical"]),Zi=x.enum(["feature","bug","improvement","chore"]),RR=x.enum(["active","backlog","previously_active"]),PR=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),uu=x.object({title:x.string(),description:x.string(),filesChanged:x.array(x.object({path:x.string(),action:x.enum(["created","modified","deleted"])})),whatWasDone:x.array(x.string()).min(1),outputForNextAgent:x.string().min(1),notes:x.string().optional()}),Mf=x.object({output:x.string().min(1,"Subtask output is required"),summary:uu}),Of=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:PR,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:uu.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),Nf=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),Lf=x.object({id:x.string(),description:x.string(),type:Zi.optional(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(Of).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:Nf.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),linkedSpecId:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:go.optional(),tokensIn:x.number().optional(),tokensOut:x.number().optional(),parentDescription:x.string().optional(),branch:x.string().optional(),prUrl:x.string().optional()}),Df=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional(),type:Zi.optional(),sessionId:x.string().optional(),featureId:x.string().optional(),subtasks:x.array(Of).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:Nf.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:go.optional(),tokensIn:x.number().optional(),tokensOut:x.number().optional()}),xR=x.object({stackConfirmed:x.array(x.string()).optional(),patternsDiscovered:x.array(x.string()).optional(),agentAccuracy:x.array(x.object({agent:x.string(),rating:x.enum(["helpful","neutral","inaccurate"]),note:x.string().optional()})).optional(),issuesEncountered:x.array(x.string()).optional()}),AR=x.object({taskId:x.string(),title:x.string(),classification:Zi,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(uu),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:xR.optional(),tokensIn:x.number().optional(),tokensOut:x.number().optional()}),jR=Lf.extend({workspaceId:x.string(),worktreePath:x.string().optional(),agentSessionId:x.string().optional(),jiraId:x.string().optional(),jiraUuid:x.string().optional(),dispatchedFrom:x.string().optional()}),Ff=x.object({currentTask:Lf.nullable(),previousTask:Df.nullable().optional(),pausedTasks:x.array(Df).optional(),taskHistory:x.array(AR).optional(),activeTasks:x.array(jR).optional(),lastUpdated:x.string()}),$R=x.object({id:x.string(),description:x.string(),body:x.string().optional(),priority:CR,type:Zi,featureId:x.string().optional(),originFeature:x.string().optional(),completed:x.boolean(),completedAt:x.string().optional(),createdAt:x.string(),section:RR,agent:x.string().optional(),groupName:x.string().optional(),groupId:x.string().optional()}),Hf=x.object({tasks:x.array($R),lastUpdated:x.string()})});var Ro,du,Ts,pu=h(()=>{"use strict";Ro={idle:{transitions:["task"],prompt:"prjct task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"prjct status done Complete task | prjct status paused Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"prjct status active Continue | prjct task <new> Start different | prjct ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","pause","reopen"],prompt:"prjct ship Ship it | prjct task <next> Start next | prjct status active Reopen",description:"Task completed"},shipped:{transitions:["task"],prompt:"prjct task <description> Start new task",description:"Feature shipped"}},du=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){let n=null;if(t&&e?.activeTasks?.length&&(n=e.activeTasks.find(o=>o.workspaceId===t)),n||(n=e?.currentTask),!n)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof n.status=="string"?n.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return n?"working":"idle"}}canTransition(e,t){if(Ro[e].transitions.includes(t))return{valid:!0};let r=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return e}}getStateInfo(e){return Ro[e]}getPrompt(e){return Ro[e].prompt}getValidCommands(e){return Ro[e].transitions}formatNextSteps(e){return Ro[e].transitions.map(n=>{switch(n){case"task":return"prjct task <desc> Start new task";case"done":return"prjct status done Complete current task";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${n}`}})}},Ts=new du});import IR from"node:crypto";function Ve(){return IR.randomUUID()}var Rn=h(()=>{"use strict";c(Ve,"generateUUID")});var Wf={};D(Wf,{_resetPublishHelperCache:()=>LR,publishCRUD:()=>Uf,publishCRUDSync:()=>dn});import _R from"node:crypto";function MR(s){let e=s&&typeof s=="object"&&!Array.isArray(s)?JSON.stringify(OR(s)):JSON.stringify(s);return _R.createHash("sha256").update(e).digest("hex")}function OR(s){let e={};for(let t of Object.keys(s).sort())e[t]=s[t];return e}async function NR(){if(ta)return ta;try{let{default:s}=await Promise.resolve().then(()=>(dr(),au)),e=s;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return ta=t,t}return"unknown-device"}catch{return"unknown-device"}}function LR(){ta=null}async function Uf(s){try{let e=await NR(),t=MR(s.data),n={type:`${s.entityType}.${DR[s.eventType]}`,path:[s.entityType,s.entityId],data:s.data,timestamp:new Date().toISOString(),projectId:s.projectId,entityType:s.entityType,entityId:s.entityId,eventType:s.eventType,contentHash:t,deviceId:e,originDeviceId:s.originDeviceId??e,revisionCount:s.revisionCount??1};await un.publish(n)}catch{}}function dn(s){Uf(s)}var DR,ta,Po=h(()=>{"use strict";Yi();DR={upsert:"updated",delete:"deleted"};c(MR,"hashPayload");c(OR,"sortKeys");ta=null;c(NR,"resolveDeviceId");c(LR,"_resetPublishHelperCache");c(Uf,"publishCRUD");c(dn,"publishCRUDSync")});var Pn,mu,dt,Xn=h(()=>{"use strict";Rn();Po();ue();Y();Pn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},mu=class{static{c(this,"ArchiveStorage")}archive(e,t){let n=Ve(),r=R();return j.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),dn({projectId:e,entityType:"archives",entityId:n,eventType:"upsert",data:{id:n,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:r}}),n}archiveMany(e,t){if(t.length===0)return 0;let n=R();return j.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Ve(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?j.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):j.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=j.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=j.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(j.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);j.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return j.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},dt=new mu});async function Gf(s,e,t){let n=await s.read(e);if(!n.currentTask)return null;s.validateTransition(n,"pause");let r={...n.currentTask,status:"paused",pausedAt:R(),pauseReason:t},o=s.getPausedTasksFromState(n),i=[r,...o].slice(0,s.maxPausedTasks);return await s.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:R()})),await s.publish(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async function Bf(s,e,t){let n=await s.read(e),r=s.getPausedTasksFromState(n);if(r.length===0)return null;s.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(g=>g.id===t),o===-1))return null;let i=r[o],a=r.filter((g,k)=>k!==o),{status:l,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:R(),sessionId:i.sessionId??Ve()};return await s.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:R()})),await s.publish(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}async function Vf(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t),r=Date.now()-s.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async function qf(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t),r=Date.now()-s.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];dt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await s.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:R()}));for(let a of o)await s.publish(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}var Jf=h(()=>{"use strict";Rn();ue();Xn();c(Gf,"pauseTask");c(Bf,"resumeTask");c(Vf,"getStalePausedTasks");c(qf,"archiveStalePausedTasks")});async function Xf(s,e){await s.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:R()}))}async function zf(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async function Kf(s,e){let t=await s.read(e);return s.getPausedTasksFromState(t)[0]||null}async function Yf(s,e){let t=await s.read(e);return s.getPausedTasksFromState(t)}async function gu(s,e){let t=await s.read(e);return s.getTaskHistoryFromState(t)}async function Qf(s,e){let t=await s.read(e);return s.getTaskHistoryFromState(t)[0]||null}async function Zf(s,e,t){let n=await s.read(e);return s.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async function eh(s,e){let n=(await gu(s,e)).filter(m=>m.feedback),r=[],o=[],i=[],a=[];for(let m of n){let g=m.feedback;Array.isArray(g.stackConfirmed)&&r.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let l=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}var th=h(()=>{"use strict";ue();c(Xf,"clearTask");c(zf,"hasTask");c(Kf,"getPausedTask");c(Yf,"getAllPausedTasks");c(gu,"getTaskHistory");c(Qf,"getMostRecentTask");c(Zf,"getTaskHistoryByType");c(eh,"getAggregatedFeedback")});async function nh(s,e,t){let n=await s.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?R():void 0,dependsOn:o.dependsOn||[]}));await s.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:R()})),await s.publish(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function sh(s,e,t){let n=Mf.safeParse(t);if(!n.success){let k=n.error.issues.map(E=>`${E.path.join(".")}: ${E.message}`);throw new Error(`Subtask completion requires handoff data:
574
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,e,t.entityType??null,t.entityId??null,t.eventType??null,t.contentHash??null,r,n),{id:A.get(e,"SELECT last_insert_rowid() AS id")?.id??0,event:t,enqueuedAt:n}}list(e,t){let n=t?"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC LIMIT ?":"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC";return(t?A.query(e,n,e,t):A.query(e,n,e)).map(o=>this.rowToEntry(o))}count(e){return A.get(e,"SELECT COUNT(*) AS n FROM sync_pending WHERE project_id = ?",e)?.n??0}clearUpTo(e,t){if(t<=0)return 0;let n=this.count(e);return A.run(e,"DELETE FROM sync_pending WHERE project_id = ? AND id <= ?",e,t),n-this.count(e)}clearAll(e){A.run(e,"DELETE FROM sync_pending WHERE project_id = ?",e)}clearByIds(e,t){if(t.length===0)return;let n=t.map(()=>"?").join(",");A.run(e,`DELETE FROM sync_pending WHERE project_id = ? AND id IN (${n})`,e,...t)}rowToEntry(e){let t;try{t=JSON.parse(e.payload)}catch{t={type:"unknown.corrupt",path:[],data:null,timestamp:e.enqueued_at,projectId:e.project_id}}return{id:e.id,event:t,enqueuedAt:e.enqueued_at}}},Ss=new ou});var iu,un,Qi=h(()=>{"use strict";ge();xf();ue();V();iu=class{static{c(this,"SyncEventBus")}async publish(e){Ss.append(e.projectId,e)}async getPending(e){return Ss.list(e).map(t=>t.event)}async clearPending(e){Ss.clearAll(e)}async getPendingEntries(e){return Ss.list(e)}async clearPendingUpTo(e,t){return Ss.clearUpTo(e,t)}async clearPendingByIds(e,t){Ss.clearByIds(e,t)}async updateLastSync(e){let t=_.getLastSyncPath(e),n={timestamp:R(),success:!0};await ke(t,n)}async getLastSync(e){let t=_.getLastSyncPath(e);return await xe(t,null)}},un=new iu});var cu={};D(cu,{default:()=>Ze});import fR from"node:crypto";import Af from"node:fs/promises";import jf from"node:os";import hR from"node:path";function If(){return fR.randomUUID()}var _f,$f,au,yR,Ze,dr=h(()=>{"use strict";ge();V();_f="https://api.prjct.app",$f={apiKey:null,apiUrl:_f,userId:null,email:null,lastAuth:null};c(If,"freshDeviceId");au=class{static{c(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=_.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await xe(this.configPath),t=e??{...$f},n=!1;if(t.deviceId||(t.deviceId=If(),n=!0),t.hostname||(t.hostname=jf.hostname(),n=!0),this.cachedConfig=t,n&&e)try{await ke(this.configPath,this.cachedConfig),await Af.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??If()}async getHostname(){return(await this.read()).hostname??jf.hostname()}async write(e){let n={...await this.read(),...e,lastAuth:new Date().toISOString()};await sn(hR.dirname(this.configPath)),await ke(this.configPath,n),await Af.chmod(this.configPath,384),this.cachedConfig=n}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||_f}async saveAuth(e,t,n){await this.write({apiKey:e,userId:t,email:n})}async clearAuth(){this.cachedConfig={...$f},await ke(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},yR=new au,Ze=yR});import wR from"node:crypto";function kR(s){let[e,t]=s.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}function vR(s){if(!s||typeof s!="object")return;let e=s;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let n=e[t];if(typeof n=="string"&&n.length>0)return n}}function bR(s){let e=s&&typeof s=="object"&&!Array.isArray(s)?JSON.stringify(SR(s)):JSON.stringify(s);return wR.createHash("sha256").update(e).digest("hex")}function SR(s){let e={};for(let t of Object.keys(s).sort())e[t]=s[t];return e}async function TR(){if(Zi)return Zi;try{let{default:s}=await Promise.resolve().then(()=>(dr(),cu)),e=s;return typeof e.getDeviceId=="function"?(Zi=await e.getDeviceId(),Zi):"unknown-device"}catch{return"unknown-device"}}var Zi,ot,qn=h(()=>{"use strict";Qi();ho();ue();Y();c(kR,"deriveEntityShape");c(vR,"entityIdOf");c(bR,"hashPayload");c(SR,"sortKeys");Zi=null;c(TR,"_resolveDeviceId");ot=class{static{c(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new vi({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1"||process.env.PRJCT_DAEMON==="1")){let n=this.cache.get(e);if(n!==null)return n}try{let n=j.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){j.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=this.getStoreKey(),r=8;for(let o=1;o<=r;o++){let i=j.getDocWithStamp(e,n),a=i?i.data:this.getDefault(),l=t(a);if(j.casSetDoc(e,n,l,i?.updatedAt??null))return this.cache.set(e,l),l}throw new Error(`StorageManager.update: unresolved write contention after ${r} attempts (key=${n})`)}async publishEvent(e,t,n){let r=kR(t),o={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:R(),projectId:e,entityType:r.entityType,entityId:vR(n),eventType:r.eventType,contentHash:bR(n),deviceId:await TR(),revisionCount:1};await un.publish(o)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:R()};await this.publishEvent(e,o,i)}async exists(e){try{return j.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var lu,Ke,Jn=h(()=>{"use strict";Rf();Ji();ue();Yi();qn();lu=class extends ot{static{c(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};ru.parse(n),await this.update(e,r=>({...r,draft:n,lastUpdated:R()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),r=R(),o={...t.draft,status:"sealed",signature:n,sealedAt:r};return ru.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let n=R();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:wf(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),r=n.sealed??n.draft;return r?await Cf(r,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Co(JSON.stringify(t))}},Ke=new lu});var uu,ER,Ct,pr=h(()=>{"use strict";ue();Y();uu=class{static{c(this,"LLMAnalysisStorage")}save(e,t){let n=j.getDb(e),r=R();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),n.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=j.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?j.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getAllFull(e){return j.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(n=>({id:n.id,status:n.status,commitHash:n.commit_hash,analyzedAt:n.analyzed_at,supersededAt:n.superseded_at,analysis:JSON.parse(n.analysis)}))}getHistory(e,t=10){return j.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},ER=new uu,Ct=ER});import{z as x}from"zod";var CR,ea,RR,PR,du,Mf,Of,Nf,Lf,Df,xR,AR,jR,Ff,$R,Hf,ta=h(()=>{"use strict";fo();CR=x.enum(["low","medium","high","critical"]),ea=x.enum(["feature","bug","improvement","chore"]),RR=x.enum(["active","backlog","previously_active"]),PR=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),du=x.object({title:x.string(),description:x.string(),filesChanged:x.array(x.object({path:x.string(),action:x.enum(["created","modified","deleted"])})),whatWasDone:x.array(x.string()).min(1),outputForNextAgent:x.string().min(1),notes:x.string().optional()}),Mf=x.object({output:x.string().min(1,"Subtask output is required"),summary:du}),Of=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:PR,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:du.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),Nf=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),Lf=x.object({id:x.string(),description:x.string(),type:ea.optional(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(Of).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:Nf.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),linkedSpecId:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:go.optional(),tokensIn:x.number().optional(),tokensOut:x.number().optional(),parentDescription:x.string().optional(),branch:x.string().optional(),prUrl:x.string().optional()}),Df=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional(),type:ea.optional(),sessionId:x.string().optional(),featureId:x.string().optional(),subtasks:x.array(Of).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:Nf.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:go.optional(),tokensIn:x.number().optional(),tokensOut:x.number().optional()}),xR=x.object({stackConfirmed:x.array(x.string()).optional(),patternsDiscovered:x.array(x.string()).optional(),agentAccuracy:x.array(x.object({agent:x.string(),rating:x.enum(["helpful","neutral","inaccurate"]),note:x.string().optional()})).optional(),issuesEncountered:x.array(x.string()).optional()}),AR=x.object({taskId:x.string(),title:x.string(),classification:ea,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(du),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:xR.optional(),tokensIn:x.number().optional(),tokensOut:x.number().optional()}),jR=Lf.extend({workspaceId:x.string(),worktreePath:x.string().optional(),agentSessionId:x.string().optional(),jiraId:x.string().optional(),jiraUuid:x.string().optional(),dispatchedFrom:x.string().optional()}),Ff=x.object({currentTask:Lf.nullable(),previousTask:Df.nullable().optional(),pausedTasks:x.array(Df).optional(),taskHistory:x.array(AR).optional(),activeTasks:x.array(jR).optional(),lastUpdated:x.string()}),$R=x.object({id:x.string(),description:x.string(),body:x.string().optional(),priority:CR,type:ea,featureId:x.string().optional(),originFeature:x.string().optional(),completed:x.boolean(),completedAt:x.string().optional(),createdAt:x.string(),section:RR,agent:x.string().optional(),groupName:x.string().optional(),groupId:x.string().optional()}),Hf=x.object({tasks:x.array($R),lastUpdated:x.string()})});var Ro,pu,Ts,mu=h(()=>{"use strict";Ro={idle:{transitions:["task"],prompt:"prjct task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"prjct status done Complete task | prjct status paused Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"prjct status active Continue | prjct task <new> Start different | prjct ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","pause","reopen"],prompt:"prjct ship Ship it | prjct task <next> Start next | prjct status active Reopen",description:"Task completed"},shipped:{transitions:["task"],prompt:"prjct task <description> Start new task",description:"Feature shipped"}},pu=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){let n=null;if(t&&e?.activeTasks?.length&&(n=e.activeTasks.find(o=>o.workspaceId===t)),n||(n=e?.currentTask),!n)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof n.status=="string"?n.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return n?"working":"idle"}}canTransition(e,t){if(Ro[e].transitions.includes(t))return{valid:!0};let r=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return e}}getStateInfo(e){return Ro[e]}getPrompt(e){return Ro[e].prompt}getValidCommands(e){return Ro[e].transitions}formatNextSteps(e){return Ro[e].transitions.map(n=>{switch(n){case"task":return"prjct task <desc> Start new task";case"done":return"prjct status done Complete current task";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${n}`}})}},Ts=new pu});import IR from"node:crypto";function Ve(){return IR.randomUUID()}var Rn=h(()=>{"use strict";c(Ve,"generateUUID")});var Wf={};D(Wf,{_resetPublishHelperCache:()=>LR,publishCRUD:()=>Uf,publishCRUDSync:()=>dn});import _R from"node:crypto";function MR(s){let e=s&&typeof s=="object"&&!Array.isArray(s)?JSON.stringify(OR(s)):JSON.stringify(s);return _R.createHash("sha256").update(e).digest("hex")}function OR(s){let e={};for(let t of Object.keys(s).sort())e[t]=s[t];return e}async function NR(){if(na)return na;try{let{default:s}=await Promise.resolve().then(()=>(dr(),cu)),e=s;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return na=t,t}return"unknown-device"}catch{return"unknown-device"}}function LR(){na=null}async function Uf(s){try{let e=await NR(),t=MR(s.data),n={type:`${s.entityType}.${DR[s.eventType]}`,path:[s.entityType,s.entityId],data:s.data,timestamp:new Date().toISOString(),projectId:s.projectId,entityType:s.entityType,entityId:s.entityId,eventType:s.eventType,contentHash:t,deviceId:e,originDeviceId:s.originDeviceId??e,revisionCount:s.revisionCount??1};await un.publish(n)}catch{}}function dn(s){Uf(s)}var DR,na,Po=h(()=>{"use strict";Qi();DR={upsert:"updated",delete:"deleted"};c(MR,"hashPayload");c(OR,"sortKeys");na=null;c(NR,"resolveDeviceId");c(LR,"_resetPublishHelperCache");c(Uf,"publishCRUD");c(dn,"publishCRUDSync")});var Pn,gu,dt,Xn=h(()=>{"use strict";Rn();Po();ue();Y();Pn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},gu=class{static{c(this,"ArchiveStorage")}archive(e,t){let n=Ve(),r=R();return j.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),dn({projectId:e,entityType:"archives",entityId:n,eventType:"upsert",data:{id:n,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:r}}),n}archiveMany(e,t){if(t.length===0)return 0;let n=R();return j.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Ve(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?j.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):j.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=j.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=j.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(j.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);j.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return j.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},dt=new gu});async function Gf(s,e,t){let n=await s.read(e);if(!n.currentTask)return null;s.validateTransition(n,"pause");let r={...n.currentTask,status:"paused",pausedAt:R(),pauseReason:t},o=s.getPausedTasksFromState(n),i=[r,...o].slice(0,s.maxPausedTasks);return await s.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:R()})),await s.publish(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async function Bf(s,e,t){let n=await s.read(e),r=s.getPausedTasksFromState(n);if(r.length===0)return null;s.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(g=>g.id===t),o===-1))return null;let i=r[o],a=r.filter((g,k)=>k!==o),{status:l,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:R(),sessionId:i.sessionId??Ve()};return await s.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:R()})),await s.publish(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}async function Vf(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t),r=Date.now()-s.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async function qf(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t),r=Date.now()-s.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];dt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await s.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:R()}));for(let a of o)await s.publish(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}var Jf=h(()=>{"use strict";Rn();ue();Xn();c(Gf,"pauseTask");c(Bf,"resumeTask");c(Vf,"getStalePausedTasks");c(qf,"archiveStalePausedTasks")});async function Xf(s,e){await s.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:R()}))}async function zf(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async function Kf(s,e){let t=await s.read(e);return s.getPausedTasksFromState(t)[0]||null}async function Yf(s,e){let t=await s.read(e);return s.getPausedTasksFromState(t)}async function fu(s,e){let t=await s.read(e);return s.getTaskHistoryFromState(t)}async function Qf(s,e){let t=await s.read(e);return s.getTaskHistoryFromState(t)[0]||null}async function Zf(s,e,t){let n=await s.read(e);return s.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async function eh(s,e){let n=(await fu(s,e)).filter(m=>m.feedback),r=[],o=[],i=[],a=[];for(let m of n){let g=m.feedback;Array.isArray(g.stackConfirmed)&&r.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let l=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}var th=h(()=>{"use strict";ue();c(Xf,"clearTask");c(zf,"hasTask");c(Kf,"getPausedTask");c(Yf,"getAllPausedTasks");c(fu,"getTaskHistory");c(Qf,"getMostRecentTask");c(Zf,"getTaskHistoryByType");c(eh,"getAggregatedFeedback")});async function nh(s,e,t){let n=await s.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?R():void 0,dependsOn:o.dependsOn||[]}));await s.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:R()})),await s.publish(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function sh(s,e,t){let n=Mf.safeParse(t);if(!n.success){let k=n.error.issues.map(E=>`${E.path.join(".")}: ${E.message}`);throw new Error(`Subtask completion requires handoff data:
575
575
  ${k.join(`
576
- `)}`)}let{output:r,summary:o}=n.data,i=await s.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,l=i.currentTask.subtasks[a];if(!l)return null;let u=[...i.currentTask.subtasks];u[a]={...l,status:"completed",completedAt:R(),output:r,summary:o};let d=u.filter(k=>k.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:R()}),await s.update(e,k=>({...k,currentTask:{...k.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:R()})),await s.publish(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:l.id,description:l.description,output:r,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async function rh(s,e){let t=await s.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async function oh(s,e){let t=await s.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async function fu(s,e){let t=await s.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async function ih(s,e){let t=await fu(s,e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async function ah(s,e){return(await s.read(e)).currentTask?.subtasks||[]}async function ch(s,e){return(await s.read(e)).currentTask?.subtaskProgress||null}async function lh(s,e){return((await s.read(e)).currentTask?.subtasks?.length||0)>0}async function uh(s,e){let t=await s.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async function dh(s,e,t){let n=await s.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:R(),output:`Failed: ${t}`};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:R()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await s.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:R()})),await s.publish(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<l?i[a]:null}async function ph(s,e,t){let n=await s.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:R(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:R()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await s.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:R()})),await s.publish(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<l?i[a]:null}async function mh(s,e,t){let n=await s.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,l=i.length;return a<l&&(i[a]={...i[a],status:"in_progress",startedAt:R()}),await s.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r},lastUpdated:R()})),await s.publish(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<l?i[a]:null}var gh=h(()=>{"use strict";ea();ue();c(nh,"createSubtasks");c(sh,"completeSubtask");c(rh,"getCurrentSubtask");c(oh,"getNextSubtask");c(fu,"getPreviousSubtask");c(ih,"getPreviousHandoff");c(ah,"getSubtasks");c(ch,"getSubtaskProgress");c(lh,"hasSubtasks");c(uh,"areAllSubtasksComplete");c(dh,"failSubtask");c(ph,"skipSubtask");c(mh,"blockSubtask")});async function fh(s,e,t,n){let r={...t,workspaceId:n,startedAt:R()};return await s.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],r],lastUpdated:R()})),await s.publish(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId,workspaceId:n}),r}async function hh(s,e,t){return((await s.read(e)).activeTasks||[]).find(r=>r.workspaceId===t)??null}async function yh(s,e,t,n){let r=await s.read(e),i=(r.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=R(),l=s.createTaskHistoryEntry(i,a,n),u=s.getTaskHistoryFromState(r),d=[l,...u].slice(0,s.maxTaskHistory);return await s.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await s.publish(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async function wh(s,e){return(await s.read(e)).activeTasks||[]}async function kh(s,e){return((await s.read(e)).activeTasks||[]).length}async function vh(s,e,t,n){let o=(await s.read(e)).activeTasks||[],i=o.findIndex(l=>l.workspaceId===t);if(i===-1)return null;let a={...o[i],...n,workspaceId:t};return await s.update(e,l=>{let u=[...l.activeTasks||[]];return u[i]=a,{...l,activeTasks:u,lastUpdated:R()}}),a}async function bh(s,e,t,n){let r=await s.read(e);if(!r.currentTask)return null;let o=(r.currentTask.tokensIn||0)+t,i=(r.currentTask.tokensOut||0)+n;return await s.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:R()})),{tokensIn:o,tokensOut:i}}var Sh=h(()=>{"use strict";ue();c(fh,"startTaskInWorkspace");c(hh,"getCurrentTaskForWorkspace");c(yh,"completeTaskInWorkspace");c(wh,"getActiveTasks");c(kh,"getActiveTaskCount");c(vh,"updateWorkspaceTask");c(bh,"addTokens")});var hu,B,pt=h(()=>{"use strict";ea();ue();pu();Jf();th();gh();Sh();qn();hu=class extends ot{static{c(this,"StateStorage")}constructor(){super("state.json",Ff)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Ts.getCurrentState(e),r=Ts.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async getPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let r={...t,startedAt:R()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:R()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:R()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=R(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),l=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:l,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=r.length>0?r.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:r,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return n&&(i.feedback=n),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;lifecycleBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),validateTransition:this.validateTransition.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),maxPausedTasks:this.maxPausedTasks,stalenessThresholdDays:this.stalenessThresholdDays}}async pauseTask(e,t){return Gf(this.lifecycleBackend(),e,t)}async resumeTask(e,t){return Bf(this.lifecycleBackend(),e,t)}getPausedTasksFromState(e){return Array.isArray(e.pausedTasks)&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){return Vf(this.lifecycleBackend(),e)}async archiveStalePausedTasks(e){return qf(this.lifecycleBackend(),e)}queryBackend(){return{read:this.read.bind(this),update:this.update.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this)}}async clearTask(e){return Xf(this.queryBackend(),e)}async hasTask(e){return zf(this.queryBackend(),e)}async getPausedTask(e){return Kf(this.queryBackend(),e)}async getAllPausedTasks(e){return Yf(this.queryBackend(),e)}async getTaskHistory(e){return gu(this.queryBackend(),e)}async getMostRecentTask(e){return Qf(this.queryBackend(),e)}async getTaskHistoryByType(e,t){return Zf(this.queryBackend(),e,t)}async getAggregatedFeedback(e){return eh(this.queryBackend(),e)}workspaceBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),createTaskHistoryEntry:this.createTaskHistoryEntry.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this),maxTaskHistory:this.maxTaskHistory}}async startTaskInWorkspace(e,t,n){return fh(this.workspaceBackend(),e,t,n)}async getCurrentTaskForWorkspace(e,t){return hh(this.workspaceBackend(),e,t)}async completeTaskInWorkspace(e,t,n){return yh(this.workspaceBackend(),e,t,n)}async getActiveTasks(e){return wh(this.workspaceBackend(),e)}async getActiveTaskCount(e){return kh(this.workspaceBackend(),e)}async updateWorkspaceTask(e,t,n){return vh(this.workspaceBackend(),e,t,n)}async addTokens(e,t,n){return bh(this.workspaceBackend(),e,t,n)}subtaskBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this)}}async createSubtasks(e,t){return nh(this.subtaskBackend(),e,t)}async completeSubtask(e,t){return sh(this.subtaskBackend(),e,t)}async getCurrentSubtask(e){return rh(this.subtaskBackend(),e)}async getNextSubtask(e){return oh(this.subtaskBackend(),e)}async getPreviousSubtask(e){return fu(this.subtaskBackend(),e)}async getPreviousHandoff(e){return ih(this.subtaskBackend(),e)}async getSubtasks(e){return ah(this.subtaskBackend(),e)}async getSubtaskProgress(e){return ch(this.subtaskBackend(),e)}async hasSubtasks(e){return lh(this.subtaskBackend(),e)}async areAllSubtasksComplete(e){return uh(this.subtaskBackend(),e)}async failSubtask(e,t){return dh(this.subtaskBackend(),e,t)}async skipSubtask(e,t){return ph(this.subtaskBackend(),e,t)}async blockSubtask(e,t){return mh(this.subtaskBackend(),e,t)}},B=new hu});function BR(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if(GR.has(s)||s.includes("prjct"))return{level:mr.debug,name:"debug"};let e=mr[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function na(s,e,t){return Th>=s?(...n)=>console[t](e,...n):qR}var mr,GR,Th,VR,qR,JR,G,pn=h(()=>{"use strict";mr={error:0,warn:1,info:2,debug:3},GR=new Set(["1","true","*"]);c(BR,"getLogLevel");({level:Th,name:VR}=BR()),qR=c(()=>{},"noop");c(na,"createLogMethod");JR={error:na(mr.error,"[prjct:error]","error"),warn:na(mr.warn,"[prjct:warn]","warn"),info:na(mr.info,"[prjct:info]","log"),debug:na(mr.debug,"[prjct:debug]","log"),isEnabled:c(()=>Th>=0,"isEnabled"),level:c(()=>VR,"level")},G=JR});import Eh from"node:fs/promises";import Ch from"node:path";async function wu(s,e,t,n){let[r,o,i,a]=await Promise.all([KR(s,e,n),YR(s),QR(s),ZR(s)]);return{project:{name:n.name,ecosystem:n.ecosystem,languages:n.languages,frameworks:n.frameworks,fileCount:n.fileCount,projectType:n.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,XR).map(l=>({message:l.message,date:l.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:r,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function KR(s,e,t){let n=[],r=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Ef(s,r,yu*2);for(let a of o){if(n.length>=yu)break;try{let l=Ch.join(e,a.path),u=await Eh.readFile(l,"utf-8");u.length>sa*3?n.push({path:a.path,content:`${u.slice(0,sa)}
577
- // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):n.push({path:a.path,content:u.slice(0,sa),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(n.length>=yu)break;if(!n.some(l=>l.path===a))try{let l=Ch.join(e,a),u=await Eh.readFile(l,"utf-8");n.push({path:a,content:u.slice(0,sa),reason:"entry point"})}catch{}}return n}async function YR(s){try{let e=await Ke.getActive(s);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function QR(s){try{return(await B.getTaskHistory(s)).slice(0,zR).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function ZR(s){try{let e=Ct.getActiveSummary(s);return Promise.resolve(e)}catch(e){return G.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var sa,yu,XR,zR,Rh=h(()=>{"use strict";zi();Jn();pr();pt();pn();sa=800,yu=6,XR=8,zR=5;c(wu,"buildAnalysisPayload");c(KR,"selectCodeSamples");c(YR,"getExistingPatterns");c(QR,"getTaskHistory");c(ZR,"getPreviousAnalysisSummary")});async function tP(s,e=100){try{let{stdout:t}=await U(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:s,maxBuffer:10485760}),n=[],r=null;for(let o of t.split(`
578
- `)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=30&&n.push(r),r=new Set):i&&r&&nP(i)&&r.add(i)}return r&&r.size>0&&r.size<=30&&n.push(r),n}catch{return[]}}function nP(s){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(s)&&!s.includes("node_modules/")}async function sP(s,e=100){let t=await tP(s,e),n=new Map,r=new Map;for(let i of t){let a=Array.from(i);for(let l of a)n.set(l,(n.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=rP(a[l],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[l,u]=i.split("\0"),d=n.get(l)||0,p=n.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(o[l]||(o[l]={}),o[u]||(o[u]={}),o[l][u]=g,o[u][l]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function rP(s,e){return s<e?`${s}\0${e}`:`${e}\0${s}`}function oP(s,e){A.setDoc(s,ku,e),ra.delete(s)}function Ah(s){let e=A.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",ku);if(!e)return ra.delete(s),null;let t=ra.get(s);if(t&&t.updatedAt===e.updated_at)return t.matrix;let n=A.getDoc(s,ku);return n&&ra.set(s,{matrix:n,updatedAt:e.updated_at}),n}async function jh(s,e,t=100){let n=await sP(s,t);return oP(e,n),n}var ku,ra,vu=h(()=>{"use strict";eu();Y();Fe();c(tP,"parseGitLog");c(nP,"isSourceFile");c(sP,"buildMatrix");c(rP,"pairKey");ku="cochange-index",ra=new Map;c(oP,"saveMatrix");c(Ah,"loadMatrix");c(jh,"indexCoChanges")});import $h from"node:fs/promises";import gr from"node:path";function iP(s){let e=[],t,n=new RegExp(tg.source,"g");for(;(t=n.exec(s))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function aP(s,e,t){let n;if(s.startsWith("@/"))n=gr.join(t,"src",s.slice(2));else{let r=gr.dirname(gr.join(t,e));n=gr.resolve(r,s)}for(let r of eg){let o=n+r;try{if((await $h.stat(o)).isFile())return gr.relative(t,o)}catch{}}return null}async function cP(s){let e=await wn(s),t={},n={},r=0,o=await us(e,50,async i=>{try{let a=await $h.readFile(gr.join(s,i),"utf-8"),l=iP(a),u=[];for(let d of l){let p=await aP(d,i,s);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,r+=a.length;for(let l of a)n[l]||(n[l]=[]),n[l].push(i)}return{forward:t,reverse:n,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function lP(s,e){A.setDoc(s,bu,e),oa.delete(s)}function ia(s){let e=A.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",bu);if(!e)return oa.delete(s),null;let t=oa.get(s);if(t&&t.updatedAt===e.updated_at)return t.graph;let n=A.getDoc(s,bu);return n&&oa.set(s,{graph:n,updatedAt:e.updated_at}),n}async function Ih(s,e){let t=await cP(s);return lP(e,t),t}var bu,oa,aa=h(()=>{"use strict";zc();Y();V();c(iP,"extractImportSources");c(aP,"resolveImport");c(cP,"buildGraph");bu="import-graph",oa=new Map;c(lP,"saveGraph");c(ia,"loadGraph");c(Ih,"indexImports")});import xo from"node:fs/promises";import ca from"node:os";import fr from"node:path";function Mh(){return process.env.NODE_ENV==="test"?fr.join(ca.tmpdir(),"prjct-context7-test","verify-cache.json"):fr.join(ca.homedir(),".prjct-cli","state","context7-verify.json")}async function uP(){try{let s=await xo.readFile(Mh(),"utf-8"),e=JSON.parse(s);if(typeof e?.at=="number"&&e.status)return e}catch{}return null}async function dP(s,e){let t=Mh();try{await xo.mkdir(fr.dirname(t),{recursive:!0}),await xo.writeFile(t,JSON.stringify({at:s,status:e}),"utf-8")}catch{}}function pP(){let s=Je("mcp-config.json");if(!s)return{mcpServers:{context7:Tu}};try{return JSON.parse(s)}catch{return{mcpServers:{context7:Tu}}}}function Oh(){return pP().mcpServers?.context7||Tu}function Su(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?fr.join(ca.tmpdir(),"prjct-context7-test","mcp.json"):fr.join(ca.homedir(),".claude","mcp.json")}async function Dh(s){try{let e=await xo.readFile(s,"utf-8");return JSON.parse(e)}catch(e){if(L(e))return{};throw e}}async function mP(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let s=Oh(),e=[...s.args||[],"--help"];await Le(s.command||"npx",e,{timeout:15e3})}var Tu,Es,Eu,gP,xn,Ao=h(()=>{"use strict";En();wi();F();Fe();V();c(Mh,"getVerifyCachePath");c(uP,"readPersistedVerify");c(dP,"writePersistedVerify");Tu={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},Es=null;c(pP,"parseTemplateConfig");c(Oh,"getContext7Config");c(Su,"getConfigPath");c(Dh,"readConfig");c(mP,"runSmokeCheck");Eu=class{static{c(this,"Context7Service")}async install(){let e=Su(),t=fr.dirname(e);await xo.mkdir(t,{recursive:!0});let n=await Dh(e),r=n.mcpServers||{},o=Oh(),i=r.context7;return i&&JSON.stringify(i)===JSON.stringify(o)?{installed:!0,verified:!1,configPath:e,message:"Context7 MCP already configured"}:(r.context7=o,n.mcpServers=r,await ke(e,n),Es=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"})}async verify(){let e=Date.now();if(Es&&e-Es.at<3e5)return Es.status;let t=await uP();if(t?.status.verified&&e-t.at<3e5&&t.status.configPath===Su())return Es=t,t.status;let n=Su(),i=((await Dh(n)).mcpServers||{}).context7;if(!i?.command||!Array.isArray(i.args)||i.args.length===0)return{installed:!1,verified:!1,configPath:n,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await mP();let a={installed:!0,verified:!0,configPath:n};return Es={at:e,status:a},await dP(e,a),a}catch(a){let l={installed:!0,verified:!1,configPath:n,message:`Context7 smoke check failed: ${b(a)}`};return Es={at:e,status:l},l}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},gP=new Eu,xn=gP});import{execFileSync as Nh,execSync as fP}from"node:child_process";var la,Cu,ua,Lh,Fh=h(()=>{"use strict";ho();Hi();la={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Cu=class{static{c(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=la[e];if(!n)return this.checkUnknownTool(e);let r=this.executeCheck(n);return this.setCache(e,r),r}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=la[e],r=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new ua(r)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(r=>{let o=la[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
579
- `);throw new ua({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
580
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(la),n=new Map;for(let r of t)n.set(r,this.checkTool(r));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=fP(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let r=t.match(e.versionRegex);n=r?r[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Fi(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:Fi(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Nh(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Nh(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Fi(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Ys(t,this.cacheTimeout)?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},ua=class extends Error{static{c(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},Lh=new Cu});var pa={};D(pa,{installCodexSkill:()=>Ru,verifyCodexPRouterReady:()=>hr});import{execFileSync as hP}from"node:child_process";import te from"node:fs/promises";import jo from"node:os";import fe from"node:path";import Se from"chalk";async function yP(s){let e=s.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Lh.isAvailable("npm"))return console.log(`${Se.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${Se.dim(`Install ${s.displayName} using one of:`)}`),console.log(Se.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(Se.dim(` \u2022 Use Homebrew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(Se.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(Se.yellow(`\u{1F4E6} ${s.displayName} not found. Installing...`)),console.log(""),hP("npm",["install","-g",e],{stdio:"inherit",timeout:ir("NPM_INSTALL")}),console.log(""),console.log(`${Se.green("\u2713")} ${s.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(Se.yellow(`\u26A0\uFE0F Installation timed out for ${s.displayName}`)),console.log(""),console.log(Se.dim("The npm install took too long. Try:")),console.log(Se.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(Se.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(Se.yellow(`\u26A0\uFE0F Failed to install ${s.displayName}: ${n.message}`)),console.log(""),console.log(Se.dim("Alternative installation methods:")),console.log(Se.dim(` \u2022 npm: npm install -g ${e}`)),console.log(Se.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(Se.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(Se.dim(` \u2022 brew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function wP(){let s=await Tn(),e=await ul(),t=ut[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let l=ut[a],u=s[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await yP(l))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${l.displayName} installation failed`);else continue;if(a==="claude"){if(await He.detectActiveProvider()){let m=await He.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,n.commandsAdded+=m.added,n.commandsUpdated+=m.updated);let g=await He.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await He.installDocs(),await CP(),await xn.ensureReady()}}else if(a==="gemini"){await kP()&&(d.commandsAdded=1,n.commandsAdded+=1);let m=await vP();m.success&&(d.configAction=m.action)}n.providers.push(d)}if((await yo()).installed&&(await bP()).success&&console.log(` ${Se.green("\u2713")} Antigravity skill installed`),(await gs()).installed){if(!(await Ru()).success)throw new Error("Codex skill installation failed");let l=await hr({autoRepair:!0});if(!l.verified)throw new Error(l.message||"Codex p. router verification failed");console.log(` ${Se.green("\u2713")} Codex skill installed`),console.log(` ${Se.green("\u2713")} Codex p. router ready`)}await bo.saveConfig(le,await He.getInstallPath(),e.provider),await EP();for(let a of n.providers)RP(a,ut[a.provider]);return n}async function kP(){try{let s=fe.join(jo.homedir(),".gemini","commands"),e=fe.join(s,"p.toml");try{return await te.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(s){return G.warn(`Gemini router cleanup warning: ${b(s)}`),!1}}async function vP(){try{let s=fe.join(jo.homedir(),".gemini"),e=fe.join(s,"GEMINI.md");await te.mkdir(s,{recursive:!0});let t=Je("global/GEMINI.md");if(!t){let l=fe.join(Et,"templates","global","GEMINI.md");t=await te.readFile(l,"utf-8")}let n="",r=!1;try{n=await te.readFile(e,"utf-8"),r=!0}catch(l){if(L(l))r=!1;else throw l}let a=nr(r?n:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await te.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(s){return G.warn(`Gemini config warning: ${b(s)}`),{success:!1,action:null}}}async function bP(){try{let s=fe.join(jo.homedir(),".gemini","antigravity","skills"),e=fe.join(s,"prjct"),t=fe.join(e,"SKILL.md");await te.mkdir(e,{recursive:!0});let n=await C(t),r=Je("antigravity/SKILL.md");if(!r){let o=fe.join(Et,"templates","antigravity","SKILL.md");if(!await C(o))return G.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};r=await te.readFile(o,"utf-8")}return await te.writeFile(t,r,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(s){return G.warn(`Antigravity skill warning: ${b(s)}`),{success:!1,action:null}}}function Bh(){return fe.join(jo.homedir(),".codex","skills","prjct","SKILL.md")}function SP(s){return`<!-- ${Gh}: ${JSON.stringify({version:le,templateHash:s})} -->`}function Hh(s){let e=s.match(new RegExp(`<!--\\s*${Gh}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function TP(s){return Co(s)}async function Vh(){let s=Je("codex/SKILL.md");if(s)return s;let e=fe.join(Et,"templates","codex","SKILL.md");return await C(e)?te.readFile(e,"utf-8"):null}function qh(s){let e=s.trimEnd(),t=TP(e),n=SP(t);return{content:`${e}
576
+ `)}`)}let{output:r,summary:o}=n.data,i=await s.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,l=i.currentTask.subtasks[a];if(!l)return null;let u=[...i.currentTask.subtasks];u[a]={...l,status:"completed",completedAt:R(),output:r,summary:o};let d=u.filter(k=>k.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:R()}),await s.update(e,k=>({...k,currentTask:{...k.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:R()})),await s.publish(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:l.id,description:l.description,output:r,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async function rh(s,e){let t=await s.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async function oh(s,e){let t=await s.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async function hu(s,e){let t=await s.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async function ih(s,e){let t=await hu(s,e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async function ah(s,e){return(await s.read(e)).currentTask?.subtasks||[]}async function ch(s,e){return(await s.read(e)).currentTask?.subtaskProgress||null}async function lh(s,e){return((await s.read(e)).currentTask?.subtasks?.length||0)>0}async function uh(s,e){let t=await s.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async function dh(s,e,t){let n=await s.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:R(),output:`Failed: ${t}`};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:R()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await s.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:R()})),await s.publish(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<l?i[a]:null}async function ph(s,e,t){let n=await s.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:R(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:R()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await s.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:R()})),await s.publish(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<l?i[a]:null}async function mh(s,e,t){let n=await s.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,l=i.length;return a<l&&(i[a]={...i[a],status:"in_progress",startedAt:R()}),await s.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r},lastUpdated:R()})),await s.publish(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<l?i[a]:null}var gh=h(()=>{"use strict";ta();ue();c(nh,"createSubtasks");c(sh,"completeSubtask");c(rh,"getCurrentSubtask");c(oh,"getNextSubtask");c(hu,"getPreviousSubtask");c(ih,"getPreviousHandoff");c(ah,"getSubtasks");c(ch,"getSubtaskProgress");c(lh,"hasSubtasks");c(uh,"areAllSubtasksComplete");c(dh,"failSubtask");c(ph,"skipSubtask");c(mh,"blockSubtask")});async function fh(s,e,t,n){let r={...t,workspaceId:n,startedAt:R()};return await s.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],r],lastUpdated:R()})),await s.publish(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId,workspaceId:n}),r}async function hh(s,e,t){return((await s.read(e)).activeTasks||[]).find(r=>r.workspaceId===t)??null}async function yh(s,e,t,n){let r=await s.read(e),i=(r.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=R(),l=s.createTaskHistoryEntry(i,a,n),u=s.getTaskHistoryFromState(r),d=[l,...u].slice(0,s.maxTaskHistory);return await s.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await s.publish(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async function wh(s,e){return(await s.read(e)).activeTasks||[]}async function kh(s,e){return((await s.read(e)).activeTasks||[]).length}async function vh(s,e,t,n){let o=(await s.read(e)).activeTasks||[],i=o.findIndex(l=>l.workspaceId===t);if(i===-1)return null;let a={...o[i],...n,workspaceId:t};return await s.update(e,l=>{let u=[...l.activeTasks||[]];return u[i]=a,{...l,activeTasks:u,lastUpdated:R()}}),a}async function bh(s,e,t,n){let r=await s.read(e);if(!r.currentTask)return null;let o=(r.currentTask.tokensIn||0)+t,i=(r.currentTask.tokensOut||0)+n;return await s.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:R()})),{tokensIn:o,tokensOut:i}}var Sh=h(()=>{"use strict";ue();c(fh,"startTaskInWorkspace");c(hh,"getCurrentTaskForWorkspace");c(yh,"completeTaskInWorkspace");c(wh,"getActiveTasks");c(kh,"getActiveTaskCount");c(vh,"updateWorkspaceTask");c(bh,"addTokens")});var yu,B,pt=h(()=>{"use strict";ta();ue();mu();Jf();th();gh();Sh();qn();yu=class extends ot{static{c(this,"StateStorage")}constructor(){super("state.json",Ff)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Ts.getCurrentState(e),r=Ts.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async getPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let r={...t,startedAt:R()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:R()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:R()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=R(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),l=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:l,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=r.length>0?r.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:r,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return n&&(i.feedback=n),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;lifecycleBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),validateTransition:this.validateTransition.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),maxPausedTasks:this.maxPausedTasks,stalenessThresholdDays:this.stalenessThresholdDays}}async pauseTask(e,t){return Gf(this.lifecycleBackend(),e,t)}async resumeTask(e,t){return Bf(this.lifecycleBackend(),e,t)}getPausedTasksFromState(e){return Array.isArray(e.pausedTasks)&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){return Vf(this.lifecycleBackend(),e)}async archiveStalePausedTasks(e){return qf(this.lifecycleBackend(),e)}queryBackend(){return{read:this.read.bind(this),update:this.update.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this)}}async clearTask(e){return Xf(this.queryBackend(),e)}async hasTask(e){return zf(this.queryBackend(),e)}async getPausedTask(e){return Kf(this.queryBackend(),e)}async getAllPausedTasks(e){return Yf(this.queryBackend(),e)}async getTaskHistory(e){return fu(this.queryBackend(),e)}async getMostRecentTask(e){return Qf(this.queryBackend(),e)}async getTaskHistoryByType(e,t){return Zf(this.queryBackend(),e,t)}async getAggregatedFeedback(e){return eh(this.queryBackend(),e)}workspaceBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),createTaskHistoryEntry:this.createTaskHistoryEntry.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this),maxTaskHistory:this.maxTaskHistory}}async startTaskInWorkspace(e,t,n){return fh(this.workspaceBackend(),e,t,n)}async getCurrentTaskForWorkspace(e,t){return hh(this.workspaceBackend(),e,t)}async completeTaskInWorkspace(e,t,n){return yh(this.workspaceBackend(),e,t,n)}async getActiveTasks(e){return wh(this.workspaceBackend(),e)}async getActiveTaskCount(e){return kh(this.workspaceBackend(),e)}async updateWorkspaceTask(e,t,n){return vh(this.workspaceBackend(),e,t,n)}async addTokens(e,t,n){return bh(this.workspaceBackend(),e,t,n)}subtaskBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this)}}async createSubtasks(e,t){return nh(this.subtaskBackend(),e,t)}async completeSubtask(e,t){return sh(this.subtaskBackend(),e,t)}async getCurrentSubtask(e){return rh(this.subtaskBackend(),e)}async getNextSubtask(e){return oh(this.subtaskBackend(),e)}async getPreviousSubtask(e){return hu(this.subtaskBackend(),e)}async getPreviousHandoff(e){return ih(this.subtaskBackend(),e)}async getSubtasks(e){return ah(this.subtaskBackend(),e)}async getSubtaskProgress(e){return ch(this.subtaskBackend(),e)}async hasSubtasks(e){return lh(this.subtaskBackend(),e)}async areAllSubtasksComplete(e){return uh(this.subtaskBackend(),e)}async failSubtask(e,t){return dh(this.subtaskBackend(),e,t)}async skipSubtask(e,t){return ph(this.subtaskBackend(),e,t)}async blockSubtask(e,t){return mh(this.subtaskBackend(),e,t)}},B=new yu});function BR(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if(GR.has(s)||s.includes("prjct"))return{level:mr.debug,name:"debug"};let e=mr[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function sa(s,e,t){return Th>=s?(...n)=>console[t](e,...n):qR}var mr,GR,Th,VR,qR,JR,G,pn=h(()=>{"use strict";mr={error:0,warn:1,info:2,debug:3},GR=new Set(["1","true","*"]);c(BR,"getLogLevel");({level:Th,name:VR}=BR()),qR=c(()=>{},"noop");c(sa,"createLogMethod");JR={error:sa(mr.error,"[prjct:error]","error"),warn:sa(mr.warn,"[prjct:warn]","warn"),info:sa(mr.info,"[prjct:info]","log"),debug:sa(mr.debug,"[prjct:debug]","log"),isEnabled:c(()=>Th>=0,"isEnabled"),level:c(()=>VR,"level")},G=JR});import Eh from"node:fs/promises";import Ch from"node:path";async function ku(s,e,t,n){let[r,o,i,a]=await Promise.all([KR(s,e,n),YR(s),QR(s),ZR(s)]);return{project:{name:n.name,ecosystem:n.ecosystem,languages:n.languages,frameworks:n.frameworks,fileCount:n.fileCount,projectType:n.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,XR).map(l=>({message:l.message,date:l.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:r,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function KR(s,e,t){let n=[],r=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Ef(s,r,wu*2);for(let a of o){if(n.length>=wu)break;try{let l=Ch.join(e,a.path),u=await Eh.readFile(l,"utf-8");u.length>ra*3?n.push({path:a.path,content:`${u.slice(0,ra)}
577
+ // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):n.push({path:a.path,content:u.slice(0,ra),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(n.length>=wu)break;if(!n.some(l=>l.path===a))try{let l=Ch.join(e,a),u=await Eh.readFile(l,"utf-8");n.push({path:a,content:u.slice(0,ra),reason:"entry point"})}catch{}}return n}async function YR(s){try{let e=await Ke.getActive(s);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function QR(s){try{return(await B.getTaskHistory(s)).slice(0,zR).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function ZR(s){try{let e=Ct.getActiveSummary(s);return Promise.resolve(e)}catch(e){return G.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var ra,wu,XR,zR,Rh=h(()=>{"use strict";Ki();Jn();pr();pt();pn();ra=800,wu=6,XR=8,zR=5;c(ku,"buildAnalysisPayload");c(KR,"selectCodeSamples");c(YR,"getExistingPatterns");c(QR,"getTaskHistory");c(ZR,"getPreviousAnalysisSummary")});async function tP(s,e=100){try{let{stdout:t}=await U(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:s,maxBuffer:10485760}),n=[],r=null;for(let o of t.split(`
578
+ `)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=30&&n.push(r),r=new Set):i&&r&&nP(i)&&r.add(i)}return r&&r.size>0&&r.size<=30&&n.push(r),n}catch{return[]}}function nP(s){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(s)&&!s.includes("node_modules/")}async function sP(s,e=100){let t=await tP(s,e),n=new Map,r=new Map;for(let i of t){let a=Array.from(i);for(let l of a)n.set(l,(n.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=rP(a[l],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[l,u]=i.split("\0"),d=n.get(l)||0,p=n.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(o[l]||(o[l]={}),o[u]||(o[u]={}),o[l][u]=g,o[u][l]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function rP(s,e){return s<e?`${s}\0${e}`:`${e}\0${s}`}function oP(s,e){A.setDoc(s,vu,e),oa.delete(s)}function Ah(s){let e=A.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",vu);if(!e)return oa.delete(s),null;let t=oa.get(s);if(t&&t.updatedAt===e.updated_at)return t.matrix;let n=A.getDoc(s,vu);return n&&oa.set(s,{matrix:n,updatedAt:e.updated_at}),n}async function jh(s,e,t=100){let n=await sP(s,t);return oP(e,n),n}var vu,oa,bu=h(()=>{"use strict";tu();Y();Fe();c(tP,"parseGitLog");c(nP,"isSourceFile");c(sP,"buildMatrix");c(rP,"pairKey");vu="cochange-index",oa=new Map;c(oP,"saveMatrix");c(Ah,"loadMatrix");c(jh,"indexCoChanges")});import $h from"node:fs/promises";import gr from"node:path";function iP(s){let e=[],t,n=new RegExp(tg.source,"g");for(;(t=n.exec(s))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function aP(s,e,t){let n;if(s.startsWith("@/"))n=gr.join(t,"src",s.slice(2));else{let r=gr.dirname(gr.join(t,e));n=gr.resolve(r,s)}for(let r of eg){let o=n+r;try{if((await $h.stat(o)).isFile())return gr.relative(t,o)}catch{}}return null}async function cP(s){let e=await wn(s),t={},n={},r=0,o=await us(e,50,async i=>{try{let a=await $h.readFile(gr.join(s,i),"utf-8"),l=iP(a),u=[];for(let d of l){let p=await aP(d,i,s);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,r+=a.length;for(let l of a)n[l]||(n[l]=[]),n[l].push(i)}return{forward:t,reverse:n,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function lP(s,e){A.setDoc(s,Su,e),ia.delete(s)}function aa(s){let e=A.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",Su);if(!e)return ia.delete(s),null;let t=ia.get(s);if(t&&t.updatedAt===e.updated_at)return t.graph;let n=A.getDoc(s,Su);return n&&ia.set(s,{graph:n,updatedAt:e.updated_at}),n}async function Ih(s,e){let t=await cP(s);return lP(e,t),t}var Su,ia,ca=h(()=>{"use strict";Kc();Y();V();c(iP,"extractImportSources");c(aP,"resolveImport");c(cP,"buildGraph");Su="import-graph",ia=new Map;c(lP,"saveGraph");c(aa,"loadGraph");c(Ih,"indexImports")});import xo from"node:fs/promises";import la from"node:os";import fr from"node:path";function Mh(){return process.env.NODE_ENV==="test"?fr.join(la.tmpdir(),"prjct-context7-test","verify-cache.json"):fr.join(la.homedir(),".prjct-cli","state","context7-verify.json")}async function uP(){try{let s=await xo.readFile(Mh(),"utf-8"),e=JSON.parse(s);if(typeof e?.at=="number"&&e.status)return e}catch{}return null}async function dP(s,e){let t=Mh();try{await xo.mkdir(fr.dirname(t),{recursive:!0}),await xo.writeFile(t,JSON.stringify({at:s,status:e}),"utf-8")}catch{}}function pP(){let s=Je("mcp-config.json");if(!s)return{mcpServers:{context7:Eu}};try{return JSON.parse(s)}catch{return{mcpServers:{context7:Eu}}}}function Oh(){return pP().mcpServers?.context7||Eu}function Tu(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?fr.join(la.tmpdir(),"prjct-context7-test","mcp.json"):fr.join(la.homedir(),".claude","mcp.json")}async function Dh(s){try{let e=await xo.readFile(s,"utf-8");return JSON.parse(e)}catch(e){if(L(e))return{};throw e}}async function mP(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let s=Oh(),e=[...s.args||[],"--help"];await Le(s.command||"npx",e,{timeout:15e3})}var Eu,Es,Cu,gP,xn,Ao=h(()=>{"use strict";En();ki();F();Fe();V();c(Mh,"getVerifyCachePath");c(uP,"readPersistedVerify");c(dP,"writePersistedVerify");Eu={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},Es=null;c(pP,"parseTemplateConfig");c(Oh,"getContext7Config");c(Tu,"getConfigPath");c(Dh,"readConfig");c(mP,"runSmokeCheck");Cu=class{static{c(this,"Context7Service")}async install(){let e=Tu(),t=fr.dirname(e);await xo.mkdir(t,{recursive:!0});let n=await Dh(e),r=n.mcpServers||{},o=Oh(),i=r.context7;return i&&JSON.stringify(i)===JSON.stringify(o)?{installed:!0,verified:!1,configPath:e,message:"Context7 MCP already configured"}:(r.context7=o,n.mcpServers=r,await ke(e,n),Es=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"})}async verify(){let e=Date.now();if(Es&&e-Es.at<3e5)return Es.status;let t=await uP();if(t?.status.verified&&e-t.at<3e5&&t.status.configPath===Tu())return Es=t,t.status;let n=Tu(),i=((await Dh(n)).mcpServers||{}).context7;if(!i?.command||!Array.isArray(i.args)||i.args.length===0)return{installed:!1,verified:!1,configPath:n,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await mP();let a={installed:!0,verified:!0,configPath:n};return Es={at:e,status:a},await dP(e,a),a}catch(a){let l={installed:!0,verified:!1,configPath:n,message:`Context7 smoke check failed: ${b(a)}`};return Es={at:e,status:l},l}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},gP=new Cu,xn=gP});import{execFileSync as Nh,execSync as fP}from"node:child_process";var ua,Ru,da,Lh,Fh=h(()=>{"use strict";ho();Ui();ua={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Ru=class{static{c(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=ua[e];if(!n)return this.checkUnknownTool(e);let r=this.executeCheck(n);return this.setCache(e,r),r}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=ua[e],r=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new da(r)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(r=>{let o=ua[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
579
+ `);throw new da({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
580
+ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(ua),n=new Map;for(let r of t)n.set(r,this.checkTool(r));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=fP(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let r=t.match(e.versionRegex);n=r?r[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Hi(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:Hi(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Nh(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Nh(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Hi(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Ys(t,this.cacheTimeout)?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},da=class extends Error{static{c(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},Lh=new Ru});var ma={};D(ma,{installCodexSkill:()=>Pu,verifyCodexPRouterReady:()=>hr});import{execFileSync as hP}from"node:child_process";import te from"node:fs/promises";import jo from"node:os";import fe from"node:path";import Se from"chalk";async function yP(s){let e=s.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Lh.isAvailable("npm"))return console.log(`${Se.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${Se.dim(`Install ${s.displayName} using one of:`)}`),console.log(Se.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(Se.dim(` \u2022 Use Homebrew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(Se.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(Se.yellow(`\u{1F4E6} ${s.displayName} not found. Installing...`)),console.log(""),hP("npm",["install","-g",e],{stdio:"inherit",timeout:ir("NPM_INSTALL")}),console.log(""),console.log(`${Se.green("\u2713")} ${s.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(Se.yellow(`\u26A0\uFE0F Installation timed out for ${s.displayName}`)),console.log(""),console.log(Se.dim("The npm install took too long. Try:")),console.log(Se.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(Se.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(Se.yellow(`\u26A0\uFE0F Failed to install ${s.displayName}: ${n.message}`)),console.log(""),console.log(Se.dim("Alternative installation methods:")),console.log(Se.dim(` \u2022 npm: npm install -g ${e}`)),console.log(Se.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(Se.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(Se.dim(` \u2022 brew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function wP(){let s=await Tn(),e=await dl(),t=ut[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let l=ut[a],u=s[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await yP(l))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${l.displayName} installation failed`);else continue;if(a==="claude"){if(await He.detectActiveProvider()){let m=await He.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,n.commandsAdded+=m.added,n.commandsUpdated+=m.updated);let g=await He.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await He.installDocs(),await CP(),await xn.ensureReady()}}else if(a==="gemini"){await kP()&&(d.commandsAdded=1,n.commandsAdded+=1);let m=await vP();m.success&&(d.configAction=m.action)}n.providers.push(d)}if((await yo()).installed&&(await bP()).success&&console.log(` ${Se.green("\u2713")} Antigravity skill installed`),(await gs()).installed){if(!(await Pu()).success)throw new Error("Codex skill installation failed");let l=await hr({autoRepair:!0});if(!l.verified)throw new Error(l.message||"Codex p. router verification failed");console.log(` ${Se.green("\u2713")} Codex skill installed`),console.log(` ${Se.green("\u2713")} Codex p. router ready`)}await bo.saveConfig(le,await He.getInstallPath(),e.provider),await EP();for(let a of n.providers)RP(a,ut[a.provider]);return n}async function kP(){try{let s=fe.join(jo.homedir(),".gemini","commands"),e=fe.join(s,"p.toml");try{return await te.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(s){return G.warn(`Gemini router cleanup warning: ${b(s)}`),!1}}async function vP(){try{let s=fe.join(jo.homedir(),".gemini"),e=fe.join(s,"GEMINI.md");await te.mkdir(s,{recursive:!0});let t=Je("global/GEMINI.md");if(!t){let l=fe.join(Et,"templates","global","GEMINI.md");t=await te.readFile(l,"utf-8")}let n="",r=!1;try{n=await te.readFile(e,"utf-8"),r=!0}catch(l){if(L(l))r=!1;else throw l}let a=nr(r?n:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await te.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(s){return G.warn(`Gemini config warning: ${b(s)}`),{success:!1,action:null}}}async function bP(){try{let s=fe.join(jo.homedir(),".gemini","antigravity","skills"),e=fe.join(s,"prjct"),t=fe.join(e,"SKILL.md");await te.mkdir(e,{recursive:!0});let n=await C(t),r=Je("antigravity/SKILL.md");if(!r){let o=fe.join(Et,"templates","antigravity","SKILL.md");if(!await C(o))return G.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};r=await te.readFile(o,"utf-8")}return await te.writeFile(t,r,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(s){return G.warn(`Antigravity skill warning: ${b(s)}`),{success:!1,action:null}}}function Bh(){return fe.join(jo.homedir(),".codex","skills","prjct","SKILL.md")}function SP(s){return`<!-- ${Gh}: ${JSON.stringify({version:le,templateHash:s})} -->`}function Hh(s){let e=s.match(new RegExp(`<!--\\s*${Gh}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function TP(s){return Co(s)}async function Vh(){let s=Je("codex/SKILL.md");if(s)return s;let e=fe.join(Et,"templates","codex","SKILL.md");return await C(e)?te.readFile(e,"utf-8"):null}function qh(s){let e=s.trimEnd(),t=TP(e),n=SP(t);return{content:`${e}
581
581
 
582
582
  ${n}
583
- `,templateHash:t}}async function Ru(){try{let s=Bh(),e=fe.dirname(s);await te.mkdir(e,{recursive:!0});let t=await C(s),n=await Vh();if(!n)return G.warn("Codex SKILL.md template not found"),{success:!1,action:null};let r=qh(n);return t&&await te.readFile(s,"utf-8").catch(()=>"")===r.content?{success:!0,action:"unchanged"}:(await te.writeFile(s,r.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(s){return G.warn(`Codex skill warning: ${b(s)}`),{success:!1,action:null}}}async function hr(s={}){let e=Bh();if(!(await gs()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await Vh();if(!n)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let r=qh(n),o=c(async()=>s.autoRepair?(await Ru()).success:!1,"maybeRepair"),i="";if(!await C(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await te.readFile(e,"utf-8").catch(()=>"");let a=Hh(i);if(!(a?.version===le&&a?.templateHash===r.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await te.readFile(e,"utf-8").catch(()=>""),a=Hh(i),!(a?.version===le&&a?.templateHash===r.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:r.templateHash,message:"Codex p. router ready"}}async function EP(){try{let s=_.globalProjectsDir;if(!await C(s))return;let e=(await te.readdir(s,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let r=j.getDoc(n,"project");if(!r)continue;r.cliVersion!==le&&(r.cliVersion=le,j.setDoc(n,"project",r),t++)}catch{}t>0&&console.log(` ${Se.green("\u2713")} Updated ${t} project(s) to v${le}`)}catch(s){L(s)||G.warn(`Migration warning: ${b(s)}`)}}async function Uh(s,e){let t={};if(await C(s))try{t=await xe(s)??{}}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await ke(s,t)}async function CP(){try{let s=fe.join(jo.homedir(),".claude"),e=fe.join(s,"settings.json"),t=fe.join(s,"prjct-statusline.sh"),n=_.getStatusLinePath(),r=fe.join(n,"statusline.sh"),o=fe.join(n,"themes"),i=fe.join(n,"lib"),a=fe.join(n,"components"),l=fe.join(n,"config.json"),u=fe.join(Et,"assets","statusline"),d=fe.join(u,"statusline.sh"),p=fe.join(u,"themes"),m=fe.join(u,"lib"),g=fe.join(u,"components"),k=fe.join(u,"default-config.json");if(await C(s)||await te.mkdir(s,{recursive:!0}),await C(n)||await te.mkdir(n,{recursive:!0}),await C(o)||await te.mkdir(o,{recursive:!0}),await C(i)||await te.mkdir(i,{recursive:!0}),await C(a)||await te.mkdir(a,{recursive:!0}),await C(r)){let E=await te.readFile(r,"utf8");if(E.includes("CLI_VERSION=")){let y=E.match(/CLI_VERSION="([^"]*)"/);if(y&&y[1]!==le){let w=E.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${le}"`);await te.writeFile(r,w,{mode:493})}await da(m,i),await da(g,a),await Wh(t,r),await Uh(e,t);return}}if(await C(d)){let E=await te.readFile(d,"utf8");if(E=E.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${le}"`),await te.writeFile(r,E,{mode:493}),await da(m,i),await da(g,a),await C(p)){let y=await te.readdir(p);for(let w of y){let v=fe.join(p,w),S=fe.join(o,w);await te.copyFile(v,S)}}!await C(l)&&await C(k)&&await te.copyFile(k,l)}else{let E=`#!/bin/bash
583
+ `,templateHash:t}}async function Pu(){try{let s=Bh(),e=fe.dirname(s);await te.mkdir(e,{recursive:!0});let t=await C(s),n=await Vh();if(!n)return G.warn("Codex SKILL.md template not found"),{success:!1,action:null};let r=qh(n);return t&&await te.readFile(s,"utf-8").catch(()=>"")===r.content?{success:!0,action:"unchanged"}:(await te.writeFile(s,r.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(s){return G.warn(`Codex skill warning: ${b(s)}`),{success:!1,action:null}}}async function hr(s={}){let e=Bh();if(!(await gs()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await Vh();if(!n)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let r=qh(n),o=c(async()=>s.autoRepair?(await Pu()).success:!1,"maybeRepair"),i="";if(!await C(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await te.readFile(e,"utf-8").catch(()=>"");let a=Hh(i);if(!(a?.version===le&&a?.templateHash===r.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await te.readFile(e,"utf-8").catch(()=>""),a=Hh(i),!(a?.version===le&&a?.templateHash===r.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:r.templateHash,message:"Codex p. router ready"}}async function EP(){try{let s=_.globalProjectsDir;if(!await C(s))return;let e=(await te.readdir(s,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let r=j.getDoc(n,"project");if(!r)continue;r.cliVersion!==le&&(r.cliVersion=le,j.setDoc(n,"project",r),t++)}catch{}t>0&&console.log(` ${Se.green("\u2713")} Updated ${t} project(s) to v${le}`)}catch(s){L(s)||G.warn(`Migration warning: ${b(s)}`)}}async function Uh(s,e){let t={};if(await C(s))try{t=await xe(s)??{}}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await ke(s,t)}async function CP(){try{let s=fe.join(jo.homedir(),".claude"),e=fe.join(s,"settings.json"),t=fe.join(s,"prjct-statusline.sh"),n=_.getStatusLinePath(),r=fe.join(n,"statusline.sh"),o=fe.join(n,"themes"),i=fe.join(n,"lib"),a=fe.join(n,"components"),l=fe.join(n,"config.json"),u=fe.join(Et,"assets","statusline"),d=fe.join(u,"statusline.sh"),p=fe.join(u,"themes"),m=fe.join(u,"lib"),g=fe.join(u,"components"),k=fe.join(u,"default-config.json");if(await C(s)||await te.mkdir(s,{recursive:!0}),await C(n)||await te.mkdir(n,{recursive:!0}),await C(o)||await te.mkdir(o,{recursive:!0}),await C(i)||await te.mkdir(i,{recursive:!0}),await C(a)||await te.mkdir(a,{recursive:!0}),await C(r)){let E=await te.readFile(r,"utf8");if(E.includes("CLI_VERSION=")){let y=E.match(/CLI_VERSION="([^"]*)"/);if(y&&y[1]!==le){let w=E.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${le}"`);await te.writeFile(r,w,{mode:493})}await pa(m,i),await pa(g,a),await Wh(t,r),await Uh(e,t);return}}if(await C(d)){let E=await te.readFile(d,"utf8");if(E=E.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${le}"`),await te.writeFile(r,E,{mode:493}),await pa(m,i),await pa(g,a),await C(p)){let y=await te.readdir(p);for(let w of y){let v=fe.join(p,w),S=fe.join(o,w);await te.copyFile(v,S)}}!await C(l)&&await C(k)&&await te.copyFile(k,l)}else{let E=`#!/bin/bash
584
584
  # prjct Status Line for Claude Code
585
585
  CLI_VERSION="${le}"
586
586
  input=$(cat)
@@ -611,7 +611,7 @@ if [ -f "$CONFIG" ]; then
611
611
  fi
612
612
  fi
613
613
  echo "prjct"
614
- `;await te.writeFile(r,E,{mode:493})}await Wh(t,r),await Uh(e,t)}catch(s){L(s)||G.warn(`Status line warning: ${b(s)}`)}}async function da(s,e){if(!await C(s))return;let t=await te.readdir(s);for(let n of t)if(n.endsWith(".sh")){let r=fe.join(s,n),o=fe.join(e,n);await te.copyFile(r,o),await te.chmod(o,493)}}async function Wh(s,e){try{if(await C(s)){if((await te.lstat(s)).isSymbolicLink()&&await te.readlink(s)===e)return;await te.unlink(s)}await te.symlink(e,s)}catch{try{await C(e)&&(await te.copyFile(e,s),await te.chmod(s,493))}catch(n){L(n)||G.warn(`Symlink fallback warning: ${n.message}`)}}}function RP(s,e){if(console.log(""),s.cliInstalled?console.log(` ${Se.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${Se.green("\u2713")} ${e.displayName} CLI found`),s.commandsAdded+s.commandsUpdated>0){let n=[];s.commandsAdded>0&&n.push(`${s.commandsAdded} new`),s.commandsUpdated>0&&n.push(`${s.commandsUpdated} updated`),console.log(` ${Se.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${Se.green("\u2713")} Commands up to date`);s.configAction==="created"?console.log(` ${Se.green("\u2713")} Global config created (${e.contextFile})`):s.configAction==="updated"?console.log(` ${Se.green("\u2713")} Global config updated (${e.contextFile})`):s.configAction==="appended"&&console.log(` ${Se.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var Gh,PP,yr=h(()=>{"use strict";En();Ao();Fh();Y();F();Li();V();Ki();pn();We();rt();Wt();Ni();$i();ge();c(yP,"installAICLI");c(wP,"run");c(kP,"installGeminiRouter");c(vP,"installGeminiGlobalConfig");c(bP,"installAntigravitySkill");Gh="prjct-codex-router";c(Bh,"getCodexSkillPath");c(SP,"getCodexSkillMetadata");c(Hh,"parseCodexSkillMetadata");c(TP,"hashContent");c(Vh,"loadCodexSkillTemplate");c(qh,"buildCodexSkillContent");c(Ru,"installCodexSkill");c(hr,"verifyCodexPRouterReady");c(EP,"migrateProjectsCliVersion");c(Uh,"ensureStatusLineSettings");c(CP,"installStatusLine");c(da,"installStatusLineModules");c(Wh,"ensureStatusLineSymlink");c(RP,"showResults");PP=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");PP&&wP().catch(s=>{console.error("Setup error:",s.message),process.exit(1)})});import{z}from"zod";var xP,AP,Jh,jP,$P,IP,_P,DP,Xh,zh=h(()=>{"use strict";xP=z.enum(["low","medium","high"]),AP=z.enum(["pending","converted","completed","archived","dormant"]),Jh=z.enum(["high","medium","low"]),jP=z.object({impact:Jh,effort:Jh}),$P=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),IP=z.object({name:z.string(),description:z.string()}),_P=z.object({name:z.string(),description:z.string().optional()}),DP=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:xP,status:AP,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:jP.optional(),implementationNotes:z.string().optional(),stack:$P.optional(),modules:z.array(IP).optional(),roles:z.array(_P).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),Xh=z.object({ideas:z.array(DP),lastUpdated:z.string()})});var Pu,Cs,ma=h(()=>{"use strict";zh();Rn();ue();Xn();qn();Pu=class extends ot{static{c(this,"IdeasStorage")}constructor(){super("ideas.json",Xh)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let r={id:Ve(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:R()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:R()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:R()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:R()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:R()}))}async addTags(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:R()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(r=>r.id!==t),lastUpdated:R()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let r=n.sort((a,l)=>new Date(l.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(l=>!o.has(l.id)),lastUpdated:R()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=zs(Pn.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(r.length===0)return 0;dt.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:R()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},Cs=new Pu});import MP from"node:fs/promises";function $(s){return s==null?null:typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"||typeof s=="bigint"?String(s):JSON.stringify(s)}function Jt(s){if(s==null)return null;if(typeof s=="number")return s;if(typeof s=="string"){let e=Number(s);return Number.isNaN(e)?null:e}return null}async function Rt(s){try{let e=await MP.readFile(s,"utf-8");return JSON.parse(e)}catch(e){if(L(e)||e instanceof SyntaxError)return null;throw e}}var ga,fa,ha=h(()=>{"use strict";F();c($,"toStr");c(Jt,"toNum");c(Rt,"readJsonSafe");ga=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],fa=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}]});import Pt from"node:fs/promises";import zn from"node:path";async function Kh(s,e,t){let n=zn.join(e,"checksums.json"),r=await Rt(n);if(r===null){t.skippedFiles.push("index/checksums.json");return}try{let o=r.checksums;if(!o)return;let i=j.getDb(s),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[l,u]of Object.entries(o))a.run(l,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Yh(s,e,t){let n=zn.join(e,"file-scores.json"),r=await Rt(n);if(r===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=r.scores;if(!o||!Array.isArray(o))return;let i=j.getDb(s),a=i.prepare(`
614
+ `;await te.writeFile(r,E,{mode:493})}await Wh(t,r),await Uh(e,t)}catch(s){L(s)||G.warn(`Status line warning: ${b(s)}`)}}async function pa(s,e){if(!await C(s))return;let t=await te.readdir(s);for(let n of t)if(n.endsWith(".sh")){let r=fe.join(s,n),o=fe.join(e,n);await te.copyFile(r,o),await te.chmod(o,493)}}async function Wh(s,e){try{if(await C(s)){if((await te.lstat(s)).isSymbolicLink()&&await te.readlink(s)===e)return;await te.unlink(s)}await te.symlink(e,s)}catch{try{await C(e)&&(await te.copyFile(e,s),await te.chmod(s,493))}catch(n){L(n)||G.warn(`Symlink fallback warning: ${n.message}`)}}}function RP(s,e){if(console.log(""),s.cliInstalled?console.log(` ${Se.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${Se.green("\u2713")} ${e.displayName} CLI found`),s.commandsAdded+s.commandsUpdated>0){let n=[];s.commandsAdded>0&&n.push(`${s.commandsAdded} new`),s.commandsUpdated>0&&n.push(`${s.commandsUpdated} updated`),console.log(` ${Se.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${Se.green("\u2713")} Commands up to date`);s.configAction==="created"?console.log(` ${Se.green("\u2713")} Global config created (${e.contextFile})`):s.configAction==="updated"?console.log(` ${Se.green("\u2713")} Global config updated (${e.contextFile})`):s.configAction==="appended"&&console.log(` ${Se.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var Gh,PP,yr=h(()=>{"use strict";En();Ao();Fh();Y();F();Fi();V();Yi();pn();We();rt();Wt();Li();Ii();ge();c(yP,"installAICLI");c(wP,"run");c(kP,"installGeminiRouter");c(vP,"installGeminiGlobalConfig");c(bP,"installAntigravitySkill");Gh="prjct-codex-router";c(Bh,"getCodexSkillPath");c(SP,"getCodexSkillMetadata");c(Hh,"parseCodexSkillMetadata");c(TP,"hashContent");c(Vh,"loadCodexSkillTemplate");c(qh,"buildCodexSkillContent");c(Pu,"installCodexSkill");c(hr,"verifyCodexPRouterReady");c(EP,"migrateProjectsCliVersion");c(Uh,"ensureStatusLineSettings");c(CP,"installStatusLine");c(pa,"installStatusLineModules");c(Wh,"ensureStatusLineSymlink");c(RP,"showResults");PP=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");PP&&wP().catch(s=>{console.error("Setup error:",s.message),process.exit(1)})});import{z}from"zod";var xP,AP,Jh,jP,$P,IP,_P,DP,Xh,zh=h(()=>{"use strict";xP=z.enum(["low","medium","high"]),AP=z.enum(["pending","converted","completed","archived","dormant"]),Jh=z.enum(["high","medium","low"]),jP=z.object({impact:Jh,effort:Jh}),$P=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),IP=z.object({name:z.string(),description:z.string()}),_P=z.object({name:z.string(),description:z.string().optional()}),DP=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:xP,status:AP,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:jP.optional(),implementationNotes:z.string().optional(),stack:$P.optional(),modules:z.array(IP).optional(),roles:z.array(_P).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),Xh=z.object({ideas:z.array(DP),lastUpdated:z.string()})});var xu,Cs,ga=h(()=>{"use strict";zh();Rn();ue();Xn();qn();xu=class extends ot{static{c(this,"IdeasStorage")}constructor(){super("ideas.json",Xh)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let r={id:Ve(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:R()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:R()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:R()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:R()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:R()}))}async addTags(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:R()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(r=>r.id!==t),lastUpdated:R()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let r=n.sort((a,l)=>new Date(l.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(l=>!o.has(l.id)),lastUpdated:R()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=zs(Pn.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(r.length===0)return 0;dt.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:R()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},Cs=new xu});import MP from"node:fs/promises";function $(s){return s==null?null:typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"||typeof s=="bigint"?String(s):JSON.stringify(s)}function Jt(s){if(s==null)return null;if(typeof s=="number")return s;if(typeof s=="string"){let e=Number(s);return Number.isNaN(e)?null:e}return null}async function Rt(s){try{let e=await MP.readFile(s,"utf-8");return JSON.parse(e)}catch(e){if(L(e)||e instanceof SyntaxError)return null;throw e}}var fa,ha,ya=h(()=>{"use strict";F();c($,"toStr");c(Jt,"toNum");c(Rt,"readJsonSafe");fa=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],ha=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}]});import Pt from"node:fs/promises";import zn from"node:path";async function Kh(s,e,t){let n=zn.join(e,"checksums.json"),r=await Rt(n);if(r===null){t.skippedFiles.push("index/checksums.json");return}try{let o=r.checksums;if(!o)return;let i=j.getDb(s),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[l,u]of Object.entries(o))a.run(l,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Yh(s,e,t){let n=zn.join(e,"file-scores.json"),r=await Rt(n);if(r===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=r.scores;if(!o||!Array.isArray(o))return;let i=j.getDb(s),a=i.prepare(`
615
615
  INSERT OR REPLACE INTO index_files
616
616
  (path, score, size, mtime, language, categories, domain)
617
617
  VALUES (?, ?, ?, ?, NULL,
@@ -623,7 +623,7 @@ echo "prjct"
623
623
  INSERT OR IGNORE INTO sessions
624
624
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
625
625
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
626
- `),o=c(u=>{!u||!u.id||r.run($(u.id),$(u.projectId)??s,$(u.task)??"",$(u.status)??"completed",$(u.startedAt)??new Date().toISOString(),$(u.pausedAt),$(u.completedAt),Jt(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=zn.join(e,"current.json"),a=await Rt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await Pt.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let l=zn.join(e,"archive");try{let u=await Pt.readdir(l);for(let p of u){let m=zn.join(l,p);try{if(!(await Pt.stat(m)).isDirectory())continue;let k=await Pt.readdir(m);for(let y of k){if(!y.endsWith(".json"))continue;let w=zn.join(m,y),v=await Rt(w);if(v!==null)try{o(v),t.migratedFiles.push(`sessions/archive/${p}/${y}`),await Pt.unlink(w).catch(()=>{})}catch(S){t.errors.push({file:`sessions/archive/${p}/${y}`,error:String(S)})}}(await Pt.readdir(m)).length===0&&await Pt.rmdir(m).catch(()=>{})}catch{}}(await Pt.readdir(l).catch(()=>[])).length===0&&await Pt.rmdir(l).catch(()=>{})}catch{}try{(await Pt.readdir(e)).length===0&&await Pt.rmdir(e).catch(()=>{})}catch{}}var ty=h(()=>{"use strict";F();Y();ha();c(Kh,"migrateChecksums");c(Yh,"migrateFileScores");c(Qh,"migrateEventsJsonl");c(Zh,"migrateLearningsJsonl");c(ey,"migrateSessionFiles")});function xu(s,e,t){switch(e){case"state":OP(s,t);break;case"queue":NP(s,t);break;case"ideas":LP(s,t);break;case"shipped":FP(s,t);break;case"metrics":HP(s,t);break;case"analysis":UP(s,t);break}}function OP(s,e){let t=j.getDb(s),n=t.prepare(`
626
+ `),o=c(u=>{!u||!u.id||r.run($(u.id),$(u.projectId)??s,$(u.task)??"",$(u.status)??"completed",$(u.startedAt)??new Date().toISOString(),$(u.pausedAt),$(u.completedAt),Jt(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=zn.join(e,"current.json"),a=await Rt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await Pt.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let l=zn.join(e,"archive");try{let u=await Pt.readdir(l);for(let p of u){let m=zn.join(l,p);try{if(!(await Pt.stat(m)).isDirectory())continue;let k=await Pt.readdir(m);for(let y of k){if(!y.endsWith(".json"))continue;let w=zn.join(m,y),v=await Rt(w);if(v!==null)try{o(v),t.migratedFiles.push(`sessions/archive/${p}/${y}`),await Pt.unlink(w).catch(()=>{})}catch(S){t.errors.push({file:`sessions/archive/${p}/${y}`,error:String(S)})}}(await Pt.readdir(m)).length===0&&await Pt.rmdir(m).catch(()=>{})}catch{}}(await Pt.readdir(l).catch(()=>[])).length===0&&await Pt.rmdir(l).catch(()=>{})}catch{}try{(await Pt.readdir(e)).length===0&&await Pt.rmdir(e).catch(()=>{})}catch{}}var ty=h(()=>{"use strict";F();Y();ya();c(Kh,"migrateChecksums");c(Yh,"migrateFileScores");c(Qh,"migrateEventsJsonl");c(Zh,"migrateLearningsJsonl");c(ey,"migrateSessionFiles")});function Au(s,e,t){switch(e){case"state":OP(s,t);break;case"queue":NP(s,t);break;case"ideas":LP(s,t);break;case"shipped":FP(s,t);break;case"metrics":HP(s,t);break;case"analysis":UP(s,t);break}}function OP(s,e){let t=j.getDb(s),n=t.prepare(`
627
627
  INSERT OR REPLACE INTO tasks
628
628
  (id, description, type, status, parent_description, branch, linear_id,
629
629
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -655,16 +655,16 @@ echo "prjct"
655
655
  INSERT OR REPLACE INTO analysis
656
656
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
657
657
  VALUES (?, ?, ?, ?, ?, ?, ?)
658
- `),r=c((o,i)=>{o&&n.run(i,$(o.status)??"unknown",$(o.commitHash),$(o.signature),$(o.sealedAt),$(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&r(e.draft,"draft"),e.sealed&&r(e.sealed,"sealed")}function Au(s,e,t){e==="categories-cache"&&WP(s,t)}function WP(s,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let r=j.getDb(s).prepare(`
658
+ `),r=c((o,i)=>{o&&n.run(i,$(o.status)??"unknown",$(o.commitHash),$(o.signature),$(o.sealedAt),$(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&r(e.draft,"draft"),e.sealed&&r(e.sealed,"sealed")}function ju(s,e,t){e==="categories-cache"&&WP(s,t)}function WP(s,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let r=j.getDb(s).prepare(`
659
659
  INSERT OR REPLACE INTO index_files
660
660
  (path, categories, domain, score, size, mtime, language)
661
661
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
662
- `);for(let o of t){let i=$(o.path);i&&r.run(i,o.categories?JSON.stringify(o.categories):null,$(o.primaryDomain),i)}}var ny=h(()=>{"use strict";Y();ha();c(xu,"populateNormalized");c(OP,"populateTasksFromState");c(NP,"populateQueueTasks");c(LP,"populateIdeas");c(FP,"populateShippedFeatures");c(HP,"populateMetricsDaily");c(UP,"populateAnalysis");c(Au,"populateIndexTables");c(WP,"populateCategoriesIndex")});import je from"node:fs/promises";import he from"node:path";async function ya(s){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(j.exists(s)&&j.hasDoc(s,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=_.getGlobalProjectPath(s),r=he.join(n,"storage"),o=he.join(n,"index"),i=he.join(n,"memory");t.backupDir=await GP(r,o,i),j.getDb(s);for(let{filename:l,key:u}of ga){let d=he.join(r,l),p=await Rt(d);if(p===null){t.skippedFiles.push(l);continue}try{j.setDoc(s,u,p),xu(s,u,p),t.migratedFiles.push(l)}catch(m){t.errors.push({file:l,error:String(m)})}}for(let{filename:l,key:u}of fa){let d=he.join(o,l),p=await Rt(d);if(p===null){t.skippedFiles.push(`index/${l}`);continue}try{j.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),Au(s,u,p),t.migratedFiles.push(`index/${l}`)}catch(m){t.errors.push({file:`index/${l}`,error:String(m)})}}await Kh(s,o,t),await Yh(s,o,t),await Qh(s,i,t),await Zh(s,i,t);let a=he.join(n,"sessions");return await ey(s,a,t),t.errors.length===0&&await BP(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function GP(s,e,t){let n=he.join(s,"backup");return await je.mkdir(n,{recursive:!0}),await je.mkdir(he.join(n,"index"),{recursive:!0}),await je.mkdir(he.join(n,"memory"),{recursive:!0}),await ju(s,n,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await ju(e,he.join(n,"index")),await ju(t,he.join(n,"memory")),n}async function ju(s,e,t){try{let n=await je.readdir(s,{withFileTypes:!0});for(let r of n){if(!r.isFile()||t&&!t(r.name))continue;let o=he.join(s,r.name),i=he.join(e,r.name);await je.copyFile(o,i)}}catch(n){if(!L(n))throw n}}async function BP(s,e,t,n){let r=c(async(i,a)=>{try{await je.unlink(i)}catch(l){L(l)||n.errors.push({file:a,error:`cleanup: ${String(l)}`})}},"deleteFile");for(let{filename:i}of ga)await r(he.join(s,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await r(he.join(e,i),`cleanup:index/${i}`);await r(he.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(he.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function wa(s){let e=_.getGlobalProjectPath(s),t=he.join(e,"storage"),n=0;j.getDb(s);for(let{filename:k,key:E}of ga){let y=he.join(t,k),w=await Rt(y);if(w!==null){j.setDoc(s,E,w),xu(s,E,w);try{await je.unlink(y)}catch{}n++}}let r=he.join(e,"project.json"),o=await Rt(r);if(o!==null){j.setDoc(s,"project",o);try{await je.unlink(r)}catch{}n++}let i=he.join(e,"memory");for(let k of["events.jsonl","learnings.jsonl"]){let E=he.join(i,k);try{let w=(await je.readFile(E,"utf-8")).split(`
662
+ `);for(let o of t){let i=$(o.path);i&&r.run(i,o.categories?JSON.stringify(o.categories):null,$(o.primaryDomain),i)}}var ny=h(()=>{"use strict";Y();ya();c(Au,"populateNormalized");c(OP,"populateTasksFromState");c(NP,"populateQueueTasks");c(LP,"populateIdeas");c(FP,"populateShippedFeatures");c(HP,"populateMetricsDaily");c(UP,"populateAnalysis");c(ju,"populateIndexTables");c(WP,"populateCategoriesIndex")});import je from"node:fs/promises";import he from"node:path";async function wa(s){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(j.exists(s)&&j.hasDoc(s,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=_.getGlobalProjectPath(s),r=he.join(n,"storage"),o=he.join(n,"index"),i=he.join(n,"memory");t.backupDir=await GP(r,o,i),j.getDb(s);for(let{filename:l,key:u}of fa){let d=he.join(r,l),p=await Rt(d);if(p===null){t.skippedFiles.push(l);continue}try{j.setDoc(s,u,p),Au(s,u,p),t.migratedFiles.push(l)}catch(m){t.errors.push({file:l,error:String(m)})}}for(let{filename:l,key:u}of ha){let d=he.join(o,l),p=await Rt(d);if(p===null){t.skippedFiles.push(`index/${l}`);continue}try{j.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),ju(s,u,p),t.migratedFiles.push(`index/${l}`)}catch(m){t.errors.push({file:`index/${l}`,error:String(m)})}}await Kh(s,o,t),await Yh(s,o,t),await Qh(s,i,t),await Zh(s,i,t);let a=he.join(n,"sessions");return await ey(s,a,t),t.errors.length===0&&await BP(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function GP(s,e,t){let n=he.join(s,"backup");return await je.mkdir(n,{recursive:!0}),await je.mkdir(he.join(n,"index"),{recursive:!0}),await je.mkdir(he.join(n,"memory"),{recursive:!0}),await $u(s,n,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await $u(e,he.join(n,"index")),await $u(t,he.join(n,"memory")),n}async function $u(s,e,t){try{let n=await je.readdir(s,{withFileTypes:!0});for(let r of n){if(!r.isFile()||t&&!t(r.name))continue;let o=he.join(s,r.name),i=he.join(e,r.name);await je.copyFile(o,i)}}catch(n){if(!L(n))throw n}}async function BP(s,e,t,n){let r=c(async(i,a)=>{try{await je.unlink(i)}catch(l){L(l)||n.errors.push({file:a,error:`cleanup: ${String(l)}`})}},"deleteFile");for(let{filename:i}of fa)await r(he.join(s,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await r(he.join(e,i),`cleanup:index/${i}`);await r(he.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(he.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function ka(s){let e=_.getGlobalProjectPath(s),t=he.join(e,"storage"),n=0;j.getDb(s);for(let{filename:k,key:E}of fa){let y=he.join(t,k),w=await Rt(y);if(w!==null){j.setDoc(s,E,w),Au(s,E,w);try{await je.unlink(y)}catch{}n++}}let r=he.join(e,"project.json"),o=await Rt(r);if(o!==null){j.setDoc(s,"project",o);try{await je.unlink(r)}catch{}n++}let i=he.join(e,"memory");for(let k of["events.jsonl","learnings.jsonl"]){let E=he.join(i,k);try{let w=(await je.readFile(E,"utf-8")).split(`
663
663
  `).filter(S=>S.trim());if(w.length===0){await je.unlink(E),n++;continue}let v=j.getDb(s);if(k==="events.jsonl"){let S=v.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");v.transaction(()=>{for(let P of w)try{let T=JSON.parse(P);S.run($(T.type??T.action)??"unknown",$(T.taskId??T.task_id),P,$(T.timestamp??T.ts)??new Date().toISOString())}catch{}})()}else{let S=v.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");v.transaction(()=>{for(let P of w)try{let T=JSON.parse(P),O=`learning:${$(T.taskId??T.timestamp)??Date.now()}`,ae=T.tags;S.run(O,$(ae?.[0]),P,1,$(T.timestamp)??new Date().toISOString())}catch{}})()}await je.unlink(E),n++}catch{}}let a=he.join(e,"sessions"),l=c(k=>{if(!k||!k.id)return;j.getDb(s).prepare(`
664
664
  INSERT OR IGNORE INTO sessions
665
665
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
666
666
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
667
- `).run($(k.id),$(k.projectId)??s,$(k.task)??"",$(k.status)??"completed",$(k.startedAt)??new Date().toISOString(),$(k.pausedAt),$(k.completedAt),Jt(k.duration)??0,k.metrics?JSON.stringify(k.metrics):"{}",k.timeline?JSON.stringify(k.timeline):"[]")},"sessionInsert"),u=he.join(a,"current.json"),d=await Rt(u);d!==null&&(l(d),await je.unlink(u).catch(()=>{}),n++);let p=he.join(a,"archive");try{let k=await je.readdir(p);for(let y of k){let w=he.join(p,y);try{if(!(await je.stat(w)).isDirectory())continue;let S=await je.readdir(w);for(let T of S){if(!T.endsWith(".json"))continue;let O=await Rt(he.join(w,T));O!==null&&(l(O),await je.unlink(he.join(w,T)).catch(()=>{}),n++)}(await je.readdir(w)).length===0&&await je.rmdir(w).catch(()=>{})}catch{}}(await je.readdir(p).catch(()=>[])).length===0&&await je.rmdir(p).catch(()=>{})}catch{}try{(await je.readdir(a)).length===0&&await je.rmdir(a).catch(()=>{})}catch{}let m=he.join(e,"index"),g=[...fa.map(k=>k.filename),"checksums.json","file-scores.json"];for(let k of g){let E=he.join(m,k),y=await Rt(E);if(y===null)continue;let w=fa.find(v=>v.filename===k);w&&(j.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",w.key,JSON.stringify(y),new Date().toISOString()),Au(s,w.key,y));try{await je.unlink(E)}catch{}n++}return n}var $u=h(()=>{"use strict";ge();F();Y();ha();ty();ny();c(ya,"migrateJsonToSqlite");c(GP,"createBackup");c(ju,"copyFiles");c(BP,"cleanupJsonFiles");c(wa,"sweepLegacyJson")});function oy(s){return[...s].sort((e,t)=>{let n=ry[e.section]-ry[t.section];return n!==0?n:sy[e.priority]-sy[t.priority]})}function Iu(s,e){let t=new Set;return s.filter(n=>{let r=e(n);return t.has(r)?!1:(t.add(r),!0)})}var sy,ry,_u=h(()=>{"use strict";sy={critical:0,high:1,medium:2,low:3},ry={active:0,previously_active:1,backlog:2};c(oy,"sortBySectionAndPriority");c(Iu,"uniqueBy")});var iy={};D(iy,{default:()=>VP,queueStorage:()=>mt});var Du,mt,VP,Rs=h(()=>{"use strict";Rn();ea();_u();ue();Xn();qn();Du=class extends ot{static{c(this,"QueueStorage")}constructor(){super("queue.json",Hf)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return oy(t)[0]||null}async addTask(e,t){let n={...t,id:Ve(),createdAt:R(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:R()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=R(),r=t.map(o=>({...o,id:Ve(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:R()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async deleteByFeatureId(e,t){let n=0;return await this.update(e,r=>{let o=r.tasks.length,i=r.tasks.filter(a=>a.featureId!==t);return n=o-i.length,{tasks:i,lastUpdated:R()}}),n>0&&await this.publishEvent(e,"queue.tasks_removed_by_feature",{featureId:t,count:n}),n}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:R()},n):i),lastUpdated:R()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:R()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:R()}))}async getTask(e,t){return(await this.read(e)).tasks.find(r=>r.id===t)||null}async updateTask(e,t,n){let r=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(r={...i,...n},r):i),lastUpdated:R()})),r&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),r}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:R()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=zs(Pn.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;dt.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:R()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}},mt=new Du,VP=mt});import{z as ne}from"zod";var qP,ay,JP,XP,zP,KP,YP,QP,ZP,cy,ly=h(()=>{"use strict";qP=ne.enum(["feature","fix","improvement","refactor"]),ay=ne.enum(["pass","warning","fail","skipped"]),JP=ne.enum(["added","changed","fixed","removed"]),XP=ne.object({hours:ne.number(),minutes:ne.number(),totalMinutes:ne.number()}),zP=ne.object({filesChanged:ne.number().nullable().optional(),linesAdded:ne.number().nullable().optional(),linesRemoved:ne.number().nullable().optional(),commits:ne.number().nullable().optional()}),KP=ne.object({description:ne.string(),type:JP.optional()}),YP=ne.object({lintStatus:ay.nullable().optional(),lintDetails:ne.string().optional(),testStatus:ay.nullable().optional(),testDetails:ne.string().optional()}),QP=ne.object({hash:ne.string().optional(),message:ne.string().optional(),branch:ne.string().optional()}),ZP=ne.object({id:ne.string(),name:ne.string(),version:ne.string().nullable().optional(),type:qP,agent:ne.string().optional(),description:ne.string().optional(),changes:ne.array(KP).optional(),codeSnippets:ne.array(ne.string()).optional(),commit:QP.optional(),codeMetrics:zP.optional(),qualityMetrics:YP.optional(),quantitativeImpact:ne.string().optional(),duration:XP.optional(),tasksCompleted:ne.number().nullable().optional(),shippedAt:ne.string(),featureId:ne.string().optional()}),cy=ne.object({shipped:ne.array(ZP),lastUpdated:ne.string()})});var Mu,wt,uy,Ps=h(()=>{"use strict";Rn();ly();ue();Xn();qn();Mu=class extends ot{static{c(this,"ShippedStorage")}constructor(){super("shipped.json",cy)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:Ve(),shippedAt:R()};return await this.update(e,r=>({shipped:[n,...Array.isArray(r.shipped)?r.shipped:[]],lastUpdated:R()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,r;switch(t){case"week":r=new Date(n.getTime()-7*24*60*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=zs(Pn.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;dt.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:R()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},wt=new Mu,uy=wt});import{z as ve}from"zod";var ex,tx,dy,tU,nU,sU,py,my=h(()=>{"use strict";ex=ve.enum(["improving","stable","declining"]),tx=ve.object({sprintNumber:ve.number(),startDate:ve.string(),endDate:ve.string(),pointsCompleted:ve.number(),tasksCompleted:ve.number(),avgVariance:ve.number(),estimationAccuracy:ve.number()}),dy=ve.object({category:ve.string(),avgVariance:ve.number(),taskCount:ve.number()}),tU=ve.object({totalPoints:ve.number(),sprints:ve.number(),estimatedDate:ve.string()}),nU=ve.object({sprints:ve.array(tx),averageVelocity:ve.number(),velocityTrend:ex,estimationAccuracy:ve.number(),overEstimated:ve.array(dy),underEstimated:ve.array(dy),lastUpdated:ve.string()}),sU=ve.object({sprintLengthDays:ve.number().min(1).max(90).default(7),startDay:ve.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ve.number().min(1).max(52).default(6),accuracyTolerance:ve.number().min(0).max(100).default(20)}),py={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ou,gy,fy=h(()=>{"use strict";my();qn();Ou=class extends ot{static{c(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:py,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},gy=new Ou});function hy(s){return s.projectName?`# ${s.projectName}
667
+ `).run($(k.id),$(k.projectId)??s,$(k.task)??"",$(k.status)??"completed",$(k.startedAt)??new Date().toISOString(),$(k.pausedAt),$(k.completedAt),Jt(k.duration)??0,k.metrics?JSON.stringify(k.metrics):"{}",k.timeline?JSON.stringify(k.timeline):"[]")},"sessionInsert"),u=he.join(a,"current.json"),d=await Rt(u);d!==null&&(l(d),await je.unlink(u).catch(()=>{}),n++);let p=he.join(a,"archive");try{let k=await je.readdir(p);for(let y of k){let w=he.join(p,y);try{if(!(await je.stat(w)).isDirectory())continue;let S=await je.readdir(w);for(let T of S){if(!T.endsWith(".json"))continue;let O=await Rt(he.join(w,T));O!==null&&(l(O),await je.unlink(he.join(w,T)).catch(()=>{}),n++)}(await je.readdir(w)).length===0&&await je.rmdir(w).catch(()=>{})}catch{}}(await je.readdir(p).catch(()=>[])).length===0&&await je.rmdir(p).catch(()=>{})}catch{}try{(await je.readdir(a)).length===0&&await je.rmdir(a).catch(()=>{})}catch{}let m=he.join(e,"index"),g=[...ha.map(k=>k.filename),"checksums.json","file-scores.json"];for(let k of g){let E=he.join(m,k),y=await Rt(E);if(y===null)continue;let w=ha.find(v=>v.filename===k);w&&(j.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",w.key,JSON.stringify(y),new Date().toISOString()),ju(s,w.key,y));try{await je.unlink(E)}catch{}n++}return n}var Iu=h(()=>{"use strict";ge();F();Y();ya();ty();ny();c(wa,"migrateJsonToSqlite");c(GP,"createBackup");c($u,"copyFiles");c(BP,"cleanupJsonFiles");c(ka,"sweepLegacyJson")});function oy(s){return[...s].sort((e,t)=>{let n=ry[e.section]-ry[t.section];return n!==0?n:sy[e.priority]-sy[t.priority]})}function _u(s,e){let t=new Set;return s.filter(n=>{let r=e(n);return t.has(r)?!1:(t.add(r),!0)})}var sy,ry,Du=h(()=>{"use strict";sy={critical:0,high:1,medium:2,low:3},ry={active:0,previously_active:1,backlog:2};c(oy,"sortBySectionAndPriority");c(_u,"uniqueBy")});var iy={};D(iy,{default:()=>VP,queueStorage:()=>mt});var Mu,mt,VP,Rs=h(()=>{"use strict";Rn();ta();Du();ue();Xn();qn();Mu=class extends ot{static{c(this,"QueueStorage")}constructor(){super("queue.json",Hf)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return oy(t)[0]||null}async addTask(e,t){let n={...t,id:Ve(),createdAt:R(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:R()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=R(),r=t.map(o=>({...o,id:Ve(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:R()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async deleteByFeatureId(e,t){let n=0;return await this.update(e,r=>{let o=r.tasks.length,i=r.tasks.filter(a=>a.featureId!==t);return n=o-i.length,{tasks:i,lastUpdated:R()}}),n>0&&await this.publishEvent(e,"queue.tasks_removed_by_feature",{featureId:t,count:n}),n}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:R()},n):i),lastUpdated:R()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:R()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:R()}))}async getTask(e,t){return(await this.read(e)).tasks.find(r=>r.id===t)||null}async updateTask(e,t,n){let r=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(r={...i,...n},r):i),lastUpdated:R()})),r&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),r}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:R()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=zs(Pn.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;dt.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:R()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}},mt=new Mu,VP=mt});import{z as ne}from"zod";var qP,ay,JP,XP,zP,KP,YP,QP,ZP,cy,ly=h(()=>{"use strict";qP=ne.enum(["feature","fix","improvement","refactor"]),ay=ne.enum(["pass","warning","fail","skipped"]),JP=ne.enum(["added","changed","fixed","removed"]),XP=ne.object({hours:ne.number(),minutes:ne.number(),totalMinutes:ne.number()}),zP=ne.object({filesChanged:ne.number().nullable().optional(),linesAdded:ne.number().nullable().optional(),linesRemoved:ne.number().nullable().optional(),commits:ne.number().nullable().optional()}),KP=ne.object({description:ne.string(),type:JP.optional()}),YP=ne.object({lintStatus:ay.nullable().optional(),lintDetails:ne.string().optional(),testStatus:ay.nullable().optional(),testDetails:ne.string().optional()}),QP=ne.object({hash:ne.string().optional(),message:ne.string().optional(),branch:ne.string().optional()}),ZP=ne.object({id:ne.string(),name:ne.string(),version:ne.string().nullable().optional(),type:qP,agent:ne.string().optional(),description:ne.string().optional(),changes:ne.array(KP).optional(),codeSnippets:ne.array(ne.string()).optional(),commit:QP.optional(),codeMetrics:zP.optional(),qualityMetrics:YP.optional(),quantitativeImpact:ne.string().optional(),duration:XP.optional(),tasksCompleted:ne.number().nullable().optional(),shippedAt:ne.string(),featureId:ne.string().optional()}),cy=ne.object({shipped:ne.array(ZP),lastUpdated:ne.string()})});var Ou,wt,uy,Ps=h(()=>{"use strict";Rn();ly();ue();Xn();qn();Ou=class extends ot{static{c(this,"ShippedStorage")}constructor(){super("shipped.json",cy)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:Ve(),shippedAt:R()};return await this.update(e,r=>({shipped:[n,...Array.isArray(r.shipped)?r.shipped:[]],lastUpdated:R()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,r;switch(t){case"week":r=new Date(n.getTime()-7*24*60*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=zs(Pn.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;dt.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:R()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},wt=new Ou,uy=wt});import{z as ve}from"zod";var ex,tx,dy,sU,rU,oU,py,my=h(()=>{"use strict";ex=ve.enum(["improving","stable","declining"]),tx=ve.object({sprintNumber:ve.number(),startDate:ve.string(),endDate:ve.string(),pointsCompleted:ve.number(),tasksCompleted:ve.number(),avgVariance:ve.number(),estimationAccuracy:ve.number()}),dy=ve.object({category:ve.string(),avgVariance:ve.number(),taskCount:ve.number()}),sU=ve.object({totalPoints:ve.number(),sprints:ve.number(),estimatedDate:ve.string()}),rU=ve.object({sprints:ve.array(tx),averageVelocity:ve.number(),velocityTrend:ex,estimationAccuracy:ve.number(),overEstimated:ve.array(dy),underEstimated:ve.array(dy),lastUpdated:ve.string()}),oU=ve.object({sprintLengthDays:ve.number().min(1).max(90).default(7),startDay:ve.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ve.number().min(1).max(52).default(6),accuracyTolerance:ve.number().min(0).max(100).default(20)}),py={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Nu,gy,fy=h(()=>{"use strict";my();qn();Nu=class extends ot{static{c(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:py,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},gy=new Nu});function hy(s){return s.projectName?`# ${s.projectName}
668
668
  ${s.stack} | ${s.fileCount} files | v${s.version} | Branch: ${s.branch}`:["This is the baseline `prjct` skill installed by the CLI on every invocation.","","No project has been initialized in this cwd yet (`.prjct/` missing). When the user","shows intent (start a task, capture a thought, ship), suggest `prjct init` ONCE","in one line, then run the verb. Don't gate routine captures on init.","","After `prjct sync` runs in an initialized project, this file is regenerated with","project-specific context (name, stack, velocity, active task, recent shipped,","known gotchas). The verb intent map below applies in both states."].join(`
669
669
  `)}function nx(s){return s.patterns.length===0?"":`
670
670
  ## Patterns
@@ -706,27 +706,27 @@ allowed-tools: [${s.allowedTools.map(n=>`"${n}"`).join(", ")}]
706
706
  user-invocable: ${t}
707
707
  ---`}function px(s,e){return`${dx(s,e)}
708
708
 
709
- ${s.body(e)}`}var Nu,Lu,Ty,Ey=h(()=>{"use strict";Gn();pn();Sy();Nu=[{name:"prjct",description:ky,allowedTools:[...vy],condition:c(()=>!0,"condition"),body:c(s=>by(s),"body")}];c(dx,"buildFrontmatter");c(px,"buildSkillContent");Lu=class{static{c(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},n){let r={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:n?.version??e.stats.version??"0.0.0",fileCount:n?.fileCount??e.stats.fileCount??0,patterns:n?.patterns??[],antiPatterns:n?.antiPatterns??[],recentShipped:n?.recentShipped??[],velocity:n?.velocity??null,backlogCount:n?.backlogCount??t.backlogCount,completedTaskCount:n?.completedTaskCount??t.completedTaskCount,pausedTaskCount:n?.pausedTaskCount??t.pausedTaskCount,knownGotchas:n?.knownGotchas??[],hasActiveTask:n?.hasActiveTask??t.hasActiveTask,activeTaskDescription:n?.activeTaskDescription??"",pausedTasks:n?.pausedTasks??[],topBacklog:n?.topBacklog??[],ideasCount:n?.ideasCount??0,shippedCount:n?.shippedCount??0,userPatterns:n?.userPatterns??[]},i=Io.join(ux.homedir(),".claude","skills");for(let l of Nu){if(!l.condition(t)){r.skipped.push({name:l.name,reason:"condition not met"}),await $o.rm(Io.join(i,l.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=px(l,o),d=Io.join(i,l.name),p=Io.join(d,"SKILL.md");await $o.mkdir(d,{recursive:!0}),await $o.writeFile(p,u,"utf-8"),r.generated.push({name:l.name,path:p})}catch(u){G.debug(`Failed to generate skill ${l.name}`,{error:Ge(u)}),r.skipped.push({name:l.name,reason:Ge(u)})}}let a=new Set(Nu.map(l=>l.name));try{let l=await $o.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of l)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await $o.rm(Io.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return r.generated.length>0&&G.info("Generated native workflow skills",{count:r.generated.length,skills:r.generated.map(l=>l.name)}),r}getDefinitions(){return Nu}},Ty=new Lu});function ka(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}function va(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}function ba(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}function Sa(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}var Cy=h(()=>{"use strict";c(ka,"emptyGitData");c(va,"emptyStats");c(ba,"emptyCommands");c(Sa,"emptyStack")});function Ry(s,e){let t=[...s.added,...s.modified],n=new Set(t),r=new Set,o=ia(e);if(o)for(let l of t){let u=o.reverse[l];if(u)for(let d of u)n.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:s.deleted,allAffected:a}}function Py(s){let e=new Set;for(let t of s){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var xy=h(()=>{"use strict";aa();c(Ry,"propagateChanges");c(Py,"affectedDomains")});import Ay from"node:fs/promises";import mx from"node:path";function gx(s){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(s).toString(36)}`;let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function fx(s){let e=await wn(s,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,n=await us(e,100,async r=>{try{let o=mx.join(s,r),[i,a]=await Promise.all([Ay.readFile(o,"utf-8"),Ay.stat(o)]);return{path:r,hash:gx(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let r of n)t.set(r.path,r);return t}function hx(s,e){let t=[],n=[],r=[];for(let[i,a]of s){let l=e.get(i);l?l.hash!==a.hash?n.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())s.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:r}}function Fu(s,e){let t=A.getDb(s);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)n.run(r.path,r.hash,r.size,r.mtime)})(),A.setDoc(s,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function yx(s){let e=new Map;try{let t=A.query(s,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Hu(s,e){let[t,n]=await Promise.all([fx(s),Promise.resolve(yx(e))]);return{diff:hx(t,n),currentHashes:t}}function jy(s){return A.hasDoc(s,"file-hashes-meta")}var $y=h(()=>{"use strict";Y();V();c(gx,"hashContent");c(fx,"computeHashes");c(hx,"diffHashes");c(Fu,"saveHashes");c(yx,"loadHashes");c(Hu,"detectChanges");c(jy,"hasHashRegistry")});async function Iy(s){let{projectId:e,projectPath:t,isFullSync:n,changedFilesHint:r}=s,o=!0,i=new Set,a;if(!n&&jy(e))try{let{diff:l,currentHashes:u}=await Hu(t,e),d=l.added.length+l.modified.length+l.deleted.length;if(d===0&&!r?.length)o=!1,a={isIncremental:!0,filesChanged:0,filesUnchanged:l.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let p=Ry(l,e);i=Py(p.allAffected),o=p.allAffected.some(g=>{let k=g.substring(g.lastIndexOf("."));return wx.has(k)}),a={isIncremental:!0,filesChanged:d,filesUnchanged:l.unchanged.length,indexesRebuilt:o,affectedDomains:Array.from(i)}}Fu(e,u)}catch(l){G.debug("Incremental detection failed, falling back to full sync",{error:b(l)})}else try{let{currentHashes:l}=await Hu(t,e);Fu(e,l)}catch(l){G.debug("Hash computation failed (non-critical)",{error:b(l)})}return{shouldRebuildIndexes:o,changedDomains:i,incrementalInfo:a}}var wx,_y=h(()=>{"use strict";xy();$y();F();pn();wx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);c(Iy,"detectIncrementalChanges")});import{z as Ue}from"zod";function Ny(s,e="default"){let t=Dy[e]||Dy.default;return s/1e3*t}function Ta(s){return s<.01?`$${(s*100).toFixed(2)}\xA2`:`$${s.toFixed(2)}`}var kx,vx,My,Oy,Dy,Ea=h(()=>{"use strict";kx=Ue.object({date:Ue.string(),tokensSaved:Ue.number(),syncs:Ue.number(),avgCompressionRate:Ue.number(),totalDuration:Ue.number()}),vx=Ue.object({agentName:Ue.string(),usageCount:Ue.number(),tokensSaved:Ue.number()}),My=Ue.object({totalTokensSaved:Ue.number(),avgCompressionRate:Ue.number(),syncCount:Ue.number(),watchTriggers:Ue.number(),avgSyncDuration:Ue.number(),totalSyncDuration:Ue.number(),agentUsage:Ue.array(vx),dailyStats:Ue.array(kx),firstSync:Ue.string(),lastUpdated:Ue.string()}),Oy={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Dy={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};c(Ny,"estimateCostSaved");c(Ta,"formatCost")});var Uu,wr,Wu=h(()=>{"use strict";Ea();ue();qn();Uu=class extends ot{static{c(this,"MetricsStorage")}constructor(){super("metrics.json",My)}getDefault(){return{...Oy}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,l=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,p=[...i.dailyStats],m=p.findIndex(w=>w.date===o);if(m>=0){let w=p[m];p[m]={...w,tokensSaved:w.tokensSaved+n,syncs:w.syncs+1,avgCompressionRate:(w.avgCompressionRate*w.syncs+r)/(w.syncs+1),totalDuration:w.totalDuration+t.duration}}else p.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let k=g.toISOString().split("T")[0],E=p.filter(w=>w.date>=k),y=[...i.agentUsage];if(t.agents)for(let w of t.agents){let v=y.findIndex(S=>S.agentName===w);v>=0?y[v]={...y[v],usageCount:y[v].usageCount+1,tokensSaved:y[v].tokensSaved+Math.floor(n/t.agents.length)}:y.push({agentName:w,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:l,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:y,dailyStats:E,firstSync:i.firstSync||R(),lastUpdated:R()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=n.reduce((l,u)=>l+u.tokensSaved,0),i=r.reduce((l,u)=>l+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Ny(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((l,u)=>u.usageCount-l.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(r=>r.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let r=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},wr=new Uu});var Gu,it,Kn=h(()=>{"use strict";re();Xn();Y();Gu=class{static{c(this,"MemoryService")}async log(e,t,n,r){try{let o=await I.getProjectId(e);if(!o)return;A.appendEvent(o,`memory.${t}`,{...n,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await I.getProjectId(e);return n?A.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...l}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:l,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),l=JSON.stringify(i.data).toLowerCase().includes(o);return a||l}).slice(-n)}async getByAction(e,t,n=50){try{let r=await I.getProjectId(e);return r?A.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:l,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:l}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await I.getProjectId(e);if(!t)return;A.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return A.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=A.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Pn.MEMORY_MAX_ENTRIES)return 0;let r=n-Pn.MEMORY_MAX_ENTRIES,o=A.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);dt.archiveMany(e,o.map((a,l)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||l}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&A.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},it=new Gu});import bx from"node:path";function Sx(s){return Pf(bx.resolve(s))}function _o(s){return s.toLowerCase().replace(/[^a-z0-9]+/g,"")}function Tx(s){return Iu(s,e=>`${_o(e.name)}::${_o(e.source)}`)}function Ex(s){return Iu(s,e=>`${_o(e.issue)}::${_o(e.file)}::${_o(e.source)}`)}var Bu,Cx,Ly,Fy=h(()=>{"use strict";Y();_u();Ki();c(Sx,"repoHash");c(_o,"normalizeKey");c(Tx,"dedupePatterns");c(Ex,"dedupeAntiPatterns");Bu=class{static{c(this,"PatternExtractor")}async extract(e){let t=Sx(e.projectPath),n=[];if(e.context7Verified)for(let u of e.frameworks)n.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let r=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=Tx([...n,...r]),a=Ex([...o]),l=`analysis:derived-rules:${t}`;return j.setDoc(e.projectId,l,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},Cx=new Bu,Ly=Cx});async function Hy(s,e,t){let n=0;try{let a=Xi(s);if(a)for(let l of Object.values(a.documents))n+=l.length}catch(a){G.debug("Could not load BM25 index for metrics",{error:b(a)})}n===0&&(n=e.fileCount*Rx);let r=0,o=n>0?Math.max(0,(n-r)/n):0;try{await wr.recordSync(s,{originalSize:n,filteredSize:r,duration:t,isWatch:!1})}catch(a){G.debug("Failed to record sync metrics",{error:b(a)})}let i={};try{let a=Xi(s);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let l=ia(s);l&&(i.importEdges=l.edgeCount,i.importFiles=l.fileCount);let u=Ah(s);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){G.debug("Could not load index stats",{error:b(a)})}return{duration:t,originalSize:n,filteredSize:r,compressionRate:o,indexes:i}}async function Uy(s,e,t,n,r,o){try{let i=t.recentCommits[0]?.hash||null,a=[],l=[],u;try{u=await B.getAggregatedFeedback(s),u.patternsDiscovered.length>0&&(a=u.patternsDiscovered.map(p=>({name:p,description:`Discovered during task execution: ${p}`,source:"feedback",confidence:.74}))),u.knownGotchas.length>0&&(l=u.knownGotchas.map(p=>({issue:p,file:"multiple",suggestion:`Recurring issue reported across tasks: ${p}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let d=await Ly.extract({projectId:s,projectPath:e,languages:n.languages,frameworks:Array.from(new Set([...n.frameworks,...r.frameworks])),feedback:u,context7Verified:o});a=d.patterns,l=d.antiPatterns,await Ke.saveDraft(s,{projectId:s,languages:n.languages,frameworks:n.frameworks,configFiles:[],fileCount:n.fileCount,patterns:a,antiPatterns:l,analyzedAt:R(),status:"draft",commitHash:i??void 0})}catch(i){G.debug("Failed to save draft analysis (non-critical)",{error:b(i)})}}async function Wy(s){try{let[e,t,n,r,o]=await Promise.all([wt.archiveOldShipped(s).catch(()=>0),Cs.markDormantIdeas(s).catch(()=>0),mt.removeStaleCompleted(s).catch(()=>0),B.archiveStalePausedTasks(s).catch(()=>[]),it.capEntries(s).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){G.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=dt.getStats(s);G.debug("Archive stats",a)}}catch(e){G.debug("Archival failed (non-critical)",{error:b(e)})}}var Rx,Gy=h(()=>{"use strict";zi();vu();aa();Jn();Xn();ma();Wu();Rs();Ps();pt();F();ue();pn();Kn();Fy();Rx=200;c(Hy,"recordSyncMetrics");c(Uy,"saveDraftAnalysis");c(Wy,"archiveStaleData")});import Vu from"node:fs/promises";import Ca from"node:path";var qu,Ju,By,Vy=h(()=>{"use strict";F();V();qu=".prjct/.prjct-state.md",Ju=class{static{c(this,"LocalStateGenerator")}async generate(e,t){let n=Ca.join(e,qu);await Vu.mkdir(Ca.dirname(n),{recursive:!0});let r=this.toMarkdown(t);await Vu.writeFile(n,r,"utf-8")}async remove(e){try{await Vu.unlink(Ca.join(e,qu))}catch(t){if(!L(t))throw t}}async exists(e){let t=Ca.join(e,qu);return C(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,l)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=l===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${l+1}. ${u} ${a.description}${d}`)}),t.push("");let r=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
710
- `)}},By=new Ju});import Px from"node:fs/promises";import xx from"node:path";async function qy(s){await Promise.all(Ax.map(e=>Px.mkdir(xx.join(s,e),{recursive:!0})))}async function Jy(s){let{projectId:e,projectPath:t,cliVersion:n,git:r,stats:o}=s,i=j.getDoc(e,"project")||{},a={...i,projectId:e,repoPath:t,name:o.name,version:o.version,cliVersion:n,techStack:o.frameworks,fileCount:o.fileCount,commitCount:r.commits,stack:o.ecosystem,currentBranch:r.branch,hasUncommittedChanges:r.hasChanges,createdAt:i.createdAt||R(),lastSync:R(),lastSyncCommit:r.recentCommits[0]?.hash||null,lastSyncBranch:r.branch};j.setDoc(e,"project",a)}async function Xy(s){let{projectId:e,projectPath:t,stats:n,stack:r}=s,i={...await B.read(e)};i.projectId=e,i.stack={language:n.languages[0]||"Unknown",framework:n.frameworks[0]||null},i.domains={hasFrontend:r.hasFrontend,hasBackend:r.hasBackend,hasDatabase:r.hasDatabase,hasTesting:r.hasTesting,hasDocker:r.hasDocker},i.projectType=n.projectType,i.metrics={totalFiles:n.fileCount},i.lastSync=R(),i.lastUpdated=R(),i.context={...i.context||{},lastSession:R(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await B.write(e,i);try{await By.generate(t,i)}catch(a){G.debug("Local state generation failed (optional)",{error:b(a)})}}function zy(s,e,t){j.appendEvent(s,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}var Ax,Ky=h(()=>{"use strict";Y();pt();F();ue();pn();Vy();Ax=["storage","context","memory","analysis","config","sync"];c(qy,"ensureProjectDirectories");c(Jy,"updateProjectDoc");c(Xy,"updateStateDoc");c(zy,"logSyncEvent")});var Yy=h(()=>{"use strict"});import jx from"node:fs/promises";import Qy from"node:path";var Ra,Zy=h(()=>{"use strict";V();Ra=class{static{c(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Qy.join(this.projectPath,"package.json"),t=await jx.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(Qy.join(this.projectPath,e))}}});import Xu from"node:path";async function ew(s){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0},t={cwd:s},n=c(d=>d.catch(()=>null),"safe"),[r,o,i,a,l,u]=await Promise.all([n(U("git branch --show-current",t)),n(U("git rev-list --count HEAD",t)),n(U("git shortlog -sn --all",t)),n(U("git status --porcelain",t)),n(U('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',t)),n(U('git log --oneline --since="1 week ago"',t))]);if(r&&(e.branch=r.stdout.trim()||"main"),o&&(e.commits=parseInt(o.stdout.trim(),10)||0),i&&(e.contributors=i.stdout.split(`
709
+ ${s.body(e)}`}var Lu,Fu,Ty,Ey=h(()=>{"use strict";Gn();pn();Sy();Lu=[{name:"prjct",description:ky,allowedTools:[...vy],condition:c(()=>!0,"condition"),body:c(s=>by(s),"body")}];c(dx,"buildFrontmatter");c(px,"buildSkillContent");Fu=class{static{c(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},n){let r={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:n?.version??e.stats.version??"0.0.0",fileCount:n?.fileCount??e.stats.fileCount??0,patterns:n?.patterns??[],antiPatterns:n?.antiPatterns??[],recentShipped:n?.recentShipped??[],velocity:n?.velocity??null,backlogCount:n?.backlogCount??t.backlogCount,completedTaskCount:n?.completedTaskCount??t.completedTaskCount,pausedTaskCount:n?.pausedTaskCount??t.pausedTaskCount,knownGotchas:n?.knownGotchas??[],hasActiveTask:n?.hasActiveTask??t.hasActiveTask,activeTaskDescription:n?.activeTaskDescription??"",pausedTasks:n?.pausedTasks??[],topBacklog:n?.topBacklog??[],ideasCount:n?.ideasCount??0,shippedCount:n?.shippedCount??0,userPatterns:n?.userPatterns??[]},i=Io.join(ux.homedir(),".claude","skills");for(let l of Lu){if(!l.condition(t)){r.skipped.push({name:l.name,reason:"condition not met"}),await $o.rm(Io.join(i,l.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=px(l,o),d=Io.join(i,l.name),p=Io.join(d,"SKILL.md");await $o.mkdir(d,{recursive:!0}),await $o.writeFile(p,u,"utf-8"),r.generated.push({name:l.name,path:p})}catch(u){G.debug(`Failed to generate skill ${l.name}`,{error:Ge(u)}),r.skipped.push({name:l.name,reason:Ge(u)})}}let a=new Set(Lu.map(l=>l.name));try{let l=await $o.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of l)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await $o.rm(Io.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return r.generated.length>0&&G.info("Generated native workflow skills",{count:r.generated.length,skills:r.generated.map(l=>l.name)}),r}getDefinitions(){return Lu}},Ty=new Fu});function va(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}function ba(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}function Sa(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}function Ta(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}var Cy=h(()=>{"use strict";c(va,"emptyGitData");c(ba,"emptyStats");c(Sa,"emptyCommands");c(Ta,"emptyStack")});function Ry(s,e){let t=[...s.added,...s.modified],n=new Set(t),r=new Set,o=aa(e);if(o)for(let l of t){let u=o.reverse[l];if(u)for(let d of u)n.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:s.deleted,allAffected:a}}function Py(s){let e=new Set;for(let t of s){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var xy=h(()=>{"use strict";ca();c(Ry,"propagateChanges");c(Py,"affectedDomains")});import Ay from"node:fs/promises";import mx from"node:path";function gx(s){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(s).toString(36)}`;let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function fx(s){let e=await wn(s,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,n=await us(e,100,async r=>{try{let o=mx.join(s,r),[i,a]=await Promise.all([Ay.readFile(o,"utf-8"),Ay.stat(o)]);return{path:r,hash:gx(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let r of n)t.set(r.path,r);return t}function hx(s,e){let t=[],n=[],r=[];for(let[i,a]of s){let l=e.get(i);l?l.hash!==a.hash?n.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())s.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:r}}function Hu(s,e){let t=A.getDb(s);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)n.run(r.path,r.hash,r.size,r.mtime)})(),A.setDoc(s,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function yx(s){let e=new Map;try{let t=A.query(s,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Uu(s,e){let[t,n]=await Promise.all([fx(s),Promise.resolve(yx(e))]);return{diff:hx(t,n),currentHashes:t}}function jy(s){return A.hasDoc(s,"file-hashes-meta")}var $y=h(()=>{"use strict";Y();V();c(gx,"hashContent");c(fx,"computeHashes");c(hx,"diffHashes");c(Hu,"saveHashes");c(yx,"loadHashes");c(Uu,"detectChanges");c(jy,"hasHashRegistry")});async function Iy(s){let{projectId:e,projectPath:t,isFullSync:n,changedFilesHint:r}=s,o=!0,i=new Set,a;if(!n&&jy(e))try{let{diff:l,currentHashes:u}=await Uu(t,e),d=l.added.length+l.modified.length+l.deleted.length;if(d===0&&!r?.length)o=!1,a={isIncremental:!0,filesChanged:0,filesUnchanged:l.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let p=Ry(l,e);i=Py(p.allAffected),o=p.allAffected.some(g=>{let k=g.substring(g.lastIndexOf("."));return wx.has(k)}),a={isIncremental:!0,filesChanged:d,filesUnchanged:l.unchanged.length,indexesRebuilt:o,affectedDomains:Array.from(i)}}Hu(e,u)}catch(l){G.debug("Incremental detection failed, falling back to full sync",{error:b(l)})}else try{let{currentHashes:l}=await Uu(t,e);Hu(e,l)}catch(l){G.debug("Hash computation failed (non-critical)",{error:b(l)})}return{shouldRebuildIndexes:o,changedDomains:i,incrementalInfo:a}}var wx,_y=h(()=>{"use strict";xy();$y();F();pn();wx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);c(Iy,"detectIncrementalChanges")});import{z as Ue}from"zod";function Ny(s,e="default"){let t=Dy[e]||Dy.default;return s/1e3*t}function Ea(s){return s<.01?`$${(s*100).toFixed(2)}\xA2`:`$${s.toFixed(2)}`}var kx,vx,My,Oy,Dy,Ca=h(()=>{"use strict";kx=Ue.object({date:Ue.string(),tokensSaved:Ue.number(),syncs:Ue.number(),avgCompressionRate:Ue.number(),totalDuration:Ue.number()}),vx=Ue.object({agentName:Ue.string(),usageCount:Ue.number(),tokensSaved:Ue.number()}),My=Ue.object({totalTokensSaved:Ue.number(),avgCompressionRate:Ue.number(),syncCount:Ue.number(),watchTriggers:Ue.number(),avgSyncDuration:Ue.number(),totalSyncDuration:Ue.number(),agentUsage:Ue.array(vx),dailyStats:Ue.array(kx),firstSync:Ue.string(),lastUpdated:Ue.string()}),Oy={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Dy={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};c(Ny,"estimateCostSaved");c(Ea,"formatCost")});var Wu,wr,Gu=h(()=>{"use strict";Ca();ue();qn();Wu=class extends ot{static{c(this,"MetricsStorage")}constructor(){super("metrics.json",My)}getDefault(){return{...Oy}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,l=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,p=[...i.dailyStats],m=p.findIndex(w=>w.date===o);if(m>=0){let w=p[m];p[m]={...w,tokensSaved:w.tokensSaved+n,syncs:w.syncs+1,avgCompressionRate:(w.avgCompressionRate*w.syncs+r)/(w.syncs+1),totalDuration:w.totalDuration+t.duration}}else p.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let k=g.toISOString().split("T")[0],E=p.filter(w=>w.date>=k),y=[...i.agentUsage];if(t.agents)for(let w of t.agents){let v=y.findIndex(S=>S.agentName===w);v>=0?y[v]={...y[v],usageCount:y[v].usageCount+1,tokensSaved:y[v].tokensSaved+Math.floor(n/t.agents.length)}:y.push({agentName:w,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:l,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:y,dailyStats:E,firstSync:i.firstSync||R(),lastUpdated:R()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=n.reduce((l,u)=>l+u.tokensSaved,0),i=r.reduce((l,u)=>l+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Ny(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((l,u)=>u.usageCount-l.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(r=>r.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let r=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},wr=new Wu});var Bu,it,Kn=h(()=>{"use strict";re();Xn();Y();Bu=class{static{c(this,"MemoryService")}async log(e,t,n,r){try{let o=await I.getProjectId(e);if(!o)return;A.appendEvent(o,`memory.${t}`,{...n,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await I.getProjectId(e);return n?A.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...l}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:l,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),l=JSON.stringify(i.data).toLowerCase().includes(o);return a||l}).slice(-n)}async getByAction(e,t,n=50){try{let r=await I.getProjectId(e);return r?A.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:l,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:l}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await I.getProjectId(e);if(!t)return;A.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return A.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=A.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Pn.MEMORY_MAX_ENTRIES)return 0;let r=n-Pn.MEMORY_MAX_ENTRIES,o=A.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);dt.archiveMany(e,o.map((a,l)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||l}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&A.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},it=new Bu});import bx from"node:path";function Sx(s){return Pf(bx.resolve(s))}function _o(s){return s.toLowerCase().replace(/[^a-z0-9]+/g,"")}function Tx(s){return _u(s,e=>`${_o(e.name)}::${_o(e.source)}`)}function Ex(s){return _u(s,e=>`${_o(e.issue)}::${_o(e.file)}::${_o(e.source)}`)}var Vu,Cx,Ly,Fy=h(()=>{"use strict";Y();Du();Yi();c(Sx,"repoHash");c(_o,"normalizeKey");c(Tx,"dedupePatterns");c(Ex,"dedupeAntiPatterns");Vu=class{static{c(this,"PatternExtractor")}async extract(e){let t=Sx(e.projectPath),n=[];if(e.context7Verified)for(let u of e.frameworks)n.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let r=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=Tx([...n,...r]),a=Ex([...o]),l=`analysis:derived-rules:${t}`;return j.setDoc(e.projectId,l,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},Cx=new Vu,Ly=Cx});async function Hy(s,e,t){let n=0;try{let a=zi(s);if(a)for(let l of Object.values(a.documents))n+=l.length}catch(a){G.debug("Could not load BM25 index for metrics",{error:b(a)})}n===0&&(n=e.fileCount*Rx);let r=0,o=n>0?Math.max(0,(n-r)/n):0;try{await wr.recordSync(s,{originalSize:n,filteredSize:r,duration:t,isWatch:!1})}catch(a){G.debug("Failed to record sync metrics",{error:b(a)})}let i={};try{let a=zi(s);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let l=aa(s);l&&(i.importEdges=l.edgeCount,i.importFiles=l.fileCount);let u=Ah(s);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){G.debug("Could not load index stats",{error:b(a)})}return{duration:t,originalSize:n,filteredSize:r,compressionRate:o,indexes:i}}async function Uy(s,e,t,n,r,o){try{let i=t.recentCommits[0]?.hash||null,a=[],l=[],u;try{u=await B.getAggregatedFeedback(s),u.patternsDiscovered.length>0&&(a=u.patternsDiscovered.map(p=>({name:p,description:`Discovered during task execution: ${p}`,source:"feedback",confidence:.74}))),u.knownGotchas.length>0&&(l=u.knownGotchas.map(p=>({issue:p,file:"multiple",suggestion:`Recurring issue reported across tasks: ${p}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let d=await Ly.extract({projectId:s,projectPath:e,languages:n.languages,frameworks:Array.from(new Set([...n.frameworks,...r.frameworks])),feedback:u,context7Verified:o});a=d.patterns,l=d.antiPatterns,await Ke.saveDraft(s,{projectId:s,languages:n.languages,frameworks:n.frameworks,configFiles:[],fileCount:n.fileCount,patterns:a,antiPatterns:l,analyzedAt:R(),status:"draft",commitHash:i??void 0})}catch(i){G.debug("Failed to save draft analysis (non-critical)",{error:b(i)})}}async function Wy(s){try{let[e,t,n,r,o]=await Promise.all([wt.archiveOldShipped(s).catch(()=>0),Cs.markDormantIdeas(s).catch(()=>0),mt.removeStaleCompleted(s).catch(()=>0),B.archiveStalePausedTasks(s).catch(()=>[]),it.capEntries(s).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){G.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=dt.getStats(s);G.debug("Archive stats",a)}}catch(e){G.debug("Archival failed (non-critical)",{error:b(e)})}}var Rx,Gy=h(()=>{"use strict";Ki();bu();ca();Jn();Xn();ga();Gu();Rs();Ps();pt();F();ue();pn();Kn();Fy();Rx=200;c(Hy,"recordSyncMetrics");c(Uy,"saveDraftAnalysis");c(Wy,"archiveStaleData")});import qu from"node:fs/promises";import Ra from"node:path";var Ju,Xu,By,Vy=h(()=>{"use strict";F();V();Ju=".prjct/.prjct-state.md",Xu=class{static{c(this,"LocalStateGenerator")}async generate(e,t){let n=Ra.join(e,Ju);await qu.mkdir(Ra.dirname(n),{recursive:!0});let r=this.toMarkdown(t);await qu.writeFile(n,r,"utf-8")}async remove(e){try{await qu.unlink(Ra.join(e,Ju))}catch(t){if(!L(t))throw t}}async exists(e){let t=Ra.join(e,Ju);return C(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,l)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=l===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${l+1}. ${u} ${a.description}${d}`)}),t.push("");let r=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
710
+ `)}},By=new Xu});import Px from"node:fs/promises";import xx from"node:path";async function qy(s){await Promise.all(Ax.map(e=>Px.mkdir(xx.join(s,e),{recursive:!0})))}async function Jy(s){let{projectId:e,projectPath:t,cliVersion:n,git:r,stats:o}=s,i=j.getDoc(e,"project")||{},a={...i,projectId:e,repoPath:t,name:o.name,version:o.version,cliVersion:n,techStack:o.frameworks,fileCount:o.fileCount,commitCount:r.commits,stack:o.ecosystem,currentBranch:r.branch,hasUncommittedChanges:r.hasChanges,createdAt:i.createdAt||R(),lastSync:R(),lastSyncCommit:r.recentCommits[0]?.hash||null,lastSyncBranch:r.branch};j.setDoc(e,"project",a)}async function Xy(s){let{projectId:e,projectPath:t,stats:n,stack:r}=s,i={...await B.read(e)};i.projectId=e,i.stack={language:n.languages[0]||"Unknown",framework:n.frameworks[0]||null},i.domains={hasFrontend:r.hasFrontend,hasBackend:r.hasBackend,hasDatabase:r.hasDatabase,hasTesting:r.hasTesting,hasDocker:r.hasDocker},i.projectType=n.projectType,i.metrics={totalFiles:n.fileCount},i.lastSync=R(),i.lastUpdated=R(),i.context={...i.context||{},lastSession:R(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await B.write(e,i);try{await By.generate(t,i)}catch(a){G.debug("Local state generation failed (optional)",{error:b(a)})}}function zy(s,e,t){j.appendEvent(s,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}var Ax,Ky=h(()=>{"use strict";Y();pt();F();ue();pn();Vy();Ax=["storage","context","memory","analysis","config","sync"];c(qy,"ensureProjectDirectories");c(Jy,"updateProjectDoc");c(Xy,"updateStateDoc");c(zy,"logSyncEvent")});var Yy=h(()=>{"use strict"});import jx from"node:fs/promises";import Qy from"node:path";var Pa,Zy=h(()=>{"use strict";V();Pa=class{static{c(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Qy.join(this.projectPath,"package.json"),t=await jx.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(Qy.join(this.projectPath,e))}}});import zu from"node:path";async function ew(s){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0},t={cwd:s},n=c(d=>d.catch(()=>null),"safe"),[r,o,i,a,l,u]=await Promise.all([n(U("git branch --show-current",t)),n(U("git rev-list --count HEAD",t)),n(U("git shortlog -sn --all",t)),n(U("git status --porcelain",t)),n(U('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',t)),n(U('git log --oneline --since="1 week ago"',t))]);if(r&&(e.branch=r.stdout.trim()||"main"),o&&(e.commits=parseInt(o.stdout.trim(),10)||0),i&&(e.contributors=i.stdout.split(`
711
711
  `).filter(d=>d.trim()).length),a){let d=a.stdout.trim().split(`
712
712
  `).filter(Boolean);e.hasChanges=d.length>0;for(let p of d){let m=p.substring(0,2),g=p.substring(3);m.startsWith("A")||m.startsWith("M ")?e.stagedFiles.push(g):m.includes("M")?e.modifiedFiles.push(g):m.startsWith("??")&&e.untrackedFiles.push(g)}}return l&&(e.recentCommits=l.stdout.split(`
713
713
  `).filter(Boolean).map(d=>{let[p,m,g]=d.split("|");return{hash:p,message:m,date:g}})),u&&(e.weeklyCommits=u.stdout.split(`
714
- `).filter(d=>d.trim()).length),!r&&!o&&!a&&G.debug("Git analysis failed (not a git repo?)"),e}async function Xt(s,e){let t=await C(Xu.join(s,e));return t||G.debug("File not found",{filename:e}),t}async function tw(s){let e={fileCount:0,version:"0.0.0",name:Xu.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],n=await wn(s,{skipDotfiles:!0});e.fileCount=n.filter(r=>t.some(o=>r.endsWith(o))).length}catch(t){G.debug("File count failed",{path:s,error:Ge(t)}),e.fileCount=0}try{let t=Xu.join(s,"package.json"),n=await xe(t);if(!n)throw new Error("No package.json found");e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript",n.devDependencies?.typescript||await Xt(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){G.debug("No package.json found",{path:s,error:Ge(t)})}return await Xt(s,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Xt(s,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Xt(s,"requirements.txt")||await Xt(s,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function nw(s){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Xt(s,"bun.lockb")||await Xt(s,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Xt(s,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Xt(s,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Xt(s,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Xt(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function sw(s){return new Ra(s).detect()}var rw=h(()=>{"use strict";Gn();Yy();Fe();V();pn();Zy();c(ew,"analyzeGit");c(Xt,"fileExistsInProject");c(tw,"gatherStats");c(nw,"detectCommands");c(sw,"detectStack")});import ow from"node:fs/promises";import zu from"node:path";var iw,Ku,aw,cw=h(()=>{"use strict";pt();F();Fe();iw={async jsonFilesValid(s){let e=Date.now(),t=[],n=zu.basename(s);try{await B.read(n)}catch(r){L(r)||t.push(`state: ${b(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(s){let e=Date.now(),t=zu.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await ow.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await ow.readFile(zu.join(t,i),"utf-8");for(let l of n)if(l.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!L(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${b(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},Ku=class{static{c(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,l=[iw.jsonFilesValid(t),iw.noSensitiveData(t)];for(let m of l){let g=await m;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(k=>k.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&n?.checks)for(let m of n.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let k=n.checks.slice(n.checks.indexOf(m)+1);a+=k.filter(E=>E.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await U(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},aw=new Ku});import{z as Pa}from"zod";function Ix(){let s=Je(lw);if(!s)throw new Error(`Missing bundled crew checkpoints template: ${lw}`);return s}var xa,lw,$x,Yu,An,uw,Qu=h(()=>{"use strict";En();ue();Y();xa="crew:checkpoints",lw="crew/CHECKPOINTS.md",$x=Pa.object({content:Pa.string(),source:Pa.enum(["default","user","migrated"]),updated_at:Pa.string().min(1)});c(Ix,"getBundledDefault");Yu=class{static{c(this,"CheckpointsStorage")}get(e){let t=A.getDoc(e,xa);return t===null?{content:Ix(),source:"default",updated_at:R()}:$x.parse(t)}hasCustomization(e){return A.hasDoc(e,xa)}set(e,t,n="user"){let r={content:t,source:n,updated_at:R()};return A.setDoc(e,xa,r),r}reset(e){A.deleteDoc(e,xa)}},An=new Yu,uw=An});var dw={};D(dw,{TEAM_ENROLLMENT_KEY:()=>Aa,TeamEnrollmentSchema:()=>Zu,default:()=>$a,serializeCanonical:()=>ja,teamEnrollmentStorage:()=>kr});import{z as Do}from"zod";function ja(s){let e=Object.keys(s).sort(),t={};for(let n of e)t[n]=s[n];return JSON.stringify(t)}var Aa,Zu,ed,kr,$a,Ia=h(()=>{"use strict";Y();Aa="team:enrollment",Zu=Do.object({required:Do.boolean(),minVersion:Do.string().min(1),enrolledAt:Do.string().min(1),enrolledBy:Do.string().nullable().default(null)}),ed=class{static{c(this,"TeamEnrollmentStorage")}get(e){let t=A.getDoc(e,Aa);return t===null?null:Zu.parse(t)}set(e,t){let n=Zu.parse(t);A.setDoc(e,Aa,n)}clear(e){A.deleteDoc(e,Aa)}};c(ja,"serializeCanonical");kr=new ed,$a=kr});var pw,td,Mo,mw,vr,_a=h(()=>{"use strict";pw="memory.",td="remember.",Mo=`${pw}${td}`,mw=`${pw}task.tagged`,vr="status.changed"});var Ma={};D(Ma,{BASE_MEMORY_TYPES:()=>hw,MEMORY_TYPES:()=>xs,deriveTitle:()=>Da,formatMemoryMd:()=>xt,linkifyMemRefs:()=>Yn,projectMemory:()=>J});function yw(s,e){try{return JSON.parse(s)}catch{return e}}function nd(s){let e=s.type.slice(Mo.length),t=yw(s.data,{});return{id:`mem_${s.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:s.timestamp,source:t.source,provenance:t.provenance??"declared"}}function gw(s){let e=s.data?yw(s.data,{}):{},t=e.tags??{};return s.type&&(t.type=s.type),{id:`ship_${s.id}`,type:"shipped",content:s.name,tags:t,rememberedAt:s.shipped_at,source:e.taskId,provenance:"extracted"}}function Ox(s,e){let t=e.toLowerCase();if(s.content.toLowerCase().includes(t))return!0;for(let n of Object.values(s.tags))if(n.toLowerCase().includes(t))return!0;return!1}function Nx(s,e){for(let[t,n]of Object.entries(e))if(s.tags[t]!==n)return!1;return!0}function Lx(s){let e=new Set,t=[];for(let n of s){let r=n.tags.key;if(!r){t.push(n);continue}let o=`${n.type}::${r}`;e.has(o)||(e.add(o),t.push(n))}return t}function Fx(s){return s.replace(/[[\]|]/g,"").replace(/\s+/g," ").trim()}function Da(s){let e=(s.content??"").trim();e=e.replace(/^(?:[-*•]\s+|\s+)+/,""),e=e.replace(/^(?:\[\[[^\]]*\]\]|mem[_-]\d+)[\s:,-]*/i,"").trim();let t=e.length;for(let o of[/\n/,/\.\s/,/:\s/,/;\s/,/\s—\s/,/\s\(/]){let i=e.match(o);i&&i.index!==void 0&&i.index>4&&i.index<t&&(t=i.index)}let n=e.slice(0,t).replace(/\s+/g," ").trim();if(n=n.replace(/\[\[[^\]|]*\|([^\]]*)\]\]/g,"$1").replace(/\[\[([^\]]*)\]\]/g,"$1").trim(),n.length>fw){let o=n.slice(0,fw),i=o.lastIndexOf(" ");n=`${(i>40?o.slice(0,i):o).trim()}\u2026`}n.length<6&&(n=`${s.type} ${s.id}`);let r=s.tags?.pr;return r&&!new RegExp(`\\b#?${r}\\b`).test(n)&&(n=`${n} (PR #${r})`),n}function Yn(s,e){return s.replace(/\[\[(mem[_-]\d+)\]\]/gi,"$1").replace(/\bmem[_-](\d+)\b/g,(t,n)=>{let r=`mem_${n}`,o=e?.idTypeIndex?.get(r),i=e?.idTitleIndex?.get(r),a=e?.idSlugIndex?.get(r),l=i?Fx(i):r;return a&&o&&e?.perEntryTypes?.has(o)?`[[${a}|${l}]]`:o?`[[${o}#^mem-${n}|${l}]]`:i?`[[${r}|${l}]]`:`\`${r}\``})}function xt(s,e){if(s.length===0)return"> No matching memory entries.";let t=new Map;for(let l of s){let u=t.get(l.type)??[];u.push(l),t.set(l.type,u)}let n=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],r=[],o={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},i=c((l,u)=>{if(u.length!==0){r.push(`### ${l.toUpperCase()}`);for(let d of u){let p=Object.entries(d.tags).map(([w,v])=>`${w}=${v}`).join(" "),m=o[d.provenance],g=e?.vault?Yn(d.content,e):d.content,k=p?` _(${e?.vault?Yn(p,e):p})_`:"",E=d.id.replace(/^mem[_-]/,""),y=e?.vault?` ^mem-${E}`:"";r.push(`- \`${m}\` [${d.id} \xB7 ${d.type}] ${g}${k}${y}`)}r.push("")}},"renderGroup"),a=new Set;for(let l of n){let u=t.get(l);!u||u.length===0||(i(l,u),a.add(l))}for(let[l,u]of t)a.has(l)||i(l,u);return r.join(`
715
- `).trim()}var hw,xs,_x,Dx,Mx,J,fw,$e=h(()=>{"use strict";Kn();Y();_a();hw=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person","spec"],xs=hw,_x=25,Dx=4,Mx=100;c(yw,"safeJson");c(nd,"rowToEntry");c(gw,"shippedRowToEntry");c(Ox,"matchesTopic");c(Nx,"matchesTags");c(Lx,"dedupeLatestByKey");J={async remember(s,e){await it.log(s,`${td}${e.type}`,{content:e.content,tags:e.tags??{},source:e.source,provenance:e.provenance??"declared"});try{let{default:t}=await Promise.resolve().then(()=>(re(),ws)),r=(await t.readConfig(s))?.projectId;if(!r)return;let{publishCRUD:o}=await Promise.resolve().then(()=>(Po(),Wf)),i=e.tags?.spec_id??e.tags?.task_id??e.tags?.id??e.source??`mem-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await o({projectId:r,entityType:"memories",entityId:i,eventType:"upsert",data:{id:i,type:e.type,content:e.content,tags:e.tags??{},source:e.source??null,provenance:e.provenance??"declared",rememberedAt:new Date().toISOString()}})}catch{}},recall(s,e={}){let t=e.limit??_x,n=Math.max(t*Dx,Mx),r=A.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${Mo}%`,n),o=A.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",n),i=[...r.map(nd),...o.map(gw)];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=>Nx(a,e.tags??{}))),e.topic&&(i=i.filter(a=>Ox(a,e.topic))),i.sort((a,l)=>l.rememberedAt.localeCompare(a.rememberedAt)),e.dedupeByKey!==!1&&(i=Lx(i)),i.slice(0,t)},getById(s,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return null;let n=Number(t[1]);try{let r=A.get(s,"SELECT id, type, data, timestamp FROM events WHERE id = ? AND type LIKE ?",n,`${Mo}%`);return r?nd(r):null}catch{return null}},allEntriesForIndex(s){try{let e=A.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC",`${Mo}%`),t=A.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...e.map(nd),...t.map(gw)]}catch{return[]}},similar(s,e,t=10){let n=e.toLowerCase().split(/[^a-z0-9]+/).filter(i=>i.length>3);return n.length===0?[]:J.recall(s,{limit:200}).map(i=>{let a=`${i.content} ${Object.values(i.tags).join(" ")}`.toLowerCase(),l=n.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)}},fw=72;c(Fx,"linkLabel");c(Da,"deriveTitle");c(Yn,"linkifyMemRefs");c(xt,"formatMemoryMd")});var Tw={};D(Tw,{legacyCrewSweep:()=>Gx});import ww from"node:fs/promises";import kw from"node:path";function Hx(s){let e={required:s.required,minVersion:s.minVersion,enrolledAt:s.enrolledAt};return s.enrolledBy!==null&&(e.enrolledBy=s.enrolledBy),`${JSON.stringify(e,null,2)}
716
- `}async function vw(s){try{return(await ww.stat(s)).mtimeMs}catch{return null}}async function bw(s){try{return await ww.readFile(s,"utf-8")}catch{return null}}function Sw(s,e){return A.getDoc(s,e)}function Na(s,e,t){A.setDoc(s,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function La(s,e,t){try{let{projectMemory:n}=await Promise.resolve().then(()=>($e(),Ma));await n.remember(s,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(n){G.debug("Legacy sweep inbox capture failed (non-critical)",{error:n instanceof Error?n.message:String(n)})}}async function Ux(s,e,t){let n=kw.join(s,Oo),r=await vw(n);if(r===null)return;let o=Sw(e,sd);if(o===null){let i=await bw(n);if(i===null){t.errors.push({file:Oo,reason:"read failed"});return}try{uw.set(e,i,"migrated"),Na(e,sd,r),t.checkpointsMigrated=!0,await La(s,"Legacy .prjct/CHECKPOINTS.md migrated into kv_store crew:checkpoints. Manage with 'prjct crew checkpoints show|set|reset|export'. Original file left in place (not authoritative).",{"migration:v2.19.8":"1",topic:"crew-checkpoints"})}catch(a){t.errors.push({file:Oo,reason:a instanceof Error?a.message:String(a)})}return}r>o.mtime_ms&&(await La(s,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${Oo}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),Na(e,sd,r),t.checkpointsHandEditWarned=!0)}async function Wx(s,e,t){let n=kw.join(s,Oa),r=await vw(n);if(r===null)return;let o=Sw(e,rd),i=$a.get(e);if(o===null){let a=await bw(n);if(a===null){t.errors.push({file:Oa,reason:"read failed"});return}try{if(i===null){let l=JSON.parse(a),u={required:l.required===!0,minVersion:typeof l.minVersion=="string"?l.minVersion:"0.0.0",enrolledAt:typeof l.enrolledAt=="string"?l.enrolledAt:new Date().toISOString(),enrolledBy:typeof l.enrolledBy=="string"?l.enrolledBy:null};$a.set(e,u),await ds(n,Hx(u)),t.teamMigrated=!0,await La(s,"Legacy .prjct/team.json adopted into kv_store team:enrollment. The disk file is now a derived mirror \u2014 do not hand-edit; run 'prjct team check' to detect drift.",{"migration:v2.19.8":"1",topic:"team-enrollment"})}Na(e,rd,r)}catch(l){t.errors.push({file:Oa,reason:l instanceof Error?l.message:String(l)})}return}r>o.mtime_ms&&(await La(s,".prjct/team.json hand-edited after migration \u2014 your edit was NOT applied (file is a derived mirror). Run 'prjct team check' to rewrite the mirror from DB, or 'prjct team' to re-enroll with new values.",{"migration:v2.19.8":"1",topic:"team-enrollment",state:"hand-edited"}),Na(e,rd,r),t.teamHandEditWarned=!0)}async function Gx(s,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await Ux(s,e,t).catch(n=>{t.errors.push({file:Oo,reason:n instanceof Error?n.message:String(n)})}),await Wx(s,e,t).catch(n=>{t.errors.push({file:Oa,reason:n instanceof Error?n.message:String(n)})}),t}var Oo,Oa,sd,rd,Ew=h(()=>{"use strict";Qu();Y();Ia();V();pn();Oo=".prjct/CHECKPOINTS.md",Oa=".prjct/team.json",sd="migration:v2.19.8:last-flagged-checkpoints",rd="migration:v2.19.8:last-flagged-team";c(Hx,"renderMirror");c(vw,"statMtimeMs");c(bw,"tryReadFile");c(Sw,"readFlag");c(Na,"writeFlag");c(La,"captureInboxWarning");c(Ux,"sweepCheckpoints");c(Wx,"sweepTeamJson");c(Gx,"legacyCrewSweep")});import Bx from"node:fs/promises";import Cw from"node:path";function od(s,e){let t,n=new Promise((r,o)=>{t=setTimeout(()=>o(new Error(`sync phase '${e}' timed out after ${Rw}ms`)),Rw)});return Promise.race([s,n]).finally(()=>{t&&clearTimeout(t)})}async function Ft(s,e){let t=Date.now();G.debug("sync phase start",{phase:s});try{let n=await e();return G.debug("sync phase done",{phase:s,ms:Date.now()-t}),n}catch(n){throw G.debug("sync phase failed",{phase:s,ms:Date.now()-t,error:Ge(n)}),n}}var Rw,id,Qn,Fa=h(()=>{"use strict";zi();vu();aa();Gn();rt();Wt();re();ge();yr();Jn();ma();pr();$u();Rs();Ps();pt();fy();V();pn();Ao();Ey();Cy();_y();Gy();Ky();rw();cw();Rw=Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||6e4;c(od,"withTimeout");c(Ft,"phase");id=class{static{c(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await I.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:ka(),stats:va(),commands:ba(),stack:Sa(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=_.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Bx.rm(Cw.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await gs()).installed){let T=await hr({autoRepair:!0});T.verified||G.warn(`Codex p. router not ready: ${T.message||"verification failed"}`)}try{r=await Ft("context7",()=>xn.ensureReady())}catch(T){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:ka(),stats:va(),commands:ba(),stack:Sa(),context7:{installed:r.installed,verified:!1,message:Ge(T)},error:`Context7 MCP is required but not ready: ${Ge(T)}. Run 'prjct start' to repair.`}}await qy(this.globalPath),await Ft("migrate",()=>od(ya(this.projectId),"migrate")),await Ft("sweep",async()=>{try{let T=await wa(this.projectId);T>0&&G.info("Swept legacy JSON files into SQLite",{swept:T})}catch(T){G.debug("Legacy JSON sweep failed (non-critical)",{error:Ge(T)})}}),await Ft("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:T}=await Promise.resolve().then(()=>(Ew(),Tw)),O=await T(this.projectPath,this.projectId);(O.checkpointsMigrated||O.teamMigrated||O.checkpointsHandEditWarned||O.teamHandEditWarned||O.errors.length>0)&&G.info("Legacy crew sweep ran",{checkpointsMigrated:O.checkpointsMigrated,teamMigrated:O.teamMigrated,checkpointsHandEditWarned:O.checkpointsHandEditWarned,teamHandEditWarned:O.teamHandEditWarned,errors:O.errors.length})}catch(T){G.debug("Legacy crew sweep failed (non-critical)",{error:Ge(T)})}});let[a,l,u,d]=await Ft("gather",()=>od(Promise.all([ew(this.projectPath),tw(this.projectPath),nw(this.projectPath),sw(this.projectPath)]),"gather")),{shouldRebuildIndexes:p,changedDomains:m,incrementalInfo:g}=await Ft("incremental",()=>Iy({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));p&&await Ft("index",async()=>{try{await od(Promise.all([Tf(this.projectPath,this.projectId),Ih(this.projectPath,this.projectId),jh(this.projectPath,this.projectId)]),"index")}catch(T){G.debug("File ranking index build failed (non-critical)",{error:Ge(T)})}});let k,E=Date.now();G.debug("sync phase start",{phase:"skills"});try{let[T,O,ae,Ee,be,Ye,yn,Ln,Mt,ui,to]=await Promise.all([Promise.resolve(Ct.getActive(this.projectId)).catch(()=>null),Ke.getActive(this.projectId).catch(()=>null),wt.getRecent(this.projectId,3).catch(()=>[]),gy.getMetrics(this.projectId).catch(()=>null),mt.getBacklog(this.projectId).catch(()=>[]),B.getTaskHistory(this.projectId).catch(()=>[]),B.getAllPausedTasks(this.projectId).catch(()=>[]),B.getAggregatedFeedback(this.projectId).catch(()=>null),B.getCurrentTask(this.projectId).catch(()=>null),Cs.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),wt.getCount(this.projectId).catch(()=>0)]),Fc={backlogCount:be.length,completedTaskCount:Ye.length,pausedTaskCount:yn.length,hasActiveTask:!!Mt},no=T?T.patterns.map(se=>({name:se.name,description:se.description,location:se.locations?.[0]})):(O?.patterns??[]).filter(se=>se.source!=="repo").map(se=>({name:se.name,description:se.description,location:se.location})),so=T?T.antiPatterns.map(se=>({issue:se.issue,file:se.files?.[0]??"multiple",suggestion:se.suggestion,severity:se.severity??"medium"})):(O?.antiPatterns??[]).filter(se=>se.source!=="repo").map(se=>({issue:se.issue,file:se.file,suggestion:se.suggestion,severity:se.severity??"medium"})),di=T?.commands?{install:T.commands.install??u.install,run:u.run,test:T.commands.test??u.test,build:T.commands.build??u.build,dev:T.commands.dev??u.dev,lint:T.commands.lint??u.lint,format:T.commands.format??u.format}:u,qs={version:l.version,fileCount:l.fileCount,patterns:no,antiPatterns:so,recentShipped:ae.map(se=>({name:se.name,type:se.type??"feature",duration:se.duration,filesChanged:se.changes?.length})),velocity:Ee?{avgPoints:Ee.averageVelocity,trend:Ee.velocityTrend,accuracy:Ee.estimationAccuracy}:null,backlogCount:be.length,completedTaskCount:Ye.length,pausedTaskCount:yn.length,knownGotchas:Ln?.knownGotchas??[],userPatterns:Ln?.patternsDiscovered??[],hasActiveTask:!!Mt,activeTaskDescription:Mt?.description??"",pausedTasks:yn.map(se=>({description:se.description,pausedAt:se.pausedAt??""})),topBacklog:be.slice(0,3).map(se=>({description:se.description,priority:se.priority??"medium"})),ideasCount:ui?.pending??0,shippedCount:to};k=await Ty.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:di,stack:d},Fc,qs)}catch(T){G.debug("Native skill generation failed (non-critical)",{error:Ge(T)})}G.debug("sync phase done",{phase:"skills",ms:Date.now()-E}),await Ft("update-files",()=>Promise.all([Jy({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:a,stats:l}),Xy({projectId:this.projectId,projectPath:this.projectPath,stats:l,stack:d}),Promise.resolve(zy(this.projectId,a,l)),Uy(this.projectId,this.projectPath,a,l,d,r.verified)]));let y=await Ke.getActive(this.projectId),w={patterns:y?.patterns?.length||0,antiPatterns:y?.antiPatterns?.length||0,criticalAntiPatterns:y?.antiPatterns?.filter(T=>T.severity==="high").length||0},v=Date.now()-n,S=await Ft("metrics",()=>Hy(this.projectId,l,v));await Ft("archive",()=>Wy(this.projectId)),await Ft("install-global",async()=>{await He.installGlobalConfig(),await He.syncCommands()});let P;return await Ft("verify",async()=>{try{let T=await I.readConfig(this.projectPath);P=await aw.verify(this.projectPath,this.globalPath,T?.verification)}catch(T){G.debug("Verification failed (non-critical)",{error:Ge(T)})}}),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:u,stack:d,context7:{installed:r.installed,verified:r.verified,message:r.message},analysisSummary:w,syncMetrics:S,verification:P,incremental:g,generatedSkills:k}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:ka(),stats:va(),commands:ba(),stack:Sa(),context7:{installed:r.installed,verified:r.verified,message:r.message},error:Ge(o)}}}async getCliVersion(){try{let e=Cw.join(__dirname,"..","..","package.json");return(await xe(e))?.version||"0.0.0"}catch(e){return G.debug("Failed to read CLI version",{error:Ge(e)}),"0.0.0"}}},Qn=new id});function ad(s,e,t){if(t.md){console.log(`> ${e}`);return}f[s](e)}function H(s,e={}){return Vx(s,e),{success:!1,error:s}}function N(s,e={}){return jn(s,e),{success:!1,error:s}}function Me(s,e){let t=b(s);return e&&jn(t,e),{success:!1,error:t}}var Vx,jn,At,Te=h(()=>{"use strict";F();pe();c(ad,"notify");Vx=c((s,e={})=>ad("warn",s,e),"notifyWarn"),jn=c((s,e={})=>ad("fail",s,e),"notifyFail"),At=c((s,e={})=>ad("done",s,e),"notifyDone");c(H,"failWith");c(N,"failHard");c(Me,"failFromError")});function qx(){return"---"}function Jx(){return`---
717
- prjct v${fi()}`}function W(...s){return ld(qx(),...s.filter(Boolean),Jx())}function Pw(s,e){let t=`| ${s.join(" | ")} |`,n=`|${s.map(()=>"---").join("|")}|`,r=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...r].join(`
714
+ `).filter(d=>d.trim()).length),!r&&!o&&!a&&G.debug("Git analysis failed (not a git repo?)"),e}async function Xt(s,e){let t=await C(zu.join(s,e));return t||G.debug("File not found",{filename:e}),t}async function tw(s){let e={fileCount:0,version:"0.0.0",name:zu.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],n=await wn(s,{skipDotfiles:!0});e.fileCount=n.filter(r=>t.some(o=>r.endsWith(o))).length}catch(t){G.debug("File count failed",{path:s,error:Ge(t)}),e.fileCount=0}try{let t=zu.join(s,"package.json"),n=await xe(t);if(!n)throw new Error("No package.json found");e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript",n.devDependencies?.typescript||await Xt(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){G.debug("No package.json found",{path:s,error:Ge(t)})}return await Xt(s,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Xt(s,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Xt(s,"requirements.txt")||await Xt(s,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function nw(s){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Xt(s,"bun.lockb")||await Xt(s,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Xt(s,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Xt(s,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Xt(s,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Xt(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function sw(s){return new Pa(s).detect()}var rw=h(()=>{"use strict";Gn();Yy();Fe();V();pn();Zy();c(ew,"analyzeGit");c(Xt,"fileExistsInProject");c(tw,"gatherStats");c(nw,"detectCommands");c(sw,"detectStack")});import ow from"node:fs/promises";import Ku from"node:path";var iw,Yu,aw,cw=h(()=>{"use strict";pt();F();Fe();iw={async jsonFilesValid(s){let e=Date.now(),t=[],n=Ku.basename(s);try{await B.read(n)}catch(r){L(r)||t.push(`state: ${b(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(s){let e=Date.now(),t=Ku.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await ow.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await ow.readFile(Ku.join(t,i),"utf-8");for(let l of n)if(l.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!L(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${b(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},Yu=class{static{c(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,l=[iw.jsonFilesValid(t),iw.noSensitiveData(t)];for(let m of l){let g=await m;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(k=>k.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&n?.checks)for(let m of n.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let k=n.checks.slice(n.checks.indexOf(m)+1);a+=k.filter(E=>E.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await U(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},aw=new Yu});import{z as xa}from"zod";function Ix(){let s=Je(lw);if(!s)throw new Error(`Missing bundled crew checkpoints template: ${lw}`);return s}var Aa,lw,$x,Qu,An,uw,Zu=h(()=>{"use strict";En();ue();Y();Aa="crew:checkpoints",lw="crew/CHECKPOINTS.md",$x=xa.object({content:xa.string(),source:xa.enum(["default","user","migrated"]),updated_at:xa.string().min(1)});c(Ix,"getBundledDefault");Qu=class{static{c(this,"CheckpointsStorage")}get(e){let t=A.getDoc(e,Aa);return t===null?{content:Ix(),source:"default",updated_at:R()}:$x.parse(t)}hasCustomization(e){return A.hasDoc(e,Aa)}set(e,t,n="user"){let r={content:t,source:n,updated_at:R()};return A.setDoc(e,Aa,r),r}reset(e){A.deleteDoc(e,Aa)}},An=new Qu,uw=An});var dw={};D(dw,{TEAM_ENROLLMENT_KEY:()=>ja,TeamEnrollmentSchema:()=>ed,default:()=>Ia,serializeCanonical:()=>$a,teamEnrollmentStorage:()=>kr});import{z as Do}from"zod";function $a(s){let e=Object.keys(s).sort(),t={};for(let n of e)t[n]=s[n];return JSON.stringify(t)}var ja,ed,td,kr,Ia,_a=h(()=>{"use strict";Y();ja="team:enrollment",ed=Do.object({required:Do.boolean(),minVersion:Do.string().min(1),enrolledAt:Do.string().min(1),enrolledBy:Do.string().nullable().default(null)}),td=class{static{c(this,"TeamEnrollmentStorage")}get(e){let t=A.getDoc(e,ja);return t===null?null:ed.parse(t)}set(e,t){let n=ed.parse(t);A.setDoc(e,ja,n)}clear(e){A.deleteDoc(e,ja)}};c($a,"serializeCanonical");kr=new td,Ia=kr});var pw,nd,Mo,mw,vr,Da=h(()=>{"use strict";pw="memory.",nd="remember.",Mo=`${pw}${nd}`,mw=`${pw}task.tagged`,vr="status.changed"});var Oa={};D(Oa,{BASE_MEMORY_TYPES:()=>hw,MEMORY_TYPES:()=>xs,deriveTitle:()=>Ma,formatMemoryMd:()=>xt,linkifyMemRefs:()=>Yn,projectMemory:()=>J});function yw(s,e){try{return JSON.parse(s)}catch{return e}}function sd(s){let e=s.type.slice(Mo.length),t=yw(s.data,{});return{id:`mem_${s.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:s.timestamp,source:t.source,provenance:t.provenance??"declared"}}function gw(s){let e=s.data?yw(s.data,{}):{},t=e.tags??{};return s.type&&(t.type=s.type),{id:`ship_${s.id}`,type:"shipped",content:s.name,tags:t,rememberedAt:s.shipped_at,source:e.taskId,provenance:"extracted"}}function Ox(s,e){let t=e.toLowerCase();if(s.content.toLowerCase().includes(t))return!0;for(let n of Object.values(s.tags))if(n.toLowerCase().includes(t))return!0;return!1}function Nx(s,e){for(let[t,n]of Object.entries(e))if(s.tags[t]!==n)return!1;return!0}function Lx(s){let e=new Set,t=[];for(let n of s){let r=n.tags.key;if(!r){t.push(n);continue}let o=`${n.type}::${r}`;e.has(o)||(e.add(o),t.push(n))}return t}function Fx(s){return s.replace(/[[\]|]/g,"").replace(/\s+/g," ").trim()}function Ma(s){let e=(s.content??"").trim();e=e.replace(/^(?:[-*•]\s+|\s+)+/,""),e=e.replace(/^(?:\[\[[^\]]*\]\]|mem[_-]\d+)[\s:,-]*/i,"").trim();let t=e.length;for(let o of[/\n/,/\.\s/,/:\s/,/;\s/,/\s—\s/,/\s\(/]){let i=e.match(o);i&&i.index!==void 0&&i.index>4&&i.index<t&&(t=i.index)}let n=e.slice(0,t).replace(/\s+/g," ").trim();if(n=n.replace(/\[\[[^\]|]*\|([^\]]*)\]\]/g,"$1").replace(/\[\[([^\]]*)\]\]/g,"$1").trim(),n.length>fw){let o=n.slice(0,fw),i=o.lastIndexOf(" ");n=`${(i>40?o.slice(0,i):o).trim()}\u2026`}n.length<6&&(n=`${s.type} ${s.id}`);let r=s.tags?.pr;return r&&!new RegExp(`\\b#?${r}\\b`).test(n)&&(n=`${n} (PR #${r})`),n}function Yn(s,e){return s.replace(/\[\[(mem[_-]\d+)\]\]/gi,"$1").replace(/\bmem[_-](\d+)\b/g,(t,n)=>{let r=`mem_${n}`,o=e?.idTypeIndex?.get(r),i=e?.idTitleIndex?.get(r),a=e?.idSlugIndex?.get(r),l=i?Fx(i):r;return a&&o&&e?.perEntryTypes?.has(o)?`[[${a}|${l}]]`:o?`[[${o}#^mem-${n}|${l}]]`:i?`[[${r}|${l}]]`:`\`${r}\``})}function xt(s,e){if(s.length===0)return"> No matching memory entries.";let t=new Map;for(let l of s){let u=t.get(l.type)??[];u.push(l),t.set(l.type,u)}let n=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],r=[],o={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},i=c((l,u)=>{if(u.length!==0){r.push(`### ${l.toUpperCase()}`);for(let d of u){let p=Object.entries(d.tags).map(([w,v])=>`${w}=${v}`).join(" "),m=o[d.provenance],g=e?.vault?Yn(d.content,e):d.content,k=p?` _(${e?.vault?Yn(p,e):p})_`:"",E=d.id.replace(/^mem[_-]/,""),y=e?.vault?` ^mem-${E}`:"";r.push(`- \`${m}\` [${d.id} \xB7 ${d.type}] ${g}${k}${y}`)}r.push("")}},"renderGroup"),a=new Set;for(let l of n){let u=t.get(l);!u||u.length===0||(i(l,u),a.add(l))}for(let[l,u]of t)a.has(l)||i(l,u);return r.join(`
715
+ `).trim()}var hw,xs,_x,Dx,Mx,J,fw,$e=h(()=>{"use strict";Kn();Y();Da();hw=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person","spec"],xs=hw,_x=25,Dx=4,Mx=100;c(yw,"safeJson");c(sd,"rowToEntry");c(gw,"shippedRowToEntry");c(Ox,"matchesTopic");c(Nx,"matchesTags");c(Lx,"dedupeLatestByKey");J={async remember(s,e){await it.log(s,`${nd}${e.type}`,{content:e.content,tags:e.tags??{},source:e.source,provenance:e.provenance??"declared"});try{let{default:t}=await Promise.resolve().then(()=>(re(),ws)),r=(await t.readConfig(s))?.projectId;if(!r)return;let{publishCRUD:o}=await Promise.resolve().then(()=>(Po(),Wf)),i=e.tags?.spec_id??e.tags?.task_id??e.tags?.id??e.source??`mem-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await o({projectId:r,entityType:"memories",entityId:i,eventType:"upsert",data:{id:i,type:e.type,content:e.content,tags:e.tags??{},source:e.source??null,provenance:e.provenance??"declared",rememberedAt:new Date().toISOString()}})}catch{}},recall(s,e={}){let t=e.limit??_x,n=Math.max(t*Dx,Mx),r=A.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${Mo}%`,n),o=A.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",n),i=[...r.map(sd),...o.map(gw)];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=>Nx(a,e.tags??{}))),e.topic&&(i=i.filter(a=>Ox(a,e.topic))),i.sort((a,l)=>l.rememberedAt.localeCompare(a.rememberedAt)),e.dedupeByKey!==!1&&(i=Lx(i)),i.slice(0,t)},getById(s,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return null;let n=Number(t[1]);try{let r=A.get(s,"SELECT id, type, data, timestamp FROM events WHERE id = ? AND type LIKE ?",n,`${Mo}%`);return r?sd(r):null}catch{return null}},allEntriesForIndex(s){try{let e=A.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC",`${Mo}%`),t=A.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...e.map(sd),...t.map(gw)]}catch{return[]}},similar(s,e,t=10){let n=e.toLowerCase().split(/[^a-z0-9]+/).filter(i=>i.length>3);return n.length===0?[]:J.recall(s,{limit:200}).map(i=>{let a=`${i.content} ${Object.values(i.tags).join(" ")}`.toLowerCase(),l=n.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)}},fw=72;c(Fx,"linkLabel");c(Ma,"deriveTitle");c(Yn,"linkifyMemRefs");c(xt,"formatMemoryMd")});var Tw={};D(Tw,{legacyCrewSweep:()=>Gx});import ww from"node:fs/promises";import kw from"node:path";function Hx(s){let e={required:s.required,minVersion:s.minVersion,enrolledAt:s.enrolledAt};return s.enrolledBy!==null&&(e.enrolledBy=s.enrolledBy),`${JSON.stringify(e,null,2)}
716
+ `}async function vw(s){try{return(await ww.stat(s)).mtimeMs}catch{return null}}async function bw(s){try{return await ww.readFile(s,"utf-8")}catch{return null}}function Sw(s,e){return A.getDoc(s,e)}function La(s,e,t){A.setDoc(s,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function Fa(s,e,t){try{let{projectMemory:n}=await Promise.resolve().then(()=>($e(),Oa));await n.remember(s,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(n){G.debug("Legacy sweep inbox capture failed (non-critical)",{error:n instanceof Error?n.message:String(n)})}}async function Ux(s,e,t){let n=kw.join(s,Oo),r=await vw(n);if(r===null)return;let o=Sw(e,rd);if(o===null){let i=await bw(n);if(i===null){t.errors.push({file:Oo,reason:"read failed"});return}try{uw.set(e,i,"migrated"),La(e,rd,r),t.checkpointsMigrated=!0,await Fa(s,"Legacy .prjct/CHECKPOINTS.md migrated into kv_store crew:checkpoints. Manage with 'prjct crew checkpoints show|set|reset|export'. Original file left in place (not authoritative).",{"migration:v2.19.8":"1",topic:"crew-checkpoints"})}catch(a){t.errors.push({file:Oo,reason:a instanceof Error?a.message:String(a)})}return}r>o.mtime_ms&&(await Fa(s,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${Oo}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),La(e,rd,r),t.checkpointsHandEditWarned=!0)}async function Wx(s,e,t){let n=kw.join(s,Na),r=await vw(n);if(r===null)return;let o=Sw(e,od),i=Ia.get(e);if(o===null){let a=await bw(n);if(a===null){t.errors.push({file:Na,reason:"read failed"});return}try{if(i===null){let l=JSON.parse(a),u={required:l.required===!0,minVersion:typeof l.minVersion=="string"?l.minVersion:"0.0.0",enrolledAt:typeof l.enrolledAt=="string"?l.enrolledAt:new Date().toISOString(),enrolledBy:typeof l.enrolledBy=="string"?l.enrolledBy:null};Ia.set(e,u),await ds(n,Hx(u)),t.teamMigrated=!0,await Fa(s,"Legacy .prjct/team.json adopted into kv_store team:enrollment. The disk file is now a derived mirror \u2014 do not hand-edit; run 'prjct team check' to detect drift.",{"migration:v2.19.8":"1",topic:"team-enrollment"})}La(e,od,r)}catch(l){t.errors.push({file:Na,reason:l instanceof Error?l.message:String(l)})}return}r>o.mtime_ms&&(await Fa(s,".prjct/team.json hand-edited after migration \u2014 your edit was NOT applied (file is a derived mirror). Run 'prjct team check' to rewrite the mirror from DB, or 'prjct team' to re-enroll with new values.",{"migration:v2.19.8":"1",topic:"team-enrollment",state:"hand-edited"}),La(e,od,r),t.teamHandEditWarned=!0)}async function Gx(s,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await Ux(s,e,t).catch(n=>{t.errors.push({file:Oo,reason:n instanceof Error?n.message:String(n)})}),await Wx(s,e,t).catch(n=>{t.errors.push({file:Na,reason:n instanceof Error?n.message:String(n)})}),t}var Oo,Na,rd,od,Ew=h(()=>{"use strict";Zu();Y();_a();V();pn();Oo=".prjct/CHECKPOINTS.md",Na=".prjct/team.json",rd="migration:v2.19.8:last-flagged-checkpoints",od="migration:v2.19.8:last-flagged-team";c(Hx,"renderMirror");c(vw,"statMtimeMs");c(bw,"tryReadFile");c(Sw,"readFlag");c(La,"writeFlag");c(Fa,"captureInboxWarning");c(Ux,"sweepCheckpoints");c(Wx,"sweepTeamJson");c(Gx,"legacyCrewSweep")});import Bx from"node:fs/promises";import Cw from"node:path";function id(s,e){let t,n=new Promise((r,o)=>{t=setTimeout(()=>o(new Error(`sync phase '${e}' timed out after ${Rw}ms`)),Rw)});return Promise.race([s,n]).finally(()=>{t&&clearTimeout(t)})}async function Ft(s,e){let t=Date.now();G.debug("sync phase start",{phase:s});try{let n=await e();return G.debug("sync phase done",{phase:s,ms:Date.now()-t}),n}catch(n){throw G.debug("sync phase failed",{phase:s,ms:Date.now()-t,error:Ge(n)}),n}}var Rw,ad,Qn,Ha=h(()=>{"use strict";Ki();bu();ca();Gn();rt();Wt();re();ge();yr();Jn();ga();pr();Iu();Rs();Ps();pt();fy();V();pn();Ao();Ey();Cy();_y();Gy();Ky();rw();cw();Rw=Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||6e4;c(id,"withTimeout");c(Ft,"phase");ad=class{static{c(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await I.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:va(),stats:ba(),commands:Sa(),stack:Ta(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=_.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Bx.rm(Cw.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await gs()).installed){let T=await hr({autoRepair:!0});T.verified||G.warn(`Codex p. router not ready: ${T.message||"verification failed"}`)}try{r=await Ft("context7",()=>xn.ensureReady())}catch(T){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:va(),stats:ba(),commands:Sa(),stack:Ta(),context7:{installed:r.installed,verified:!1,message:Ge(T)},error:`Context7 MCP is required but not ready: ${Ge(T)}. Run 'prjct start' to repair.`}}await qy(this.globalPath),await Ft("migrate",()=>id(wa(this.projectId),"migrate")),await Ft("sweep",async()=>{try{let T=await ka(this.projectId);T>0&&G.info("Swept legacy JSON files into SQLite",{swept:T})}catch(T){G.debug("Legacy JSON sweep failed (non-critical)",{error:Ge(T)})}}),await Ft("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:T}=await Promise.resolve().then(()=>(Ew(),Tw)),O=await T(this.projectPath,this.projectId);(O.checkpointsMigrated||O.teamMigrated||O.checkpointsHandEditWarned||O.teamHandEditWarned||O.errors.length>0)&&G.info("Legacy crew sweep ran",{checkpointsMigrated:O.checkpointsMigrated,teamMigrated:O.teamMigrated,checkpointsHandEditWarned:O.checkpointsHandEditWarned,teamHandEditWarned:O.teamHandEditWarned,errors:O.errors.length})}catch(T){G.debug("Legacy crew sweep failed (non-critical)",{error:Ge(T)})}});let[a,l,u,d]=await Ft("gather",()=>id(Promise.all([ew(this.projectPath),tw(this.projectPath),nw(this.projectPath),sw(this.projectPath)]),"gather")),{shouldRebuildIndexes:p,changedDomains:m,incrementalInfo:g}=await Ft("incremental",()=>Iy({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));p&&await Ft("index",async()=>{try{await id(Promise.all([Tf(this.projectPath,this.projectId),Ih(this.projectPath,this.projectId),jh(this.projectPath,this.projectId)]),"index")}catch(T){G.debug("File ranking index build failed (non-critical)",{error:Ge(T)})}});let k,E=Date.now();G.debug("sync phase start",{phase:"skills"});try{let[T,O,ae,Ee,be,Ye,yn,Ln,Mt,di,to]=await Promise.all([Promise.resolve(Ct.getActive(this.projectId)).catch(()=>null),Ke.getActive(this.projectId).catch(()=>null),wt.getRecent(this.projectId,3).catch(()=>[]),gy.getMetrics(this.projectId).catch(()=>null),mt.getBacklog(this.projectId).catch(()=>[]),B.getTaskHistory(this.projectId).catch(()=>[]),B.getAllPausedTasks(this.projectId).catch(()=>[]),B.getAggregatedFeedback(this.projectId).catch(()=>null),B.getCurrentTask(this.projectId).catch(()=>null),Cs.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),wt.getCount(this.projectId).catch(()=>0)]),Hc={backlogCount:be.length,completedTaskCount:Ye.length,pausedTaskCount:yn.length,hasActiveTask:!!Mt},no=T?T.patterns.map(se=>({name:se.name,description:se.description,location:se.locations?.[0]})):(O?.patterns??[]).filter(se=>se.source!=="repo").map(se=>({name:se.name,description:se.description,location:se.location})),so=T?T.antiPatterns.map(se=>({issue:se.issue,file:se.files?.[0]??"multiple",suggestion:se.suggestion,severity:se.severity??"medium"})):(O?.antiPatterns??[]).filter(se=>se.source!=="repo").map(se=>({issue:se.issue,file:se.file,suggestion:se.suggestion,severity:se.severity??"medium"})),pi=T?.commands?{install:T.commands.install??u.install,run:u.run,test:T.commands.test??u.test,build:T.commands.build??u.build,dev:T.commands.dev??u.dev,lint:T.commands.lint??u.lint,format:T.commands.format??u.format}:u,qs={version:l.version,fileCount:l.fileCount,patterns:no,antiPatterns:so,recentShipped:ae.map(se=>({name:se.name,type:se.type??"feature",duration:se.duration,filesChanged:se.changes?.length})),velocity:Ee?{avgPoints:Ee.averageVelocity,trend:Ee.velocityTrend,accuracy:Ee.estimationAccuracy}:null,backlogCount:be.length,completedTaskCount:Ye.length,pausedTaskCount:yn.length,knownGotchas:Ln?.knownGotchas??[],userPatterns:Ln?.patternsDiscovered??[],hasActiveTask:!!Mt,activeTaskDescription:Mt?.description??"",pausedTasks:yn.map(se=>({description:se.description,pausedAt:se.pausedAt??""})),topBacklog:be.slice(0,3).map(se=>({description:se.description,priority:se.priority??"medium"})),ideasCount:di?.pending??0,shippedCount:to};k=await Ty.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:pi,stack:d},Hc,qs)}catch(T){G.debug("Native skill generation failed (non-critical)",{error:Ge(T)})}G.debug("sync phase done",{phase:"skills",ms:Date.now()-E}),await Ft("update-files",()=>Promise.all([Jy({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:a,stats:l}),Xy({projectId:this.projectId,projectPath:this.projectPath,stats:l,stack:d}),Promise.resolve(zy(this.projectId,a,l)),Uy(this.projectId,this.projectPath,a,l,d,r.verified)]));let y=await Ke.getActive(this.projectId),w={patterns:y?.patterns?.length||0,antiPatterns:y?.antiPatterns?.length||0,criticalAntiPatterns:y?.antiPatterns?.filter(T=>T.severity==="high").length||0},v=Date.now()-n,S=await Ft("metrics",()=>Hy(this.projectId,l,v));await Ft("archive",()=>Wy(this.projectId)),await Ft("install-global",async()=>{await He.installGlobalConfig(),await He.syncCommands()});let P;return await Ft("verify",async()=>{try{let T=await I.readConfig(this.projectPath);P=await aw.verify(this.projectPath,this.globalPath,T?.verification)}catch(T){G.debug("Verification failed (non-critical)",{error:Ge(T)})}}),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:u,stack:d,context7:{installed:r.installed,verified:r.verified,message:r.message},analysisSummary:w,syncMetrics:S,verification:P,incremental:g,generatedSkills:k}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:va(),stats:ba(),commands:Sa(),stack:Ta(),context7:{installed:r.installed,verified:r.verified,message:r.message},error:Ge(o)}}}async getCliVersion(){try{let e=Cw.join(__dirname,"..","..","package.json");return(await xe(e))?.version||"0.0.0"}catch(e){return G.debug("Failed to read CLI version",{error:Ge(e)}),"0.0.0"}}},Qn=new ad});function cd(s,e,t){if(t.md){console.log(`> ${e}`);return}f[s](e)}function H(s,e={}){return Vx(s,e),{success:!1,error:s}}function N(s,e={}){return jn(s,e),{success:!1,error:s}}function Me(s,e){let t=b(s);return e&&jn(t,e),{success:!1,error:t}}var Vx,jn,At,Te=h(()=>{"use strict";F();pe();c(cd,"notify");Vx=c((s,e={})=>cd("warn",s,e),"notifyWarn"),jn=c((s,e={})=>cd("fail",s,e),"notifyFail"),At=c((s,e={})=>cd("done",s,e),"notifyDone");c(H,"failWith");c(N,"failHard");c(Me,"failFromError")});function qx(){return"---"}function Jx(){return`---
717
+ prjct v${hi()}`}function W(...s){return ud(qx(),...s.filter(Boolean),Jx())}function Pw(s,e){let t=`| ${s.join(" | ")} |`,n=`|${s.map(()=>"---").join("|")}|`,r=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...r].join(`
718
718
  `)}function xw(s,e=""){return`\`\`\`${e}
719
719
  ${s}
720
- \`\`\``}function cd(s,e){return`**${s}**: \`${e}\``}function q(s,e,t=3){return`### ${s}
720
+ \`\`\``}function ld(s,e){return`**${s}**: \`${e}\``}function q(s,e,t=3){return`### ${s}
721
721
  ${e}`}function Oe(s,e=!1){return s.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
722
722
  `)}function No(s){let e=[];s.branch&&e.push(`Branch: \`${s.branch}\``),s.linearId&&e.push(`Linear: \`${s.linearId}\``),s.type&&e.push(`Type: ${s.type}`),s.estimatedPoints&&e.push(`~${s.estimatedPoints}pts`),s.estimatedMinutes&&e.push(`~${s.estimatedMinutes}min`),s.domains&&s.domains.length>0&&e.push(`Domains: ${s.domains.join(", ")}`),s.duration&&e.push(`Duration: ${s.duration}`),s.status&&e.push(`Status: ${s.status}`);let t=e.length>0?`
723
723
  > ${e.join(" | ")}`:"";return`## ${s.description}${t}`}function Be(s){let e=["Command","Action"],t=s.map(n=>[`\`${n.command}\``,n.label]);return`### Next
724
724
  ${Pw(e,t)}`}function Zn(s){let e=Object.entries(s).filter(([,r])=>r!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([r,o])=>[r,String(o)]);return Pw(t,n)}function Ce(s,e){return e?`## ${s}
725
- > ${e}`:`## ${s}`}function Aw(s){return`> **WARNING:** ${s}`}function ld(...s){return s.filter(Boolean).join(`
725
+ > ${e}`:`## ${s}`}function Aw(s){return`> **WARNING:** ${s}`}function ud(...s){return s.filter(Boolean).join(`
726
726
 
727
727
  `)}function jw(s,e,t,n){let r=e.replace(/_/g," "),o=[`> **${s}**: ${r}`];if(n)for(let[i,a]of Object.entries(n))o.push(`> ${i}: ${a}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
728
- `))}var kt=h(()=>{"use strict";We();c(qx,"mdHeader");c(Jx,"mdFooter");c(W,"mdOutput");c(Pw,"mdTable");c(xw,"mdCodeBlock");c(cd,"mdBadge");c(q,"mdSection");c(Oe,"mdList");c(No,"mdTaskHeader");c(Be,"mdNextSteps");c(Zn,"mdStats");c(Ce,"mdDone");c(Aw,"mdWarn");c(ld,"mdJoin");c(jw,"mdActionRequired")});import Lo from"chalk";function br(s,e={}){if(e.quiet)return;let t=Iw[s]||"idle",n=Ts.getValidCommands(t);if(n.length===0)return;let r=n.map(o=>({cmd:`p. ${o}`,desc:$w[o]||o}));console.log(Lo.dim(`
729
- Next:`));for(let o of r){let i=Lo.cyan(o.cmd.padEnd(12));console.log(Lo.dim(` ${i} \u2192 ${o.desc}`))}}function Ha(s,e=!1){let t=Iw[s]||"idle";return Ts.getValidCommands(t).map(r=>({cmd:e?`prjct ${r} --md`:`p. ${r}`,desc:$w[r]||r}))}function _w(s){let e=Ts.getStateInfo(s);console.log(Lo.dim(`\u{1F4CD} State: ${Lo.white(s.toUpperCase())} - ${e.description}`))}var $w,Iw,Fo=h(()=>{"use strict";pu();$w={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},Iw={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};c(br,"showNextSteps");c(Ha,"getNextSteps");c(_w,"showStateInfo")});import Dw from"node:fs/promises";import Xx from"node:path";async function Nw(s){let e=Xx.join(s,"CLAUDE.md"),t="",n=!0;try{t=await Dw.readFile(e,"utf-8")}catch(o){if(!L(o))throw new Error(`Could not read ${e}: ${b(o)}`);n=!1}let r=nr(n?t:"",Kx,Mw,Ow);return n&&r.content===t?{action:"unchanged",path:e}:(await Dw.writeFile(e,r.content,"utf-8"),{action:n?"updated":"created",path:e})}var Mw,Ow,zx,Kx,Lw=h(()=>{"use strict";$i();F();Mw="<!-- prjct:routing - do not edit between markers -->",Ow="<!-- /prjct:routing - managed by prjct -->",zx=`## prjct usage
728
+ `))}var kt=h(()=>{"use strict";We();c(qx,"mdHeader");c(Jx,"mdFooter");c(W,"mdOutput");c(Pw,"mdTable");c(xw,"mdCodeBlock");c(ld,"mdBadge");c(q,"mdSection");c(Oe,"mdList");c(No,"mdTaskHeader");c(Be,"mdNextSteps");c(Zn,"mdStats");c(Ce,"mdDone");c(Aw,"mdWarn");c(ud,"mdJoin");c(jw,"mdActionRequired")});import Lo from"chalk";function br(s,e={}){if(e.quiet)return;let t=Iw[s]||"idle",n=Ts.getValidCommands(t);if(n.length===0)return;let r=n.map(o=>({cmd:`p. ${o}`,desc:$w[o]||o}));console.log(Lo.dim(`
729
+ Next:`));for(let o of r){let i=Lo.cyan(o.cmd.padEnd(12));console.log(Lo.dim(` ${i} \u2192 ${o.desc}`))}}function Ua(s,e=!1){let t=Iw[s]||"idle";return Ts.getValidCommands(t).map(r=>({cmd:e?`prjct ${r} --md`:`p. ${r}`,desc:$w[r]||r}))}function _w(s){let e=Ts.getStateInfo(s);console.log(Lo.dim(`\u{1F4CD} State: ${Lo.white(s.toUpperCase())} - ${e.description}`))}var $w,Iw,Fo=h(()=>{"use strict";mu();$w={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},Iw={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};c(br,"showNextSteps");c(Ua,"getNextSteps");c(_w,"showStateInfo")});import Dw from"node:fs/promises";import Xx from"node:path";async function Nw(s){let e=Xx.join(s,"CLAUDE.md"),t="",n=!0;try{t=await Dw.readFile(e,"utf-8")}catch(o){if(!L(o))throw new Error(`Could not read ${e}: ${b(o)}`);n=!1}let r=nr(n?t:"",Kx,Mw,Ow);return n&&r.content===t?{action:"unchanged",path:e}:(await Dw.writeFile(e,r.content,"utf-8"),{action:n?"updated":"created",path:e})}var Mw,Ow,zx,Kx,Lw=h(()=>{"use strict";Ii();F();Mw="<!-- prjct:routing - do not edit between markers -->",Ow="<!-- /prjct:routing - managed by prjct -->",zx=`## prjct usage
730
730
 
731
731
  This project uses prjct for memory + workflow tracking. **Do not ask the
732
732
  user to run prjct commands** \u2014 recognize their intent and run the right
@@ -748,10 +748,10 @@ that travel with this project:
748
748
  When in doubt: capture is always safe; ship is never silent.`,Kx=`${Mw}
749
749
  ${zx}
750
750
  ${Ow}
751
- `;c(Nw,"writeProjectClaudeMd")});var ud,gt,Ho=h(()=>{"use strict";Po();Y();ud=class{static{c(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();A.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
752
- VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let r=A.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!r)throw new Error(`Failed to create workflow: ${t.name}`);return dn({projectId:e,entityType:"custom_workflows",entityId:String(r.id),eventType:"upsert",data:{id:r.id,name:t.name,description:t.description??null,metadata:t.metadata??null,created_at:n,updated_at:n,is_builtin:0,enabled:1}}),r.id}getWorkflow(e,t){let n=A.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return n?this.rowToWorkflow(n):null}getAllWorkflows(e,t=!1){let n=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return A.query(e,n).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,n){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];if(n.description!==void 0&&(i.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(i.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),i.length===0)return!1;i.push("updated_at = ?"),a.push(o),a.push(t),A.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a);let l=this.getWorkflow(e,t);return l&&dn({projectId:e,entityType:"custom_workflows",entityId:String(l.id),eventType:"upsert",data:{id:l.id,name:l.name,description:l.description??null,enabled:l.enabled?1:0,metadata:l.metadata??null,updated_at:o}}),!0}deleteWorkflow(e,t){let n=this.getWorkflow(e,t);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return A.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),dn({projectId:e,entityType:"custom_workflows",entityId:String(n.id),eventType:"delete",data:{id:n.id,name:t}}),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||n.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},gt=new ud});function dd(s){let e=s.trust_source==="imported"?"imported":"local";return{id:s.id,type:s.type,command:s.command,position:s.position,action:s.action,description:s.description,enabled:s.enabled===1,timeoutMs:s.timeout_ms,createdAt:s.created_at,sortOrder:s.sort_order,whenExpr:s.when_expr??null,parallel:s.parallel===null?!0:s.parallel===1,trustSource:e}}var pd,ee,$n=h(()=>{"use strict";Po();Ho();Y();c(dd,"rowToRule");pd=class{static{c(this,"WorkflowRuleStorage")}addRule(e,t){let n=j.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),r=t.sortOrder||(n?.m??-1)+1;j.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
753
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,r,t.whenExpr??null,t.parallel===!1?0:1,t.trustSource??"local");let i=j.get(e,"SELECT last_insert_rowid() as id")?.id??0;return i>0&&dn({projectId:e,entityType:"workflow_rules",entityId:String(i),eventType:"upsert",data:{id:i,type:t.type,command:t.command,position:t.position,action:t.action,description:t.description??null,enabled:t.enabled?1:0,timeout_ms:t.timeoutMs,sort_order:r,when_expr:t.whenExpr??null,parallel:t.parallel===!1?0:1,trust_source:t.trustSource??"local",created_at:t.createdAt}}),i}removeRule(e,t){return j.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(j.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),dn({projectId:e,entityType:"workflow_rules",entityId:String(t),eventType:"delete",data:{id:t}}),!0):!1}updateRule(e,t,n){if(!j.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:c(l=>l?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:c(l=>l===!1?0:1,"transform")},trustSource:{column:"trust_source"}},i=[],a=[];for(let[l,u]of Object.entries(n)){let d=o[l];if(!d)continue;i.push(`${d.column} = ?`);let p=u;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),j.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let n=j.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return n?dd(n):null}getRulesForCommand(e,t){let n=gt.getWorkflow(e,t);return!n||!n.enabled?[]:j.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(dd)}getAllRules(e){return j.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(dd)}resetRules(e){let t=j.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return j.run(e,"DELETE FROM workflow_rules"),t?.c??0}},ee=new pd});import at from"node:path";async function Yx(s,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await C(at.join(s,"pnpm-lock.yaml"))?"pnpm":await C(at.join(s,"yarn.lock"))?"yarn":await C(at.join(s,"bun.lockb"))||await C(at.join(s,"bun.lock"))?"bun":(await C(at.join(s,"package-lock.json")),"npm")}function Fw(s,e){return s==="yarn"?`yarn ${e}`:s==="pnpm"?`pnpm run ${e}`:s==="bun"?`bun run ${e}`:`npm run ${e}`}function Qx(s){return s==="yarn"?"yarn test":s==="pnpm"?"pnpm test":s==="bun"?"bun test":"npm test"}async function Sr(s,e){for(let r of Zx)if(await C(at.join(s,r)))return r;let n=(e??await bn(s)).find(r=>r.endsWith(eA));if(n)return n}async function In(s){for(let e of tA)if(await C(at.join(s,e)))return e}async function Ua(s){let e=at.join(s,"package.json"),t=await xe(e,null);if(t){let a=await Yx(s,t),l=t.scripts||{},u={stack:"js",packageManager:a};return l.lint&&(u.lint={tool:a,command:Fw(a,"lint")}),l.typecheck&&(u.typecheck={tool:a,command:Fw(a,"typecheck")}),l.test&&(u.test={tool:a,command:Qx(a)}),u.versionFile=await Sr(s),u.changelogFile=await In(s),u}if(await C(at.join(s,"pytest.ini"))){let a=await Sr(s),l=await In(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}let n=await Tt(at.join(s,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await Sr(s),l=await In(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}if(await C(at.join(s,"Cargo.toml"))){let a=await In(s);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(at.join(s,"go.mod"))){let a=await Sr(s),l=await In(s);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:l}}let r=await bn(s);if(r.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Sr(s,r),l=await In(s);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:l}}if(await C(at.join(s,"pom.xml"))){let a=await In(s);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(at.join(s,"gradlew"))&&(await C(at.join(s,"build.gradle"))||await C(at.join(s,"build.gradle.kts")))){let a=await In(s);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Sr(s),i=await In(s);return{stack:"unknown",versionFile:o,changelogFile:i}}var Zx,eA,tA,md=h(()=>{"use strict";V();c(Yx,"detectPackageManager");c(Fw,"pmRun");c(Qx,"pmTest");Zx=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],eA=".csproj",tA=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];c(Sr,"detectVersionFile");c(In,"detectChangelogFile");c(Ua,"detectProjectCommands")});import Wa from"node:fs/promises";import gd from"node:os";import es from"node:path";async function hd(s){try{let e=await Wa.readdir(s);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=es.join(s,"package.json"),n=JSON.parse(await Wa.readFile(t,"utf-8")),r={...n.dependencies,...n.devDependencies};if(n.bin)return"cli-tool";if(n.main&&!r.react&&!r.vue&&!r.angular&&!r.express&&!r.hono)return"library";if((r.react||r.vue)&&(r.express||r.hono||r.fastify))return"fullstack";if(r.react||r.vue||r["@angular/core"]||r.next||r.nuxt)return"web-app";if(r.express||r.hono||r.fastify||r.koa||r.nestjs)return"api-backend"}return e.includes("pyproject.toml")||e.includes("setup.py")?e.some(n=>["main.py","app.py","server.py"].includes(n))?"api-backend":"library":e.includes("go.mod")?e.includes("main.go")?"cli-tool":"library":e.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async function yd(s){let e=[];await vn(es.join(gd.homedir(),".claude"))&&e.push("claude"),await C(es.join(s,".cursorrules"))&&e.push("cursor"),await C(es.join(s,".windsurfrules"))&&e.push("windsurf"),await C(es.join(s,".github","copilot-instructions.md"))&&e.push("copilot"),await vn(es.join(gd.homedir(),".gemini"))&&e.push("gemini");try{let{execAsync:t}=await Promise.resolve().then(()=>(Fe(),tl));await t("which codex"),e.push("codex")}catch{await vn(es.join(gd.homedir(),".codex"))&&e.push("codex")}return e.length>0?e:["claude"]}async function wd(s){let e={language:"Unknown",technologies:[]};try{let t=await Wa.readdir(s);if(t.includes("package.json")){let n=es.join(s,"package.json"),r=JSON.parse(await Wa.readFile(n,"utf-8")),o={...r.dependencies,...r.devDependencies};e.language=o.typescript?"TypeScript":"JavaScript",o.next?e.framework="Next.js":o.nuxt?e.framework="Nuxt":o.react?e.framework="React":o.vue?e.framework="Vue":o["@angular/core"]?e.framework="Angular":o.express?e.framework="Express":o.hono?e.framework="Hono":o.fastify?e.framework="Fastify":(o.nestjs||o["@nestjs/core"])&&(e.framework="NestJS"),o.bun||o["@types/bun"]||r.engines?.bun?e.runtime="Bun":e.runtime="Node.js",t.includes("bun.lockb")?e.packageManager="Bun":t.includes("pnpm-lock.yaml")?e.packageManager="pnpm":t.includes("yarn.lock")?e.packageManager="Yarn":t.includes("package-lock.json")&&(e.packageManager="npm"),(o.prisma||o["@prisma/client"])&&e.technologies.push("Prisma"),(o.drizzle||o["drizzle-orm"])&&e.technologies.push("Drizzle"),o.tailwindcss&&e.technologies.push("Tailwind CSS"),o.zod&&e.technologies.push("Zod"),(o.trpc||o["@trpc/server"])&&e.technologies.push("tRPC")}else t.includes("pyproject.toml")||t.includes("requirements.txt")?e.language="Python":t.includes("go.mod")?e.language="Go":t.includes("Cargo.toml")?e.language="Rust":(t.includes("pom.xml")||t.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var Uo,fd,Hw=h(()=>{"use strict";V();Uo=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],fd=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}];c(hd,"detectProjectType");c(yd,"detectInstalledAgents");c(wd,"detectStack")});import*as ye from"@clack/prompts";import As from"chalk";var Wo,Uw=h(()=>{"use strict";pe();Hw();Wo=class{static{c(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){ye.intro(As.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:c(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:c(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:c(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:c(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:c(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return ye.outro(As.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await hd(this.projectPath),this.confirmedType=this.detectedType;let e=await yd(this.projectPath);return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await wd(this.projectPath),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await hd(this.projectPath);let e=Uo.findIndex(n=>n.value===this.detectedType),t=await ye.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Uo.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?Uo[e].value:void 0});return ye.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await yd(this.projectPath),t=await ye.multiselect({message:"Which AI agents do you use?",options:fd.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return ye.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await wd(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);ye.note(e,"Detected stack");let t=await ye.confirm({message:"Is this stack correct?",initialValue:!0});if(ye.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await ye.group({language:c(()=>ye.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:c(()=>ye.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:c(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await ye.group({verbosity:c(()=>ye.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:c(()=>ye.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:c(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${As.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${As.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${As.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${As.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${As.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
754
- `);ye.note(e,"Configuration Summary");let t=await ye.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ye.isCancel(t)||!t?(ye.isCancel(t)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,ye.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Uo.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return fd.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import Ww from"node:path";async function rA(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let s=process.cwd();if(await C(Ww.join(s,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(Ww.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function oA(){return{...nA}}function iA(){return{...sA}}async function Gw(){return Ga||(Ga=await rA()?oA():iA(),Ga)}var Ga,nA,sA,Bw=h(()=>{"use strict";V();Ga=null,nA={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},sA={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};c(rA,"isClaudeEnvironment");c(oA,"getClaudeAgent");c(iA,"getTerminalAgent");c(Gw,"detect")});import Ba from"node:fs/promises";var kd,Vw,qw=h(()=>{"use strict";F();V();kd=class{static{c(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${b(t)}`)}return await Ba.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${b(n)}`)}await Ba.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${b(t)}`)}return await Ba.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await Ba.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
751
+ `;c(Nw,"writeProjectClaudeMd")});var dd,gt,Ho=h(()=>{"use strict";Po();Y();dd=class{static{c(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();A.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
752
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let r=A.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!r)throw new Error(`Failed to create workflow: ${t.name}`);return dn({projectId:e,entityType:"custom_workflows",entityId:String(r.id),eventType:"upsert",data:{id:r.id,name:t.name,description:t.description??null,metadata:t.metadata??null,created_at:n,updated_at:n,is_builtin:0,enabled:1}}),r.id}getWorkflow(e,t){let n=A.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return n?this.rowToWorkflow(n):null}getAllWorkflows(e,t=!1){let n=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return A.query(e,n).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,n){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];if(n.description!==void 0&&(i.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(i.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),i.length===0)return!1;i.push("updated_at = ?"),a.push(o),a.push(t),A.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a);let l=this.getWorkflow(e,t);return l&&dn({projectId:e,entityType:"custom_workflows",entityId:String(l.id),eventType:"upsert",data:{id:l.id,name:l.name,description:l.description??null,enabled:l.enabled?1:0,metadata:l.metadata??null,updated_at:o}}),!0}deleteWorkflow(e,t){let n=this.getWorkflow(e,t);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return A.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),dn({projectId:e,entityType:"custom_workflows",entityId:String(n.id),eventType:"delete",data:{id:n.id,name:t}}),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||n.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},gt=new dd});function pd(s){let e=s.trust_source==="imported"?"imported":"local";return{id:s.id,type:s.type,command:s.command,position:s.position,action:s.action,description:s.description,enabled:s.enabled===1,timeoutMs:s.timeout_ms,createdAt:s.created_at,sortOrder:s.sort_order,whenExpr:s.when_expr??null,parallel:s.parallel===null?!0:s.parallel===1,trustSource:e}}var md,ee,$n=h(()=>{"use strict";Po();Ho();Y();c(pd,"rowToRule");md=class{static{c(this,"WorkflowRuleStorage")}addRule(e,t){let n=j.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),r=t.sortOrder||(n?.m??-1)+1;j.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
753
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,r,t.whenExpr??null,t.parallel===!1?0:1,t.trustSource??"local");let i=j.get(e,"SELECT last_insert_rowid() as id")?.id??0;return i>0&&dn({projectId:e,entityType:"workflow_rules",entityId:String(i),eventType:"upsert",data:{id:i,type:t.type,command:t.command,position:t.position,action:t.action,description:t.description??null,enabled:t.enabled?1:0,timeout_ms:t.timeoutMs,sort_order:r,when_expr:t.whenExpr??null,parallel:t.parallel===!1?0:1,trust_source:t.trustSource??"local",created_at:t.createdAt}}),i}removeRule(e,t){return j.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(j.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),dn({projectId:e,entityType:"workflow_rules",entityId:String(t),eventType:"delete",data:{id:t}}),!0):!1}updateRule(e,t,n){if(!j.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:c(l=>l?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:c(l=>l===!1?0:1,"transform")},trustSource:{column:"trust_source"}},i=[],a=[];for(let[l,u]of Object.entries(n)){let d=o[l];if(!d)continue;i.push(`${d.column} = ?`);let p=u;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),j.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let n=j.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return n?pd(n):null}getRulesForCommand(e,t){let n=gt.getWorkflow(e,t);return!n||!n.enabled?[]:j.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(pd)}getAllRules(e){return j.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(pd)}resetRules(e){let t=j.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return j.run(e,"DELETE FROM workflow_rules"),t?.c??0}},ee=new md});import at from"node:path";async function Yx(s,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await C(at.join(s,"pnpm-lock.yaml"))?"pnpm":await C(at.join(s,"yarn.lock"))?"yarn":await C(at.join(s,"bun.lockb"))||await C(at.join(s,"bun.lock"))?"bun":(await C(at.join(s,"package-lock.json")),"npm")}function Fw(s,e){return s==="yarn"?`yarn ${e}`:s==="pnpm"?`pnpm run ${e}`:s==="bun"?`bun run ${e}`:`npm run ${e}`}function Qx(s){return s==="yarn"?"yarn test":s==="pnpm"?"pnpm test":s==="bun"?"bun test":"npm test"}async function Sr(s,e){for(let r of Zx)if(await C(at.join(s,r)))return r;let n=(e??await bn(s)).find(r=>r.endsWith(eA));if(n)return n}async function In(s){for(let e of tA)if(await C(at.join(s,e)))return e}async function Wa(s){let e=at.join(s,"package.json"),t=await xe(e,null);if(t){let a=await Yx(s,t),l=t.scripts||{},u={stack:"js",packageManager:a};return l.lint&&(u.lint={tool:a,command:Fw(a,"lint")}),l.typecheck&&(u.typecheck={tool:a,command:Fw(a,"typecheck")}),l.test&&(u.test={tool:a,command:Qx(a)}),u.versionFile=await Sr(s),u.changelogFile=await In(s),u}if(await C(at.join(s,"pytest.ini"))){let a=await Sr(s),l=await In(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}let n=await Tt(at.join(s,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await Sr(s),l=await In(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}if(await C(at.join(s,"Cargo.toml"))){let a=await In(s);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(at.join(s,"go.mod"))){let a=await Sr(s),l=await In(s);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:l}}let r=await bn(s);if(r.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Sr(s,r),l=await In(s);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:l}}if(await C(at.join(s,"pom.xml"))){let a=await In(s);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(at.join(s,"gradlew"))&&(await C(at.join(s,"build.gradle"))||await C(at.join(s,"build.gradle.kts")))){let a=await In(s);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Sr(s),i=await In(s);return{stack:"unknown",versionFile:o,changelogFile:i}}var Zx,eA,tA,gd=h(()=>{"use strict";V();c(Yx,"detectPackageManager");c(Fw,"pmRun");c(Qx,"pmTest");Zx=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],eA=".csproj",tA=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];c(Sr,"detectVersionFile");c(In,"detectChangelogFile");c(Wa,"detectProjectCommands")});import Ga from"node:fs/promises";import fd from"node:os";import es from"node:path";async function yd(s){try{let e=await Ga.readdir(s);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=es.join(s,"package.json"),n=JSON.parse(await Ga.readFile(t,"utf-8")),r={...n.dependencies,...n.devDependencies};if(n.bin)return"cli-tool";if(n.main&&!r.react&&!r.vue&&!r.angular&&!r.express&&!r.hono)return"library";if((r.react||r.vue)&&(r.express||r.hono||r.fastify))return"fullstack";if(r.react||r.vue||r["@angular/core"]||r.next||r.nuxt)return"web-app";if(r.express||r.hono||r.fastify||r.koa||r.nestjs)return"api-backend"}return e.includes("pyproject.toml")||e.includes("setup.py")?e.some(n=>["main.py","app.py","server.py"].includes(n))?"api-backend":"library":e.includes("go.mod")?e.includes("main.go")?"cli-tool":"library":e.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async function wd(s){let e=[];await vn(es.join(fd.homedir(),".claude"))&&e.push("claude"),await C(es.join(s,".cursorrules"))&&e.push("cursor"),await C(es.join(s,".windsurfrules"))&&e.push("windsurf"),await C(es.join(s,".github","copilot-instructions.md"))&&e.push("copilot"),await vn(es.join(fd.homedir(),".gemini"))&&e.push("gemini");try{let{execAsync:t}=await Promise.resolve().then(()=>(Fe(),nl));await t("which codex"),e.push("codex")}catch{await vn(es.join(fd.homedir(),".codex"))&&e.push("codex")}return e.length>0?e:["claude"]}async function kd(s){let e={language:"Unknown",technologies:[]};try{let t=await Ga.readdir(s);if(t.includes("package.json")){let n=es.join(s,"package.json"),r=JSON.parse(await Ga.readFile(n,"utf-8")),o={...r.dependencies,...r.devDependencies};e.language=o.typescript?"TypeScript":"JavaScript",o.next?e.framework="Next.js":o.nuxt?e.framework="Nuxt":o.react?e.framework="React":o.vue?e.framework="Vue":o["@angular/core"]?e.framework="Angular":o.express?e.framework="Express":o.hono?e.framework="Hono":o.fastify?e.framework="Fastify":(o.nestjs||o["@nestjs/core"])&&(e.framework="NestJS"),o.bun||o["@types/bun"]||r.engines?.bun?e.runtime="Bun":e.runtime="Node.js",t.includes("bun.lockb")?e.packageManager="Bun":t.includes("pnpm-lock.yaml")?e.packageManager="pnpm":t.includes("yarn.lock")?e.packageManager="Yarn":t.includes("package-lock.json")&&(e.packageManager="npm"),(o.prisma||o["@prisma/client"])&&e.technologies.push("Prisma"),(o.drizzle||o["drizzle-orm"])&&e.technologies.push("Drizzle"),o.tailwindcss&&e.technologies.push("Tailwind CSS"),o.zod&&e.technologies.push("Zod"),(o.trpc||o["@trpc/server"])&&e.technologies.push("tRPC")}else t.includes("pyproject.toml")||t.includes("requirements.txt")?e.language="Python":t.includes("go.mod")?e.language="Go":t.includes("Cargo.toml")?e.language="Rust":(t.includes("pom.xml")||t.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var Uo,hd,Hw=h(()=>{"use strict";V();Uo=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],hd=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}];c(yd,"detectProjectType");c(wd,"detectInstalledAgents");c(kd,"detectStack")});import*as ye from"@clack/prompts";import As from"chalk";var Wo,Uw=h(()=>{"use strict";pe();Hw();Wo=class{static{c(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){ye.intro(As.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:c(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:c(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:c(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:c(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:c(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return ye.outro(As.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await yd(this.projectPath),this.confirmedType=this.detectedType;let e=await wd(this.projectPath);return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await kd(this.projectPath),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await yd(this.projectPath);let e=Uo.findIndex(n=>n.value===this.detectedType),t=await ye.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Uo.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?Uo[e].value:void 0});return ye.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await wd(this.projectPath),t=await ye.multiselect({message:"Which AI agents do you use?",options:hd.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return ye.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await kd(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);ye.note(e,"Detected stack");let t=await ye.confirm({message:"Is this stack correct?",initialValue:!0});if(ye.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await ye.group({language:c(()=>ye.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:c(()=>ye.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:c(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await ye.group({verbosity:c(()=>ye.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:c(()=>ye.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:c(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${As.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${As.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${As.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${As.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${As.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
754
+ `);ye.note(e,"Configuration Summary");let t=await ye.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ye.isCancel(t)||!t?(ye.isCancel(t)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,ye.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Uo.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return hd.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import Ww from"node:path";async function rA(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let s=process.cwd();if(await C(Ww.join(s,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(Ww.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function oA(){return{...nA}}function iA(){return{...sA}}async function Gw(){return Ba||(Ba=await rA()?oA():iA(),Ba)}var Ba,nA,sA,Bw=h(()=>{"use strict";V();Ba=null,nA={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},sA={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};c(rA,"isClaudeEnvironment");c(oA,"getClaudeAgent");c(iA,"getTerminalAgent");c(Gw,"detect")});import Va from"node:fs/promises";var vd,Vw,qw=h(()=>{"use strict";F();V();vd=class{static{c(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${b(t)}`)}return await Va.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${b(n)}`)}await Va.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${b(t)}`)}return await Va.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await Va.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
755
755
  ${e.map((t,n)=>`${n+1}. ${t}`).join(`
756
756
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
757
757
 
@@ -796,13 +796,13 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
796
796
 
797
797
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
798
798
 
799
- Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},Vw=kd});function Jw(s){if(!s||typeof s!="object")return!1;let e=s;if(e.code&&cA.has(e.code))return!0;if(e.code&&zw.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function lA(s){if(!s||typeof s!="object")return!1;let e=s;return!!(e.code&&zw.has(e.code))}function Xw(s,e,t){let n=ts.get(s);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(ts.delete(s),!1):!0:!1}function vd(s,e){let t=ts.get(s)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),ts.set(s,t)}function uA(s){ts.delete(s)}var cA,zw,ts,Va,Kw,ZB,Yw=h(()=>{"use strict";cA=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),zw=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);c(Jw,"isTransientError");c(lA,"isPermanentError");ts=new Map;c(Xw,"isCircuitOpen");c(vd,"recordFailure");c(uA,"recordSuccess");Va=class{static{c(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(Xw(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return uA(t),o}catch(o){if(n=o,r++,lA(o))throw vd(t,this.options.circuitBreakerThreshold),o;if(!(Jw(o)&&r<this.options.maxAttempts))throw vd(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,a))}throw vd(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Jw(e)}isCircuitOpen(e){return Xw(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return ts.get(e)}resetCircuit(e){ts.delete(e)}resetAllCircuits(){ts.clear()}},Kw=new Va({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),ZB=new Va({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var dA,bd,qa,Qw=h(()=>{"use strict";Gn();Bw();qw();Yw();dA=["claude"],bd=class{static{c(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await Kw.execute(async()=>{if(this.agentInfo=await Gw(),!this.agentInfo?.isSupported)throw wo.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!dA.includes(e))throw wo.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Vw,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},qa=new bd});var Sd,Td,Zw=h(()=>{"use strict";Sd=class{static{c(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Td=new Sd});var X,Ie=h(()=>{"use strict";Ri();Qw();Zw();Kn();Ed();X=class{static{c(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new Qs,this.updateNotificationShown=!1}get agent(){return qa.getAgent()}get agentInfo(){return qa.getInfo()}get currentAuthor(){return _n.getCurrentAuthor()}async initializeAgent(){return qa.initialize()}async ensureProjectInit(e){return _n.ensureInit(e)}async ensureAuthor(){return _n.ensureAuthor()}async getGlobalProjectPath(e){return _n.getGlobalPath(e)}async logToMemory(e,t,n){let r=await this.ensureAuthor();return it.log(e,t,n,r.name)}async _detectEmptyDirectory(e){return _n.isEmptyDirectory(e)}async _detectExistingCode(e){return _n.hasExistingCode(e)}_breakdownFeatureTasks(e){return Td.breakdownFeature(e)}_detectBugSeverity(e){return Td.detectBugSeverity(e)}}});function ek(s){return js[s]??null}var js,Cd,Rd=h(()=>{"use strict";js={code:{name:"code",description:"Coding work: features, bugs, refactors, TDD, shipping.",suggestedPersona:{role:"DEV",mcps:["github"]},memoryTypes:["fact","decision","learning","gotcha","pattern","anti-pattern","shipped"],workflowSlots:{ship:{description:"Publish finished work \u2014 tests, commit, push, PR."},review:{description:"Pre-commit or pre-PR review pass."}},hookSignals:[],suggestedTags:{domain:["auth","api","frontend","infra","data"]}},daily:{name:"daily",description:"Day-to-day capture + review. GTD-style inbox + weekly review.",memoryTypes:["inbox","todo","idea"],workflowSlots:{morning:{description:"Morning briefing \u2014 pull open todos + upcoming commitments."},clarify:{description:"Reclassify inbox entries to real memory types."},review:{description:"Weekly/biweekly review across memory."}},hookSignals:[]},pm:{name:"pm",description:"Product Management: specs, user interviews, roadmap, backlog triage.",suggestedPersona:{role:"PM",mcps:["linear","posthog"]},memoryTypes:["insight","question","stakeholder","decision","source"],workflowSlots:{spec:{description:"Draft a technical/product spec from captured insights."},triage:{description:"Review Linear backlog and prioritize."},interview:{description:"User interview pre-brief + post-synthesis."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"spec|requirements?|prd",inject:["type=insight","type=question"]}],suggestedTags:{audience:["team","stakeholders"],quarter:["q1","q2","q3","q4"]}},founder:{name:"founder",description:"Founder ops: strategy, fundraising, hiring, stakeholder comms.",suggestedPersona:{role:"Founder",mcps:["gmail","linear","posthog"]},memoryTypes:["goal","okr","person","stakeholder","decision","shipped"],workflowSlots:{"investor-update":{description:"Monthly investor update draft."},"1on1":{description:"1:1 prep + synthesis."},strategy:{description:"Strategy checkpoint \u2014 OKR progress + pivots."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"investor|board|update|fundrais",inject:["type=okr","type=shipped","type=stakeholder"]}],suggestedTags:{audience:["board","investors","team"]}},research:{name:"research",description:"Research: deep-dives, literature review, competitive scans.",suggestedPersona:{role:"Research",mcps:["web"]},memoryTypes:["source","claim","question","insight"],workflowSlots:{"lit-review":{description:"Literature review across captured sources."},analyze:{description:"Data analysis run via MCP, persist findings."}},hookSignals:[],suggestedTags:{confidence:["high","medium","low"]}}},Cd=Object.keys(js);c(ek,"getPackManifest")});var tk={};D(tk,{activatePacks:()=>xd,deactivatePacks:()=>Ad,detectSuggestedPacks:()=>Pd,listActivePacks:()=>jd});async function Pd(s){let e=await import("node:fs/promises"),t=await import("node:path"),n=new Set(["daily"]),r=["package.json","go.mod","Cargo.toml","pyproject.toml","Gemfile","pom.xml","build.gradle"];for(let o of r)try{await e.stat(t.join(s,o)),n.add("code");break}catch{}return[...n]}async function xd(s,e,t={}){let n=[],r=[],o=await I.readConfig(s);if(!o)throw new Error("No prjct project here \u2014 run `prjct init` first.");let i=o.persona??{role:"DEV"},a=new Set(i.packs??[]);for(let p of e){if(!js[p]){r.push(p);continue}a.has(p)||(a.add(p),n.push(p))}let l=[...a],u={...i,packs:l};t.suggestPersona&&n.length>0&&pA(u,n);let d={...o,persona:u};return await I.writeConfig(s,d),{activated:n,skipped:r}}async function Ad(s,e){let t=await I.readConfig(s);if(!t)throw new Error("No prjct project here \u2014 run `prjct init` first.");let n=t.persona??{role:"DEV"},r=new Set(n.packs??[]),o=[],i=[];for(let u of e)r.delete(u)?o.push(u):i.push(u);let a={...n,packs:[...r]},l={...t,persona:a};return await I.writeConfig(s,l),{deactivated:o,notActive:i}}async function jd(s){let t=(await I.readConfig(s))?.persona?.packs??[],n=[];for(let r of t){let o=js[r];o&&n.push({name:o.name,description:o.description,memoryTypes:o.memoryTypes,slots:Object.keys(o.workflowSlots)})}return n}function pA(s,e){let t=s.role&&s.role!=="DEV",n=s.mcps&&s.mcps.length>0;for(let r of e){let o=ek(r);if(o?.suggestedPersona&&(!t&&o.suggestedPersona.role&&(s.role=o.suggestedPersona.role),!s.focus&&o.suggestedPersona.focus&&(s.focus=o.suggestedPersona.focus),!n&&o.suggestedPersona.mcps&&(s.mcps=[...o.suggestedPersona.mcps]),s.role&&s.role!=="DEV"))break}}var $d=h(()=>{"use strict";re();Rd();c(Pd,"detectSuggestedPacks");c(xd,"activatePacks");c(Ad,"deactivatePacks");c(jd,"listActivePacks");c(pA,"applyPersonaSuggestion")});import nk from"node:path";var mA,gA,Ja,sk=h(()=>{"use strict";ue();V();mA=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],gA=`# Changelog
799
+ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},Vw=vd});function Jw(s){if(!s||typeof s!="object")return!1;let e=s;if(e.code&&cA.has(e.code))return!0;if(e.code&&zw.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function lA(s){if(!s||typeof s!="object")return!1;let e=s;return!!(e.code&&zw.has(e.code))}function Xw(s,e,t){let n=ts.get(s);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(ts.delete(s),!1):!0:!1}function bd(s,e){let t=ts.get(s)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),ts.set(s,t)}function uA(s){ts.delete(s)}var cA,zw,ts,qa,Kw,tV,Yw=h(()=>{"use strict";cA=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),zw=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);c(Jw,"isTransientError");c(lA,"isPermanentError");ts=new Map;c(Xw,"isCircuitOpen");c(bd,"recordFailure");c(uA,"recordSuccess");qa=class{static{c(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(Xw(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return uA(t),o}catch(o){if(n=o,r++,lA(o))throw bd(t,this.options.circuitBreakerThreshold),o;if(!(Jw(o)&&r<this.options.maxAttempts))throw bd(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,a))}throw bd(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Jw(e)}isCircuitOpen(e){return Xw(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return ts.get(e)}resetCircuit(e){ts.delete(e)}resetAllCircuits(){ts.clear()}},Kw=new qa({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),tV=new qa({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var dA,Sd,Ja,Qw=h(()=>{"use strict";Gn();Bw();qw();Yw();dA=["claude"],Sd=class{static{c(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await Kw.execute(async()=>{if(this.agentInfo=await Gw(),!this.agentInfo?.isSupported)throw wo.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!dA.includes(e))throw wo.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Vw,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Ja=new Sd});var Td,Ed,Zw=h(()=>{"use strict";Td=class{static{c(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Ed=new Td});var X,Ie=h(()=>{"use strict";Pi();Qw();Zw();Kn();Cd();X=class{static{c(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new Qs,this.updateNotificationShown=!1}get agent(){return Ja.getAgent()}get agentInfo(){return Ja.getInfo()}get currentAuthor(){return _n.getCurrentAuthor()}async initializeAgent(){return Ja.initialize()}async ensureProjectInit(e){return _n.ensureInit(e)}async ensureAuthor(){return _n.ensureAuthor()}async getGlobalProjectPath(e){return _n.getGlobalPath(e)}async logToMemory(e,t,n){let r=await this.ensureAuthor();return it.log(e,t,n,r.name)}async _detectEmptyDirectory(e){return _n.isEmptyDirectory(e)}async _detectExistingCode(e){return _n.hasExistingCode(e)}_breakdownFeatureTasks(e){return Ed.breakdownFeature(e)}_detectBugSeverity(e){return Ed.detectBugSeverity(e)}}});function ek(s){return js[s]??null}var js,Rd,Pd=h(()=>{"use strict";js={code:{name:"code",description:"Coding work: features, bugs, refactors, TDD, shipping.",suggestedPersona:{role:"DEV",mcps:["github"]},memoryTypes:["fact","decision","learning","gotcha","pattern","anti-pattern","shipped"],workflowSlots:{ship:{description:"Publish finished work \u2014 tests, commit, push, PR."},review:{description:"Pre-commit or pre-PR review pass."}},hookSignals:[],suggestedTags:{domain:["auth","api","frontend","infra","data"]}},daily:{name:"daily",description:"Day-to-day capture + review. GTD-style inbox + weekly review.",memoryTypes:["inbox","todo","idea"],workflowSlots:{morning:{description:"Morning briefing \u2014 pull open todos + upcoming commitments."},clarify:{description:"Reclassify inbox entries to real memory types."},review:{description:"Weekly/biweekly review across memory."}},hookSignals:[]},pm:{name:"pm",description:"Product Management: specs, user interviews, roadmap, backlog triage.",suggestedPersona:{role:"PM",mcps:["linear","posthog"]},memoryTypes:["insight","question","stakeholder","decision","source"],workflowSlots:{spec:{description:"Draft a technical/product spec from captured insights."},triage:{description:"Review Linear backlog and prioritize."},interview:{description:"User interview pre-brief + post-synthesis."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"spec|requirements?|prd",inject:["type=insight","type=question"]}],suggestedTags:{audience:["team","stakeholders"],quarter:["q1","q2","q3","q4"]}},founder:{name:"founder",description:"Founder ops: strategy, fundraising, hiring, stakeholder comms.",suggestedPersona:{role:"Founder",mcps:["gmail","linear","posthog"]},memoryTypes:["goal","okr","person","stakeholder","decision","shipped"],workflowSlots:{"investor-update":{description:"Monthly investor update draft."},"1on1":{description:"1:1 prep + synthesis."},strategy:{description:"Strategy checkpoint \u2014 OKR progress + pivots."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"investor|board|update|fundrais",inject:["type=okr","type=shipped","type=stakeholder"]}],suggestedTags:{audience:["board","investors","team"]}},research:{name:"research",description:"Research: deep-dives, literature review, competitive scans.",suggestedPersona:{role:"Research",mcps:["web"]},memoryTypes:["source","claim","question","insight"],workflowSlots:{"lit-review":{description:"Literature review across captured sources."},analyze:{description:"Data analysis run via MCP, persist findings."}},hookSignals:[],suggestedTags:{confidence:["high","medium","low"]}}},Rd=Object.keys(js);c(ek,"getPackManifest")});var tk={};D(tk,{activatePacks:()=>Ad,deactivatePacks:()=>jd,detectSuggestedPacks:()=>xd,listActivePacks:()=>$d});async function xd(s){let e=await import("node:fs/promises"),t=await import("node:path"),n=new Set(["daily"]),r=["package.json","go.mod","Cargo.toml","pyproject.toml","Gemfile","pom.xml","build.gradle"];for(let o of r)try{await e.stat(t.join(s,o)),n.add("code");break}catch{}return[...n]}async function Ad(s,e,t={}){let n=[],r=[],o=await I.readConfig(s);if(!o)throw new Error("No prjct project here \u2014 run `prjct init` first.");let i=o.persona??{role:"DEV"},a=new Set(i.packs??[]);for(let p of e){if(!js[p]){r.push(p);continue}a.has(p)||(a.add(p),n.push(p))}let l=[...a],u={...i,packs:l};t.suggestPersona&&n.length>0&&pA(u,n);let d={...o,persona:u};return await I.writeConfig(s,d),{activated:n,skipped:r}}async function jd(s,e){let t=await I.readConfig(s);if(!t)throw new Error("No prjct project here \u2014 run `prjct init` first.");let n=t.persona??{role:"DEV"},r=new Set(n.packs??[]),o=[],i=[];for(let u of e)r.delete(u)?o.push(u):i.push(u);let a={...n,packs:[...r]},l={...t,persona:a};return await I.writeConfig(s,l),{deactivated:o,notActive:i}}async function $d(s){let t=(await I.readConfig(s))?.persona?.packs??[],n=[];for(let r of t){let o=js[r];o&&n.push({name:o.name,description:o.description,memoryTypes:o.memoryTypes,slots:Object.keys(o.workflowSlots)})}return n}function pA(s,e){let t=s.role&&s.role!=="DEV",n=s.mcps&&s.mcps.length>0;for(let r of e){let o=ek(r);if(o?.suggestedPersona&&(!t&&o.suggestedPersona.role&&(s.role=o.suggestedPersona.role),!s.focus&&o.suggestedPersona.focus&&(s.focus=o.suggestedPersona.focus),!n&&o.suggestedPersona.mcps&&(s.mcps=[...o.suggestedPersona.mcps]),s.role&&s.role!=="DEV"))break}}var Id=h(()=>{"use strict";re();Pd();c(xd,"detectSuggestedPacks");c(Ad,"activatePacks");c(jd,"deactivatePacks");c($d,"listActivePacks");c(pA,"applyPersonaSuggestion")});import nk from"node:path";var mA,gA,Xa,sk=h(()=>{"use strict";ue();V();mA=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],gA=`# Changelog
800
800
 
801
801
  All notable changes to this project will be documented in this file.
802
802
 
803
803
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
804
804
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
805
- `,Ja=class{static{c(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of mA){let r=nk.join(this.projectPath,n);if(await C(r)){let o=await Tt(r),i=this.detectFormat(o);return{filePath:r,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=nk.join(this.projectPath,e);return await kn(t,`${gA}
805
+ `,Xa=class{static{c(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of mA){let r=nk.join(this.projectPath,n);if(await C(r)){let o=await Tt(r),i=this.detectFormat(o);return{filePath:r,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=nk.join(this.projectPath,e);return await kn(t,`${gA}
806
806
  `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await Tt(t.filePath);if(this.hasVersionEntry(n,e.version,t.format))return;let r=e.date||ag(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(n,e,r):o=this.insertMarkdownEntry(n,e,r),await kn(t.filePath,o)}hasVersionEntry(e,t,n){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return(n==="keepachangelog"?new RegExp(`^## \\[${r}\\]`,"m"):new RegExp(`^## ${r}\\b`,"m")).test(e)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,n){let r=e.split(`
807
807
  `),o=r.findIndex(l=>/^##\s*\[Unreleased\]\s*$/i.test(l));if(o!==-1){let l=r.length;for(let m=o+1;m<r.length;m++)if(/^##\s/.test(r[m])){l=m;break}let u=r.slice(o+1,l).join(`
808
808
  `).trim(),d=this.promoteUnreleasedBody(u,t,n);return`${[...r.slice(0,o),"## [Unreleased]","",d,"",...r.slice(l)].join(`
@@ -833,49 +833,49 @@ ${a}`}return`${r}
833
833
 
834
834
  ${e}`}formatKeepAChangelogEntry(e,t){let n=[`## [${e.version}] - ${t}`];if(n.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){n.push(`### ${r}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push("### Added"),n.push(`- ${e.description}`),n.push(""));return n.join(`
835
835
  `)}formatMarkdownEntry(e,t){let n=[`## ${e.version} - ${t}`];if(n.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){n.push(`### ${r}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push(`- ${e.description}`),n.push(""));return n.join(`
836
- `)}}});import $s from"node:path";function Id(s){return/^\d+\.\d+\.\d+/.test(s)}function Tr(s){let e=s.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return s;let[,t,n,r,o]=e;if(o){let i=o.split("."),a=i.length-1;return/^\d+$/.test(i[a])?(i[a]=String(Number(i[a])+1),`${t}.${n}.${r}-${i.join(".")}`):`${t}.${n}.${r}-${o}.1`}return`${t}.${n}.${Number(r)+1}`}function rk(s){let e=s.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function ok(s){let e=s.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let n=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}let t=s.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let n=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}return null}function ik(s){return s.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Xa,ak=h(()=>{"use strict";Fe();V();Xa=class{static{c(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let n=await t();if(n)return n}return this.createFallbackVersion()}async bump(){let e=await this.detect();if(e.file){let t=await this.readVersionFromGitHead(e.file,e.format);if(t&&this.isAheadOf(e.current,t))return e.current}return await this.writeVersion(e),e.next}async readVersionFromGitHead(e,t){try{let n=$s.relative(this.projectPath,e),{stdout:r}=await Le("git",["show",`HEAD:${n}`],{cwd:this.projectPath});if(t==="json")return JSON.parse(r).version??null;if(t==="plaintext"){let o=r.trim();return Id(o)?o:null}return t==="toml"?rk(r)??ok(r):t==="xml"?ik(r):null}catch{return null}}isAheadOf(e,t){let n=e.split(".").map(o=>Number.parseInt(o,10)||0),r=t.split(".").map(o=>Number.parseInt(o,10)||0);for(let o=0;o<3;o++){let i=n[o]??0,a=r[o]??0;if(i>a)return!0;if(i<a)return!1}return!1}async fromPackageJson(){let e=$s.join(this.projectPath,"package.json"),t=await xe(e,null);return t?.version?{current:t.version,next:Tr(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=$s.join(this.projectPath,"Cargo.toml"),t=await Tt(e,"");if(!t)return null;let n=rk(t);return n?{current:n,next:Tr(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=$s.join(this.projectPath,"pyproject.toml"),t=await Tt(e,"");if(!t)return null;let n=ok(t);return n?{current:n,next:Tr(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await bn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=$s.join(this.projectPath,e[0]),n=await Tt(t,"");if(!n)return null;let r=ik(n);return r?{current:r,next:Tr(r),file:t,format:"xml"}:null}async fromVersionFile(e){let t=$s.join(this.projectPath,e),n=await Tt(t,"");if(!n)return null;let r=n.trim();return Id(r)?{current:r,next:Tr(r),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await U("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
837
- `);for(let n of t){let r=n.trim().replace(/^v/,"");if(Id(r))return{current:r,next:Tr(r),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=$s.join(this.projectPath,"VERSION");return await kn(e,`0.1.0
836
+ `)}}});import $s from"node:path";function _d(s){return/^\d+\.\d+\.\d+/.test(s)}function Tr(s){let e=s.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return s;let[,t,n,r,o]=e;if(o){let i=o.split("."),a=i.length-1;return/^\d+$/.test(i[a])?(i[a]=String(Number(i[a])+1),`${t}.${n}.${r}-${i.join(".")}`):`${t}.${n}.${r}-${o}.1`}return`${t}.${n}.${Number(r)+1}`}function rk(s){let e=s.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function ok(s){let e=s.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let n=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}let t=s.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let n=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}return null}function ik(s){return s.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var za,ak=h(()=>{"use strict";Fe();V();za=class{static{c(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let n=await t();if(n)return n}return this.createFallbackVersion()}async bump(){let e=await this.detect();if(e.file){let t=await this.readVersionFromGitHead(e.file,e.format);if(t&&this.isAheadOf(e.current,t))return e.current}return await this.writeVersion(e),e.next}async readVersionFromGitHead(e,t){try{let n=$s.relative(this.projectPath,e),{stdout:r}=await Le("git",["show",`HEAD:${n}`],{cwd:this.projectPath});if(t==="json")return JSON.parse(r).version??null;if(t==="plaintext"){let o=r.trim();return _d(o)?o:null}return t==="toml"?rk(r)??ok(r):t==="xml"?ik(r):null}catch{return null}}isAheadOf(e,t){let n=e.split(".").map(o=>Number.parseInt(o,10)||0),r=t.split(".").map(o=>Number.parseInt(o,10)||0);for(let o=0;o<3;o++){let i=n[o]??0,a=r[o]??0;if(i>a)return!0;if(i<a)return!1}return!1}async fromPackageJson(){let e=$s.join(this.projectPath,"package.json"),t=await xe(e,null);return t?.version?{current:t.version,next:Tr(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=$s.join(this.projectPath,"Cargo.toml"),t=await Tt(e,"");if(!t)return null;let n=rk(t);return n?{current:n,next:Tr(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=$s.join(this.projectPath,"pyproject.toml"),t=await Tt(e,"");if(!t)return null;let n=ok(t);return n?{current:n,next:Tr(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await bn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=$s.join(this.projectPath,e[0]),n=await Tt(t,"");if(!n)return null;let r=ik(n);return r?{current:r,next:Tr(r),file:t,format:"xml"}:null}async fromVersionFile(e){let t=$s.join(this.projectPath,e),n=await Tt(t,"");if(!n)return null;let r=n.trim();return _d(r)?{current:r,next:Tr(r),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await U("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
837
+ `);for(let n of t){let r=n.trim().replace(/^v/,"");if(_d(r))return{current:r,next:Tr(r),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=$s.join(this.projectPath,"VERSION");return await kn(e,`0.1.0
838
838
  `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Le("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await kn(e.file,`${e.next}
839
- `);break}}async writeJsonVersion(e,t){let n=await xe(e,{});n&&(n.version=t,await ke(e,n))}async writeTomlVersion(e,t){let n=await Tt(e,"");if(!n)return;let r=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await kn(e,r)}async writeXmlVersion(e,t){let n=await Tt(e,"");if(!n)return;let r=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await kn(e,r)}};c(Id,"isSemver");c(Tr,"bumpPatch");c(rk,"parseTomlVersion");c(ok,"parsePyprojectVersion");c(ik,"parseCsprojVersion")});async function za(s){try{let{stdout:e}=await U("git branch --show-current",{cwd:s});return e.trim()||void 0}catch{return}}async function ck(s,e=20){try{let{stdout:t}=await U("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:s});return t.trim().split(`
840
- `).filter(n=>n.length>0).slice(0,e)}catch{return[]}}var Ka=h(()=>{"use strict";Fe();c(za,"getGitBranch");c(ck,"getModifiedFiles")});function fA(s){let e=s.split(/\s+/).map(n=>n.trim()).filter(Boolean),t=[];for(let n of e){let r=n.match(/^tags:([a-zA-Z0-9_\-.]+)([=~])(.+)$/);if(r){t.push({kind:"tags",key:r[1],op:r[2],value:r[3]});continue}let o=n.match(/^branch([=~])(.+)$/);if(o){t.push({kind:"branch",op:o[1],value:o[2]});continue}let i=n.match(/^files:(.+)$/);i&&t.push({kind:"files",op:"~",value:i[1]})}return t}function hA(s){let e=lk.get(s);if(e)return e;let t="";for(let r=0;r<s.length;r++){let o=s[r];o==="*"?s[r+1]==="*"?(t+=".*",r++):t+="[^/]*":/[.+^${}()|[\]\\]/.test(o)?t+=`\\${o}`:t+=o}let n=new RegExp(`^${t}$`);return lk.set(s,n),n}function yA(s,e){if(s.kind==="tags"){let t=e.tags[s.key??""]??"";return s.op==="="?t===s.value:t.toLowerCase().includes(s.value.toLowerCase())}if(s.kind==="branch")return s.op==="="?e.branch===s.value:e.branch.toLowerCase().includes(s.value.toLowerCase());if(s.kind==="files"){let t=hA(s.value);return e.filesChanged.some(n=>t.test(n))}return!0}function uk(s,e){if(!s||!s.trim())return!0;let t=fA(s);return t.length===0?!0:t.every(n=>yA(n,e))}var lk,dk=h(()=>{"use strict";c(fA,"parseWhen");lk=new Map;c(hA,"globToRegex");c(yA,"matchCondition");c(uk,"evaluateWhen")});import{execSync as wA}from"node:child_process";import kA from"node:fs/promises";import _d from"node:path";import jt from"chalk";async function TA(s,e,t){let n=await B.getCurrentTask(s);if(!n)throw new Error(`Cannot transition to '${t}': no active task`);await it.log(e,vr,{taskId:n.id,from:n.type??null,to:t,source:"workflow"})}async function EA(s,e){if(s.trustSource==="imported")throw new Error(`Refusing to run imported rule without approval: ${s.description||s.action}. Re-create the rule locally if you trust it.`);await U(s.action,{timeout:s.timeoutMs,cwd:e,env:{...process.env}})}async function CA(s,e,t){if(s.trustSource==="imported")throw new Error(`Refusing to run imported script rule without approval: ${s.description||s.action}.`);let n=s.action.slice(gk.length).trim();if(!n)throw new Error(`Empty script path in action '${s.action}'`);let r=_d.resolve(e,".prjct/workflows",n),o=_d.resolve(e,".prjct/workflows");if(!r.startsWith(`${o}${_d.sep}`)&&r!==o)throw new Error(`Script path escapes workflows dir: ${n}`);try{await kA.access(r)}catch{throw new Error(`Script not found: .prjct/workflows/${n}`)}await U(`bash ${JSON.stringify(r)}`,{timeout:s.timeoutMs,cwd:e,env:{...process.env,PRJCT_BRANCH:t.branch,PRJCT_FILES_CHANGED:t.filesChanged.join(","),PRJCT_TAGS:Object.entries(t.tags).map(([i,a])=>`${i}=${a}`).join(",")}})}function RA(s){let e=s.action.slice(fk.length).trim(),t=e.indexOf(":");if(t===-1)return`Call MCP tool ${JSON.stringify(e)} (server unspecified \u2014 re-author rule with format \`mcp:<server>:<tool>[:<args>]\`).`;let n=e.slice(0,t),r=e.slice(t+1),o=r.indexOf(":"),i=o===-1?r:r.slice(0,o),a=o===-1?"":r.slice(o+1),l=s.description?` (${s.description})`:"";return a?`Call MCP \`${n}.${i}\` with args ${a}${l}.`:`Call MCP \`${n}.${i}\`${l}.`}async function PA(s){try{let{default:e}=await Promise.resolve().then(()=>(re(),ws)),n=(await e.readConfig(s))?.persona;if(!n)return"No persona declared for this project \u2014 `.prjct/prjct.config.json` has no `persona` field.";let r=[`You are **${n.role}** in this project.`];return n.focus&&r.push(`Focus: ${n.focus}.`),n.mcps&&n.mcps.length>0&&r.push(`MCPs available: ${n.mcps.join(", ")}.`),n.packs&&n.packs.length>0&&r.push(`Active packs: ${n.packs.join(", ")}.`),r.join(" ")}catch(e){return`Could not resolve persona: ${b(e)}`}}async function xA(s,e){let n=await new Xa(s).bump();e.version=n}async function AA(s,e){let t=typeof e.version=="string"?e.version:null,n=typeof e.feature=="string"?e.feature:null;if(!t)throw new Error("changelog:add requires a prior version:bump step (no version in runContext)");if(!n)throw new Error("changelog:add requires a feature name in runContext (set by ship before rules run)");await new Ja(s).addFeature(t,n)}function jA(s,e){return s.replace(/\$([A-Z_]+)/g,(t,n)=>{let r=n.toLowerCase(),o=e[r];return typeof o=="string"?o:""})}async function $A(s,e,t){let r=s.slice(Md.length).replace(/^:/,"").trim()||(t.version?"feat: $FEATURE (v$VERSION)":"feat: $FEATURE"),o=`${jA(r,t)}
839
+ `);break}}async writeJsonVersion(e,t){let n=await xe(e,{});n&&(n.version=t,await ke(e,n))}async writeTomlVersion(e,t){let n=await Tt(e,"");if(!n)return;let r=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await kn(e,r)}async writeXmlVersion(e,t){let n=await Tt(e,"");if(!n)return;let r=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await kn(e,r)}};c(_d,"isSemver");c(Tr,"bumpPatch");c(rk,"parseTomlVersion");c(ok,"parsePyprojectVersion");c(ik,"parseCsprojVersion")});async function Ka(s){try{let{stdout:e}=await U("git branch --show-current",{cwd:s});return e.trim()||void 0}catch{return}}async function ck(s,e=20){try{let{stdout:t}=await U("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:s});return t.trim().split(`
840
+ `).filter(n=>n.length>0).slice(0,e)}catch{return[]}}var Ya=h(()=>{"use strict";Fe();c(Ka,"getGitBranch");c(ck,"getModifiedFiles")});function fA(s){let e=s.split(/\s+/).map(n=>n.trim()).filter(Boolean),t=[];for(let n of e){let r=n.match(/^tags:([a-zA-Z0-9_\-.]+)([=~])(.+)$/);if(r){t.push({kind:"tags",key:r[1],op:r[2],value:r[3]});continue}let o=n.match(/^branch([=~])(.+)$/);if(o){t.push({kind:"branch",op:o[1],value:o[2]});continue}let i=n.match(/^files:(.+)$/);i&&t.push({kind:"files",op:"~",value:i[1]})}return t}function hA(s){let e=lk.get(s);if(e)return e;let t="";for(let r=0;r<s.length;r++){let o=s[r];o==="*"?s[r+1]==="*"?(t+=".*",r++):t+="[^/]*":/[.+^${}()|[\]\\]/.test(o)?t+=`\\${o}`:t+=o}let n=new RegExp(`^${t}$`);return lk.set(s,n),n}function yA(s,e){if(s.kind==="tags"){let t=e.tags[s.key??""]??"";return s.op==="="?t===s.value:t.toLowerCase().includes(s.value.toLowerCase())}if(s.kind==="branch")return s.op==="="?e.branch===s.value:e.branch.toLowerCase().includes(s.value.toLowerCase());if(s.kind==="files"){let t=hA(s.value);return e.filesChanged.some(n=>t.test(n))}return!0}function uk(s,e){if(!s||!s.trim())return!0;let t=fA(s);return t.length===0?!0:t.every(n=>yA(n,e))}var lk,dk=h(()=>{"use strict";c(fA,"parseWhen");lk=new Map;c(hA,"globToRegex");c(yA,"matchCondition");c(uk,"evaluateWhen")});import{execSync as wA}from"node:child_process";import kA from"node:fs/promises";import Dd from"node:path";import jt from"chalk";async function TA(s,e,t){let n=await B.getCurrentTask(s);if(!n)throw new Error(`Cannot transition to '${t}': no active task`);await it.log(e,vr,{taskId:n.id,from:n.type??null,to:t,source:"workflow"})}async function EA(s,e){if(s.trustSource==="imported")throw new Error(`Refusing to run imported rule without approval: ${s.description||s.action}. Re-create the rule locally if you trust it.`);await U(s.action,{timeout:s.timeoutMs,cwd:e,env:{...process.env}})}async function CA(s,e,t){if(s.trustSource==="imported")throw new Error(`Refusing to run imported script rule without approval: ${s.description||s.action}.`);let n=s.action.slice(gk.length).trim();if(!n)throw new Error(`Empty script path in action '${s.action}'`);let r=Dd.resolve(e,".prjct/workflows",n),o=Dd.resolve(e,".prjct/workflows");if(!r.startsWith(`${o}${Dd.sep}`)&&r!==o)throw new Error(`Script path escapes workflows dir: ${n}`);try{await kA.access(r)}catch{throw new Error(`Script not found: .prjct/workflows/${n}`)}await U(`bash ${JSON.stringify(r)}`,{timeout:s.timeoutMs,cwd:e,env:{...process.env,PRJCT_BRANCH:t.branch,PRJCT_FILES_CHANGED:t.filesChanged.join(","),PRJCT_TAGS:Object.entries(t.tags).map(([i,a])=>`${i}=${a}`).join(",")}})}function RA(s){let e=s.action.slice(fk.length).trim(),t=e.indexOf(":");if(t===-1)return`Call MCP tool ${JSON.stringify(e)} (server unspecified \u2014 re-author rule with format \`mcp:<server>:<tool>[:<args>]\`).`;let n=e.slice(0,t),r=e.slice(t+1),o=r.indexOf(":"),i=o===-1?r:r.slice(0,o),a=o===-1?"":r.slice(o+1),l=s.description?` (${s.description})`:"";return a?`Call MCP \`${n}.${i}\` with args ${a}${l}.`:`Call MCP \`${n}.${i}\`${l}.`}async function PA(s){try{let{default:e}=await Promise.resolve().then(()=>(re(),ws)),n=(await e.readConfig(s))?.persona;if(!n)return"No persona declared for this project \u2014 `.prjct/prjct.config.json` has no `persona` field.";let r=[`You are **${n.role}** in this project.`];return n.focus&&r.push(`Focus: ${n.focus}.`),n.mcps&&n.mcps.length>0&&r.push(`MCPs available: ${n.mcps.join(", ")}.`),n.packs&&n.packs.length>0&&r.push(`Active packs: ${n.packs.join(", ")}.`),r.join(" ")}catch(e){return`Could not resolve persona: ${b(e)}`}}async function xA(s,e){let n=await new za(s).bump();e.version=n}async function AA(s,e){let t=typeof e.version=="string"?e.version:null,n=typeof e.feature=="string"?e.feature:null;if(!t)throw new Error("changelog:add requires a prior version:bump step (no version in runContext)");if(!n)throw new Error("changelog:add requires a feature name in runContext (set by ship before rules run)");await new Xa(s).addFeature(t,n)}function jA(s,e){return s.replace(/\$([A-Z_]+)/g,(t,n)=>{let r=n.toLowerCase(),o=e[r];return typeof o=="string"?o:""})}async function $A(s,e,t){let r=s.slice(Od.length).replace(/^:/,"").trim()||(t.version?"feat: $FEATURE (v$VERSION)":"feat: $FEATURE"),o=`${jA(r,t)}
841
841
 
842
- Generated with [p/](https://www.prjct.app/)`;await Le("git",["add","."],{cwd:e}),await Le("git",["commit","-m",o],{cwd:e})}async function IA(s){await Le("git",["push"],{cwd:s})}async function Dd(s,e,t,n,r,o){let i=s.action;if(i.startsWith(pk)){let a=i.slice(pk.length).trim();if(!a)throw new Error(`Empty status target in action '${i}'`);await TA(e,t,a);return}if(i.startsWith(gk)){await CA(s,t,n);return}if(i.startsWith(fk)){r.instructions.push(RA(s));return}if(i===vA){r.instructions.push(await PA(t));return}if(i===mk||i.startsWith(`${mk}:`)){await xA(t,o);return}if(i===bA){await AA(t,o);return}if(i===Md||i.startsWith(`${Md}:`)){await $A(i,t,o);return}if(i===SA){await IA(t);return}await EA(s,t)}async function _A(s,e){let[t,n,r]=await Promise.all([DA(e),MA(e),OA(s)]);return{branch:t,filesChanged:n,tags:r}}async function DA(s){try{return await za(s)||""}catch{return""}}async function MA(s){let e={cwd:s,encoding:"utf-8"},t=c(async o=>{try{return wA(o,e).split(`
842
+ Generated with [p/](https://www.prjct.app/)`;await Le("git",["add","."],{cwd:e}),await Le("git",["commit","-m",o],{cwd:e})}async function IA(s){await Le("git",["push"],{cwd:s})}async function Md(s,e,t,n,r,o){let i=s.action;if(i.startsWith(pk)){let a=i.slice(pk.length).trim();if(!a)throw new Error(`Empty status target in action '${i}'`);await TA(e,t,a);return}if(i.startsWith(gk)){await CA(s,t,n);return}if(i.startsWith(fk)){r.instructions.push(RA(s));return}if(i===vA){r.instructions.push(await PA(t));return}if(i===mk||i.startsWith(`${mk}:`)){await xA(t,o);return}if(i===bA){await AA(t,o);return}if(i===Od||i.startsWith(`${Od}:`)){await $A(i,t,o);return}if(i===SA){await IA(t);return}await EA(s,t)}async function _A(s,e){let[t,n,r]=await Promise.all([DA(e),MA(e),OA(s)]);return{branch:t,filesChanged:n,tags:r}}async function DA(s){try{return await Ka(s)||""}catch{return""}}async function MA(s){let e={cwd:s,encoding:"utf-8"},t=c(async o=>{try{return wA(o,e).split(`
843
843
  `).map(i=>i.trim()).filter(Boolean)}catch{return[]}},"runDiff"),[n,r]=await Promise.all([t("git diff --cached --name-only"),t("git diff --name-only")]);return[...new Set([...n,...r])]}async function OA(s){try{let e=await B.getCurrentTask(s),t={};if(e?.type&&(t.type=e.type),!e)return t;let n=A.get(s,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 1",mw);if(n)try{let r=JSON.parse(n.data);if(r.taskId===e.id&&r.tags)return{...t,...r.tags}}catch{}return t}catch{return{}}}async function ns(s,e,t,n={}){let r={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(n.skipRules)return r;let o=n.runContext??{},a=ee.getRulesForCommand(s,e).filter(S=>S.position===t),l=n.projectPath||process.cwd(),d=a.some(S=>S.whenExpr||S.type==="gate")?await _A(s,l):{branch:"",filesChanged:[],tags:{}},p=a.filter(S=>uk(S.whenExpr,d)),m=p.filter(S=>S.type==="gate");for(let S of m){let P=S.description||S.action;console.log(`
844
- ${jt.dim(`[gate] ${t}-${e}: ${S.action}`)}`);try{let T=Date.now();await Dd(S,s,l,d,r,o);let O=Date.now()-T,ae=O>1e3?`${(O/1e3).toFixed(1)}s`:`${O}ms`;console.log(`${jt.green("\u2713")} ${jt.dim(`gate passed (${ae})`)}`)}catch(T){return console.log(`${jt.red("\u2717")} gate failed: ${P}`),r.gatesFailed.push(P),r.success=!1,r.output+=`Gate failed: ${P}
844
+ ${jt.dim(`[gate] ${t}-${e}: ${S.action}`)}`);try{let T=Date.now();await Md(S,s,l,d,r,o);let O=Date.now()-T,ae=O>1e3?`${(O/1e3).toFixed(1)}s`:`${O}ms`;console.log(`${jt.green("\u2713")} ${jt.dim(`gate passed (${ae})`)}`)}catch(T){return console.log(`${jt.red("\u2717")} gate failed: ${P}`),r.gatesFailed.push(P),r.success=!1,r.output+=`Gate failed: ${P}
845
845
  ${b(T)}
846
846
  `,r}}let g=p.filter(S=>S.type==="instruction");for(let S of g){let P=S.description||S.action;console.log(`
847
847
  ${jt.dim(`[instruction] ${t}-${e}: ${P}`)}`),r.instructions.push(S.action)}let k=p.filter(S=>S.type==="hook"),E=k.filter(S=>S.parallel===!1),y=k.filter(S=>S.parallel!==!1),w=c(async S=>{console.log(`
848
- ${jt.dim(`[hook] ${t}-${e}: ${S.action}`)}`);try{let P=Date.now();await Dd(S,s,l,d,r,o);let T=Date.now()-P,O=T>1e3?`${(T/1e3).toFixed(1)}s`:`${T}ms`;console.log(`${jt.green("\u2713")} ${jt.dim(`(${O})`)}`)}catch(P){console.log(`${jt.yellow("\u26A0")} hook failed (non-blocking): ${S.action}`),r.hooksFailed.push(S.description||S.action),r.output+=`Hook failed: ${S.action}
848
+ ${jt.dim(`[hook] ${t}-${e}: ${S.action}`)}`);try{let P=Date.now();await Md(S,s,l,d,r,o);let T=Date.now()-P,O=T>1e3?`${(T/1e3).toFixed(1)}s`:`${T}ms`;console.log(`${jt.green("\u2713")} ${jt.dim(`(${O})`)}`)}catch(P){console.log(`${jt.yellow("\u26A0")} hook failed (non-blocking): ${S.action}`),r.hooksFailed.push(S.description||S.action),r.output+=`Hook failed: ${S.action}
849
849
  ${b(P)}
850
850
  `}},"runHook");for(let S of E)await w(S);y.length>0&&await Promise.all(y.map(w));let v=p.filter(S=>S.type==="step");for(let S of v){console.log(`
851
- ${jt.dim(`[step] ${e}: ${S.action}`)}`);try{let P=Date.now();await Dd(S,s,l,d,r,o);let T=Date.now()-P,O=T>1e3?`${(T/1e3).toFixed(1)}s`:`${T}ms`;console.log(`${jt.green("\u2713")} ${jt.dim(`step passed (${O})`)}`),r.stepsRun.push(S.description||S.action)}catch(P){return console.log(`${jt.red("\u2717")} step failed: ${S.action}`),r.gatesFailed.push(S.description||S.action),r.success=!1,r.output+=`Step failed: ${S.action}
851
+ ${jt.dim(`[step] ${e}: ${S.action}`)}`);try{let P=Date.now();await Md(S,s,l,d,r,o);let T=Date.now()-P,O=T>1e3?`${(T/1e3).toFixed(1)}s`:`${T}ms`;console.log(`${jt.green("\u2713")} ${jt.dim(`step passed (${O})`)}`),r.stepsRun.push(S.description||S.action)}catch(P){return console.log(`${jt.red("\u2717")} step failed: ${S.action}`),r.gatesFailed.push(S.description||S.action),r.success=!1,r.output+=`Step failed: ${S.action}
852
852
  ${b(P)}
853
- `,r}}return r}var pk,gk,fk,vA,mk,bA,Md,SA,Od=h(()=>{"use strict";_a();sk();Kn();ak();Ka();Y();pt();$n();F();Fe();dk();pk="status:",gk="script:",fk="mcp:",vA="persona:context",mk="version:bump",bA="changelog:add",Md="git:commit",SA="git:push";c(TA,"runStatusTransition");c(EA,"runShellAction");c(CA,"runScriptAction");c(RA,"buildMcpInstruction");c(PA,"buildPersonaInstruction");c(xA,"runVersionBump");c(AA,"runChangelogAdd");c(jA,"expandTemplate");c($A,"runGitCommit");c(IA,"runGitPush");c(Dd,"runRuleAction");c(_A,"buildWhenContext");c(DA,"resolveBranch");c(MA,"resolveChangedFiles");c(OA,"resolveActiveTags");c(ns,"executeWorkflowRules")});import{z as Re}from"zod";var ss,Is,Nd,NA,Dn,Go=h(()=>{"use strict";ss=["draft","reviewed","in_progress","shipped","archived"],Is=["strategic","architecture","design"],Nd=Re.object({verdict:Re.enum(["pass","fail"]),notes:Re.string(),ts:Re.string()}),NA=Re.object({risk:Re.string().min(1),mitigation:Re.string().min(1)}),Dn=Re.object({goal:Re.string().min(1),eli10:Re.string().default(""),stakes:Re.string().default(""),acceptance_criteria:Re.array(Re.string().min(1)).default([]),scope:Re.array(Re.string()).default([]),out_of_scope:Re.array(Re.string()).default([]),risks:Re.array(NA).default([]),test_plan:Re.array(Re.string()).default([]),reviews:Re.object({strategic:Nd.optional(),architecture:Nd.optional(),design:Nd.optional()}).optional(),linked_tasks:Re.array(Re.string()).default([]),notes:Re.string().default(""),tasks_created_at:Re.string().nullable().default(null)})});var hk={};D(hk,{specStorage:()=>_e});var Ld,_e,Bo=h(()=>{"use strict";Rn();Go();ue();Y();Ld=class{static{c(this,"SpecStorage")}nextUpdatedAt(e,t){let n=R(),o=A.get(e,"SELECT updated_at FROM specs WHERE id = ?",t)?.updated_at;return!o||n>o?n:new Date(new Date(o).getTime()+1).toISOString()}create(e,t){let n=Ve(),r=R(),o=Dn.parse(t.content);return A.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
854
- VALUES (?, ?, 'draft', ?, ?, ?, ?)`,n,t.title,JSON.stringify(o),t.tags?JSON.stringify(t.tags):null,r,r),{id:n,title:t.title,status:"draft",content:o,tags:t.tags??{},createdAt:r,updatedAt:r,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null}}get(e,t){let n=A.get(e,"SELECT * FROM specs WHERE id = ?",t);return n?this.rowToSpec(n):null}list(e,t={}){let n="SELECT * FROM specs WHERE 1=1",r=[];return t.status&&(n+=" AND status = ?",r.push(t.status)),!t.includeArchived&&!t.status&&(n+=" AND status != 'archived'"),n+=" ORDER BY created_at DESC",A.query(e,n,...r).map(i=>this.rowToSpec(i))}search(e,t){let n=`%${t}%`;return A.query(e,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",n,n).map(o=>this.rowToSpec(o))}updateContent(e,t,n){let r=Dn.parse(n),o=this.nextUpdatedAt(e,t);return A.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(r),o,t),this.get(e,t)}casUpdate(e,t,n,r){let o=Dn.parse(n),i=this.nextUpdatedAt(e,t);return A.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(o),i,t,r).changes===1}setStatus(e,t,n){if(!ss.includes(n))throw new Error(`invalid spec status: ${n}`);let r=this.nextUpdatedAt(e,t),o=[],i=[n,r];n==="shipped"&&(o.push("shipped_at = ?"),i.push(r)),n==="archived"&&(o.push("archived_at = ?"),i.push(r));let a=["status = ?","updated_at = ?",...o].join(", ");return i.push(t),A.run(e,`UPDATE specs SET ${a} WHERE id = ?`,...i),this.get(e,t)}setShippedPr(e,t,n){return A.run(e,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}setShippedSha(e,t,n){return A.run(e,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}linkTask(e,t,n){let r=this.get(e,t);if(!r)return null;if(r.content.linked_tasks.includes(n))return r;let o={...r.content,linked_tasks:[...r.content.linked_tasks,n]};return this.updateContent(e,t,o)}delete(e,t){return this.get(e,t)?(A.run(e,"DELETE FROM specs WHERE id = ?",t),!0):!1}count(e){let t=A.query(e,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),n={total:0,draft:0,shipped:0};for(let r of t)n.total+=r.n,r.status==="draft"&&(n.draft=r.n),r.status==="shipped"&&(n.shipped=r.n);return n}rowToSpec(e){return{id:e.id,title:e.title,status:ss.includes(e.status)?e.status:"draft",content:Dn.parse(JSON.parse(e.content)),tags:e.tags?JSON.parse(e.tags):{},createdAt:e.created_at,updatedAt:e.updated_at,shippedAt:e.shipped_at,shippedPr:e.shipped_pr,shippedSha:e.shipped_sha,archivedAt:e.archived_at}}},_e=new Ld});var yk,wk,kk,vk,bk=h(()=>{"use strict";yk={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},wk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),kk=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]),vk=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"])});import LA from"node:fs/promises";import Ya from"node:path";async function Sk(s,e,t={}){let n=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=FA(s),l=await HA(e),u=await UA(e),d=[];for(let m of l){if(!i&&GA(m))continue;let g=WA(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,r);return{files:p,metrics:{filesScanned:l.length,filesReturned:p.length,scanDuration:Date.now()-n}}}function FA(s){return s.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).filter(t=>!vk.has(t)&&t.length>2)}async function HA(s){let e=[];async function t(n,r=""){try{let o=await LA.readdir(n,{withFileTypes:!0});for(let i of o){let a=Ya.join(n,i.name),l=Ya.join(r,i.name);if(i.isDirectory()){if(kk.has(i.name)||i.name.startsWith("."))continue;await t(a,l)}else if(i.isFile()){let u=Ya.extname(i.name).toLowerCase();wk.has(u)&&e.push(l)}}}catch(o){L(o)}}return c(t,"walk"),await t(s),e}async function UA(s){let e=new Map;try{let{stdout:t}=await U(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
853
+ `,r}}return r}var pk,gk,fk,vA,mk,bA,Od,SA,Nd=h(()=>{"use strict";Da();sk();Kn();ak();Ya();Y();pt();$n();F();Fe();dk();pk="status:",gk="script:",fk="mcp:",vA="persona:context",mk="version:bump",bA="changelog:add",Od="git:commit",SA="git:push";c(TA,"runStatusTransition");c(EA,"runShellAction");c(CA,"runScriptAction");c(RA,"buildMcpInstruction");c(PA,"buildPersonaInstruction");c(xA,"runVersionBump");c(AA,"runChangelogAdd");c(jA,"expandTemplate");c($A,"runGitCommit");c(IA,"runGitPush");c(Md,"runRuleAction");c(_A,"buildWhenContext");c(DA,"resolveBranch");c(MA,"resolveChangedFiles");c(OA,"resolveActiveTags");c(ns,"executeWorkflowRules")});import{z as Re}from"zod";var ss,Is,Ld,NA,Dn,Go=h(()=>{"use strict";ss=["draft","reviewed","in_progress","shipped","archived"],Is=["strategic","architecture","design"],Ld=Re.object({verdict:Re.enum(["pass","fail"]),notes:Re.string(),ts:Re.string()}),NA=Re.object({risk:Re.string().min(1),mitigation:Re.string().min(1)}),Dn=Re.object({goal:Re.string().min(1),eli10:Re.string().default(""),stakes:Re.string().default(""),acceptance_criteria:Re.array(Re.string().min(1)).default([]),scope:Re.array(Re.string()).default([]),out_of_scope:Re.array(Re.string()).default([]),risks:Re.array(NA).default([]),test_plan:Re.array(Re.string()).default([]),reviews:Re.object({strategic:Ld.optional(),architecture:Ld.optional(),design:Ld.optional()}).optional(),linked_tasks:Re.array(Re.string()).default([]),notes:Re.string().default(""),tasks_created_at:Re.string().nullable().default(null)})});var hk={};D(hk,{specStorage:()=>_e});var Fd,_e,Bo=h(()=>{"use strict";Rn();Go();ue();Y();Fd=class{static{c(this,"SpecStorage")}nextUpdatedAt(e,t){let n=R(),o=A.get(e,"SELECT updated_at FROM specs WHERE id = ?",t)?.updated_at;return!o||n>o?n:new Date(new Date(o).getTime()+1).toISOString()}create(e,t){let n=Ve(),r=R(),o=Dn.parse(t.content);return A.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
854
+ VALUES (?, ?, 'draft', ?, ?, ?, ?)`,n,t.title,JSON.stringify(o),t.tags?JSON.stringify(t.tags):null,r,r),{id:n,title:t.title,status:"draft",content:o,tags:t.tags??{},createdAt:r,updatedAt:r,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null}}get(e,t){let n=A.get(e,"SELECT * FROM specs WHERE id = ?",t);return n?this.rowToSpec(n):null}list(e,t={}){let n="SELECT * FROM specs WHERE 1=1",r=[];return t.status&&(n+=" AND status = ?",r.push(t.status)),!t.includeArchived&&!t.status&&(n+=" AND status != 'archived'"),n+=" ORDER BY created_at DESC",A.query(e,n,...r).map(i=>this.rowToSpec(i))}search(e,t){let n=`%${t}%`;return A.query(e,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",n,n).map(o=>this.rowToSpec(o))}updateContent(e,t,n){let r=Dn.parse(n),o=this.nextUpdatedAt(e,t);return A.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(r),o,t),this.get(e,t)}casUpdate(e,t,n,r){let o=Dn.parse(n),i=this.nextUpdatedAt(e,t);return A.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(o),i,t,r).changes===1}setStatus(e,t,n){if(!ss.includes(n))throw new Error(`invalid spec status: ${n}`);let r=this.nextUpdatedAt(e,t),o=[],i=[n,r];n==="shipped"&&(o.push("shipped_at = ?"),i.push(r)),n==="archived"&&(o.push("archived_at = ?"),i.push(r));let a=["status = ?","updated_at = ?",...o].join(", ");return i.push(t),A.run(e,`UPDATE specs SET ${a} WHERE id = ?`,...i),this.get(e,t)}setShippedPr(e,t,n){return A.run(e,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}setShippedSha(e,t,n){return A.run(e,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}linkTask(e,t,n){let r=this.get(e,t);if(!r)return null;if(r.content.linked_tasks.includes(n))return r;let o={...r.content,linked_tasks:[...r.content.linked_tasks,n]};return this.updateContent(e,t,o)}delete(e,t){return this.get(e,t)?(A.run(e,"DELETE FROM specs WHERE id = ?",t),!0):!1}count(e){let t=A.query(e,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),n={total:0,draft:0,shipped:0};for(let r of t)n.total+=r.n,r.status==="draft"&&(n.draft=r.n),r.status==="shipped"&&(n.shipped=r.n);return n}rowToSpec(e){return{id:e.id,title:e.title,status:ss.includes(e.status)?e.status:"draft",content:Dn.parse(JSON.parse(e.content)),tags:e.tags?JSON.parse(e.tags):{},createdAt:e.created_at,updatedAt:e.updated_at,shippedAt:e.shipped_at,shippedPr:e.shipped_pr,shippedSha:e.shipped_sha,archivedAt:e.archived_at}}},_e=new Fd});var yk,wk,kk,vk,bk=h(()=>{"use strict";yk={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},wk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),kk=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]),vk=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"])});import LA from"node:fs/promises";import Qa from"node:path";async function Sk(s,e,t={}){let n=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=FA(s),l=await HA(e),u=await UA(e),d=[];for(let m of l){if(!i&&GA(m))continue;let g=WA(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,r);return{files:p,metrics:{filesScanned:l.length,filesReturned:p.length,scanDuration:Date.now()-n}}}function FA(s){return s.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).filter(t=>!vk.has(t)&&t.length>2)}async function HA(s){let e=[];async function t(n,r=""){try{let o=await LA.readdir(n,{withFileTypes:!0});for(let i of o){let a=Qa.join(n,i.name),l=Qa.join(r,i.name);if(i.isDirectory()){if(kk.has(i.name)||i.name.startsWith("."))continue;await t(a,l)}else if(i.isFile()){let u=Qa.extname(i.name).toLowerCase();wk.has(u)&&e.push(l)}}}catch(o){L(o)}}return c(t,"walk"),await t(s),e}async function UA(s){let e=new Map;try{let{stdout:t}=await U(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
855
855
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
856
856
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
857
857
  END { for (f in files) print files[f], lastmod[f], f }
858
858
  '`,{cwd:s,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),r=t.trim().split(`
859
- `).filter(Boolean);for(let o of r){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),l=parseInt(i[2],10),u=i[3],d=Math.floor((n-l)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function WA(s,e,t,n){let r=[],o=0,i=0,a=0,l=0,u=0,d=s.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let y of e){d.includes(y)&&(o+=.3,r.push(`keyword:${y}`));for(let w of p)if(w.includes(y)||y.includes(w)){o+=.15;break}}o=Math.min(1,o);for(let[y,w]of Object.entries(yk))for(let v of w)if(d.includes(v)&&e.some(P=>w.includes(P)||P.includes(y)||y.includes(P))){i+=.4,r.push(`domain:${y}`);break}i=Math.min(1,i);let m=t.get(s);m&&(m.daysAgo<=1?(a=1,r.push("recent:1d")):m.daysAgo<=3?(a=.8,r.push("recent:3d")):m.daysAgo<=7?(a=.6,r.push("recent:1w")):m.daysAgo<=30&&(a=.3,r.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let g=Ya.basename(s).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(l=.5,r.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(l=Math.max(l,.3),r.some(y=>y.startsWith("import:"))||r.push("import:1")),n){let y=n.get(s);y!==void 0&&(u=(y+1)/2,y>0?r.push("history:boosted"):y<0&&r.push("history:penalized"))}let E=n&&n.size>0?o*.54+i*.18+a*.13+l*.05+u*.1:o*.6+i*.2+a*.15+l*.05;return{path:s,score:Math.min(1,E),reasons:[...new Set(r)]}}function GA(s){let e=s.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var Tk=h(()=>{"use strict";F();Fe();bk();c(Sk,"findRelevantFiles");c(FA,"extractKeywords");c(HA,"getAllCodeFiles");c(UA,"getGitRecency");c(WA,"scoreFile");c(GA,"isTestFile")});var Ck={};D(Ck,{inferSpecContext:()=>qA,warnNoContextMatch:()=>zA});async function qA(s,e,t){let[n,r]=await Promise.all([Sk(s,t,{maxFiles:Ek*4,minScore:VA}).catch(()=>({files:[]})),Promise.resolve(J.recall(e,{topic:s,limit:BA})).catch(()=>[])]),o=JA(n.files.map(l=>l.path),Ek);return o.length===0&&r.length===0?{notesBlock:"",paths:[],memoryHits:0,empty:!0}:{notesBlock:XA(s,o,r),paths:o,memoryHits:r.length,empty:!1}}function JA(s,e){let t=new Set,n=[];for(let r of s){let o=r.split("/").slice(0,2).join("/");if(!t.has(o)&&(t.add(o),n.push(r),n.length>=e))break}return n}function XA(s,e,t){let n=[];if(n.push("<!-- auto-context:tentative -->"),n.push("## Existing context (auto-inferred)"),n.push(""),n.push(`_Inferred from title "${s}". Validate before audit \u2014 entries tagged tentative._`),n.push(""),e.length>0){n.push("### Likely paths");for(let r of e)n.push(`- \`${r}\``);n.push("")}if(t.length>0){n.push("### Relevant prior memory");for(let r of t){let o=r.content.length>140?`${r.content.slice(0,137)}\u2026`:r.content,i=Object.entries(r.tags).map(([a,l])=>`${a}:${l}`).join(" ");n.push(`- **${r.type}**${i?` _(${i})_`:""} \u2014 ${o}`)}n.push("")}return n.push("<!-- /auto-context -->"),n.join(`
859
+ `).filter(Boolean);for(let o of r){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),l=parseInt(i[2],10),u=i[3],d=Math.floor((n-l)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function WA(s,e,t,n){let r=[],o=0,i=0,a=0,l=0,u=0,d=s.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let y of e){d.includes(y)&&(o+=.3,r.push(`keyword:${y}`));for(let w of p)if(w.includes(y)||y.includes(w)){o+=.15;break}}o=Math.min(1,o);for(let[y,w]of Object.entries(yk))for(let v of w)if(d.includes(v)&&e.some(P=>w.includes(P)||P.includes(y)||y.includes(P))){i+=.4,r.push(`domain:${y}`);break}i=Math.min(1,i);let m=t.get(s);m&&(m.daysAgo<=1?(a=1,r.push("recent:1d")):m.daysAgo<=3?(a=.8,r.push("recent:3d")):m.daysAgo<=7?(a=.6,r.push("recent:1w")):m.daysAgo<=30&&(a=.3,r.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let g=Qa.basename(s).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(l=.5,r.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(l=Math.max(l,.3),r.some(y=>y.startsWith("import:"))||r.push("import:1")),n){let y=n.get(s);y!==void 0&&(u=(y+1)/2,y>0?r.push("history:boosted"):y<0&&r.push("history:penalized"))}let E=n&&n.size>0?o*.54+i*.18+a*.13+l*.05+u*.1:o*.6+i*.2+a*.15+l*.05;return{path:s,score:Math.min(1,E),reasons:[...new Set(r)]}}function GA(s){let e=s.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var Tk=h(()=>{"use strict";F();Fe();bk();c(Sk,"findRelevantFiles");c(FA,"extractKeywords");c(HA,"getAllCodeFiles");c(UA,"getGitRecency");c(WA,"scoreFile");c(GA,"isTestFile")});var Ck={};D(Ck,{inferSpecContext:()=>qA,warnNoContextMatch:()=>zA});async function qA(s,e,t){let[n,r]=await Promise.all([Sk(s,t,{maxFiles:Ek*4,minScore:VA}).catch(()=>({files:[]})),Promise.resolve(J.recall(e,{topic:s,limit:BA})).catch(()=>[])]),o=JA(n.files.map(l=>l.path),Ek);return o.length===0&&r.length===0?{notesBlock:"",paths:[],memoryHits:0,empty:!0}:{notesBlock:XA(s,o,r),paths:o,memoryHits:r.length,empty:!1}}function JA(s,e){let t=new Set,n=[];for(let r of s){let o=r.split("/").slice(0,2).join("/");if(!t.has(o)&&(t.add(o),n.push(r),n.length>=e))break}return n}function XA(s,e,t){let n=[];if(n.push("<!-- auto-context:tentative -->"),n.push("## Existing context (auto-inferred)"),n.push(""),n.push(`_Inferred from title "${s}". Validate before audit \u2014 entries tagged tentative._`),n.push(""),e.length>0){n.push("### Likely paths");for(let r of e)n.push(`- \`${r}\``);n.push("")}if(t.length>0){n.push("### Relevant prior memory");for(let r of t){let o=r.content.length>140?`${r.content.slice(0,137)}\u2026`:r.content,i=Object.entries(r.tags).map(([a,l])=>`${a}:${l}`).join(" ");n.push(`- **${r.type}**${i?` _(${i})_`:""} \u2014 ${o}`)}n.push("")}return n.push("<!-- /auto-context -->"),n.join(`
860
860
  `)}function zA(s,e){let t={level:"warn",code:"no_context_match",message:`No codebase or memory context matched "${s}"`,suggestion:e??"Fill spec.notes manually or run with `--skip-context` next time."};process.stderr.write(`${JSON.stringify(t)}
861
- `)}var Ek,BA,VA,Rk=h(()=>{"use strict";$e();Tk();Ek=5,BA=8,VA=.15;c(qA,"inferSpecContext");c(JA,"dedupeTopDirs");c(XA,"buildNotesBlock");c(zA,"warnNoContextMatch")});var Fd={};D(Fd,{breakdownSpecToTasks:()=>KA});async function KA(s,e,t){let n=t.content.acceptance_criteria;if(n.length===0)return{taskIds:[],skippedReason:"no_acceptance_criteria"};if(t.content.tasks_created_at!==null)return{taskIds:[],skippedReason:"already_broken_down"};let r=!1;if(t.content.linked_tasks.length>0){r=!0,await mt.deleteByFeatureId(s,t.id);let a={...t.content,linked_tasks:[]};_e.updateContent(s,t.id,a)}let o=await mt.addTasks(s,n.map(a=>({description:YA(a),body:a,priority:"medium",type:"feature",section:"backlog",featureId:t.id,groupId:t.id,groupName:t.title})));for(let a of o)_e.linkTask(s,t.id,a.id);let i=_e.get(s,t.id);if(i){let a={...i.content,tasks_created_at:R()};_e.updateContent(s,t.id,a)}return await J.remember(e,{type:"spec",content:`Auto-breakdown: ${o.length} tasks created from ${t.title}${r?" (recovered from partial)":""}`,tags:{spec_id:t.id,event:"auto_breakdown",task_count:String(o.length),...r?{recovered:"partial"}:{}},source:t.id}),{taskIds:o.map(a=>a.id),...r?{recoveredFromPartial:!0}:{}}}function YA(s){let e=s.replace(/\s+/g," ").trim();return e.length<=140?e:`${e.slice(0,137)}\u2026`}var Hd=h(()=>{"use strict";$e();Rs();Bo();ue();c(KA,"breakdownSpecToTasks");c(YA,"truncateForDescription")});var Wd={};D(Wd,{specService:()=>$t});import{execFile as QA}from"node:child_process";import{promisify as ZA}from"node:util";async function tj(s){try{let{stdout:e}=await ej("git",["rev-parse","HEAD"],{cwd:s}),t=e.trim();return/^[0-9a-f]{7,40}$/.test(t)?t:null}catch{return null}}var ej,Ud,$t,Qa=h(()=>{"use strict";re();$e();Bo();Go();ue();ej=ZA(QA);c(tj,"readGitHead");Ud=class{static{c(this,"SpecService")}async create(e,t){let n=await this.requireProjectId(e),r=t.content.notes??"";if(t.autoContext!==!1&&!r.trim()){let{inferSpecContext:l,warnNoContextMatch:u}=await Promise.resolve().then(()=>(Rk(),Ck)),d=await l(t.title,n,e);d.empty?u(t.title):r=d.notesBlock}let i=Dn.parse({goal:t.content.goal,eli10:t.content.eli10??"",stakes:t.content.stakes??"",acceptance_criteria:t.content.acceptance_criteria??[],scope:t.content.scope??[],out_of_scope:t.content.out_of_scope??[],risks:t.content.risks??[],test_plan:t.content.test_plan??[],reviews:t.content.reviews,linked_tasks:t.content.linked_tasks??[],notes:r}),a=_e.create(n,{title:t.title,content:i,tags:t.tags});return await J.remember(e,{type:"spec",content:`${a.title}
861
+ `)}var Ek,BA,VA,Rk=h(()=>{"use strict";$e();Tk();Ek=5,BA=8,VA=.15;c(qA,"inferSpecContext");c(JA,"dedupeTopDirs");c(XA,"buildNotesBlock");c(zA,"warnNoContextMatch")});var Hd={};D(Hd,{breakdownSpecToTasks:()=>KA});async function KA(s,e,t){let n=t.content.acceptance_criteria;if(n.length===0)return{taskIds:[],skippedReason:"no_acceptance_criteria"};if(t.content.tasks_created_at!==null)return{taskIds:[],skippedReason:"already_broken_down"};let r=!1;if(t.content.linked_tasks.length>0){r=!0,await mt.deleteByFeatureId(s,t.id);let a={...t.content,linked_tasks:[]};_e.updateContent(s,t.id,a)}let o=await mt.addTasks(s,n.map(a=>({description:YA(a),body:a,priority:"medium",type:"feature",section:"backlog",featureId:t.id,groupId:t.id,groupName:t.title})));for(let a of o)_e.linkTask(s,t.id,a.id);let i=_e.get(s,t.id);if(i){let a={...i.content,tasks_created_at:R()};_e.updateContent(s,t.id,a)}return await J.remember(e,{type:"spec",content:`Auto-breakdown: ${o.length} tasks created from ${t.title}${r?" (recovered from partial)":""}`,tags:{spec_id:t.id,event:"auto_breakdown",task_count:String(o.length),...r?{recovered:"partial"}:{}},source:t.id}),{taskIds:o.map(a=>a.id),...r?{recoveredFromPartial:!0}:{}}}function YA(s){let e=s.replace(/\s+/g," ").trim();return e.length<=140?e:`${e.slice(0,137)}\u2026`}var Ud=h(()=>{"use strict";$e();Rs();Bo();ue();c(KA,"breakdownSpecToTasks");c(YA,"truncateForDescription")});var Gd={};D(Gd,{specService:()=>$t});import{execFile as QA}from"node:child_process";import{promisify as ZA}from"node:util";async function tj(s){try{let{stdout:e}=await ej("git",["rev-parse","HEAD"],{cwd:s}),t=e.trim();return/^[0-9a-f]{7,40}$/.test(t)?t:null}catch{return null}}var ej,Wd,$t,Za=h(()=>{"use strict";re();$e();Bo();Go();ue();ej=ZA(QA);c(tj,"readGitHead");Wd=class{static{c(this,"SpecService")}async create(e,t){let n=await this.requireProjectId(e),r=t.content.notes??"";if(t.autoContext!==!1&&!r.trim()){let{inferSpecContext:l,warnNoContextMatch:u}=await Promise.resolve().then(()=>(Rk(),Ck)),d=await l(t.title,n,e);d.empty?u(t.title):r=d.notesBlock}let i=Dn.parse({goal:t.content.goal,eli10:t.content.eli10??"",stakes:t.content.stakes??"",acceptance_criteria:t.content.acceptance_criteria??[],scope:t.content.scope??[],out_of_scope:t.content.out_of_scope??[],risks:t.content.risks??[],test_plan:t.content.test_plan??[],reviews:t.content.reviews,linked_tasks:t.content.linked_tasks??[],notes:r}),a=_e.create(n,{title:t.title,content:i,tags:t.tags});return await J.remember(e,{type:"spec",content:`${a.title}
862
862
 
863
- Goal: ${a.content.goal}`,tags:{...t.tags??{},spec_id:a.id,status:a.status},source:a.id,provenance:"declared"}),a}async get(e,t){let n=await this.requireProjectId(e);return _e.get(n,t)}async list(e,t={}){let n=await this.requireProjectId(e);return _e.list(n,t)}async setStatus(e,t,n){let r=await this.requireProjectId(e),o=_e.setStatus(r,t,n);return o&&await J.remember(e,{type:"spec",content:`Spec status \u2192 ${n}: ${o.title}`,tags:{spec_id:t,status:n,event:"status_change"},source:t}),o}async update(e,t,n){let r=await this.requireProjectId(e);return _e.updateContent(r,t,n)}async recordReview(e,t,n,r){let o=await this.requireProjectId(e),i=3,a=50,l=0,u=!1,d=null;for(;l<i;){let p=_e.get(o,t);if(!p)return null;let m={...r,ts:R()},g={...p.content,reviews:{...p.content.reviews??{},[n]:m}};if(_e.casUpdate(o,t,g,p.updatedAt)){u=!0,d=_e.get(o,t);break}l++,l<i&&await new Promise(E=>setTimeout(E,a))}if(!u)throw new Error(`SPEC_RECORD_REVIEW_CONFLICT_RETRY_EXHAUSTED: ${i} retries failed for spec ${t}`);if(d&&this.allReviewsPass(d.content)&&d.status==="draft"){let p=_e.setStatus(o,t,"reviewed");if(p){let{breakdownSpecToTasks:m}=await Promise.resolve().then(()=>(Hd(),Fd));return await m(o,e,p),_e.get(o,t)}return p}return d}async linkTask(e,t,n){let r=await this.requireProjectId(e);return _e.linkTask(r,t,n)}async ship(e,t,n){let r=await this.requireProjectId(e);n!==void 0&&_e.setShippedPr(r,t,n);let o=await tj(e);return o&&_e.setShippedSha(r,t,o),_e.setStatus(r,t,"shipped")}unmetCriteria(e,t=new Set){return e.content.acceptance_criteria.filter(n=>!t.has(n))}allReviewsPass(e){let t=e.reviews;return t?t.strategic?.verdict==="pass"&&t.architecture?.verdict==="pass"&&t.design?.verdict==="pass":!1}async requireProjectId(e){let t=await I.readConfig(e);if(!t?.projectId)throw new Error("not a prjct project (run `prjct init` first)");return t.projectId}},$t=new Ud});import nj from"node:crypto";import Vo from"node:fs/promises";import sj from"node:os";import zt from"node:path";async function Pk(s){let e=await oj(s),t=zt.basename(s),n=`obsidian://open?vault=${encodeURIComponent(t)}`,r=rj();if(!r)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:n,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await ij(r,s);return{bootstrapped:e,registered:o,vaultName:t,openUrl:n,obsidianConfigFound:!0,alreadyRegistered:i}}function rj(){let s=sj.homedir(),e,t=process.env.PRJCT_OBSIDIAN_CONFIG_DIR?.trim();if(t)e=t;else switch(process.platform){case"darwin":e=zt.join(s,"Library","Application Support","obsidian");break;case"win32":e=zt.join(process.env.APPDATA||zt.join(s,"AppData","Roaming"),"obsidian");break;default:e=zt.join(process.env.XDG_CONFIG_HOME||zt.join(s,".config"),"obsidian");break}try{if(!qe("node:fs").existsSync(e))return null}catch{return null}return zt.join(e,"obsidian.json")}async function oj(s){let e=zt.join(s,".obsidian"),t=zt.join(e,"app.json");try{return await Vo.stat(t),!1}catch{}return await Vo.mkdir(e,{recursive:!0}),await Vo.writeFile(t,`${JSON.stringify({},null,2)}
864
- `,"utf-8"),!0}async function ij(s,e){let t={};try{let a=await Vo.readFile(s,"utf-8");t=JSON.parse(a)}catch{}let n=t.vaults??{},r=zt.resolve(e);for(let a of Object.values(n))if(zt.resolve(a.path)===r)return{registered:!1,alreadyRegistered:!0};let o=nj.randomBytes(8).toString("hex");n[o]={path:r,ts:Date.now()};let i={...t,vaults:n};try{return await Vo.writeFile(s,JSON.stringify(i),"utf-8"),{registered:!0,alreadyRegistered:!1}}catch{return{registered:!1,alreadyRegistered:!1}}}var xk=h(()=>{"use strict";c(Pk,"ensureObsidianVault");c(rj,"resolveObsidianConfigPath");c(oj,"bootstrapObsidianDir");c(ij,"registerVaultInObsidianConfig")});import aj from"node:crypto";function lj(s){return s.normalize("NFD").replace(/[̀-ͯ]/g,"")}function vt(s){return lj(s).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,60)||"unnamed"}function Ak(s){return aj.createHash("sha256").update(s).digest("hex").slice(0,16)}function Gd(s,e=cj){if(s.length<=e)return[s];let t=[];for(let n=0;n<s.length;n+=e)t.push(s.slice(n,n+e));return t}function Bd(s,e){return`${s}::${e.trim().toLowerCase()}`}function Za(s){let e=(s.analyzedAt||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:"undated"}var cj,qo,Er=h(()=>{"use strict";cj=50,qo={pattern:"patterns","anti-pattern":"anti-patterns","tech-debt":"tech-debt","risk-area":"risk-areas",refactor:"refactors",insight:"insights"};c(lj,"deburr");c(vt,"slugify");c(Ak,"sha256");c(Gd,"chunkEntries");c(Bd,"conceptKey");c(Za,"analysisDateOnly")});function Vd(s){let e=new Map,t=[...s].reverse(),n=c((o,i,a,l)=>{if(!i||!i.trim())return;let u=Bd(o,i),d=Za(l),p=e.get(u);if(p){p.lastSeen=d,p.latestBody=a,p.seenIn.push({analysisId:l.id,date:d,commit:l.commitHash}),l.status==="active"&&(p.stillActive=!0);return}e.set(u,{kind:o,name:i.trim(),slug:vt(i).slice(0,60)||"unnamed",latestBody:a,firstSeen:d,lastSeen:d,seenIn:[{analysisId:l.id,date:d,commit:l.commitHash}],stillActive:l.status==="active"})},"touch");for(let o of t){let i=o.analysis;for(let a of i.patterns??[])n("pattern",a.name,a,o);for(let a of i.antiPatterns??[])n("anti-pattern",a.issue,a,o);for(let a of i.techDebt??[])n("tech-debt",a.description,a,o);for(let a of i.riskAreas??[])n("risk-area",a.path,a,o);for(let a of i.refactorSuggestions??[])n("refactor",a.description,a,o);for(let a of i.projectInsights??[])n("insight",a,{description:a},o)}let r=new Map;for(let o of e.values()){let i=qo[o.kind],a=r.get(i);a||(a=new Set,r.set(i,a));let l=o.slug,u=2;for(;a.has(l);)l=`${o.slug}-${u}`,u+=1;o.slug=l,a.add(l)}return e}function uj(s){let e=[],t=s.latestBody,n=[...new Set(s.seenIn.map(u=>u.date))];e.push("---"),e.push(`type: ${s.kind}`),e.push(`name: ${JSON.stringify(s.name)}`),e.push(`firstSeen: ${s.firstSeen}`),e.push(`lastSeen: ${s.lastSeen}`),e.push(`seenIn: ${s.seenIn.length}`),e.push(`stillActive: ${s.stillActive}`),e.push(`tags: [${s.kind}]`),e.push("---"),e.push(""),e.push(`# ${s.name}`),e.push("");let r=t.description||t.reason||t.issue;r&&r!==s.name&&(e.push(r),e.push(""));let o=[];t.severity&&o.push(`**Severity**: ${t.severity}`),t.priority&&o.push(`**Priority**: ${t.priority}`),t.effort&&o.push(`**Effort**: ${t.effort}`),t.impact&&o.push(`**Impact**: ${t.impact}`),t.benefit&&o.push(`**Benefit**: ${t.benefit}`),t.confidence!==void 0&&o.push(`**Confidence**: ${t.confidence}`),t.category&&o.push(`**Category**: ${t.category}`),t.area&&o.push(`**Area**: ${t.area}`),t.risk&&o.push(`**Risk**: ${t.risk}`),t.suggestion&&o.push(`**Suggestion**: ${t.suggestion}`),t.reasoning&&t.reasoning!==r&&o.push(`**Reasoning**: ${t.reasoning}`),o.length>0&&(e.push(...o.map(u=>`- ${u}`)),e.push(""));let i=t.files||[],a=t.locations||[],l=[...new Set([...i,...a])];if(l.length>0){e.push("## Where");for(let u of l)e.push(`- \`${u}\``);e.push("")}return e.push("## Seen in"),e.push(`First: ${s.firstSeen} \xB7 Last: ${s.lastSeen} \xB7 ${s.seenIn.length} analysis run${s.seenIn.length===1?"":"s"} (${n.length} distinct date${n.length===1?"":"s"})`),e.push(""),e.push("---"),e.push(""),e.push("See also: [analysis index](../index.md) \xB7 [change log](../history.md)"),e.push(""),`${e.join(`
863
+ Goal: ${a.content.goal}`,tags:{...t.tags??{},spec_id:a.id,status:a.status},source:a.id,provenance:"declared"}),a}async get(e,t){let n=await this.requireProjectId(e);return _e.get(n,t)}async list(e,t={}){let n=await this.requireProjectId(e);return _e.list(n,t)}async setStatus(e,t,n){let r=await this.requireProjectId(e),o=_e.setStatus(r,t,n);return o&&await J.remember(e,{type:"spec",content:`Spec status \u2192 ${n}: ${o.title}`,tags:{spec_id:t,status:n,event:"status_change"},source:t}),o}async update(e,t,n){let r=await this.requireProjectId(e);return _e.updateContent(r,t,n)}async recordReview(e,t,n,r){let o=await this.requireProjectId(e),i=3,a=50,l=0,u=!1,d=null;for(;l<i;){let p=_e.get(o,t);if(!p)return null;let m={...r,ts:R()},g={...p.content,reviews:{...p.content.reviews??{},[n]:m}};if(_e.casUpdate(o,t,g,p.updatedAt)){u=!0,d=_e.get(o,t);break}l++,l<i&&await new Promise(E=>setTimeout(E,a))}if(!u)throw new Error(`SPEC_RECORD_REVIEW_CONFLICT_RETRY_EXHAUSTED: ${i} retries failed for spec ${t}`);if(d&&this.allReviewsPass(d.content)&&d.status==="draft"){let p=_e.setStatus(o,t,"reviewed");if(p){let{breakdownSpecToTasks:m}=await Promise.resolve().then(()=>(Ud(),Hd));return await m(o,e,p),_e.get(o,t)}return p}return d}async linkTask(e,t,n){let r=await this.requireProjectId(e);return _e.linkTask(r,t,n)}async ship(e,t,n){let r=await this.requireProjectId(e);n!==void 0&&_e.setShippedPr(r,t,n);let o=await tj(e);return o&&_e.setShippedSha(r,t,o),_e.setStatus(r,t,"shipped")}unmetCriteria(e,t=new Set){return e.content.acceptance_criteria.filter(n=>!t.has(n))}allReviewsPass(e){let t=e.reviews;return t?t.strategic?.verdict==="pass"&&t.architecture?.verdict==="pass"&&t.design?.verdict==="pass":!1}async requireProjectId(e){let t=await I.readConfig(e);if(!t?.projectId)throw new Error("not a prjct project (run `prjct init` first)");return t.projectId}},$t=new Wd});import nj from"node:crypto";import Vo from"node:fs/promises";import sj from"node:os";import zt from"node:path";async function Pk(s){let e=await oj(s),t=zt.basename(s),n=`obsidian://open?vault=${encodeURIComponent(t)}`,r=rj();if(!r)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:n,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await ij(r,s);return{bootstrapped:e,registered:o,vaultName:t,openUrl:n,obsidianConfigFound:!0,alreadyRegistered:i}}function rj(){let s=sj.homedir(),e,t=process.env.PRJCT_OBSIDIAN_CONFIG_DIR?.trim();if(t)e=t;else switch(process.platform){case"darwin":e=zt.join(s,"Library","Application Support","obsidian");break;case"win32":e=zt.join(process.env.APPDATA||zt.join(s,"AppData","Roaming"),"obsidian");break;default:e=zt.join(process.env.XDG_CONFIG_HOME||zt.join(s,".config"),"obsidian");break}try{if(!qe("node:fs").existsSync(e))return null}catch{return null}return zt.join(e,"obsidian.json")}async function oj(s){let e=zt.join(s,".obsidian"),t=zt.join(e,"app.json");try{return await Vo.stat(t),!1}catch{}return await Vo.mkdir(e,{recursive:!0}),await Vo.writeFile(t,`${JSON.stringify({},null,2)}
864
+ `,"utf-8"),!0}async function ij(s,e){let t={};try{let a=await Vo.readFile(s,"utf-8");t=JSON.parse(a)}catch{}let n=t.vaults??{},r=zt.resolve(e);for(let a of Object.values(n))if(zt.resolve(a.path)===r)return{registered:!1,alreadyRegistered:!0};let o=nj.randomBytes(8).toString("hex");n[o]={path:r,ts:Date.now()};let i={...t,vaults:n};try{return await Vo.writeFile(s,JSON.stringify(i),"utf-8"),{registered:!0,alreadyRegistered:!1}}catch{return{registered:!1,alreadyRegistered:!1}}}var xk=h(()=>{"use strict";c(Pk,"ensureObsidianVault");c(rj,"resolveObsidianConfigPath");c(oj,"bootstrapObsidianDir");c(ij,"registerVaultInObsidianConfig")});import aj from"node:crypto";function lj(s){return s.normalize("NFD").replace(/[̀-ͯ]/g,"")}function vt(s){return lj(s).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,60)||"unnamed"}function Ak(s){return aj.createHash("sha256").update(s).digest("hex").slice(0,16)}function Bd(s,e=cj){if(s.length<=e)return[s];let t=[];for(let n=0;n<s.length;n+=e)t.push(s.slice(n,n+e));return t}function Vd(s,e){return`${s}::${e.trim().toLowerCase()}`}function ec(s){let e=(s.analyzedAt||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:"undated"}var cj,qo,Er=h(()=>{"use strict";cj=50,qo={pattern:"patterns","anti-pattern":"anti-patterns","tech-debt":"tech-debt","risk-area":"risk-areas",refactor:"refactors",insight:"insights"};c(lj,"deburr");c(vt,"slugify");c(Ak,"sha256");c(Bd,"chunkEntries");c(Vd,"conceptKey");c(ec,"analysisDateOnly")});function qd(s){let e=new Map,t=[...s].reverse(),n=c((o,i,a,l)=>{if(!i||!i.trim())return;let u=Vd(o,i),d=ec(l),p=e.get(u);if(p){p.lastSeen=d,p.latestBody=a,p.seenIn.push({analysisId:l.id,date:d,commit:l.commitHash}),l.status==="active"&&(p.stillActive=!0);return}e.set(u,{kind:o,name:i.trim(),slug:vt(i).slice(0,60)||"unnamed",latestBody:a,firstSeen:d,lastSeen:d,seenIn:[{analysisId:l.id,date:d,commit:l.commitHash}],stillActive:l.status==="active"})},"touch");for(let o of t){let i=o.analysis;for(let a of i.patterns??[])n("pattern",a.name,a,o);for(let a of i.antiPatterns??[])n("anti-pattern",a.issue,a,o);for(let a of i.techDebt??[])n("tech-debt",a.description,a,o);for(let a of i.riskAreas??[])n("risk-area",a.path,a,o);for(let a of i.refactorSuggestions??[])n("refactor",a.description,a,o);for(let a of i.projectInsights??[])n("insight",a,{description:a},o)}let r=new Map;for(let o of e.values()){let i=qo[o.kind],a=r.get(i);a||(a=new Set,r.set(i,a));let l=o.slug,u=2;for(;a.has(l);)l=`${o.slug}-${u}`,u+=1;o.slug=l,a.add(l)}return e}function uj(s){let e=[],t=s.latestBody,n=[...new Set(s.seenIn.map(u=>u.date))];e.push("---"),e.push(`type: ${s.kind}`),e.push(`name: ${JSON.stringify(s.name)}`),e.push(`firstSeen: ${s.firstSeen}`),e.push(`lastSeen: ${s.lastSeen}`),e.push(`seenIn: ${s.seenIn.length}`),e.push(`stillActive: ${s.stillActive}`),e.push(`tags: [${s.kind}]`),e.push("---"),e.push(""),e.push(`# ${s.name}`),e.push("");let r=t.description||t.reason||t.issue;r&&r!==s.name&&(e.push(r),e.push(""));let o=[];t.severity&&o.push(`**Severity**: ${t.severity}`),t.priority&&o.push(`**Priority**: ${t.priority}`),t.effort&&o.push(`**Effort**: ${t.effort}`),t.impact&&o.push(`**Impact**: ${t.impact}`),t.benefit&&o.push(`**Benefit**: ${t.benefit}`),t.confidence!==void 0&&o.push(`**Confidence**: ${t.confidence}`),t.category&&o.push(`**Category**: ${t.category}`),t.area&&o.push(`**Area**: ${t.area}`),t.risk&&o.push(`**Risk**: ${t.risk}`),t.suggestion&&o.push(`**Suggestion**: ${t.suggestion}`),t.reasoning&&t.reasoning!==r&&o.push(`**Reasoning**: ${t.reasoning}`),o.length>0&&(e.push(...o.map(u=>`- ${u}`)),e.push(""));let i=t.files||[],a=t.locations||[],l=[...new Set([...i,...a])];if(l.length>0){e.push("## Where");for(let u of l)e.push(`- \`${u}\``);e.push("")}return e.push("## Seen in"),e.push(`First: ${s.firstSeen} \xB7 Last: ${s.lastSeen} \xB7 ${s.seenIn.length} analysis run${s.seenIn.length===1?"":"s"} (${n.length} distinct date${n.length===1?"":"s"})`),e.push(""),e.push("---"),e.push(""),e.push("See also: [analysis index](../index.md) \xB7 [change log](../history.md)"),e.push(""),`${e.join(`
865
865
  `)}
866
866
  `}function dj(s,e){let t=["# Analysis evolution",""];if(t.push("One entry per analysis save where *something changed* (architecture, patterns, anti-patterns, tech debt, risks, refactors, or insights). Repeated saves with identical contents are collapsed."),t.push(""),t.push("See also: [analysis index](index.md) \xB7 [project wiki](../index.md)"),t.push(""),s.length===0)return t.push("> No analyses saved yet. Run `prjct sync` to generate one."),`${t.join(`
867
867
  `)}
868
- `;let n=c((u,d)=>{let p=e.get(Bd(u,d)),m=d.length>80?`${d.slice(0,77)}\u2026`:d;if(!p)return`"${m}"`;let g=qo[p.kind];return`[${m}](${g}/${p.slug}.md)`},"linkFor"),r=c(u=>{let d=u.analysis;return{arch:d.architecture?.style??"\u2014",patterns:new Set((d.patterns??[]).map(p=>p.name)),anti:new Set((d.antiPatterns??[]).map(p=>p.issue)),debt:new Set((d.techDebt??[]).map(p=>p.description)),risks:new Set((d.riskAreas??[]).map(p=>p.path)),refactors:new Set((d.refactorSuggestions??[]).map(p=>p.description)),insights:new Set(d.projectInsights??[])}},"rowFor"),o=c((u,d)=>{let p=[],m=[];for(let g of d)u.has(g)||p.push(g);for(let g of u)d.has(g)||m.push(g);return{added:p,removed:m}},"diffNames"),i=[...s].reverse(),a=null,l=[];for(let u of i){let d=r(u);if(a===null){l.push(`- **${Za(u)}** \u2014 baseline captured (arch: ${d.arch}, ${d.patterns.size} patterns, ${d.anti.size} anti, ${d.debt.size} debt, ${d.risks.size} risks, ${d.refactors.size} refactors, ${d.insights.size} insights).`),a=d;continue}let p=[];a.arch!==d.arch&&p.push(`arch ${a.arch} \u2192 ${d.arch}`);let m=[["pattern","patterns","pattern"],["anti-pattern","anti","anti-pattern"],["tech-debt","debt","tech-debt"],["risk","risks","risk-area"],["refactor","refactors","refactor"],["insight","insights","insight"]];for(let[g,k,E]of m){let y=o(a[k],d[k]);for(let w of y.added)p.push(`+${g} ${n(E,w)}`);for(let w of y.removed)p.push(`\u2212${g} ${n(E,w)}`)}p.length!==0&&(l.push(`- **${Za(u)}** \u2014 ${p.join("; ")}.`),a=d)}return l.length===0?t.push("> No changes recorded yet."):t.push(...l.reverse()),t.push(""),`${t.join(`
868
+ `;let n=c((u,d)=>{let p=e.get(Vd(u,d)),m=d.length>80?`${d.slice(0,77)}\u2026`:d;if(!p)return`"${m}"`;let g=qo[p.kind];return`[${m}](${g}/${p.slug}.md)`},"linkFor"),r=c(u=>{let d=u.analysis;return{arch:d.architecture?.style??"\u2014",patterns:new Set((d.patterns??[]).map(p=>p.name)),anti:new Set((d.antiPatterns??[]).map(p=>p.issue)),debt:new Set((d.techDebt??[]).map(p=>p.description)),risks:new Set((d.riskAreas??[]).map(p=>p.path)),refactors:new Set((d.refactorSuggestions??[]).map(p=>p.description)),insights:new Set(d.projectInsights??[])}},"rowFor"),o=c((u,d)=>{let p=[],m=[];for(let g of d)u.has(g)||p.push(g);for(let g of u)d.has(g)||m.push(g);return{added:p,removed:m}},"diffNames"),i=[...s].reverse(),a=null,l=[];for(let u of i){let d=r(u);if(a===null){l.push(`- **${ec(u)}** \u2014 baseline captured (arch: ${d.arch}, ${d.patterns.size} patterns, ${d.anti.size} anti, ${d.debt.size} debt, ${d.risks.size} risks, ${d.refactors.size} refactors, ${d.insights.size} insights).`),a=d;continue}let p=[];a.arch!==d.arch&&p.push(`arch ${a.arch} \u2192 ${d.arch}`);let m=[["pattern","patterns","pattern"],["anti-pattern","anti","anti-pattern"],["tech-debt","debt","tech-debt"],["risk","risks","risk-area"],["refactor","refactors","refactor"],["insight","insights","insight"]];for(let[g,k,E]of m){let y=o(a[k],d[k]);for(let w of y.added)p.push(`+${g} ${n(E,w)}`);for(let w of y.removed)p.push(`\u2212${g} ${n(E,w)}`)}p.length!==0&&(l.push(`- **${ec(u)}** \u2014 ${p.join("; ")}.`),a=d)}return l.length===0?t.push("> No changes recorded yet."):t.push(...l.reverse()),t.push(""),`${t.join(`
869
869
  `)}
870
870
  `}function pj(s){let e=new Map;for(let r of s.values()){let o=e.get(r.kind)??[];o.push(r),e.set(r.kind,o)}let t=["# Analysis",""];t.push("One file per concept from `prjct sync`. Files are deduped across history \u2014 the same pattern or risk always lands at the same path, updated with first/last-seen dates."),t.push(""),t.push("See also: [change log](history.md) \xB7 [project wiki](../index.md)"),t.push("");let n=["pattern","anti-pattern","tech-debt","risk-area","refactor","insight"];for(let r of n){let o=e.get(r);if(!o||o.length===0)continue;let i=qo[r],a=o.filter(u=>u.stillActive).length;t.push(`## ${i} (${a} active / ${o.length} total)`),t.push("");let l=[...o].sort((u,d)=>u.stillActive!==d.stillActive?u.stillActive?-1:1:u.lastSeen>d.lastSeen?-1:1);for(let u of l){let d=u.stillActive?"":" _(historical)_";t.push(`- [${u.name}](${i}/${u.slug}.md)${d}`)}t.push("")}return`${t.join(`
871
871
  `)}
872
- `}function jk(s){let e=new Map;if(s.length===0)return e;let t=Vd(s);for(let n of t.values()){let r=qo[n.kind];e.set(`analysis/${r}/${n.slug}.md`,uj(n))}return e.set("analysis/index.md",pj(t)),e.set("analysis/history.md",dj(s,t)),e}var $k=h(()=>{"use strict";Er();c(Vd,"collectConcepts");c(uj,"buildConceptFile");c(dj,"buildHistoryFile");c(pj,"buildAnalysisIndex");c(jk,"buildAnalysisArchiveFiles")});import mj from"node:fs/promises";import gj from"node:path";async function Ik(s,e){let t=null;try{t=j.get(e,`SELECT
872
+ `}function jk(s){let e=new Map;if(s.length===0)return e;let t=qd(s);for(let n of t.values()){let r=qo[n.kind];e.set(`analysis/${r}/${n.slug}.md`,uj(n))}return e.set("analysis/index.md",pj(t)),e.set("analysis/history.md",dj(s,t)),e}var $k=h(()=>{"use strict";Er();c(qd,"collectConcepts");c(uj,"buildConceptFile");c(dj,"buildHistoryFile");c(pj,"buildAnalysisIndex");c(jk,"buildAnalysisArchiveFiles")});import mj from"node:fs/promises";import gj from"node:path";async function Ik(s,e){let t=null;try{t=j.get(e,`SELECT
873
873
  (SELECT COALESCE(MAX(id), 0) FROM events) AS max_event_id,
874
874
  (SELECT COALESCE(MAX(id), 0) FROM llm_analysis) AS max_analysis_id,
875
875
  (SELECT COUNT(*) FROM shipped_features) AS ship_count,
876
876
  (SELECT MAX(shipped_at) FROM shipped_features) AS last_ship,
877
877
  (SELECT COUNT(*) FROM workflow_rules) AS workflow_count,
878
- (SELECT COALESCE(MAX(id), 0) FROM workflow_rules) AS max_workflow_id`)}catch{}let n=t?.max_event_id??0,r=t?.max_analysis_id??0,o=t?.ship_count??0,i=t?.last_ship??"",a=t?.workflow_count??0,l=t?.max_workflow_id??0,u=await mj.stat(gj.join(s,"CHANGELOG.md")).then(d=>Math.floor(d.mtimeMs)).catch(()=>0);return`v${fj}|e${n}|a${r}|s${o}|ls${i}|c${u}|w${a}/${l}`}var qd,fj,_k=h(()=>{"use strict";Y();qd=".regen-fingerprint",fj=2;c(Ik,"computeRegenFingerprint")});function Dk(s){let{ships:e,memoryTypeCounts:t,tagKeyCounts:n,patternsCount:r,antiPatternsCount:o,llmAnalysis:i}=s,a=["# Project context export (generated)","","Agent-readable snapshot of project memory. Regenerated on `prjct remember`, `prjct capture`,","`prjct ship`, `prjct sync`, and the SessionStart / Stop hooks.","Read directly with Read/Glob \u2014 no CLI round-trip needed.","","> \u26A0\uFE0F **Snapshot, not source.** SQLite is the source of truth. Edits to files under","> `_generated/` are silently overwritten on the next regen. To add memory, run",'> `prjct remember <type> "..."` or drop a markdown note in `../captured/` (parent directory)',"> with `type:` frontmatter \u2014 the Stop hook ingests it.",""];if(e.length>0){a.push("## Ships");for(let l of e)a.push(`- [${l.name}](ships/${vt(l.name)}.md) \u2014 ${l.shippedAt}`);a.push("")}if(s.releaseCount>0&&(a.push("## Releases"),a.push(`- [releases/index](releases/index.md) \u2014 ${s.releaseCount} versions parsed from \`CHANGELOG.md\``),a.push("")),s.workflowCount>0&&(a.push("## Workflows"),a.push(`- [workflows/index](workflows/index.md) \u2014 ${s.workflowCount} workflow definition(s)`),a.push("")),t.size>0){a.push("## Memory by type");for(let[l,u]of t)a.push(`- [${l}](memory/${l}.md) \u2014 ${u} entries`);a.push("")}if(n.size>0){a.push("## Memory by tag");for(let[l,u]of n)a.push(`- [${l}](tags/${vt(l)}.md) \u2014 ${u} entries`);a.push("")}return(r>0||o>0||i)&&(a.push("## Inferred"),(r>0||o>0)&&a.push(`- [patterns](patterns.md) \u2014 ${r} patterns, ${o} anti-patterns`),i&&((i.architecture?.style||i.architecture?.insights?.length||i.conventions?.length)&&a.push(`- [architecture](architecture.md) \u2014 ${i.architecture?.style??"\u2014"}, ${i.conventions?.length??0} conventions`),(i.techDebt?.length??0)+(i.riskAreas?.length??0)+(i.refactorSuggestions?.length??0)>0&&a.push(`- [tech-debt](tech-debt.md) \u2014 ${i.techDebt?.length??0} debt items, ${i.riskAreas?.length??0} risks, ${i.refactorSuggestions?.length??0} refactors`),i.projectInsights&&i.projectInsights.length>0&&a.push(`- [insights](insights.md) \u2014 ${i.projectInsights.length} project insights`)),s.archiveCount>0&&a.push(`- [analysis drill-down](analysis/index.md) \u2014 ${s.archiveCount} concepts (patterns, anti-patterns, tech-debt, risks, refactors, insights) + [history](analysis/history.md)`),a.push("")),e.length===0&&t.size===0&&r===0&&o===0&&a.push("> No ships, memory, or patterns yet. Run `prjct remember`, `prjct ship`, or `prjct sync`."),`${a.join(`
878
+ (SELECT COALESCE(MAX(id), 0) FROM workflow_rules) AS max_workflow_id`)}catch{}let n=t?.max_event_id??0,r=t?.max_analysis_id??0,o=t?.ship_count??0,i=t?.last_ship??"",a=t?.workflow_count??0,l=t?.max_workflow_id??0,u=await mj.stat(gj.join(s,"CHANGELOG.md")).then(d=>Math.floor(d.mtimeMs)).catch(()=>0);return`v${fj}|e${n}|a${r}|s${o}|ls${i}|c${u}|w${a}/${l}`}var Jd,fj,_k=h(()=>{"use strict";Y();Jd=".regen-fingerprint",fj=2;c(Ik,"computeRegenFingerprint")});function Dk(s){let{ships:e,memoryTypeCounts:t,tagKeyCounts:n,patternsCount:r,antiPatternsCount:o,llmAnalysis:i}=s,a=["# Project context export (generated)","","Agent-readable snapshot of project memory. Regenerated on `prjct remember`, `prjct capture`,","`prjct ship`, `prjct sync`, and the SessionStart / Stop hooks.","Read directly with Read/Glob \u2014 no CLI round-trip needed.","","> \u26A0\uFE0F **Snapshot, not source.** SQLite is the source of truth. Edits to files under","> `_generated/` are silently overwritten on the next regen. To add memory, run",'> `prjct remember <type> "..."` or drop a markdown note in `../captured/` (parent directory)',"> with `type:` frontmatter \u2014 the Stop hook ingests it.",""];if(e.length>0){a.push("## Ships");for(let l of e)a.push(`- [${l.name}](ships/${vt(l.name)}.md) \u2014 ${l.shippedAt}`);a.push("")}if(s.releaseCount>0&&(a.push("## Releases"),a.push(`- [releases/index](releases/index.md) \u2014 ${s.releaseCount} versions parsed from \`CHANGELOG.md\``),a.push("")),s.workflowCount>0&&(a.push("## Workflows"),a.push(`- [workflows/index](workflows/index.md) \u2014 ${s.workflowCount} workflow definition(s)`),a.push("")),t.size>0){a.push("## Memory by type");for(let[l,u]of t)a.push(`- [${l}](memory/${l}.md) \u2014 ${u} entries`);a.push("")}if(n.size>0){a.push("## Memory by tag");for(let[l,u]of n)a.push(`- [${l}](tags/${vt(l)}.md) \u2014 ${u} entries`);a.push("")}return(r>0||o>0||i)&&(a.push("## Inferred"),(r>0||o>0)&&a.push(`- [patterns](patterns.md) \u2014 ${r} patterns, ${o} anti-patterns`),i&&((i.architecture?.style||i.architecture?.insights?.length||i.conventions?.length)&&a.push(`- [architecture](architecture.md) \u2014 ${i.architecture?.style??"\u2014"}, ${i.conventions?.length??0} conventions`),(i.techDebt?.length??0)+(i.riskAreas?.length??0)+(i.refactorSuggestions?.length??0)>0&&a.push(`- [tech-debt](tech-debt.md) \u2014 ${i.techDebt?.length??0} debt items, ${i.riskAreas?.length??0} risks, ${i.refactorSuggestions?.length??0} refactors`),i.projectInsights&&i.projectInsights.length>0&&a.push(`- [insights](insights.md) \u2014 ${i.projectInsights.length} project insights`)),s.archiveCount>0&&a.push(`- [analysis drill-down](analysis/index.md) \u2014 ${s.archiveCount} concepts (patterns, anti-patterns, tech-debt, risks, refactors, insights) + [history](analysis/history.md)`),a.push("")),e.length===0&&t.size===0&&r===0&&o===0&&a.push("> No ships, memory, or patterns yet. Run `prjct remember`, `prjct ship`, or `prjct sync`."),`${a.join(`
879
879
  `)}
880
880
  `}var Mk=h(()=>{"use strict";Er();c(Dk,"buildIndexFile")});function Ok(s,e){if(s.length===0&&e.length===0)return null;let t=["# Patterns (inferred)",""];if(s.length>0){t.push("## Patterns");for(let n of s){let r=n.locations&&n.locations.length>0?` \u2014 ${n.locations.slice(0,3).join(", ")}`:"",o=n.category?` _[${n.category}]_`:"";t.push(`- **${n.name}**${o}: ${n.description}${r}`)}t.push("")}if(e.length>0){t.push("## Anti-patterns");for(let n of e){let r=n.files&&n.files.length>0?` (${n.files[0]})`:"",o=n.severity?` _[${n.severity}]_`:"";t.push(`- **${n.issue}**${o}${r} \u2014 ${n.suggestion}`),n.reasoning&&t.push(` - Why: ${n.reasoning}`)}t.push("")}return t.push("> Source: `prjct sync` analysis. Provenance: INFR."),`${t.join(`
881
881
  `)}
@@ -885,22 +885,22 @@ Goal: ${a.content.goal}`,tags:{...t.tags??{},spec_id:a.id,status:a.status},sourc
885
885
  `)}
886
886
  `}function Fk(s){if(!s.projectInsights||s.projectInsights.length===0)return null;let e=["# Project insights",""];for(let t of s.projectInsights)e.push(`- ${t}`);return e.push("","> Source: `prjct sync` LLM analysis."),`${e.join(`
887
887
  `)}
888
- `}var Hk=h(()=>{"use strict";c(Ok,"buildPatternsFile");c(Nk,"buildArchitectureFile");c(Lk,"buildTechDebtFile");c(Fk,"buildInsightsFile")});import rs from"node:fs/promises";import Cr from"node:path";async function Xd(s){try{let e=await rs.readFile(Cr.join(s,Jd),"utf-8"),t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}async function Jo(s,e,t){let n=Cr.join(s,e);await rs.mkdir(Cr.dirname(n),{recursive:!0}),await rs.writeFile(n,t,"utf-8")}async function Uk(s,e){try{await rs.rm(Cr.join(s,e),{force:!0})}catch{}}async function Wk(s,e){let t=0,n=c(async r=>{let o;try{o=await rs.readdir(r,{withFileTypes:!0})}catch{return}for(let i of o){let a=Cr.join(r,i.name);if(i.isDirectory()){await n(a);try{(await rs.readdir(a)).length===0&&await rs.rmdir(a)}catch{}continue}if(!i.name.endsWith(".md"))continue;let l=Cr.relative(s,a);if(!e[l])try{await rs.rm(a,{force:!0}),t++}catch{}}},"walk");return await n(s),t}var Jd,Gk=h(()=>{"use strict";Jd=".manifest.json";c(Xd,"readManifest");c(Jo,"writeFile");c(Uk,"removeFile");c(Wk,"sweepStaleFiles")});function Kd(s){let e=new Map,t=new Map,n=new Map,r=new Set;for(let o of s){e.set(o.id,o.type);let i=Da(o);if(t.set(o.id,i),ec.has(o.type)){let a=vt(i);r.has(a)&&(a=`${a}-${zd(o.id)}`.slice(0,80)),r.add(a),n.set(o.id,a)}}return{idTypeIndex:e,idTitleIndex:t,idSlugIndex:n}}function Yd(s,e,t){return{vault:!0,idTypeIndex:s,idTitleIndex:e,idSlugIndex:t,perEntryTypes:ec}}function Vk(s){let{idTypeIndex:e,idTitleIndex:t,idSlugIndex:n}=Kd(s);return Yd(e,t,n)}function qk(s){let e=[];return e.push(`# ${s.name}`),e.push(""),e.push(`- Shipped: ${s.shippedAt}`),e.push(`- Version: ${s.version}`),s.type&&e.push(`- Type: ${s.type}`),s.duration&&e.push(`- Duration: ${s.duration}`),e.push(""),s.description&&(e.push("## Description"),e.push(""),e.push(s.description)),`${e.join(`
888
+ `}var Hk=h(()=>{"use strict";c(Ok,"buildPatternsFile");c(Nk,"buildArchitectureFile");c(Lk,"buildTechDebtFile");c(Fk,"buildInsightsFile")});import rs from"node:fs/promises";import Cr from"node:path";async function zd(s){try{let e=await rs.readFile(Cr.join(s,Xd),"utf-8"),t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}async function Jo(s,e,t){let n=Cr.join(s,e);await rs.mkdir(Cr.dirname(n),{recursive:!0}),await rs.writeFile(n,t,"utf-8")}async function Uk(s,e){try{await rs.rm(Cr.join(s,e),{force:!0})}catch{}}async function Wk(s,e){let t=0,n=c(async r=>{let o;try{o=await rs.readdir(r,{withFileTypes:!0})}catch{return}for(let i of o){let a=Cr.join(r,i.name);if(i.isDirectory()){await n(a);try{(await rs.readdir(a)).length===0&&await rs.rmdir(a)}catch{}continue}if(!i.name.endsWith(".md"))continue;let l=Cr.relative(s,a);if(!e[l])try{await rs.rm(a,{force:!0}),t++}catch{}}},"walk");return await n(s),t}var Xd,Gk=h(()=>{"use strict";Xd=".manifest.json";c(zd,"readManifest");c(Jo,"writeFile");c(Uk,"removeFile");c(Wk,"sweepStaleFiles")});function Yd(s){let e=new Map,t=new Map,n=new Map,r=new Set;for(let o of s){e.set(o.id,o.type);let i=Ma(o);if(t.set(o.id,i),tc.has(o.type)){let a=vt(i);r.has(a)&&(a=`${a}-${Kd(o.id)}`.slice(0,80)),r.add(a),n.set(o.id,a)}}return{idTypeIndex:e,idTitleIndex:t,idSlugIndex:n}}function Qd(s,e,t){return{vault:!0,idTypeIndex:s,idTitleIndex:e,idSlugIndex:t,perEntryTypes:tc}}function Vk(s){let{idTypeIndex:e,idTitleIndex:t,idSlugIndex:n}=Yd(s);return Qd(e,t,n)}function qk(s){let e=[];return e.push(`# ${s.name}`),e.push(""),e.push(`- Shipped: ${s.shippedAt}`),e.push(`- Version: ${s.version}`),s.type&&e.push(`- Type: ${s.type}`),s.duration&&e.push(`- Duration: ${s.duration}`),e.push(""),s.description&&(e.push("## Description"),e.push(""),e.push(s.description)),`${e.join(`
889
889
  `)}
890
- `}function zd(s){return s.replace(/^mem[_-]/,"")}function hj(s){let e=(s||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:""}function yj(s){let e=Object.entries(s);return e.length===0?"":`tags: { ${e.map(([n,r])=>`${n}: ${JSON.stringify(String(r))}`).join(", ")} }`}function wj(s,e){let t=[];for(let[n,r]of Object.entries(s.tags))if(Bk.has(n))for(let o of String(r).split(/[\s,]+/).filter(Boolean))/^mem[_-]\d+$/i.test(o)?t.push(`- ${n} ${Yn(o.replace("-","_"),e)}`):t.push(`- ${n} \`${o}\``);return t.length===0?[]:["","## Relations",...t]}function kj(s,e){let t=new Map,n=new Map;for(let r of s){if(!ec.has(r.type))continue;let o=Da(r),i=e.idSlugIndex?.get(r.id)??`${vt(o)}-${zd(r.id)}`.slice(0,80),a=hj(r.rememberedAt),l=["---",`aliases: [${JSON.stringify(r.id)}]`,`type: ${r.type}`];l.push(`provenance: ${r.provenance}`),a&&l.push(`created: ${a}`);let u=yj(r.tags);u&&l.push(u),l.push("---");let d=[l.join(`
891
- `),"",`# ${r.type}: ${o}`,"",`> \`${r.id}\` ^mem-${zd(r.id)}`,"",Yn(r.content,e).trim()];d.push(...wj(r,e)),t.set(`memory/${r.type}/${i}.md`,`${d.join(`
890
+ `}function Kd(s){return s.replace(/^mem[_-]/,"")}function hj(s){let e=(s||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:""}function yj(s){let e=Object.entries(s);return e.length===0?"":`tags: { ${e.map(([n,r])=>`${n}: ${JSON.stringify(String(r))}`).join(", ")} }`}function wj(s,e){let t=[];for(let[n,r]of Object.entries(s.tags))if(Bk.has(n))for(let o of String(r).split(/[\s,]+/).filter(Boolean))/^mem[_-]\d+$/i.test(o)?t.push(`- ${n} ${Yn(o.replace("-","_"),e)}`):t.push(`- ${n} \`${o}\``);return t.length===0?[]:["","## Relations",...t]}function kj(s,e){let t=new Map,n=new Map;for(let r of s){if(!tc.has(r.type))continue;let o=Ma(r),i=e.idSlugIndex?.get(r.id)??`${vt(o)}-${Kd(r.id)}`.slice(0,80),a=hj(r.rememberedAt),l=["---",`aliases: [${JSON.stringify(r.id)}]`,`type: ${r.type}`];l.push(`provenance: ${r.provenance}`),a&&l.push(`created: ${a}`);let u=yj(r.tags);u&&l.push(u),l.push("---");let d=[l.join(`
891
+ `),"",`# ${r.type}: ${o}`,"",`> \`${r.id}\` ^mem-${Kd(r.id)}`,"",Yn(r.content,e).trim()];d.push(...wj(r,e)),t.set(`memory/${r.type}/${i}.md`,`${d.join(`
892
892
  `)}
893
- `);let p=n.get(r.type)??[];p.push({id:r.id,title:o,slug:i}),n.set(r.type,p)}return{files:t,titleByType:n}}function vj(s){let e=new Map;for(let t of s)for(let[n,r]of Object.entries(t.tags)){if(Bk.has(n))continue;let o=e.get(n);o||(o=new Map,e.set(n,o));let i=o.get(r)??[];i.push(t),o.set(r,i)}return e}function Jk(s,e=s){let t=new Map,{idTypeIndex:n,idTitleIndex:r,idSlugIndex:o}=Kd(e),i=Yd(n,r,o),a=new Map;for(let d of s){let p=a.get(d.type)??[];p.push(d),a.set(d.type,p)}let{files:l,titleByType:u}=kj(s,i);for(let[d,p]of l)t.set(d,p);for(let[d,p]of a){if(ec.has(d)){let k=u.get(d)??[],E=[`# ${d.toUpperCase()}`,"",`_${k.length} ${k.length===1?"entry":"entries"} \u2014 newest first._`,"",...k.map(({slug:y,title:w})=>`- [[${y}|${w.replace(/[[\]|]/g,"")}]]`),""];t.set(`memory/${d}.md`,`${E.join(`
893
+ `);let p=n.get(r.type)??[];p.push({id:r.id,title:o,slug:i}),n.set(r.type,p)}return{files:t,titleByType:n}}function vj(s){let e=new Map;for(let t of s)for(let[n,r]of Object.entries(t.tags)){if(Bk.has(n))continue;let o=e.get(n);o||(o=new Map,e.set(n,o));let i=o.get(r)??[];i.push(t),o.set(r,i)}return e}function Jk(s,e=s){let t=new Map,{idTypeIndex:n,idTitleIndex:r,idSlugIndex:o}=Yd(e),i=Qd(n,r,o),a=new Map;for(let d of s){let p=a.get(d.type)??[];p.push(d),a.set(d.type,p)}let{files:l,titleByType:u}=kj(s,i);for(let[d,p]of l)t.set(d,p);for(let[d,p]of a){if(tc.has(d)){let k=u.get(d)??[],E=[`# ${d.toUpperCase()}`,"",`_${k.length} ${k.length===1?"entry":"entries"} \u2014 newest first._`,"",...k.map(({slug:y,title:w})=>`- [[${y}|${w.replace(/[[\]|]/g,"")}]]`),""];t.set(`memory/${d}.md`,`${E.join(`
894
894
  `)}
895
- `);continue}let m=Gd(p);if(m.length===1){let k=[`# ${d.toUpperCase()}`,"",xt(p,i),""].join(`
895
+ `);continue}let m=Bd(p);if(m.length===1){let k=[`# ${d.toUpperCase()}`,"",xt(p,i),""].join(`
896
896
  `);t.set(`memory/${d}.md`,k);continue}let g=[`# ${d.toUpperCase()}`,"",`_${p.length} entries across ${m.length} chunks._`,""];for(let k=0;k<m.length;k++){let E=`${d}/chunk-${k+1}.md`,y=[`# ${d.toUpperCase()} \u2014 chunk ${k+1}/${m.length}`,"",xt(m[k],i),""].join(`
897
897
  `);t.set(`memory/${E}`,y),g.push(`- [chunk ${k+1}](${E}) \u2014 ${m[k].length} entries`)}t.set(`memory/${d}.md`,`${g.join(`
898
898
  `)}
899
- `)}return t}function Xk(s,e=s){let t=new Map,{idTypeIndex:n,idTitleIndex:r,idSlugIndex:o}=Kd(e),i=Yd(n,r,o),a=vj(s);for(let[l,u]of a){let d=vt(l),p=[`# Tag: ${l}`,""],m=[...u.entries()].sort((g,k)=>g[0].localeCompare(k[0]));for(let[g,k]of m){let E=vt(g),y=Gd(k);if(y.length===1){let w=[`# ${l}: ${g}`,"",xt(k,i),""].join(`
899
+ `)}return t}function Xk(s,e=s){let t=new Map,{idTypeIndex:n,idTitleIndex:r,idSlugIndex:o}=Yd(e),i=Qd(n,r,o),a=vj(s);for(let[l,u]of a){let d=vt(l),p=[`# Tag: ${l}`,""],m=[...u.entries()].sort((g,k)=>g[0].localeCompare(k[0]));for(let[g,k]of m){let E=vt(g),y=Bd(k);if(y.length===1){let w=[`# ${l}: ${g}`,"",xt(k,i),""].join(`
900
900
  `);t.set(`tags/${d}/${E}.md`,w),p.push(`- [${g}](${d}/${E}.md) \u2014 ${k.length} entries`)}else{for(let w=0;w<y.length;w++){let v=[`# ${l}: ${g} \u2014 chunk ${w+1}/${y.length}`,"",xt(y[w],i),""].join(`
901
901
  `);t.set(`tags/${d}/${E}-${w+1}.md`,v)}p.push(`- **${g}** \u2014 ${k.length} entries across ${y.length} chunks`);for(let w=0;w<y.length;w++)p.push(` - [chunk ${w+1}](${d}/${E}-${w+1}.md)`)}}p.push(""),t.set(`tags/${d}.md`,`${p.join(`
902
902
  `)}
903
- `)}return t}var ec,Bk,zk=h(()=>{"use strict";$e();Er();ec=new Set(["decision","learning","gotcha","pattern","anti-pattern","fact","insight","spec","feedback","improvement-idea","improvement-signal","question","source","person"]),Bk=new Set(["relates","resolves","closes","supersedes","duplicates","blocks","depends"]);c(Kd,"buildIndexMaps");c(Yd,"vaultOpts");c(Vk,"buildVaultOpts");c(qk,"formatShipBody");c(zd,"rowId");c(hj,"dateOnly");c(yj,"frontmatterTags");c(wj,"relationsSection");c(kj,"buildMemoryEntryNotes");c(vj,"groupByTagPair");c(Jk,"buildMemoryFiles");c(Xk,"buildTagFiles")});import bj from"node:fs/promises";import Sj from"node:path";function Tj(s){let e=[],t=/^## \[([^\]]+)\]\s*-\s*(\d{4}-\d{2}-\d{2})\s*$/,n=s.split(`
903
+ `)}return t}var tc,Bk,zk=h(()=>{"use strict";$e();Er();tc=new Set(["decision","learning","gotcha","pattern","anti-pattern","fact","insight","spec","feedback","improvement-idea","improvement-signal","question","source","person"]),Bk=new Set(["relates","resolves","closes","supersedes","duplicates","blocks","depends"]);c(Yd,"buildIndexMaps");c(Qd,"vaultOpts");c(Vk,"buildVaultOpts");c(qk,"formatShipBody");c(Kd,"rowId");c(hj,"dateOnly");c(yj,"frontmatterTags");c(wj,"relationsSection");c(kj,"buildMemoryEntryNotes");c(vj,"groupByTagPair");c(Jk,"buildMemoryFiles");c(Xk,"buildTagFiles")});import bj from"node:fs/promises";import Sj from"node:path";function Tj(s){let e=[],t=/^## \[([^\]]+)\]\s*-\s*(\d{4}-\d{2}-\d{2})\s*$/,n=s.split(`
904
904
  `),r=null,o=[],i=c(()=>{r&&(e.push({version:r.version,date:r.date,body:o.join(`
905
905
  `).trim()}),o=[])},"flush");for(let a of n){let l=a.match(t);if(l){i(),r={version:l[1],date:l[2]};continue}r&&o.push(a)}return i(),e}function Ej(s){return`v${s.replace(/[^a-zA-Z0-9._-]+/g,"-")}`}function Cj(s,e,t){let n=[];n.push("---"),n.push("type: release"),n.push(`version: ${s.version}`),n.push(`date: ${s.date}`),n.push("tags: [release]"),n.push("---"),n.push(""),n.push(`# v${s.version} \u2014 ${s.date}`),n.push("");let r=[];return e&&r.push(`\u2190 [v${e.entry.version}](${e.slug}.md)`),r.push("[releases index](index.md)"),t&&r.push(`[v${t.entry.version}](${t.slug}.md) \u2192`),n.push(r.join(" \xB7 ")),n.push(""),s.body?(n.push(s.body),n.push("")):(n.push("_No changelog body._"),n.push("")),n.push("---"),n.push(""),n.push("[project wiki](../index.md) \xB7 [releases index](index.md)"),n.push(""),`${n.join(`
906
906
  `)}
@@ -914,16 +914,16 @@ Goal: ${a.content.goal}`,tags:{...t.tags??{},spec_id:a.id,status:a.status},sourc
914
914
  `)}
915
915
  `)}let n=["# Workflows",""];n.push("Workflow definitions stored in SQLite, rendered as Markdown for inspection. To edit, see the per-workflow page."),n.push("");for(let[r,o]of t){let i=o.filter(a=>a.enabled).length;n.push(`- [${r}](${r}.md) \u2014 ${i} active rule(s)`)}return e.set("workflows/index.md",`${n.join(`
916
916
  `)}
917
- `),{files:e,commandCount:t.size}}var tv=h(()=>{"use strict";c(ev,"buildWorkflowFiles")});function Rr(s){let e=[];for(let{name:t,re:n}of nv)n.test(s)&&e.push(t);return e}var nv,w2,tc=h(()=>{"use strict";nv=[{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/}],w2=nv.map(s=>s.name);c(Rr,"scanForSecrets")});import Kt from"node:fs/promises";import Pr from"node:path";async function Xo(s){await Aj(s);let e=await I.readConfig(s).catch(()=>null);return await _.getWikiPath(s,e?.vaultPath)}async function Aj(s){let e=await I.readConfig(s).catch(()=>null);if(e?.vaultPath&&e.vaultPath.trim().length>0)return{moved:!1,reason:"user-override"};let t=_.getLegacyWikiPath(s);if(!await rv(t))return{moved:!1,reason:"no-legacy"};let r=await _.getWikiPath(s);if(await rv(r))return console.error(`\u26A0 prjct: legacy wiki at ${t} was NOT migrated \u2014 ${r} already has content.
917
+ `),{files:e,commandCount:t.size}}var tv=h(()=>{"use strict";c(ev,"buildWorkflowFiles")});function Rr(s){let e=[];for(let{name:t,re:n}of nv)n.test(s)&&e.push(t);return e}var nv,vJ,nc=h(()=>{"use strict";nv=[{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/}],vJ=nv.map(s=>s.name);c(Rr,"scanForSecrets")});import Kt from"node:fs/promises";import Pr from"node:path";async function Xo(s){await Aj(s);let e=await I.readConfig(s).catch(()=>null);return await _.getWikiPath(s,e?.vaultPath)}async function Aj(s){let e=await I.readConfig(s).catch(()=>null);if(e?.vaultPath&&e.vaultPath.trim().length>0)return{moved:!1,reason:"user-override"};let t=_.getLegacyWikiPath(s);if(!await rv(t))return{moved:!1,reason:"no-legacy"};let r=await _.getWikiPath(s);if(await rv(r))return console.error(`\u26A0 prjct: legacy wiki at ${t} was NOT migrated \u2014 ${r} already has content.
918
918
  Merge manually or set \`vaultPath\` in .prjct/prjct.config.json to choose one.`),{moved:!1,reason:"conflict",from:t,to:r};await Kt.mkdir(Pr.dirname(r),{recursive:!0});let i=await jj(t,r);return await $j(s),console.error(`\u2139 prjct: migrated Obsidian vault
919
919
  from: ${_.getDisplayPath(t)}
920
920
  to: ${_.getDisplayPath(r)}
921
- (set \`vaultPath\` in .prjct/prjct.config.json to override)`),{moved:!0,reason:"moved",from:t,to:r,filesMoved:i}}async function rv(s){try{return(await Kt.readdir(s)).filter(n=>n!==".DS_Store"&&n!==".gitkeep").length>0}catch{return!1}}async function jj(s,e){try{return await Kt.rename(s,e),await Qd(e)}catch(t){if(t.code!=="EXDEV")throw t;await ov(s,e);let r=await Qd(e);return await Kt.rm(s,{recursive:!0,force:!0}),r}}async function ov(s,e){await Kt.mkdir(e,{recursive:!0});let t=await Kt.readdir(s,{withFileTypes:!0});for(let n of t){let r=Pr.join(s,n.name),o=Pr.join(e,n.name);n.isDirectory()?await ov(r,o):n.isFile()&&await Kt.copyFile(r,o)}}async function Qd(s){let e=0,t=await Kt.readdir(s,{withFileTypes:!0});for(let n of t){let r=Pr.join(s,n.name);n.isDirectory()?e+=await Qd(r):n.isFile()&&e++}return e}async function $j(s){let e=Pr.join(s,".gitignore"),t="";try{t=await Kt.readFile(e,"utf-8")}catch{if(!await Ij(Pr.join(s,".git")))return}if(t.includes(sv))return;let n=`
921
+ (set \`vaultPath\` in .prjct/prjct.config.json to override)`),{moved:!0,reason:"moved",from:t,to:r,filesMoved:i}}async function rv(s){try{return(await Kt.readdir(s)).filter(n=>n!==".DS_Store"&&n!==".gitkeep").length>0}catch{return!1}}async function jj(s,e){try{return await Kt.rename(s,e),await Zd(e)}catch(t){if(t.code!=="EXDEV")throw t;await ov(s,e);let r=await Zd(e);return await Kt.rm(s,{recursive:!0,force:!0}),r}}async function ov(s,e){await Kt.mkdir(e,{recursive:!0});let t=await Kt.readdir(s,{withFileTypes:!0});for(let n of t){let r=Pr.join(s,n.name),o=Pr.join(e,n.name);n.isDirectory()?await ov(r,o):n.isFile()&&await Kt.copyFile(r,o)}}async function Zd(s){let e=0,t=await Kt.readdir(s,{withFileTypes:!0});for(let n of t){let r=Pr.join(s,n.name);n.isDirectory()?e+=await Zd(r):n.isFile()&&e++}return e}async function $j(s){let e=Pr.join(s,".gitignore"),t="";try{t=await Kt.readFile(e,"utf-8")}catch{if(!await Ij(Pr.join(s,".git")))return}if(t.includes(sv))return;let n=`
922
922
  ${xj}
923
923
  ${sv}
924
924
  `,r=t.endsWith(`
925
- `)||t.length===0?t+n:`${t}${n}`;await Kt.writeFile(e,r,"utf-8")}async function Ij(s){try{return await Kt.stat(s),!0}catch{return!1}}var xj,sv,Zd=h(()=>{"use strict";re();ge();xj="# prjct: legacy wiki \u2014 vault moved to ~/Documents/prjct/ in 2.2.0",sv=".prjct/wiki/";c(Xo,"resolveVaultRoot");c(Aj,"migrateWikiLocationIfNeeded");c(rv,"dirHasContent");c(jj,"moveDirectory");c(ov,"copyRecursive");c(Qd,"countFiles");c($j,"ensureLegacyGitignore");c(Ij,"fileExists")});var uv={};D(uv,{ensureCapturedReadme:()=>sp,ensureWorkflowsReadme:()=>op,ingestCapturedNotes:()=>np,ingestWorkflowEdits:()=>rp});import It from"node:fs/promises";import Yt from"node:path";async function iv(s){return Yt.join(await Xo(s),_j)}async function av(s){return Yt.join(await Xo(s),Dj)}async function np(s,e={}){let t=await iv(s),n={ingested:0,skipped:[],errors:[]},r=await Oj(t);if(r.length===0)return n;let o=Yt.join(t,tp,lv());for(let i of r){let a=Yt.basename(i);try{let l=await It.readFile(i,"utf-8"),u=Nj(l);if(!u.ok){n.skipped.push({file:a,reason:u.error});continue}let d=Rr(u.note.content);if(d.length>0&&!e.force){n.skipped.push({file:a,reason:`secret-like content (${d.join(", ")}). Remove or re-run with --force.`});continue}await J.remember(s,{type:u.note.type,content:u.note.content,tags:u.note.tags}),await cv(i,o,a),n.ingested++}catch(l){n.errors.push({file:a,error:l instanceof Error?l.message:String(l)})}}return n}async function sp(s){let e=await iv(s);await It.mkdir(e,{recursive:!0});let t=Yt.join(e,nc);await It.stat(t).then(()=>!0,()=>!1)||await It.writeFile(t,Mj,"utf-8")}async function Oj(s){let e;try{e=await It.readdir(s)}catch{return[]}let t=[];for(let n of e)n.startsWith(".")||n!==tp&&n!==nc&&n.toLowerCase().endsWith(".md")&&t.push(Yt.join(s,n));return t}async function cv(s,e,t){await It.mkdir(e,{recursive:!0});let n=Yt.join(e,t);await It.rename(s,n)}function lv(){let s=new Date,e=c(t=>String(t).padStart(2,"0"),"pad");return`${s.getUTCFullYear()}${e(s.getUTCMonth()+1)}${e(s.getUTCDate())}-${e(s.getUTCHours())}${e(s.getUTCMinutes())}${e(s.getUTCSeconds())}`}function Nj(s){let e=s.match(/^---\s*\r?\n([\s\S]*?)\r?\n---\s*\r?\n?([\s\S]*)$/);if(!e)return{ok:!1,error:"no frontmatter (expected leading `---` block)"};let[,t,n]=e,{type:r,tags:o,error:i}=Lj(t);if(i)return{ok:!1,error:i};if(!r)return{ok:!1,error:"missing `type` in frontmatter"};if(!/^[a-z][a-z0-9-]*$/.test(r))return{ok:!1,error:`invalid type '${r}'. Lowercase letters + dashes only. Base types: ${xs.join(", ")}`};let a=n.trim();return a?{ok:!0,note:{type:r,tags:o,content:a}}:{ok:!1,error:"body is empty"}}function Lj(s){let e=s.split(/\r?\n/),t,n={},r=!1;for(let o of e){if(o.trim()==="")continue;if(r&&/^\s+/.test(o)){let u=o.trim(),d=u.indexOf(":");if(d>0){let p=u.slice(0,d).trim(),m=ep(u.slice(d+1).trim());p&&(n[p]=m)}continue}r=!1;let i=o.indexOf(":");if(i<=0)continue;let a=o.slice(0,i).trim(),l=ep(o.slice(i+1).trim());if(a==="type")t=l.toLowerCase();else if(a==="tags")if(l)for(let u of l.split(",")){let d=u.trim(),p=d.indexOf("="),m=d.indexOf(":"),g=p>0?p:m;g<=0||(n[d.slice(0,g).trim()]=d.slice(g+1).trim())}else r=!0}return{type:t,tags:n}}function ep(s){return s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'")?s.slice(1,-1):s}async function rp(s){let e={ingested:[],skipped:[],errors:[]},t=await I.readConfig(s).catch(()=>null);if(!t?.projectId)return e;let n=t.projectId,r=await av(s),o=await Uj(r);if(o.length===0)return e;let i=Yt.join(r,tp,lv());for(let a of o){let l=Yt.basename(a);try{let u=await It.readFile(a,"utf-8"),d=Hj(u);if(!d.ok){e.skipped.push({file:l,reason:d.error});continue}let p=d.workflow,m=ee.getRulesForCommand(n,p.command);for(let g of m)ee.removeRule(n,g.id);for(let g of p.rules)ee.addRule(n,{type:g.type,command:p.command,position:g.position,action:g.action,description:g.description,enabled:!0,timeoutMs:6e4,sortOrder:g.sortOrder,createdAt:new Date().toISOString(),trustSource:"imported"});await cv(a,i,l),e.ingested.push({command:p.command,rulesReplaced:p.rules.length})}catch(u){e.errors.push({file:l,error:u instanceof Error?u.message:String(u)})}}return e}async function op(s){let e=await av(s);await It.mkdir(e,{recursive:!0});let t=Yt.join(e,nc);await It.stat(t).then(()=>!0,()=>!1)||await It.writeFile(t,Fj,"utf-8")}function Hj(s){let e=s.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);if(!e)return{ok:!1,error:"missing frontmatter (---name: foo---)"};let t=e[1],n=e[2],r=t.match(/^\s*name\s*:\s*(\S+)/m);if(!r)return{ok:!1,error:"frontmatter missing 'name' field"};let o=ep(r[1].trim()),i=[],a={gates:{type:"gate",position:"before"},steps:{type:"step",position:"before"},hooks:{type:"hook",position:"before"},instructions:{type:"instruction",position:"before"}},l=/^##\s+(\w+)/gm,u=[...n.matchAll(l)];for(let d=0;d<u.length;d++){let p=u[d],m=p[1].toLowerCase(),g=a[m];if(!g)continue;let k=p.index+p[0].length,E=d+1<u.length?u[d+1].index:n.length,y=n.slice(k,E),w=0;for(let v of y.split(`
926
- `)){let S=v.trim();if(!S.startsWith("-"))continue;let P=S.replace(/^-\s*/,""),T=P.match(/^`([^`]+)`(?:\s*[—-]+\s*(.+))?$/),O="",ae=null;T?(O=T[1].trim(),ae=(T[2]??"").trim()||null):O=P.trim(),O&&(i.push({type:g.type,action:O,description:ae,sortOrder:w,position:g.position,whenExpr:null}),w+=1)}}return i.length===0?{ok:!1,error:"no rules found (expected ## Gates / ## Steps / ## Hooks / ## Instructions)"}:{ok:!0,workflow:{command:o,rules:i}}}async function Uj(s){let e;try{e=await It.readdir(s)}catch{return[]}let t=[];for(let n of e){if(n.startsWith(".")||n.startsWith("_")||n===nc||n==="index.md"||!n.endsWith(".md"))continue;let r=Yt.join(s,n);(await It.stat(r)).isFile()&&t.push(r)}return t}var _j,Dj,tp,nc,Mj,Fj,sc=h(()=>{"use strict";re();$e();$n();tc();Zd();_j="captured",Dj="workflows",tp="_ingested",nc="README.md";c(iv,"resolveCapturedRoot");c(av,"resolveWorkflowsRoot");c(np,"ingestCapturedNotes");c(sp,"ensureCapturedReadme");Mj=`# Captured notes (Obsidian dropzone)
925
+ `)||t.length===0?t+n:`${t}${n}`;await Kt.writeFile(e,r,"utf-8")}async function Ij(s){try{return await Kt.stat(s),!0}catch{return!1}}var xj,sv,ep=h(()=>{"use strict";re();ge();xj="# prjct: legacy wiki \u2014 vault moved to ~/Documents/prjct/ in 2.2.0",sv=".prjct/wiki/";c(Xo,"resolveVaultRoot");c(Aj,"migrateWikiLocationIfNeeded");c(rv,"dirHasContent");c(jj,"moveDirectory");c(ov,"copyRecursive");c(Zd,"countFiles");c($j,"ensureLegacyGitignore");c(Ij,"fileExists")});var uv={};D(uv,{ensureCapturedReadme:()=>rp,ensureWorkflowsReadme:()=>ip,ingestCapturedNotes:()=>sp,ingestWorkflowEdits:()=>op});import It from"node:fs/promises";import Yt from"node:path";async function iv(s){return Yt.join(await Xo(s),_j)}async function av(s){return Yt.join(await Xo(s),Dj)}async function sp(s,e={}){let t=await iv(s),n={ingested:0,skipped:[],errors:[]},r=await Oj(t);if(r.length===0)return n;let o=Yt.join(t,np,lv());for(let i of r){let a=Yt.basename(i);try{let l=await It.readFile(i,"utf-8"),u=Nj(l);if(!u.ok){n.skipped.push({file:a,reason:u.error});continue}let d=Rr(u.note.content);if(d.length>0&&!e.force){n.skipped.push({file:a,reason:`secret-like content (${d.join(", ")}). Remove or re-run with --force.`});continue}await J.remember(s,{type:u.note.type,content:u.note.content,tags:u.note.tags}),await cv(i,o,a),n.ingested++}catch(l){n.errors.push({file:a,error:l instanceof Error?l.message:String(l)})}}return n}async function rp(s){let e=await iv(s);await It.mkdir(e,{recursive:!0});let t=Yt.join(e,sc);await It.stat(t).then(()=>!0,()=>!1)||await It.writeFile(t,Mj,"utf-8")}async function Oj(s){let e;try{e=await It.readdir(s)}catch{return[]}let t=[];for(let n of e)n.startsWith(".")||n!==np&&n!==sc&&n.toLowerCase().endsWith(".md")&&t.push(Yt.join(s,n));return t}async function cv(s,e,t){await It.mkdir(e,{recursive:!0});let n=Yt.join(e,t);await It.rename(s,n)}function lv(){let s=new Date,e=c(t=>String(t).padStart(2,"0"),"pad");return`${s.getUTCFullYear()}${e(s.getUTCMonth()+1)}${e(s.getUTCDate())}-${e(s.getUTCHours())}${e(s.getUTCMinutes())}${e(s.getUTCSeconds())}`}function Nj(s){let e=s.match(/^---\s*\r?\n([\s\S]*?)\r?\n---\s*\r?\n?([\s\S]*)$/);if(!e)return{ok:!1,error:"no frontmatter (expected leading `---` block)"};let[,t,n]=e,{type:r,tags:o,error:i}=Lj(t);if(i)return{ok:!1,error:i};if(!r)return{ok:!1,error:"missing `type` in frontmatter"};if(!/^[a-z][a-z0-9-]*$/.test(r))return{ok:!1,error:`invalid type '${r}'. Lowercase letters + dashes only. Base types: ${xs.join(", ")}`};let a=n.trim();return a?{ok:!0,note:{type:r,tags:o,content:a}}:{ok:!1,error:"body is empty"}}function Lj(s){let e=s.split(/\r?\n/),t,n={},r=!1;for(let o of e){if(o.trim()==="")continue;if(r&&/^\s+/.test(o)){let u=o.trim(),d=u.indexOf(":");if(d>0){let p=u.slice(0,d).trim(),m=tp(u.slice(d+1).trim());p&&(n[p]=m)}continue}r=!1;let i=o.indexOf(":");if(i<=0)continue;let a=o.slice(0,i).trim(),l=tp(o.slice(i+1).trim());if(a==="type")t=l.toLowerCase();else if(a==="tags")if(l)for(let u of l.split(",")){let d=u.trim(),p=d.indexOf("="),m=d.indexOf(":"),g=p>0?p:m;g<=0||(n[d.slice(0,g).trim()]=d.slice(g+1).trim())}else r=!0}return{type:t,tags:n}}function tp(s){return s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'")?s.slice(1,-1):s}async function op(s){let e={ingested:[],skipped:[],errors:[]},t=await I.readConfig(s).catch(()=>null);if(!t?.projectId)return e;let n=t.projectId,r=await av(s),o=await Uj(r);if(o.length===0)return e;let i=Yt.join(r,np,lv());for(let a of o){let l=Yt.basename(a);try{let u=await It.readFile(a,"utf-8"),d=Hj(u);if(!d.ok){e.skipped.push({file:l,reason:d.error});continue}let p=d.workflow,m=ee.getRulesForCommand(n,p.command);for(let g of m)ee.removeRule(n,g.id);for(let g of p.rules)ee.addRule(n,{type:g.type,command:p.command,position:g.position,action:g.action,description:g.description,enabled:!0,timeoutMs:6e4,sortOrder:g.sortOrder,createdAt:new Date().toISOString(),trustSource:"imported"});await cv(a,i,l),e.ingested.push({command:p.command,rulesReplaced:p.rules.length})}catch(u){e.errors.push({file:l,error:u instanceof Error?u.message:String(u)})}}return e}async function ip(s){let e=await av(s);await It.mkdir(e,{recursive:!0});let t=Yt.join(e,sc);await It.stat(t).then(()=>!0,()=>!1)||await It.writeFile(t,Fj,"utf-8")}function Hj(s){let e=s.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);if(!e)return{ok:!1,error:"missing frontmatter (---name: foo---)"};let t=e[1],n=e[2],r=t.match(/^\s*name\s*:\s*(\S+)/m);if(!r)return{ok:!1,error:"frontmatter missing 'name' field"};let o=tp(r[1].trim()),i=[],a={gates:{type:"gate",position:"before"},steps:{type:"step",position:"before"},hooks:{type:"hook",position:"before"},instructions:{type:"instruction",position:"before"}},l=/^##\s+(\w+)/gm,u=[...n.matchAll(l)];for(let d=0;d<u.length;d++){let p=u[d],m=p[1].toLowerCase(),g=a[m];if(!g)continue;let k=p.index+p[0].length,E=d+1<u.length?u[d+1].index:n.length,y=n.slice(k,E),w=0;for(let v of y.split(`
926
+ `)){let S=v.trim();if(!S.startsWith("-"))continue;let P=S.replace(/^-\s*/,""),T=P.match(/^`([^`]+)`(?:\s*[—-]+\s*(.+))?$/),O="",ae=null;T?(O=T[1].trim(),ae=(T[2]??"").trim()||null):O=P.trim(),O&&(i.push({type:g.type,action:O,description:ae,sortOrder:w,position:g.position,whenExpr:null}),w+=1)}}return i.length===0?{ok:!1,error:"no rules found (expected ## Gates / ## Steps / ## Hooks / ## Instructions)"}:{ok:!0,workflow:{command:o,rules:i}}}async function Uj(s){let e;try{e=await It.readdir(s)}catch{return[]}let t=[];for(let n of e){if(n.startsWith(".")||n.startsWith("_")||n===sc||n==="index.md"||!n.endsWith(".md"))continue;let r=Yt.join(s,n);(await It.stat(r)).isFile()&&t.push(r)}return t}var _j,Dj,np,sc,Mj,Fj,rc=h(()=>{"use strict";re();$e();$n();nc();ep();_j="captured",Dj="workflows",np="_ingested",sc="README.md";c(iv,"resolveCapturedRoot");c(av,"resolveWorkflowsRoot");c(sp,"ingestCapturedNotes");c(rp,"ensureCapturedReadme");Mj=`# Captured notes (Obsidian dropzone)
927
927
 
928
928
  Drop a markdown note here, run \`prjct context wiki sync\`, and each note
929
929
  becomes a project-memory entry. Processed notes move to \`_ingested/\` so
@@ -955,22 +955,22 @@ ${xs.map(s=>`- \`${s}\``).join(`
955
955
  - Secret-like content (API keys, JWTs) is refused unless you pass
956
956
  \`--force\` to \`prjct context wiki sync\`.
957
957
  - Files already in \`_ingested/\` are ignored.
958
- `;c(Oj,"listNoteFiles");c(cv,"moveToArchive");c(lv,"timestampSlug");c(Nj,"parseNote");c(Lj,"parseFrontmatter");c(ep,"stripQuotes");c(rp,"ingestWorkflowEdits");c(op,"ensureWorkflowsReadme");Fj='# Workflows (Obsidian dropzone)\n\nDrop a markdown file here to OVERRIDE a workflow\'s rules in SQLite. Format:\n\n```markdown\n---\nname: ship\n---\n\n## Gates\n- `git branch --show-current | grep -vE "^(main|master)$"` \u2014 Prevent shipping from main branch\n\n## Steps\n- `version:bump` \u2014 Bump version (stack-aware)\n- `changelog:add` \u2014 Append CHANGELOG entry\n- `git:commit` \u2014 Commit ship\n- `git:push` \u2014 Push to origin\n```\n\n## How it works\n\n1. You drop `workflows/<name>.md` here.\n2. Stop hook (or `prjct context wiki sync`) reads it.\n3. ALL existing rules for that workflow are deleted from SQLite.\n4. New rules from your file are inserted.\n5. Wiki regenerates \u2192 `_generated/workflows/<name>.md` reflects your edits.\n6. Your file moves to `_ingested/<timestamp>/` so this folder stays clean.\n\n## Schema\n\n- Frontmatter `name:` is required (the workflow command: ship, task, sync, \u2026)\n- Sections: `## Gates`, `## Steps`, `## Hooks`, `## Instructions` (any subset)\n- Each bullet: `- \\`<action>\\` \u2014 <description>` (description optional)\n- Order within a section is preserved as sortOrder\n\n## Notes\n\n- This is destructive: SQLite rules for the named workflow are REPLACED, not merged.\n- To restore a built-in workflow, run `prjct workflow reset <name>`.\n- `README.md` and `index.md` are ignored.\n- Files in `_ingested/` are ignored.\n';c(Hj,"parseWorkflowMarkdown");c(Uj,"listWorkflowFiles")});var dv={};D(dv,{CREW_RUN_KEY_PREFIX:()=>cp,CrewRunSchema:()=>ip,crewRunStorage:()=>oc,default:()=>lp});import{z as Qt}from"zod";function rc(s){return`${cp}${s}`}var cp,ip,ap,oc,lp,ic=h(()=>{"use strict";Rn();ue();Y();cp="crew-run:",ip=Qt.object({id:Qt.string().min(1),spec_id:Qt.string().nullable().default(null),task_id:Qt.string().nullable().default(null),started_at:Qt.string().min(1),ended_at:Qt.string().min(1),implementer_summary:Qt.string().default(""),files_touched:Qt.array(Qt.string()).default([]),reviewer_verdict:Qt.enum(["APPROVED","CHANGES_REQUESTED"]),reviewer_notes:Qt.string().nullable().default(null)});c(rc,"keyFor");ap=class{static{c(this,"CrewRunStorage")}record(e,t){let n=t.runId??Ve(),r=A.getDoc(e,rc(n));if(r)return r;let o=R(),i=ip.parse({id:n,spec_id:t.specId??null,task_id:t.taskId??null,started_at:t.startedAt??o,ended_at:t.endedAt??o,implementer_summary:t.implementerSummary,files_touched:t.filesTouched,reviewer_verdict:t.reviewerVerdict,reviewer_notes:t.reviewerNotes??null});return A.setDoc(e,rc(n),i),i}get(e,t){return A.getDoc(e,rc(t))}list(e){return A.listDocsByPrefix(e,cp).map(n=>ip.parse(n.data))}delete(e,t){A.deleteDoc(e,rc(t))}},oc=new ap,lp=oc});var _s={};D(_s,{generateWiki:()=>pp,regenerateWikiDeferred:()=>zo});import up from"node:fs/promises";import dp from"node:path";function pv(s,e,t){let n=Date.now();try{let r=e(),o=Date.now()-n;return console.log(JSON.stringify({builder:s,status:"ok",ms:o})),{result:r,ok:!0,ms:o}}catch(r){let o=Date.now()-n,i=r instanceof Error?r.message:String(r);return console.log(JSON.stringify({builder:s,status:"error",ms:o,error:i})),{result:t(r),ok:!1,ms:o}}}async function pp(s,e){let t=await Xo(s),n=dp.join(t,ac);await up.mkdir(n,{recursive:!0});let r=dp.join(n,qd),o=await Ik(s,e);if(await up.readFile(r,"utf-8").catch(()=>null)===o){let ce=await Xd(n);return{wikiRoot:t,filesWritten:0,filesSkipped:Object.keys(ce).length,filesRemoved:0}}let{specStorage:a}=await Promise.resolve().then(()=>(Bo(),hk)),{queueStorage:l}=await Promise.resolve().then(()=>(Rs(),iy)),{default:u}=await Promise.resolve().then(()=>(ic(),dv)),{teamEnrollmentStorage:d}=await Promise.resolve().then(()=>(Ia(),dw)),[p,m,g,k,E,y,w]=await Promise.all([uy.getAll(e),Promise.resolve(J.allEntriesForIndex(e)),Ke.getActive(e).catch(()=>null),Promise.resolve(Ct.getActive(e)).catch(()=>null),Promise.resolve(ee.getAllRules(e)).catch(()=>[]),Promise.resolve(a.list(e,{includeArchived:!0})).catch(()=>[]),l.getTasks(e).catch(()=>[])]),v=(()=>{try{return u.list(e)}catch{return[]}})(),S=(()=>{try{return d.get(e)}catch{return null}})(),P=m.filter(ce=>ce.type!=="shipped"),T=new Map;for(let ce of p)T.set(`ships/${vt(ce.name)}.md`,qk(ce));for(let[ce,De]of Jk(P,m))T.set(ce,De);for(let[ce,De]of Xk(P,m))T.set(ce,De);let O=Vk(m);for(let[ce,De]of Qk(y,w,O))T.set(ce,De);let ae=pv("crew-runs",()=>Wj(v),()=>new Map);for(let[ce,De]of ae.result)T.set(ce,De);let Ee=pv("team",()=>Gj(S),()=>null);Ee.result!==null&&T.set("team.md",Ee.result);let be=k?.patterns??g?.patterns??[],Ye=k?.antiPatterns??g?.antiPatterns??[],yn=Ok(be,Ye);if(yn&&T.set("patterns.md",yn),k){let ce=Nk(k);ce&&T.set("architecture.md",ce);let De=Lk(k);De&&T.set("tech-debt.md",De);let ro=Fk(k);ro&&T.set("insights.md",ro)}let Ln=ev(E);for(let[ce,De]of Ln.files)T.set(ce,De);let Mt=Ln.commandCount,ui=Ct.getAllFull(e);for(let[ce,De]of jk(ui))T.set(ce,De);let to=await Kk(s);for(let[ce,De]of to)T.set(ce,De);let Fc=to.size>0?to.size-1:0,no=new Map;for(let ce of P)no.set(ce.type,(no.get(ce.type)??0)+1);let so=new Map;for(let ce of P)for(let De of Object.keys(ce.tags))so.set(De,(so.get(De)??0)+1);T.set("index.md",Dk({ships:p,memoryTypeCounts:no,tagKeyCounts:so,patternsCount:be.length,antiPatternsCount:Ye.length,llmAnalysis:k,archiveCount:Vd(ui).size,releaseCount:Fc,workflowCount:Mt}));let di=await Xd(n),qs={},se=0,Lm=0,Hc=0;for(let[ce,De]of T){let ro=Ak(De);if(qs[ce]=ro,di[ce]===ro){Lm++;continue}await Jo(n,ce,De),se++}for(let ce of Object.keys(di))qs[ce]||(await Uk(n,ce),Hc++);let mE=await Wk(n,qs);Hc+=mE,await Jo(n,Jd,`${JSON.stringify(qs,null,2)}
959
- `),await Jo(n,qd,o);let gE=dp.join(t,"README.md");return await up.stat(gE).then(()=>!0,()=>!1)||(await Jo(t,"README.md",`# Project Wiki
958
+ `;c(Oj,"listNoteFiles");c(cv,"moveToArchive");c(lv,"timestampSlug");c(Nj,"parseNote");c(Lj,"parseFrontmatter");c(tp,"stripQuotes");c(op,"ingestWorkflowEdits");c(ip,"ensureWorkflowsReadme");Fj='# Workflows (Obsidian dropzone)\n\nDrop a markdown file here to OVERRIDE a workflow\'s rules in SQLite. Format:\n\n```markdown\n---\nname: ship\n---\n\n## Gates\n- `git branch --show-current | grep -vE "^(main|master)$"` \u2014 Prevent shipping from main branch\n\n## Steps\n- `version:bump` \u2014 Bump version (stack-aware)\n- `changelog:add` \u2014 Append CHANGELOG entry\n- `git:commit` \u2014 Commit ship\n- `git:push` \u2014 Push to origin\n```\n\n## How it works\n\n1. You drop `workflows/<name>.md` here.\n2. Stop hook (or `prjct context wiki sync`) reads it.\n3. ALL existing rules for that workflow are deleted from SQLite.\n4. New rules from your file are inserted.\n5. Wiki regenerates \u2192 `_generated/workflows/<name>.md` reflects your edits.\n6. Your file moves to `_ingested/<timestamp>/` so this folder stays clean.\n\n## Schema\n\n- Frontmatter `name:` is required (the workflow command: ship, task, sync, \u2026)\n- Sections: `## Gates`, `## Steps`, `## Hooks`, `## Instructions` (any subset)\n- Each bullet: `- \\`<action>\\` \u2014 <description>` (description optional)\n- Order within a section is preserved as sortOrder\n\n## Notes\n\n- This is destructive: SQLite rules for the named workflow are REPLACED, not merged.\n- To restore a built-in workflow, run `prjct workflow reset <name>`.\n- `README.md` and `index.md` are ignored.\n- Files in `_ingested/` are ignored.\n';c(Hj,"parseWorkflowMarkdown");c(Uj,"listWorkflowFiles")});var dv={};D(dv,{CREW_RUN_KEY_PREFIX:()=>lp,CrewRunSchema:()=>ap,crewRunStorage:()=>ic,default:()=>up});import{z as Qt}from"zod";function oc(s){return`${lp}${s}`}var lp,ap,cp,ic,up,ac=h(()=>{"use strict";Rn();ue();Y();lp="crew-run:",ap=Qt.object({id:Qt.string().min(1),spec_id:Qt.string().nullable().default(null),task_id:Qt.string().nullable().default(null),started_at:Qt.string().min(1),ended_at:Qt.string().min(1),implementer_summary:Qt.string().default(""),files_touched:Qt.array(Qt.string()).default([]),reviewer_verdict:Qt.enum(["APPROVED","CHANGES_REQUESTED"]),reviewer_notes:Qt.string().nullable().default(null)});c(oc,"keyFor");cp=class{static{c(this,"CrewRunStorage")}record(e,t){let n=t.runId??Ve(),r=A.getDoc(e,oc(n));if(r)return r;let o=R(),i=ap.parse({id:n,spec_id:t.specId??null,task_id:t.taskId??null,started_at:t.startedAt??o,ended_at:t.endedAt??o,implementer_summary:t.implementerSummary,files_touched:t.filesTouched,reviewer_verdict:t.reviewerVerdict,reviewer_notes:t.reviewerNotes??null});return A.setDoc(e,oc(n),i),i}get(e,t){return A.getDoc(e,oc(t))}list(e){return A.listDocsByPrefix(e,lp).map(n=>ap.parse(n.data))}delete(e,t){A.deleteDoc(e,oc(t))}},ic=new cp,up=ic});var _s={};D(_s,{generateWiki:()=>mp,regenerateWikiDeferred:()=>zo});import dp from"node:fs/promises";import pp from"node:path";function pv(s,e,t){let n=Date.now();try{let r=e(),o=Date.now()-n;return console.log(JSON.stringify({builder:s,status:"ok",ms:o})),{result:r,ok:!0,ms:o}}catch(r){let o=Date.now()-n,i=r instanceof Error?r.message:String(r);return console.log(JSON.stringify({builder:s,status:"error",ms:o,error:i})),{result:t(r),ok:!1,ms:o}}}async function mp(s,e){let t=await Xo(s),n=pp.join(t,cc);await dp.mkdir(n,{recursive:!0});let r=pp.join(n,Jd),o=await Ik(s,e);if(await dp.readFile(r,"utf-8").catch(()=>null)===o){let ce=await zd(n);return{wikiRoot:t,filesWritten:0,filesSkipped:Object.keys(ce).length,filesRemoved:0}}let{specStorage:a}=await Promise.resolve().then(()=>(Bo(),hk)),{queueStorage:l}=await Promise.resolve().then(()=>(Rs(),iy)),{default:u}=await Promise.resolve().then(()=>(ac(),dv)),{teamEnrollmentStorage:d}=await Promise.resolve().then(()=>(_a(),dw)),[p,m,g,k,E,y,w]=await Promise.all([uy.getAll(e),Promise.resolve(J.allEntriesForIndex(e)),Ke.getActive(e).catch(()=>null),Promise.resolve(Ct.getActive(e)).catch(()=>null),Promise.resolve(ee.getAllRules(e)).catch(()=>[]),Promise.resolve(a.list(e,{includeArchived:!0})).catch(()=>[]),l.getTasks(e).catch(()=>[])]),v=(()=>{try{return u.list(e)}catch{return[]}})(),S=(()=>{try{return d.get(e)}catch{return null}})(),P=m.filter(ce=>ce.type!=="shipped"),T=new Map;for(let ce of p)T.set(`ships/${vt(ce.name)}.md`,qk(ce));for(let[ce,De]of Jk(P,m))T.set(ce,De);for(let[ce,De]of Xk(P,m))T.set(ce,De);let O=Vk(m);for(let[ce,De]of Qk(y,w,O))T.set(ce,De);let ae=pv("crew-runs",()=>Wj(v),()=>new Map);for(let[ce,De]of ae.result)T.set(ce,De);let Ee=pv("team",()=>Gj(S),()=>null);Ee.result!==null&&T.set("team.md",Ee.result);let be=k?.patterns??g?.patterns??[],Ye=k?.antiPatterns??g?.antiPatterns??[],yn=Ok(be,Ye);if(yn&&T.set("patterns.md",yn),k){let ce=Nk(k);ce&&T.set("architecture.md",ce);let De=Lk(k);De&&T.set("tech-debt.md",De);let ro=Fk(k);ro&&T.set("insights.md",ro)}let Ln=ev(E);for(let[ce,De]of Ln.files)T.set(ce,De);let Mt=Ln.commandCount,di=Ct.getAllFull(e);for(let[ce,De]of jk(di))T.set(ce,De);let to=await Kk(s);for(let[ce,De]of to)T.set(ce,De);let Hc=to.size>0?to.size-1:0,no=new Map;for(let ce of P)no.set(ce.type,(no.get(ce.type)??0)+1);let so=new Map;for(let ce of P)for(let De of Object.keys(ce.tags))so.set(De,(so.get(De)??0)+1);T.set("index.md",Dk({ships:p,memoryTypeCounts:no,tagKeyCounts:so,patternsCount:be.length,antiPatternsCount:Ye.length,llmAnalysis:k,archiveCount:qd(di).size,releaseCount:Hc,workflowCount:Mt}));let pi=await zd(n),qs={},se=0,Lm=0,Uc=0;for(let[ce,De]of T){let ro=Ak(De);if(qs[ce]=ro,pi[ce]===ro){Lm++;continue}await Jo(n,ce,De),se++}for(let ce of Object.keys(pi))qs[ce]||(await Uk(n,ce),Uc++);let mE=await Wk(n,qs);Uc+=mE,await Jo(n,Xd,`${JSON.stringify(qs,null,2)}
959
+ `),await Jo(n,Jd,o);let gE=pp.join(t,"README.md");return await dp.stat(gE).then(()=>!0,()=>!1)||(await Jo(t,"README.md",`# Project Wiki
960
960
 
961
961
  Open this folder as an Obsidian vault to browse project memory.
962
962
 
963
- - Auto-generated content lives in \`${ac}/\` \u2014 start at [${ac}/index.md](${ac}/index.md). Do not edit; it rebuilds on \`prjct ship\` / \`prjct remember\`.
963
+ - Auto-generated content lives in \`${cc}/\` \u2014 start at [${cc}/index.md](${cc}/index.md). Do not edit; it rebuilds on \`prjct ship\` / \`prjct remember\`.
964
964
  - Drop notes into \`captured/\` with frontmatter, then run \`prjct context wiki sync\` to ingest them into project memory. See [captured/README.md](captured/README.md).
965
965
  - Any other markdown you place here survives rebuilds.
966
- `),se++),await sp(s),await op(s),await Pk(t).catch(()=>{}),{wikiRoot:t,filesWritten:se,filesSkipped:Lm,filesRemoved:Hc}}function Wj(s){let e=new Map;for(let t of s){let n=t.spec_id??t.task_id??t.id,r=t.started_at.replace(/[:.]/g,"-"),o=`crew-runs/${n}-${r}.md`,i=[`# Crew run \u2014 ${n}`,"",`- **run-id**: \`${t.id}\``,`- **spec**: ${t.spec_id?`\`${t.spec_id}\``:"_(none)_"}`,`- **task**: ${t.task_id?`\`${t.task_id}\``:"_(none)_"}`,`- **started**: ${t.started_at}`,`- **ended**: ${t.ended_at}`,`- **verdict**: **${t.reviewer_verdict}**`,"","## Implementer summary","",t.implementer_summary,"","## Files touched","",t.files_touched.length===0?"_(none recorded)_":t.files_touched.map(a=>`- \`${a}\``).join(`
966
+ `),se++),await rp(s),await ip(s),await Pk(t).catch(()=>{}),{wikiRoot:t,filesWritten:se,filesSkipped:Lm,filesRemoved:Uc}}function Wj(s){let e=new Map;for(let t of s){let n=t.spec_id??t.task_id??t.id,r=t.started_at.replace(/[:.]/g,"-"),o=`crew-runs/${n}-${r}.md`,i=[`# Crew run \u2014 ${n}`,"",`- **run-id**: \`${t.id}\``,`- **spec**: ${t.spec_id?`\`${t.spec_id}\``:"_(none)_"}`,`- **task**: ${t.task_id?`\`${t.task_id}\``:"_(none)_"}`,`- **started**: ${t.started_at}`,`- **ended**: ${t.ended_at}`,`- **verdict**: **${t.reviewer_verdict}**`,"","## Implementer summary","",t.implementer_summary,"","## Files touched","",t.files_touched.length===0?"_(none recorded)_":t.files_touched.map(a=>`- \`${a}\``).join(`
967
967
  `),...t.reviewer_notes?["","## Reviewer notes","",t.reviewer_notes]:[],""].join(`
968
968
  `);e.set(o,i)}return e}function Gj(s){return s===null?null:["# Team enrollment","",`- **required**: ${s.required}`,`- **minVersion**: \`${s.minVersion}\``,`- **enrolledAt**: ${s.enrolledAt}`,`- **enrolledBy**: ${s.enrolledBy??"_(unspecified)_"}`,"",'Authoritative source: `kv_store["team:enrollment"]`. The `.prjct/team.json` file in the repo is a derived mirror written atomically by `prjct team` (the pre-commit hook reads it because it must work before prjct is installed). Do not hand-edit the mirror \u2014 run `prjct team check` to detect/heal drift.',""].join(`
969
- `)}async function zo(s,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{pp(s,e).catch(()=>{})});return}try{await pp(s,e)}catch{}}var ac,Mn=h(()=>{"use strict";$e();Jn();pr();Ps();$n();xk();Er();$k();_k();Mk();Hk();Gk();zk();Yk();Zk();tv();sc();Zd();ac="_generated";c(pv,"runBuilder");c(pp,"generateWiki");c(Wj,"buildCrewRunFiles");c(Gj,"buildTeamFile");c(zo,"regenerateWikiDeferred")});var hv={};D(hv,{ShippingCommands:()=>Ds,seedCodeShipRules:()=>gp});import{existsSync as mv}from"node:fs";import gv from"node:path";function fv(s){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>mv(gv.join(s,t)))}function mp(s){return mv(gv.join(s,".git"))}async function gp(s,e){if(!fv(e))return!1;let t=new Date().toISOString(),n=ee.getRulesForCommand(s,"ship"),r=new Set(n.map(d=>d.action)),i=n.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,a=[];mp(e)&&a.push({action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",timeoutMs:5e3});let l=[{action:"version:bump",description:"Bump version (stack-aware)",timeoutMs:1e4},{action:"changelog:add",description:"Append CHANGELOG entry",timeoutMs:1e4}];mp(e)&&(l.push({action:"git:commit",description:"Commit ship",timeoutMs:15e3}),l.push({action:"git:push",description:"Push to origin",timeoutMs:3e4}));let u=0;for(let d of a)r.has(d.action)||(ee.addRule(s,{type:"gate",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);for(let d of l)r.has(d.action)||(ee.addRule(s,{type:"step",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);return u>0}async function Bj(s,e,t,n){if(n.intent==="proceed"||n.intent==="register-only")return null;if(!t.some(a=>a.type==="step"&&a.position==="before"))return{question:"No `ship` workflow steps are configured for this project. What should ship do?",options:["register-only","seed-code-workflow","abort"],state:{rulesCount:t.length,looksLikeCode:fv(e)}};if(await B.getCurrentTask(s))return null;let i=await qj(e);return i?{question:`No active task, and PR #${i.number} ("${i.title}") is OPEN for this branch. Continue ship anyway?`,options:["proceed","abort"],state:{openPr:i.number,branch:i.branch}}:null}function Vj(s,e){if(e){let t=W(q("Clarification needed",s.question),q("Options",Oe(s.options.map(n=>`\`prjct ship --intent=${n}\``))),s.state?q("State",Oe(Object.entries(s.state).map(([n,r])=>`${n}: ${JSON.stringify(r)}`))):null);console.log(t);return}console.log(`
969
+ `)}async function zo(s,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{mp(s,e).catch(()=>{})});return}try{await mp(s,e)}catch{}}var cc,Mn=h(()=>{"use strict";$e();Jn();pr();Ps();$n();xk();Er();$k();_k();Mk();Hk();Gk();zk();Yk();Zk();tv();rc();ep();cc="_generated";c(pv,"runBuilder");c(mp,"generateWiki");c(Wj,"buildCrewRunFiles");c(Gj,"buildTeamFile");c(zo,"regenerateWikiDeferred")});var hv={};D(hv,{ShippingCommands:()=>Ds,seedCodeShipRules:()=>fp});import{existsSync as mv}from"node:fs";import gv from"node:path";function fv(s){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>mv(gv.join(s,t)))}function gp(s){return mv(gv.join(s,".git"))}async function fp(s,e){if(!fv(e))return!1;let t=new Date().toISOString(),n=ee.getRulesForCommand(s,"ship"),r=new Set(n.map(d=>d.action)),i=n.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,a=[];gp(e)&&a.push({action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",timeoutMs:5e3});let l=[{action:"version:bump",description:"Bump version (stack-aware)",timeoutMs:1e4},{action:"changelog:add",description:"Append CHANGELOG entry",timeoutMs:1e4}];gp(e)&&(l.push({action:"git:commit",description:"Commit ship",timeoutMs:15e3}),l.push({action:"git:push",description:"Push to origin",timeoutMs:3e4}));let u=0;for(let d of a)r.has(d.action)||(ee.addRule(s,{type:"gate",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);for(let d of l)r.has(d.action)||(ee.addRule(s,{type:"step",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);return u>0}async function Bj(s,e,t,n){if(n.intent==="proceed"||n.intent==="register-only")return null;if(!t.some(a=>a.type==="step"&&a.position==="before"))return{question:"No `ship` workflow steps are configured for this project. What should ship do?",options:["register-only","seed-code-workflow","abort"],state:{rulesCount:t.length,looksLikeCode:fv(e)}};if(await B.getCurrentTask(s))return null;let i=await qj(e);return i?{question:`No active task, and PR #${i.number} ("${i.title}") is OPEN for this branch. Continue ship anyway?`,options:["proceed","abort"],state:{openPr:i.number,branch:i.branch}}:null}function Vj(s,e){if(e){let t=W(q("Clarification needed",s.question),q("Options",Oe(s.options.map(n=>`\`prjct ship --intent=${n}\``))),s.state?q("State",Oe(Object.entries(s.state).map(([n,r])=>`${n}: ${JSON.stringify(r)}`))):null);console.log(t);return}console.log(`
970
970
  \u26A0\uFE0F ${s.question}`),console.log(`
971
- Options:`);for(let t of s.options)console.log(` prjct ship --intent=${t}`)}async function qj(s){if(!mp(s))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(Fe(),tl)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:s,timeout:3e3}),n=t.toString().trim();if(!n)return null;let{stdout:r}=await e("gh",["pr","list","--head",n,"--state","open","--json","number,title","--limit","1"],{cwd:s,timeout:5e3}),o=JSON.parse(r.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:n}}catch{return null}}var cc,Ds,lc=h(()=>{"use strict";Fa();Y();Ps();pt();$n();F();ue();Te();kt();Fo();pe();Od();Ie();Zt();cc="ship:in_progress",Ds=class extends X{static{c(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=r.value;try{let v=j.getDoc(o,cc);v?.version&&(await wt.getByVersion(o,v.version)||(await wt.addShipped(o,{name:v.feature,version:v.version}),console.log(`\u2139\uFE0F Reconciled an interrupted ship: ${v.feature} (v${v.version})`)),j.deleteDoc(o,cc))}catch{}let i=e,a=await B.getCurrentTask(o),l=a?.linkedSpecId;if(a&&(i||(i=a.description||"current work"),await B.completeTask(o)),i||(i="current work"),l&&!n.noSpecGate)try{let{specService:v}=await Promise.resolve().then(()=>(Qa(),Wd)),S=await v.get(t,l);if(S&&S.content.acceptance_criteria.length>0){let P=[];P.push(""),P.push(`## Spec acceptance gate \u2014 \`${S.title}\` (${S.id.slice(0,8)})`),P.push(""),P.push("Walk each criterion. STOP if any is unmet."),P.push("");for(let T of S.content.acceptance_criteria)P.push(`- [ ] ${T}`);P.push(""),P.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),P.push(""),console.log(P.join(`
972
- `))}}catch{}let u=ee.getRulesForCommand(o,"ship");if(n.intent==="seed-code-workflow"){if(!await gp(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};u=ee.getRulesForCommand(o,"ship")}!u.some(v=>v.type==="step"&&v.position==="before")&&n.intent!=="register-only"&&await gp(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=ee.getRulesForCommand(o,"ship"));let p=await Bj(o,t,u,n);if(p)return Vj(p,n.md===!0),{success:!1,clarification:p};let m={feature:i},g=await ns(o,"ship","before",{projectPath:t,skipRules:n.skipHooks,runContext:m});if(!g.success)return{success:!1,error:`Ship blocked: ${g.gatesFailed.length>0?g.gatesFailed.join(", "):"unknown step"}`};let k=typeof m.version=="string"?m.version:"unversioned";try{j.setDoc(o,cc,{feature:i,version:k,startedAt:R()})}catch{}await wt.addShipped(o,{name:i,version:k});try{j.deleteDoc(o,cc)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:k,timestamp:R()});let E=await ns(o,"ship","after",{projectPath:t,skipRules:n.skipHooks,runContext:m}),y=[...g.instructions,...E.instructions];try{await Qn.sync(t)}catch(v){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",b(v))}try{let{regenerateWikiDeferred:v}=await Promise.resolve().then(()=>(Mn(),_s));await v(t,o)}catch(v){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",b(v))}let w=g.stepsRun.length+E.stepsRun.length;if(n.md){let v=Ha("ship",!0),S=W(Ce(`Shipped: ${i}`,`Version: ${k}`),q("Results",Oe([`Version: ${k}`,`Workflow steps run: ${w>0?[...g.stepsRun,...E.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${g.hooksFailed.length+E.hooksFailed.length}`])),y.length>0?q("Agent Instructions",Oe(y)):null,Be(v.map(P=>({label:P.desc,command:P.cmd}))));console.log(S)}else f.done(`v${k} shipped`),br("ship");return{success:!0,feature:i,version:k}}catch(r){return f.fail(b(r)),Me(r)}}};c(fv,"isCodeProject");c(mp,"isGitRepo");c(gp,"seedCodeShipRules");c(Bj,"buildClarification");c(Vj,"renderClarification");c(qj,"findOpenPrForBranch")});var yv={};D(yv,{PlanningCommands:()=>Ms});async function Jj(){if(!fp){let{AnalysisCommands:s}=await Promise.resolve().then(()=>(dc(),wv));fp=new s}return fp}var fp,Ms,uc=h(()=>{"use strict";Mi();Wt();re();ge();Lw();$n();F();Te();pe();md();Uw();Ie();fp=null;c(Jj,"getAnalysisCommands");Ms=class extends X{static{c(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await I.isConfigured(t))return f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Wo(t).runNonInteractive());else if(a=await new Wo(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let l=await or(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await I.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,n),f.step(2,4,"Creating structure..."),await _.ensureProjectStructure(p),await this._seedShipWorkflow(p,t);let m=await this._detectEmptyDirectory(t),g=await this._detectExistingCode(t);if(g||!m){f.step(3,4,"Analyzing project...");let E=await Jj();if((await E.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await E.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let k=n.idea;if(m&&!g){if(!k)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};f.spin("architect mode...");let{projectMemory:E}=await Promise.resolve().then(()=>($e(),Ma));return await E.remember(t,{type:"idea",content:k,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await He.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:k,wizard:a}}return await He.installGlobalConfig(),await Nw(t).catch(()=>{}),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,wizard:a}}catch(n){return f.fail(b(n)),Me(n)}}_printNextSteps(e){if(console.log(""),console.log(" \u2713 skill installed at ~/.claude/skills/prjct/"),console.log(" \u2713 project CLAUDE.md updated with routing block"),console.log(""),console.log(" You don't run prjct commands. Claude does."),console.log(""),console.log(" Just describe what you're doing \u2014 Claude reads the intent and"),console.log(" runs the right verb. Routine captures (decision, learning,"),console.log(" gotcha, idea) save automatically; ship and other destructive"),console.log(" verbs surface a one-line plan and wait for your OK."),console.log(""),console.log(" If you want to drive manually:"),console.log(" prjct sync Refresh context + skill body"),console.log(" prjct task Start a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async _applyInitialPacksAndPersona(e,t){let{activatePacks:n,detectSuggestedPacks:r}=await Promise.resolve().then(()=>($d(),tk)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await r(e)),o.length>0&&await n(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(re(),ws))).default,a=await i.readConfig(e);if(a){let l=a.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...a,persona:l})}}}async _seedShipWorkflow(e,t){let n=await Ua(t),r=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(lc(),hv));await o(e,t),r=ee.getRulesForCommand(e,"ship").reduce((i,a)=>Math.max(i,a.sortOrder??0),0)+1,ee.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:r++,createdAt:new Date().toISOString()}),n.lint&&ee.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:r++,createdAt:new Date().toISOString()}),n.test&&ee.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:r++,createdAt:new Date().toISOString()})}}});var hp,_n,Ed=h(()=>{"use strict";Gn();Mi();re();ge();F();V();pe();hp=class{static{c(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await I.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(yi(),hi));if(await o.detect(e)){let a=await o.getMainWorktree(e);if(a&&a!==e&&await I.isConfigured(a))return await o.setup(e,a),{success:!0}}}catch{}f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(uc(),yv)),r=await new t().init(null,e);return r.success?{success:!0}:r}async getProjectId(e){let t=await I.getProjectId(e);if(!t)throw Pi.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await _.ensureProjectStructure(t),_.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await or();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await bn(e)).filter(r=>!r.startsWith(".")&&r!=="node_modules"&&r!=="package.json"&&r!=="package-lock.json"&&r!=="README.md").length===0}catch(t){return L(t)||console.error(`Directory check error: ${b(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await bn(e)).some(r=>t.includes(r))}catch(t){return L(t)||console.error(`Code check error: ${b(t)}`),!1}}async isConfigured(e){return await I.isConfigured(e)}async needsMigration(e){return await I.needsMigration(e)}},_n=new hp});async function Xj(s,e={}){let t=await I.getProjectId(s);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function we(s,e={}){let t=await _n.ensureInit(s);return t.success?Xj(s,e):{ok:!1,result:t}}async function yp(s,e={}){let t=await B.getCurrentTask(s);return t?{ok:!0,value:t}:{ok:!1,result:H('No active task \u2014 start one with `prjct task "<desc>"`',e)}}function pc(s,e,t={}){if(e&&gt.getWorkflow(s,e)?.enabled)return{ok:!0,value:{name:e}};let r=gt.getAllWorkflows(s).map(o=>o.name).join(", ");return{ok:!1,result:H(`Workflow '${e??""}' not found. Available: ${r}`,t)}}var Zt=h(()=>{"use strict";re();Ed();Ho();pt();Te();pe();c(Xj,"requireProjectId");c(we,"requireProject");c(yp,"requireActiveTask");c(pc,"requireWorkflow")});async function kv(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let n=t.value,r=await Ke.seal(n);return e.json?(console.log(JSON.stringify({success:r.success,signature:r.signature,error:r.error})),{success:r.success,error:r.error}):r.success?(f.done("Analysis sealed"),console.log(` Signature: ${r.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:r.signature}}):(f.fail(r.error||"Seal failed"),{success:!1,error:r.error})}catch(t){let n=b(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async function vv(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let n=t.value,r=await Ke.rollback(n);return e.json?(console.log(JSON.stringify({success:r.success,restoredSignature:r.restoredSignature,error:r.error})),{success:r.success,error:r.error}):e.md?r.success?(console.log(W(Ce("Analysis Rolled Back"),Zn({"Restored signature":`${r.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:r.restoredSignature}}):(console.log(W("## Rollback Failed",`> ${r.error}`)),{success:!1,error:r.error}):r.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${r.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:r.restoredSignature}}):(f.fail(r.error||"Rollback failed"),{success:!1,error:r.error})}catch(t){let n=b(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):e.md?console.log(W("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async function bv(s=process.cwd(),e={}){if(e.semantic)return wp(s,e);try{let t=await we(s);if(!t.ok)return t.result;let n=t.value,r=await Ke.verify(n);return e.json?(console.log(JSON.stringify(r)),{success:r.valid}):(r.valid?f.done(r.message):f.fail(r.message),console.log(""),{success:r.valid,data:r})}catch(t){let n=b(t);return N(n)}}async function wp(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return e.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),t.result;let n=t.value,r=s;try{r=j.getDoc(n,"project")?.repoPath||s}catch{}let o=await Ke.semanticVerify(n,r);if(e.json)return console.log(JSON.stringify(o)),{success:o.passed,data:o};console.log(""),o.passed?(f.done("Semantic verification passed"),console.log(` ${o.passedCount}/${o.checks.length} checks passed (${o.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${o.failedCount}/${o.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let i of o.checks){let a=i.passed?"\u2713":"\u2717",l=i.passed?`${i.output} (${i.durationMs}ms)`:i.error||"Failed";console.log(` ${a} ${i.name}: ${l}`)}return console.log(""),{success:o.passed,data:o}}catch(t){let n=b(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}var Sv=h(()=>{"use strict";Jn();Y();F();Te();kt();pe();Zt();c(kv,"seal");c(vv,"rollback");c(bv,"verify");c(wp,"semanticVerifyCommand")});import{z as M}from"zod";function Tv(s){let e=r$.safeParse(s);return e.success?{ok:!0,value:e.data}:{ok:!1,error:e.error.issues.map(n=>`${n.path.length>0?n.path.join("."):"<root>"}: ${n.message}`).join("; ")}}var zj,Kj,Yj,Qj,Zj,e$,t$,n$,s$,r$,Ev=h(()=>{"use strict";zj=M.object({style:M.string(),insights:M.array(M.string()),domains:M.array(M.string())}),Kj=M.object({name:M.string(),description:M.string(),locations:M.array(M.string()),confidence:M.number().min(0).max(1),category:M.string()}),Yj=M.object({issue:M.string(),reasoning:M.string(),files:M.array(M.string()),suggestion:M.string(),severity:M.enum(["low","medium","high"]),confidence:M.number().min(0).max(1)}),Qj=M.object({description:M.string(),area:M.string(),effort:M.enum(["small","medium","large"]),impact:M.string(),priority:M.enum(["low","medium","high"])}),Zj=M.object({path:M.string(),reason:M.string(),risk:M.string(),severity:M.enum(["low","medium","high"])}),e$=M.object({description:M.string(),files:M.array(M.string()),benefit:M.string(),effort:M.enum(["small","medium","large"])}),t$=M.object({category:M.string(),rule:M.string(),example:M.string().optional()}),n$=M.object({build:M.string().optional(),test:M.string().optional(),lint:M.string().optional(),dev:M.string().optional(),format:M.string().optional(),install:M.string().optional()}),s$=M.object({languages:M.array(M.string()),frameworks:M.array(M.string()),packageManager:M.string().optional()}),r$=M.object({version:M.literal(1),commitHash:M.string().nullable(),analyzedAt:M.string(),architecture:zj,patterns:M.array(Kj),antiPatterns:M.array(Yj),techDebt:M.array(Qj),riskAreas:M.array(Zj),refactorSuggestions:M.array(e$),projectInsights:M.array(M.string()),conventions:M.array(t$),commands:n$.optional(),stack:s$.optional()});c(Tv,"parseLlmAnalysis")});async function Cv(s,e=process.cwd(),t={}){try{let n=await we(e);if(!n.ok)return n.result;let r=n.value,o;try{o=JSON.parse(s)}catch(u){return{success:!1,error:`Invalid JSON: ${u instanceof Error?u.message:"parse failed"}`}}let i=Tv(o);if(!i.ok)return{success:!1,error:`Invalid LLM analysis schema: ${i.error}`};let a=i.value;Ct.save(r,a);let{regenerateWikiDeferred:l}=await Promise.resolve().then(()=>(Mn(),_s));return await l(e,r),t.md?console.log(W(Ce("LLM Analysis Saved"),Zn({Architecture:a.architecture.style,Patterns:a.patterns.length,"Anti-patterns":a.antiPatterns?.length||0,"Tech debt items":a.techDebt?.length||0,"Risk areas":a.riskAreas?.length||0,Conventions:a.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:a.patterns.length,antiPatterns:a.antiPatterns?.length||0,techDebt:a.techDebt?.length||0}})),{success:!0}}catch(n){return Me(n)}}async function Rv(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return t.result;let n=t.value,r=Ct.getActive(n);if(!r)return e.md?console.log(W("## 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(e.md){let o=[Ce(`LLM Analysis (${r.architecture.style})`),""];if(r.architecture.insights.length>0&&o.push(q("Architecture Insights",Oe(r.architecture.insights.slice(0,5)))),r.patterns.length>0){let i=r.patterns.slice(0,8);o.push(q(`Patterns (${r.patterns.length})`,Oe(i.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`))))}if(r.antiPatterns.length>0){let i=r.antiPatterns.slice(0,5);o.push(q(`Anti-Patterns (${r.antiPatterns.length})`,Oe(i.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`))))}if(r.techDebt.length>0){let i=r.techDebt.slice(0,5);o.push(q(`Tech Debt (${r.techDebt.length})`,Oe(i.map(a=>`[${a.priority}/${a.effort}] ${a.description}`))))}r.conventions.length>0&&o.push(q("Conventions",Oe(r.conventions.slice(0,5).map(i=>`**${i.category}**: ${i.rule}`)))),console.log(W(...o))}else{let o={...r,patterns:r.patterns.slice(0,10),antiPatterns:r.antiPatterns.slice(0,6),techDebt:r.techDebt.slice(0,6),conventions:r.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:o}))}return{success:!0,data:r}}catch(t){return Me(t)}}var Pv=h(()=>{"use strict";Ev();pr();Te();kt();Zt();c(Cv,"saveLlmAnalysis");c(Rv,"getLlmAnalysis")});import o$ from"node:path";async function xv(s,e){let t=Date.now()-e;await He.installGlobalConfig(),f.done(`Synced ${s.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let n=s.stats.frameworks.length>0?` (${s.stats.frameworks[0]})`:"",r=s.syncMetrics?.indexes,o=[`${s.stats.fileCount} files indexed`,`Stack: ${s.stats.ecosystem}${n} | Branch: ${s.git.branch}`];if(r?.bm25Files){let a=r.bm25Files*(r.bm25AvgTokens||0);o.push(`Index: ${xr(a)} tokens | ${r.bm25VocabSize||0} terms | ${r.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
973
- `));let i=[];if(s.generatedSkills?.generated&&s.generatedSkills.generated.length>0){let a=s.generatedSkills.generated.length,l=a===1?"skill":"skills";i.push(`${a} ${l} generated`)}if(s.context7&&i.push(`Context7: ${s.context7.verified?"verified":`not ready${s.context7.message?` (${s.context7.message})`:""}`}`),s.analysisSummary&&i.push(`Analysis: ${s.analysisSummary.patterns} patterns | ${s.analysisSummary.antiPatterns} anti-patterns (${s.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),s.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),s.verification){let a=s.verification;if(a.passed){let l=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(l,{bullet:"\u2713"})}else{f.section("Verification");let l=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(l),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return br("sync"),{success:!0,data:s,metrics:{elapsed:t,fileCount:s.stats.fileCount}}}async function Av(s){try{let e=await it.getRecentEvents(s,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),r=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];r=po(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let l=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:r,tasksCompleted:o,featuresShipped:i,agentsUsed:l}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function xr(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString()}function kp(s){return s<1e3?`${Math.round(s)}ms`:`${(s/1e3).toFixed(1)}s`}function jv(s){if(s.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=s.map(r=>r.tokensSaved),n=Math.max(...t,1);return t.map(r=>{let o=Math.min(Math.floor(r/n*(e.length-1)),e.length-1);return e[o]}).join("")}function $v(s,e,t,n,r,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),r){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),r.sessionDuration&&i.push(`| Duration | ${r.sessionDuration} |`),i.push(`| Tasks completed | ${r.tasksCompleted} |`),i.push(`| Features shipped | ${r.featuresShipped} |`),r.agentsUsed.length>0){let a=r.agentsUsed.slice(0,3).map(l=>`${l.name} (${l.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${xr(s.totalTokensSaved)} |`),i.push(`| Compression | ${(s.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${Ta(s.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${s.syncCount} |`),i.push(`| Avg time | ${kp(s.avgSyncDuration)} |`),i.push(""),s.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=s.topAgents.reduce((l,u)=>l+u.usageCount,0);for(let l of s.topAgents){let u=a>0?(l.usageCount/a*100).toFixed(0):0;i.push(`| ${l.agentName} | ${u}% (${l.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${xr(s.last30DaysTokens)}`),s.trend!==0){let a=s.trend>0?"+":"";i.push(`- Trend: ${a}${s.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
971
+ Options:`);for(let t of s.options)console.log(` prjct ship --intent=${t}`)}async function qj(s){if(!gp(s))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(Fe(),nl)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:s,timeout:3e3}),n=t.toString().trim();if(!n)return null;let{stdout:r}=await e("gh",["pr","list","--head",n,"--state","open","--json","number,title","--limit","1"],{cwd:s,timeout:5e3}),o=JSON.parse(r.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:n}}catch{return null}}var lc,Ds,uc=h(()=>{"use strict";Ha();Y();Ps();pt();$n();F();ue();Te();kt();Fo();pe();Nd();Ie();Zt();lc="ship:in_progress",Ds=class extends X{static{c(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=r.value;try{let v=j.getDoc(o,lc);v?.version&&(await wt.getByVersion(o,v.version)||(await wt.addShipped(o,{name:v.feature,version:v.version}),console.log(`\u2139\uFE0F Reconciled an interrupted ship: ${v.feature} (v${v.version})`)),j.deleteDoc(o,lc))}catch{}let i=e,a=await B.getCurrentTask(o),l=a?.linkedSpecId;if(a&&(i||(i=a.description||"current work"),await B.completeTask(o)),i||(i="current work"),l&&!n.noSpecGate)try{let{specService:v}=await Promise.resolve().then(()=>(Za(),Gd)),S=await v.get(t,l);if(S&&S.content.acceptance_criteria.length>0){let P=[];P.push(""),P.push(`## Spec acceptance gate \u2014 \`${S.title}\` (${S.id.slice(0,8)})`),P.push(""),P.push("Walk each criterion. STOP if any is unmet."),P.push("");for(let T of S.content.acceptance_criteria)P.push(`- [ ] ${T}`);P.push(""),P.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),P.push(""),console.log(P.join(`
972
+ `))}}catch{}let u=ee.getRulesForCommand(o,"ship");if(n.intent==="seed-code-workflow"){if(!await fp(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};u=ee.getRulesForCommand(o,"ship")}!u.some(v=>v.type==="step"&&v.position==="before")&&n.intent!=="register-only"&&await fp(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=ee.getRulesForCommand(o,"ship"));let p=await Bj(o,t,u,n);if(p)return Vj(p,n.md===!0),{success:!1,clarification:p};let m={feature:i},g=await ns(o,"ship","before",{projectPath:t,skipRules:n.skipHooks,runContext:m});if(!g.success)return{success:!1,error:`Ship blocked: ${g.gatesFailed.length>0?g.gatesFailed.join(", "):"unknown step"}`};let k=typeof m.version=="string"?m.version:"unversioned";try{j.setDoc(o,lc,{feature:i,version:k,startedAt:R()})}catch{}await wt.addShipped(o,{name:i,version:k});try{j.deleteDoc(o,lc)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:k,timestamp:R()});let E=await ns(o,"ship","after",{projectPath:t,skipRules:n.skipHooks,runContext:m}),y=[...g.instructions,...E.instructions];try{await Qn.sync(t)}catch(v){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",b(v))}try{let{regenerateWikiDeferred:v}=await Promise.resolve().then(()=>(Mn(),_s));await v(t,o)}catch(v){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",b(v))}let w=g.stepsRun.length+E.stepsRun.length;if(n.md){let v=Ua("ship",!0),S=W(Ce(`Shipped: ${i}`,`Version: ${k}`),q("Results",Oe([`Version: ${k}`,`Workflow steps run: ${w>0?[...g.stepsRun,...E.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${g.hooksFailed.length+E.hooksFailed.length}`])),y.length>0?q("Agent Instructions",Oe(y)):null,Be(v.map(P=>({label:P.desc,command:P.cmd}))));console.log(S)}else f.done(`v${k} shipped`),br("ship");return{success:!0,feature:i,version:k}}catch(r){return f.fail(b(r)),Me(r)}}};c(fv,"isCodeProject");c(gp,"isGitRepo");c(fp,"seedCodeShipRules");c(Bj,"buildClarification");c(Vj,"renderClarification");c(qj,"findOpenPrForBranch")});var yv={};D(yv,{PlanningCommands:()=>Ms});async function Jj(){if(!hp){let{AnalysisCommands:s}=await Promise.resolve().then(()=>(pc(),wv));hp=new s}return hp}var hp,Ms,dc=h(()=>{"use strict";Oi();Wt();re();ge();Lw();$n();F();Te();pe();gd();Uw();Ie();hp=null;c(Jj,"getAnalysisCommands");Ms=class extends X{static{c(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await I.isConfigured(t))return f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Wo(t).runNonInteractive());else if(a=await new Wo(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let l=await or(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await I.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,n),f.step(2,4,"Creating structure..."),await _.ensureProjectStructure(p),await this._seedShipWorkflow(p,t);let m=await this._detectEmptyDirectory(t),g=await this._detectExistingCode(t);if(g||!m){f.step(3,4,"Analyzing project...");let E=await Jj();if((await E.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await E.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let k=n.idea;if(m&&!g){if(!k)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};f.spin("architect mode...");let{projectMemory:E}=await Promise.resolve().then(()=>($e(),Oa));return await E.remember(t,{type:"idea",content:k,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await He.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:k,wizard:a}}return await He.installGlobalConfig(),await Nw(t).catch(()=>{}),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,wizard:a}}catch(n){return f.fail(b(n)),Me(n)}}_printNextSteps(e){if(console.log(""),console.log(" \u2713 skill installed at ~/.claude/skills/prjct/"),console.log(" \u2713 project CLAUDE.md updated with routing block"),console.log(""),console.log(" You don't run prjct commands. Claude does."),console.log(""),console.log(" Just describe what you're doing \u2014 Claude reads the intent and"),console.log(" runs the right verb. Routine captures (decision, learning,"),console.log(" gotcha, idea) save automatically; ship and other destructive"),console.log(" verbs surface a one-line plan and wait for your OK."),console.log(""),console.log(" If you want to drive manually:"),console.log(" prjct sync Refresh context + skill body"),console.log(" prjct task Start a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async _applyInitialPacksAndPersona(e,t){let{activatePacks:n,detectSuggestedPacks:r}=await Promise.resolve().then(()=>(Id(),tk)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await r(e)),o.length>0&&await n(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(re(),ws))).default,a=await i.readConfig(e);if(a){let l=a.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...a,persona:l})}}}async _seedShipWorkflow(e,t){let n=await Wa(t),r=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(uc(),hv));await o(e,t),r=ee.getRulesForCommand(e,"ship").reduce((i,a)=>Math.max(i,a.sortOrder??0),0)+1,ee.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:r++,createdAt:new Date().toISOString()}),n.lint&&ee.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:r++,createdAt:new Date().toISOString()}),n.test&&ee.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:r++,createdAt:new Date().toISOString()})}}});var yp,_n,Cd=h(()=>{"use strict";Gn();Oi();re();ge();F();V();pe();yp=class{static{c(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await I.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(wi(),yi));if(await o.detect(e)){let a=await o.getMainWorktree(e);if(a&&a!==e&&await I.isConfigured(a))return await o.setup(e,a),{success:!0}}}catch{}f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(dc(),yv)),r=await new t().init(null,e);return r.success?{success:!0}:r}async getProjectId(e){let t=await I.getProjectId(e);if(!t)throw xi.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await _.ensureProjectStructure(t),_.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await or();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await bn(e)).filter(r=>!r.startsWith(".")&&r!=="node_modules"&&r!=="package.json"&&r!=="package-lock.json"&&r!=="README.md").length===0}catch(t){return L(t)||console.error(`Directory check error: ${b(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await bn(e)).some(r=>t.includes(r))}catch(t){return L(t)||console.error(`Code check error: ${b(t)}`),!1}}async isConfigured(e){return await I.isConfigured(e)}async needsMigration(e){return await I.needsMigration(e)}},_n=new yp});async function Xj(s,e={}){let t=await I.getProjectId(s);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function we(s,e={}){let t=await _n.ensureInit(s);return t.success?Xj(s,e):{ok:!1,result:t}}async function wp(s,e={}){let t=await B.getCurrentTask(s);return t?{ok:!0,value:t}:{ok:!1,result:H('No active task \u2014 start one with `prjct task "<desc>"`',e)}}function mc(s,e,t={}){if(e&&gt.getWorkflow(s,e)?.enabled)return{ok:!0,value:{name:e}};let r=gt.getAllWorkflows(s).map(o=>o.name).join(", ");return{ok:!1,result:H(`Workflow '${e??""}' not found. Available: ${r}`,t)}}var Zt=h(()=>{"use strict";re();Cd();Ho();pt();Te();pe();c(Xj,"requireProjectId");c(we,"requireProject");c(wp,"requireActiveTask");c(mc,"requireWorkflow")});async function kv(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let n=t.value,r=await Ke.seal(n);return e.json?(console.log(JSON.stringify({success:r.success,signature:r.signature,error:r.error})),{success:r.success,error:r.error}):r.success?(f.done("Analysis sealed"),console.log(` Signature: ${r.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:r.signature}}):(f.fail(r.error||"Seal failed"),{success:!1,error:r.error})}catch(t){let n=b(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async function vv(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let n=t.value,r=await Ke.rollback(n);return e.json?(console.log(JSON.stringify({success:r.success,restoredSignature:r.restoredSignature,error:r.error})),{success:r.success,error:r.error}):e.md?r.success?(console.log(W(Ce("Analysis Rolled Back"),Zn({"Restored signature":`${r.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:r.restoredSignature}}):(console.log(W("## Rollback Failed",`> ${r.error}`)),{success:!1,error:r.error}):r.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${r.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:r.restoredSignature}}):(f.fail(r.error||"Rollback failed"),{success:!1,error:r.error})}catch(t){let n=b(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):e.md?console.log(W("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async function bv(s=process.cwd(),e={}){if(e.semantic)return kp(s,e);try{let t=await we(s);if(!t.ok)return t.result;let n=t.value,r=await Ke.verify(n);return e.json?(console.log(JSON.stringify(r)),{success:r.valid}):(r.valid?f.done(r.message):f.fail(r.message),console.log(""),{success:r.valid,data:r})}catch(t){let n=b(t);return N(n)}}async function kp(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return e.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),t.result;let n=t.value,r=s;try{r=j.getDoc(n,"project")?.repoPath||s}catch{}let o=await Ke.semanticVerify(n,r);if(e.json)return console.log(JSON.stringify(o)),{success:o.passed,data:o};console.log(""),o.passed?(f.done("Semantic verification passed"),console.log(` ${o.passedCount}/${o.checks.length} checks passed (${o.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${o.failedCount}/${o.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let i of o.checks){let a=i.passed?"\u2713":"\u2717",l=i.passed?`${i.output} (${i.durationMs}ms)`:i.error||"Failed";console.log(` ${a} ${i.name}: ${l}`)}return console.log(""),{success:o.passed,data:o}}catch(t){let n=b(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}var Sv=h(()=>{"use strict";Jn();Y();F();Te();kt();pe();Zt();c(kv,"seal");c(vv,"rollback");c(bv,"verify");c(kp,"semanticVerifyCommand")});import{z as M}from"zod";function Tv(s){let e=r$.safeParse(s);return e.success?{ok:!0,value:e.data}:{ok:!1,error:e.error.issues.map(n=>`${n.path.length>0?n.path.join("."):"<root>"}: ${n.message}`).join("; ")}}var zj,Kj,Yj,Qj,Zj,e$,t$,n$,s$,r$,Ev=h(()=>{"use strict";zj=M.object({style:M.string(),insights:M.array(M.string()),domains:M.array(M.string())}),Kj=M.object({name:M.string(),description:M.string(),locations:M.array(M.string()),confidence:M.number().min(0).max(1),category:M.string()}),Yj=M.object({issue:M.string(),reasoning:M.string(),files:M.array(M.string()),suggestion:M.string(),severity:M.enum(["low","medium","high"]),confidence:M.number().min(0).max(1)}),Qj=M.object({description:M.string(),area:M.string(),effort:M.enum(["small","medium","large"]),impact:M.string(),priority:M.enum(["low","medium","high"])}),Zj=M.object({path:M.string(),reason:M.string(),risk:M.string(),severity:M.enum(["low","medium","high"])}),e$=M.object({description:M.string(),files:M.array(M.string()),benefit:M.string(),effort:M.enum(["small","medium","large"])}),t$=M.object({category:M.string(),rule:M.string(),example:M.string().optional()}),n$=M.object({build:M.string().optional(),test:M.string().optional(),lint:M.string().optional(),dev:M.string().optional(),format:M.string().optional(),install:M.string().optional()}),s$=M.object({languages:M.array(M.string()),frameworks:M.array(M.string()),packageManager:M.string().optional()}),r$=M.object({version:M.literal(1),commitHash:M.string().nullable(),analyzedAt:M.string(),architecture:zj,patterns:M.array(Kj),antiPatterns:M.array(Yj),techDebt:M.array(Qj),riskAreas:M.array(Zj),refactorSuggestions:M.array(e$),projectInsights:M.array(M.string()),conventions:M.array(t$),commands:n$.optional(),stack:s$.optional()});c(Tv,"parseLlmAnalysis")});async function Cv(s,e=process.cwd(),t={}){try{let n=await we(e);if(!n.ok)return n.result;let r=n.value,o;try{o=JSON.parse(s)}catch(u){return{success:!1,error:`Invalid JSON: ${u instanceof Error?u.message:"parse failed"}`}}let i=Tv(o);if(!i.ok)return{success:!1,error:`Invalid LLM analysis schema: ${i.error}`};let a=i.value;Ct.save(r,a);let{regenerateWikiDeferred:l}=await Promise.resolve().then(()=>(Mn(),_s));return await l(e,r),t.md?console.log(W(Ce("LLM Analysis Saved"),Zn({Architecture:a.architecture.style,Patterns:a.patterns.length,"Anti-patterns":a.antiPatterns?.length||0,"Tech debt items":a.techDebt?.length||0,"Risk areas":a.riskAreas?.length||0,Conventions:a.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:a.patterns.length,antiPatterns:a.antiPatterns?.length||0,techDebt:a.techDebt?.length||0}})),{success:!0}}catch(n){return Me(n)}}async function Rv(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return t.result;let n=t.value,r=Ct.getActive(n);if(!r)return e.md?console.log(W("## 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(e.md){let o=[Ce(`LLM Analysis (${r.architecture.style})`),""];if(r.architecture.insights.length>0&&o.push(q("Architecture Insights",Oe(r.architecture.insights.slice(0,5)))),r.patterns.length>0){let i=r.patterns.slice(0,8);o.push(q(`Patterns (${r.patterns.length})`,Oe(i.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`))))}if(r.antiPatterns.length>0){let i=r.antiPatterns.slice(0,5);o.push(q(`Anti-Patterns (${r.antiPatterns.length})`,Oe(i.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`))))}if(r.techDebt.length>0){let i=r.techDebt.slice(0,5);o.push(q(`Tech Debt (${r.techDebt.length})`,Oe(i.map(a=>`[${a.priority}/${a.effort}] ${a.description}`))))}r.conventions.length>0&&o.push(q("Conventions",Oe(r.conventions.slice(0,5).map(i=>`**${i.category}**: ${i.rule}`)))),console.log(W(...o))}else{let o={...r,patterns:r.patterns.slice(0,10),antiPatterns:r.antiPatterns.slice(0,6),techDebt:r.techDebt.slice(0,6),conventions:r.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:o}))}return{success:!0,data:r}}catch(t){return Me(t)}}var Pv=h(()=>{"use strict";Ev();pr();Te();kt();Zt();c(Cv,"saveLlmAnalysis");c(Rv,"getLlmAnalysis")});import o$ from"node:path";async function xv(s,e){let t=Date.now()-e;await He.installGlobalConfig(),f.done(`Synced ${s.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let n=s.stats.frameworks.length>0?` (${s.stats.frameworks[0]})`:"",r=s.syncMetrics?.indexes,o=[`${s.stats.fileCount} files indexed`,`Stack: ${s.stats.ecosystem}${n} | Branch: ${s.git.branch}`];if(r?.bm25Files){let a=r.bm25Files*(r.bm25AvgTokens||0);o.push(`Index: ${xr(a)} tokens | ${r.bm25VocabSize||0} terms | ${r.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
973
+ `));let i=[];if(s.generatedSkills?.generated&&s.generatedSkills.generated.length>0){let a=s.generatedSkills.generated.length,l=a===1?"skill":"skills";i.push(`${a} ${l} generated`)}if(s.context7&&i.push(`Context7: ${s.context7.verified?"verified":`not ready${s.context7.message?` (${s.context7.message})`:""}`}`),s.analysisSummary&&i.push(`Analysis: ${s.analysisSummary.patterns} patterns | ${s.analysisSummary.antiPatterns} anti-patterns (${s.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),s.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),s.verification){let a=s.verification;if(a.passed){let l=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(l,{bullet:"\u2713"})}else{f.section("Verification");let l=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(l),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return br("sync"),{success:!0,data:s,metrics:{elapsed:t,fileCount:s.stats.fileCount}}}async function Av(s){try{let e=await it.getRecentEvents(s,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),r=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];r=po(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let l=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:r,tasksCompleted:o,featuresShipped:i,agentsUsed:l}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function xr(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString()}function vp(s){return s<1e3?`${Math.round(s)}ms`:`${(s/1e3).toFixed(1)}s`}function jv(s){if(s.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=s.map(r=>r.tokensSaved),n=Math.max(...t,1);return t.map(r=>{let o=Math.min(Math.floor(r/n*(e.length-1)),e.length-1);return e[o]}).join("")}function $v(s,e,t,n,r,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),r){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),r.sessionDuration&&i.push(`| Duration | ${r.sessionDuration} |`),i.push(`| Tasks completed | ${r.tasksCompleted} |`),i.push(`| Features shipped | ${r.featuresShipped} |`),r.agentsUsed.length>0){let a=r.agentsUsed.slice(0,3).map(l=>`${l.name} (${l.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${xr(s.totalTokensSaved)} |`),i.push(`| Compression | ${(s.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${Ea(s.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${s.syncCount} |`),i.push(`| Avg time | ${vp(s.avgSyncDuration)} |`),i.push(""),s.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=s.topAgents.reduce((l,u)=>l+u.usageCount,0);for(let l of s.topAgents){let u=a>0?(l.usageCount/a*100).toFixed(0):0;i.push(`| ${l.agentName} | ${u}% (${l.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${xr(s.last30DaysTokens)}`),s.trend!==0){let a=s.trend>0?"+":"";i.push(`- Trend: ${a}${s.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
974
974
  `)}function Iv(s,e){let t=[];t.push(`# Repository Analysis
975
975
  `),t.push(`Generated: ${new Date().toLocaleString()}
976
976
  `);let n=o$.basename(e);if(t.push(`## Project: ${n}
@@ -989,7 +989,7 @@ Options:`);for(let t of s.options)console.log(` prjct ship --intent=${t}`)}asyn
989
989
  `).slice(0,5).forEach(a=>{if(a.trim()){let[l,,u,d]=a.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
990
990
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
991
991
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
992
- `)}var vp=h(()=>{"use strict";Wt();Ea();Kn();ue();Fo();pe();c(xv,"showSyncResult");c(Av,"getSessionActivity");c(xr,"formatTokens");c(kp,"formatDuration");c(jv,"generateSparkline");c($v,"generateStatsMarkdown");c(Iv,"generateAnalysisSummary")});async function _v(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return t.result;let n=t.value,r=await wr.getSummary(n),o=await wr.getDailyStats(n,30),i=await Av(n),a={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:a,totalTokensSaved:r.totalTokensSaved,estimatedCostSaved:r.estimatedCostSaved,compressionRate:r.compressionRate,syncCount:r.syncCount,avgSyncDuration:r.avgSyncDuration,topAgents:r.topAgents.slice(0,5),last30DaysTokens:r.last30DaysTokens,trend:r.trend,dailyStats:o.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=j.getDoc(n,"project")?.name||"Unknown"}catch{}let u=await wr.read(n),d=u.firstSync?new Date(u.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: ${l.padEnd(20).slice(0,20)} | Since: ${d.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"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(a.decisions>0||a.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${a.learnedDecisions} confirmed (${a.decisions} total)`),console.log(` Preferences: ${a.preferences} saved`),console.log(` Workflows: ${a.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${xr(r.totalTokensSaved)} tokens`),console.log(` Compression: ${(r.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Ta(r.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${r.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${kp(r.avgSyncDuration)}`),console.log(""),r.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=r.topAgents.reduce((m,g)=>m+g.usageCount,0);for(let m of r.topAgents){let g=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${g}% (${m.usageCount} uses)`)}console.log("")}if(o.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=jv(o);if(console.log(` ${p} ${xr(r.last30DaysTokens)} tokens saved`),r.trend!==0){let m=r.trend>0?"\u2191":"\u2193",g=r.trend>0?"+":"";console.log(` ${m} ${g}${r.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(""),e.export){let p=$v(r,o,l,d,i,a);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...r,session:i,patterns:a}}}catch(t){return console.error("\u274C Error:",b(t)),Me(t)}}async function Dv(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let n=t.value,r=await Ke.diff(n);if(!r){let o="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:o})):e.md?console.log(W("## Analysis Diff",`> ${o}`)):f.warn(o),{success:!1,error:o}}if(e.json)return console.log(JSON.stringify({success:!0,...r})),{success:!0,data:r};if(e.md)return console.log(W(Vi(r))),{success:!0,data:r};if(!r.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(kf(r)),console.log("");let o=[];r.summary.added>0&&o.push(`${r.summary.added} added`),r.summary.removed>0&&o.push(`${r.summary.removed} removed`),r.summary.changed>0&&o.push(`${r.summary.changed} changed`),f.done(o.join(", "))}return console.log(""),{success:!0,data:r}}catch(t){let n=b(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):e.md?console.log(W("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}var Mv=h(()=>{"use strict";Ea();qi();Jn();Y();Wu();F();Te();kt();pe();vp();Zt();c(_v,"stats");c(Dv,"diff")});var wv={};D(wv,{AnalysisCommands:()=>Os});import Ov from"node:fs/promises";var Nv,Os,dc=h(()=>{"use strict";yf();re();ge();qi();Rh();Fa();Jn();pr();F();ue();Te();kt();Fo();pe();Sv();Pv();Mv();vp();Ie();Zt();Nv=`{version:1, commitHash, analyzedAt,
992
+ `)}var bp=h(()=>{"use strict";Wt();Ca();Kn();ue();Fo();pe();c(xv,"showSyncResult");c(Av,"getSessionActivity");c(xr,"formatTokens");c(vp,"formatDuration");c(jv,"generateSparkline");c($v,"generateStatsMarkdown");c(Iv,"generateAnalysisSummary")});async function _v(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return t.result;let n=t.value,r=await wr.getSummary(n),o=await wr.getDailyStats(n,30),i=await Av(n),a={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:a,totalTokensSaved:r.totalTokensSaved,estimatedCostSaved:r.estimatedCostSaved,compressionRate:r.compressionRate,syncCount:r.syncCount,avgSyncDuration:r.avgSyncDuration,topAgents:r.topAgents.slice(0,5),last30DaysTokens:r.last30DaysTokens,trend:r.trend,dailyStats:o.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=j.getDoc(n,"project")?.name||"Unknown"}catch{}let u=await wr.read(n),d=u.firstSync?new Date(u.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: ${l.padEnd(20).slice(0,20)} | Since: ${d.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"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(a.decisions>0||a.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${a.learnedDecisions} confirmed (${a.decisions} total)`),console.log(` Preferences: ${a.preferences} saved`),console.log(` Workflows: ${a.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${xr(r.totalTokensSaved)} tokens`),console.log(` Compression: ${(r.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Ea(r.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${r.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vp(r.avgSyncDuration)}`),console.log(""),r.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=r.topAgents.reduce((m,g)=>m+g.usageCount,0);for(let m of r.topAgents){let g=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${g}% (${m.usageCount} uses)`)}console.log("")}if(o.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=jv(o);if(console.log(` ${p} ${xr(r.last30DaysTokens)} tokens saved`),r.trend!==0){let m=r.trend>0?"\u2191":"\u2193",g=r.trend>0?"+":"";console.log(` ${m} ${g}${r.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(""),e.export){let p=$v(r,o,l,d,i,a);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...r,session:i,patterns:a}}}catch(t){return console.error("\u274C Error:",b(t)),Me(t)}}async function Dv(s=process.cwd(),e={}){try{let t=await we(s);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let n=t.value,r=await Ke.diff(n);if(!r){let o="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:o})):e.md?console.log(W("## Analysis Diff",`> ${o}`)):f.warn(o),{success:!1,error:o}}if(e.json)return console.log(JSON.stringify({success:!0,...r})),{success:!0,data:r};if(e.md)return console.log(W(qi(r))),{success:!0,data:r};if(!r.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(kf(r)),console.log("");let o=[];r.summary.added>0&&o.push(`${r.summary.added} added`),r.summary.removed>0&&o.push(`${r.summary.removed} removed`),r.summary.changed>0&&o.push(`${r.summary.changed} changed`),f.done(o.join(", "))}return console.log(""),{success:!0,data:r}}catch(t){let n=b(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):e.md?console.log(W("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}var Mv=h(()=>{"use strict";Ca();Ji();Jn();Y();Gu();F();Te();kt();pe();bp();Zt();c(_v,"stats");c(Dv,"diff")});var wv={};D(wv,{AnalysisCommands:()=>Os});import Ov from"node:fs/promises";var Nv,Os,pc=h(()=>{"use strict";yf();re();ge();Ji();Rh();Ha();Jn();pr();F();ue();Te();kt();Fo();pe();Sv();Pv();Mv();bp();Ie();Zt();Nv=`{version:1, commitHash, analyzedAt,
993
993
  architecture:{style:"monolith|monorepo|microservices|modular-monolith", insights:[], domains:[]},
994
994
  patterns:[{name, description, locations:[], confidence:0-1, category:"architecture|data-flow|error-handling|testing"}],
995
995
  antiPatterns:[{issue, reasoning, files:[], suggestion, severity:"low|medium|high", confidence:0-1}],
@@ -999,8 +999,8 @@ Options:`);for(let t of s.options)console.log(` prjct ship --intent=${t}`)}asyn
999
999
  commands:{build, test, lint, dev, format, install}, stack:{languages:[], frameworks:[], packageManager}}`,Os=class extends X{static{c(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1000
1000
  `),ze.init(t);let n={packageJson:await ze.readPackageJson(),cargoToml:await ze.readCargoToml(),goMod:await ze.readGoMod(),requirements:await ze.readRequirements(),directories:await ze.listDirectories(),fileCount:await ze.countFiles(),gitStats:await ze.getGitStats(),gitLog:await ze.getGitLog(20),hasDockerfile:await ze.fileExists("Dockerfile"),hasDockerCompose:await ze.fileExists("docker-compose.yml"),hasReadme:await ze.fileExists("README.md"),hasTsconfig:await ze.fileExists("tsconfig.json"),hasViteConfig:await ze.fileExists("vite.config.ts")||await ze.fileExists("vite.config.js"),hasNextConfig:await ze.fileExists("next.config.js")||await ze.fileExists("next.config.mjs")},r=Iv(n,t),o=await I.readConfig(t).catch(()=>null),i=await _.getWikiPath(t,o?.vaultPath),a=`${i}/_generated/analysis/repo-summary.md`;return await Ov.mkdir(`${i}/_generated/analysis`,{recursive:!0}),await Ov.writeFile(a,r,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:R(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits}),console.log(`\u2705 Analysis complete!
1001
1001
  `),console.log(`\u{1F4C4} Full report: ${_.getDisplayPath(a)}
1002
- `),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:a,data:n}}catch(n){return console.error("\u274C Error:",b(n)),Me(n)}}async sync(e=process.cwd(),t={}){try{let n=await we(e);if(!n.ok)return n.result;let r=n.value,o=Date.now();if(t.package){let a=await _.detectMonorepo(e);if(!a.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let l=a.packages.find(d=>d.name===t.package||d.relativePath===t.package);if(!l){let d=a.packages.map(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Qn.sync(e,{packagePath:l.path,packageName:l.name});return t.json?console.log(JSON.stringify({success:u.success,package:l.name,path:l.relativePath})):t.md?console.log(W(Ce(`Synced package: ${l.name}`))):f.done(`Synced package: ${l.name}`),{success:u.success}}t.md||f.spin("Syncing project...");let i=await Qn.sync(e,{full:t.full});if(!i.success)return t.md?console.log(W("## Sync Failed",`> ${i.error||"Unknown error"}`)):f.fail(i.error||"Sync failed"),{success:!1,error:i.error};if(t.md||f.stop(),t.md){let a=Date.now()-o,l=i.generatedSkills?.generated?.length??0,u=null;try{let w=await Ke.diff(r);w?.hasChanges&&(u=Vi(w))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&Ct.isCurrent(r,d),m=null;if(!p)try{let w=await wu(r,e,i.git,i.stats);m=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Nv,"```","### Data","```json",JSON.stringify(w),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`"].join(`
1003
- `)}catch{m="### Next: Run `prjct analysis-payload --md` to update project analysis"}let g=Ha("sync",!0),k=i.syncMetrics?.indexes,E={Duration:`${(a/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(k?.bm25Files){let w=k.bm25Files*(k.bm25AvgTokens||0);E["Tokens indexed"]=`${Math.round(w/1e3)}K`,E["Import edges"]=k.importEdges||0,E["Co-change commits"]=k.cochangeCommits||0}let y=W(Ce("Sync Complete"),Zn(E),u,i.git.hasChanges?Aw("Uncommitted changes detected"):null,m,Be(g.map(w=>({label:w.desc,command:w.cmd}))));return console.log(y),{success:!0,data:i,metrics:{elapsed:a,skillCount:l,fileCount:i.stats.fileCount}}}return xv(i,o)}catch(n){return t.md?console.log(W("## Sync Failed",`> ${b(n)}`)):f.fail(b(n)),Me(n)}}async analysisPayload(e=process.cwd(),t={}){try{let n=await we(e);if(!n.ok)return n.result;let r=n.value,o=await Qn.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&&Ct.isCurrent(r,i))return t.md?console.log(W(Ce("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 wu(r,e,o.git,o.stats);return t.md?console.log(W("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Nv,"```","### 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(n){return Me(n)}}async regenVault(e=process.cwd(),t={}){try{let n=await we(e);if(!n.ok)return n.result;let r=n.value,o=await import("node:fs/promises"),i=(await Promise.resolve().then(()=>(ge(),ml))).default,l=await(await Promise.resolve().then(()=>(re(),ws))).default.readConfig(e).catch(()=>null),d=`${await i.getWikiPath(e,l?.vaultPath)}/_generated`;await o.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(Mn(),_s)),m=await p(e,r);return t.md?console.log(`---
1002
+ `),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:a,data:n}}catch(n){return console.error("\u274C Error:",b(n)),Me(n)}}async sync(e=process.cwd(),t={}){try{let n=await we(e);if(!n.ok)return n.result;let r=n.value,o=Date.now();if(t.package){let a=await _.detectMonorepo(e);if(!a.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let l=a.packages.find(d=>d.name===t.package||d.relativePath===t.package);if(!l){let d=a.packages.map(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Qn.sync(e,{packagePath:l.path,packageName:l.name});return t.json?console.log(JSON.stringify({success:u.success,package:l.name,path:l.relativePath})):t.md?console.log(W(Ce(`Synced package: ${l.name}`))):f.done(`Synced package: ${l.name}`),{success:u.success}}t.md||f.spin("Syncing project...");let i=await Qn.sync(e,{full:t.full});if(!i.success)return t.md?console.log(W("## Sync Failed",`> ${i.error||"Unknown error"}`)):f.fail(i.error||"Sync failed"),{success:!1,error:i.error};if(t.md||f.stop(),t.md){let a=Date.now()-o,l=i.generatedSkills?.generated?.length??0,u=null;try{let w=await Ke.diff(r);w?.hasChanges&&(u=qi(w))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&Ct.isCurrent(r,d),m=null;if(!p)try{let w=await ku(r,e,i.git,i.stats);m=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Nv,"```","### Data","```json",JSON.stringify(w),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`"].join(`
1003
+ `)}catch{m="### Next: Run `prjct analysis-payload --md` to update project analysis"}let g=Ua("sync",!0),k=i.syncMetrics?.indexes,E={Duration:`${(a/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(k?.bm25Files){let w=k.bm25Files*(k.bm25AvgTokens||0);E["Tokens indexed"]=`${Math.round(w/1e3)}K`,E["Import edges"]=k.importEdges||0,E["Co-change commits"]=k.cochangeCommits||0}let y=W(Ce("Sync Complete"),Zn(E),u,i.git.hasChanges?Aw("Uncommitted changes detected"):null,m,Be(g.map(w=>({label:w.desc,command:w.cmd}))));return console.log(y),{success:!0,data:i,metrics:{elapsed:a,skillCount:l,fileCount:i.stats.fileCount}}}return xv(i,o)}catch(n){return t.md?console.log(W("## Sync Failed",`> ${b(n)}`)):f.fail(b(n)),Me(n)}}async analysisPayload(e=process.cwd(),t={}){try{let n=await we(e);if(!n.ok)return n.result;let r=n.value,o=await Qn.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&&Ct.isCurrent(r,i))return t.md?console.log(W(Ce("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 ku(r,e,o.git,o.stats);return t.md?console.log(W("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Nv,"```","### 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(n){return Me(n)}}async regenVault(e=process.cwd(),t={}){try{let n=await we(e);if(!n.ok)return n.result;let r=n.value,o=await import("node:fs/promises"),i=(await Promise.resolve().then(()=>(ge(),gl))).default,l=await(await Promise.resolve().then(()=>(re(),ws))).default.readConfig(e).catch(()=>null),d=`${await i.getWikiPath(e,l?.vaultPath)}/_generated`;await o.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(Mn(),_s)),m=await p(e,r);return t.md?console.log(`---
1004
1004
 
1005
1005
  ## Vault regenerated
1006
1006
 
@@ -1010,15 +1010,15 @@ Options:`);for(let t of s.options)console.log(` prjct ship --intent=${t}`)}asyn
1010
1010
  | Files written | ${m.filesWritten} |
1011
1011
  | Files skipped | ${m.filesSkipped} |
1012
1012
  | Files removed | ${m.filesRemoved} |
1013
- `):console.log(JSON.stringify({success:!0,message:"Vault regenerated",...m})),{success:!0}}catch(n){return Me(n)}}async saveLlmAnalysis(...e){return Cv(...e)}async getLlmAnalysis(...e){return Rv(...e)}async stats(...e){return _v(...e)}async diff(...e){return Dv(...e)}async seal(...e){return kv(...e)}async rollback(...e){return vv(...e)}async verify(...e){return bv(...e)}async semanticVerify(...e){return wp(...e)}}});function i$(s){if(!s)return{};let e={};for(let t of s.split(",")){let n=t.trim(),r=n.indexOf(":");r>0&&(e[n.slice(0,r)]=n.slice(r+1))}return e}var Ar,bp=h(()=>{"use strict";$e();F();Te();pe();tc();Ie();Ar=class extends X{static{c(this,"CaptureCommands")}async capture(e=null,t=process.cwd(),n={}){try{if(!e||!e.trim())return f.info('Usage: prjct capture "<anything>" [--tags k:v,...]'),{success:!1,error:"Content required"};let r=e.trim(),o=Rr(r);if(o.length>0&&!n.force)return f.fail(`refusing to capture content that looks like a secret (${o.join(", ")}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"};let i=i$(n.tags),a=await this.ensureProjectInit(t);if(!a.success)return a;await J.remember(t,{type:"inbox",content:r,tags:i,provenance:"declared"});let l=r.length>60?`${r.slice(0,57)}\u2026`:r;return n.md?console.log(`\u2713 captured: ${l}`):f.done(`captured: ${l}`),{success:!0,type:"inbox",content:r,tags:i}}catch(r){let o=b(r);return N(o)}}};c(i$,"parseFlagTags")});function a$(s){let e=s.toLowerCase();if(e==="true"||e==="on")return"on";if(e==="false"||e==="off")return"off";let t=Number(s);return!Number.isNaN(t)&&/^-?\d+(\.\d+)?$/.test(s)?t:s}var jr,Sp=h(()=>{"use strict";Bc();kt();pe();Ie();jr=class extends X{static{c(this,"ConfigCommands")}async config(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??"list";switch(o){case"list":return this.list(n);case"get":return this.get(r[1],n);case"set":return this.set(r[1],r.slice(2).join(" "),n);case"unset":return this.unset(r[1],n);default:return f.fail(`Unknown config subcommand: ${o}. Use: list, get <k>, set <k> <v>, unset <k>.`),{success:!1,error:"Unknown config subcommand"}}}list(e){let t=Wm(),n=Object.keys(t).sort();if(e.md){let r=n.length===0?"_No global config set._":n.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
1014
- `);console.log(W(q("Global config",r),q("Path",`\`${Bm()}\``)))}else if(n.length===0)f.info("No global config set.");else for(let r of n)console.log(` ${r} = ${JSON.stringify(t[r])}`);return{success:!0,config:t}}get(e,t){if(!e)return f.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let n=io(e);return t.md?console.log(W(q(e,n===void 0?"_(unset)_":`\`${JSON.stringify(n)}\``))):n===void 0?f.info("(unset)"):console.log(JSON.stringify(n)),{success:!0,key:e,value:n}}set(e,t,n){if(!e||t===void 0||t==="")return f.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let r=a$(t);ao(e,r);let o=`${e} = ${JSON.stringify(r)}`;return n.md?console.log(W(q("Set",o))):f.done(o),{success:!0,key:e,value:r}}unset(e,t){if(!e)return f.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};Gm(e);let n=`Removed ${e}`;return t.md?console.log(W(q("Unset",n))):f.done(n),{success:!0,key:e}}};c(a$,"parseValue")});var Fv={};D(Fv,{ContextCommands:()=>os,contextCommands:()=>Lv,default:()=>u$});import c$ from"node:fs/promises";import l$ from"node:path";var os,Lv,u$,mc=h(()=>{"use strict";re();ge();pt();F();kt();os=class{static{c(this,"ContextCommands")}async context(e=null,t=process.cwd(),n={}){try{let r=await I.readConfig(t);if(!r||!r.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `prjct init` first."};let o=r.projectId,i=_.getGlobalProjectPath(o),a=await B.read(o),l=a?.currentTask?{id:a.currentTask.id,description:a.currentTask.description,startedAt:a.currentTask.startedAt,subtasks:a.currentTask.subtasks?.map(p=>({id:p.id,description:p.description,status:p.status,domain:p.domain})),currentSubtaskIndex:a.currentTask.currentSubtaskIndex}:null,u=await this.loadRepoAnalysis(i),d={projectId:o,globalPath:i,currentTask:l,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:u?.ecosystem||"unknown",frameworks:u?.frameworks||[],hasTests:u?.hasTests||!1,technologies:u?.technologies||[]}};return n.md?console.log(this.formatContextMd(d)):console.log(JSON.stringify(d)),{success:!0,message:""}}catch(r){return{success:!1,message:`Context error: ${b(r)}`}}}formatContextMd(e){let t=[];if(t.push(q("Project",ld(cd("ID",e.projectId),cd("Path",e.globalPath)))),e.currentTask){let n=e.currentTask;if(t.push(No({description:n.description,status:"in-progress"})),n.subtasks&&n.subtasks.length>0){let r=n.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(r.join(`
1015
- `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(q("Stack",Zn({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),W(...t)}async loadRepoAnalysis(e){try{let t=l$.join(e,"analysis","repo-analysis.json"),n=await c$.readFile(t,"utf-8"),r=JSON.parse(n);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return L(t),null}}},Lv=new os,u$=Lv});var Tp={};D(Tp,{InstallCommands:()=>Ns});var Ns,Ko=h(()=>{"use strict";jl();F();Te();pe();Ie();Ns=class extends X{static{c(this,"InstallCommands")}async install(e=null,t=process.cwd(),n={}){try{let r=await Pl(),o=ko.length,i=`installed ${r.hooksWritten} new, ${r.alreadyPresent} already present (total ${o} hooks)`;return n.md?console.log(["# prjct hooks installed","",`Wrote to \`${r.settingsPath}\`.`,"",`- new: ${r.hooksWritten}`,`- already present: ${r.alreadyPresent}`,`- total expected: ${o}`,"","> Only `_prjctManaged: true` entries were touched. Your other hooks are untouched."].join(`
1016
- `)):(f.done(i),f.info(`settings: ${r.settingsPath}`)),{success:!0,hooksWritten:r.hooksWritten}}catch(r){let o=b(r);return N(o)}}async uninstall(e=null,t=process.cwd(),n={}){try{let r=await xl(),o=`removed ${r.hooksRemoved} prjct hook(s)`;return n.md?console.log(`# prjct hooks removed
1013
+ `):console.log(JSON.stringify({success:!0,message:"Vault regenerated",...m})),{success:!0}}catch(n){return Me(n)}}async saveLlmAnalysis(...e){return Cv(...e)}async getLlmAnalysis(...e){return Rv(...e)}async stats(...e){return _v(...e)}async diff(...e){return Dv(...e)}async seal(...e){return kv(...e)}async rollback(...e){return vv(...e)}async verify(...e){return bv(...e)}async semanticVerify(...e){return kp(...e)}}});function i$(s){if(!s)return{};let e={};for(let t of s.split(",")){let n=t.trim(),r=n.indexOf(":");r>0&&(e[n.slice(0,r)]=n.slice(r+1))}return e}var Ar,Sp=h(()=>{"use strict";$e();F();Te();pe();nc();Ie();Ar=class extends X{static{c(this,"CaptureCommands")}async capture(e=null,t=process.cwd(),n={}){try{if(!e||!e.trim())return f.info('Usage: prjct capture "<anything>" [--tags k:v,...]'),{success:!1,error:"Content required"};let r=e.trim(),o=Rr(r);if(o.length>0&&!n.force)return f.fail(`refusing to capture content that looks like a secret (${o.join(", ")}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"};let i=i$(n.tags),a=await this.ensureProjectInit(t);if(!a.success)return a;await J.remember(t,{type:"inbox",content:r,tags:i,provenance:"declared"});let l=r.length>60?`${r.slice(0,57)}\u2026`:r;return n.md?console.log(`\u2713 captured: ${l}`):f.done(`captured: ${l}`),{success:!0,type:"inbox",content:r,tags:i}}catch(r){let o=b(r);return N(o)}}};c(i$,"parseFlagTags")});function a$(s){let e=s.toLowerCase();if(e==="true"||e==="on")return"on";if(e==="false"||e==="off")return"off";let t=Number(s);return!Number.isNaN(t)&&/^-?\d+(\.\d+)?$/.test(s)?t:s}var jr,Tp=h(()=>{"use strict";Vc();kt();pe();Ie();jr=class extends X{static{c(this,"ConfigCommands")}async config(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??"list";switch(o){case"list":return this.list(n);case"get":return this.get(r[1],n);case"set":return this.set(r[1],r.slice(2).join(" "),n);case"unset":return this.unset(r[1],n);default:return f.fail(`Unknown config subcommand: ${o}. Use: list, get <k>, set <k> <v>, unset <k>.`),{success:!1,error:"Unknown config subcommand"}}}list(e){let t=Wm(),n=Object.keys(t).sort();if(e.md){let r=n.length===0?"_No global config set._":n.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
1014
+ `);console.log(W(q("Global config",r),q("Path",`\`${Bm()}\``)))}else if(n.length===0)f.info("No global config set.");else for(let r of n)console.log(` ${r} = ${JSON.stringify(t[r])}`);return{success:!0,config:t}}get(e,t){if(!e)return f.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let n=io(e);return t.md?console.log(W(q(e,n===void 0?"_(unset)_":`\`${JSON.stringify(n)}\``))):n===void 0?f.info("(unset)"):console.log(JSON.stringify(n)),{success:!0,key:e,value:n}}set(e,t,n){if(!e||t===void 0||t==="")return f.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let r=a$(t);ao(e,r);let o=`${e} = ${JSON.stringify(r)}`;return n.md?console.log(W(q("Set",o))):f.done(o),{success:!0,key:e,value:r}}unset(e,t){if(!e)return f.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};Gm(e);let n=`Removed ${e}`;return t.md?console.log(W(q("Unset",n))):f.done(n),{success:!0,key:e}}};c(a$,"parseValue")});var Fv={};D(Fv,{ContextCommands:()=>os,contextCommands:()=>Lv,default:()=>u$});import c$ from"node:fs/promises";import l$ from"node:path";var os,Lv,u$,gc=h(()=>{"use strict";re();ge();pt();F();kt();os=class{static{c(this,"ContextCommands")}async context(e=null,t=process.cwd(),n={}){try{let r=await I.readConfig(t);if(!r||!r.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `prjct init` first."};let o=r.projectId,i=_.getGlobalProjectPath(o),a=await B.read(o),l=a?.currentTask?{id:a.currentTask.id,description:a.currentTask.description,startedAt:a.currentTask.startedAt,subtasks:a.currentTask.subtasks?.map(p=>({id:p.id,description:p.description,status:p.status,domain:p.domain})),currentSubtaskIndex:a.currentTask.currentSubtaskIndex}:null,u=await this.loadRepoAnalysis(i),d={projectId:o,globalPath:i,currentTask:l,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:u?.ecosystem||"unknown",frameworks:u?.frameworks||[],hasTests:u?.hasTests||!1,technologies:u?.technologies||[]}};return n.md?console.log(this.formatContextMd(d)):console.log(JSON.stringify(d)),{success:!0,message:""}}catch(r){return{success:!1,message:`Context error: ${b(r)}`}}}formatContextMd(e){let t=[];if(t.push(q("Project",ud(ld("ID",e.projectId),ld("Path",e.globalPath)))),e.currentTask){let n=e.currentTask;if(t.push(No({description:n.description,status:"in-progress"})),n.subtasks&&n.subtasks.length>0){let r=n.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(r.join(`
1015
+ `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(q("Stack",Zn({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),W(...t)}async loadRepoAnalysis(e){try{let t=l$.join(e,"analysis","repo-analysis.json"),n=await c$.readFile(t,"utf-8"),r=JSON.parse(n);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return L(t),null}}},Lv=new os,u$=Lv});var Ep={};D(Ep,{InstallCommands:()=>Ns});var Ns,Ko=h(()=>{"use strict";$l();F();Te();pe();Ie();Ns=class extends X{static{c(this,"InstallCommands")}async install(e=null,t=process.cwd(),n={}){try{let r=await xl(),o=ko.length,i=`installed ${r.hooksWritten} new, ${r.alreadyPresent} already present (total ${o} hooks)`;return n.md?console.log(["# prjct hooks installed","",`Wrote to \`${r.settingsPath}\`.`,"",`- new: ${r.hooksWritten}`,`- already present: ${r.alreadyPresent}`,`- total expected: ${o}`,"","> Only `_prjctManaged: true` entries were touched. Your other hooks are untouched."].join(`
1016
+ `)):(f.done(i),f.info(`settings: ${r.settingsPath}`)),{success:!0,hooksWritten:r.hooksWritten}}catch(r){let o=b(r);return N(o)}}async uninstall(e=null,t=process.cwd(),n={}){try{let r=await Al(),o=`removed ${r.hooksRemoved} prjct hook(s)`;return n.md?console.log(`# prjct hooks removed
1017
1017
 
1018
1018
  - removed: ${r.hooksRemoved}
1019
1019
  - settings: \`${r.settingsPath}\`
1020
- `):f.done(o),{success:!0,hooksRemoved:r.hooksRemoved}}catch(r){let o=b(r);return N(o)}}async status(e=null,t=process.cwd()){try{let n=await Al();return{success:!0,installed:n.installed,expected:n.expected}}catch(n){return Me(n)}}}});import Ep from"node:fs";import d$ from"node:os";import gc from"node:path";var p$,Cp,Ls,Hv=h(()=>{"use strict";p$=[{name:"claude_ai_PostHog",displayName:"PostHog",description:"Product analytics, dashboards, feature flags, surveys",estimatedTools:280},{name:"claude_ai_Atlassian",displayName:"Atlassian (Jira + Confluence)",description:"Jira issues, Confluence pages, Compass components",estimatedTools:40},{name:"claude_ai_Supabase",displayName:"Supabase",description:"Postgres projects, migrations, edge functions, branches",estimatedTools:30},{name:"claude_ai_Google_Drive",displayName:"Google Drive",description:"Read files from your Drive (auth-gated)",estimatedTools:2},{name:"claude_ai_Linear",displayName:"Linear",description:"Issues, projects, comments",estimatedTools:25},{name:"claude_ai_GitHub",displayName:"GitHub",description:"Repos, PRs, issues (claude.ai integration, separate from gh CLI)",estimatedTools:35},{name:"claude_ai_Notion",displayName:"Notion",description:"Pages, databases, blocks",estimatedTools:20},{name:"claude_ai_Slack",displayName:"Slack",description:"Messages, channels, threads",estimatedTools:15}],Cp=class{static{c(this,"McpService")}async list(e){let t=new Set(this.readDenied(e).map(i=>i.serverName)),n=[];for(let i of p$)n.push({name:i.name,displayName:i.displayName,source:"cloud",description:i.description,estimatedTools:i.estimatedTools,denied:t.has(i.name)});let r=this.readJson(gc.join(e,".mcp.json"));if(r?.mcpServers)for(let i of Object.keys(r.mcpServers))n.push({name:i,displayName:i,source:"project",description:"stdio server declared in .mcp.json",estimatedTools:0,denied:t.has(i)});let o=this.readJson(gc.join(d$.homedir(),".claude.json"));if(o?.mcpServers)for(let i of Object.keys(o.mcpServers))n.push({name:i,displayName:i,source:"global",description:"stdio server declared in ~/.claude.json",estimatedTools:0,denied:t.has(i)});return n}async deny(e,t){let n=this.localSettingsPath(e),r=this.readJson(n)??{},o=r.deniedMcpServers??[];return o.some(a=>a.serverName===t)?{alreadyDenied:!0,settingsPath:n}:(r.deniedMcpServers=[...o,{serverName:t}],this.writeJson(n,r),{alreadyDenied:!1,settingsPath:n})}async allow(e,t){let n=this.localSettingsPath(e),r=this.readJson(n)??{},o=r.deniedMcpServers??[],i=o.filter(a=>a.serverName!==t);return i.length===o.length?{wasDenied:!1,settingsPath:n}:(i.length===0?delete r.deniedMcpServers:r.deniedMcpServers=i,this.writeJson(n,r),{wasDenied:!0,settingsPath:n})}async setEnabled(e,t,n){let r=this.localSettingsPath(e),o=this.readJson(r)??{},i=new Set((o.deniedMcpServers??[]).map(p=>p.serverName)),a=new Set(t),l=new Set(i);for(let p of n)a.has(p)?l.delete(p):l.add(p);let u=[],d=[];for(let p of n){let m=i.has(p),g=l.has(p);!m&&g?u.push(p):m&&!g&&d.push(p)}return u.length===0&&d.length===0?{nowDenied:u,nowAllowed:d,settingsPath:r}:(l.size===0?delete o.deniedMcpServers:o.deniedMcpServers=Array.from(l).map(p=>({serverName:p})),this.writeJson(r,o),{nowDenied:u,nowAllowed:d,settingsPath:r})}localSettingsPath(e){return gc.join(e,".claude","settings.local.json")}readDenied(e){return this.readJson(this.localSettingsPath(e))?.deniedMcpServers??[]}readJson(e){try{let t=Ep.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return null}}writeJson(e,t){Ep.mkdirSync(gc.dirname(e),{recursive:!0}),Ep.writeFileSync(e,`${JSON.stringify(t,null,2)}
1021
- `,"utf-8")}},Ls=new Cp});import*as bt from"@clack/prompts";import On from"chalk";var $r,Rp=h(()=>{"use strict";Hv();F();Te();kt();pe();Ie();$r=class extends X{static{c(this,"McpCommands")}async mcp(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??null,i=r[1]??null;if(o===null)return!n.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,n);switch(o){case"list":return this.list(t,n);case"status":return this.status(t,n);case"deny":return this.deny(i,t,n);case"allow":return this.allow(i,t,n);default:return f.fail(`Unknown mcp subcommand: ${o}. Use: list, status, deny <name>, allow <name>.`),{success:!1,error:"Unknown mcp subcommand"}}}async interactive(e){try{let t=await Ls.list(e);if(t.length===0)return f.info("No MCP servers detected for this project."),{success:!0,servers:[]};let n=c(w=>w.reduce((v,S)=>v+S.estimatedTools,0),"sumTools"),r=t.filter(w=>!w.denied),o=n(r),i=n(t),a=e.split("/").pop()??"this project";bt.intro(On.cyan.bold(`MCP servers \u2014 ${a}`)),bt.note([`${r.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,On.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
1020
+ `):f.done(o),{success:!0,hooksRemoved:r.hooksRemoved}}catch(r){let o=b(r);return N(o)}}async status(e=null,t=process.cwd()){try{let n=await jl();return{success:!0,installed:n.installed,expected:n.expected}}catch(n){return Me(n)}}}});import Cp from"node:fs";import d$ from"node:os";import fc from"node:path";var p$,Rp,Ls,Hv=h(()=>{"use strict";p$=[{name:"claude_ai_PostHog",displayName:"PostHog",description:"Product analytics, dashboards, feature flags, surveys",estimatedTools:280},{name:"claude_ai_Atlassian",displayName:"Atlassian (Jira + Confluence)",description:"Jira issues, Confluence pages, Compass components",estimatedTools:40},{name:"claude_ai_Supabase",displayName:"Supabase",description:"Postgres projects, migrations, edge functions, branches",estimatedTools:30},{name:"claude_ai_Google_Drive",displayName:"Google Drive",description:"Read files from your Drive (auth-gated)",estimatedTools:2},{name:"claude_ai_Linear",displayName:"Linear",description:"Issues, projects, comments",estimatedTools:25},{name:"claude_ai_GitHub",displayName:"GitHub",description:"Repos, PRs, issues (claude.ai integration, separate from gh CLI)",estimatedTools:35},{name:"claude_ai_Notion",displayName:"Notion",description:"Pages, databases, blocks",estimatedTools:20},{name:"claude_ai_Slack",displayName:"Slack",description:"Messages, channels, threads",estimatedTools:15}],Rp=class{static{c(this,"McpService")}async list(e){let t=new Set(this.readDenied(e).map(i=>i.serverName)),n=[];for(let i of p$)n.push({name:i.name,displayName:i.displayName,source:"cloud",description:i.description,estimatedTools:i.estimatedTools,denied:t.has(i.name)});let r=this.readJson(fc.join(e,".mcp.json"));if(r?.mcpServers)for(let i of Object.keys(r.mcpServers))n.push({name:i,displayName:i,source:"project",description:"stdio server declared in .mcp.json",estimatedTools:0,denied:t.has(i)});let o=this.readJson(fc.join(d$.homedir(),".claude.json"));if(o?.mcpServers)for(let i of Object.keys(o.mcpServers))n.push({name:i,displayName:i,source:"global",description:"stdio server declared in ~/.claude.json",estimatedTools:0,denied:t.has(i)});return n}async deny(e,t){let n=this.localSettingsPath(e),r=this.readJson(n)??{},o=r.deniedMcpServers??[];return o.some(a=>a.serverName===t)?{alreadyDenied:!0,settingsPath:n}:(r.deniedMcpServers=[...o,{serverName:t}],this.writeJson(n,r),{alreadyDenied:!1,settingsPath:n})}async allow(e,t){let n=this.localSettingsPath(e),r=this.readJson(n)??{},o=r.deniedMcpServers??[],i=o.filter(a=>a.serverName!==t);return i.length===o.length?{wasDenied:!1,settingsPath:n}:(i.length===0?delete r.deniedMcpServers:r.deniedMcpServers=i,this.writeJson(n,r),{wasDenied:!0,settingsPath:n})}async setEnabled(e,t,n){let r=this.localSettingsPath(e),o=this.readJson(r)??{},i=new Set((o.deniedMcpServers??[]).map(p=>p.serverName)),a=new Set(t),l=new Set(i);for(let p of n)a.has(p)?l.delete(p):l.add(p);let u=[],d=[];for(let p of n){let m=i.has(p),g=l.has(p);!m&&g?u.push(p):m&&!g&&d.push(p)}return u.length===0&&d.length===0?{nowDenied:u,nowAllowed:d,settingsPath:r}:(l.size===0?delete o.deniedMcpServers:o.deniedMcpServers=Array.from(l).map(p=>({serverName:p})),this.writeJson(r,o),{nowDenied:u,nowAllowed:d,settingsPath:r})}localSettingsPath(e){return fc.join(e,".claude","settings.local.json")}readDenied(e){return this.readJson(this.localSettingsPath(e))?.deniedMcpServers??[]}readJson(e){try{let t=Cp.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return null}}writeJson(e,t){Cp.mkdirSync(fc.dirname(e),{recursive:!0}),Cp.writeFileSync(e,`${JSON.stringify(t,null,2)}
1021
+ `,"utf-8")}},Ls=new Rp});import*as bt from"@clack/prompts";import On from"chalk";var $r,Pp=h(()=>{"use strict";Hv();F();Te();kt();pe();Ie();$r=class extends X{static{c(this,"McpCommands")}async mcp(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??null,i=r[1]??null;if(o===null)return!n.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,n);switch(o){case"list":return this.list(t,n);case"status":return this.status(t,n);case"deny":return this.deny(i,t,n);case"allow":return this.allow(i,t,n);default:return f.fail(`Unknown mcp subcommand: ${o}. Use: list, status, deny <name>, allow <name>.`),{success:!1,error:"Unknown mcp subcommand"}}}async interactive(e){try{let t=await Ls.list(e);if(t.length===0)return f.info("No MCP servers detected for this project."),{success:!0,servers:[]};let n=c(w=>w.reduce((v,S)=>v+S.estimatedTools,0),"sumTools"),r=t.filter(w=>!w.denied),o=n(r),i=n(t),a=e.split("/").pop()??"this project";bt.intro(On.cyan.bold(`MCP servers \u2014 ${a}`)),bt.note([`${r.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,On.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
1022
1022
  `),"Context cost");let l={cloud:"cloud",project:"project",global:"global"},u=[...t].sort((w,v)=>{if(w.source!==v.source){let S=["cloud","project","global"];return S.indexOf(w.source)-S.indexOf(v.source)}return v.estimatedTools-w.estimatedTools}),d=await bt.multiselect({message:"Keep enabled in this project:",options:u.map(w=>({value:w.name,label:this.optionLabel(w,l[w.source]),hint:w.description})),initialValues:u.filter(w=>!w.denied).map(w=>w.name),required:!1});if(bt.isCancel(d))return bt.cancel("No changes."),{success:!0,cancelled:!0};let p=d,m=await Ls.setEnabled(e,p,t.map(w=>w.name)),g=n(t.filter(w=>p.includes(w.name))),k=g-o;if(m.nowDenied.length===0&&m.nowAllowed.length===0)return bt.outro(On.dim("No changes.")),{success:!0,unchanged:!0};let E=[];m.nowDenied.length>0&&E.push(On.red(`\u2717 denied (${m.nowDenied.length}): ${m.nowDenied.join(", ")}`)),m.nowAllowed.length>0&&E.push(On.green(`\u2713 allowed (${m.nowAllowed.length}): ${m.nowAllowed.join(", ")}`));let y=k>0?"+":"";return E.push(""),E.push(`Tools loaded: ${o} \u2192 ${g} (${On.bold(`${y}${k}`)})`),bt.note(E.join(`
1023
1023
  `),`Wrote ${this.relativeSettingsPath(m.settingsPath,e)}`),bt.outro(On.yellow("Restart Claude Code to apply (MCP config is cached at session start).")),{success:!0,...m,beforeTools:o,afterTools:g}}catch(t){let n=b(t);return N(n)}}optionLabel(e,t){let n=e.estimatedTools>0?On.dim(` ~${e.estimatedTools} tools`):"";return`${On.dim(`[${t}]`)} ${e.displayName}${n}`}relativeSettingsPath(e,t){return e.startsWith(t)?e.slice(t.length+1):e}async list(e,t){try{let n=await Ls.list(e);return t.md?console.log(this.formatMd(n,!1)):this.formatTerminal(n,!1),{success:!0,servers:n}}catch(n){let r=b(n);return N(r)}}async status(e,t){try{let r=(await Ls.list(e)).filter(o=>o.denied);return t.md?console.log(this.formatMd(r,!0)):this.formatTerminal(r,!0),{success:!0,denied:r}}catch(n){let r=b(n);return N(r)}}async deny(e,t,n){if(!e)return f.fail("Usage: prjct mcp deny <serverName>"),{success:!1,error:"Missing serverName"};try{let r=await Ls.deny(t,e),o=r.alreadyDenied?"already denied":"denied",i=`${e} ${o} in this project`;return n.md?console.log(W(q("Done",i),q("What to do next",this.restartHint(r.settingsPath)))):(f.done(i),console.log(this.restartHint(r.settingsPath))),{success:!0,...r}}catch(r){let o=b(r);return N(o)}}async allow(e,t,n){if(!e)return f.fail("Usage: prjct mcp allow <serverName>"),{success:!1,error:"Missing serverName"};try{let r=await Ls.allow(t,e),o=r.wasDenied?`${e} re-allowed in this project`:`${e} was not denied \u2014 nothing to change`;return n.md?console.log(W(q("Done",o),r.wasDenied?q("What to do next",this.restartHint(r.settingsPath)):null)):(f.done(o),r.wasDenied&&console.log(this.restartHint(r.settingsPath))),{success:!0,...r}}catch(r){let o=b(r);return N(o)}}formatTerminal(e,t){if(e.length===0){t?f.info("No MCP servers denied in this project."):f.info("No MCP servers detected.");return}let n=e.filter(o=>o.denied).reduce((o,i)=>o+i.estimatedTools,0),r=e.filter(o=>!o.denied).reduce((o,i)=>o+i.estimatedTools,0);t||console.log(`
1024
1024
  MCP servers \u2014 this project (${process.cwd().split("/").pop()})
@@ -1027,15 +1027,15 @@ MCP servers \u2014 this project (${process.cwd().split("/").pop()})
1027
1027
  Nothing to show.
1028
1028
  `;let n=[];n.push(t?"# MCP denylist \u2014 this project":"# MCP servers \u2014 this project"),n.push("");let r={cloud:e.filter(i=>i.source==="cloud"),project:e.filter(i=>i.source==="project"),global:e.filter(i=>i.source==="global")},o={cloud:"Cloud (claude.ai connected apps)",project:"Project (.mcp.json)",global:"Global (~/.claude.json)"};for(let[i,a]of Object.entries(r))if(a.length!==0){n.push(`## ${o[i]}`),n.push(""),n.push("| Status | Name | Tools | Description |"),n.push("|---|---|---|---|");for(let l of a){let u=l.denied?"\u2717 denied":"\u2713 active",d=l.estimatedTools>0?`~${l.estimatedTools}`:"\u2014";n.push(`| ${u} | \`${l.name}\` | ${d} | ${l.description} |`)}n.push("")}if(!t){let i=e.filter(l=>l.denied).reduce((l,u)=>l+u.estimatedTools,0),a=e.filter(l=>!l.denied).reduce((l,u)=>l+u.estimatedTools,0);n.push(`**Estimated tools loaded:** ${a} (denied: ${i})`),n.push(""),n.push("## Toggle in this project (project-local, no global side effects)"),n.push(""),n.push("- `prjct mcp deny <name>` \u2014 silence here, keep elsewhere"),n.push("- `prjct mcp allow <name>` \u2014 re-enable here"),n.push(""),n.push("Cloud MCPs come from your claude.ai connected apps. To disable one globally, disconnect it in claude.ai settings.")}return n.join(`
1029
1029
  `)}restartHint(e){return[`Wrote: ${e}`,"","Restart Claude Code for this to take effect:"," 1. Exit this Claude Code session (Ctrl+C or close the window)"," 2. Re-run `claude` in the same directory","","The harness caches MCP config at session start \u2014 denylist edits are","only read on a fresh session."].join(`
1030
- `)}}});function g$(s){let e=s.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let n=t.indexOf(":");return n<=0?null:[t.slice(0,n),t.slice(n+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}function f$(s){if(!s)return{};let e={};for(let t of s.split(",")){let n=t.trim(),r=n.indexOf(":");r>0&&(e[n.slice(0,r)]=n.slice(r+1))}return e}function h$(s){let e=s.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let n=e.slice(0,t).toLowerCase().trim();if(!n||!/^[a-z][a-z0-9-]*$/.test(n))return{ok:!1,error:`invalid type '${n}'. Lowercase letters + dashes only. Base types: ${xs.join(", ")}`};let r=n,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:r,content:o}:{ok:!1,error:"content is required"}}async function y$(s,e){try{let{default:t}=await Promise.resolve().then(()=>(Y(),bs)),n=t.query(s,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${vr}`);for(let r of n)try{let o=JSON.parse(r.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}var m$,Ir,Pp=h(()=>{"use strict";_a();$e();Kn();pt();F();Te();pe();tc();Ie();Zt();m$=["feature","bug","improvement","chore"],Ir=class extends X{static{c(this,"PrimitiveCommands")}async status(e=null,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;if(e!==null&&["active","resume","in_progress","working"].includes(e.toLowerCase())&&!await B.getCurrentTask(r.value)){let m=await B.resumeTask(r.value);if(m){await it.log(t,vr,{taskId:m.id,from:"paused",to:e});let g=`status \u2192 ${e}`;return n.md?console.log(`\u2713 ${g}`):f.done(g),{success:!0,taskId:m.id,status:e}}}if(!e&&!await B.getCurrentTask(r.value)){let m=await B.getPausedTasks(r.value);if(m.length>0){let g=m[0],k=`Task: ${g.id} | Type: ${g.type??"unset"} | Status: paused`;return n.md?console.log(k):f.info(k),{success:!0,taskId:g.id,status:"paused"}}}let i=await yp(r.value,n);if(!i.ok)return i.result;let a=i.value,l=await y$(r.value,a.id);if(!e){let p=`Task: ${a.id} | Type: ${a.type??"unset"} | Status: ${l??"active"}`;return n.md?console.log(p):f.info(p),{success:!0,taskId:a.id,status:l??"active"}}await it.log(t,vr,{taskId:a.id,from:l??null,to:e});let u=e.toLowerCase();try{u==="done"||u==="completed"?await B.completeTask(r.value):u==="paused"||u==="pause"?await B.pauseTask(r.value):(u==="active"||u==="resume"||u==="in_progress"||u==="working")&&(await B.getCurrentTask(r.value)||await B.resumeTask(r.value))}catch{}let d=`status \u2192 ${e}`;return n.md?console.log(`\u2713 ${d}`):f.done(d),{success:!0,taskId:a.id,status:e}}catch(r){let o=b(r);return N(o)}}async tag(e=null,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=await yp(r.value,n);if(!o.ok)return o.result;if(!e)return f.info("Usage: prjct tag <key:value> [<key:value>...]"),{success:!1,error:"No tags provided"};let i=g$(e);if(Object.keys(i).length===0)return f.fail("no valid k:v pairs (expected `key:value`)"),{success:!1,error:"Invalid tag format"};let a=i.type;a&&m$.includes(a)&&await B.updateCurrentTask(r.value,{type:a}),await it.log(t,"task.tagged",{taskId:o.value.id,tags:i});let l=Object.entries(i).map(([u,d])=>`${u}=${d}`).join(", ");return n.md?console.log(`\u2713 tagged ${l}`):f.done(`tagged ${l}`),{success:!0,taskId:o.value.id,tags:i}}catch(r){let o=b(r);return N(o)}}async remember(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return f.info(`Usage: prjct remember <type> "<content>" [--tags k:v,...]
1031
- Types: ${xs.join(" | ")}`),{success:!1,error:"Missing args"};let o=h$(e);if(!o.ok)return N(o.error);let{type:i,content:a}=o,l=Rr(a);if(l.length>0&&!n.force){let g=l.join(", ");return f.fail(`refusing to store memory that looks like a secret (${g}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=f$(n.tags),d=await we(t);if(!d.ok)return d.result;let p=await B.getCurrentTask(d.value);await J.remember(t,{type:i,content:a,tags:u,source:p?.id});let{regenerateWikiDeferred:m}=await Promise.resolve().then(()=>(Mn(),_s));return await m(t,d.value),n.md?console.log(`\u2713 remembered ${i}: ${a}`):f.done(`remembered ${i}`),{success:!0,type:i,content:a,tags:u}}catch(r){let o=b(r);return N(o)}}};c(g$,"parseTagPairs");c(f$,"parseFlagTags");c(h$,"parseRememberArgs");c(y$,"readLastStatus")});var Uv={};D(Uv,{SeedCommands:()=>Fs});var Fs,fc=h(()=>{"use strict";Rd();$d();F();Te();pe();Ie();Fs=class extends X{static{c(this,"SeedCommands")}async seed(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??"list",i=r.slice(1).join(",");switch(o){case"add":return this.add(i||null,t,n);case"remove":return this.remove(i||null,t,n);case"list":return this.list(null,t,n);case"suggest":return this.suggest(null,t,n);default:return f.fail(`Unknown seed subcommand: ${o}. Use: add, remove, list, suggest.`),{success:!1,error:"Unknown seed subcommand"}}}async add(e=null,t=process.cwd(),n={}){try{if(!e)return f.info(`Usage: prjct seed add <pack>[,<pack>...]
1032
- Available: ${Cd.join(", ")}`),{success:!1,error:"No pack given"};let r=e.split(",").map(a=>a.trim()).filter(Boolean),o=await xd(t,r,{suggestPersona:n.suggestPersona??!1}),i=`activated: ${o.activated.join(", ")||"none"}${o.skipped.length?` \u2022 unknown: ${o.skipped.join(", ")}`:""}`;return n.md?console.log(`\u2713 ${i}`):f.done(i),{success:!0,...o}}catch(r){let o=b(r);return N(o)}}async remove(e=null,t=process.cwd(),n={}){try{if(!e)return f.info("Usage: prjct seed remove <pack>[,<pack>...]"),{success:!1,error:"No pack given"};let r=e.split(",").map(a=>a.trim()).filter(Boolean),o=await Ad(t,r),i=`deactivated: ${o.deactivated.join(", ")||"none"}${o.notActive.length?` \u2022 not active: ${o.notActive.join(", ")}`:""}`;return n.md?console.log(`\u2713 ${i}`):f.done(i),{success:!0,...o}}catch(r){let o=b(r);return N(o)}}async list(e=null,t=process.cwd(),n={}){try{let r=await jd(t);if(r.length===0){let o=`no packs active. Run \`prjct seed add <name>\` \u2014 available: ${Cd.join(", ")}`;return n.md?console.log(`> ${o}`):f.info(o),{success:!0,active:[]}}if(n.md){let o=["# Active packs",""];for(let i of r)o.push(`## ${i.name}`),o.push(i.description),o.push(`- memory types: ${i.memoryTypes.join(", ")||"\u2014"}`),o.push(`- workflow slots: ${i.slots.join(", ")||"\u2014"}`),o.push("");console.log(o.join(`
1033
- `))}else for(let o of r)f.info(`${o.name}: ${o.description}`),f.info(` memory: ${o.memoryTypes.join(", ")||"\u2014"}`),f.info(` slots: ${o.slots.join(", ")||"\u2014"}`);return{success:!0,active:r}}catch(r){let o=b(r);return N(o)}}async suggest(e=null,t=process.cwd(),n={}){try{let r=await Pd(t),o=r.map(i=>{let a=js[i];return{name:i,description:a?.description??""}});if(n.md){let i=["# Suggested packs for this project",""];for(let a of o)i.push(`- **${a.name}** \u2014 ${a.description}`);i.push(""),i.push(`Activate with: \`prjct seed add ${r.join(",")}\``),console.log(i.join(`
1034
- `))}else f.info(`Suggested: ${r.join(", ")}`),f.info(`Activate: prjct seed add ${r.join(",")}`);return{success:!0,suggested:r}}catch(r){let o=b(r);return N(o)}}}});function k$(s){return s.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function v$(s){let e={};for(let[t,n]of Object.entries(s))e[k$(t)]=n;return e}function b$(s,e){let[t,n]=e.type.split("."),r=w$[t];if(!r)return null;let i=n==="deleted"?"delete":"upsert",a=e.data||{},l=v$(a),u=l.id||a.id||"",d={event_type:i,entity_type:r,entity_id:u,data:{...l,project_id:s},project_id:s};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function Wv(s,e){return e.map(t=>b$(s,t)).filter(t=>t!==null)}var w$,Gv=h(()=>{"use strict";w$={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};c(k$,"camelToSnake");c(v$,"snakeCaseKeys");c(b$,"mapCliEventToWebFormat");c(Wv,"mapCliEventsToWebFormat")});var xp,_r,Ap=h(()=>{"use strict";Li();dr();Gv();xp=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:n,apiKey:r}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=Wv(e,t),i=await this.fetchWithRetry(`${n}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":r},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t,n){let{apiUrl:r,apiKey:o}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let i={projectId:e};typeof t=="number"&&t>0&&(i.sinceEventId=t);let a=await this.fetchWithRetry(`${r}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":o},body:JSON.stringify(i)});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async getStatus(e){let{apiUrl:t,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let r=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":n}});if(!r.ok)throw await this.parseErrorResponse(r);return await r.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),ir("API_REQUEST"));try{let{apiUrl:n,apiKey:r}=await this.getAuthHeaders();if(!r)return clearTimeout(t),!1;let o=await fetch(`${n}/health`,{method:"GET",headers:{"X-Api-Key":r},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Ze.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Ze.getApiUrl(),Ze.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,n=0){let r=new AbortController,o=setTimeout(()=>r.abort(),ir("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:r.signal});if(clearTimeout(o),a&&l.status>=500&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${ir("API_REQUEST")}ms)`);if(a&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),n=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",n,e.status):this.createError("API_ERROR",n,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,n){return{code:e,message:t,status:n}}sleep(e){return new Promise(t=>setTimeout(t,e))}},_r=new xp});var Bv,Vv=h(()=>{"use strict";ma();Bv={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.title||e.text||"",r=e.priority||"medium",o=e.status||"active";await Cs.update(s,i=>{let a=i.ideas.findIndex(p=>p.id===t),u={id:t,text:n,priority:r,status:o==="archived"?"archived":"pending",addedAt:i.ideas[a]?.addedAt??new Date().toISOString(),tags:i.ideas[a]?.tags??[]},d=a>=0?i.ideas.map((p,m)=>m===a?{...p,...u}:p):[...i.ideas,u];return{...i,ideas:d}})},async delete(s,e){let t=e.id||"";t&&await Cs.update(s,n=>({...n,ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r)}))}}});var qv,Jv=h(()=>{"use strict";Rs();qv={async upsert(s,e){let t=e.id||"";if(!t){await mt.addTask(s,{description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"});return}await mt.update(s,n=>{let r=n.tasks.findIndex(a=>a.id===t),o={id:t,description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"},i=r>=0?n.tasks.map((a,l)=>l===r?{...a,...o}:a):[...n.tasks,o];return{...n,tasks:i}})},async delete(s,e){let t=e.id||"";t&&await mt.update(s,n=>({...n,tasks:n.tasks.filter(r=>r.id!==t)}))}}});var jp,Xv=h(()=>{"use strict";Ps();jp={async upsert(s,e){await wt.addShipped(s,{name:e.name||e.title||"",version:e.version||"",description:e.description||""})},async delete(s,e){}}});var zv,Kv=h(()=>{"use strict";Rs();pt();zv={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.status||"";if(n==="completed"||n==="shipped"){await B.update(s,r=>r.currentTask?.id===t?{...r,currentTask:null}:r);return}if(n==="active"||e.started_at||e.startedAt){await B.update(s,r=>({...r,currentTask:{id:t,description:e.description,startedAt:e.started_at||e.startedAt||new Date().toISOString(),sessionId:e.session_id||e.sessionId||""}}));return}await mt.update(s,r=>{let o=r.tasks.findIndex(l=>l.id===t),i={id:t,description:e.description,priority:e.priority||"medium",type:e.type||"feature",section:"backlog"},a=o>=0?r.tasks.map((l,u)=>u===o?{...l,...i}:l):[...r.tasks,i];return{...r,tasks:a}})},async delete(s,e){let t=e.id||"";t&&await B.update(s,n=>n.currentTask?.id===t?{...n,currentTask:null}:n)}}});var $p,jK,Yv,Qv=h(()=>{"use strict";Vv();Jv();Xv();Kv();$p={tasks:zv,ideas:Bv,queue_tasks:qv,shipped_items:jp,shipped_features:jp},jK=Object.keys($p),Yv=new Set(["roadmap_features","projects","sessions","agents"])});function Zv(s,e,t){if(!e||!t)return null;try{return A.get(s,"SELECT content_hash, applied_at FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)?.content_hash??null}catch{return null}}function eb(s,e,t,n){if(!(!e||!t||!n))try{A.run(s,`INSERT INTO sync_applied_hashes (entity_type, entity_id, content_hash, applied_at)
1030
+ `)}}});function g$(s){let e=s.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let n=t.indexOf(":");return n<=0?null:[t.slice(0,n),t.slice(n+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}function f$(s){if(!s)return{};let e={};for(let t of s.split(",")){let n=t.trim(),r=n.indexOf(":");r>0&&(e[n.slice(0,r)]=n.slice(r+1))}return e}function h$(s){let e=s.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let n=e.slice(0,t).toLowerCase().trim();if(!n||!/^[a-z][a-z0-9-]*$/.test(n))return{ok:!1,error:`invalid type '${n}'. Lowercase letters + dashes only. Base types: ${xs.join(", ")}`};let r=n,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:r,content:o}:{ok:!1,error:"content is required"}}async function y$(s,e){try{let{default:t}=await Promise.resolve().then(()=>(Y(),bs)),n=t.query(s,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${vr}`);for(let r of n)try{let o=JSON.parse(r.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}var m$,Ir,xp=h(()=>{"use strict";Da();$e();Kn();pt();F();Te();pe();nc();Ie();Zt();m$=["feature","bug","improvement","chore"],Ir=class extends X{static{c(this,"PrimitiveCommands")}async status(e=null,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;if(e!==null&&["active","resume","in_progress","working"].includes(e.toLowerCase())&&!await B.getCurrentTask(r.value)){let m=await B.resumeTask(r.value);if(m){await it.log(t,vr,{taskId:m.id,from:"paused",to:e});let g=`status \u2192 ${e}`;return n.md?console.log(`\u2713 ${g}`):f.done(g),{success:!0,taskId:m.id,status:e}}}if(!e&&!await B.getCurrentTask(r.value)){let m=await B.getPausedTasks(r.value);if(m.length>0){let g=m[0],k=`Task: ${g.id} | Type: ${g.type??"unset"} | Status: paused`;return n.md?console.log(k):f.info(k),{success:!0,taskId:g.id,status:"paused"}}}let i=await wp(r.value,n);if(!i.ok)return i.result;let a=i.value,l=await y$(r.value,a.id);if(!e){let p=`Task: ${a.id} | Type: ${a.type??"unset"} | Status: ${l??"active"}`;return n.md?console.log(p):f.info(p),{success:!0,taskId:a.id,status:l??"active"}}await it.log(t,vr,{taskId:a.id,from:l??null,to:e});let u=e.toLowerCase();try{u==="done"||u==="completed"?await B.completeTask(r.value):u==="paused"||u==="pause"?await B.pauseTask(r.value):(u==="active"||u==="resume"||u==="in_progress"||u==="working")&&(await B.getCurrentTask(r.value)||await B.resumeTask(r.value))}catch{}let d=`status \u2192 ${e}`;return n.md?console.log(`\u2713 ${d}`):f.done(d),{success:!0,taskId:a.id,status:e}}catch(r){let o=b(r);return N(o)}}async tag(e=null,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=await wp(r.value,n);if(!o.ok)return o.result;if(!e)return f.info("Usage: prjct tag <key:value> [<key:value>...]"),{success:!1,error:"No tags provided"};let i=g$(e);if(Object.keys(i).length===0)return f.fail("no valid k:v pairs (expected `key:value`)"),{success:!1,error:"Invalid tag format"};let a=i.type;a&&m$.includes(a)&&await B.updateCurrentTask(r.value,{type:a}),await it.log(t,"task.tagged",{taskId:o.value.id,tags:i});let l=Object.entries(i).map(([u,d])=>`${u}=${d}`).join(", ");return n.md?console.log(`\u2713 tagged ${l}`):f.done(`tagged ${l}`),{success:!0,taskId:o.value.id,tags:i}}catch(r){let o=b(r);return N(o)}}async remember(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return f.info(`Usage: prjct remember <type> "<content>" [--tags k:v,...]
1031
+ Types: ${xs.join(" | ")}`),{success:!1,error:"Missing args"};let o=h$(e);if(!o.ok)return N(o.error);let{type:i,content:a}=o,l=Rr(a);if(l.length>0&&!n.force){let g=l.join(", ");return f.fail(`refusing to store memory that looks like a secret (${g}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=f$(n.tags),d=await we(t);if(!d.ok)return d.result;let p=await B.getCurrentTask(d.value);await J.remember(t,{type:i,content:a,tags:u,source:p?.id});let{regenerateWikiDeferred:m}=await Promise.resolve().then(()=>(Mn(),_s));return await m(t,d.value),n.md?console.log(`\u2713 remembered ${i}: ${a}`):f.done(`remembered ${i}`),{success:!0,type:i,content:a,tags:u}}catch(r){let o=b(r);return N(o)}}};c(g$,"parseTagPairs");c(f$,"parseFlagTags");c(h$,"parseRememberArgs");c(y$,"readLastStatus")});var Uv={};D(Uv,{SeedCommands:()=>Fs});var Fs,hc=h(()=>{"use strict";Pd();Id();F();Te();pe();Ie();Fs=class extends X{static{c(this,"SeedCommands")}async seed(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??"list",i=r.slice(1).join(",");switch(o){case"add":return this.add(i||null,t,n);case"remove":return this.remove(i||null,t,n);case"list":return this.list(null,t,n);case"suggest":return this.suggest(null,t,n);default:return f.fail(`Unknown seed subcommand: ${o}. Use: add, remove, list, suggest.`),{success:!1,error:"Unknown seed subcommand"}}}async add(e=null,t=process.cwd(),n={}){try{if(!e)return f.info(`Usage: prjct seed add <pack>[,<pack>...]
1032
+ Available: ${Rd.join(", ")}`),{success:!1,error:"No pack given"};let r=e.split(",").map(a=>a.trim()).filter(Boolean),o=await Ad(t,r,{suggestPersona:n.suggestPersona??!1}),i=`activated: ${o.activated.join(", ")||"none"}${o.skipped.length?` \u2022 unknown: ${o.skipped.join(", ")}`:""}`;return n.md?console.log(`\u2713 ${i}`):f.done(i),{success:!0,...o}}catch(r){let o=b(r);return N(o)}}async remove(e=null,t=process.cwd(),n={}){try{if(!e)return f.info("Usage: prjct seed remove <pack>[,<pack>...]"),{success:!1,error:"No pack given"};let r=e.split(",").map(a=>a.trim()).filter(Boolean),o=await jd(t,r),i=`deactivated: ${o.deactivated.join(", ")||"none"}${o.notActive.length?` \u2022 not active: ${o.notActive.join(", ")}`:""}`;return n.md?console.log(`\u2713 ${i}`):f.done(i),{success:!0,...o}}catch(r){let o=b(r);return N(o)}}async list(e=null,t=process.cwd(),n={}){try{let r=await $d(t);if(r.length===0){let o=`no packs active. Run \`prjct seed add <name>\` \u2014 available: ${Rd.join(", ")}`;return n.md?console.log(`> ${o}`):f.info(o),{success:!0,active:[]}}if(n.md){let o=["# Active packs",""];for(let i of r)o.push(`## ${i.name}`),o.push(i.description),o.push(`- memory types: ${i.memoryTypes.join(", ")||"\u2014"}`),o.push(`- workflow slots: ${i.slots.join(", ")||"\u2014"}`),o.push("");console.log(o.join(`
1033
+ `))}else for(let o of r)f.info(`${o.name}: ${o.description}`),f.info(` memory: ${o.memoryTypes.join(", ")||"\u2014"}`),f.info(` slots: ${o.slots.join(", ")||"\u2014"}`);return{success:!0,active:r}}catch(r){let o=b(r);return N(o)}}async suggest(e=null,t=process.cwd(),n={}){try{let r=await xd(t),o=r.map(i=>{let a=js[i];return{name:i,description:a?.description??""}});if(n.md){let i=["# Suggested packs for this project",""];for(let a of o)i.push(`- **${a.name}** \u2014 ${a.description}`);i.push(""),i.push(`Activate with: \`prjct seed add ${r.join(",")}\``),console.log(i.join(`
1034
+ `))}else f.info(`Suggested: ${r.join(", ")}`),f.info(`Activate: prjct seed add ${r.join(",")}`);return{success:!0,suggested:r}}catch(r){let o=b(r);return N(o)}}}});function k$(s){return s.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function v$(s){let e={};for(let[t,n]of Object.entries(s))e[k$(t)]=n;return e}function b$(s,e){let[t,n]=e.type.split("."),r=w$[t];if(!r)return null;let i=n==="deleted"?"delete":"upsert",a=e.data||{},l=v$(a),u=l.id||a.id||"",d={event_type:i,entity_type:r,entity_id:u,data:{...l,project_id:s},project_id:s};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function Wv(s,e){return e.map(t=>b$(s,t)).filter(t=>t!==null)}var w$,Gv=h(()=>{"use strict";w$={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};c(k$,"camelToSnake");c(v$,"snakeCaseKeys");c(b$,"mapCliEventToWebFormat");c(Wv,"mapCliEventsToWebFormat")});var Ap,_r,jp=h(()=>{"use strict";Fi();dr();Gv();Ap=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:n,apiKey:r}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=Wv(e,t),i=await this.fetchWithRetry(`${n}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":r},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t,n){let{apiUrl:r,apiKey:o}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let i={projectId:e};typeof t=="number"&&t>0&&(i.sinceEventId=t);let a=await this.fetchWithRetry(`${r}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":o},body:JSON.stringify(i)});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async getStatus(e){let{apiUrl:t,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let r=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":n}});if(!r.ok)throw await this.parseErrorResponse(r);return await r.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),ir("API_REQUEST"));try{let{apiUrl:n,apiKey:r}=await this.getAuthHeaders();if(!r)return clearTimeout(t),!1;let o=await fetch(`${n}/health`,{method:"GET",headers:{"X-Api-Key":r},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Ze.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Ze.getApiUrl(),Ze.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,n=0){let r=new AbortController,o=setTimeout(()=>r.abort(),ir("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:r.signal});if(clearTimeout(o),a&&l.status>=500&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${ir("API_REQUEST")}ms)`);if(a&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),n=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",n,e.status):this.createError("API_ERROR",n,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,n){return{code:e,message:t,status:n}}sleep(e){return new Promise(t=>setTimeout(t,e))}},_r=new Ap});var Bv,Vv=h(()=>{"use strict";ga();Bv={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.title||e.text||"",r=e.priority||"medium",o=e.status||"active";await Cs.update(s,i=>{let a=i.ideas.findIndex(p=>p.id===t),u={id:t,text:n,priority:r,status:o==="archived"?"archived":"pending",addedAt:i.ideas[a]?.addedAt??new Date().toISOString(),tags:i.ideas[a]?.tags??[]},d=a>=0?i.ideas.map((p,m)=>m===a?{...p,...u}:p):[...i.ideas,u];return{...i,ideas:d}})},async delete(s,e){let t=e.id||"";t&&await Cs.update(s,n=>({...n,ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r)}))}}});var qv,Jv=h(()=>{"use strict";Rs();qv={async upsert(s,e){let t=e.id||"";if(!t){await mt.addTask(s,{description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"});return}await mt.update(s,n=>{let r=n.tasks.findIndex(a=>a.id===t),o={id:t,description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"},i=r>=0?n.tasks.map((a,l)=>l===r?{...a,...o}:a):[...n.tasks,o];return{...n,tasks:i}})},async delete(s,e){let t=e.id||"";t&&await mt.update(s,n=>({...n,tasks:n.tasks.filter(r=>r.id!==t)}))}}});var $p,Xv=h(()=>{"use strict";Ps();$p={async upsert(s,e){await wt.addShipped(s,{name:e.name||e.title||"",version:e.version||"",description:e.description||""})},async delete(s,e){}}});var zv,Kv=h(()=>{"use strict";Rs();pt();zv={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.status||"";if(n==="completed"||n==="shipped"){await B.update(s,r=>r.currentTask?.id===t?{...r,currentTask:null}:r);return}if(n==="active"||e.started_at||e.startedAt){await B.update(s,r=>({...r,currentTask:{id:t,description:e.description,startedAt:e.started_at||e.startedAt||new Date().toISOString(),sessionId:e.session_id||e.sessionId||""}}));return}await mt.update(s,r=>{let o=r.tasks.findIndex(l=>l.id===t),i={id:t,description:e.description,priority:e.priority||"medium",type:e.type||"feature",section:"backlog"},a=o>=0?r.tasks.map((l,u)=>u===o?{...l,...i}:l):[...r.tasks,i];return{...r,tasks:a}})},async delete(s,e){let t=e.id||"";t&&await B.update(s,n=>n.currentTask?.id===t?{...n,currentTask:null}:n)}}});var Ip,IK,Yv,Qv=h(()=>{"use strict";Vv();Jv();Xv();Kv();Ip={tasks:zv,ideas:Bv,queue_tasks:qv,shipped_items:$p,shipped_features:$p},IK=Object.keys(Ip),Yv=new Set(["roadmap_features","projects","sessions","agents"])});function Zv(s,e,t){if(!e||!t)return null;try{return A.get(s,"SELECT content_hash, applied_at FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)?.content_hash??null}catch{return null}}function eb(s,e,t,n){if(!(!e||!t||!n))try{A.run(s,`INSERT INTO sync_applied_hashes (entity_type, entity_id, content_hash, applied_at)
1035
1035
  VALUES (?, ?, ?, ?)
1036
1036
  ON CONFLICT(entity_type, entity_id) DO UPDATE SET
1037
1037
  content_hash = excluded.content_hash,
1038
- applied_at = excluded.applied_at`,e,t,n,R())}catch{}}function tb(s,e,t){if(!(!e||!t))try{A.run(s,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}var nb=h(()=>{"use strict";Y();ue();c(Zv,"getApplied");c(eb,"recordApplied");c(tb,"clearApplied")});var sb={};D(sb,{syncCursorStorage:()=>S$});var Ip,S$,rb=h(()=>{"use strict";ue();Y();Ip=class{static{c(this,"SyncCursorStorage")}get(e,t=null,n=null){if(!n)return null;let r=A.get(e,`SELECT * FROM sync_cursors
1038
+ applied_at = excluded.applied_at`,e,t,n,R())}catch{}}function tb(s,e,t){if(!(!e||!t))try{A.run(s,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}var nb=h(()=>{"use strict";Y();ue();c(Zv,"getApplied");c(eb,"recordApplied");c(tb,"clearApplied")});var sb={};D(sb,{syncCursorStorage:()=>S$});var _p,S$,rb=h(()=>{"use strict";ue();Y();_p=class{static{c(this,"SyncCursorStorage")}get(e,t=null,n=null){if(!n)return null;let r=A.get(e,`SELECT * FROM sync_cursors
1039
1039
  WHERE project_id = ?
1040
1040
  AND device_id = ?
1041
1041
  AND ${t===null?"user_id IS NULL":"user_id = ?"}`,...t===null?[e,n]:[e,n,t]);return r?this.rowToCursor(r):null}touch(e,t=null,n=null){if(!n)return;let r=R();this.upsert({userId:t,deviceId:n,projectId:e,lastEventId:this.getLastEventId(e,t,n),updatedAt:r})}advance(e,t,n={}){let r=n.userId??null,o=n.deviceId??null;if(!o)return;let i=this.getLastEventId(e,r,o);t<=i||this.upsert({userId:r,deviceId:o,projectId:e,lastEventId:t,updatedAt:R()})}getLastEventId(e,t,n){return A.get(e,`SELECT last_event_id FROM sync_cursors
@@ -1046,7 +1046,7 @@ Available: ${Cd.join(", ")}`),{success:!1,error:"No pack given"};let r=e.split("
1046
1046
  WHERE project_id = ? AND device_id = ? AND user_id IS NULL`,n,R(),e,t)}upsert(e){A.run(e.projectId,`INSERT INTO sync_cursors (user_id, device_id, project_id, last_event_id, updated_at)
1047
1047
  VALUES (?, ?, ?, ?, ?)
1048
1048
  ON CONFLICT(user_id, device_id, project_id)
1049
- DO UPDATE SET last_event_id = excluded.last_event_id, updated_at = excluded.updated_at`,e.userId,e.deviceId,e.projectId,e.lastEventId,e.updatedAt)}rowToCursor(e){return{userId:e.user_id,deviceId:e.device_id,projectId:e.project_id,lastEventId:e.last_event_id,updatedAt:e.updated_at}}},S$=new Ip});function T$(s){if(ob.has(s))return;ob.add(s);let t=Yv.has(s)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${s}' (${t}). code=no_local_handler`)}function E$(s){let e=s.data??{},t=s.content_hash??s.contentHash;if(s.entity_type){let a=(s.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:s.entity_type,eventType:a,data:e,contentHash:t}}if(s.entityType){let a=s.eventType||"upsert";return{entityType:s.entityType,eventType:a==="delete"?"delete":"upsert",data:e,contentHash:t}}let[n,r]=(s.type||"").split("."),o={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"},i=r==="deleted"||r==="archived"||r==="removed";return{entityType:o[n]||n||"unknown",eventType:i?"delete":"upsert",data:e,contentHash:t}}var ob,_p,C$,ib,ab=h(()=>{"use strict";Yi();dr();Qv();nb();Ap();ob=new Set;c(T$,"warnNoLocalHandler");c(E$,"normalizeEventShape");_p=class{static{c(this,"SyncManager")}async hasAuth(){return await Ze.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await _r.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},n=await this.push(e);n.success&&!n.skipped&&(t.pushed={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()});let r=await this.pull(e);return r.success&&!r.skipped&&(t.pulled={count:r.count||0,syncedAt:r.syncedAt||new Date().toISOString()}),(!n.success||!r.success)&&(t.success=!1,t.error=n.error||r.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await un.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let n=await this.createProjectLinkEvent(e),r=n?[n,...t]:t,o=await _r.pushEvents(e,r);if(o.success)return await un.clearPending(e),await un.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,l=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${l}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(rb(),sb)),n=await Ze.read(),r=n.deviceId??null,o=n.userId??null,a=(r?t.get(e,o,r):null)?.lastEventId??0,l=await _r.pullEvents(e,a);if(l.events.length===0)return await un.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=a;for(let p of l.events){let m=[p.event_id,p.eventId];for(let g of m)typeof g=="number"&&g>d&&(d=g)}return r&&d>a&&t.advance(e,d,{userId:o,deviceId:r}),await un.updateLastSync(e),{success:!0,skipped:!1,count:l.events.length,applied:u,syncedAt:l.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let n=0;for(let r of t)try{await this.applyEvent(e,r),n++}catch(o){let i=r.entity_type||r.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return n}async applyEvent(e,t){let{entityType:n,eventType:r,data:o,contentHash:i}=E$(t),a=o.id??"",l=$p[n];if(!l){T$(n);return}if(r==="delete"){await l.delete(e,o),a&&tb(e,n,a);return}i&&this.alreadyApplied(e,n,a,i)||(await l.upsert(e,o),i&&a&&eb(e,n,a,i))}alreadyApplied(e,t,n,r){if(!n)return!1;let o=Zv(e,t,n);return o!==null&&o===r}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},C$=new _p,ib=C$});import cb from"node:fs";import hc from"node:path";var Dp,R$,lb=h(()=>{"use strict";Jl();Dp=class{static{c(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?hc.resolve(e):hc.join(qe("node:os").homedir(),".prjct-cli");this.dbPath=hc.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=hc.dirname(this.dbPath);cb.existsSync(e)||cb.mkdirSync(e,{recursive:!0});let t=Gi(this.dbPath);return t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
1049
+ DO UPDATE SET last_event_id = excluded.last_event_id, updated_at = excluded.updated_at`,e.userId,e.deviceId,e.projectId,e.lastEventId,e.updatedAt)}rowToCursor(e){return{userId:e.user_id,deviceId:e.device_id,projectId:e.project_id,lastEventId:e.last_event_id,updatedAt:e.updated_at}}},S$=new _p});function T$(s){if(ob.has(s))return;ob.add(s);let t=Yv.has(s)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${s}' (${t}). code=no_local_handler`)}function E$(s){let e=s.data??{},t=s.content_hash??s.contentHash;if(s.entity_type){let a=(s.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:s.entity_type,eventType:a,data:e,contentHash:t}}if(s.entityType){let a=s.eventType||"upsert";return{entityType:s.entityType,eventType:a==="delete"?"delete":"upsert",data:e,contentHash:t}}let[n,r]=(s.type||"").split("."),o={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"},i=r==="deleted"||r==="archived"||r==="removed";return{entityType:o[n]||n||"unknown",eventType:i?"delete":"upsert",data:e,contentHash:t}}var ob,Dp,C$,ib,ab=h(()=>{"use strict";Qi();dr();Qv();nb();jp();ob=new Set;c(T$,"warnNoLocalHandler");c(E$,"normalizeEventShape");Dp=class{static{c(this,"SyncManager")}async hasAuth(){return await Ze.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await _r.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},n=await this.push(e);n.success&&!n.skipped&&(t.pushed={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()});let r=await this.pull(e);return r.success&&!r.skipped&&(t.pulled={count:r.count||0,syncedAt:r.syncedAt||new Date().toISOString()}),(!n.success||!r.success)&&(t.success=!1,t.error=n.error||r.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await un.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let n=await this.createProjectLinkEvent(e),r=n?[n,...t]:t,o=await _r.pushEvents(e,r);if(o.success)return await un.clearPending(e),await un.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,l=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${l}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(rb(),sb)),n=await Ze.read(),r=n.deviceId??null,o=n.userId??null,a=(r?t.get(e,o,r):null)?.lastEventId??0,l=await _r.pullEvents(e,a);if(l.events.length===0)return await un.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=a;for(let p of l.events){let m=[p.event_id,p.eventId];for(let g of m)typeof g=="number"&&g>d&&(d=g)}return r&&d>a&&t.advance(e,d,{userId:o,deviceId:r}),await un.updateLastSync(e),{success:!0,skipped:!1,count:l.events.length,applied:u,syncedAt:l.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let n=0;for(let r of t)try{await this.applyEvent(e,r),n++}catch(o){let i=r.entity_type||r.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return n}async applyEvent(e,t){let{entityType:n,eventType:r,data:o,contentHash:i}=E$(t),a=o.id??"",l=Ip[n];if(!l){T$(n);return}if(r==="delete"){await l.delete(e,o),a&&tb(e,n,a);return}i&&this.alreadyApplied(e,n,a,i)||(await l.upsert(e,o),i&&a&&eb(e,n,a,i))}alreadyApplied(e,t,n,r){if(!n)return!1;let o=Zv(e,t,n);return o!==null&&o===r}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},C$=new Dp,ib=C$});import cb from"node:fs";import yc from"node:path";var Mp,R$,lb=h(()=>{"use strict";Xl();Mp=class{static{c(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?yc.resolve(e):yc.join(qe("node:os").homedir(),".prjct-cli");this.dbPath=yc.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=yc.dirname(this.dbPath);cb.existsSync(e)||cb.mkdirSync(e,{recursive:!0});let t=Bi(this.dbPath);return t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
1050
1050
  CREATE TABLE IF NOT EXISTS _system_migrations (
1051
1051
  version INTEGER PRIMARY KEY,
1052
1052
  name TEXT NOT NULL,
@@ -1067,7 +1067,7 @@ Available: ${Cd.join(", ")}`),{success:!1,error:"No pack given"};let r=e.split("
1067
1067
  INSERT OR REPLACE INTO mcp_health
1068
1068
  (provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
1069
1069
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1070
- `).run(e,t.status,r,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,r)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},R$=new Dp});var Yo,QK,ub=h(()=>{"use strict";lb();Yo="mcp-remote@0.1.38",QK={linear:`npx -y ${Yo} https://mcp.linear.app/mcp`,jira:`npx -y ${Yo} https://mcp.atlassian.com/v1/mcp`}});import P$ from"node:fs/promises";import db from"node:os";import yc from"node:path";function x$(){try{let s=yc.dirname(qe.resolve("prjct-cli/package.json"));return{command:"node",args:[yc.join(s,"dist","mcp","server.mjs")],description:"prjct: Spec-Driven Development + project memory. When the user describes work with goals or stakes attached, call prjct_spec_create FIRST, then prjct_spec_audit (parallel reviewers), then implement, then prjct_spec_ship. Skip the spec for routine work (single-file fix, doc tweak, capture). Recognize intent in any language; never make the user type prjct commands."}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct: Spec-Driven Development + project memory. When the user describes work with goals or stakes attached, call prjct_spec_create FIRST, then prjct_spec_audit (parallel reviewers), then implement, then prjct_spec_ship. Skip the spec for routine work (single-file fix, doc tweak, capture). Recognize intent in any language; never make the user type prjct commands."}}}function Hs(){return process.env.PRJCT_TEST_MODE==="1"?yc.join(db.tmpdir(),"prjct-context7-test","mcp.json"):yc.join(db.homedir(),".claude","mcp.json")}async function pb(s=Hs()){try{let e=await P$.readFile(s,"utf-8");return JSON.parse(e)}catch(e){let t=b(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${s}: ${b(e)}`)}}async function A$(s,e=Hs()){await ke(e,s)}async function Op(s,e,t=Hs()){let n=await pb(t),r={...n.mcpServers||{}},o=r[s];r[s]=e,n.mcpServers=r;let i=JSON.stringify(o)!==JSON.stringify(e);return await A$(n,t),{path:t,changed:i}}async function Np(s,e=Hs()){return!!(await pb(e)).mcpServers?.[s]}var Mp,mb=h(()=>{"use strict";F();V();ub();c(x$,"getPrjctMcpConfig");Mp={prjct:x$(),linear:{command:"npx",args:["-y",Yo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Yo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};c(Hs,"getClaudeMcpConfigPath");c(pb,"readMcpConfig");c(A$,"writeMcpConfig");c(Op,"upsertMcpServer");c(Np,"hasMcpServer")});import j$ from"node:fs/promises";import $$ from"node:http";import I$ from"node:path";import oe from"chalk";var Dr,Lp=h(()=>{"use strict";Wt();re();ge();Ao();dr();Ap();ab();F();Fe();V();mb();Te();pe();We();Ie();Dr=class extends X{static{c(this,"SetupCommands")}async auth(e=null,t={}){let n=e?.split(" ")[0]||"status",r=e?.split(" ").slice(1)||[];switch(n){case"login":{let o=r[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=r.indexOf("--url");return a!==-1&&r[a+1]&&(i=r[a+1]),await Ze.write({apiKey:o,...i?{apiUrl:i}:{}}),await _r.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(oe.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1070
+ `).run(e,t.status,r,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,r)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},R$=new Mp});var Yo,e5,ub=h(()=>{"use strict";lb();Yo="mcp-remote@0.1.38",e5={linear:`npx -y ${Yo} https://mcp.linear.app/mcp`,jira:`npx -y ${Yo} https://mcp.atlassian.com/v1/mcp`}});import P$ from"node:fs/promises";import db from"node:os";import wc from"node:path";function x$(){try{let s=wc.dirname(qe.resolve("prjct-cli/package.json"));return{command:"node",args:[wc.join(s,"dist","mcp","server.mjs")],description:"prjct: Spec-Driven Development + project memory. When the user describes work with goals or stakes attached, call prjct_spec_create FIRST, then prjct_spec_audit (parallel reviewers), then implement, then prjct_spec_ship. Skip the spec for routine work (single-file fix, doc tweak, capture). Recognize intent in any language; never make the user type prjct commands."}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct: Spec-Driven Development + project memory. When the user describes work with goals or stakes attached, call prjct_spec_create FIRST, then prjct_spec_audit (parallel reviewers), then implement, then prjct_spec_ship. Skip the spec for routine work (single-file fix, doc tweak, capture). Recognize intent in any language; never make the user type prjct commands."}}}function Hs(){return process.env.PRJCT_TEST_MODE==="1"?wc.join(db.tmpdir(),"prjct-context7-test","mcp.json"):wc.join(db.homedir(),".claude","mcp.json")}async function pb(s=Hs()){try{let e=await P$.readFile(s,"utf-8");return JSON.parse(e)}catch(e){let t=b(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${s}: ${b(e)}`)}}async function A$(s,e=Hs()){await ke(e,s)}async function Np(s,e,t=Hs()){let n=await pb(t),r={...n.mcpServers||{}},o=r[s];r[s]=e,n.mcpServers=r;let i=JSON.stringify(o)!==JSON.stringify(e);return await A$(n,t),{path:t,changed:i}}async function Lp(s,e=Hs()){return!!(await pb(e)).mcpServers?.[s]}var Op,mb=h(()=>{"use strict";F();V();ub();c(x$,"getPrjctMcpConfig");Op={prjct:x$(),linear:{command:"npx",args:["-y",Yo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Yo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};c(Hs,"getClaudeMcpConfigPath");c(pb,"readMcpConfig");c(A$,"writeMcpConfig");c(Np,"upsertMcpServer");c(Lp,"hasMcpServer")});import j$ from"node:fs/promises";import $$ from"node:http";import I$ from"node:path";import oe from"chalk";var Dr,Fp=h(()=>{"use strict";Wt();re();ge();Ao();dr();jp();ab();F();Fe();V();mb();Te();pe();We();Ie();Dr=class extends X{static{c(this,"SetupCommands")}async auth(e=null,t={}){let n=e?.split(" ")[0]||"status",r=e?.split(" ").slice(1)||[];switch(n){case"login":{let o=r[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=r.indexOf("--url");return a!==-1&&r[a+1]&&(i=r[a+1]),await Ze.write({apiKey:o,...i?{apiUrl:i}:{}}),await _r.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(oe.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1071
1071
  - **Status**: Connected
1072
1072
  - **Key**: \`${o.substring(0,12)}...\`
1073
1073
  - **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(oe.dim(`Key: ${o.substring(0,12)}...`)),f.info(oe.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
@@ -1154,17 +1154,17 @@ Please install one first:
1154
1154
  - OpenAI Codex: https://github.com/openai/codex`};if(r){console.log("\u{1F4E6} Installing /p:* commands...");let a=await He.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1155
1155
  \u2705 Installed ${a.installed?.length??0} commands to:
1156
1156
  ${_.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1157
- \u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let l of a.errors??[])console.log(` - ${l.file}: ${l.error}`)}}if(n.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:l}=await Promise.resolve().then(()=>(yr(),pa));await a();let u=await l({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${b(a)}`)}return await this.setupMcpServers(),console.log(`
1157
+ \u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let l of a.errors??[])console.log(` - ${l.file}: ${l.error}`)}}if(n.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:l}=await Promise.resolve().then(()=>(yr(),ma));await a();let u=await l({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${b(a)}`)}return await this.setupMcpServers(),console.log(`
1158
1158
  \u{1F389} Setup complete!`),console.log(`
1159
1159
  Next steps:`),console.log(` 1. Open ${i}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: prjct init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
1160
1160
  `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await He.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await He.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1161
1161
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1162
1162
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let l of t.errors??[])console.log(` - ${l.file}: ${l.error}`)}console.log(`
1163
1163
  \u{1F4DD} Installing global configuration...`);let n=await He.installGlobalConfig(),r=n.path?_.getDisplayPath(n.path):"global config";n.success?n.action==="created"?console.log(`\u2705 Created ${r}`):n.action==="updated"?console.log(`\u2705 Updated ${r}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${r}`):console.log(`\u26A0\uFE0F ${n.error}`);let o=(rt(),st(Ut)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1164
- \u26A1 Installing status line...`);let l=await this.installStatusLine();l.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${l.error}`)}if(a.installed)try{let{installCodexSkill:l,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(yr(),pa));await l();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(l){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${b(l)}`)}return await this.setupMcpServers(),console.log(`
1164
+ \u26A1 Installing status line...`);let l=await this.installStatusLine();l.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${l.error}`)}if(a.installed)try{let{installCodexSkill:l,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(yr(),ma));await l();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(l){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${b(l)}`)}return await this.setupMcpServers(),console.log(`
1165
1165
  \u{1F389} Setup complete!
1166
1166
  `),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
1167
- \u{1F50C} Configuring MCP servers...`);try{await xn.install();let e=await xn.verify();e.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e.message||""}`),console.log(" It will activate on the next time you open your AI client."))}catch(e){console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${b(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=Hs();await Np("linear",e)?console.log("\u2705 Linear MCP already configured"):(await Op("linear",Mp.linear),console.log("\u2705 Linear MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Linear command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Linear MCP setup failed: ${b(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=Hs();await Np("jira",e)?console.log("\u2705 Jira MCP already configured"):(await Op("jira",Mp.jira),console.log("\u2705 Jira MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Jira command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Jira MCP setup failed: ${b(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=_.getClaudeDir(),t=_.getClaudeSettingsPath(),n=I$.join(e,"prjct-statusline.sh"),r=`#!/bin/bash
1167
+ \u{1F50C} Configuring MCP servers...`);try{await xn.install();let e=await xn.verify();e.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e.message||""}`),console.log(" It will activate on the next time you open your AI client."))}catch(e){console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${b(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=Hs();await Lp("linear",e)?console.log("\u2705 Linear MCP already configured"):(await Np("linear",Op.linear),console.log("\u2705 Linear MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Linear command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Linear MCP setup failed: ${b(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=Hs();await Lp("jira",e)?console.log("\u2705 Jira MCP already configured"):(await Np("jira",Op.jira),console.log("\u2705 Jira MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Jira command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Jira MCP setup failed: ${b(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=_.getClaudeDir(),t=_.getClaudeSettingsPath(),n=I$.join(e,"prjct-statusline.sh"),r=`#!/bin/bash
1168
1168
  # prjct Status Line for Claude Code
1169
1169
  # Shows version update notifications and current task
1170
1170
 
@@ -1220,9 +1220,9 @@ fi
1220
1220
 
1221
1221
  # Default: show prjct branding
1222
1222
  echo "\u26A1 prjct"
1223
- `;await j$.writeFile(n,r,{mode:493});let o={};if(await C(t))try{o=await xe(t)??{}}catch{}return o.statusLine={type:"command",command:n},await ke(t,o),{success:!0}}catch(e){return Me(e)}}showAsciiArt(){console.log(oe.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(oe.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(oe.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(oe.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(oe.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(oe.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(oe.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${oe.bold.cyan("prjct")}${oe.magenta("/")}${oe.green("cli")} ${oe.dim.white(`v${le} installed`)}`),console.log(""),console.log(` ${oe.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${oe.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${oe.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(oe.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(oe.bold.cyan("\u{1F680} Quick Start")),console.log(oe.dim("\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(""),console.log(` ${oe.bold("1.")} Initialize your project:`),console.log(` ${oe.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${oe.bold("2.")} Start your first task:`),console.log(` ${oe.green('prjct task "build auth"')}`),console.log(""),console.log(` ${oe.bold("3.")} Ship & celebrate:`),console.log(` ${oe.green('prjct ship "user login"')}`),console.log(""),console.log(oe.dim("\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(""),console.log(` ${oe.dim("Documentation:")} ${oe.cyan("https://prjct.app")}`),console.log(` ${oe.dim("Report issues:")} ${oe.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(oe.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});var wb={};D(wb,{buildInventory:()=>L$,renderInventoryMd:()=>B$});import{execFile as _$}from"node:child_process";import fb from"node:fs/promises";import Mr from"node:path";import{promisify as D$}from"node:util";async function L$(s,e){let t=_e.list(e,{includeArchived:!0}),n={};for(let d of t)n[d.status]=(n[d.status]??0)+1;let r=new Map,o=new Set;for(let d of t){let p=F$(d);if(!p)continue;o.add(p);let m=r.get(p)??[];m.push(d),r.set(p,m)}let i=await H$(s);for(let d of i)o.add(d);let a=[],l=[];for(let d of[...o].sort()){let p=r.get(d)??[],m=await U$(s,d),g=await W$(s,d,p),k=p.length>0?p.reduce((y,w)=>w.updatedAt>y?w.updatedAt:y,""):null,E=!1;for(let y of p.filter(w=>w.status==="shipped")){let w=await G$(s,y);l.push({specId:y.id,title:y.title,status:y.status,drift:w.drift,locChanged:w.locChanged,cosmeticOnly:w.cosmeticOnly}),w.drift===!0?E=!0:w.drift==="unknown"&&E===!1&&(E="unknown")}a.push({module:d,specCount:p.length,coveredFiles:g,totalFiles:m,coveredPct:m===0?null:Math.round(g/m*1e4)/100,lastUpdated:k||null,drift:E})}let u=a.filter(d=>d.specCount===0).map(d=>d.module);return{generatedAt:new Date().toISOString(),projectPath:s,totalSpecs:t.length,byStatus:n,modules:a,driftDetail:l,uncoveredModules:u}}function F$(s){let e=s.content.scope[0];if(!e)return null;let t=e.match(/([a-zA-Z0-9_./-]+\/[a-zA-Z0-9_-]+)/);if(!t)return null;let n=t[1].split("/").slice(0,2);return n.length===2?n.join("/"):null}async function H$(s){let e=Mr.join(s,"core");try{return(await fb.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")&&!n.name.startsWith("__")).map(n=>`core/${n.name}`)}catch{return[]}}async function U$(s,e){let t=Mr.join(s,e),n=0;try{await Fp(t,async r=>{let o=Mr.relative(s,r);hb(o)||yb(o)&&n++})}catch{}return n}async function W$(s,e,t){let n=Mr.join(s,e),r=new Set;for(let i of t)for(let a of i.content.scope){let l=a.match(/[a-zA-Z0-9_./-]+\.[a-z]+/);l&&r.add(l[0])}let o=0;try{await Fp(n,async i=>{let a=Mr.relative(s,i);if(!hb(a)&&yb(a)){for(let l of r)if(a===l||a.startsWith(l.endsWith("/")?l:`${l}/`)){o++;break}}})}catch{}return o}async function Fp(s,e){let t;try{t=await fb.readdir(s,{withFileTypes:!0})}catch{return}for(let n of t){if(n.name.startsWith(".")||n.name==="node_modules"||n.name==="dist")continue;let r=Mr.join(s,n.name);n.isDirectory()?await Fp(r,e):n.isFile()&&await e(r)}}function hb(s){return N$.some(e=>e.test(s))}function yb(s){return/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(s)}async function G$(s,e){if(!e.shippedSha)return{drift:"unknown"};let t=e.content.scope.map(o=>o.match(/[a-zA-Z0-9_./-]+\.[a-z]+/)?.[0]??o.match(/[a-zA-Z0-9_./-]+\//)?.[0]).filter(o=>!!o);if(t.length===0)return{drift:"unknown"};let n=0;try{let{stdout:o}=await gb("git",["diff","--shortstat",`${e.shippedSha}..HEAD`,"--",...t],{cwd:s}),i=o.match(/(\d+) insertions?/),a=o.match(/(\d+) deletions?/);n=(i?Number.parseInt(i[1],10):0)+(a?Number.parseInt(a[1],10):0)}catch{return{drift:"unknown"}}if(n<=M$)return{drift:!1,locChanged:n,cosmeticOnly:!1};let r=!0;try{let{stdout:o}=await gb("git",["log","--format=%s",`${e.shippedSha}..HEAD`,"--",...t],{cwd:s}),i=o.split(`
1223
+ `;await j$.writeFile(n,r,{mode:493});let o={};if(await C(t))try{o=await xe(t)??{}}catch{}return o.statusLine={type:"command",command:n},await ke(t,o),{success:!0}}catch(e){return Me(e)}}showAsciiArt(){console.log(oe.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(oe.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(oe.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(oe.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(oe.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(oe.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(oe.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${oe.bold.cyan("prjct")}${oe.magenta("/")}${oe.green("cli")} ${oe.dim.white(`v${le} installed`)}`),console.log(""),console.log(` ${oe.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${oe.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${oe.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(oe.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(oe.bold.cyan("\u{1F680} Quick Start")),console.log(oe.dim("\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(""),console.log(` ${oe.bold("1.")} Initialize your project:`),console.log(` ${oe.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${oe.bold("2.")} Start your first task:`),console.log(` ${oe.green('prjct task "build auth"')}`),console.log(""),console.log(` ${oe.bold("3.")} Ship & celebrate:`),console.log(` ${oe.green('prjct ship "user login"')}`),console.log(""),console.log(oe.dim("\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(""),console.log(` ${oe.dim("Documentation:")} ${oe.cyan("https://prjct.app")}`),console.log(` ${oe.dim("Report issues:")} ${oe.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(oe.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});var wb={};D(wb,{buildInventory:()=>L$,renderInventoryMd:()=>B$});import{execFile as _$}from"node:child_process";import fb from"node:fs/promises";import Mr from"node:path";import{promisify as D$}from"node:util";async function L$(s,e){let t=_e.list(e,{includeArchived:!0}),n={};for(let d of t)n[d.status]=(n[d.status]??0)+1;let r=new Map,o=new Set;for(let d of t){let p=F$(d);if(!p)continue;o.add(p);let m=r.get(p)??[];m.push(d),r.set(p,m)}let i=await H$(s);for(let d of i)o.add(d);let a=[],l=[];for(let d of[...o].sort()){let p=r.get(d)??[],m=await U$(s,d),g=await W$(s,d,p),k=p.length>0?p.reduce((y,w)=>w.updatedAt>y?w.updatedAt:y,""):null,E=!1;for(let y of p.filter(w=>w.status==="shipped")){let w=await G$(s,y);l.push({specId:y.id,title:y.title,status:y.status,drift:w.drift,locChanged:w.locChanged,cosmeticOnly:w.cosmeticOnly}),w.drift===!0?E=!0:w.drift==="unknown"&&E===!1&&(E="unknown")}a.push({module:d,specCount:p.length,coveredFiles:g,totalFiles:m,coveredPct:m===0?null:Math.round(g/m*1e4)/100,lastUpdated:k||null,drift:E})}let u=a.filter(d=>d.specCount===0).map(d=>d.module);return{generatedAt:new Date().toISOString(),projectPath:s,totalSpecs:t.length,byStatus:n,modules:a,driftDetail:l,uncoveredModules:u}}function F$(s){let e=s.content.scope[0];if(!e)return null;let t=e.match(/([a-zA-Z0-9_./-]+\/[a-zA-Z0-9_-]+)/);if(!t)return null;let n=t[1].split("/").slice(0,2);return n.length===2?n.join("/"):null}async function H$(s){let e=Mr.join(s,"core");try{return(await fb.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")&&!n.name.startsWith("__")).map(n=>`core/${n.name}`)}catch{return[]}}async function U$(s,e){let t=Mr.join(s,e),n=0;try{await Hp(t,async r=>{let o=Mr.relative(s,r);hb(o)||yb(o)&&n++})}catch{}return n}async function W$(s,e,t){let n=Mr.join(s,e),r=new Set;for(let i of t)for(let a of i.content.scope){let l=a.match(/[a-zA-Z0-9_./-]+\.[a-z]+/);l&&r.add(l[0])}let o=0;try{await Hp(n,async i=>{let a=Mr.relative(s,i);if(!hb(a)&&yb(a)){for(let l of r)if(a===l||a.startsWith(l.endsWith("/")?l:`${l}/`)){o++;break}}})}catch{}return o}async function Hp(s,e){let t;try{t=await fb.readdir(s,{withFileTypes:!0})}catch{return}for(let n of t){if(n.name.startsWith(".")||n.name==="node_modules"||n.name==="dist")continue;let r=Mr.join(s,n.name);n.isDirectory()?await Hp(r,e):n.isFile()&&await e(r)}}function hb(s){return N$.some(e=>e.test(s))}function yb(s){return/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(s)}async function G$(s,e){if(!e.shippedSha)return{drift:"unknown"};let t=e.content.scope.map(o=>o.match(/[a-zA-Z0-9_./-]+\.[a-z]+/)?.[0]??o.match(/[a-zA-Z0-9_./-]+\//)?.[0]).filter(o=>!!o);if(t.length===0)return{drift:"unknown"};let n=0;try{let{stdout:o}=await gb("git",["diff","--shortstat",`${e.shippedSha}..HEAD`,"--",...t],{cwd:s}),i=o.match(/(\d+) insertions?/),a=o.match(/(\d+) deletions?/);n=(i?Number.parseInt(i[1],10):0)+(a?Number.parseInt(a[1],10):0)}catch{return{drift:"unknown"}}if(n<=M$)return{drift:!1,locChanged:n,cosmeticOnly:!1};let r=!0;try{let{stdout:o}=await gb("git",["log","--format=%s",`${e.shippedSha}..HEAD`,"--",...t],{cwd:s}),i=o.split(`
1224
1224
  `).filter(Boolean);if(i.length===0)return{drift:!1,locChanged:n,cosmeticOnly:!0};r=i.every(a=>O$.test(a))}catch{r=!1}return{drift:!r,locChanged:n,cosmeticOnly:r}}function B$(s){let e=[];if(e.push("# Spec inventory"),e.push(""),e.push(`_${s.totalSpecs} specs across ${s.modules.length} modules \xB7 generated ${s.generatedAt}_`),e.push(""),Object.keys(s.byStatus).length>0){e.push("## By status");for(let[t,n]of Object.entries(s.byStatus))e.push(`- ${t}: ${n}`);e.push("")}e.push("## Coverage by module"),e.push(""),e.push("| Module | Specs | Files | Covered | % | Drift | Last updated |"),e.push("|---|---|---|---|---|---|---|");for(let t of s.modules){let n=t.coveredPct===null?"n/a":`${t.coveredPct}%`,r=t.drift===!0?"\u26A0\uFE0F yes":t.drift==="unknown"?"\u2754":"\u2713",o=t.lastUpdated?t.lastUpdated.slice(0,10):"\u2014";e.push(`| \`${t.module}\` | ${t.specCount} | ${t.totalFiles} | ${t.coveredFiles} | ${n} | ${r} | ${o} |`)}if(s.uncoveredModules.length>0){e.push(""),e.push("## Modules with NO specs");for(let t of s.uncoveredModules)e.push(`- \`${t}\``)}return e.join(`
1225
- `)}var gb,M$,O$,N$,kb=h(()=>{"use strict";Bo();gb=D$(_$),M$=5,O$=/^(chore|style|format|fmt|docs|typo)(\(|:|!)/i,N$=[/(^|\/)types\.ts$/,/(^|\/)types\//,/\/__tests__\//,/\.d\.ts$/,/(^|\/)index\.ts$/,/\.test\.ts$/,/\.spec\.ts$/];c(L$,"buildInventory");c(F$,"inferModule");c(H$,"listTopLevelModules");c(U$,"countModuleFiles");c(W$,"countCoveredFiles");c(Fp,"walk");c(hb,"excluded");c(yb,"isCodeFile");c(G$,"driftForSpec");c(B$,"renderInventoryMd")});function V$(s){if(!s)return{};let e={};for(let t of s.split(",")){let n=t.trim(),r=n.indexOf(":");r>0&&(e[n.slice(0,r)]=n.slice(r+1))}return e}function q$(s){let e=s.content,t=[`# ${s.title}`,"",`**id:** \`${s.id}\` \xB7 **status:** ${s.status} \xB7 **created:** ${s.createdAt}`,"","## Goal",e.goal];if(e.eli10&&t.push("","## ELI10",e.eli10),e.stakes&&t.push("","## Stakes",e.stakes),e.acceptance_criteria.length>0){t.push("","## Acceptance criteria");for(let n of e.acceptance_criteria)t.push(`- [ ] ${n}`)}if(e.scope.length>0){t.push("","## Scope");for(let n of e.scope)t.push(`- ${n}`)}if(e.out_of_scope.length>0){t.push("","## Out of scope");for(let n of e.out_of_scope)t.push(`- ${n}`)}if(e.risks.length>0){t.push("","## Risks");for(let n of e.risks)t.push(`- **${n.risk}** \u2014 ${n.mitigation}`)}if(e.test_plan.length>0){t.push("","## Test plan");for(let n of e.test_plan)t.push(`- ${n}`)}if(e.reviews){t.push("","## Reviews");for(let n of Is){let r=e.reviews[n];r&&t.push(`- **${n}:** ${r.verdict} \u2014 ${r.notes} _(${r.ts})_`)}}return e.linked_tasks.length>0&&t.push("","## Linked tasks",...e.linked_tasks.map(n=>`- ${n}`)),e.notes&&t.push("","## Notes",e.notes),t.join(`
1225
+ `)}var gb,M$,O$,N$,kb=h(()=>{"use strict";Bo();gb=D$(_$),M$=5,O$=/^(chore|style|format|fmt|docs|typo)(\(|:|!)/i,N$=[/(^|\/)types\.ts$/,/(^|\/)types\//,/\/__tests__\//,/\.d\.ts$/,/(^|\/)index\.ts$/,/\.test\.ts$/,/\.spec\.ts$/];c(L$,"buildInventory");c(F$,"inferModule");c(H$,"listTopLevelModules");c(U$,"countModuleFiles");c(W$,"countCoveredFiles");c(Hp,"walk");c(hb,"excluded");c(yb,"isCodeFile");c(G$,"driftForSpec");c(B$,"renderInventoryMd")});function V$(s){if(!s)return{};let e={};for(let t of s.split(",")){let n=t.trim(),r=n.indexOf(":");r>0&&(e[n.slice(0,r)]=n.slice(r+1))}return e}function q$(s){let e=s.content,t=[`# ${s.title}`,"",`**id:** \`${s.id}\` \xB7 **status:** ${s.status} \xB7 **created:** ${s.createdAt}`,"","## Goal",e.goal];if(e.eli10&&t.push("","## ELI10",e.eli10),e.stakes&&t.push("","## Stakes",e.stakes),e.acceptance_criteria.length>0){t.push("","## Acceptance criteria");for(let n of e.acceptance_criteria)t.push(`- [ ] ${n}`)}if(e.scope.length>0){t.push("","## Scope");for(let n of e.scope)t.push(`- ${n}`)}if(e.out_of_scope.length>0){t.push("","## Out of scope");for(let n of e.out_of_scope)t.push(`- ${n}`)}if(e.risks.length>0){t.push("","## Risks");for(let n of e.risks)t.push(`- **${n.risk}** \u2014 ${n.mitigation}`)}if(e.test_plan.length>0){t.push("","## Test plan");for(let n of e.test_plan)t.push(`- ${n}`)}if(e.reviews){t.push("","## Reviews");for(let n of Is){let r=e.reviews[n];r&&t.push(`- **${n}:** ${r.verdict} \u2014 ${r.notes} _(${r.ts})_`)}}return e.linked_tasks.length>0&&t.push("","## Linked tasks",...e.linked_tasks.map(n=>`- ${n}`)),e.notes&&t.push("","## Notes",e.notes),t.join(`
1226
1226
  `)}function J$(s,e,t){let n=X$(t.scope),r=n.length>0?`
1227
1227
 
1228
1228
  ## Codebase paths to read (from spec.scope)
@@ -1233,7 +1233,7 @@ Each reviewer SHOULD use the Read tool on these paths (cap 10 per reviewer) to g
1233
1233
 
1234
1234
  ## Codebase paths
1235
1235
  _No path-shaped scope entries found. Reviewers judge the spec body alone._`;return[`# audit-spec dispatch \u2014 ${e}`,"",`Spec id: \`${s}\``,"","Run three review subagents IN PARALLEL via the Agent tool \u2014 one tool-use block per reviewer, all in the SAME message so they run concurrently. Each subagent reads the spec FROM prjct (command below), reads the relevant codebase paths, applies its rubric, then returns a structured verdict.","","## Where the spec lives \u2014 read it from prjct, it is NOT in this prompt",`The plan lives in prjct (SQLite + regenerated vault), never duplicated into a dispatch payload. Each reviewer subagent runs \`prjct spec show ${s} --md\` itself, in its own fresh context window, to read the full spec. Do NOT paste the spec body into the subagent prompts \u2014 point them at that command. (Same rule for any memory the reviewer wants: \`prjct context memory <topic>\` \u2014 pulled by the subagent, not pre-pasted by you.)`,"","## Model policy (perf \u2014 read before dispatching)",`${kg("strategic-review")} The SAME applies to all three reviewers (strategic, architecture, design) \u2014 they judge a spec, they do not implement, so they must NOT run on the parent's max model. Hand reviewers the spec-read COMMAND and the codebase PATHS + the Read tool \u2014 never paste spec body or file contents into their prompts.`,r,"","## Reviewer A \u2014 strategic (scope sanity)",`Subagent prompt: "First run \`prjct spec show ${s} --md\` to read the spec. Review it for strategic soundness. Does it solve a real problem? Is the goal worth the cost? Is out_of_scope coherent with goal? Is the spec OVER- or UNDER-scoped? Cross-reference relevant prior memory via \`prjct context memory <topic>\` if useful. Return verdict (pass|fail) and 2-4 sentence notes."`,"","## Reviewer B \u2014 architecture (eng feasibility)",`Subagent prompt: "First run \`prjct spec show ${s} --md\` to read the spec. Then read the codebase paths listed above (Read tool, cap 10 files). Can this be built ON TOP of what exists? Does the spec contradict an existing state machine, schema, or contract? What failure modes / dependencies / edge cases are missing? Include a short ASCII diagram + cite at least one concrete symbol from the codebase in notes when applicable. Return verdict (pass|fail) and 2-4 sentence notes."`,"","## Reviewer C \u2014 design (UX/DX)",`Subagent prompt: "First run \`prjct spec show ${s} --md\` to read the spec. Rate 0-10 across {clarity, ergonomics, consistency, accessibility} for the user-facing or developer-facing surface. If scope touches existing UI/CLI patterns (read the listed paths), consistency must be judged against those \u2014 not against your priors. Return verdict (pass if all dimensions \u22656, fail otherwise) + the four scores."`,"","## After dispatch","For each reviewer that returns:",` prjct spec record-review ${s} --reviewer <strategic|architecture|design> --verdict <pass|fail> --notes "<their notes>"`,"","When all three are recorded, the spec auto-promotes from `draft` \u2192 `reviewed`."].join(`
1236
- `)}function X$(s){let e=[];for(let t of s){let n=t.match(/[a-zA-Z0-9_./-]+\.[a-zA-Z]+/)??t.match(/[a-zA-Z0-9_./-]+\//);if(n&&!e.includes(n[0])&&e.push(n[0]),e.length>=12)break}return e}var Or,Hp=h(()=>{"use strict";re();fo();Qa();F();Go();Te();pe();Ie();Or=class extends X{static{c(this,"SpecCommands")}async draft(e=null,t=process.cwd(),n={}){try{if(!e||!e.trim())return f.info('Usage: prjct spec "<title>" [--goal "..."] [--tags k:v,...]'),{success:!1,error:"Title required"};let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=n.goal?.trim()||e.trim(),i=V$(n.tags),a=await $t.create(t,{title:e.trim(),content:{goal:o},tags:i,autoContext:!n.skipContext});return n.md?console.log(`\u2713 spec drafted: ${a.title}
1236
+ `)}function X$(s){let e=[];for(let t of s){let n=t.match(/[a-zA-Z0-9_./-]+\.[a-zA-Z]+/)??t.match(/[a-zA-Z0-9_./-]+\//);if(n&&!e.includes(n[0])&&e.push(n[0]),e.length>=12)break}return e}var Or,Up=h(()=>{"use strict";re();fo();Za();F();Go();Te();pe();Ie();Or=class extends X{static{c(this,"SpecCommands")}async draft(e=null,t=process.cwd(),n={}){try{if(!e||!e.trim())return f.info('Usage: prjct spec "<title>" [--goal "..."] [--tags k:v,...]'),{success:!1,error:"Title required"};let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=n.goal?.trim()||e.trim(),i=V$(n.tags),a=await $t.create(t,{title:e.trim(),content:{goal:o},tags:i,autoContext:!n.skipContext});return n.md?console.log(`\u2713 spec drafted: ${a.title}
1237
1237
 
1238
1238
  spec_id: ${a.id}
1239
1239
  status: ${a.status}
@@ -1251,8 +1251,8 @@ scope:`);for(let i of o.content.scope)console.log(` - ${i}`)}if(o.content.out_o
1251
1251
  out of scope:`);for(let i of o.content.out_of_scope)console.log(` - ${i}`)}if(o.content.risks.length>0){console.log(`
1252
1252
  risks:`);for(let i of o.content.risks)console.log(` - ${i.risk} \u2192 ${i.mitigation}`)}if(o.content.test_plan.length>0){console.log(`
1253
1253
  test plan:`);for(let i of o.content.test_plan)console.log(` - ${i}`)}}return{success:!0,spec:o}}catch(r){return N(b(r))}}async update(e=null,t=process.cwd(),n={}){try{if(!e)return H(`Usage: prjct spec update <id> --json '{"goal": "...", ...}'`);let r=typeof n.json=="string"?n.json:"";if(!r)return H("--json is required");let o=await this.ensureProjectInit(t);if(!o.success)return o;let i;try{i=JSON.parse(r)}catch{return H("--json is not valid JSON")}if(i===null||typeof i!="object"||Array.isArray(i))return H("--json must decode to an object");let a=await $t.get(t,e);if(!a)return H(`spec not found: ${e}`);let l=Dn.parse({...a.content,...i}),u=await $t.update(t,e,l);return u?(n.md?console.log(`\u2713 spec updated: ${u.title}`):f.done(`spec updated: ${u.title}`),{success:!0,specId:u.id}):H(`spec not found: ${e}`)}catch(r){return N(b(r))}}async setStatus(e=null,t=process.cwd(),n={}){try{if(!e)return H("Usage: prjct spec set-status <id> <status>");let r=n.status;if(!r||!ss.includes(r))return H(`status must be one of: ${ss.join(", ")}`);let o=await this.ensureProjectInit(t);return o.success?await $t.setStatus(t,e,r)?(n.md?console.log(`\u2713 spec ${e} \u2192 ${r}`):f.done(`spec status: ${r}`),{success:!0,specId:e,status:r}):H(`spec not found: ${e}`):o}catch(r){return N(b(r))}}async recordReview(e=null,t=process.cwd(),n={}){try{if(!e)return H('Usage: prjct spec record-review <id> --reviewer <strategic|architecture|design> --verdict <pass|fail> --notes "..."');let r=n.reviewer,o=n.verdict;if(!r||!Is.includes(r))return H(`--reviewer must be one of: ${Is.join(", ")}`);if(o!=="pass"&&o!=="fail")return H("--verdict must be `pass` or `fail`");let i=await this.ensureProjectInit(t);if(!i.success)return i;let a=await $t.recordReview(t,e,r,{verdict:o,notes:n.notes??""});if(!a)return H(`spec not found: ${e}`);let l=`${r} \u2192 ${o}${a.status==="reviewed"?" (all reviewers passed \u2192 status: reviewed)":""}`;return n.md?console.log(`\u2713 ${l}`):f.done(l),{success:!0,specId:e,status:a.status}}catch(r){return N(b(r))}}async linkTask(e=null,t=process.cwd(),n={}){try{if(!e||!n.taskId)return H("Usage: prjct spec link-task <spec-id> --task-id <id>");let r=await this.ensureProjectInit(t);return r.success?await $t.linkTask(t,e,n.taskId)?(n.md?console.log(`\u2713 linked task ${n.taskId} to spec ${e}`):f.done("linked task \u2192 spec"),{success:!0,specId:e,taskId:n.taskId}):H(`spec not found: ${e}`):r}catch(r){return N(b(r))}}async ship(e=null,t=process.cwd(),n={}){try{if(!e)return H("Usage: prjct spec ship <id> [--pr <number>]");let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=n.pr!==void 0?Number(n.pr):void 0,i=await $t.ship(t,e,o!==void 0&&Number.isFinite(o)?o:void 0);return i?(n.md?console.log(`\u2713 spec shipped: ${i.title}${o?` (PR #${o})`:""}`):f.done(`spec shipped${o?` (PR #${o})`:""}`),{success:!0,specId:e,status:"shipped"}):H(`spec not found: ${e}`)}catch(r){return N(b(r))}}async audit(e=null,t=process.cwd(),n={}){try{if(!e)return H("Usage: prjct spec audit <id>");let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $t.get(t,e);if(!o)return H(`spec not found: ${e}`);let i=J$(o.id,o.title,o.content);return console.log(i),{success:!0,specId:e,dispatch:"emitted"}}catch(r){return N(b(r))}}async breakdown(e=null,t=process.cwd(),n={}){try{if(!e)return H("Usage: prjct spec breakdown <id> [--force]");let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $t.get(t,e);if(!o)return H(`spec not found: ${e}`);let i=new Set(["reviewed","shipped","archived"]);if(!i.has(o.status)&&n.force!==!0)return process.stderr.write(`error: spec status is '${o.status}'; breakdown requires 'reviewed' or later. Re-run with --force if intentional.
1254
- `),process.exitCode=2,{success:!1,error:`spec status '${o.status}' is below the breakdown gate`};let a=n.force===!0&&!i.has(o.status),l=await I.getProjectId(t);if(!l)return N("No prjct project. Run `prjct init` first.");let{breakdownSpecToTasks:u}=await Promise.resolve().then(()=>(Hd(),Fd)),d=await u(l,t,o),p=null;if(a){let{projectMemory:g}=await Promise.resolve().then(()=>($e(),Ma)),k=await g.remember(t,{type:"spec",content:`prjct spec breakdown --force on '${o.title}' (status was '${o.status}')`,tags:{spec_id:o.id,event:"spec.breakdown.forced",from_status:o.status},source:o.id});p=typeof k=="string"?k:null}let m=[];if(p&&m.push(`forced-breakdown event=${p}`),d.skippedReason==="already_broken_down")m.push(`skipped: already_broken_down (spec ${e})`);else if(d.skippedReason==="no_acceptance_criteria")m.push(`skipped: no_acceptance_criteria (spec ${e})`);else{let g=d.recoveredFromPartial?" (recovered from partial)":"";m.push(`\u2713 breakdown: ${d.taskIds.length} task(s) linked${g}`)}for(let g of m)console.log(g);return{success:!0,specId:e,forced:a,forcedEventMemId:p,taskIds:d.taskIds,recoveredFromPartial:d.recoveredFromPartial===!0,skippedReason:d.skippedReason}}catch(r){return N(b(r))}}async inventory(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let{default:o}=await Promise.resolve().then(()=>(re(),ws)),a=(await o.readConfig(t))?.projectId;if(!a)return H("not a prjct project");let{buildInventory:l,renderInventoryMd:u}=await Promise.resolve().then(()=>(kb(),wb)),d=await l(t,a);if(n.json)console.log(JSON.stringify(d,null,2));else if(n.md)console.log(u(d));else{f.info(`${d.totalSpecs} specs across ${d.modules.length} modules`);for(let p of d.modules){let m=p.coveredPct===null?"n/a":`${p.coveredPct}%`,g=p.drift===!0?" DRIFT":p.drift==="unknown"?" ?":"";console.log(` ${p.module.padEnd(20)} ${String(p.specCount).padStart(3)} specs \xB7 ${m.padStart(6)} covered${g}`)}d.uncoveredModules.length>0&&f.info(`${d.uncoveredModules.length} module(s) without specs`)}return{success:!0,totalSpecs:d.totalSpecs}}catch(r){return N(b(r))}}};c(V$,"parseFlagTags");c(q$,"renderSpecMarkdown");c(J$,"renderAuditDispatch");c(X$,"extractScopePaths")});import{exec as z$}from"node:child_process";import Us from"node:fs/promises";import Nr from"node:path";import{promisify as K$}from"node:util";function Wp(s){let e={required:s.required,minVersion:s.minVersion,enrolledAt:s.enrolledAt};return s.enrolledBy!==null&&(e.enrolledBy=s.enrolledBy),`${JSON.stringify(e,null,2)}
1255
- `}function Y$(s,e){let t;try{t=JSON.parse(s)}catch{return null}let n=t,r={required:n.required===!0,minVersion:typeof n.minVersion=="string"?n.minVersion:"",enrolledAt:typeof n.enrolledAt=="string"?n.enrolledAt:"",enrolledBy:typeof n.enrolledBy=="string"?n.enrolledBy:e.enrolledBy};return ja(r)}function Z$(s){return[vb,"# prjct (team mode)","",`This repo is enrolled in prjct team mode (required: ${s.required}, minVersion: ${s.minVersion}, enrolled: ${s.enrolledAt}).`,"","When working in this repo:","- prjct stores project memory (decisions, learnings, gotchas, patterns) per project.","- The vault lives at `~/Documents/prjct/<slug>/_generated/`.","- Always lookup the vault before re-reading source for project context.",'- Capture substantive analysis back via `prjct remember <type> "..."`.',"","Don't have prjct? Install once: `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash`",`${s.required?"This repo *requires* prjct \u2014 please install before contributing.":""}`,bb].filter(e=>e!=="").join(`
1254
+ `),process.exitCode=2,{success:!1,error:`spec status '${o.status}' is below the breakdown gate`};let a=n.force===!0&&!i.has(o.status),l=await I.getProjectId(t);if(!l)return N("No prjct project. Run `prjct init` first.");let{breakdownSpecToTasks:u}=await Promise.resolve().then(()=>(Ud(),Hd)),d=await u(l,t,o),p=null;if(a){let{projectMemory:g}=await Promise.resolve().then(()=>($e(),Oa)),k=await g.remember(t,{type:"spec",content:`prjct spec breakdown --force on '${o.title}' (status was '${o.status}')`,tags:{spec_id:o.id,event:"spec.breakdown.forced",from_status:o.status},source:o.id});p=typeof k=="string"?k:null}let m=[];if(p&&m.push(`forced-breakdown event=${p}`),d.skippedReason==="already_broken_down")m.push(`skipped: already_broken_down (spec ${e})`);else if(d.skippedReason==="no_acceptance_criteria")m.push(`skipped: no_acceptance_criteria (spec ${e})`);else{let g=d.recoveredFromPartial?" (recovered from partial)":"";m.push(`\u2713 breakdown: ${d.taskIds.length} task(s) linked${g}`)}for(let g of m)console.log(g);return{success:!0,specId:e,forced:a,forcedEventMemId:p,taskIds:d.taskIds,recoveredFromPartial:d.recoveredFromPartial===!0,skippedReason:d.skippedReason}}catch(r){return N(b(r))}}async inventory(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let{default:o}=await Promise.resolve().then(()=>(re(),ws)),a=(await o.readConfig(t))?.projectId;if(!a)return H("not a prjct project");let{buildInventory:l,renderInventoryMd:u}=await Promise.resolve().then(()=>(kb(),wb)),d=await l(t,a);if(n.json)console.log(JSON.stringify(d,null,2));else if(n.md)console.log(u(d));else{f.info(`${d.totalSpecs} specs across ${d.modules.length} modules`);for(let p of d.modules){let m=p.coveredPct===null?"n/a":`${p.coveredPct}%`,g=p.drift===!0?" DRIFT":p.drift==="unknown"?" ?":"";console.log(` ${p.module.padEnd(20)} ${String(p.specCount).padStart(3)} specs \xB7 ${m.padStart(6)} covered${g}`)}d.uncoveredModules.length>0&&f.info(`${d.uncoveredModules.length} module(s) without specs`)}return{success:!0,totalSpecs:d.totalSpecs}}catch(r){return N(b(r))}}};c(V$,"parseFlagTags");c(q$,"renderSpecMarkdown");c(J$,"renderAuditDispatch");c(X$,"extractScopePaths")});import{exec as z$}from"node:child_process";import Us from"node:fs/promises";import Nr from"node:path";import{promisify as K$}from"node:util";function Gp(s){let e={required:s.required,minVersion:s.minVersion,enrolledAt:s.enrolledAt};return s.enrolledBy!==null&&(e.enrolledBy=s.enrolledBy),`${JSON.stringify(e,null,2)}
1255
+ `}function Y$(s,e){let t;try{t=JSON.parse(s)}catch{return null}let n=t,r={required:n.required===!0,minVersion:typeof n.minVersion=="string"?n.minVersion:"",enrolledAt:typeof n.enrolledAt=="string"?n.enrolledAt:"",enrolledBy:typeof n.enrolledBy=="string"?n.enrolledBy:e.enrolledBy};return $a(r)}function Z$(s){return[vb,"# prjct (team mode)","",`This repo is enrolled in prjct team mode (required: ${s.required}, minVersion: ${s.minVersion}, enrolled: ${s.enrolledAt}).`,"","When working in this repo:","- prjct stores project memory (decisions, learnings, gotchas, patterns) per project.","- The vault lives at `~/Documents/prjct/<slug>/_generated/`.","- Always lookup the vault before re-reading source for project context.",'- Capture substantive analysis back via `prjct remember <type> "..."`.',"","Don't have prjct? Install once: `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash`",`${s.required?"This repo *requires* prjct \u2014 please install before contributing.":""}`,bb].filter(e=>e!=="").join(`
1256
1256
  `)}function e0(s,e,t,n){if(!s.trim())return`${e}
1257
1257
  `;let r=s.indexOf(t),o=s.indexOf(n);if(r>=0&&o>r){let a=s.slice(0,r),l=s.slice(o+n.length);return`${`${a}${e}${l}`.replace(/\n{3,}/g,`
1258
1258
 
@@ -1260,9 +1260,9 @@ test plan:`);for(let i of o.content.test_plan)console.log(` - ${i}`)}}return{su
1260
1260
  `}return`${s.replace(/\s+$/,"")}
1261
1261
 
1262
1262
  ${e}
1263
- `}var Up,vb,bb,Lr,Q$,Gp=h(()=>{"use strict";re();$e();Ia();F();V();Te();kt();pe();We();Ie();Up=K$(z$),vb="<!-- prjct-team:start - DO NOT REMOVE THIS MARKER -->",bb="<!-- prjct-team:end - DO NOT REMOVE THIS MARKER -->";c(Wp,"renderTeamMirror");Lr=class extends X{static{c(this,"TeamCommands")}async team(e=null,t=process.cwd(),n={}){if(e==="check")return this.check(t,n);try{let r={required:n.required===!0,minVersion:n.minVersion??le??"0.0.0",enrolledAt:new Date().toISOString(),enrolledBy:null},o=Nr.join(t,".prjct","team.json"),i=Nr.join(t,".claude","CLAUDE.md"),a=await this.ensureProjectInit(t);if(!a.success)return a;let l=await I.getProjectId(t);if(!l)return N("No prjct project. Run `prjct init` first.",n);kr.set(l,r);try{await ds(o,Wp(r))}catch(v){let S=b(v);await J.remember(t,{type:"inbox",content:`team.json mirror write failed: ${S}`,tags:{"mirror-drift":"1"},provenance:"declared"}).catch(()=>{})}await Us.mkdir(Nr.dirname(i),{recursive:!0});let u=Z$(r),d="";try{d=await Us.readFile(i,"utf-8")}catch{}let p=e0(d,u,vb,bb);await Us.writeFile(i,p,"utf-8");let m=!1,g=[o,i];try{await Up("git rev-parse --show-toplevel",{cwd:t});let v=null;n.enforce===!0&&(v=Nr.join(t,".githooks","pre-commit"),await Us.mkdir(Nr.dirname(v),{recursive:!0}),await Us.writeFile(v,Q$,"utf-8"),await Us.chmod(v,493),await Up("git config core.hooksPath .githooks",{cwd:t}),g.push(v)),await Up(`git add ${g.map(S=>JSON.stringify(S)).join(" ")}`,{cwd:t}),m=!0}catch{}let k=n.enforce?" + pre-commit enforce":"",E=`${r.required?"\u2713 team mode (required)":"\u2713 team mode (optional)"}${k} \u2014 minVersion ${r.minVersion}`,y=m?`Staged: ${g.map(v=>v.replace(`${t}/`,"")).join(", ")}`:"Files written but not staged (no git repo or git missing).",w=["1. Review the diff: `git diff --staged`",'2. Commit: `git commit -m "chore: enroll repo in prjct team mode"`',"3. Push: `git push`","4. Teammates run `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash` (or `npm install -g prjct-cli@latest`).",...n.enforce?["5. **Each teammate** runs `git config core.hooksPath .githooks` once (or `prjct team --enforce` to do it automatically)."]:[]].join(`
1263
+ `}var Wp,vb,bb,Lr,Q$,Bp=h(()=>{"use strict";re();$e();_a();F();V();Te();kt();pe();We();Ie();Wp=K$(z$),vb="<!-- prjct-team:start - DO NOT REMOVE THIS MARKER -->",bb="<!-- prjct-team:end - DO NOT REMOVE THIS MARKER -->";c(Gp,"renderTeamMirror");Lr=class extends X{static{c(this,"TeamCommands")}async team(e=null,t=process.cwd(),n={}){if(e==="check")return this.check(t,n);try{let r={required:n.required===!0,minVersion:n.minVersion??le??"0.0.0",enrolledAt:new Date().toISOString(),enrolledBy:null},o=Nr.join(t,".prjct","team.json"),i=Nr.join(t,".claude","CLAUDE.md"),a=await this.ensureProjectInit(t);if(!a.success)return a;let l=await I.getProjectId(t);if(!l)return N("No prjct project. Run `prjct init` first.",n);kr.set(l,r);try{await ds(o,Gp(r))}catch(v){let S=b(v);await J.remember(t,{type:"inbox",content:`team.json mirror write failed: ${S}`,tags:{"mirror-drift":"1"},provenance:"declared"}).catch(()=>{})}await Us.mkdir(Nr.dirname(i),{recursive:!0});let u=Z$(r),d="";try{d=await Us.readFile(i,"utf-8")}catch{}let p=e0(d,u,vb,bb);await Us.writeFile(i,p,"utf-8");let m=!1,g=[o,i];try{await Wp("git rev-parse --show-toplevel",{cwd:t});let v=null;n.enforce===!0&&(v=Nr.join(t,".githooks","pre-commit"),await Us.mkdir(Nr.dirname(v),{recursive:!0}),await Us.writeFile(v,Q$,"utf-8"),await Us.chmod(v,493),await Wp("git config core.hooksPath .githooks",{cwd:t}),g.push(v)),await Wp(`git add ${g.map(S=>JSON.stringify(S)).join(" ")}`,{cwd:t}),m=!0}catch{}let k=n.enforce?" + pre-commit enforce":"",E=`${r.required?"\u2713 team mode (required)":"\u2713 team mode (optional)"}${k} \u2014 minVersion ${r.minVersion}`,y=m?`Staged: ${g.map(v=>v.replace(`${t}/`,"")).join(", ")}`:"Files written but not staged (no git repo or git missing).",w=["1. Review the diff: `git diff --staged`",'2. Commit: `git commit -m "chore: enroll repo in prjct team mode"`',"3. Push: `git push`","4. Teammates run `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash` (or `npm install -g prjct-cli@latest`).",...n.enforce?["5. **Each teammate** runs `git config core.hooksPath .githooks` once (or `prjct team --enforce` to do it automatically)."]:[]].join(`
1264
1264
  `);return n.md?console.log(W(q("Team mode enrolled",E),q("Files",y),q("Next",w))):(f.done(E),console.log(y),console.log(`
1265
- Next steps:`),console.log(w)),{success:!0,teamConfig:r,staged:m,teamPath:o,claudeMdPath:i}}catch(r){let o=b(r);return N(o)}}async check(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await I.getProjectId(e);if(!r)return N("No prjct project. Run `prjct init` first.",t);let o=Nr.join(e,".prjct","team.json"),i=kr.get(r),a=null;try{a=await Us.readFile(o,"utf-8")}catch{a=null}if(i===null&&a!==null){let u;try{u=JSON.parse(a)}catch{return H(`cannot parse ${o} \u2014 fix or delete the file before running team check again`,t)}let d={required:typeof u.required=="boolean"?u.required:!1,minVersion:typeof u.minVersion=="string"?u.minVersion:le??"0.0.0",enrolledAt:typeof u.enrolledAt=="string"?u.enrolledAt:new Date().toISOString(),enrolledBy:typeof u.enrolledBy=="string"?u.enrolledBy:null};kr.set(r,d),await ds(o,Wp(d));let p="\u2713 team check: migrated disk \u2192 DB; mirror rewritten";return t.md?console.log(`> ${p}`):f.done(p),{success:!0,healed:!0,migrated:!0}}if(i!==null){let u=ja(i);if((a===null?null:Y$(a,i))===u){let m="\u2713 team check: mirror in sync";return t.md?console.log(`> ${m}`):f.done(m),{success:!0,healed:!1}}await ds(o,Wp(i));let p="\u2713 team check: drift detected; mirror rewritten from DB";return t.md?console.log(`> ${p}`):f.done(p),{success:!0,healed:!0}}let l="\u2713 team check: no enrollment configured";return t.md?console.log(`> ${l}`):f.done(l),{success:!0,healed:!1,empty:!0}}catch(n){return N(b(n),t)}}};c(Y$,"canonicalizeDiskTeamJson");Q$=`#!/usr/bin/env sh
1265
+ Next steps:`),console.log(w)),{success:!0,teamConfig:r,staged:m,teamPath:o,claudeMdPath:i}}catch(r){let o=b(r);return N(o)}}async check(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await I.getProjectId(e);if(!r)return N("No prjct project. Run `prjct init` first.",t);let o=Nr.join(e,".prjct","team.json"),i=kr.get(r),a=null;try{a=await Us.readFile(o,"utf-8")}catch{a=null}if(i===null&&a!==null){let u;try{u=JSON.parse(a)}catch{return H(`cannot parse ${o} \u2014 fix or delete the file before running team check again`,t)}let d={required:typeof u.required=="boolean"?u.required:!1,minVersion:typeof u.minVersion=="string"?u.minVersion:le??"0.0.0",enrolledAt:typeof u.enrolledAt=="string"?u.enrolledAt:new Date().toISOString(),enrolledBy:typeof u.enrolledBy=="string"?u.enrolledBy:null};kr.set(r,d),await ds(o,Gp(d));let p="\u2713 team check: migrated disk \u2192 DB; mirror rewritten";return t.md?console.log(`> ${p}`):f.done(p),{success:!0,healed:!0,migrated:!0}}if(i!==null){let u=$a(i);if((a===null?null:Y$(a,i))===u){let m="\u2713 team check: mirror in sync";return t.md?console.log(`> ${m}`):f.done(m),{success:!0,healed:!1}}await ds(o,Gp(i));let p="\u2713 team check: drift detected; mirror rewritten from DB";return t.md?console.log(`> ${p}`):f.done(p),{success:!0,healed:!0}}let l="\u2713 team check: no enrollment configured";return t.md?console.log(`> ${l}`):f.done(l),{success:!0,healed:!1,empty:!0}}catch(n){return N(b(n),t)}}};c(Y$,"canonicalizeDiskTeamJson");Q$=`#!/usr/bin/env sh
1266
1266
  # prjct team enforce \u2014 blocks commits when team.json says required:true
1267
1267
  # and the contributor doesn't have prjct installed locally.
1268
1268
  # Generated by 'prjct team --enforce'. Safe to delete; safe to re-run.
@@ -1286,15 +1286,15 @@ if ! command -v prjct >/dev/null 2>&1; then
1286
1286
  fi
1287
1287
 
1288
1288
  exit 0
1289
- `;c(Z$,"teamClaudeMdBlock");c(e0,"upsertBetweenMarkers")});import{execSync as Qo}from"node:child_process";import t0 from"node:os";import Ws from"node:path";function Fr(){try{return!!Qo("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function wc(s){try{return Qo(`command -v ${s}`,{stdio:"pipe",shell:"/bin/sh"}),!0}catch{return!1}}function Bp(){let s=[process.argv[1],process.execPath].filter(Boolean);for(let e of s){let t=e;try{t=qe("node:fs").realpathSync(e)}catch{}if(t.includes("/.bun/install/global")||t.includes("/.bun/bin/"))return"bun";if(t.includes("/Library/pnpm/")||t.includes("/.pnpm/")||t.includes("/.local/share/pnpm/"))return"pnpm";if(t.includes("/.yarn/")||t.includes("/yarn/global"))return"yarn"}return null}function kc(){let s=Bp();if(s&&wc(s))return mn[s];for(let e of["bun","pnpm","npm","yarn"])if(wc(e))return mn[e];throw new Error("No supported package manager found in PATH (tried npm, pnpm, bun, yarn). Install one and re-run, or upgrade manually: bun add -g prjct-cli@latest")}function Zo(){let s=[];for(let e of[mn.bun,mn.pnpm,mn.npm,mn.yarn]){let t=e.getInstallRoot();if(!t)continue;let n=Ws.join(t,"prjct-cli","package.json");try{let r=JSON.parse(qe("node:fs").readFileSync(n,"utf-8"));r?.name==="prjct-cli"&&typeof r.version=="string"&&s.push({pm:e,version:r.version})}catch{}}return s}function Sb(){try{let{existsSync:s,realpathSync:e,readFileSync:t}=qe("node:fs"),n=(()=>{try{return e(Ws.resolve(__dirname,"..","..",".."))}catch{return""}})(),r=[mn.bun.getInstallRoot(),mn.pnpm.getInstallRoot(),mn.npm.getInstallRoot(),mn.yarn.getInstallRoot()].filter(o=>!!o);for(let o of r){let i=Ws.join(o,"prjct-cli"),a=Ws.join(i,"package.json");if(!s(a))continue;let l=i;try{l=e(i)}catch{}if(n&&l===n)continue;try{if(JSON.parse(t(Ws.join(l,"package.json"),"utf-8"))?.name!=="prjct-cli")continue}catch{continue}Qc(l);let{resetBundle:u}=(En(),st(wl));u();return}}catch{}}var n0,mn,Vp=h(()=>{"use strict";We();n0=t0.homedir(),mn={npm:{name:"npm",installArgs:["install","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Qo("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},pnpm:{name:"pnpm",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Qo("pnpm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},bun:{name:"bun",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>Ws.join(n0,".bun","install","global","node_modules"),"getInstallRoot")},yarn:{name:"yarn",installArgs:["global","add","prjct-cli@latest"],getInstallRoot:c(()=>{try{let s=Qo("yarn global dir",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return Ws.join(s,"node_modules")}catch{return null}},"getInstallRoot")}};c(Fr,"isHomebrewInstall");c(wc,"isOnPath");c(Bp,"detectInstallerFromRunningBinary");c(kc,"selectPackageManager");c(Zo,"getAllInstalledLocations");c(Sb,"redirectToInstalledPackage")});import{execSync as Tb}from"node:child_process";import{realpathSync as qp}from"node:fs";import Eb from"node:path";import s0 from"node:readline";function o0(){try{let s=Tb("command -v prjct",{stdio:"pipe",shell:"/bin/sh"}).toString().trim();if(!s)return null;try{return qp(s)}catch{return s}}catch{return null}}function i0(){try{return qp(Eb.resolve(__dirname,"..","..",".."))}catch{return""}}function a0(){let s=o0(),e=Bp(),t=i0(),n=[];if(!s&&!e)return{winner:null,removable:[],skipped:[{pm:"(all)",reason:"cannot resolve the PATH-winning binary \u2014 refusing to remove"}]};let r=s?.includes("/Cellar/")||s?.includes("/homebrew/"),o=r?"brew":e,i=[];for(let a of Zo()){if(a.pm.name===e){n.push({pm:a.pm.name,reason:"PATH winner \u2014 kept"});continue}let l=a.pm.getInstallRoot();if(l&&t){let u=Eb.join(l,"prjct-cli");try{u=qp(u)}catch{}if(u===t){n.push({pm:a.pm.name,reason:"resolves to the dev source tree (link) \u2014 kept"});continue}}i.push({pm:a.pm.name,version:a.version})}return Fr()&&!r?i.push({pm:"brew",version:"(homebrew)"}):Fr()&&r&&n.push({pm:"brew",reason:"PATH winner \u2014 kept"}),{winner:o,removable:i,skipped:n}}function c0(s){let e=s==="brew"?"brew uninstall prjct-cli":r0[s];try{return Tb(e,{stdio:"pipe",shell:"/bin/sh"}),{ok:!0}}catch(t){return{ok:!1,error:`${s}: ${t.message.split(`
1290
- `)[0]}`}}}async function l0(s){let e=s0.createInterface({input:process.stdin,output:process.stdout});try{let t=await new Promise(n=>e.question(`${s} [y/N] `,n));return/^y(es)?$/i.test(t.trim())}finally{e.close()}}async function Cb(s,e,t){let n=[],r=[];if(s==="off")return n.push("Install consolidation skipped (--no-cleanup)"),{details:n,errors:r};let o=a0();if(o.removable.length===0)return n.push(o.skipped.some(u=>u.pm==="(all)")?`Consolidation skipped \u2014 ${o.skipped[0].reason}`:"Single install \u2014 nothing to consolidate"),{details:n,errors:r};let i=o.removable.map(u=>`${u.pm} (${u.version})`).join(", ");if(n.push(`Winner: ${o.winner??"unknown"} \u2014 redundant copies: ${i}`),e){for(let u of o.removable)n.push(`Would remove ${u.pm} copy`);return{details:n,errors:r}}let a=process.stdin.isTTY===!0&&process.stdout.isTTY===!0;if(!(s==="force"||t||a&&await l0(`Remove ${o.removable.length} redundant prjct install(s) [${i}], keeping ${o.winner}?`)))return a?n.push("Consolidation declined \u2014 left all installs in place"):n.push(`Multiple installs detected [${i}]. Run \`prjct upgrade --yes\` to consolidate (kept ${o.winner}).`),{details:n,errors:r};for(let u of o.removable){let d=c0(u.pm);d.ok?n.push(`Removed redundant ${u.pm} install`):r.push(d.error??`failed to remove ${u.pm}`)}for(let u of o.skipped)n.push(`Kept ${u.pm}: ${u.reason}`);return{details:n,errors:r}}var r0,Rb=h(()=>{"use strict";Vp();r0={npm:"npm uninstall -g prjct-cli",pnpm:"pnpm remove -g prjct-cli",bun:"bun remove -g prjct-cli",yarn:"yarn global remove prjct-cli"};c(o0,"pathWinnerReal");c(i0,"sourceRoot");c(a0,"planCleanup");c(c0,"removeOne");c(l0,"confirm");c(Cb,"consolidateInstalls")});import Hr from"chalk";function Pb(s,e){let t=s.phase1.success&&s.phase2.success,n=[...s.phase1.errors,...s.phase2.errors];console.log("");let r=[{label:"Package",result:s.phase1,fatal:!0},{label:"Cleanup",result:s.phase2,fatal:!0},{label:"Daemon",result:s.phase3,fatal:!1}];for(let{label:o,result:i,fatal:a}of r){let l=i.success?Hr.green("\u2713"):a?Hr.red("\u2717"):Hr.yellow("\u26A0");console.log(` ${l} ${Hr.bold(o)}`);for(let u of i.details)console.log(` ${Hr.dim(u)}`);for(let u of i.errors)console.log(` ${Hr.yellow("\u26A0")} ${u}`)}return console.log(""),e?f.done("Dry run complete \u2014 no changes made"):t?f.done("System updated"):f.warn(`Updated with ${n.length} error(s)`),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}function xb(s,e){let t=s.phase1.success&&s.phase2.success,n=[];n.push(e?"# Update (Dry Run)":"# System Update"),n.push("");let r=[{label:"Package Update",result:s.phase1,fatal:!0},{label:"Global Cleanup",result:s.phase2,fatal:!0},{label:"Daemon Restart",result:s.phase3,fatal:!1}];for(let{label:o,result:i,fatal:a}of r){let l=i.success?"OK":a?"FAILED":"WARNING";n.push(`## ${o} (${l})`);for(let u of i.details)n.push(`- ${u}`);for(let u of i.errors)n.push(`- WARNING: ${u}`);n.push("")}return e||n.push(t?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
1291
- `)),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}var Ab=h(()=>{"use strict";pe();c(Pb,"formatTerminalOutput");c(xb,"formatMdOutput")});import{execSync as jb}from"node:child_process";import Jp from"node:fs/promises";import Xp from"node:path";var Ur,zp=h(()=>{"use strict";Wt();Ni();ge();Ri();$u();F();Te();pe();We();Ie();Rb();Ab();Vp();Ur=class extends X{static{c(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,r=e.md===!0,o=e.cleanup===!1?"off":e.cleanup===!0?"force":"auto",i=e.yes===!0||e.y===!0,a={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(!n)try{let{isDaemonRunning:l,stopDaemon:u,forceKillDaemon:d}=await Promise.resolve().then(()=>(Bt(),Gt));await l()&&(await u()||d())}catch{}if(r||f.step(1,3,"Updating package..."),a.phase1=await this.phasePackageUpdate(n),r||f.stop(),!n&&a.phase1.success&&Sb(),r||f.step(2,3,"Cleaning up all projects..."),a.phase2=await this.phaseGlobalCleanup(n,o,i),r||f.stop(),r||f.step(3,3,"Restarting daemon..."),a.phase3=await this.phaseDaemonRestart(n),r||f.stop(),!n){try{await bo.updateVersion(le)}catch{}try{await new Qs().writeCache({lastCheck:0,latestVersion:""})}catch{}}return r?xb(a,n):Pb(a,n)}catch(l){return r||f.stop(),f.fail(b(l)),Me(l)}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},n=Zo();if(e){if(Fr()){let o;try{o=kc().name}catch(i){o="<none-available>",t.errors.push(b(i))}t.details.push("Would uninstall homebrew formula"),t.details.push(`Would install via ${o}`)}else if(n.length===0){let o;try{o=kc().name}catch(i){o="<none-available>",t.errors.push(b(i))}t.details.push(`Would install via ${o}`)}else for(let{pm:o,version:i}of n)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(Fr())try{jb("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}let o;n.length>0?o=n.map(d=>d.pm):o=[kc()];let i=null;try{let d=(await new Qs().getLatestVersion())?.trim();d&&/^\d+\.\d+\.\d+/.test(d)&&(i=`prjct-cli@${d}`)}catch{}for(let d of o){if(!wc(d.name)){t.errors.push(`${d.name} is not on PATH but has a prjct-cli install. Either install ${d.name} or remove that copy.`);continue}try{let p=i?d.installArgs.map(m=>m==="prjct-cli@latest"?i:m):d.installArgs;jb([d.name,...p].join(" "),{stdio:"pipe"}),t.details.push(`${d.name} install complete${i?` (${i})`:""}`)}catch(p){t.errors.push(`${d.name}: ${b(p)}`)}}let a=Zo(),l=new Map(n.map(d=>[d.pm.name,d.version])),u=[];for(let{pm:d,version:p}of a){let m=l.get(d.name);m&&m!==p?u.push(`${d.name}: ${m} \u2192 ${p}`):m||u.push(`${d.name}: installed v${p}`)}if(u.length>1)for(let d of u)t.details.push(d);else u.length===1?t.details.push(u[0]):a.length>0&&t.details.push(`v${a[0].version} (already latest)`)}catch(r){t.success=!1,t.errors.push(b(r))}return t}async phaseGlobalCleanup(e,t="auto",n=!1){let r={success:!0,details:[],errors:[]},o=await this.getAllProjectIds();if(o.length===0)r.details.push("No projects found");else{let i=0,a=0;for(let l of o)if(!e)try{let u=await ya(l),d=await wa(l);if(i+=u.migratedFiles.length,a+=d,u.errors.length>0)for(let p of u.errors)r.errors.push(`${l.slice(0,8)}: ${p.file}: ${p.error}`)}catch(u){r.errors.push(`${l.slice(0,8)}: ${b(u)}`)}if(e)r.details.push(`Would migrate ${o.length} project(s)`);else{let l=[`${o.length} project(s) checked`];i>0&&l.push(`${i} files migrated`),a>0&&l.push(`${a} leftovers swept`),r.details.push(l.join(", "))}}if(e)r.details.push("Would clean all legacy artifacts"),r.details.push("Would reinstall editor commands"),r.details.push("Would reinstall global config (all providers)");else{try{let a=await new ln().cleanupAllLegacy();a.cleaned.length>0&&r.details.push(`Cleaned ${a.cleaned.length} legacy artifact(s)`)}catch(i){r.errors.push(`Legacy cleanup: ${b(i)}`)}try{let a=await new ln().installCommands();r.details.push(`Editor commands reinstalled (${a.installed?.length||0} providers)`)}catch(i){r.errors.push(`Commands: ${b(i)}`)}try{await new ln().installGlobalConfig(),r.details.push("Global config updated (prjct section replaced)")}catch(i){r.errors.push(`Global config: ${b(i)}`)}try{let{detectAllProviders:i}=await Promise.resolve().then(()=>(rt(),Ut)),a=await i(),l=Xp.join(qe("node:os").homedir());if(a.gemini.installed){let u=Xp.join(l,".gemini","GEMINI.md");try{let d=await Jp.readFile(u,"utf-8"),p="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",m="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(d.includes(p)&&d.includes(m)){let{getTemplateContent:g}=await Promise.resolve().then(()=>(En(),wl)),k=g("global/GEMINI.md");if(k?.includes(p)&&k.includes(m)){let E=k.substring(k.indexOf(p),k.indexOf(m)+m.length),y=d.substring(0,d.indexOf(p)),w=d.substring(d.indexOf(m)+m.length),v=y+E+w,S="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",P="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(v.includes(S)&&v.includes(P)){let T=v.substring(0,v.indexOf(S)),O=v.substring(v.indexOf(P)+P.length);v=`${(T+O).replace(/\n{3,}/g,`
1289
+ `;c(Z$,"teamClaudeMdBlock");c(e0,"upsertBetweenMarkers")});import{execSync as Qo}from"node:child_process";import t0 from"node:os";import Ws from"node:path";function Fr(){try{return!!Qo("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function kc(s){try{return Qo(`command -v ${s}`,{stdio:"pipe",shell:"/bin/sh"}),!0}catch{return!1}}function Vp(){let s=[process.argv[1],process.execPath].filter(Boolean);for(let e of s){let t=e;try{t=qe("node:fs").realpathSync(e)}catch{}if(t.includes("/.bun/install/global")||t.includes("/.bun/bin/"))return"bun";if(t.includes("/Library/pnpm/")||t.includes("/.pnpm/")||t.includes("/.local/share/pnpm/"))return"pnpm";if(t.includes("/.yarn/")||t.includes("/yarn/global"))return"yarn"}return null}function vc(){let s=Vp();if(s&&kc(s))return mn[s];for(let e of["bun","pnpm","npm","yarn"])if(kc(e))return mn[e];throw new Error("No supported package manager found in PATH (tried npm, pnpm, bun, yarn). Install one and re-run, or upgrade manually: bun add -g prjct-cli@latest")}function Zo(){let s=[];for(let e of[mn.bun,mn.pnpm,mn.npm,mn.yarn]){let t=e.getInstallRoot();if(!t)continue;let n=Ws.join(t,"prjct-cli","package.json");try{let r=JSON.parse(qe("node:fs").readFileSync(n,"utf-8"));r?.name==="prjct-cli"&&typeof r.version=="string"&&s.push({pm:e,version:r.version})}catch{}}return s}function Sb(){try{let{existsSync:s,realpathSync:e,readFileSync:t}=qe("node:fs"),n=(()=>{try{return e(Ws.resolve(__dirname,"..","..",".."))}catch{return""}})(),r=[mn.bun.getInstallRoot(),mn.pnpm.getInstallRoot(),mn.npm.getInstallRoot(),mn.yarn.getInstallRoot()].filter(o=>!!o);for(let o of r){let i=Ws.join(o,"prjct-cli"),a=Ws.join(i,"package.json");if(!s(a))continue;let l=i;try{l=e(i)}catch{}if(n&&l===n)continue;try{if(JSON.parse(t(Ws.join(l,"package.json"),"utf-8"))?.name!=="prjct-cli")continue}catch{continue}Zc(l);let{resetBundle:u}=(En(),st(kl));u();return}}catch{}}var n0,mn,qp=h(()=>{"use strict";We();n0=t0.homedir(),mn={npm:{name:"npm",installArgs:["install","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Qo("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},pnpm:{name:"pnpm",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Qo("pnpm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},bun:{name:"bun",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>Ws.join(n0,".bun","install","global","node_modules"),"getInstallRoot")},yarn:{name:"yarn",installArgs:["global","add","prjct-cli@latest"],getInstallRoot:c(()=>{try{let s=Qo("yarn global dir",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return Ws.join(s,"node_modules")}catch{return null}},"getInstallRoot")}};c(Fr,"isHomebrewInstall");c(kc,"isOnPath");c(Vp,"detectInstallerFromRunningBinary");c(vc,"selectPackageManager");c(Zo,"getAllInstalledLocations");c(Sb,"redirectToInstalledPackage")});import{execSync as Tb}from"node:child_process";import{realpathSync as Jp}from"node:fs";import Eb from"node:path";import s0 from"node:readline";function o0(){try{let s=Tb("command -v prjct",{stdio:"pipe",shell:"/bin/sh"}).toString().trim();if(!s)return null;try{return Jp(s)}catch{return s}}catch{return null}}function i0(){try{return Jp(Eb.resolve(__dirname,"..","..",".."))}catch{return""}}function a0(){let s=o0(),e=Vp(),t=i0(),n=[];if(!s&&!e)return{winner:null,removable:[],skipped:[{pm:"(all)",reason:"cannot resolve the PATH-winning binary \u2014 refusing to remove"}]};let r=s?.includes("/Cellar/")||s?.includes("/homebrew/"),o=r?"brew":e,i=[];for(let a of Zo()){if(a.pm.name===e){n.push({pm:a.pm.name,reason:"PATH winner \u2014 kept"});continue}let l=a.pm.getInstallRoot();if(l&&t){let u=Eb.join(l,"prjct-cli");try{u=Jp(u)}catch{}if(u===t){n.push({pm:a.pm.name,reason:"resolves to the dev source tree (link) \u2014 kept"});continue}}i.push({pm:a.pm.name,version:a.version})}return Fr()&&!r?i.push({pm:"brew",version:"(homebrew)"}):Fr()&&r&&n.push({pm:"brew",reason:"PATH winner \u2014 kept"}),{winner:o,removable:i,skipped:n}}function c0(s){let e=s==="brew"?"brew uninstall prjct-cli":r0[s];try{return Tb(e,{stdio:"pipe",shell:"/bin/sh"}),{ok:!0}}catch(t){return{ok:!1,error:`${s}: ${t.message.split(`
1290
+ `)[0]}`}}}async function l0(s){let e=s0.createInterface({input:process.stdin,output:process.stdout});try{let t=await new Promise(n=>e.question(`${s} [y/N] `,n));return/^y(es)?$/i.test(t.trim())}finally{e.close()}}async function Cb(s,e,t){let n=[],r=[];if(s==="off")return n.push("Install consolidation skipped (--no-cleanup)"),{details:n,errors:r};let o=a0();if(o.removable.length===0)return n.push(o.skipped.some(u=>u.pm==="(all)")?`Consolidation skipped \u2014 ${o.skipped[0].reason}`:"Single install \u2014 nothing to consolidate"),{details:n,errors:r};let i=o.removable.map(u=>`${u.pm} (${u.version})`).join(", ");if(n.push(`Winner: ${o.winner??"unknown"} \u2014 redundant copies: ${i}`),e){for(let u of o.removable)n.push(`Would remove ${u.pm} copy`);return{details:n,errors:r}}let a=process.stdin.isTTY===!0&&process.stdout.isTTY===!0;if(!(s==="force"||t||a&&await l0(`Remove ${o.removable.length} redundant prjct install(s) [${i}], keeping ${o.winner}?`)))return a?n.push("Consolidation declined \u2014 left all installs in place"):n.push(`Multiple installs detected [${i}]. Run \`prjct upgrade --yes\` to consolidate (kept ${o.winner}).`),{details:n,errors:r};for(let u of o.removable){let d=c0(u.pm);d.ok?n.push(`Removed redundant ${u.pm} install`):r.push(d.error??`failed to remove ${u.pm}`)}for(let u of o.skipped)n.push(`Kept ${u.pm}: ${u.reason}`);return{details:n,errors:r}}var r0,Rb=h(()=>{"use strict";qp();r0={npm:"npm uninstall -g prjct-cli",pnpm:"pnpm remove -g prjct-cli",bun:"bun remove -g prjct-cli",yarn:"yarn global remove prjct-cli"};c(o0,"pathWinnerReal");c(i0,"sourceRoot");c(a0,"planCleanup");c(c0,"removeOne");c(l0,"confirm");c(Cb,"consolidateInstalls")});import Hr from"chalk";function Pb(s,e){let t=s.phase1.success&&s.phase2.success,n=[...s.phase1.errors,...s.phase2.errors];console.log("");let r=[{label:"Package",result:s.phase1,fatal:!0},{label:"Cleanup",result:s.phase2,fatal:!0},{label:"Daemon",result:s.phase3,fatal:!1}];for(let{label:o,result:i,fatal:a}of r){let l=i.success?Hr.green("\u2713"):a?Hr.red("\u2717"):Hr.yellow("\u26A0");console.log(` ${l} ${Hr.bold(o)}`);for(let u of i.details)console.log(` ${Hr.dim(u)}`);for(let u of i.errors)console.log(` ${Hr.yellow("\u26A0")} ${u}`)}return console.log(""),e?f.done("Dry run complete \u2014 no changes made"):t?f.done("System updated"):f.warn(`Updated with ${n.length} error(s)`),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}function xb(s,e){let t=s.phase1.success&&s.phase2.success,n=[];n.push(e?"# Update (Dry Run)":"# System Update"),n.push("");let r=[{label:"Package Update",result:s.phase1,fatal:!0},{label:"Global Cleanup",result:s.phase2,fatal:!0},{label:"Daemon Restart",result:s.phase3,fatal:!1}];for(let{label:o,result:i,fatal:a}of r){let l=i.success?"OK":a?"FAILED":"WARNING";n.push(`## ${o} (${l})`);for(let u of i.details)n.push(`- ${u}`);for(let u of i.errors)n.push(`- WARNING: ${u}`);n.push("")}return e||n.push(t?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
1291
+ `)),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}var Ab=h(()=>{"use strict";pe();c(Pb,"formatTerminalOutput");c(xb,"formatMdOutput")});import{execSync as jb}from"node:child_process";import Xp from"node:fs/promises";import zp from"node:path";var Ur,Kp=h(()=>{"use strict";Wt();Li();ge();Pi();Iu();F();Te();pe();We();Ie();Rb();Ab();qp();Ur=class extends X{static{c(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,r=e.md===!0,o=e.cleanup===!1?"off":e.cleanup===!0?"force":"auto",i=e.yes===!0||e.y===!0,a={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(!n)try{let{isDaemonRunning:l,stopDaemon:u,forceKillDaemon:d}=await Promise.resolve().then(()=>(Bt(),Gt));await l()&&(await u()||d())}catch{}if(r||f.step(1,3,"Updating package..."),a.phase1=await this.phasePackageUpdate(n),r||f.stop(),!n&&a.phase1.success&&Sb(),r||f.step(2,3,"Cleaning up all projects..."),a.phase2=await this.phaseGlobalCleanup(n,o,i),r||f.stop(),r||f.step(3,3,"Restarting daemon..."),a.phase3=await this.phaseDaemonRestart(n),r||f.stop(),!n){try{await bo.updateVersion(le)}catch{}try{await new Qs().writeCache({lastCheck:0,latestVersion:""})}catch{}}return r?xb(a,n):Pb(a,n)}catch(l){return r||f.stop(),f.fail(b(l)),Me(l)}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},n=Zo();if(e){if(Fr()){let o;try{o=vc().name}catch(i){o="<none-available>",t.errors.push(b(i))}t.details.push("Would uninstall homebrew formula"),t.details.push(`Would install via ${o}`)}else if(n.length===0){let o;try{o=vc().name}catch(i){o="<none-available>",t.errors.push(b(i))}t.details.push(`Would install via ${o}`)}else for(let{pm:o,version:i}of n)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(Fr())try{jb("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}let o;n.length>0?o=n.map(d=>d.pm):o=[vc()];let i=null;try{let d=(await new Qs().getLatestVersion())?.trim();d&&/^\d+\.\d+\.\d+/.test(d)&&(i=`prjct-cli@${d}`)}catch{}for(let d of o){if(!kc(d.name)){t.errors.push(`${d.name} is not on PATH but has a prjct-cli install. Either install ${d.name} or remove that copy.`);continue}try{let p=i?d.installArgs.map(m=>m==="prjct-cli@latest"?i:m):d.installArgs;jb([d.name,...p].join(" "),{stdio:"pipe"}),t.details.push(`${d.name} install complete${i?` (${i})`:""}`)}catch(p){t.errors.push(`${d.name}: ${b(p)}`)}}let a=Zo(),l=new Map(n.map(d=>[d.pm.name,d.version])),u=[];for(let{pm:d,version:p}of a){let m=l.get(d.name);m&&m!==p?u.push(`${d.name}: ${m} \u2192 ${p}`):m||u.push(`${d.name}: installed v${p}`)}if(u.length>1)for(let d of u)t.details.push(d);else u.length===1?t.details.push(u[0]):a.length>0&&t.details.push(`v${a[0].version} (already latest)`)}catch(r){t.success=!1,t.errors.push(b(r))}return t}async phaseGlobalCleanup(e,t="auto",n=!1){let r={success:!0,details:[],errors:[]},o=await this.getAllProjectIds();if(o.length===0)r.details.push("No projects found");else{let i=0,a=0;for(let l of o)if(!e)try{let u=await wa(l),d=await ka(l);if(i+=u.migratedFiles.length,a+=d,u.errors.length>0)for(let p of u.errors)r.errors.push(`${l.slice(0,8)}: ${p.file}: ${p.error}`)}catch(u){r.errors.push(`${l.slice(0,8)}: ${b(u)}`)}if(e)r.details.push(`Would migrate ${o.length} project(s)`);else{let l=[`${o.length} project(s) checked`];i>0&&l.push(`${i} files migrated`),a>0&&l.push(`${a} leftovers swept`),r.details.push(l.join(", "))}}if(e)r.details.push("Would clean all legacy artifacts"),r.details.push("Would reinstall editor commands"),r.details.push("Would reinstall global config (all providers)");else{try{let a=await new ln().cleanupAllLegacy();a.cleaned.length>0&&r.details.push(`Cleaned ${a.cleaned.length} legacy artifact(s)`)}catch(i){r.errors.push(`Legacy cleanup: ${b(i)}`)}try{let a=await new ln().installCommands();r.details.push(`Editor commands reinstalled (${a.installed?.length||0} providers)`)}catch(i){r.errors.push(`Commands: ${b(i)}`)}try{await new ln().installGlobalConfig(),r.details.push("Global config updated (prjct section replaced)")}catch(i){r.errors.push(`Global config: ${b(i)}`)}try{let{detectAllProviders:i}=await Promise.resolve().then(()=>(rt(),Ut)),a=await i(),l=zp.join(qe("node:os").homedir());if(a.gemini.installed){let u=zp.join(l,".gemini","GEMINI.md");try{let d=await Xp.readFile(u,"utf-8"),p="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",m="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(d.includes(p)&&d.includes(m)){let{getTemplateContent:g}=await Promise.resolve().then(()=>(En(),kl)),k=g("global/GEMINI.md");if(k?.includes(p)&&k.includes(m)){let E=k.substring(k.indexOf(p),k.indexOf(m)+m.length),y=d.substring(0,d.indexOf(p)),w=d.substring(d.indexOf(m)+m.length),v=y+E+w,S="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",P="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(v.includes(S)&&v.includes(P)){let T=v.substring(0,v.indexOf(S)),O=v.substring(v.indexOf(P)+P.length);v=`${(T+O).replace(/\n{3,}/g,`
1292
1292
 
1293
1293
  `).trim()}
1294
- `}await Jp.writeFile(u,v,"utf-8"),r.details.push("Gemini global config updated")}}}catch{}}}catch{}}try{let i=await Cb(t,e,n);r.details.push(...i.details),r.errors.push(...i.errors)}catch(i){r.errors.push(`install consolidation skipped: ${b(i)}`)}return r.errors.length>0&&(r.success=!1),r}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:n,stopDaemon:r,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Bt(),Gt));await n()?(await r()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)"));let a=await i();t.details.push(a?"Daemon restarted":"Daemon will start automatically on next use")}catch(n){t.success=!1,t.errors.push(b(n))}return t}async getAllProjectIds(){let e=Xp.join(_.getGlobalBasePath(),"projects");try{return(await Jp.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});function $b(s){let e=s.trim();for(let{type:t,patterns:n}of u0){let r=e.match(n);if(r){let o=r[0],i=e.slice(o.length).trim();return{type:t,args:i,confidence:"exact"}}}return{type:"view",args:e,confidence:"exact"}}function vc(s){let e=s.trim();if(e.startsWith('"')){let n=e.indexOf('"',1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}if(e.startsWith("'")){let n=e.indexOf("'",1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}function Ib(s,e){let t=e.toLowerCase();return s.filter(n=>n.action.toLowerCase().includes(t)||(n.description?.toLowerCase().includes(t)??!1)||n.command.toLowerCase().includes(t)||String(n.id)===t)}var u0,Kp=h(()=>{"use strict";u0=[{type:"help",patterns:/^help\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|new)\b/i},{type:"list",patterns:/^list\b/i},{type:"delete",patterns:/^delete\b/i},{type:"run",patterns:/^run\b/i},{type:"disable",patterns:/^disable\b/i},{type:"view",patterns:/^(?:show|view)\b/i}];c($b,"detectIntent");c(vc,"parseAction");c(Ib,"searchRules")});var is,Yp=h(()=>{"use strict";is={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0}});function bc(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}var Qp,_b,Zp=h(()=>{"use strict";Qp=["task","done","ship","sync"],_b=["before","after"];c(bc,"newRuleDefaults")});async function Mb(s,e,t){let[n,r]=vc(s);if(!n||!r)return H('Usage: prjct workflow add "command" before|after <task|done|ship|sync>',t);let o=r.split(/\s+/),i=o[0]?.toLowerCase(),a=o[1]?.toLowerCase();if(!i||!_b.includes(i))return H('Position must be "before" or "after"',t);let l=pc(e,a,t);if(!l.ok)return l.result;let u=ee.addRule(e,{type:"hook",command:l.value.name,position:i,action:n,timeoutMs:is.HOOK_DEFAULT_MS,...bc()});return t.md?console.log(W(Ce("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${n}\``),Be([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):At(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${n}`),{success:!0,ruleId:u}}async function Ob(s,e,t){let n=s.trim().split(/\s+/)[0]?.toLowerCase(),r=pc(e,n,t);if(!r.ok)return r.result;let o=s.slice(s.indexOf(r.value.name)+r.value.name.length).trim(),[i]=vc(o);if(!i)return H('Usage: prjct workflow gate <command> "shell command"',t);let a=ee.addRule(e,{type:"gate",command:r.value.name,position:"before",action:i,timeoutMs:is.GATE_DEFAULT_MS,...bc()});return t.md?console.log(W(Ce("Gate Added",`#${a} [gate] before ${r.value.name} \u2192 \`${i}\``),Be([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${a} --md`}]))):At(`gate #${a} added: before ${r.value.name} \u2192 ${i}`),{success:!0,ruleId:a}}async function Nb(s,e,t){let n=s.trim().split(/\s+/)[0]?.toLowerCase(),r=pc(e,n,t);if(!r.ok)return r.result;let o=s.slice(s.indexOf(r.value.name)+r.value.name.length).trim(),i=o.match(/^(before|after)\s+/i);if(!i)return H('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let a=i[1].toLowerCase(),l=o.slice(i[0].length).trim(),[u]=vc(l);if(!u)return H('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=ee.addRule(e,{type:"instruction",command:r.value.name,position:a,action:u,timeoutMs:is.INSTRUCTION_MS,...bc()});return t.md?console.log(W(Ce("Instruction Added",`#${d} [instruction] ${a} ${r.value.name} \u2192 \`${u}\``),Be([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):At(`instruction #${d} added: ${a} ${r.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}async function Lb(s,e,t){let n=parseInt(s.trim(),10);return Number.isNaN(n)?H("Usage: prjct workflow rm <rule-id>",t):ee.removeRule(e,n)?(t.md?console.log(W(Ce("Rule Removed",`Removed rule #${n}`))):At(`removed rule #${n}`),{success:!0}):H(`Rule #${n} not found`,t)}async function Fb(s,e){let t=ee.resetRules(s),n=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log(W(Ce("Rules Reset",n))):At(`reset: ${n.toLowerCase()}`),{success:!0,count:t}}async function Hb(s,e,t){let n=s.trim(),r=parseInt(n,10);if(!Number.isNaN(r)){let d=ee.getRuleById(e,r);if(!d)return H(`Rule #${r} not found`,t);if(!d.enabled){let p=`Rule #${r} is already disabled`;return t.md?console.log(`> ${p}`):jn(p),{success:!0,message:p}}return ee.updateRule(e,r,{enabled:!1}),t.md?console.log(W(Ce("Rule Disabled",`#${r} [${d.type}] ${d.action}`),Be([{label:"Re-enable this rule",command:`prjct workflow enable ${r} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):At(`disabled rule #${r}: ${d.action}`),{success:!0,ruleId:r}}let o=ee.getAllRules(e),i=Ib(o,n);if(i.length===0)return H(`No rules matching "${n}"`,t);if(i.length===1){let d=i[0];return ee.updateRule(e,d.id,{enabled:!1}),t.md?console.log(W(Ce("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):At(`disabled rule #${d.id}: ${d.action}`),{success:!0,ruleId:d.id}}let a=i.slice(0,5),l=i.length-5,u=l>0?`...and ${l} more`:null;if(t.md){let d=a.map(p=>`#${p.id} [${p.type}] ${p.position} ${p.command} -> \`${p.action}\``);u&&d.push(u),console.log(W(q("Multiple matches",`${i.length} rules match "${n}"`),Oe(d),Be(a.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{jn(`${i.length} rules match "${n}" \u2014 specify an ID:`);for(let d of a)console.log(` #${d.id} [${d.type}] ${d.position} ${d.command} -> ${d.action}`);u&&console.log(` ${u}`)}return{success:!0,matches:i.map(d=>d.id)}}var Ub=h(()=>{"use strict";$n();Te();kt();Yp();Zt();Kp();Zp();c(Mb,"workflowAdd");c(Ob,"workflowGate");c(Nb,"workflowInstruction");c(Lb,"workflowRm");c(Fb,"workflowReset");c(Hb,"workflowDisable")});function Wb(s,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),n=e.filter(m=>m.type==="instruction"&&m.position==="before"),r=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),l=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=c((m,g,k)=>{let E=g.map(S=>` ${S.enabled?k:"o"} #${S.id} ${S.action}`),y=[m,...E],v=Math.max(...y.map(S=>S.length))+2;u.push(`+${"-".repeat(v)}+`);for(let S of y)u.push(`| ${S.padEnd(v-1)}|`);u.push(`+${"-".repeat(v)}+`)},"drawBox"),p=c(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),n.length>0&&(d("INSTRUCTIONS (before)",n,"\u{1F4CB}"),p(u)),r.length>0&&(d("HOOKS (before)",r,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${s.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
1295
- `)}var Gb=h(()=>{"use strict";c(Wb,"buildFlowDiagram")});async function Bb(s){return s.md?console.log(W(q("Workflow Help","Manage hooks, gates, and steps for your workflow"),q("Commands",Oe(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),q("Natural Language (EN/ES)",Oe(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),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"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async function Sc(s,e,t){let n=s!==null&&Qp.includes(s),r=n?ee.getRulesForCommand(e,s):ee.getAllRules(e);if(r.length===0)return t.md?console.log(W(q("Workflow Rules","No rules configured"),Be([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(jn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(t.md){let o=n?[s]:Qp,i=[];for(let u of o){let d=r.filter(p=>p.command===u);d.length!==0&&i.push(Wb(u,d))}let a=n?`Workflow: ${s}`:"Workflow Rules",l=`${r.length} rule${r.length!==1?"s":""}`;console.log(W(q(a,l),i.length>0?xw(i.join(`
1294
+ `}await Xp.writeFile(u,v,"utf-8"),r.details.push("Gemini global config updated")}}}catch{}}}catch{}}try{let i=await Cb(t,e,n);r.details.push(...i.details),r.errors.push(...i.errors)}catch(i){r.errors.push(`install consolidation skipped: ${b(i)}`)}return r.errors.length>0&&(r.success=!1),r}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:n,stopDaemon:r,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Bt(),Gt));await n()?(await r()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)"));let a=await i();t.details.push(a?"Daemon restarted":"Daemon will start automatically on next use")}catch(n){t.success=!1,t.errors.push(b(n))}return t}async getAllProjectIds(){let e=zp.join(_.getGlobalBasePath(),"projects");try{return(await Xp.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});function $b(s){let e=s.trim();for(let{type:t,patterns:n}of u0){let r=e.match(n);if(r){let o=r[0],i=e.slice(o.length).trim();return{type:t,args:i,confidence:"exact"}}}return{type:"view",args:e,confidence:"exact"}}function bc(s){let e=s.trim();if(e.startsWith('"')){let n=e.indexOf('"',1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}if(e.startsWith("'")){let n=e.indexOf("'",1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}function Ib(s,e){let t=e.toLowerCase();return s.filter(n=>n.action.toLowerCase().includes(t)||(n.description?.toLowerCase().includes(t)??!1)||n.command.toLowerCase().includes(t)||String(n.id)===t)}var u0,Yp=h(()=>{"use strict";u0=[{type:"help",patterns:/^help\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|new)\b/i},{type:"list",patterns:/^list\b/i},{type:"delete",patterns:/^delete\b/i},{type:"run",patterns:/^run\b/i},{type:"disable",patterns:/^disable\b/i},{type:"view",patterns:/^(?:show|view)\b/i}];c($b,"detectIntent");c(bc,"parseAction");c(Ib,"searchRules")});var is,Qp=h(()=>{"use strict";is={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0}});function Sc(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}var Zp,_b,em=h(()=>{"use strict";Zp=["task","done","ship","sync"],_b=["before","after"];c(Sc,"newRuleDefaults")});async function Mb(s,e,t){let[n,r]=bc(s);if(!n||!r)return H('Usage: prjct workflow add "command" before|after <task|done|ship|sync>',t);let o=r.split(/\s+/),i=o[0]?.toLowerCase(),a=o[1]?.toLowerCase();if(!i||!_b.includes(i))return H('Position must be "before" or "after"',t);let l=mc(e,a,t);if(!l.ok)return l.result;let u=ee.addRule(e,{type:"hook",command:l.value.name,position:i,action:n,timeoutMs:is.HOOK_DEFAULT_MS,...Sc()});return t.md?console.log(W(Ce("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${n}\``),Be([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):At(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${n}`),{success:!0,ruleId:u}}async function Ob(s,e,t){let n=s.trim().split(/\s+/)[0]?.toLowerCase(),r=mc(e,n,t);if(!r.ok)return r.result;let o=s.slice(s.indexOf(r.value.name)+r.value.name.length).trim(),[i]=bc(o);if(!i)return H('Usage: prjct workflow gate <command> "shell command"',t);let a=ee.addRule(e,{type:"gate",command:r.value.name,position:"before",action:i,timeoutMs:is.GATE_DEFAULT_MS,...Sc()});return t.md?console.log(W(Ce("Gate Added",`#${a} [gate] before ${r.value.name} \u2192 \`${i}\``),Be([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${a} --md`}]))):At(`gate #${a} added: before ${r.value.name} \u2192 ${i}`),{success:!0,ruleId:a}}async function Nb(s,e,t){let n=s.trim().split(/\s+/)[0]?.toLowerCase(),r=mc(e,n,t);if(!r.ok)return r.result;let o=s.slice(s.indexOf(r.value.name)+r.value.name.length).trim(),i=o.match(/^(before|after)\s+/i);if(!i)return H('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let a=i[1].toLowerCase(),l=o.slice(i[0].length).trim(),[u]=bc(l);if(!u)return H('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=ee.addRule(e,{type:"instruction",command:r.value.name,position:a,action:u,timeoutMs:is.INSTRUCTION_MS,...Sc()});return t.md?console.log(W(Ce("Instruction Added",`#${d} [instruction] ${a} ${r.value.name} \u2192 \`${u}\``),Be([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):At(`instruction #${d} added: ${a} ${r.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}async function Lb(s,e,t){let n=parseInt(s.trim(),10);return Number.isNaN(n)?H("Usage: prjct workflow rm <rule-id>",t):ee.removeRule(e,n)?(t.md?console.log(W(Ce("Rule Removed",`Removed rule #${n}`))):At(`removed rule #${n}`),{success:!0}):H(`Rule #${n} not found`,t)}async function Fb(s,e){let t=ee.resetRules(s),n=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log(W(Ce("Rules Reset",n))):At(`reset: ${n.toLowerCase()}`),{success:!0,count:t}}async function Hb(s,e,t){let n=s.trim(),r=parseInt(n,10);if(!Number.isNaN(r)){let d=ee.getRuleById(e,r);if(!d)return H(`Rule #${r} not found`,t);if(!d.enabled){let p=`Rule #${r} is already disabled`;return t.md?console.log(`> ${p}`):jn(p),{success:!0,message:p}}return ee.updateRule(e,r,{enabled:!1}),t.md?console.log(W(Ce("Rule Disabled",`#${r} [${d.type}] ${d.action}`),Be([{label:"Re-enable this rule",command:`prjct workflow enable ${r} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):At(`disabled rule #${r}: ${d.action}`),{success:!0,ruleId:r}}let o=ee.getAllRules(e),i=Ib(o,n);if(i.length===0)return H(`No rules matching "${n}"`,t);if(i.length===1){let d=i[0];return ee.updateRule(e,d.id,{enabled:!1}),t.md?console.log(W(Ce("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):At(`disabled rule #${d.id}: ${d.action}`),{success:!0,ruleId:d.id}}let a=i.slice(0,5),l=i.length-5,u=l>0?`...and ${l} more`:null;if(t.md){let d=a.map(p=>`#${p.id} [${p.type}] ${p.position} ${p.command} -> \`${p.action}\``);u&&d.push(u),console.log(W(q("Multiple matches",`${i.length} rules match "${n}"`),Oe(d),Be(a.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{jn(`${i.length} rules match "${n}" \u2014 specify an ID:`);for(let d of a)console.log(` #${d.id} [${d.type}] ${d.position} ${d.command} -> ${d.action}`);u&&console.log(` ${u}`)}return{success:!0,matches:i.map(d=>d.id)}}var Ub=h(()=>{"use strict";$n();Te();kt();Qp();Zt();Yp();em();c(Mb,"workflowAdd");c(Ob,"workflowGate");c(Nb,"workflowInstruction");c(Lb,"workflowRm");c(Fb,"workflowReset");c(Hb,"workflowDisable")});function Wb(s,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),n=e.filter(m=>m.type==="instruction"&&m.position==="before"),r=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),l=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=c((m,g,k)=>{let E=g.map(S=>` ${S.enabled?k:"o"} #${S.id} ${S.action}`),y=[m,...E],v=Math.max(...y.map(S=>S.length))+2;u.push(`+${"-".repeat(v)}+`);for(let S of y)u.push(`| ${S.padEnd(v-1)}|`);u.push(`+${"-".repeat(v)}+`)},"drawBox"),p=c(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),n.length>0&&(d("INSTRUCTIONS (before)",n,"\u{1F4CB}"),p(u)),r.length>0&&(d("HOOKS (before)",r,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${s.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
1295
+ `)}var Gb=h(()=>{"use strict";c(Wb,"buildFlowDiagram")});async function Bb(s){return s.md?console.log(W(q("Workflow Help","Manage hooks, gates, and steps for your workflow"),q("Commands",Oe(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),q("Natural Language (EN/ES)",Oe(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),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"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async function Tc(s,e,t){let n=s!==null&&Zp.includes(s),r=n?ee.getRulesForCommand(e,s):ee.getAllRules(e);if(r.length===0)return t.md?console.log(W(q("Workflow Rules","No rules configured"),Be([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(jn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(t.md){let o=n?[s]:Zp,i=[];for(let u of o){let d=r.filter(p=>p.command===u);d.length!==0&&i.push(Wb(u,d))}let a=n?`Workflow: ${s}`:"Workflow Rules",l=`${r.length} rule${r.length!==1?"s":""}`;console.log(W(q(a,l),i.length>0?xw(i.join(`
1296
1296
 
1297
- `),""):null,Be([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let o=n?`WORKFLOW RULES: ${s.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(o),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");for(let i of r){let a=i.enabled?"":" (disabled)";console.log(` #${i.id} [${i.type}] ${i.position.padEnd(6)} ${i.command.padEnd(5)} \u2192 ${i.action}${a}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:r}}var Vb=h(()=>{"use strict";$n();Te();kt();Gb();Zp();c(Bb,"workflowHelp");c(Sc,"workflowShow")});import em from"node:fs/promises";import d0 from"node:os";import Tc from"node:path";var tm,nm,qb=h(()=>{"use strict";F();V();tm=class{static{c(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Tc.join(d0.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await em.mkdir(this.commandsPath,{recursive:!0});let n=Tc.join(this.commandsPath,`${e}.md`),r=this.buildTemplateContent(e,t);return await em.writeFile(n,r,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:b(n)}}}async deleteWorkflowTemplate(e){try{let t=Tc.join(this.commandsPath,`${e}.md`);return await em.unlink(t),{success:!0}}catch(t){return L(t)?{success:!0}:{success:!1,error:b(t)}}}async templateExists(e){let t=Tc.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
1297
+ `),""):null,Be([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let o=n?`WORKFLOW RULES: ${s.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(o),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");for(let i of r){let a=i.enabled?"":" (disabled)";console.log(` #${i.id} [${i.type}] ${i.position.padEnd(6)} ${i.command.padEnd(5)} \u2192 ${i.action}${a}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:r}}var Vb=h(()=>{"use strict";$n();Te();kt();Gb();em();c(Bb,"workflowHelp");c(Tc,"workflowShow")});import tm from"node:fs/promises";import d0 from"node:os";import Ec from"node:path";var nm,sm,qb=h(()=>{"use strict";F();V();nm=class{static{c(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ec.join(d0.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await tm.mkdir(this.commandsPath,{recursive:!0});let n=Ec.join(this.commandsPath,`${e}.md`),r=this.buildTemplateContent(e,t);return await tm.writeFile(n,r,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:b(n)}}}async deleteWorkflowTemplate(e){try{let t=Ec.join(this.commandsPath,`${e}.md`);return await tm.unlink(t),{success:!0}}catch(t){return L(t)?{success:!0}:{success:!1,error:b(t)}}}async templateExists(e){let t=Ec.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
1298
1298
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1299
1299
  ---
1300
1300
 
@@ -1330,23 +1330,23 @@ Suggest relevant actions based on the workflow results:
1330
1330
  - View rules: \`prjct workflow ${e} --md\`
1331
1331
  - Add rules: \`prjct workflow add "command" before ${e} --md\`
1332
1332
  - Run again: \`p. ${e}\`
1333
- `}},nm=new tm});async function Jb(s,e,t){let n=ee.getRulesForCommand(s,"ship").filter(u=>u.position==="before");if(n.length>0)return H(`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`,t);let r=await Ua(e),o=0,i=[],a=c(()=>new Date().toISOString(),"ts"),l=ee.addRule(s,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:is.GATE_QUICK_MS,sortOrder:o++,createdAt:a()});if(i.push(`#${l} [gate] prevent main branch`),r.lint){let u=ee.addRule(s,{type:"step",command:"ship",position:"before",action:`${r.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:is.STEP_LINT_MS,sortOrder:o++,createdAt:a()});i.push(`#${u} [step] lint \u2192 ${r.lint.command}`)}if(r.test){let u=ee.addRule(s,{type:"step",command:"ship",position:"before",action:`${r.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:is.STEP_TEST_MS,sortOrder:o++,createdAt:a()});i.push(`#${u} [step] test \u2192 ${r.test.command}`)}if(t.md)console.log(W(Ce("Workflow Initialized",`Added ${i.length} default ship rules`),Oe(i),Be([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{At(`initialized ${i.length} workflow rules for ship`);for(let u of i)console.log(` ${u}`)}return{success:!0,rulesAdded:i.length}}async function Xb(s,e,t,n){let r=s.match(/^(\S+)\s+"([^"]+)"/);if(!r)return H('Usage: prjct workflow create <name> "description"',n);let[,o,i]=r;if(!gt.isValidName(o))return H('Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")',n);if(gt.isReservedName(o))return H(`Workflow name '${o}' is reserved`,n);if(gt.getWorkflow(e,o))return H(`Workflow '${o}' already exists`,n);try{let a=gt.createWorkflow(e,{name:o,description:i}),l=await nm.generateWorkflowTemplate(o,i);return l.success?(n.md?console.log(W(Ce("Workflow Created",`Created workflow: ${o}`),q("Description",i),q("Template",`Installed at ${l.path}`),Be([{label:"Add rules",command:`prjct workflow add "action" before ${o} --md`},{label:"View workflow",command:`prjct workflow ${o} --md`},{label:"Run workflow",command:`p. ${o}`}]))):(At(`created workflow: ${o}`),console.log(` ${i}`),console.log(` Template: ${l.path}`),console.log(`
1333
+ `}},sm=new nm});async function Jb(s,e,t){let n=ee.getRulesForCommand(s,"ship").filter(u=>u.position==="before");if(n.length>0)return H(`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`,t);let r=await Wa(e),o=0,i=[],a=c(()=>new Date().toISOString(),"ts"),l=ee.addRule(s,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:is.GATE_QUICK_MS,sortOrder:o++,createdAt:a()});if(i.push(`#${l} [gate] prevent main branch`),r.lint){let u=ee.addRule(s,{type:"step",command:"ship",position:"before",action:`${r.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:is.STEP_LINT_MS,sortOrder:o++,createdAt:a()});i.push(`#${u} [step] lint \u2192 ${r.lint.command}`)}if(r.test){let u=ee.addRule(s,{type:"step",command:"ship",position:"before",action:`${r.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:is.STEP_TEST_MS,sortOrder:o++,createdAt:a()});i.push(`#${u} [step] test \u2192 ${r.test.command}`)}if(t.md)console.log(W(Ce("Workflow Initialized",`Added ${i.length} default ship rules`),Oe(i),Be([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{At(`initialized ${i.length} workflow rules for ship`);for(let u of i)console.log(` ${u}`)}return{success:!0,rulesAdded:i.length}}async function Xb(s,e,t,n){let r=s.match(/^(\S+)\s+"([^"]+)"/);if(!r)return H('Usage: prjct workflow create <name> "description"',n);let[,o,i]=r;if(!gt.isValidName(o))return H('Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")',n);if(gt.isReservedName(o))return H(`Workflow name '${o}' is reserved`,n);if(gt.getWorkflow(e,o))return H(`Workflow '${o}' already exists`,n);try{let a=gt.createWorkflow(e,{name:o,description:i}),l=await sm.generateWorkflowTemplate(o,i);return l.success?(n.md?console.log(W(Ce("Workflow Created",`Created workflow: ${o}`),q("Description",i),q("Template",`Installed at ${l.path}`),Be([{label:"Add rules",command:`prjct workflow add "action" before ${o} --md`},{label:"View workflow",command:`prjct workflow ${o} --md`},{label:"Run workflow",command:`p. ${o}`}]))):(At(`created workflow: ${o}`),console.log(` ${i}`),console.log(` Template: ${l.path}`),console.log(`
1334
1334
  Run with: p. ${o}`)),{success:!0,workflowId:a,name:o,templatePath:l.path}):(gt.deleteWorkflow(e,o),H(`Failed to generate template: ${l.error}`,n))}catch(a){return H(b(a),n)}}async function zb(s,e){let t=gt.getAllWorkflows(s);if(t.length===0)return e.md?console.log("> No workflows found"):jn("No workflows found"),{success:!0,workflows:[]};let n=t.filter(i=>i.isBuiltin),r=t.filter(i=>!i.isBuiltin),o=c(i=>`- **${i.name}** \u2014 ${i.description??""}`,"renderRow");if(e.md){let i=[];n.length>0&&i.push(q("Built-in Workflows",n.map(o).join(`
1335
1335
  `))),r.length>0&&i.push(q("Custom Workflows",r.map(o).join(`
1336
1336
  `))),console.log(W(...i,Be([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(At(`${t.length} workflow${t.length!==1?"s":""}`),n.length>0){console.log(`
1337
1337
  Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(r.length>0){console.log(`
1338
- Custom:`);for(let i of r)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}async function Kb(s,e,t){let n=s.trim();if(!n)return H("Usage: prjct workflow delete <name>",t);try{return gt.deleteWorkflow(e,n)?(await nm.deleteWorkflowTemplate(n),t.md?console.log(W(Ce("Workflow Deleted",`Deleted workflow: ${n}`))):At(`deleted workflow: ${n}`),{success:!0}):H(`Workflow '${n}' not found`,t)}catch(r){return H(b(r),t)}}var Yb=h(()=>{"use strict";qb();Ho();$n();F();Te();kt();md();Yp();c(Jb,"workflowInit");c(Xb,"workflowCreate");c(zb,"workflowList");c(Kb,"workflowDelete")});var Wr,sm=h(()=>{"use strict";Rn();Ka();Ho();pt();F();ue();Te();kt();Fo();pe();Od();Ie();Zt();Kp();Ub();Vb();Yb();Wr=class extends X{static{c(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=r.value;if(!e)return this._showActiveTask(o,n);let i=await ns(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=/^[A-Z]+-\d+$/.test(e)?e:void 0,l=e,u=Ve(),d=n.spec;if(await B.startTask(o,{id:u,description:l,sessionId:Ve(),linearId:a,linkedSpecId:d}),d)try{let{specService:m}=await Promise.resolve().then(()=>(Qa(),Wd));await m.linkTask(t,d,u)}catch{}await this.logToMemory(t,"task_started",{task:l,taskId:u,timestamp:R()}),await ns(o,"task","after",{projectPath:t,skipRules:n.skipHooks});let p=await za(t).catch(()=>"");return n.md?console.log(W(No({description:l,status:"active"}),q("State",Oe([`Task: \`${u}\``,p?`Branch: \`${p}\``:null,a?`Linear: \`${a}\``:null,i.instructions.length>0?`Agent instructions: ${i.instructions.length}`:null].filter(m=>m!==null))),i.instructions.length>0?q("Agent Instructions",Oe(i.instructions)):null,Be([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(f.done(`Task: ${l}`),_w("working"),br("task")),{success:!0,task:l,taskId:u}}catch(r){let o=b(r);return n.md?console.log(`> ${o}`):f.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t){let n=await B.getCurrentTask(e);if(!n){let r='no active task. `prjct task "<description>"` to start one.';return t.md?console.log(`> ${r}`):f.info(r),{success:!0,message:"no active task"}}return t.md?console.log(W(No({description:n.description,status:"active"}),q("State",Oe([`Task: \`${n.id}\``,n.branch?`Branch: \`${n.branch}\``:null,n.linearId?`Linear: \`${n.linearId}\``:null,`Started: ${n.startedAt}`].filter(r=>r!==null))))):f.info(`Active: ${n.description}`),{success:!0,currentTask:n}}async workflow(e=null,t=process.cwd(),n={}){try{let r=await we(t,n);if(!r.ok)return r.result;let o=r.value,i=e?.trim()??"";if(!i)return Sc(null,o,n);let a=$b(i);switch(a.type){case"add":return Mb(a.args,o,n);case"gate":return Ob(a.args,o,n);case"instruction":return Nb(a.args,o,n);case"remove":return Lb(a.args,o,n);case"disable":return Hb(a.args,o,n);case"reset":return Fb(o,n);case"init":return Jb(o,t,n);case"help":return Bb(n);case"create":return Xb(a.args,o,t,n);case"list":return zb(o,n);case"delete":return Kb(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return Sc(a.args||null,o,n);default:return Sc(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(r){return n.md?console.log(`> Error: ${b(r)}`):f.fail(b(r)),Me(r)}}async run(e,t=process.cwd(),n={}){try{let r=await we(t,n);if(!r.ok)return r.result;let o=r.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=gt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let l=await ns(o,i,"before",{projectPath:t});if(!l.success){if(n.md)jw("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await ns(o,i,"after",{projectPath:t}),n.md?console.log(W(Ce(`Workflow: ${i}`,a.description||""),Be([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(r){let o=b(r);return n.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}}});var as,u8,rm=h(()=>{"use strict";dc();bp();Sp();mc();Ko();Rp();uc();Pp();fc();Lp();lc();Hp();Gp();zp();sm();as=class{static{c(this,"PrjctCommands")}workflow;planning;shipping;analysis;setupCmds;updateCmds;contextCmds;primitivesCmds;seedCmds;installCmds;captureCmds;mcpCmds;teamCmds;configCmds;specCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Wr,this.planning=new Ms,this.shipping=new Ds,this.analysis=new Os,this.setupCmds=new Dr,this.updateCmds=new Ur,this.contextCmds=new os,this.primitivesCmds=new Ir,this.seedCmds=new Fs,this.installCmds=new Ns,this.captureCmds=new Ar,this.mcpCmds=new $r,this.teamCmds=new Lr,this.configCmds=new jr,this.specCmds=new Or,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),n={}){return this.analysis.saveLlmAnalysis(e,t,n)}async regenVault(e=process.cwd(),t={}){return this.analysis.regenVault(e,t)}async context(e=null,t=process.cwd(),n={}){return this.contextCmds.context(e,t,n)}async status(e=null,t=process.cwd(),n={}){return this.primitivesCmds.status(e,t,n)}async tag(e=null,t=process.cwd(),n={}){return this.primitivesCmds.tag(e,t,n)}async remember(e=null,t=process.cwd(),n={}){return this.primitivesCmds.remember(e,t,n)}async seed(e=null,t=process.cwd(),n={}){return this.seedCmds.seed(e,t,n)}async install(e=null,t=process.cwd(),n={}){return this.installCmds.install(null,t,n)}async capture(e=null,t=process.cwd(),n={}){return this.captureCmds.capture(e,t,n)}async mcp(e=null,t=process.cwd(),n={}){return this.mcpCmds.mcp(e,t,n)}async team(e=null,t=process.cwd(),n={}){return this.teamCmds.team(e,t,n)}async config(e=null,t=process.cwd(),n={}){return this.configCmds.config(e,t,n)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}async spec(e=null,t=process.cwd(),n={}){return this.specCmds.draft(e,t,n)}async specList(e=process.cwd(),t={}){return this.specCmds.list(null,e,t)}async specShow(e=null,t=process.cwd(),n={}){return this.specCmds.show(e,t,n)}async specUpdate(e=null,t=process.cwd(),n={}){return this.specCmds.update(e,t,n)}async specSetStatus(e=null,t=process.cwd(),n={}){return this.specCmds.setStatus(e,t,n)}async specRecordReview(e=null,t=process.cwd(),n={}){return this.specCmds.recordReview(e,t,n)}async specLinkTask(e=null,t=process.cwd(),n={}){return this.specCmds.linkTask(e,t,n)}async specShip(e=null,t=process.cwd(),n={}){return this.specCmds.ship(e,t,n)}async specAudit(e=null,t=process.cwd(),n={}){return this.specCmds.audit(e,t,n)}async specBreakdown(e=null,t=process.cwd(),n={}){return this.specCmds.breakdown(e,t,n)}async specInventory(e=process.cwd(),t={}){return this.specCmds.inventory(null,e,t)}},u8=new as});var om,ct,Gr=h(()=>{"use strict";re();ge();F();ue();om=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,r){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=c(async(a,l)=>a!=null?o.call(t,a,l.projectPath):o.call(t,l.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,r)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(r=>r.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),r=n.filter((a,l)=>n.indexOf(a)!==l);r.length>0&&e.push(`Duplicate command names: ${r.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(l=>!i.includes(l.group));a.length>0&&e.push(`Invalid categories: ${a.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await I.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:_.getGlobalProjectPath(t),timestamp:R()}}async execute(e,t,n=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:R()};else try{o=await this.buildContext(n)}catch(l){return{success:!1,error:b(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:n,globalPath:"",timestamp:R()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:R()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},ct=new om});import{execSync as Qb}from"node:child_process";import Ec from"node:fs/promises";import ei from"node:path";async function eS(s){let e=0;try{let t=await Ec.readdir(s,{withFileTypes:!0});for(let n of t){let r=ei.join(s,n.name);if(n.isDirectory())e+=await eS(r);else try{let o=await Ec.stat(r);e+=o.size}catch{}}}catch{}return e}function im(s){if(s===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(s)/Math.log(1024));return`${(s/1024**t).toFixed(1)} ${e[t]}`}async function p0(s){try{return(await Ec.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function tS(){let s={homebrew:!1,npm:!1};try{Qb("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{Qb("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}async function nS(){let s=[],e=bl(),t=_.getGlobalBasePath(),n=await C(t),r=n?await p0(ei.join(t,"projects")):0,o=n?await eS(t):0;s.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:n});let i=ei.join(e.claude.config,"CLAUDE.md");s.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await Zb(i)}),s.push({path:e.claude.router,type:"file",description:"Claude router",exists:await C(e.claude.router)});let a=ei.join(e.claude.config,"prjct-statusline.sh");s.push({path:a,type:"file",description:"Status line script",exists:await C(a)}),s.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await C(e.gemini.router)});let l=ei.join(e.gemini.config,"GEMINI.md");return await Zb(l)&&s.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}async function Zb(s){if(!await C(s))return!1;try{let e=await Ec.readFile(s,"utf-8");return e.includes(Cc)&&e.includes(ti)}catch{return!1}}var Cc,ti,am=h(()=>{"use strict";Wt();ge();V();Cc="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",ti="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";c(eS,"getDirectorySize");c(im,"formatSize");c(p0,"countDirectoryItems");c(tS,"detectInstallation");c(nS,"gatherUninstallItems");c(Zb,"hasMarkerSection")});import{execSync as sS}from"node:child_process";import Nn from"node:fs/promises";import m0 from"node:os";import Rc from"node:path";import g0 from"node:readline";async function rS(s,e){await Nn.mkdir(e,{recursive:!0});let t=await Nn.readdir(s,{withFileTypes:!0});for(let n of t){let r=Rc.join(s,n.name),o=Rc.join(e,n.name);n.isDirectory()?await rS(r,o):await Nn.copyFile(r,o)}}async function oS(){let s=m0.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Rc.join(s,`.prjct-backup-${e}`);try{await Nn.mkdir(t,{recursive:!0});let n=_.getGlobalBasePath();return await C(n)&&await rS(n,Rc.join(t,".prjct-cli")),t}catch{return null}}async function f0(s){try{let e=await Nn.readFile(s,"utf-8");if(!e.includes(Cc)||!e.includes(ti))return!1;let t=e.indexOf(Cc),n=e.indexOf(ti)+ti.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
1338
+ Custom:`);for(let i of r)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}async function Kb(s,e,t){let n=s.trim();if(!n)return H("Usage: prjct workflow delete <name>",t);try{return gt.deleteWorkflow(e,n)?(await sm.deleteWorkflowTemplate(n),t.md?console.log(W(Ce("Workflow Deleted",`Deleted workflow: ${n}`))):At(`deleted workflow: ${n}`),{success:!0}):H(`Workflow '${n}' not found`,t)}catch(r){return H(b(r),t)}}var Yb=h(()=>{"use strict";qb();Ho();$n();F();Te();kt();gd();Qp();c(Jb,"workflowInit");c(Xb,"workflowCreate");c(zb,"workflowList");c(Kb,"workflowDelete")});var Wr,rm=h(()=>{"use strict";Rn();Ya();Ho();pt();F();ue();Te();kt();Fo();pe();Nd();Ie();Zt();Yp();Ub();Vb();Yb();Wr=class extends X{static{c(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=r.value;if(!e)return this._showActiveTask(o,n);let i=await ns(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=/^[A-Z]+-\d+$/.test(e)?e:void 0,l=e,u=Ve(),d=n.spec;if(await B.startTask(o,{id:u,description:l,sessionId:Ve(),linearId:a,linkedSpecId:d}),d)try{let{specService:m}=await Promise.resolve().then(()=>(Za(),Gd));await m.linkTask(t,d,u)}catch{}await this.logToMemory(t,"task_started",{task:l,taskId:u,timestamp:R()}),await ns(o,"task","after",{projectPath:t,skipRules:n.skipHooks});let p=await Ka(t).catch(()=>"");return n.md?console.log(W(No({description:l,status:"active"}),q("State",Oe([`Task: \`${u}\``,p?`Branch: \`${p}\``:null,a?`Linear: \`${a}\``:null,i.instructions.length>0?`Agent instructions: ${i.instructions.length}`:null].filter(m=>m!==null))),i.instructions.length>0?q("Agent Instructions",Oe(i.instructions)):null,Be([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(f.done(`Task: ${l}`),_w("working"),br("task")),{success:!0,task:l,taskId:u}}catch(r){let o=b(r);return n.md?console.log(`> ${o}`):f.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t){let n=await B.getCurrentTask(e);if(!n){let r='no active task. `prjct task "<description>"` to start one.';return t.md?console.log(`> ${r}`):f.info(r),{success:!0,message:"no active task"}}return t.md?console.log(W(No({description:n.description,status:"active"}),q("State",Oe([`Task: \`${n.id}\``,n.branch?`Branch: \`${n.branch}\``:null,n.linearId?`Linear: \`${n.linearId}\``:null,`Started: ${n.startedAt}`].filter(r=>r!==null))))):f.info(`Active: ${n.description}`),{success:!0,currentTask:n}}async workflow(e=null,t=process.cwd(),n={}){try{let r=await we(t,n);if(!r.ok)return r.result;let o=r.value,i=e?.trim()??"";if(!i)return Tc(null,o,n);let a=$b(i);switch(a.type){case"add":return Mb(a.args,o,n);case"gate":return Ob(a.args,o,n);case"instruction":return Nb(a.args,o,n);case"remove":return Lb(a.args,o,n);case"disable":return Hb(a.args,o,n);case"reset":return Fb(o,n);case"init":return Jb(o,t,n);case"help":return Bb(n);case"create":return Xb(a.args,o,t,n);case"list":return zb(o,n);case"delete":return Kb(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return Tc(a.args||null,o,n);default:return Tc(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(r){return n.md?console.log(`> Error: ${b(r)}`):f.fail(b(r)),Me(r)}}async run(e,t=process.cwd(),n={}){try{let r=await we(t,n);if(!r.ok)return r.result;let o=r.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=gt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let l=await ns(o,i,"before",{projectPath:t});if(!l.success){if(n.md)jw("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await ns(o,i,"after",{projectPath:t}),n.md?console.log(W(Ce(`Workflow: ${i}`,a.description||""),Be([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(r){let o=b(r);return n.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}}});var as,p8,om=h(()=>{"use strict";pc();Sp();Tp();gc();Ko();Pp();dc();xp();hc();Fp();uc();Up();Bp();Kp();rm();as=class{static{c(this,"PrjctCommands")}workflow;planning;shipping;analysis;setupCmds;updateCmds;contextCmds;primitivesCmds;seedCmds;installCmds;captureCmds;mcpCmds;teamCmds;configCmds;specCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Wr,this.planning=new Ms,this.shipping=new Ds,this.analysis=new Os,this.setupCmds=new Dr,this.updateCmds=new Ur,this.contextCmds=new os,this.primitivesCmds=new Ir,this.seedCmds=new Fs,this.installCmds=new Ns,this.captureCmds=new Ar,this.mcpCmds=new $r,this.teamCmds=new Lr,this.configCmds=new jr,this.specCmds=new Or,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),n={}){return this.analysis.saveLlmAnalysis(e,t,n)}async regenVault(e=process.cwd(),t={}){return this.analysis.regenVault(e,t)}async context(e=null,t=process.cwd(),n={}){return this.contextCmds.context(e,t,n)}async status(e=null,t=process.cwd(),n={}){return this.primitivesCmds.status(e,t,n)}async tag(e=null,t=process.cwd(),n={}){return this.primitivesCmds.tag(e,t,n)}async remember(e=null,t=process.cwd(),n={}){return this.primitivesCmds.remember(e,t,n)}async seed(e=null,t=process.cwd(),n={}){return this.seedCmds.seed(e,t,n)}async install(e=null,t=process.cwd(),n={}){return this.installCmds.install(null,t,n)}async capture(e=null,t=process.cwd(),n={}){return this.captureCmds.capture(e,t,n)}async mcp(e=null,t=process.cwd(),n={}){return this.mcpCmds.mcp(e,t,n)}async team(e=null,t=process.cwd(),n={}){return this.teamCmds.team(e,t,n)}async config(e=null,t=process.cwd(),n={}){return this.configCmds.config(e,t,n)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}async spec(e=null,t=process.cwd(),n={}){return this.specCmds.draft(e,t,n)}async specList(e=process.cwd(),t={}){return this.specCmds.list(null,e,t)}async specShow(e=null,t=process.cwd(),n={}){return this.specCmds.show(e,t,n)}async specUpdate(e=null,t=process.cwd(),n={}){return this.specCmds.update(e,t,n)}async specSetStatus(e=null,t=process.cwd(),n={}){return this.specCmds.setStatus(e,t,n)}async specRecordReview(e=null,t=process.cwd(),n={}){return this.specCmds.recordReview(e,t,n)}async specLinkTask(e=null,t=process.cwd(),n={}){return this.specCmds.linkTask(e,t,n)}async specShip(e=null,t=process.cwd(),n={}){return this.specCmds.ship(e,t,n)}async specAudit(e=null,t=process.cwd(),n={}){return this.specCmds.audit(e,t,n)}async specBreakdown(e=null,t=process.cwd(),n={}){return this.specCmds.breakdown(e,t,n)}async specInventory(e=process.cwd(),t={}){return this.specCmds.inventory(null,e,t)}},p8=new as});var im,ct,Gr=h(()=>{"use strict";re();ge();F();ue();im=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,r){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=c(async(a,l)=>a!=null?o.call(t,a,l.projectPath):o.call(t,l.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,r)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(r=>r.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),r=n.filter((a,l)=>n.indexOf(a)!==l);r.length>0&&e.push(`Duplicate command names: ${r.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(l=>!i.includes(l.group));a.length>0&&e.push(`Invalid categories: ${a.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await I.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:_.getGlobalProjectPath(t),timestamp:R()}}async execute(e,t,n=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:R()};else try{o=await this.buildContext(n)}catch(l){return{success:!1,error:b(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:n,globalPath:"",timestamp:R()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:R()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},ct=new im});import{execSync as Qb}from"node:child_process";import Cc from"node:fs/promises";import ei from"node:path";async function eS(s){let e=0;try{let t=await Cc.readdir(s,{withFileTypes:!0});for(let n of t){let r=ei.join(s,n.name);if(n.isDirectory())e+=await eS(r);else try{let o=await Cc.stat(r);e+=o.size}catch{}}}catch{}return e}function am(s){if(s===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(s)/Math.log(1024));return`${(s/1024**t).toFixed(1)} ${e[t]}`}async function p0(s){try{return(await Cc.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function tS(){let s={homebrew:!1,npm:!1};try{Qb("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{Qb("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}async function nS(){let s=[],e=Sl(),t=_.getGlobalBasePath(),n=await C(t),r=n?await p0(ei.join(t,"projects")):0,o=n?await eS(t):0;s.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:n});let i=ei.join(e.claude.config,"CLAUDE.md");s.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await Zb(i)}),s.push({path:e.claude.router,type:"file",description:"Claude router",exists:await C(e.claude.router)});let a=ei.join(e.claude.config,"prjct-statusline.sh");s.push({path:a,type:"file",description:"Status line script",exists:await C(a)}),s.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await C(e.gemini.router)});let l=ei.join(e.gemini.config,"GEMINI.md");return await Zb(l)&&s.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}async function Zb(s){if(!await C(s))return!1;try{let e=await Cc.readFile(s,"utf-8");return e.includes(Rc)&&e.includes(ti)}catch{return!1}}var Rc,ti,cm=h(()=>{"use strict";Wt();ge();V();Rc="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",ti="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";c(eS,"getDirectorySize");c(am,"formatSize");c(p0,"countDirectoryItems");c(tS,"detectInstallation");c(nS,"gatherUninstallItems");c(Zb,"hasMarkerSection")});import{execSync as sS}from"node:child_process";import Nn from"node:fs/promises";import m0 from"node:os";import Pc from"node:path";import g0 from"node:readline";async function rS(s,e){await Nn.mkdir(e,{recursive:!0});let t=await Nn.readdir(s,{withFileTypes:!0});for(let n of t){let r=Pc.join(s,n.name),o=Pc.join(e,n.name);n.isDirectory()?await rS(r,o):await Nn.copyFile(r,o)}}async function oS(){let s=m0.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Pc.join(s,`.prjct-backup-${e}`);try{await Nn.mkdir(t,{recursive:!0});let n=_.getGlobalBasePath();return await C(n)&&await rS(n,Pc.join(t,".prjct-cli")),t}catch{return null}}async function f0(s){try{let e=await Nn.readFile(s,"utf-8");if(!e.includes(Rc)||!e.includes(ti))return!1;let t=e.indexOf(Rc),n=e.indexOf(ti)+ti.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
1339
1339
 
1340
1340
  `).trim(),!r||r.trim().length===0?await Nn.unlink(s):await Nn.writeFile(s,`${r}
1341
- `,"utf-8"),!0}catch{return!1}}async function iS(s,e,t){let n=[],r=[];for(let o of s)if(o.exists)try{o.type==="section"?await f0(o.path)&&n.push(o.path):o.type==="directory"?(await Nn.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await Nn.unlink(o.path),n.push(o.path))}catch(i){r.push(`${o.path}: ${b(i)}`)}try{await new ln().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||sS(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${b(o)}`)}if(e.npm)try{t.dryRun||sS("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){r.push(`npm: ${b(o)}`)}}return{deleted:n,errors:r}}async function aS(s){let e=g0.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(s,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}var cS=h(()=>{"use strict";Wt();ge();F();V();am();c(rS,"copyDirectory");c(oS,"createBackup");c(f0,"removePrjctSection");c(iS,"performUninstall");c(aS,"promptConfirmation")});var uS={};D(uS,{UninstallCommands:()=>ni,uninstall:()=>lS});import Pe from"chalk";async function lS(s={},e=process.cwd()){let t=await nS(),n=tS(),r=t.filter(l=>l.exists);if(r.length===0&&!n.homebrew&&!n.npm)return console.log(Pe.yellow(`
1342
- No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.reduce((l,u)=>l+(u.size||0),0);console.log(""),console.log(Pe.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Pe.white("The following will be permanently deleted:")),console.log("");for(let l of r){let u=_.getDisplayPath(l.path),d="";l.type==="section"?d=Pe.dim("(section only)"):l.size&&(d=Pe.dim(`(${im(l.size)})`)),console.log(` ${Pe.cyan(u.padEnd(35))} ${d}`),console.log(` ${Pe.dim(l.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${Pe.cyan("Homebrew".padEnd(35))} ${Pe.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${Pe.cyan("npm global".padEnd(35))} ${Pe.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Pe.dim(` Total size: ${im(o)}`)),console.log("")),s.dryRun)return console.log(Pe.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:r.length};if(s.backup){console.log(Pe.blue("Creating backup..."));let l=await oS();l?(console.log(Pe.green(`Backup created: ${_.getDisplayPath(l)}`)),console.log("")):console.log(Pe.yellow("Failed to create backup, continuing..."))}if(!s.force&&(console.log(Pe.yellow('Type "uninstall" to confirm:')),!await aS("> ")))return console.log(Pe.yellow(`
1341
+ `,"utf-8"),!0}catch{return!1}}async function iS(s,e,t){let n=[],r=[];for(let o of s)if(o.exists)try{o.type==="section"?await f0(o.path)&&n.push(o.path):o.type==="directory"?(await Nn.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await Nn.unlink(o.path),n.push(o.path))}catch(i){r.push(`${o.path}: ${b(i)}`)}try{await new ln().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||sS(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${b(o)}`)}if(e.npm)try{t.dryRun||sS("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){r.push(`npm: ${b(o)}`)}}return{deleted:n,errors:r}}async function aS(s){let e=g0.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(s,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}var cS=h(()=>{"use strict";Wt();ge();F();V();cm();c(rS,"copyDirectory");c(oS,"createBackup");c(f0,"removePrjctSection");c(iS,"performUninstall");c(aS,"promptConfirmation")});var uS={};D(uS,{UninstallCommands:()=>ni,uninstall:()=>lS});import Pe from"chalk";async function lS(s={},e=process.cwd()){let t=await nS(),n=tS(),r=t.filter(l=>l.exists);if(r.length===0&&!n.homebrew&&!n.npm)return console.log(Pe.yellow(`
1342
+ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.reduce((l,u)=>l+(u.size||0),0);console.log(""),console.log(Pe.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Pe.white("The following will be permanently deleted:")),console.log("");for(let l of r){let u=_.getDisplayPath(l.path),d="";l.type==="section"?d=Pe.dim("(section only)"):l.size&&(d=Pe.dim(`(${am(l.size)})`)),console.log(` ${Pe.cyan(u.padEnd(35))} ${d}`),console.log(` ${Pe.dim(l.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${Pe.cyan("Homebrew".padEnd(35))} ${Pe.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${Pe.cyan("npm global".padEnd(35))} ${Pe.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Pe.dim(` Total size: ${am(o)}`)),console.log("")),s.dryRun)return console.log(Pe.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:r.length};if(s.backup){console.log(Pe.blue("Creating backup..."));let l=await oS();l?(console.log(Pe.green(`Backup created: ${_.getDisplayPath(l)}`)),console.log("")):console.log(Pe.yellow("Failed to create backup, continuing..."))}if(!s.force&&(console.log(Pe.yellow('Type "uninstall" to confirm:')),!await aS("> ")))return console.log(Pe.yellow(`
1343
1343
  Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Pe.blue("Removing prjct..."));let{deleted:i,errors:a}=await iS(t,n,s);if(console.log(""),i.length>0&&console.log(Pe.green(`Removed ${i.length} items`)),a.length>0){console.log(Pe.yellow(`
1344
- ${a.length} errors:`));for(let l of a)console.log(Pe.red(` - ${l}`))}return console.log(""),console.log(Pe.green("prjct has been uninstalled.")),console.log(Pe.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var ni,cm=h(()=>{"use strict";ge();Ie();cS();am();c(lS,"uninstall");ni=class extends X{static{c(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return lS(e,t)}}});function y0(){for(let[s,e]of Object.entries(lo))ct.registerCategory(s,e)}function w0(){if(!ct.has("work")){y0();for(let s of Fn){if(!s.routing)continue;let e=h0[s.routing.group];ct.registerMethod(s.name,e,s.routing.method,s)}}}var h0,lm=h(()=>{"use strict";dc();bp();mi();Sp();mc();Ko();Rp();uc();Pp();Gr();fc();Lp();lc();Hp();Gp();cm();zp();sm();h0={workflow:new Wr,planning:new Ms,shipping:new Ds,analysis:new Os,setup:new Dr,context:new os,primitives:new Ir,seed:new Fs,install:new Ns,capture:new Ar,mcp:new $r,team:new Lr,config:new jr,uninstall:new ni,update:new Ur,spec:new Or};c(y0,"registerCategories");c(w0,"registerAllCommands");w0()});function si(s){let e=ct.getAll().map(r=>r.name),t=null,n=1/0;for(let r of e){let o=k0(s.toLowerCase(),r.toLowerCase());o<n&&(n=o,t=r)}return n<=2?t:null}function k0(s,e){let t=s.length,n=e.length,r=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=n;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)r[o][i]=s[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][n]}var um=h(()=>{"use strict";Gr();c(si,"findClosestCommand");c(k0,"editDistance")});function xc(s){return Object.hasOwn(Pc,s)}function dS(s){let e=Pc[s];return e?`'prjct ${s}' was removed in v2.
1344
+ ${a.length} errors:`));for(let l of a)console.log(Pe.red(` - ${l}`))}return console.log(""),console.log(Pe.green("prjct has been uninstalled.")),console.log(Pe.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var ni,lm=h(()=>{"use strict";ge();Ie();cS();cm();c(lS,"uninstall");ni=class extends X{static{c(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return lS(e,t)}}});function y0(){for(let[s,e]of Object.entries(lo))ct.registerCategory(s,e)}function w0(){if(!ct.has("work")){y0();for(let s of Fn){if(!s.routing)continue;let e=h0[s.routing.group];ct.registerMethod(s.name,e,s.routing.method,s)}}}var h0,um=h(()=>{"use strict";pc();Sp();gi();Tp();gc();Ko();Pp();dc();xp();Gr();hc();Fp();uc();Up();Bp();lm();Kp();rm();h0={workflow:new Wr,planning:new Ms,shipping:new Ds,analysis:new Os,setup:new Dr,context:new os,primitives:new Ir,seed:new Fs,install:new Ns,capture:new Ar,mcp:new $r,team:new Lr,config:new jr,uninstall:new ni,update:new Ur,spec:new Or};c(y0,"registerCategories");c(w0,"registerAllCommands");w0()});function si(s){let e=ct.getAll().map(r=>r.name),t=null,n=1/0;for(let r of e){let o=k0(s.toLowerCase(),r.toLowerCase());o<n&&(n=o,t=r)}return n<=2?t:null}function k0(s,e){let t=s.length,n=e.length,r=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=n;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)r[o][i]=s[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][n]}var dm=h(()=>{"use strict";Gr();c(si,"findClosestCommand");c(k0,"editDistance")});function Ac(s){return Object.hasOwn(xc,s)}function dS(s){let e=xc[s];return e?`'prjct ${s}' was removed in v2.
1345
1345
  \u2192 Use: ${e.replacement}
1346
- ${e.note}`:null}var Pc,dm=h(()=>{"use strict";Pc={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};c(xc,"isRemovedVerb");c(dS,"migrationMessage")});async function pS(s,e){let t=e.args.join(" ")||null,n=e.options,r=n.md===!0;if(xc(e.command)&&!ct.getByName(e.command))return{success:!1,error:dS(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!ct.getByName(e.command)&&!(e.args.length===0&&si(e.command)!==null)){let o=[e.command,...e.args.filter(i=>!i.startsWith("-"))].join(" ");return s.capture(o,e.cwd,{md:r,tags:n.tags?String(n.tags):void 0,force:n.force===!0})}switch(e.command){case"sync":return s.sync(e.cwd,{preview:n.preview===!0||n["dry-run"]===!0,yes:n.yes===!0,json:n.json===!0,md:r,package:n.package?String(n.package):void 0,full:n.full===!0});case"task":return s.task(t,e.cwd,{md:r,spec:n.spec?String(n.spec):void 0});case"ship":{let o=typeof n.intent=="string"?n.intent:void 0;return s.ship(t,e.cwd,{md:r,intent:o,skipHooks:n["skip-hooks"]===!0,noSpecGate:n["no-spec-gate"]===!0})}case"spec":return v0(s,e.args,n);case"audit-spec":return t?s.specAudit(t,e.cwd,{md:r}):{success:!1,error:"audit-spec requires a spec id"};case"workflow":return s.workflowPrefs(t,e.cwd,{md:r});case"analyze":return s.analyze(n,e.cwd);case"analysis-save-llm":return t?s.saveLlmAnalysis(t,e.cwd,{md:r}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"status":return s.status(t,e.cwd,{md:r});case"tag":return s.tag(t,e.cwd,{md:r});case"remember":return s.remember(t,e.cwd,{md:r,tags:n.tags?String(n.tags):void 0});case"mcp":return s.mcp(t,e.cwd,{md:r});case"team":return s.team(t,e.cwd,{md:r,required:n.required===!0,minVersion:n["min-version"]?String(n["min-version"]):void 0,enforce:n.enforce===!0});case"config":return s.config(t,e.cwd,{md:r});default:return ct.execute(e.command,t,e.cwd)}}async function v0(s,e,t){let n=t.md===!0,r=e[0],o=e.slice(1).join(" ")||null,i=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","inventory"]);if(r&&new Set(["draft","new","create"]).has(r))return s.spec(o,void 0,{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});if(!r||!i.has(r)){let l=e.join(" ")||null;return s.spec(l,void 0,{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0})}switch(r){case"list":return s.specList(void 0,{md:n,status:t.status?String(t.status):void 0});case"show":return s.specShow(o,void 0,{md:n});case"update":return s.specUpdate(o,void 0,{md:n,json:t.json?String(t.json):void 0});case"set-status":return s.specSetStatus(o,void 0,{md:n,status:t.status?String(t.status):void 0});case"record-review":return s.specRecordReview(o,void 0,{md:n,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return s.specLinkTask(o,void 0,{md:n,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return s.specShip(o,void 0,{md:n,pr:t.pr?String(t.pr):void 0});case"audit":return s.specAudit(o,void 0,{md:n});case"breakdown":return s.specBreakdown(o,void 0,{md:n,force:t.force===!0});case"inventory":return s.specInventory(void 0,{md:n,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${r}`}}}var mS=h(()=>{"use strict";um();Gr();dm();c(pS,"executeCommand");c(v0,"routeSpecDaemon")});import en from"node:fs";import b0 from"node:os";import gn from"node:path";function gS(){let s=__dirname;for(let n=0;n<5;n++){if(en.existsSync(gn.join(s,"package.json"))){let r=gn.join(s,"dist","daemon","entry.mjs");if(en.existsSync(r))return r;break}s=gn.dirname(s)}let e=[gn.join(__dirname,"..","daemon","entry.mjs"),gn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of e)if(en.existsSync(n))return n;let t=process.argv[1];return t&&en.existsSync(t)?t:null}function pm(s,e){if(!s||e===null)return!1;try{return en.statSync(s).mtimeMs!==e}catch{return!1}}function fS(){let s=__dirname;for(let e=0;e<6;e++){let t=gn.join(s,"package.json");try{let r=JSON.parse(en.readFileSync(t,"utf-8"));if(r?.name==="prjct-cli"&&typeof r.version=="string")return r.version}catch{}let n=gn.dirname(s);if(n===s)break;s=n}return null}function hS(s){if(!s)return!1;let e=b0.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let n of t){let r;try{r=en.realpathSync(n)}catch{continue}let o=gn.dirname(r);for(let i=0;i<6;i++){let a=gn.join(o,"package.json");try{let u=JSON.parse(en.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==s}catch{}let l=gn.dirname(o);if(l===o)break;o=l}}return!1}function yS(){let s=Ae.log();try{if(en.statSync(s).size>S0){let t=`${s}.1`;try{en.unlinkSync(t)}catch{}en.renameSync(s,t)}}catch{}}function wS(s){try{return process.kill(s,0),!0}catch{return!1}}var S0,kS=h(()=>{"use strict";rr();c(gS,"resolveEntryPath");c(pm,"isCodeStale");c(fS,"readOwnPackageVersion");c(hS,"isGlobalVersionDrifted");S0=1024*1024;c(yS,"rotateLog");c(wS,"isProcessRunning")});var TS={};D(TS,{startDaemon:()=>R0});import _t from"node:fs";import{createServer as T0}from"node:net";async function R0(s){process.env.PRJCT_IN_DAEMON="1";let e=Ae.socket(),t=Ae.pid(),n=Ae.runDir();if(_t.mkdirSync(n,{recursive:!0}),_t.existsSync(t)){let i=parseInt(_t.readFileSync(t,"utf-8").trim(),10);wS(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),_t.unlinkSync(t)}_t.existsSync(e)&&_t.unlinkSync(e),yS();let r=gS(),o=null;if(r)try{o=_t.statSync(r).mtimeMs}catch{}if(Gs=fS(),ie={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ml,idleTimer:null,entryPath:r,entryMtime:o,activeRequests:0,restartPending:!1},Gs)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(Ii(),Dl));i(Gs)||await a(Gs)}catch{}if(ri=new as,Br=T0(i=>P0(i)),Br.listen(e,()=>{_t.chmodSync(e,384),_t.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),r&&console.log(` Watching: ${r}`),SS()}),Br.on("error",i=>{console.error("Daemon socket error:",i.message),Vr(1)}),process.on("SIGTERM",()=>Vr(0)),process.on("SIGINT",()=>Vr(0)),process.on("SIGHUP",()=>{ri=new as,console.log("Daemon reloaded (SIGHUP)")}),!s.foreground)try{process.stdin?.unref?.()}catch{}}function P0(s){let e="";s.on("data",async t=>{if(e+=t.toString(),e.length>Ol){let r={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};s.write(ys(r)),s.destroy(),e="";return}let n;for(;(n=e.indexOf(`
1347
- `))!==-1;){let r=e.slice(0,n);if(e=e.slice(n+1),!!r.trim())try{let o=JSON.parse(r),i=await x0(o);s.write(ys(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};s.write(ys(i))}}}),s.on("error",()=>{})}async function x0(s){if(!ie||!ri)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(ie.restartPending)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon restarting \u2014 retry the command"};ie.activeRequests++;try{let e=vS.then(()=>bS(s),()=>bS(s));return vS=e.then(()=>{},()=>{}),await e}finally{ie.activeRequests--,ie.restartPending&&ie.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>Vr(0)))}}async function bS(s){if(!ie||!ri)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(SS(),ie.commandsServed++,ie.lastActivity=Date.now(),ie.commandsServed%E0===0&&A.checkpointAll(),!ie.restartPending&&pm(ie.entryPath,ie.entryMtime)&&(console.log("Build changed detected \u2014 daemon will restart after this request"),ie.restartPending=!0),!ie.restartPending&&Gs&&ie.commandsServed%C0===0&&hS(Gs)&&(console.log(`Version drift detected \u2014 daemon v${Gs} is stale; shutting down so the next request spawns fresh.`),ie.restartPending=!0),s.command==="daemon")return A0(s);if(s.command==="__ping")return{id:s.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await pS(ri,s);return{id:s.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1346
+ ${e.note}`:null}var xc,pm=h(()=>{"use strict";xc={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};c(Ac,"isRemovedVerb");c(dS,"migrationMessage")});async function pS(s,e){let t=e.args.join(" ")||null,n=e.options,r=n.md===!0;if(Ac(e.command)&&!ct.getByName(e.command))return{success:!1,error:dS(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!ct.getByName(e.command)&&!(e.args.length===0&&si(e.command)!==null)){let o=[e.command,...e.args.filter(i=>!i.startsWith("-"))].join(" ");return s.capture(o,e.cwd,{md:r,tags:n.tags?String(n.tags):void 0,force:n.force===!0})}switch(e.command){case"sync":return s.sync(e.cwd,{preview:n.preview===!0||n["dry-run"]===!0,yes:n.yes===!0,json:n.json===!0,md:r,package:n.package?String(n.package):void 0,full:n.full===!0});case"task":return s.task(t,e.cwd,{md:r,spec:n.spec?String(n.spec):void 0});case"ship":{let o=typeof n.intent=="string"?n.intent:void 0;return s.ship(t,e.cwd,{md:r,intent:o,skipHooks:n["skip-hooks"]===!0,noSpecGate:n["no-spec-gate"]===!0})}case"spec":return v0(s,e.args,n);case"audit-spec":return t?s.specAudit(t,e.cwd,{md:r}):{success:!1,error:"audit-spec requires a spec id"};case"workflow":return s.workflowPrefs(t,e.cwd,{md:r});case"analyze":return s.analyze(n,e.cwd);case"analysis-save-llm":return t?s.saveLlmAnalysis(t,e.cwd,{md:r}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"status":return s.status(t,e.cwd,{md:r});case"tag":return s.tag(t,e.cwd,{md:r});case"remember":return s.remember(t,e.cwd,{md:r,tags:n.tags?String(n.tags):void 0});case"mcp":return s.mcp(t,e.cwd,{md:r});case"team":return s.team(t,e.cwd,{md:r,required:n.required===!0,minVersion:n["min-version"]?String(n["min-version"]):void 0,enforce:n.enforce===!0});case"config":return s.config(t,e.cwd,{md:r});default:return ct.execute(e.command,t,e.cwd)}}async function v0(s,e,t){let n=t.md===!0,r=e[0],o=e.slice(1).join(" ")||null,i=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","inventory"]);if(r&&new Set(["draft","new","create"]).has(r))return s.spec(o,void 0,{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});if(!r||!i.has(r)){let l=e.join(" ")||null;return s.spec(l,void 0,{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0})}switch(r){case"list":return s.specList(void 0,{md:n,status:t.status?String(t.status):void 0});case"show":return s.specShow(o,void 0,{md:n});case"update":return s.specUpdate(o,void 0,{md:n,json:t.json?String(t.json):void 0});case"set-status":return s.specSetStatus(o,void 0,{md:n,status:t.status?String(t.status):void 0});case"record-review":return s.specRecordReview(o,void 0,{md:n,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return s.specLinkTask(o,void 0,{md:n,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return s.specShip(o,void 0,{md:n,pr:t.pr?String(t.pr):void 0});case"audit":return s.specAudit(o,void 0,{md:n});case"breakdown":return s.specBreakdown(o,void 0,{md:n,force:t.force===!0});case"inventory":return s.specInventory(void 0,{md:n,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${r}`}}}var mS=h(()=>{"use strict";dm();Gr();pm();c(pS,"executeCommand");c(v0,"routeSpecDaemon")});import en from"node:fs";import b0 from"node:os";import gn from"node:path";function gS(){let s=__dirname;for(let n=0;n<5;n++){if(en.existsSync(gn.join(s,"package.json"))){let r=gn.join(s,"dist","daemon","entry.mjs");if(en.existsSync(r))return r;break}s=gn.dirname(s)}let e=[gn.join(__dirname,"..","daemon","entry.mjs"),gn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of e)if(en.existsSync(n))return n;let t=process.argv[1];return t&&en.existsSync(t)?t:null}function mm(s,e){if(!s||e===null)return!1;try{return en.statSync(s).mtimeMs!==e}catch{return!1}}function fS(){let s=__dirname;for(let e=0;e<6;e++){let t=gn.join(s,"package.json");try{let r=JSON.parse(en.readFileSync(t,"utf-8"));if(r?.name==="prjct-cli"&&typeof r.version=="string")return r.version}catch{}let n=gn.dirname(s);if(n===s)break;s=n}return null}function hS(s){if(!s)return!1;let e=b0.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let n of t){let r;try{r=en.realpathSync(n)}catch{continue}let o=gn.dirname(r);for(let i=0;i<6;i++){let a=gn.join(o,"package.json");try{let u=JSON.parse(en.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==s}catch{}let l=gn.dirname(o);if(l===o)break;o=l}}return!1}function yS(){let s=Ae.log();try{if(en.statSync(s).size>S0){let t=`${s}.1`;try{en.unlinkSync(t)}catch{}en.renameSync(s,t)}}catch{}}function wS(s){try{return process.kill(s,0),!0}catch{return!1}}var S0,kS=h(()=>{"use strict";rr();c(gS,"resolveEntryPath");c(mm,"isCodeStale");c(fS,"readOwnPackageVersion");c(hS,"isGlobalVersionDrifted");S0=1024*1024;c(yS,"rotateLog");c(wS,"isProcessRunning")});var TS={};D(TS,{startDaemon:()=>R0});import _t from"node:fs";import{createServer as T0}from"node:net";async function R0(s){process.env.PRJCT_IN_DAEMON="1";let e=Ae.socket(),t=Ae.pid(),n=Ae.runDir();if(_t.mkdirSync(n,{recursive:!0}),_t.existsSync(t)){let i=parseInt(_t.readFileSync(t,"utf-8").trim(),10);wS(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),_t.unlinkSync(t)}_t.existsSync(e)&&_t.unlinkSync(e),yS();let r=gS(),o=null;if(r)try{o=_t.statSync(r).mtimeMs}catch{}if(Gs=fS(),ie={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ol,idleTimer:null,entryPath:r,entryMtime:o,activeRequests:0,restartPending:!1},Gs)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(_i(),Ml));i(Gs)||await a(Gs)}catch{}if(ri=new as,Br=T0(i=>P0(i)),Br.listen(e,()=>{_t.chmodSync(e,384),_t.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),r&&console.log(` Watching: ${r}`),SS()}),Br.on("error",i=>{console.error("Daemon socket error:",i.message),Vr(1)}),process.on("SIGTERM",()=>Vr(0)),process.on("SIGINT",()=>Vr(0)),process.on("SIGHUP",()=>{ri=new as,console.log("Daemon reloaded (SIGHUP)")}),!s.foreground)try{process.stdin?.unref?.()}catch{}}function P0(s){let e="";s.on("data",async t=>{if(e+=t.toString(),e.length>Nl){let r={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};s.write(ys(r)),s.destroy(),e="";return}let n;for(;(n=e.indexOf(`
1347
+ `))!==-1;){let r=e.slice(0,n);if(e=e.slice(n+1),!!r.trim())try{let o=JSON.parse(r),i=await x0(o);s.write(ys(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};s.write(ys(i))}}}),s.on("error",()=>{})}async function x0(s){if(!ie||!ri)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(ie.restartPending)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon restarting \u2014 retry the command"};ie.activeRequests++;try{let e=vS.then(()=>bS(s),()=>bS(s));return vS=e.then(()=>{},()=>{}),await e}finally{ie.activeRequests--,ie.restartPending&&ie.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>Vr(0)))}}async function bS(s){if(!ie||!ri)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(SS(),ie.commandsServed++,ie.lastActivity=Date.now(),ie.commandsServed%E0===0&&A.checkpointAll(),!ie.restartPending&&mm(ie.entryPath,ie.entryMtime)&&(console.log("Build changed detected \u2014 daemon will restart after this request"),ie.restartPending=!0),!ie.restartPending&&Gs&&ie.commandsServed%C0===0&&hS(Gs)&&(console.log(`Version drift detected \u2014 daemon v${Gs} is stale; shutting down so the next request spawns fresh.`),ie.restartPending=!0),s.command==="daemon")return A0(s);if(s.command==="__ping")return{id:s.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await pS(ri,s);return{id:s.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1348
1348
  `)||o.message||void 0,stderr:t.join(`
1349
- `)||o.error||void 0,result:o}}finally{console.log=n,console.error=r}}catch(e){return{id:s.id,success:!1,exitCode:1,stderr:e.message}}}function A0(s){let e=s.args[0];if(e==="status")return{id:s.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ae.socket(),uptime:ie?Date.now()-ie.startedAt:0,commandsServed:ie?.commandsServed??0,lastActivity:ie?new Date(ie.lastActivity).toISOString():null,registeredCommands:ct.list().length,stale:ie?pm(ie.entryPath,ie.entryMtime):!1}};if(e==="stop"){let t={id:s.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Vr(0),100),t}return{id:s.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function SS(){ie&&(ie.idleTimer&&clearTimeout(ie.idleTimer),ie.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${ie.idleTimeoutMs/1e3/60} minutes, shutting down`),Vr(0)},ie.idleTimeoutMs),ie.idleTimer.unref&&ie.idleTimer.unref())}function Vr(s){console.log("Daemon shutting down..."),ie?.idleTimer&&clearTimeout(ie.idleTimer),Br&&(Br.close(),Br=null),A.close();let e=Ae.socket(),t=Ae.pid();try{_t.existsSync(e)&&_t.unlinkSync(e)}catch{}try{_t.existsSync(t)&&_t.unlinkSync(t)}catch{}process.exit(s)}var E0,C0,Br,ri,ie,Gs,vS,ES=h(()=>{"use strict";rm();Gr();lm();Y();mS();rr();kS();E0=50,C0=10,Br=null,ri=null,ie=null,Gs=null,vS=Promise.resolve();c(R0,"startDaemon");c(P0,"handleConnection");c(x0,"handleRequest");c(bS,"handleRequestInner");c(A0,"handleDaemonCommand");c(SS,"resetIdleTimer");c(Vr,"shutdown")});var RS={};D(RS,{runStart:()=>H0});import fn from"node:fs/promises";import j0 from"node:os";import hn from"node:path";import K from"chalk";function _0(){console.clear(),console.log($0),console.log(I0)}function CS(s,e){console.log(`
1349
+ `)||o.error||void 0,result:o}}finally{console.log=n,console.error=r}}catch(e){return{id:s.id,success:!1,exitCode:1,stderr:e.message}}}function A0(s){let e=s.args[0];if(e==="status")return{id:s.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ae.socket(),uptime:ie?Date.now()-ie.startedAt:0,commandsServed:ie?.commandsServed??0,lastActivity:ie?new Date(ie.lastActivity).toISOString():null,registeredCommands:ct.list().length,stale:ie?mm(ie.entryPath,ie.entryMtime):!1}};if(e==="stop"){let t={id:s.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Vr(0),100),t}return{id:s.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function SS(){ie&&(ie.idleTimer&&clearTimeout(ie.idleTimer),ie.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${ie.idleTimeoutMs/1e3/60} minutes, shutting down`),Vr(0)},ie.idleTimeoutMs),ie.idleTimer.unref&&ie.idleTimer.unref())}function Vr(s){console.log("Daemon shutting down..."),ie?.idleTimer&&clearTimeout(ie.idleTimer),Br&&(Br.close(),Br=null),A.close();let e=Ae.socket(),t=Ae.pid();try{_t.existsSync(e)&&_t.unlinkSync(e)}catch{}try{_t.existsSync(t)&&_t.unlinkSync(t)}catch{}process.exit(s)}var E0,C0,Br,ri,ie,Gs,vS,ES=h(()=>{"use strict";om();Gr();um();Y();mS();rr();kS();E0=50,C0=10,Br=null,ri=null,ie=null,Gs=null,vS=Promise.resolve();c(R0,"startDaemon");c(P0,"handleConnection");c(x0,"handleRequest");c(bS,"handleRequestInner");c(A0,"handleDaemonCommand");c(SS,"resetIdleTimer");c(Vr,"shutdown")});var RS={};D(RS,{runStart:()=>H0});import fn from"node:fs/promises";import j0 from"node:os";import hn from"node:path";import K from"chalk";function _0(){console.clear(),console.log($0),console.log(I0)}function CS(s,e){console.log(`
1350
1350
  ${K.bold(" Select AI providers to configure:")}
1351
1351
  `),console.log(` ${K.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
1352
1352
  `),s.forEach((t,n)=>{let r=n===e?K.cyan("\u276F"):" ",o=t.selected?K.green("[\u2713]"):K.dim("[ ]"),i=t.installed?K.green("(installed)"):K.yellow("(will install)"),a=n===e?K.bold(t.displayName):t.displayName;console.log(` ${r} ${o} ${a} ${i}`)}),console.log("")}async function D0(){let s=await Tn(),e=[{name:"claude",displayName:"Claude Code",installed:s.claude.installed,selected:s.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:s.gemini.installed,selected:s.gemini.installed},{name:"codex",displayName:"OpenAI Codex",installed:s.codex.installed,selected:s.codex.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let n=0,r=c(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),CS(e,n)},"render");CS(e,n),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=c(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=c(a=>{if(a===""&&(o(),console.log(`
@@ -1354,7 +1354,7 @@ ${K.bold(" Select AI providers to configure:")}
1354
1354
  `),process.exit(0)),a==="\r"||a===`
1355
1355
  `){o();let l=e.filter(u=>u.selected).map(u=>u.name);t(l.length>0?l:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),r()),a==="\x1B[B"&&(n=Math.min(e.length-1,n+1),r()),a===" "&&(e[n].selected=!e[n].selected,r())},"handleKey");process.stdin.on("data",i)}):(console.log(`
1356
1356
  ${K.bold(" Detected providers:")}
1357
- `),e.forEach(t=>{t.installed&&console.log(` ${K.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function M0(s){let e=ut[s];if(!e.configDir)return!1;try{let t=hn.join(e.configDir,"commands");await fn.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(We(),ms)),r=n(),o=s==="claude"?"p.md":"p.toml",i=hn.join(r,"templates","commands",o),a=hn.join(t,o);return await C(i)?(await fn.copyFile(i,a),!0):!1}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${s} router: ${b(t)}`),!1}}async function O0(s){let e=ut[s];if(!e.configDir)return!1;try{let t=s==="gemini"?hn.join(e.configDir,"commands"):hn.join(e.configDir,"commands","p");await fn.mkdir(t,{recursive:!0});let n=new Set(["p.md","p.toml"]),o=tr("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!n.has(i));for(let i of o){let a=Je(`commands/${i}`);a&&await fn.writeFile(hn.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${s} subcommands: ${b(t)}`),!1}}async function N0(s){let e=ut[s];if(!e.configDir)return!1;if(s==="claude")try{let{installGlobalConfig:t}=await Promise.resolve().then(()=>(Wt(),Sl));return(await t()).success}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install claude config: ${b(t)}`),!1}try{await fn.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(We(),ms)),n=t(),r="GEMINI.md",o=hn.join(n,"templates","global",r),i=hn.join(e.configDir,r);if(await C(o)){let a=await fn.readFile(o,"utf-8");if(await C(i)){let l=await fn.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(l.includes(u)&&l.includes(d)){let p=l.substring(0,l.indexOf(u)),m=l.substring(l.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await fn.writeFile(i,p+g+m)}else await fn.writeFile(i,`${l}
1357
+ `),e.forEach(t=>{t.installed&&console.log(` ${K.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function M0(s){let e=ut[s];if(!e.configDir)return!1;try{let t=hn.join(e.configDir,"commands");await fn.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(We(),ms)),r=n(),o=s==="claude"?"p.md":"p.toml",i=hn.join(r,"templates","commands",o),a=hn.join(t,o);return await C(i)?(await fn.copyFile(i,a),!0):!1}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${s} router: ${b(t)}`),!1}}async function O0(s){let e=ut[s];if(!e.configDir)return!1;try{let t=s==="gemini"?hn.join(e.configDir,"commands"):hn.join(e.configDir,"commands","p");await fn.mkdir(t,{recursive:!0});let n=new Set(["p.md","p.toml"]),o=tr("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!n.has(i));for(let i of o){let a=Je(`commands/${i}`);a&&await fn.writeFile(hn.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${s} subcommands: ${b(t)}`),!1}}async function N0(s){let e=ut[s];if(!e.configDir)return!1;if(s==="claude")try{let{installGlobalConfig:t}=await Promise.resolve().then(()=>(Wt(),Tl));return(await t()).success}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install claude config: ${b(t)}`),!1}try{await fn.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(We(),ms)),n=t(),r="GEMINI.md",o=hn.join(n,"templates","global",r),i=hn.join(e.configDir,r);if(await C(o)){let a=await fn.readFile(o,"utf-8");if(await C(i)){let l=await fn.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(l.includes(u)&&l.includes(d)){let p=l.substring(0,l.indexOf(u)),m=l.substring(l.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await fn.writeFile(i,p+g+m)}else await fn.writeFile(i,`${l}
1358
1358
 
1359
1359
  ${a}`)}else await fn.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${s} config: ${b(t)}`),!1}}async function L0(s){let e=hn.join(_.globalConfigDir,"installed-editors.json"),t={version:le,providers:s,editor:s[0],provider:s[0],lastInstall:new Date().toISOString(),path:hn.join(j0.homedir(),`.${s[0]}`,"commands")};await ke(e,t)}function F0(s){console.log(`
1360
1360
  ${K.green.bold(" \u2713 Setup complete!")}
@@ -1387,7 +1387,7 @@ ${qr(" \u255A\u2550\u255D ")}${Jr(" \u255A\u2550\u255D \u255A\u2550\u255D")
1387
1387
  ${K.dim(`Project context layer for AI coding agents.
1388
1388
  Works with Claude Code, Gemini CLI, Codex, and more.`)}
1389
1389
  ${K.cyan("https://prjct.app")}
1390
- `;c(_0,"showBanner");c(CS,"showProviderSelection");c(D0,"selectProviders");c(M0,"installRouter");c(O0,"installSubcommands");c(N0,"installGlobalConfig");c(L0,"saveSetupConfig");c(F0,"showCompletion");c(H0,"runStart")});var AS={};D(AS,{runContextTool:()=>U0});async function U0(s,e,t){let[n,...r]=s;try{switch(n){case"memory":return await xS(r,t,{kind:"memory"});case"learnings":return await xS(r,t,{kind:"learnings"});case"wiki":return await W0(t,r);case"help":return{tool:"error",result:{error:B0(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}}catch(o){return{tool:"error",result:{error:b(o),code:"EXECUTION_ERROR"}}}}async function W0(s,e=[]){let t=await I.getProjectId(s);if(!t)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};if(e[0]==="sync")return G0(s,t,e.slice(1));let{generateWiki:r}=await Promise.resolve().then(()=>(Mn(),_s)),{wikiRoot:o,filesWritten:i}=await r(s,t);return{tool:"wiki",result:{markdown:`> Wiki rebuilt at \`${o}\` \u2014 ${i} files. Read \`${o}/_generated/index.md\` with the Read tool.`,entryCount:i}}}async function G0(s,e,t){let n=t.includes("--force"),{ingestCapturedNotes:r}=await Promise.resolve().then(()=>(sc(),uv)),{regenerateWikiDeferred:o}=await Promise.resolve().then(()=>(Mn(),_s)),i=await r(s,{force:n});i.ingested>0&&await o(s,e);let a=[];if(a.push(`> Ingested ${i.ingested} note(s) from \`.prjct/wiki/captured/\`.`),i.skipped.length>0){a.push("","**Skipped:**");for(let l of i.skipped)a.push(`- \`${l.file}\` \u2014 ${l.reason}`)}if(i.errors.length>0){a.push("","**Errors:**");for(let l of i.errors)a.push(`- \`${l.file}\` \u2014 ${l.error}`)}return i.ingested===0&&i.skipped.length===0&&i.errors.length===0&&a.push("","Nothing to ingest. Drop markdown notes with frontmatter into `.prjct/wiki/captured/` and re-run."),{tool:"wiki",result:{markdown:a.join(`
1390
+ `;c(_0,"showBanner");c(CS,"showProviderSelection");c(D0,"selectProviders");c(M0,"installRouter");c(O0,"installSubcommands");c(N0,"installGlobalConfig");c(L0,"saveSetupConfig");c(F0,"showCompletion");c(H0,"runStart")});var AS={};D(AS,{runContextTool:()=>U0});async function U0(s,e,t){let[n,...r]=s;try{switch(n){case"memory":return await xS(r,t,{kind:"memory"});case"learnings":return await xS(r,t,{kind:"learnings"});case"wiki":return await W0(t,r);case"help":return{tool:"error",result:{error:B0(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}}catch(o){return{tool:"error",result:{error:b(o),code:"EXECUTION_ERROR"}}}}async function W0(s,e=[]){let t=await I.getProjectId(s);if(!t)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};if(e[0]==="sync")return G0(s,t,e.slice(1));let{generateWiki:r}=await Promise.resolve().then(()=>(Mn(),_s)),{wikiRoot:o,filesWritten:i}=await r(s,t);return{tool:"wiki",result:{markdown:`> Wiki rebuilt at \`${o}\` \u2014 ${i} files. Read \`${o}/_generated/index.md\` with the Read tool.`,entryCount:i}}}async function G0(s,e,t){let n=t.includes("--force"),{ingestCapturedNotes:r}=await Promise.resolve().then(()=>(rc(),uv)),{regenerateWikiDeferred:o}=await Promise.resolve().then(()=>(Mn(),_s)),i=await r(s,{force:n});i.ingested>0&&await o(s,e);let a=[];if(a.push(`> Ingested ${i.ingested} note(s) from \`.prjct/wiki/captured/\`.`),i.skipped.length>0){a.push("","**Skipped:**");for(let l of i.skipped)a.push(`- \`${l.file}\` \u2014 ${l.reason}`)}if(i.errors.length>0){a.push("","**Errors:**");for(let l of i.errors)a.push(`- \`${l.file}\` \u2014 ${l.error}`)}return i.ingested===0&&i.skipped.length===0&&i.errors.length===0&&a.push("","Nothing to ingest. Drop markdown notes with frontmatter into `.prjct/wiki/captured/` and re-run."),{tool:"wiki",result:{markdown:a.join(`
1391
1391
  `),entryCount:i.ingested}}}async function xS(s,e,t){let n=await I.getProjectId(e);if(!n)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};let r=s.filter(u=>!u.startsWith("-")).join(" ").trim()||void 0,o=(()=>{let u=s.find(d=>d.startsWith("--id"));if(u){let d=u.includes("=")?u.split("=")[1]:s[s.indexOf(u)+1];if(d)return d}return r&&/^mem[_-]?\d+$/i.test(r)?r:void 0})();if(o){let u=J.getById(n,o);return{tool:t.kind,result:{markdown:u?xt([u]):`> No memory entry with id \`${o}\` (it may have aged out or never existed).`,entryCount:u?1:0,topic:o}}}let i=["learning","anti-pattern","gotcha"],a=t.kind==="learnings"?i:void 0,l=J.recall(n,{topic:r,types:a,limit:30});return{tool:t.kind,result:{markdown:xt(l),entryCount:l.length,topic:r}}}function B0(){return`
1392
1392
  prjct context \u2014 memory-bound context subtools
1393
1393
 
@@ -1413,7 +1413,7 @@ NOTE: File-oriented subtools (files, signatures, imports, recent,
1413
1413
  summary) were removed in alpha.12 \u2014 Claude has Glob/Grep/Read/git
1414
1414
  natively and re-implementing them in prjct was harness. The
1415
1415
  underlying functions still exist for the orchestrator + MCP surface.
1416
- `.trim()}var jS=h(()=>{"use strict";re();$e();F();c(U0,"runContextTool");c(W0,"runWikiTool");c(G0,"runWikiSyncTool");c(xS,"runMemoryTool");c(B0,"getHelpText")});function mm(){return`#!/bin/sh
1416
+ `.trim()}var jS=h(()=>{"use strict";re();$e();F();c(U0,"runContextTool");c(W0,"runWikiTool");c(G0,"runWikiSyncTool");c(xS,"runMemoryTool");c(B0,"getHelpText")});function gm(){return`#!/bin/sh
1417
1417
  # prjct auto-sync hook (post-commit)
1418
1418
  # Syncs project context after each commit
1419
1419
  # Installed by: prjct hooks install
@@ -1434,7 +1434,7 @@ if command -v prjct >/dev/null 2>&1; then
1434
1434
  fi
1435
1435
 
1436
1436
  exit 0
1437
- `}function gm(){return`#!/bin/sh
1437
+ `}function fm(){return`#!/bin/sh
1438
1438
  # prjct auto-sync hook (post-checkout)
1439
1439
  # Syncs project context after branch switch
1440
1440
  # Installed by: prjct hooks install
@@ -1466,7 +1466,7 @@ if command -v prjct >/dev/null 2>&1; then
1466
1466
  fi
1467
1467
 
1468
1468
  exit 0
1469
- `}var $S=h(()=>{"use strict";c(mm,"getPostCommitScript");c(gm,"getPostCheckoutScript")});import tt from"node:fs/promises";import et from"node:path";async function Ac(s){let e=[];return(await C(et.join(s,"lefthook.yml"))||await C(et.join(s,"lefthook.yaml")))&&e.push("lefthook"),(await C(et.join(s,".husky"))||await C(et.join(s,".husky","_")))&&e.push("husky"),await C(et.join(s,".git"))&&e.push("direct"),e}function fm(s){return s.includes("lefthook")?"lefthook":s.includes("husky")?"husky":"direct"}async function IS(s,e){let t=await C(et.join(s,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=et.join(s,t),r=await tt.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(r.includes(a))continue;let l=`
1469
+ `}var $S=h(()=>{"use strict";c(gm,"getPostCommitScript");c(fm,"getPostCheckoutScript")});import tt from"node:fs/promises";import et from"node:path";async function jc(s){let e=[];return(await C(et.join(s,"lefthook.yml"))||await C(et.join(s,"lefthook.yaml")))&&e.push("lefthook"),(await C(et.join(s,".husky"))||await C(et.join(s,".husky","_")))&&e.push("husky"),await C(et.join(s,".git"))&&e.push("direct"),e}function hm(s){return s.includes("lefthook")?"lefthook":s.includes("husky")?"husky":"direct"}async function IS(s,e){let t=await C(et.join(s,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=et.join(s,t),r=await tt.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(r.includes(a))continue;let l=`
1470
1470
  ${i}:
1471
1471
  commands:
1472
1472
  ${a}:
@@ -1477,10 +1477,10 @@ ${i}:
1477
1477
  ${a}:
1478
1478
  run: prjct sync --quiet --yes
1479
1479
  fail_text: "prjct sync failed (non-blocking)"`):r=`${r.trimEnd()}
1480
- ${l}`}return await tt.writeFile(n,r,"utf-8"),!0}async function _S(s,e){let t=et.join(s,".husky");for(let n of e){let r=et.join(t,n),o=n==="post-commit"?mm():gm();if(await C(r)){if((await tt.readFile(r,"utf-8")).includes("prjct sync"))continue;await tt.appendFile(r,`
1480
+ ${l}`}return await tt.writeFile(n,r,"utf-8"),!0}async function _S(s,e){let t=et.join(s,".husky");for(let n of e){let r=et.join(t,n),o=n==="post-commit"?gm():fm();if(await C(r)){if((await tt.readFile(r,"utf-8")).includes("prjct sync"))continue;await tt.appendFile(r,`
1481
1481
  # prjct auto-sync
1482
1482
  prjct sync --quiet --yes &
1483
- `)}else await tt.writeFile(r,o,{mode:493})}return!0}async function DS(s,e){let t=et.join(s,".git","hooks");await C(t)||await tt.mkdir(t,{recursive:!0});for(let n of e){let r=et.join(t,n),o=n==="post-commit"?mm():gm();if(await C(r)){if((await tt.readFile(r,"utf-8")).includes("prjct sync"))continue;await tt.appendFile(r,`
1483
+ `)}else await tt.writeFile(r,o,{mode:493})}return!0}async function DS(s,e){let t=et.join(s,".git","hooks");await C(t)||await tt.mkdir(t,{recursive:!0});for(let n of e){let r=et.join(t,n),o=n==="post-commit"?gm():fm();if(await C(r)){if((await tt.readFile(r,"utf-8")).includes("prjct sync"))continue;await tt.appendFile(r,`
1484
1484
  # prjct auto-sync
1485
1485
  ${o.split(`
1486
1486
  `).slice(1).join(`
@@ -1489,11 +1489,11 @@ ${o.split(`
1489
1489
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1490
1490
  `);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await tt.unlink(n):await tt.writeFile(n,o,{mode:493})}return!0}async function NS(s){let e=et.join(s,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=et.join(e,t);if(!await C(n))continue;let r=await tt.readFile(n,"utf-8");if(r.includes("prjct sync"))if(r.includes("Installed by: prjct hooks install"))await tt.unlink(n);else{let o=r.split(`
1491
1491
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1492
- `);await tt.writeFile(n,o,{mode:493})}}return!0}var LS=h(()=>{"use strict";V();$S();c(Ac,"detectHookManagers");c(fm,"selectStrategy");c(IS,"installLefthook");c(_S,"installHusky");c(DS,"installDirect");c(MS,"uninstallLefthook");c(OS,"uninstallHusky");c(NS,"uninstallDirect")});var FS={};D(FS,{hooksService:()=>V0});import hm from"node:fs/promises";import oi from"node:path";import Dt from"chalk";var ym,V0,HS=h(()=>{"use strict";re();Y();F();V();pe();LS();ym=class{static{c(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],r=await Ac(e);if(r.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||fm(r);try{let i=!1;switch(o){case"lefthook":i=await IS(e,n);break;case"husky":i=await _S(e,n);break;case"direct":i=await DS(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:b(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",r=!1;switch(n){case"lefthook":r=await MS(e);break;case"husky":r=await OS(e);break;case"direct":r=await NS(e);break}return r&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:r}}catch(t){return{success:!1,error:b(t)}}}async status(e){let t=await Ac(e),n=await this.getHookConfig(e),r=["post-commit","post-checkout"],o=await Promise.all(r.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await I.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){f.start(),f.section("Git Hooks Installation");let t=await Ac(e),n=fm(t);console.log(` Strategy: ${Dt.cyan(n)}`),console.log(` Hooks: ${Dt.dim("post-commit, post-checkout")}`),console.log("");let r=await this.install(e,{strategy:n});if(r.success){f.done(`Hooks installed via ${r.strategy}`),console.log("");for(let o of r.hooksInstalled)console.log(` ${Dt.green("\u2713")} ${o}`);console.log(""),console.log(Dt.dim(" Context will auto-sync on commit and branch switch.")),console.log(Dt.dim(" Remove with: prjct hooks uninstall"))}else f.fail(r.error||"Failed to install hooks");return console.log(""),f.end(),r.success?0:1}async runUninstall(e){f.start(),f.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?f.done("Hooks removed"):f.fail(t.error||"Failed to remove hooks"),console.log(""),f.end(),t.success?0:1}async runStatus(e){f.start(),f.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${Dt.green("Active")}`),console.log(` Strategy: ${Dt.cyan(t.strategy)}`)):console.log(` Status: ${Dt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let r=n.installed?Dt.green("\u2713"):Dt.dim("\u25CB"),o=n.installed?n.name:Dt.dim(n.name);console.log(` ${r} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${Dt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(Dt.dim(" Install with: prjct hooks install"))),console.log(""),f.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await C(oi.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=oi.join(e,o);return await C(i)?(await hm.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=oi.join(e,".husky",t);return await C(o)?(await hm.readFile(o,"utf-8")).includes("prjct sync"):!1}let r=oi.join(e,".git","hooks",t);return await C(r)?(await hm.readFile(r,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await C(oi.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await I.getProjectId(e);if(!t)return null;try{let n=j.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await I.getProjectId(e);if(n)try{let r=j.getDoc(n,"project")||{};r.hooks=t,j.setDoc(n,"project",r)}catch{}}},V0=new ym});var km={};D(km,{ContextCheckpointCommands:()=>wm});import ii from"node:fs/promises";import Bs from"node:path";function US(s){return Bs.join(_.getGlobalProjectPath(s),"checkpoints")}function J0(s,e){let t=s.replace(/[:.]/g,"-").slice(0,19),n=X0(e);return`${t}--${n}.json`}function X0(s){return s.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,q0)||"untitled"}async function z0(s){let e=c(async(a,l)=>{try{return await a()}catch{return l}},"safe"),t=(await e(async()=>(await Le("git",["branch","--show-current"],{cwd:s})).stdout,"")).trim(),n=(await e(async()=>(await Le("git",["rev-parse","HEAD"],{cwd:s})).stdout,"")).trim(),r=(await e(async()=>(await Le("git",["status","--short"],{cwd:s})).stdout,"")).split(`
1492
+ `);await tt.writeFile(n,o,{mode:493})}}return!0}var LS=h(()=>{"use strict";V();$S();c(jc,"detectHookManagers");c(hm,"selectStrategy");c(IS,"installLefthook");c(_S,"installHusky");c(DS,"installDirect");c(MS,"uninstallLefthook");c(OS,"uninstallHusky");c(NS,"uninstallDirect")});var FS={};D(FS,{hooksService:()=>V0});import ym from"node:fs/promises";import oi from"node:path";import Dt from"chalk";var wm,V0,HS=h(()=>{"use strict";re();Y();F();V();pe();LS();wm=class{static{c(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],r=await jc(e);if(r.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||hm(r);try{let i=!1;switch(o){case"lefthook":i=await IS(e,n);break;case"husky":i=await _S(e,n);break;case"direct":i=await DS(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:b(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",r=!1;switch(n){case"lefthook":r=await MS(e);break;case"husky":r=await OS(e);break;case"direct":r=await NS(e);break}return r&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:r}}catch(t){return{success:!1,error:b(t)}}}async status(e){let t=await jc(e),n=await this.getHookConfig(e),r=["post-commit","post-checkout"],o=await Promise.all(r.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await I.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){f.start(),f.section("Git Hooks Installation");let t=await jc(e),n=hm(t);console.log(` Strategy: ${Dt.cyan(n)}`),console.log(` Hooks: ${Dt.dim("post-commit, post-checkout")}`),console.log("");let r=await this.install(e,{strategy:n});if(r.success){f.done(`Hooks installed via ${r.strategy}`),console.log("");for(let o of r.hooksInstalled)console.log(` ${Dt.green("\u2713")} ${o}`);console.log(""),console.log(Dt.dim(" Context will auto-sync on commit and branch switch.")),console.log(Dt.dim(" Remove with: prjct hooks uninstall"))}else f.fail(r.error||"Failed to install hooks");return console.log(""),f.end(),r.success?0:1}async runUninstall(e){f.start(),f.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?f.done("Hooks removed"):f.fail(t.error||"Failed to remove hooks"),console.log(""),f.end(),t.success?0:1}async runStatus(e){f.start(),f.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${Dt.green("Active")}`),console.log(` Strategy: ${Dt.cyan(t.strategy)}`)):console.log(` Status: ${Dt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let r=n.installed?Dt.green("\u2713"):Dt.dim("\u25CB"),o=n.installed?n.name:Dt.dim(n.name);console.log(` ${r} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${Dt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(Dt.dim(" Install with: prjct hooks install"))),console.log(""),f.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await C(oi.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=oi.join(e,o);return await C(i)?(await ym.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=oi.join(e,".husky",t);return await C(o)?(await ym.readFile(o,"utf-8")).includes("prjct sync"):!1}let r=oi.join(e,".git","hooks",t);return await C(r)?(await ym.readFile(r,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await C(oi.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await I.getProjectId(e);if(!t)return null;try{let n=j.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await I.getProjectId(e);if(n)try{let r=j.getDoc(n,"project")||{};r.hooks=t,j.setDoc(n,"project",r)}catch{}}},V0=new wm});var vm={};D(vm,{ContextCheckpointCommands:()=>km});import ii from"node:fs/promises";import Bs from"node:path";function US(s){return Bs.join(_.getGlobalProjectPath(s),"checkpoints")}function J0(s,e){let t=s.replace(/[:.]/g,"-").slice(0,19),n=X0(e);return`${t}--${n}.json`}function X0(s){return s.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,q0)||"untitled"}async function z0(s){let e=c(async(a,l)=>{try{return await a()}catch{return l}},"safe"),t=(await e(async()=>(await Le("git",["branch","--show-current"],{cwd:s})).stdout,"")).trim(),n=(await e(async()=>(await Le("git",["rev-parse","HEAD"],{cwd:s})).stdout,"")).trim(),r=(await e(async()=>(await Le("git",["status","--short"],{cwd:s})).stdout,"")).split(`
1493
1493
  `).map(a=>a.trim()).filter(Boolean),o=(await e(async()=>(await Le("git",["diff","--stat"],{cwd:s})).stdout,"")).trim(),i=(await e(async()=>(await U("git log --oneline -10",{cwd:s})).stdout,"")).split(`
1494
1494
  `).map(a=>a.trim()).filter(Boolean);return{branch:t||"unknown",head:n||null,statusShort:r,diffStat:o,recentLog:i}}function K0(s,e){let t=[];if(t.push(`Restoring: ${e}`),t.push(`Title: ${s.title}`),t.push(`Branch: ${s.git.branch}`),t.push(`Saved at: ${s.createdAt}`),s.notes&&(t.push(""),t.push("Notes:"),t.push(s.notes)),s.git.statusShort.length>0){t.push(""),t.push("Working tree at save time:");for(let n of s.git.statusShort.slice(0,20))t.push(` ${n}`)}if(s.git.recentLog.length>0){t.push(""),t.push("Recent commits:");for(let n of s.git.recentLog)t.push(` ${n}`)}return t.join(`
1495
1495
  `)}function Y0(s,e){let t=[];if(t.push(`## context-restore \u2014 \`${e}\``),t.push(""),t.push(`- **Title**: ${s.title}`),t.push(`- **Branch**: ${s.git.branch}`),t.push(`- **Saved at**: ${s.createdAt}`),t.push(""),s.notes&&(t.push("### Notes"),t.push(""),t.push(s.notes),t.push("")),s.git.statusShort.length>0){t.push("### Working tree at save time"),t.push(""),t.push("```");for(let n of s.git.statusShort.slice(0,20))t.push(n);t.push("```"),t.push("")}if(s.git.recentLog.length>0){t.push("### Recent commits"),t.push("");for(let n of s.git.recentLog)t.push(`- ${n}`)}return t.join(`
1496
- `)}var q0,wm,vm=h(()=>{"use strict";ge();F();Fe();Te();pe();Ie();Zt();q0=50,wm=class extends X{static{c(this,"ContextCheckpointCommands")}async save(e,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=(e??"untitled").trim().slice(0,200)||"untitled",i=await z0(t),a={version:1,title:o,createdAt:new Date().toISOString(),git:i,notes:(n.notes??"").trim()},l=US(r.value);await ii.mkdir(l,{recursive:!0});let u=J0(a.createdAt,o),d=Bs.join(l,u);return await ii.writeFile(d,JSON.stringify(a,null,2),"utf-8"),n.md?console.log(`## context-save
1496
+ `)}var q0,km,bm=h(()=>{"use strict";ge();F();Fe();Te();pe();Ie();Zt();q0=50,km=class extends X{static{c(this,"ContextCheckpointCommands")}async save(e,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=(e??"untitled").trim().slice(0,200)||"untitled",i=await z0(t),a={version:1,title:o,createdAt:new Date().toISOString(),git:i,notes:(n.notes??"").trim()},l=US(r.value);await ii.mkdir(l,{recursive:!0});let u=J0(a.createdAt,o),d=Bs.join(l,u);return await ii.writeFile(d,JSON.stringify(a,null,2),"utf-8"),n.md?console.log(`## context-save
1497
1497
 
1498
1498
  - **Title**: ${o}
1499
1499
  - **Branch**: ${i.branch}
@@ -1509,29 +1509,29 @@ _No checkpoints saved yet._
1509
1509
  `);console.log(`## context-restore \u2014 checkpoints
1510
1510
 
1511
1511
  ${m}
1512
- `)}else for(let m of a.slice(0,25))console.log(m);return{success:!0,files:a.length}}let l=n.file??e??a[0],u=Bs.join(o,Bs.basename(l)),d=await ii.readFile(u,"utf-8").catch(()=>null);if(!d)return f.fail(`Checkpoint not found: ${l}`),{success:!1,error:"Checkpoint not found"};let p=JSON.parse(d);return n.md?console.log(Y0(p,Bs.basename(l))):console.log(K0(p,Bs.basename(l))),{success:!0,checkpoint:p,file:Bs.basename(l)}}catch(r){let o=b(r);return N(o)}}};c(US,"checkpointDir");c(J0,"makeFilename");c(X0,"slugify");c(z0,"captureGitSnapshot");c(K0,"formatRestoreText");c(Y0,"formatRestoreMarkdown")});var GS={};D(GS,{HealthCommands:()=>bm});import WS from"node:path";async function Z0(s){let e=WS.join(s,"package.json");if(!await C(e))return[];let n=(await xe(e,null))?.scripts??{};return Q0.filter(r=>!!n[r.scriptName]).map(r=>({...r,command:n[r.scriptName]??null}))}async function eI(s,e){if(!e.command)return{dimension:e,status:"skipped",durationMs:0};let t=Date.now(),n=WS.join(s,"node_modules",".bin"),r={...process.env,PATH:`${n}:${process.env.PATH??""}`};try{return await U(e.command,{cwd:s,timeout:5*60*1e3,maxBuffer:16*1024*1024,env:r}),{dimension:e,status:"pass",durationMs:Date.now()-t}}catch(o){let i=o.stderr??"",a=o.stdout??"",l=`${i}
1512
+ `)}else for(let m of a.slice(0,25))console.log(m);return{success:!0,files:a.length}}let l=n.file??e??a[0],u=Bs.join(o,Bs.basename(l)),d=await ii.readFile(u,"utf-8").catch(()=>null);if(!d)return f.fail(`Checkpoint not found: ${l}`),{success:!1,error:"Checkpoint not found"};let p=JSON.parse(d);return n.md?console.log(Y0(p,Bs.basename(l))):console.log(K0(p,Bs.basename(l))),{success:!0,checkpoint:p,file:Bs.basename(l)}}catch(r){let o=b(r);return N(o)}}};c(US,"checkpointDir");c(J0,"makeFilename");c(X0,"slugify");c(z0,"captureGitSnapshot");c(K0,"formatRestoreText");c(Y0,"formatRestoreMarkdown")});var GS={};D(GS,{HealthCommands:()=>Sm});import WS from"node:path";async function Z0(s){let e=WS.join(s,"package.json");if(!await C(e))return[];let n=(await xe(e,null))?.scripts??{};return Q0.filter(r=>!!n[r.scriptName]).map(r=>({...r,command:n[r.scriptName]??null}))}async function eI(s,e){if(!e.command)return{dimension:e,status:"skipped",durationMs:0};let t=Date.now(),n=WS.join(s,"node_modules",".bin"),r={...process.env,PATH:`${n}:${process.env.PATH??""}`};try{return await U(e.command,{cwd:s,timeout:5*60*1e3,maxBuffer:16*1024*1024,env:r}),{dimension:e,status:"pass",durationMs:Date.now()-t}}catch(o){let i=o.stderr??"",a=o.stdout??"",l=`${i}
1513
1513
  ${a}`.split(`
1514
1514
  `).map(u=>u.trim()).find(u=>u.length>0);return{dimension:e,status:"fail",durationMs:Date.now()-t,diagnostic:l??b(o)}}}function tI(s){if(s.length===0)return 0;let e=0,t=0;for(let n of s)n.status!=="skipped"&&(t+=n.dimension.weight,n.status==="pass"&&(e+=n.dimension.weight));return t===0?0:Math.round(e/t*100)}function nI(s){return s==="pass"?"\u2713":s==="fail"?"\u2717":"\xB7"}function sI(s,e){if(e.length===0)return"health: no quality dimensions detected (add typecheck/lint/test/knip scripts to package.json)";let t=[];t.push(`health: ${s}/100`);for(let n of e){let r=n.durationMs>1e3?`${(n.durationMs/1e3).toFixed(1)}s`:`${n.durationMs}ms`,o=n.status==="fail"&&n.diagnostic?` \u2014 ${n.diagnostic.slice(0,80)}`:"";t.push(` ${nI(n.status)} ${n.dimension.name.padEnd(10)} ${r}${o}`)}return t.join(`
1515
1515
  `)}function rI(s,e){if(e.length===0)return"## Health\n\n_No quality dimensions detected. Add `typecheck`, `lint`, `test`, or `knip` scripts to `package.json`._\n";let t=[];t.push(`## Health \u2014 ${s}/100`),t.push(""),t.push("| Dimension | Status | Duration | Notes |"),t.push("|---|---|---|---|");for(let n of e){let r=n.durationMs>1e3?`${(n.durationMs/1e3).toFixed(1)}s`:`${n.durationMs}ms`,o=n.status==="fail"&&n.diagnostic?n.diagnostic.slice(0,100).replaceAll("|","\\|"):"";t.push(`| ${n.dimension.name} | ${n.status} | ${r} | ${o} |`)}return t.join(`
1516
- `)}var Q0,bm,BS=h(()=>{"use strict";F();Fe();V();Te();Ie();Q0=[{name:"typecheck",scriptName:"typecheck",description:"TypeScript types",weight:25},{name:"lint",scriptName:"lint",description:"Lint rules",weight:20},{name:"tests",scriptName:"test",description:"Test suite",weight:35},{name:"dead-code",scriptName:"knip",description:"Dead-code scan",weight:20}],bm=class extends X{static{c(this,"HealthCommands")}async health(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await Z0(t),i=[];for(let u of o)i.push(await eI(t,u));let a=tI(i);return n.md?console.log(rI(a,i)):console.log(sI(a,i)),{success:i.every(u=>u.status!=="fail"),score:a,results:i.length}}catch(r){let o=b(r);return N(o)}}};c(Z0,"detectDimensions");c(eI,"runDimension");c(tI,"computeScore");c(nI,"statusIcon");c(sI,"formatText");c(rI,"formatMarkdown")});var qS={};D(qS,{RetroCommands:()=>Sm});import oI from"node:path";function iI(s){let t=(s??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let n=Number.parseInt(t[1],10);if(!Number.isFinite(n)||n<=0||n>365)return null;let r=t[2],o=new Date;if(r==="h"){let l=new Date(o.getTime()-n*60*60*1e3);return{label:`${n}h`,sinceIso:VS(l),hours:n}}let i=new Date(o.getFullYear(),o.getMonth(),o.getDate()),a=new Date(i.getTime()-n*24*60*60*1e3);return{label:`${n}d`,sinceIso:VS(a),hours:n*24}}function VS(s){let e=c(t=>`${t}`.padStart(2,"0"),"pad");return`${s.getFullYear()}-${e(s.getMonth()+1)}-${e(s.getDate())}T${e(s.getHours())}:${e(s.getMinutes())}:${e(s.getSeconds())}`}async function aI(s,e){let t="";try{t=(await Le("git",["log",`--since=${e}`,"--pretty=format:%H%x09%an%x09%ae%x09%aI%x09%s"],{cwd:s,maxBuffer:16777216})).stdout}catch(n){let r=n.stderr??n.message??"";if(/does not have any commits|unknown revision|bad revision|HEAD/i.test(r))return[];throw n}return t.split(`
1516
+ `)}var Q0,Sm,BS=h(()=>{"use strict";F();Fe();V();Te();Ie();Q0=[{name:"typecheck",scriptName:"typecheck",description:"TypeScript types",weight:25},{name:"lint",scriptName:"lint",description:"Lint rules",weight:20},{name:"tests",scriptName:"test",description:"Test suite",weight:35},{name:"dead-code",scriptName:"knip",description:"Dead-code scan",weight:20}],Sm=class extends X{static{c(this,"HealthCommands")}async health(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await Z0(t),i=[];for(let u of o)i.push(await eI(t,u));let a=tI(i);return n.md?console.log(rI(a,i)):console.log(sI(a,i)),{success:i.every(u=>u.status!=="fail"),score:a,results:i.length}}catch(r){let o=b(r);return N(o)}}};c(Z0,"detectDimensions");c(eI,"runDimension");c(tI,"computeScore");c(nI,"statusIcon");c(sI,"formatText");c(rI,"formatMarkdown")});var qS={};D(qS,{RetroCommands:()=>Tm});import oI from"node:path";function iI(s){let t=(s??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let n=Number.parseInt(t[1],10);if(!Number.isFinite(n)||n<=0||n>365)return null;let r=t[2],o=new Date;if(r==="h"){let l=new Date(o.getTime()-n*60*60*1e3);return{label:`${n}h`,sinceIso:VS(l),hours:n}}let i=new Date(o.getFullYear(),o.getMonth(),o.getDate()),a=new Date(i.getTime()-n*24*60*60*1e3);return{label:`${n}d`,sinceIso:VS(a),hours:n*24}}function VS(s){let e=c(t=>`${t}`.padStart(2,"0"),"pad");return`${s.getFullYear()}-${e(s.getMonth()+1)}-${e(s.getDate())}T${e(s.getHours())}:${e(s.getMinutes())}:${e(s.getSeconds())}`}async function aI(s,e){let t="";try{t=(await Le("git",["log",`--since=${e}`,"--pretty=format:%H%x09%an%x09%ae%x09%aI%x09%s"],{cwd:s,maxBuffer:16777216})).stdout}catch(n){let r=n.stderr??n.message??"";if(/does not have any commits|unknown revision|bad revision|HEAD/i.test(r))return[];throw n}return t.split(`
1517
1517
  `).filter(Boolean).map(n=>{let[r,o,i,a,...l]=n.split(" ");return{hash:r??"",authorName:o??"unknown",authorEmail:i??"",date:a??"",subject:l.join(" ")??""}}).filter(n=>n.hash)}function cI(s){let e=new Map;for(let t of s){let n=t.authorEmail||t.authorName,r=e.get(n);r||(r={name:t.authorName,email:t.authorEmail,commits:0,insertions:0,deletions:0,files:0,firstCommit:t.date,lastCommit:t.date},e.set(n,r)),r.commits++,t.date<r.firstCommit&&(r.firstCommit=t.date),t.date>r.lastCommit&&(r.lastCommit=t.date)}return Array.from(e.values()).sort((t,n)=>n.commits-t.commits)}function lI(s,e,t){if(e.length===0)return`No commits in the last ${s.label}.`;let n=[];n.push(`Retro \u2014 last ${s.label} \xB7 ${e.length} commits \xB7 ${t.length} contributors`),n.push("");for(let r of t)n.push(` ${r.commits.toString().padStart(3)} ${r.name} <${r.email}>`);n.push(""),n.push("Recent commits:");for(let r of e.slice(0,10))n.push(` ${r.hash.slice(0,7)} ${r.subject}`);return n.join(`
1518
1518
  `)}function uI(s,e,t){if(e.length===0)return`## Retro \u2014 last ${s.label}
1519
1519
 
1520
1520
  _No commits in the window._
1521
1521
  `;let n=[];n.push(`## Retro \u2014 last ${s.label}`),n.push(""),n.push(`- **Commits**: ${e.length}`),n.push(`- **Contributors**: ${t.length}`),n.push(""),n.push("### Per contributor"),n.push(""),n.push("| Author | Commits | First | Last |"),n.push("|---|---|---|---|");for(let r of t)n.push(`| ${r.name} | ${r.commits} | ${r.firstCommit.slice(0,10)} | ${r.lastCommit.slice(0,10)} |`);n.push(""),n.push("### Recent commits"),n.push("");for(let r of e.slice(0,15))n.push(`- \`${r.hash.slice(0,7)}\` ${r.subject} \u2014 _${r.authorName}_`);return n.join(`
1522
- `)}var Sm,JS=h(()=>{"use strict";F();Fe();V();Te();pe();Ie();Sm=class extends X{static{c(this,"RetroCommands")}async retro(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!await C(oI.join(t,".git")))return f.fail("Not in a git repository \u2014 `prjct retro` needs git history."),{success:!1,error:"Not a git repo"};let o=iI(e);if(!o)return f.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await aI(t,o.sinceIso),a=cI(i);return n.md?console.log(uI(o,i,a)):console.log(lI(o,i,a)),{success:!0,window:o.label,commits:i.length,contributors:a.length}}catch(r){let o=b(r);return N(o)}}};c(iI,"parseWindow");c(VS,"toLocalIso");c(aI,"readCommits");c(cI,"groupByAuthor");c(lI,"formatText");c(uI,"formatMarkdown")});var XS={};D(XS,{SkillAdherenceCommands:()=>Tm});function dI(s){let t=(s??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let n=Number.parseInt(t[1],10);return!Number.isFinite(n)||n<=0||n>365?null:t[2]==="h"?{label:`${n}h`,hours:n}:{label:`${n}d`,hours:n*24}}function pI(s){return(s.split(`
1522
+ `)}var Tm,JS=h(()=>{"use strict";F();Fe();V();Te();pe();Ie();Tm=class extends X{static{c(this,"RetroCommands")}async retro(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!await C(oI.join(t,".git")))return f.fail("Not in a git repository \u2014 `prjct retro` needs git history."),{success:!1,error:"Not a git repo"};let o=iI(e);if(!o)return f.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await aI(t,o.sinceIso),a=cI(i);return n.md?console.log(uI(o,i,a)):console.log(lI(o,i,a)),{success:!0,window:o.label,commits:i.length,contributors:a.length}}catch(r){let o=b(r);return N(o)}}};c(iI,"parseWindow");c(VS,"toLocalIso");c(aI,"readCommits");c(cI,"groupByAuthor");c(lI,"formatText");c(uI,"formatMarkdown")});var XS={};D(XS,{SkillAdherenceCommands:()=>Em});function dI(s){let t=(s??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let n=Number.parseInt(t[1],10);return!Number.isFinite(n)||n<=0||n>365?null:t[2]==="h"?{label:`${n}h`,hours:n}:{label:`${n}d`,hours:n*24}}function pI(s){return(s.split(`
1523
1523
  `)[0]??"").replace(/^\[skill-miss\]\s*/,"").trim()}function mI(s,e,t,n,r){if(t===0)return`Skill adherence \u2014 last ${s}: no skill-misses captured. Clean.`;let o=[];o.push(`Skill adherence \u2014 last ${s} \xB7 ${t} miss${t===1?"":"es"} \xB7 ${n} resolved \xB7 ${(r*100).toFixed(0)}% addressed`),o.push("");for(let i of e.slice(0,20)){let a=i.resolved?"\u2713":"\xB7",l=i.file?` (${i.file})`:"";o.push(` ${a} ${i.memId}${l} ${i.excerpt.slice(0,100)}`)}return o.join(`
1524
1524
  `)}function gI(s,e,t,n,r,o){if(t===0)return`## Skill adherence \u2014 last ${s}
1525
1525
 
1526
1526
  _No skill-misses captured in the window._
1527
1527
  `;let i=[];i.push(`## Skill adherence \u2014 last ${s}`),i.push(""),i.push(`- **Skill-misses**: ${t}`),i.push(`- **Resolved**: ${n} (${(r*100).toFixed(0)}% addressed)`),i.push(`- **Resolution decisions logged**: ${o}`),i.push(""),i.push("| State | Memory | File | Signal |"),i.push("|---|---|---|---|");for(let a of e.slice(0,30)){let l=a.resolved?"\u2713 resolved":"\xB7 open",u=a.file||"\u2014",d=a.excerpt.slice(0,110).replace(/\|/g,"\\|");i.push(`| ${l} | ${a.memId} | ${u} | ${d} |`)}return i.join(`
1528
- `)}var Tm,zS=h(()=>{"use strict";re();$e();F();Te();pe();Ie();Tm=class extends X{static{c(this,"SkillAdherenceCommands")}async skillAdherence(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=dI(e);if(!o)return f.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await I.readConfig(t);if(!i?.projectId)return f.fail("No prjct project here \u2014 run `prjct start` first."),{success:!1,error:"No project"};let a=Date.now()-o.hours*60*60*1e3,l=J.recall(i.projectId,{types:["improvement-signal"],tags:{source:"skill-miss-detector"},limit:300,dedupeByKey:!1}).filter(E=>Date.parse(E.rememberedAt)>=a),u=J.recall(i.projectId,{types:["decision"],tags:{resolves:"skill-miss"},limit:300,dedupeByKey:!1}).filter(E=>Date.parse(E.rememberedAt)>=a),d=new Set(u.map(E=>E.tags.relates).filter(E=>!!E)),p=l.map(E=>({memId:E.tags.relates??"\u2014",excerpt:pI(E.content),file:E.tags.file??"",rememberedAt:E.rememberedAt,resolved:E.tags.relates?d.has(E.tags.relates):!1})),m=p.length,g=p.filter(E=>E.resolved).length,k=m===0?1:g/m;return n.md?console.log(gI(o.label,p,m,g,k,u.length)):console.log(mI(o.label,p,m,g,k)),{success:!0,window:o.label,misses:m,resolved:g,adherence:Number(k.toFixed(2))}}catch(r){return N(b(r))}}};c(dI,"parseWindow");c(pI,"firstLine");c(mI,"formatText");c(gI,"formatMarkdown")});var QS={};D(QS,{ReviewRiskCommands:()=>Em,_internal:()=>TI});async function kI(s,e){let{stdout:t}=await Le("git",e,{cwd:s});return t.trim()}async function Yr(s,e){try{return await kI(s,e)}catch{return null}}async function vI(s){let e="",t=await Yr(s,["rev-parse","--abbrev-ref","origin/HEAD"]);if(t&&t!=="origin/HEAD")e=t;else for(let g of["main","master"])if(await Yr(s,["rev-parse","--verify","--quiet",g])!==null){e=g;break}if(!e)return null;let n=await Yr(s,["merge-base",e,"HEAD"]);if(!n)return null;let r=await Yr(s,["rev-parse","HEAD"]);if(!r||r===n)return null;let o=await Yr(s,["diff","--shortstat",`${n}..HEAD`]);if(o===null)return null;let i=o.match(/(\d+) files? changed/),a=o.match(/(\d+) insertions?/),l=o.match(/(\d+) deletions?/),u=i?Number.parseInt(i[1],10):0,d=(a?Number.parseInt(a[1],10):0)+(l?Number.parseInt(l[1],10):0),p=await Yr(s,["diff","--name-only",`${n}..HEAD`])??"",m=[...new Set(p.split(`
1529
- `).filter(Boolean).map(g=>g.includes("/")?g.slice(0,g.indexOf("/")):"."))].sort();return{base:n.slice(0,7),files:u,loc:d,dirs:m}}function KS(s){return s.files<=fI&&s.loc<=hI?"trivial":s.files<=yI&&s.loc<=wI?"normal":"large"}function Cm(s){return s==="trivial"?"direct":s==="normal"?"single":"split"}function YS(s,e){return s==="direct"?"Small + low-risk \u2014 fine to land directly or as one tiny PR.":s==="single"?"Cohesive \u2014 one reviewable PR.":`Large \u2014 hard to review in one pass. Consider stacked PRs.${e.dirs.length>1?` Natural split lines: ${e.dirs.join(", ")}.`:" Consider splitting by concern even within this area."}`}function bI(s,e,t){return[`Review risk: ${e.toUpperCase()} \u2014 ${s.files} files, ${s.loc} LOC vs ${s.base}`,`Delivery: ${t} \u2014 ${YS(t,s)}`,"(advisory \u2014 you decide; nothing was changed)"].join(`
1528
+ `)}var Em,zS=h(()=>{"use strict";re();$e();F();Te();pe();Ie();Em=class extends X{static{c(this,"SkillAdherenceCommands")}async skillAdherence(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=dI(e);if(!o)return f.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await I.readConfig(t);if(!i?.projectId)return f.fail("No prjct project here \u2014 run `prjct start` first."),{success:!1,error:"No project"};let a=Date.now()-o.hours*60*60*1e3,l=J.recall(i.projectId,{types:["improvement-signal"],tags:{source:"skill-miss-detector"},limit:300,dedupeByKey:!1}).filter(E=>Date.parse(E.rememberedAt)>=a),u=J.recall(i.projectId,{types:["decision"],tags:{resolves:"skill-miss"},limit:300,dedupeByKey:!1}).filter(E=>Date.parse(E.rememberedAt)>=a),d=new Set(u.map(E=>E.tags.relates).filter(E=>!!E)),p=l.map(E=>({memId:E.tags.relates??"\u2014",excerpt:pI(E.content),file:E.tags.file??"",rememberedAt:E.rememberedAt,resolved:E.tags.relates?d.has(E.tags.relates):!1})),m=p.length,g=p.filter(E=>E.resolved).length,k=m===0?1:g/m;return n.md?console.log(gI(o.label,p,m,g,k,u.length)):console.log(mI(o.label,p,m,g,k)),{success:!0,window:o.label,misses:m,resolved:g,adherence:Number(k.toFixed(2))}}catch(r){return N(b(r))}}};c(dI,"parseWindow");c(pI,"firstLine");c(mI,"formatText");c(gI,"formatMarkdown")});var QS={};D(QS,{ReviewRiskCommands:()=>Cm,_internal:()=>TI});async function kI(s,e){let{stdout:t}=await Le("git",e,{cwd:s});return t.trim()}async function Yr(s,e){try{return await kI(s,e)}catch{return null}}async function vI(s){let e="",t=await Yr(s,["rev-parse","--abbrev-ref","origin/HEAD"]);if(t&&t!=="origin/HEAD")e=t;else for(let g of["main","master"])if(await Yr(s,["rev-parse","--verify","--quiet",g])!==null){e=g;break}if(!e)return null;let n=await Yr(s,["merge-base",e,"HEAD"]);if(!n)return null;let r=await Yr(s,["rev-parse","HEAD"]);if(!r||r===n)return null;let o=await Yr(s,["diff","--shortstat",`${n}..HEAD`]);if(o===null)return null;let i=o.match(/(\d+) files? changed/),a=o.match(/(\d+) insertions?/),l=o.match(/(\d+) deletions?/),u=i?Number.parseInt(i[1],10):0,d=(a?Number.parseInt(a[1],10):0)+(l?Number.parseInt(l[1],10):0),p=await Yr(s,["diff","--name-only",`${n}..HEAD`])??"",m=[...new Set(p.split(`
1529
+ `).filter(Boolean).map(g=>g.includes("/")?g.slice(0,g.indexOf("/")):"."))].sort();return{base:n.slice(0,7),files:u,loc:d,dirs:m}}function KS(s){return s.files<=fI&&s.loc<=hI?"trivial":s.files<=yI&&s.loc<=wI?"normal":"large"}function Rm(s){return s==="trivial"?"direct":s==="normal"?"single":"split"}function YS(s,e){return s==="direct"?"Small + low-risk \u2014 fine to land directly or as one tiny PR.":s==="single"?"Cohesive \u2014 one reviewable PR.":`Large \u2014 hard to review in one pass. Consider stacked PRs.${e.dirs.length>1?` Natural split lines: ${e.dirs.join(", ")}.`:" Consider splitting by concern even within this area."}`}function bI(s,e,t){return[`Review risk: ${e.toUpperCase()} \u2014 ${s.files} files, ${s.loc} LOC vs ${s.base}`,`Delivery: ${t} \u2014 ${YS(t,s)}`,"(advisory \u2014 you decide; nothing was changed)"].join(`
1530
1530
  `)}function SI(s,e,t){return["## Review risk","",`- **Tier**: ${e}`,`- **Changeset**: ${s.files} files, ${s.loc} LOC (vs \`${s.base}\`)`,`- **Dirs touched**: ${s.dirs.join(", ")||"\u2014"}`,`- **Suggested delivery**: \`${t}\` \u2014 ${YS(t,s)}`,"","_Advisory only \u2014 no gate, nothing changed._"].join(`
1531
- `)}var fI,hI,yI,wI,Em,TI,ZS=h(()=>{"use strict";F();Fe();Te();Ie();fI=2,hI=20,yI=10,wI=400,Em=class extends X{static{c(this,"ReviewRiskCommands")}async reviewRisk(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await vI(t);if(!o){let l="review-risk: no comparable changeset (no base branch or nothing committed).";return console.log(n.md?`## Review risk
1531
+ `)}var fI,hI,yI,wI,Cm,TI,ZS=h(()=>{"use strict";F();Fe();Te();Ie();fI=2,hI=20,yI=10,wI=400,Cm=class extends X{static{c(this,"ReviewRiskCommands")}async reviewRisk(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await vI(t);if(!o){let l="review-risk: no comparable changeset (no base branch or nothing committed).";return console.log(n.md?`## Review risk
1532
1532
 
1533
1533
  _${l}_
1534
- `:l),{success:!0,tier:"trivial",files:0,loc:0,geometry:Cm("trivial")}}let i=KS(o),a=Cm(i);return console.log(n.md?SI(o,i,a):bI(o,i,a)),{success:!0,tier:i,files:o.files,loc:o.loc,geometry:a}}catch(r){return N(b(r))}}};c(kI,"git");c(Yr,"safeGit");c(vI,"computeChangeset");c(KS,"tierOf");c(Cm,"geometryOf");c(YS,"suggestion");c(bI,"formatText");c(SI,"formatMd");TI={tierOf:KS,geometryOf:Cm}});function Pm(){return{version:1,entries:{}}}function jc(s){let e=A.getDoc(s,eT);return!e||e.version!==1||typeof e.entries!="object"||e.entries===null?Pm():e}function Rm(s,e){A.setDoc(s,eT,e)}function Qr(s){return/^[a-zA-Z0-9_-]+$/.test(s)&&s.length>0&&s.length<=80}function tT(s){return EI.includes(s)}var eT,EI,Zr,nT=h(()=>{"use strict";Y();eT="prefs:questions",EI=["always-ask","never-ask","auto-decide"];c(Pm,"emptyDoc");c(jc,"read");c(Rm,"write");c(Qr,"isValidQuestionId");c(tT,"isValidPreference");Zr={set(s,e){if(!Qr(e.questionId))throw new Error(`Invalid questionId "${e.questionId}". Must be alphanumeric with - or _, 1-80 chars.`);let t={questionId:e.questionId,preference:e.preference,setAt:new Date().toISOString(),reason:e.reason?.trim()||void 0},n=jc(s);return n.entries[e.questionId]=t,Rm(s,n),t},get(s,e){return jc(s).entries[e]??null},list(s){let e=jc(s);return Object.values(e.entries).sort((t,n)=>n.setAt.localeCompare(t.setAt))},check(s,e){let t=this.get(s,e);if(!t)return"ASK_NORMALLY";switch(t.preference){case"never-ask":return"NEVER_ASK";case"auto-decide":return"AUTO_DECIDE";default:return"ASK_NORMALLY"}},clear(s,e){let t=jc(s);if(!e){let n=Object.keys(t.entries).length;return Rm(s,Pm()),n}return t.entries[e]?(delete t.entries[e],Rm(s,t),1):0}}});var sT={};D(sT,{PreferencesCommands:()=>xm});var xm,rT=h(()=>{"use strict";nT();F();Te();pe();Ie();Zt();xm=class extends X{static{c(this,"PreferencesCommands")}async prefs(e,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=e[0]??"list",i=e.slice(1);switch(o){case"list":return this.handleList(r.value,n);case"get":return this.handleGet(r.value,i,n);case"check":return this.handleCheck(r.value,i);case"set":return this.handleSet(r.value,i,n);case"clear":return this.handleClear(r.value,i,n);default:return f.fail(`Unknown prefs subcommand: ${o}. Use: list, get, check, set, clear.`),{success:!1,error:`Unknown subcommand: ${o}`}}}catch(r){let o=b(r);return N(o)}}handleList(e,t){let n=Zr.list(e);if(t.md)if(n.length===0)console.log(`## Question preferences
1534
+ `:l),{success:!0,tier:"trivial",files:0,loc:0,geometry:Rm("trivial")}}let i=KS(o),a=Rm(i);return console.log(n.md?SI(o,i,a):bI(o,i,a)),{success:!0,tier:i,files:o.files,loc:o.loc,geometry:a}}catch(r){return N(b(r))}}};c(kI,"git");c(Yr,"safeGit");c(vI,"computeChangeset");c(KS,"tierOf");c(Rm,"geometryOf");c(YS,"suggestion");c(bI,"formatText");c(SI,"formatMd");TI={tierOf:KS,geometryOf:Rm}});function xm(){return{version:1,entries:{}}}function $c(s){let e=A.getDoc(s,eT);return!e||e.version!==1||typeof e.entries!="object"||e.entries===null?xm():e}function Pm(s,e){A.setDoc(s,eT,e)}function Qr(s){return/^[a-zA-Z0-9_-]+$/.test(s)&&s.length>0&&s.length<=80}function tT(s){return EI.includes(s)}var eT,EI,Zr,nT=h(()=>{"use strict";Y();eT="prefs:questions",EI=["always-ask","never-ask","auto-decide"];c(xm,"emptyDoc");c($c,"read");c(Pm,"write");c(Qr,"isValidQuestionId");c(tT,"isValidPreference");Zr={set(s,e){if(!Qr(e.questionId))throw new Error(`Invalid questionId "${e.questionId}". Must be alphanumeric with - or _, 1-80 chars.`);let t={questionId:e.questionId,preference:e.preference,setAt:new Date().toISOString(),reason:e.reason?.trim()||void 0},n=$c(s);return n.entries[e.questionId]=t,Pm(s,n),t},get(s,e){return $c(s).entries[e]??null},list(s){let e=$c(s);return Object.values(e.entries).sort((t,n)=>n.setAt.localeCompare(t.setAt))},check(s,e){let t=this.get(s,e);if(!t)return"ASK_NORMALLY";switch(t.preference){case"never-ask":return"NEVER_ASK";case"auto-decide":return"AUTO_DECIDE";default:return"ASK_NORMALLY"}},clear(s,e){let t=$c(s);if(!e){let n=Object.keys(t.entries).length;return Pm(s,xm()),n}return t.entries[e]?(delete t.entries[e],Pm(s,t),1):0}}});var sT={};D(sT,{PreferencesCommands:()=>Am});var Am,rT=h(()=>{"use strict";nT();F();Te();pe();Ie();Zt();Am=class extends X{static{c(this,"PreferencesCommands")}async prefs(e,t=process.cwd(),n={}){try{let r=await we(t);if(!r.ok)return r.result;let o=e[0]??"list",i=e.slice(1);switch(o){case"list":return this.handleList(r.value,n);case"get":return this.handleGet(r.value,i,n);case"check":return this.handleCheck(r.value,i);case"set":return this.handleSet(r.value,i,n);case"clear":return this.handleClear(r.value,i,n);default:return f.fail(`Unknown prefs subcommand: ${o}. Use: list, get, check, set, clear.`),{success:!1,error:`Unknown subcommand: ${o}`}}}catch(r){let o=b(r);return N(o)}}handleList(e,t){let n=Zr.list(e);if(t.md)if(n.length===0)console.log(`## Question preferences
1535
1535
 
1536
1536
  _No preferences set._
1537
1537
  `);else{let r=n.map(o=>`| ${o.questionId} | ${o.preference} | ${o.setAt} | ${o.reason?o.reason.replaceAll("|","\\|"):""} |`).join(`
@@ -1555,66 +1555,64 @@ Preferences: always-ask | never-ask | auto-decide`),{success:!1,error:"Missing a
1555
1555
  `):f.done(`prefs ${i.questionId} \u2192 ${i.preference}`),{success:!0,entry:i}}handleClear(e,t,n){let r=t[0];if(r&&!Qr(r))return f.fail(`Invalid questionId "${r}".`),{success:!1,error:"Invalid questionId"};let o=Zr.clear(e,r);if(n.md){let i=r?`\`${r}\``:"all preferences";console.log(`## prefs clear
1556
1556
 
1557
1557
  Cleared ${o} entr${o===1?"y":"ies"} (${i}).
1558
- `)}else o===0?f.info(r?`no preference set for ${r}`:"no preferences to clear"):f.done(`cleared ${o} preference${o===1?"":"s"}`);return{success:!0,cleared:o}}}});async function oT(){return process.stdin.isTTY?{}:new Promise(s=>{let e=[];process.stdin.on("data",t=>e.push(t)),process.stdin.on("end",()=>{try{let t=Buffer.concat(e).toString("utf-8").trim();if(!t)return s({});s(JSON.parse(t))}catch{s({})}}),process.stdin.on("error",()=>s({})),setTimeout(()=>s({}),200)})}function Am(s){process.stdout.write(`${JSON.stringify(s)}
1559
- `)}function RI(){Am({})}async function iT(s){try{await s()}catch{RI()}}function aT(s,e=8){let t=new Set(["this","that","with","from","have","your","please","need","want","would","should","could","about","there","these","those","what","when","where","which","while","will","been","were","they","them","their"]),n=new Set,r=[];for(let o of s.toLowerCase().match(/[a-z0-9-]{4,}/g)??[])if(!t.has(o)&&!n.has(o)&&(n.add(o),r.push(o),r.length>=e))break;return r}function cT(s,e){return e?CI.has(s)?{hookSpecificOutput:{hookEventName:s,additionalContext:e}}:{systemMessage:e}:{}}var CI,jm=h(()=>{"use strict";CI=new Set(["SessionStart","UserPromptSubmit","PostToolUse"]);c(oT,"readStdinSafe");c(Am,"emit");c(RI,"emitEmpty");c(iT,"safeRun");c(aT,"extractKeywords");c(cT,"buildHookOutput")});async function St(s){let e=s.projectPath??process.cwd();await iT(async()=>{let t=await oT(),n=s.build?await s.build(t,e):null;Am(cT(s.event,n)),s.afterEmit&&await s.afterEmit(t,e)})}var cs=h(()=>{"use strict";jm();c(St,"runHook")});var lT={};D(lT,{buildSessionContext:()=>eo,runSessionStartHook:()=>xI});async function eo(s,e){let t=e??await I.readConfig(s);if(!t?.projectId)return null;let n=t.persona;return n?["# prjct: project context","",PI(n),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn.","> For recall, run `prjct context memory [topic]` (per-turn topical memory is already injected by the prompt hook)."].join(`
1560
- `):null}function PI(s){let e=[];return e.push(`## Your role in this project: **${s.role}**`),s.focus&&e.push(`Focus: ${s.focus}`),s.mcps&&s.mcps.length>0&&e.push(`Available MCPs this project expects: ${s.mcps.join(", ")}`),s.packs&&s.packs.length>0&&e.push(`Active packs: ${s.packs.join(", ")}`),e.join(`
1561
- `)}function xI(s=process.cwd()){let e=null;return St({event:"SessionStart",projectPath:s,build:c(async(t,n)=>(e=await I.readConfig(n).catch(()=>null),eo(n,e)),"build"),afterEmit:c(async(t,n)=>{e?.projectId&&await zo(n,e.projectId).catch(()=>{}),Il(le)||await _l(le).catch(()=>{});try{let{maybeAutoUpdate:r}=await Promise.resolve().then(()=>(Jc(),qc));r(le)}catch{}},"afterEmit")})}var $c=h(()=>{"use strict";re();Ii();Mn();We();cs();c(eo,"buildSessionContext");c(PI,"formatPersona");c(xI,"runSessionStartHook")});var gT={};D(gT,{buildImprovementSignals:()=>mT,buildProjectState:()=>pT,runPromptHook:()=>DI});import AI from"node:path";async function jI(s,e){let t=await I.readConfig(s);if(!t?.projectId)return null;let n=aT(e);if(n.length===0)return null;let r=n.map(u=>u.toLowerCase()),o=[];try{o=J.recall(t.projectId,{limit:uT*4})}catch{return null}let i=[];for(let u of o){let d=`${u.content} ${Object.values(u.tags).join(" ")}`.toLowerCase();if(r.some(p=>d.includes(p))&&(i.push(u),i.length>=uT))break}if(i.length===0)return null;let a=["# prjct: topical memory"];a.push(""),a.push(`Recalled ${i.length} entr${i.length===1?"y":"ies"} matching: ${n.slice(0,3).join(", ")}`),a.push(""),a.push(xt(i)),a.push(""),a.push("> Exposed as state. Use if relevant; ignore if not.");let l=a.join(`
1562
- `);return l.length>Ic?`${l.slice(0,Ic-20)}
1563
- \u2026 [truncated]`:l}async function pT(s){let e=await I.readConfig(s);if(!e?.projectId)return null;let t=["# prjct: project state"],n=!1;try{let r=await B.getCurrentTask(e.projectId);if(r){let o=dT(r.startedAt);t.push(`- Active task: "${r.description}" (${o})`),n=!0}}catch{}if(await C(AI.join(s,".git"))){let r=await $I(s);if(r.branch){let o=[];r.modified>0&&o.push(`${r.modified} modified`),r.staged>0&&o.push(`${r.staged} staged`),r.untracked>0&&o.push(`${r.untracked} untracked`);let i=o.length>0?o.join(", "):"clean",a=r.ahead>0?`, ${r.ahead} unpushed`:"";t.push(`- Branch: ${r.branch} \u2014 working tree ${i}${a}`),n=!0}}try{let r=await wt.getRecent(e.projectId,1);if(r.length>0){let o=r[0],i=dT(o.shippedAt??""),a=o.version?`v${o.version}`:o.name;t.push(`- Last ship: ${a} (${i})`),n=!0}}catch{}try{let r=J.recall(e.projectId,{types:["inbox"],limit:50});r.length>0&&(t.push(`- Inbox: ${r.length} items pending`),n=!0)}catch{}return n?t.join(`
1564
- `):null}async function $I(s){let e={branch:"",modified:0,staged:0,untracked:0,ahead:0},t=c(async d=>{try{return(await Le("git",d,{cwd:s,timeout:2e3})).stdout.trim()}catch{return""}},"safe"),n=await t(["branch","--show-current"]);if(!n)return e;let r=await t(["status","--porcelain"]),o=0,i=0,a=0;for(let d of r.split(`
1565
- `)){if(!d)continue;let p=d.slice(0,2);p.startsWith("??")?a++:(p[0]!==" "&&p[0]!=="?"&&i++,p[1]!==" "&&o++)}let l=await t(["rev-list","--count","@{u}..HEAD"]),u=Number.parseInt(l,10)||0;return{branch:n,modified:o,staged:i,untracked:a,ahead:u}}async function mT(s){let e=await I.readConfig(s);if(!e?.projectId)return null;let t=[];try{t=J.recall(e.projectId,{types:["improvement-signal"],limit:16})}catch{return null}if(t.length===0)return null;let n=Date.now()-24*60*60*1e3,r=t.filter(u=>Date.parse(u.rememberedAt)>n);if(r.length===0)return null;let o=r.filter(u=>u.tags.source==="friction-detector").slice(0,II),i=r.filter(u=>u.tags.source==="skill-miss-detector").slice(0,_I),a=[...o,...i].sort((u,d)=>d.rememberedAt.localeCompare(u.rememberedAt));if(a.length===0)return null;let l=["# prjct: improvement signals (from prior session)"];l.push(""),l.push(`${a.length} signal${a.length===1?"":"s"} captured at last session-end (friction + skill-miss). Consider whether any of these are relevant to what the user is asking now \u2014 if so, propose a fix proactively. Otherwise ignore.`),l.push("");for(let u of a){let d=u.tags.category??"unknown",p=u.content.split(`
1558
+ `)}else o===0?f.info(r?`no preference set for ${r}`:"no preferences to clear"):f.done(`cleared ${o} preference${o===1?"":"s"}`);return{success:!0,cleared:o}}}});async function oT(){return process.stdin.isTTY?{}:new Promise(s=>{let e=[];process.stdin.on("data",t=>e.push(t)),process.stdin.on("end",()=>{try{let t=Buffer.concat(e).toString("utf-8").trim();if(!t)return s({});s(JSON.parse(t))}catch{s({})}}),process.stdin.on("error",()=>s({})),setTimeout(()=>s({}),200)})}function jm(s){process.stdout.write(`${JSON.stringify(s)}
1559
+ `)}function RI(){jm({})}async function iT(s){try{await s()}catch{RI()}}function aT(s,e=8){let t=new Set(["this","that","with","from","have","your","please","need","want","would","should","could","about","there","these","those","what","when","where","which","while","will","been","were","they","them","their"]),n=new Set,r=[];for(let o of s.toLowerCase().match(/[a-z0-9-]{4,}/g)??[])if(!t.has(o)&&!n.has(o)&&(n.add(o),r.push(o),r.length>=e))break;return r}function PI(s){return s.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,"\uFFFD")}function ai(s,e,t=`
1560
+ \u2026 [truncated]`){if(s.length<=e)return s;let n=Math.max(0,e-t.length),r=s.charCodeAt(n-1);return r>=55296&&r<=56319&&(n-=1),s.slice(0,Math.max(0,n))+t}function cT(s,e){if(!e)return{};let t=PI(e);return CI.has(s)?{hookSpecificOutput:{hookEventName:s,additionalContext:t}}:{systemMessage:t}}var CI,Ic=h(()=>{"use strict";CI=new Set(["SessionStart","UserPromptSubmit","PostToolUse"]);c(oT,"readStdinSafe");c(jm,"emit");c(RI,"emitEmpty");c(iT,"safeRun");c(aT,"extractKeywords");c(PI,"stripLoneSurrogates");c(ai,"safeTruncate");c(cT,"buildHookOutput")});async function St(s){let e=s.projectPath??process.cwd();await iT(async()=>{let t=await oT(),n=s.build?await s.build(t,e):null;jm(cT(s.event,n)),s.afterEmit&&await s.afterEmit(t,e)})}var cs=h(()=>{"use strict";Ic();c(St,"runHook")});var lT={};D(lT,{buildSessionContext:()=>eo,runSessionStartHook:()=>AI});async function eo(s,e){let t=e??await I.readConfig(s);if(!t?.projectId)return null;let n=t.persona;return n?["# prjct: project context","",xI(n),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn.","> For recall, run `prjct context memory [topic]` (per-turn topical memory is already injected by the prompt hook)."].join(`
1561
+ `):null}function xI(s){let e=[];return e.push(`## Your role in this project: **${s.role}**`),s.focus&&e.push(`Focus: ${s.focus}`),s.mcps&&s.mcps.length>0&&e.push(`Available MCPs this project expects: ${s.mcps.join(", ")}`),s.packs&&s.packs.length>0&&e.push(`Active packs: ${s.packs.join(", ")}`),e.join(`
1562
+ `)}function AI(s=process.cwd()){let e=null;return St({event:"SessionStart",projectPath:s,build:c(async(t,n)=>(e=await I.readConfig(n).catch(()=>null),eo(n,e)),"build"),afterEmit:c(async(t,n)=>{e?.projectId&&await zo(n,e.projectId).catch(()=>{}),_l(le)||await Dl(le).catch(()=>{});try{let{maybeAutoUpdate:r}=await Promise.resolve().then(()=>(Xc(),Jc));r(le)}catch{}},"afterEmit")})}var _c=h(()=>{"use strict";re();_i();Mn();We();cs();c(eo,"buildSessionContext");c(xI,"formatPersona");c(AI,"runSessionStartHook")});var fT={};D(fT,{buildImprovementSignals:()=>gT,buildProjectState:()=>mT,runPromptHook:()=>MI});import jI from"node:path";async function $I(s,e){let t=await I.readConfig(s);if(!t?.projectId)return null;let n=aT(e);if(n.length===0)return null;let r=n.map(u=>u.toLowerCase()),o=[];try{o=J.recall(t.projectId,{limit:uT*4})}catch{return null}let i=[];for(let u of o){let d=`${u.content} ${Object.values(u.tags).join(" ")}`.toLowerCase();if(r.some(p=>d.includes(p))&&(i.push(u),i.length>=uT))break}if(i.length===0)return null;let a=["# prjct: topical memory"];a.push(""),a.push(`Recalled ${i.length} entr${i.length===1?"y":"ies"} matching: ${n.slice(0,3).join(", ")}`),a.push(""),a.push(xt(i)),a.push(""),a.push("> Exposed as state. Use if relevant; ignore if not.");let l=a.join(`
1563
+ `);return ai(l,pT)}async function mT(s){let e=await I.readConfig(s);if(!e?.projectId)return null;let t=["# prjct: project state"],n=!1;try{let r=await B.getCurrentTask(e.projectId);if(r){let o=dT(r.startedAt);t.push(`- Active task: "${r.description}" (${o})`),n=!0}}catch{}if(await C(jI.join(s,".git"))){let r=await II(s);if(r.branch){let o=[];r.modified>0&&o.push(`${r.modified} modified`),r.staged>0&&o.push(`${r.staged} staged`),r.untracked>0&&o.push(`${r.untracked} untracked`);let i=o.length>0?o.join(", "):"clean",a=r.ahead>0?`, ${r.ahead} unpushed`:"";t.push(`- Branch: ${r.branch} \u2014 working tree ${i}${a}`),n=!0}}try{let r=await wt.getRecent(e.projectId,1);if(r.length>0){let o=r[0],i=dT(o.shippedAt??""),a=o.version?`v${o.version}`:o.name;t.push(`- Last ship: ${a} (${i})`),n=!0}}catch{}try{let r=J.recall(e.projectId,{types:["inbox"],limit:50});r.length>0&&(t.push(`- Inbox: ${r.length} items pending`),n=!0)}catch{}return n?t.join(`
1564
+ `):null}async function II(s){let e={branch:"",modified:0,staged:0,untracked:0,ahead:0},t=c(async d=>{try{return(await Le("git",d,{cwd:s,timeout:2e3})).stdout.trim()}catch{return""}},"safe"),n=await t(["branch","--show-current"]);if(!n)return e;let r=await t(["status","--porcelain"]),o=0,i=0,a=0;for(let d of r.split(`
1565
+ `)){if(!d)continue;let p=d.slice(0,2);p.startsWith("??")?a++:(p[0]!==" "&&p[0]!=="?"&&i++,p[1]!==" "&&o++)}let l=await t(["rev-list","--count","@{u}..HEAD"]),u=Number.parseInt(l,10)||0;return{branch:n,modified:o,staged:i,untracked:a,ahead:u}}async function gT(s){let e=await I.readConfig(s);if(!e?.projectId)return null;let t=[];try{t=J.recall(e.projectId,{types:["improvement-signal"],limit:16})}catch{return null}if(t.length===0)return null;let n=Date.now()-24*60*60*1e3,r=t.filter(u=>Date.parse(u.rememberedAt)>n);if(r.length===0)return null;let o=r.filter(u=>u.tags.source==="friction-detector").slice(0,_I),i=r.filter(u=>u.tags.source==="skill-miss-detector").slice(0,DI),a=[...o,...i].sort((u,d)=>d.rememberedAt.localeCompare(u.rememberedAt));if(a.length===0)return null;let l=["# prjct: improvement signals (from prior session)"];l.push(""),l.push(`${a.length} signal${a.length===1?"":"s"} captured at last session-end (friction + skill-miss). Consider whether any of these are relevant to what the user is asking now \u2014 if so, propose a fix proactively. Otherwise ignore.`),l.push("");for(let u of a){let d=u.tags.category??"unknown",p=u.content.split(`
1566
1566
  `)[0]??"";l.push(`- [${d}] ${p}`)}return l.push(""),l.push('> If the user explicitly addresses one, drop it from rotation by `prjct remember decision "<resolution>" --tags resolves:improvement-signal` (friction) or `--tags resolves:skill-miss` (skill-miss).'),l.join(`
1567
- `)}function dT(s){if(!s)return"unknown";let e=Date.parse(s);if(Number.isNaN(e))return"unknown";let t=Math.max(0,Math.floor((Date.now()-e)/1e3));if(t<60)return"just now";let n=Math.floor(t/60);if(n<60)return`${n}m ago`;let r=Math.floor(n/60);if(r<24)return`${r}h ago`;let o=Math.floor(r/24);return o<30?`${o}d ago`:`${Math.floor(o/30)}mo ago`}function DI(s=process.cwd()){return St({event:"UserPromptSubmit",projectPath:s,build:c(async(e,t)=>{let n=(e.prompt??"").trim();if(!n)return null;let[r,o,i]=await Promise.all([pT(t),jI(t,n),mT(t)]),a=[r,i,o].filter(u=>!!u);if(a.length===0)return null;let l=a.join(`
1568
-
1569
- `);return l.length>Ic?`${l.slice(0,Ic-20)}
1570
- \u2026 [truncated]`:l},"build")})}var Ic,uT,II,_I,fT=h(()=>{"use strict";re();$e();Ps();pt();Fe();V();cs();jm();Ic=1800,uT=4;c(jI,"buildPromptContext");c(pT,"buildProjectState");c($I,"captureGit");II=3,_I=2;c(mT,"buildImprovementSignals");c(dT,"formatRelative");c(DI,"runPromptHook")});var yT={};D(yT,{runPreCommitHook:()=>UI});import{execSync as MI}from"node:child_process";function NI(s){try{return MI("git diff --cached --name-only",{cwd:s,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
1571
- `).map(e=>e.trim()).filter(Boolean)}catch{return[]}}function LI(s){let e=new Set;for(let t of s){let n=t.split("/").filter(Boolean);for(let r of n){let o=r.replace(/\.[^.]+$/,"").toLowerCase();o.length>=3&&e.add(o)}}return[...e]}function FI(s,e){let t=s.content.toLowerCase();if(e.some(n=>t.includes(n)))return!0;for(let n of Object.values(s.tags)){let r=n.toLowerCase();if(e.some(o=>r.includes(o)))return!0}return!1}async function HI(s){let e=await I.readConfig(s);if(!e?.projectId)return null;let t=NI(s);if(t.length===0)return null;let n=LI(t);if(n.length===0)return null;let r;try{r=J.recall(e.projectId,{types:["anti-pattern","gotcha"],limit:50})}catch{return null}let o=r.filter(l=>FI(l,n)).slice(0,OI);if(o.length===0)return null;let i=["# prjct: heads-up for this commit",""];i.push(`${o.length} anti-pattern/gotcha entr${o.length===1?"y":"ies"} match the staged files.`),i.push(""),i.push(xt(o)),i.push(""),i.push("> Nudge, not block. Proceed if you think it still applies.");let a=i.join(`
1572
- `);return a.length>hT?`${a.slice(0,hT-20)}
1573
- \u2026 [truncated]`:a}function UI(s=process.cwd()){return St({event:"PreToolUse",projectPath:s,build:c(async(e,t)=>{let n=e.tool_input?.command??"";return/\bgit\s+commit\b/.test(n)?HI(t):null},"build")})}var hT,OI,wT=h(()=>{"use strict";re();$e();cs();hT=1200,OI=3;c(NI,"stagedFiles");c(LI,"pathFragments");c(FI,"mentionsFragment");c(HI,"buildPreCommitContext");c(UI,"runPreCommitHook")});var kT={};D(kT,{runPostEditHook:()=>WI});function WI(s=process.cwd()){return St({event:"PostToolUse",projectPath:s,afterEmit:c(async(e,t)=>{let n=e.tool_input?.file_path;if(!(!n||!(await I.readConfig(t))?.projectId))try{await it.log(t,"post_edit",{file:n,tool:e.tool_name??"unknown"})}catch{}},"afterEmit")})}var vT=h(()=>{"use strict";re();Kn();cs();c(WI,"runPostEditHook")});import GI from"node:crypto";import BI from"node:fs/promises";async function TT(s,e,t){let n="";try{n=await BI.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}let r=zI(n),o=KI(r);if(o.length===0)return{signalsRecorded:0,signalsSkipped:0};let i=t_(s),a=0,l=0;for(let u of o.slice(0,VI)){let d=e_(u.excerpt);if(i.has(d)){l++;continue}try{await J.remember(s,{type:"improvement-signal",content:ZI(u),tags:{source:ST,category:u.category,...t?{session:t}:{},key:d.slice(0,12)},provenance:"extracted"}),a++}catch{l++}}return{signalsRecorded:a,signalsSkipped:l}}function zI(s){let e=[];for(let t of s.split(`
1574
- `))if(t.trim())try{e.push(JSON.parse(t))}catch{}return e}function KI(s){let e=[],t="";for(let n of s){let r=n.role??n.message?.role,o=QI(n.content??n.message?.content);if(!o)continue;if(r==="assistant"){t=o;continue}if(r!=="user")continue;let i=o.slice(0,300),a=YI(i);a&&e.push({excerpt:o.slice(0,bT).trim(),category:a,precedingAssistantPreview:t.slice(0,bT).trim()})}return e}function YI(s){return XI.some(e=>e.test(s))?"complaint":qI.some(e=>e.test(s))?"negation":JI.some(e=>e.test(s))?"correction":null}function QI(s){return typeof s=="string"?s:Array.isArray(s)?s.map(e=>{if(typeof e=="string")return e;if(e&&typeof e=="object"&&"text"in e){let t=e.text;return typeof t=="string"?t:""}return""}).join(`
1575
- `).trim():""}function ZI(s){return[`[${s.category}] User pushback: "${s.excerpt}"`,s.precedingAssistantPreview?`Following assistant action: "${s.precedingAssistantPreview.slice(0,200)}"`:null].filter(t=>!!t).join(`
1576
- `)}function e_(s){let e=s.toLowerCase().replace(/\s+/g," ").trim();return GI.createHash("sha256").update(e).digest("hex")}function t_(s){try{let e=n_(s);if(!e)return new Set;let t=J.recall(e,{types:["improvement-signal"],tags:{source:ST},limit:100,dedupeByKey:!1}),n=new Set;for(let r of t){let o=r.tags.key;o&&n.add(o)}return n}catch{return new Set}}function n_(s){try{let e=qe("node:fs"),n=qe("node:path").join(s,".prjct","prjct.config.json"),r=e.readFileSync(n,"utf-8");return JSON.parse(r).projectId??null}catch{return null}}var ST,VI,bT,qI,JI,XI,ET=h(()=>{"use strict";$e();ST="friction-detector",VI=5,bT=400,qI=[/^\s*no[,.!\s]/i,/^\s*nope\b/i,/^\s*así no\b/i,/^\s*espera\b/i,/^\s*stop\b/i,/^\s*wait\b/i,/^\s*cancel\b/i],JI=[/\bshould be\b/i,/\brather than\b/i,/\binstead\b/i,/\bmás bien\b/i,/\ben realidad\b/i],XI=[/\bdoesn'?t work\b/i,/\bno funciona\b/i,/\bbroken\b/i,/\bestá roto\b/i,/\bagain\b.*\bsame\b/i];c(TT,"detectFriction");c(zI,"parseJsonl");c(KI,"extractSignals");c(YI,"classify");c(QI,"textOf");c(ZI,"formatSignal");c(e_,"hashSignal");c(t_,"projectMemoryHashes");c(n_,"projectIdFromPath")});import{execFile as s_}from"node:child_process";import r_ from"node:path";import{promisify as o_}from"node:util";async function AT(s){let e={scanned:0,hotFiles:[],persisted:0,skipped:[],errors:[]},t=await I.readConfig(s).catch(()=>null);if(!t?.projectId)return e.errors.push("no project config"),e;try{let n=await m_(s);if(e.scanned+=n.length,e.hotFiles=n,n.length>0){let r=w_(t.projectId);for(let o of n){if(r.has(o.path)){e.skipped.push({reason:"already-marked-this-window",file:o.path});continue}try{await J.remember(s,{type:"learning",content:`Hot file: \`${o.path}\` \u2014 ${o.touches} touches in the last ${_c} days. Worth a refactor pass or a deliberate decision about why it churns this often.`,tags:{source:RT,pattern:i_,file:o.path,touches:String(o.touches),window_days:String(_c)},provenance:"inferred"}),e.persisted+=1}catch(i){e.errors.push(`remember failed for ${o.path}: ${i.message}`)}}}}catch(n){e.errors.push(`hot-file detection failed: ${n.message}`)}try{let n=f_(t.projectId);if(n.length>0){let r=k_(t.projectId);for(let o of n){if(r.has(o.topic)){e.skipped.push({reason:"recurring-bug-already-marked",file:o.topic});continue}try{await J.remember(s,{type:"learning",content:`Recurring bug pattern: gotchas tagged \`topic:${o.topic}\` reported ${o.occurrences} times in the last ${Dc} days. Likely a real underlying issue \u2014 consider a focused investigation before patching the next instance.`,tags:{source:PT,pattern:a_,topic:o.topic,occurrences:String(o.occurrences),window_days:String(Dc)},provenance:"inferred"}),e.persisted+=1}catch(i){e.errors.push(`remember failed for recurring ${o.topic}: ${i.message}`)}}}}catch(n){e.errors.push(`recurring-bug detection failed: ${n.message}`)}try{let n=await h_(s);if(n.totalCount>0){let r=y_(t.projectId),o=n.totalCount-r;if(r>0&&o>=d_)try{await J.remember(s,{type:"learning",content:`Tech debt growing: TODO/FIXME/XXX count rose by ${o} (now ${n.totalCount}, was ${r}). Consider a focused debt-reduction pass before adding more features.`,tags:{source:xT,pattern:c_,total:String(n.totalCount),previous:String(r),delta:String(o)},provenance:"inferred"}),e.persisted+=1}catch(i){e.errors.push(`remember failed for tech-debt: ${i.message}`)}}}catch(n){e.errors.push(`tech-debt detection failed: ${n.message}`)}return e}async function m_(s){let{stdout:e}=await CT("git",["log",`--since=${_c}.days.ago`,"--name-only","--pretty=format:","-z"],{cwd:s,maxBuffer:16777216}),t=new Map;for(let r of e.split("\0")){let o=r.trim();o&&(g_(o)||t.set(o,(t.get(o)??0)+1))}let n=[];for(let[r,o]of t)o<l_||n.push({path:r,touches:o});return n.sort((r,o)=>o.touches-r.touches),n}function g_(s){let e=r_.basename(s);for(let t of p_)if(t.test(s)||t.test(e))return!0;return!1}function f_(s){try{let{prjctDb:e}=(Y(),st(bs)),t=new Date(Date.now()-Dc*24*60*60*1e3).toISOString(),n=e.query(s,"SELECT data, timestamp FROM events WHERE type = 'memory.remember.gotcha' AND timestamp >= ? ORDER BY id DESC LIMIT 500",t),r=new Map;for(let i of n){let a;try{a=JSON.parse(i.data)}catch{continue}if(!a||typeof a!="object")continue;let l=a.tags;if(!l||l.source==="transcript-auto")continue;let u=typeof l.topic=="string"?l.topic:void 0,d=typeof l.area=="string"?l.area:void 0,p=u??d;p&&r.set(p,(r.get(p)??0)+1)}let o=[];for(let[i,a]of r)a<u_||o.push({topic:i,occurrences:a});return o.sort((i,a)=>a.occurrences-i.occurrences),o}catch{return[]}}async function h_(s){try{let{stdout:e}=await CT("git",["grep","-cE","\\b(TODO|FIXME|XXX)\\b"],{cwd:s,maxBuffer:16777216}),t=0;for(let n of e.split(`
1577
- `)){let r=n.lastIndexOf(":");if(r<=0)continue;let o=Number.parseInt(n.slice(r+1),10);Number.isFinite(o)&&(t+=o)}return{totalCount:t}}catch(e){if(e.code===1)return{totalCount:0};throw e}}function y_(s){try{let{prjctDb:e}=(Y(),st(bs)),t=e.query(s,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 50");for(let n of t){let r;try{r=JSON.parse(n.data)}catch{continue}if(!r||typeof r!="object")continue;let o=r.tags;if(!o||o.source!==xT)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}function w_(s){let e=new Set;try{let{prjctDb:t}=(Y(),st(bs)),n=t.query(s,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),r=Date.now()-_c*24*60*60*1e3;for(let o of n){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==RT)continue;let l=a.file,u=i.rememberedAt;if(typeof l=="string"){if(typeof u=="string"){let d=Date.parse(u);if(!Number.isNaN(d)&&d<r)continue}e.add(l)}}}catch{}return e}function k_(s){let e=new Set;try{let{prjctDb:t}=(Y(),st(bs)),n=t.query(s,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),r=Date.now()-Dc*24*60*60*1e3;for(let o of n){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==PT)continue;let l=a.topic,u=i.rememberedAt;if(typeof l=="string"){if(typeof u=="string"){let d=Date.parse(u);if(!Number.isNaN(d)&&d<r)continue}e.add(l)}}}catch{}return e}var CT,i_,RT,a_,PT,c_,xT,_c,l_,Dc,u_,d_,p_,jT=h(()=>{"use strict";re();$e();CT=o_(s_),i_="hot-file",RT="pattern-detector-auto",a_="recurring-bug",PT="pattern-detector-recurring",c_="tech-debt-growth",xT="pattern-detector-debt",_c=7,l_=3,Dc=30,u_=2,d_=5,p_=[/^package(-lock)?\.json$/,/^bun\.lock(b)?$/,/^pnpm-lock\.yaml$/,/^yarn\.lock$/,/^CHANGELOG\.md$/,/^\.gitignore$/,/\.snap$/,/^dist\//,/^node_modules\//];c(AT,"detectAndPersistPatterns");c(m_,"detectHotFiles");c(g_,"isIgnored");c(f_,"detectRecurringBugs");c(h_,"measureTechDebt");c(y_,"collectPreviousDebtSnapshot");c(w_,"collectAlreadyMarkedHotFiles");c(k_,"collectAlreadyMarkedRecurringBugs")});import ai from"node:fs/promises";import v_ from"node:os";import $m from"node:path";function S_(s=process.env){let e=(s.PRJCT_CLEANUP_AGGRESSIVENESS??"standard").toLowerCase();return b_[e==="conservative"||e==="standard"||e==="aggressive"?e:"standard"]}async function T_(s,e){let t=Date.now()-e*24*60*60*1e3,r=J.recall(s,{types:["inbox"],limit:200}).filter(i=>Date.parse(i.rememberedAt)<t);if(r.length===0)return 0;let o=0;for(let i of r)try{dt.archive(s,{entityType:"memory_entry",entityId:i.id,entityData:{type:i.type,content:i.content,tags:i.tags,rememberedAt:i.rememberedAt},summary:i.content.slice(0,80),reason:`inbox-age-out (>${e}d)`});let a=i.id.startsWith("mem_")?i.id.slice(4):null;a&&A.run(s,"UPDATE events SET type = ? WHERE id = ?","memory.archived.inbox",Number(a)),o++}catch{}return o}async function E_(s,e){if(e===null)return 0;let t=$m.join(_.getGlobalProjectPath(s),"checkpoints"),n=[];try{n=await ai.readdir(t)}catch{return 0}let r=Date.now()-e*24*60*60*1e3,o=0;for(let i of n){if(!i.endsWith(".json"))continue;let a=$m.join(t,i);try{(await ai.stat(a)).mtimeMs<r&&(await ai.unlink(a),o++)}catch{}}return o}async function C_(){let s=$m.join(v_.homedir(),".prjct-cli","state","context7-verify.json");try{let e=await ai.stat(s);if((Date.now()-e.mtimeMs)/(24*60*60*1e3)>7)return await ai.unlink(s),!0}catch{}return!1}async function $T(s){let e=S_(),t={inboxArchived:0,archivesPruned:0,checkpointsRemoved:0,context7CacheRotated:!1};try{t.inboxArchived=await T_(s,e.inboxDays)}catch{}try{t.archivesPruned=dt.pruneOldArchives(s,e.archivesDays)}catch{}try{t.checkpointsRemoved=await E_(s,e.checkpointsDays)}catch{}try{t.context7CacheRotated=await C_()}catch{}return t}async function IT(s,e){if(e.inboxArchived+e.archivesPruned+e.checkpointsRemoved+(e.context7CacheRotated?1:0)===0)return;let n=[e.inboxArchived>0?`${e.inboxArchived} inbox archived`:null,e.archivesPruned>0?`${e.archivesPruned} archives pruned`:null,e.checkpointsRemoved>0?`${e.checkpointsRemoved} checkpoints removed`:null,e.context7CacheRotated?"context7 cache rotated":null].filter(r=>!!r).join(", ");A.appendEvent(s,"memory.remember.system-event",{content:`Session cleanup: ${n}`,tags:{source:"session-cleanup",key:"last-cleanup"},provenance:"extracted"})}var b_,_T=h(()=>{"use strict";ge();$e();Xn();Y();b_={conservative:{inboxDays:30,archivesDays:180,checkpointsDays:null},standard:{inboxDays:14,archivesDays:90,checkpointsDays:30},aggressive:{inboxDays:7,archivesDays:30,checkpointsDays:14}};c(S_,"resolveProfile");c(T_,"archiveAgedInbox");c(E_,"pruneOldCheckpoints");c(C_,"rotateContext7Cache");c($T,"runSessionCleanup");c(IT,"recordCleanupReport")});import R_ from"node:crypto";import P_ from"node:fs/promises";async function FT(s,e,t){let n="";try{n=await P_.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}let r=B_(s);if(!r)return{signalsRecorded:0,signalsSkipped:0};let o=N_(O_(n));if(!o)return{signalsRecorded:0,signalsSkipped:0};let i;try{i=W_(r,t)}catch{return{signalsRecorded:0,signalsSkipped:0}}if(i.length===0)return{signalsRecorded:0,signalsSkipped:0};let a=[];try{a=await ck(s)}catch{a=[]}let l=new Set;try{let g=Date.now()-I_;for(let k of oc.list(r))if(!(Date.parse(k.ended_at)<=g))for(let E of k.files_touched)l.add(E)}catch{l=new Set}let u=M_(o,a,i,l);if(u.length===0)return{signalsRecorded:0,signalsSkipped:0};let d=G_(r),p=0,m=0;for(let g of u.slice(0,x_)){let k=U_(g.memId,g.excerpt).slice(0,12);if(d.has(k)){m++;continue}try{await J.remember(s,{type:"improvement-signal",content:H_(g),tags:{source:OT,kind:"skill-miss",category:"skill-miss",relates:g.memId,file:g.evidenceFile,key:k,...t?{session:t}:{}},provenance:"extracted"}),p++}catch{m++}}return{signalsRecorded:p,signalsSkipped:m}}function M_(s,e,t,n=new Set){let r=DT(s);if(r.size===0)return[];let o=e.filter(l=>!n.has(l)),i=Mc(o),a=[];for(let l of t){let u=DT(`${l.content} ${l.fileTag}`);if(u.size===0)continue;let d=l.fileTag!==""&&o.some(y=>MT(y,l.fileTag))||[...i].some(y=>u.has(y)),p=F_(u),m=0;for(let y of u)p.has(y)||r.has(y)&&m++;if(!(d||m>=__)||[...p].some(y=>r.has(y)))continue;let E=l.fileTag!==""&&o.some(y=>MT(y,l.fileTag))?l.fileTag:o.find(y=>[...Mc([y])].some(w=>u.has(w)))??"";a.push({miss:{memId:l.id,memType:l.type,excerpt:l.content.replace(/\s+/g," ").trim().slice(0,A_),evidenceFile:E,reason:d?"path-overlap-unused":"topic-overlap-unused"},rank:d?2:1,overlap:m})}return a.sort((l,u)=>u.rank-l.rank||u.overlap-l.overlap),a.map(l=>l.miss)}function O_(s){let e=[];for(let t of s.split(`
1578
- `))if(t.trim())try{e.push(JSON.parse(t))}catch{}return e}function N_(s){let e=[];for(let t of s){let n=t.role??t.message?.role;if(n!=="user"&&n!=="assistant")continue;let r=L_(t.content??t.message?.content);r&&e.push(r)}return e.join(`
1579
- `).toLowerCase()}function L_(s){return typeof s=="string"?s:Array.isArray(s)?s.map(e=>{if(typeof e=="string")return e;if(e&&typeof e=="object"&&"text"in e){let t=e.text;return typeof t=="string"?t:""}return""}).join(`
1580
- `).trim():""}function DT(s){let e=new Set;for(let t of s.toLowerCase().split(/[^a-z0-9]+/))t.length<NT||LT.has(t)||e.add(t);return e}function F_(s){let e=[...s].filter(n=>n.length>=D_);if(e.length>0)return new Set(e);let t="";for(let n of s)(n.length>t.length||n.length===t.length&&n<t)&&(t=n);return t?new Set([t]):new Set}function Mc(s){let e=new Set;for(let t of s)for(let n of t.split("/")){let r=n.replace(/\.[a-z0-9]+$/i,"").toLowerCase();r.length>=NT&&!LT.has(r)&&e.add(r)}return e}function MT(s,e){let t=Mc([s]);for(let n of Mc([e]))if(t.has(n))return!0;return!1}function H_(s){let e=s.evidenceFile!==""?`touched \`${s.evidenceFile}\``:"worked the same area";return[`[skill-miss] Unused project knowledge (${s.memType}, ${s.memId}): "${s.excerpt}"`,`This session ${e} but never referenced it. Apply it, or supersede it via: prjct remember decision "<resolution>" --tags resolves:skill-miss,relates:${s.memId}`].join(`
1581
- `)}function U_(s,e){let t=`${s}::${e.toLowerCase().replace(/\s+/g," ").trim()}`;return R_.createHash("sha256").update(t).digest("hex")}function W_(s,e){let t=J.recall(s,{types:[...j_],limit:120}),n=Date.now()-$_,r=[];for(let o of t)o.provenance!=="inferred"&&(Date.parse(o.rememberedAt)>n||e&&o.tags.session===e||r.push({id:o.id,type:o.type,content:o.content,fileTag:o.tags.file??"",rememberedAt:o.rememberedAt,provenance:o.provenance,session:o.tags.session??""}));return r}function G_(s){try{let e=J.recall(s,{types:["improvement-signal"],tags:{source:OT},limit:100,dedupeByKey:!1}),t=new Set;for(let n of e)n.tags.key&&t.add(n.tags.key);return t}catch{return new Set}}function B_(s){try{let e=qe("node:fs"),n=qe("node:path").join(s,".prjct","prjct.config.json");return JSON.parse(e.readFileSync(n,"utf-8")).projectId??null}catch{return null}}var OT,x_,A_,j_,$_,I_,__,NT,D_,LT,HT=h(()=>{"use strict";$e();Ka();ic();OT="skill-miss-detector",x_=3,A_=280,j_=["decision","gotcha","anti-pattern"],$_=90*60*1e3,I_=6*60*60*1e3,__=2,NT=5,D_=8,LT=new Set(["should","because","project","prjct","instead","always","never","using","value","state","change","changes","update","updated","function","return","returns","error","errors","tests","testing","config","default","import","export","before","after","without"]);c(FT,"detectSkillMisses");c(M_,"analyze");c(O_,"parseJsonl");c(N_,"transcriptTextOf");c(L_,"textOf");c(DT,"tokenize");c(F_,"signatureOf");c(Mc,"fileStems");c(MT,"sharesStem");c(H_,"formatSkillMiss");c(U_,"hashKey");c(W_,"recallCandidates");c(G_,"existingSkillMissKeys");c(B_,"projectIdFromPath")});import V_ from"node:crypto";import q_ from"node:fs/promises";async function VT(s,e,t){let n={scanned:0,ingested:0,skipped:[],errors:[]},r=await I.readConfig(s).catch(()=>null);if(!r?.projectId)return n.errors.push("no project config"),n;let o;try{o=await q_.readFile(e,"utf-8")}catch(d){return n.errors.push(`transcript read failed: ${d.message}`),n}let i=z_(o);if(n.scanned=i.length,i.length===0)return n;let a=Q_(i);if(a.length===0)return n;let l=tD(r.projectId),u=t?t.slice(0,12):"unknown";for(let d of a){if(l.has(d.hash)){n.skipped.push({reason:"duplicate",phrase:d.matchedPhrase});continue}try{await J.remember(s,{type:d.type,content:d.content,tags:{source:GT,session:u,hash:d.hash,phrase:d.matchedPhrase},provenance:"inferred"}),n.ingested+=1}catch(p){n.errors.push(`remember failed: ${p.message}`)}}return n}function z_(s){let e=[];for(let t of s.split(`
1582
- `)){let n=t.trim();if(!n)continue;let r;try{r=JSON.parse(n)}catch{continue}let o=K_(r);if(o!=="assistant")continue;let i=Y_(r);!i||i.length<BT||e.push({role:o,text:i})}return e}function K_(s){let e=s.role;if(typeof e=="string")return WT(e);let t=s.message;if(t&&typeof t=="object"&&"role"in t){let r=t.role;if(typeof r=="string")return WT(r)}let n=s.type;return n==="assistant"||n==="user"||n==="system"?n:null}function WT(s){let e=s.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}function Y_(s){let e=s.content;if(e===void 0&&s.message&&typeof s.message=="object"&&(e=s.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n;r.type==="text"&&typeof r.text=="string"&&t.push(r.text)}return t.join(`
1583
- `).trim()}return""}function Q_(s){let e=[],t=new Set;for(let n of s){let r=Z_(n.text);for(let o of r){if(e.length>=J_)return e;if(o.length<BT)continue;let i=o.toLowerCase(),a=X_.find(d=>i.includes(d.phrase));if(!a)continue;let l=o.length>UT?`${o.slice(0,UT)}\u2026`:o,u=eD(l);t.has(u)||(t.add(u),e.push({type:a.type,content:l,hash:u,matchedPhrase:a.phrase}))}}return e}function Z_(s){return s.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}function eD(s){return V_.createHash("sha256").update(s.toLowerCase().trim()).digest("hex").slice(0,16)}function tD(s){let e=new Set;try{let{prjctDb:t}=(Y(),st(bs)),n=t.query(s,"SELECT data FROM events WHERE type LIKE 'memory.remember.%' ORDER BY id DESC LIMIT 500");for(let r of n){let o;try{o=JSON.parse(r.data)}catch{continue}if(!o||typeof o!="object")continue;let i=o.tags;if(!i||i.source!==GT)continue;let a=i.hash;typeof a=="string"&&e.add(a)}}catch{}return e}var GT,BT,UT,J_,X_,qT=h(()=>{"use strict";re();$e();GT="transcript-auto",BT=80,UT=1500,J_=12,X_=[{phrase:"decided to",type:"decision"},{phrase:"we chose",type:"decision"},{phrase:"going with",type:"decision"},{phrase:"the right call",type:"decision"},{phrase:"best approach is",type:"decision"},{phrase:"turns out that",type:"learning"},{phrase:"now i understand",type:"learning"},{phrase:"the key insight",type:"learning"},{phrase:"i learned that",type:"learning"},{phrase:"discovered that",type:"learning"},{phrase:"gotcha:",type:"gotcha"},{phrase:"bug:",type:"gotcha"},{phrase:"fails when",type:"gotcha"},{phrase:"breaks when",type:"gotcha"},{phrase:"be careful",type:"gotcha"}];c(VT,"ingestTranscript");c(z_,"parseTranscript");c(K_,"inferRole");c(WT,"normalizeRole");c(Y_,"extractText");c(Q_,"extractCandidates");c(Z_,"splitParagraphs");c(eD,"hashContent");c(tD,"collectExistingAutoHashes")});var JT={};D(JT,{runStopHook:()=>nD});function nD(s=process.cwd()){return St({event:"Stop",projectPath:s,afterEmit:c(async(e,t)=>{let n=await I.readConfig(t).catch(()=>null);if(n?.projectId){try{await np(t)}catch{}try{await rp(t)}catch{}if(e.transcript_path)try{await VT(t,e.transcript_path,e.session_id??null)}catch{}try{await AT(t)}catch{}try{let r=await $T(n.projectId);await IT(n.projectId,r)}catch{}if(e.transcript_path)try{await TT(t,e.transcript_path,e.session_id??null)}catch{}if(e.transcript_path)try{await FT(t,e.transcript_path,e.session_id??null)}catch{}await zo(t,n.projectId).catch(()=>{})}},"afterEmit")})}var XT=h(()=>{"use strict";re();ET();jT();_T();HT();qT();Mn();sc();cs();c(nD,"runStopHook")});var zT={};D(zT,{runSubagentStartHook:()=>sD});function sD(s=process.cwd()){return St({event:"SubagentStart",projectPath:s,build:c((e,t)=>eo(t),"build")})}var KT=h(()=>{"use strict";cs();$c();c(sD,"runSubagentStartHook")});var YT={};D(YT,{runCwdChangedHook:()=>rD});function rD(s=process.cwd()){return St({event:"CwdChanged",projectPath:s,build:c(async(e,t)=>{let n=e.cwd||t;return eo(n)},"build")})}var QT=h(()=>{"use strict";cs();$c();c(rD,"runCwdChangedHook")});var eE={};D(eE,{CrewCommands:()=>Mm});import tn from"node:fs/promises";import nn from"node:path";function iD(s,e){let t=s.indexOf(Im),n=s.indexOf(oD);if(t<0||n<0||n<t)throw new Error("reviewer template is missing the prjct:checkpoints marker pair \u2014 rebuild dist/templates.json or report a bug");if(s.indexOf(Im,t+1)>=0)throw new Error("reviewer template has duplicated checkpoints start marker");let r=s.slice(0,t+Im.length),o=s.slice(n);return`${r}
1567
+ `)}function dT(s){if(!s)return"unknown";let e=Date.parse(s);if(Number.isNaN(e))return"unknown";let t=Math.max(0,Math.floor((Date.now()-e)/1e3));if(t<60)return"just now";let n=Math.floor(t/60);if(n<60)return`${n}m ago`;let r=Math.floor(n/60);if(r<24)return`${r}h ago`;let o=Math.floor(r/24);return o<30?`${o}d ago`:`${Math.floor(o/30)}mo ago`}function MI(s=process.cwd()){return St({event:"UserPromptSubmit",projectPath:s,build:c(async(e,t)=>{let n=(e.prompt??"").trim();if(!n)return null;let[r,o,i]=await Promise.all([mT(t),$I(t,n),gT(t)]),a=[r,i,o].filter(u=>!!u);if(a.length===0)return null;let l=a.join(`
1568
+
1569
+ `);return ai(l,pT)},"build")})}var pT,uT,_I,DI,hT=h(()=>{"use strict";re();$e();Ps();pt();Fe();V();cs();Ic();pT=1800,uT=4;c($I,"buildPromptContext");c(mT,"buildProjectState");c(II,"captureGit");_I=3,DI=2;c(gT,"buildImprovementSignals");c(dT,"formatRelative");c(MI,"runPromptHook")});var yT={};D(yT,{runPreCommitHook:()=>GI});import{execSync as OI}from"node:child_process";function FI(s){try{return OI("git diff --cached --name-only",{cwd:s,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
1570
+ `).map(e=>e.trim()).filter(Boolean)}catch{return[]}}function HI(s){let e=new Set;for(let t of s){let n=t.split("/").filter(Boolean);for(let r of n){let o=r.replace(/\.[^.]+$/,"").toLowerCase();o.length>=3&&e.add(o)}}return[...e]}function UI(s,e){let t=s.content.toLowerCase();if(e.some(n=>t.includes(n)))return!0;for(let n of Object.values(s.tags)){let r=n.toLowerCase();if(e.some(o=>r.includes(o)))return!0}return!1}async function WI(s){let e=await I.readConfig(s);if(!e?.projectId)return null;let t=FI(s);if(t.length===0)return null;let n=HI(t);if(n.length===0)return null;let r;try{r=J.recall(e.projectId,{types:["anti-pattern","gotcha"],limit:50})}catch{return null}let o=r.filter(l=>UI(l,n)).slice(0,LI);if(o.length===0)return null;let i=["# prjct: heads-up for this commit",""];i.push(`${o.length} anti-pattern/gotcha entr${o.length===1?"y":"ies"} match the staged files.`),i.push(""),i.push(xt(o)),i.push(""),i.push("> Nudge, not block. Proceed if you think it still applies.");let a=i.join(`
1571
+ `);return ai(a,NI)}function GI(s=process.cwd()){return St({event:"PreToolUse",projectPath:s,build:c(async(e,t)=>{let n=e.tool_input?.command??"";return/\bgit\s+commit\b/.test(n)?WI(t):null},"build")})}var NI,LI,wT=h(()=>{"use strict";re();$e();cs();Ic();NI=1200,LI=3;c(FI,"stagedFiles");c(HI,"pathFragments");c(UI,"mentionsFragment");c(WI,"buildPreCommitContext");c(GI,"runPreCommitHook")});var kT={};D(kT,{runPostEditHook:()=>BI});function BI(s=process.cwd()){return St({event:"PostToolUse",projectPath:s,afterEmit:c(async(e,t)=>{let n=e.tool_input?.file_path;if(!(!n||!(await I.readConfig(t))?.projectId))try{await it.log(t,"post_edit",{file:n,tool:e.tool_name??"unknown"})}catch{}},"afterEmit")})}var vT=h(()=>{"use strict";re();Kn();cs();c(BI,"runPostEditHook")});import VI from"node:crypto";import qI from"node:fs/promises";async function TT(s,e,t){let n="";try{n=await qI.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}let r=YI(n),o=QI(r);if(o.length===0)return{signalsRecorded:0,signalsSkipped:0};let i=s_(s),a=0,l=0;for(let u of o.slice(0,JI)){let d=n_(u.excerpt);if(i.has(d)){l++;continue}try{await J.remember(s,{type:"improvement-signal",content:t_(u),tags:{source:ST,category:u.category,...t?{session:t}:{},key:d.slice(0,12)},provenance:"extracted"}),a++}catch{l++}}return{signalsRecorded:a,signalsSkipped:l}}function YI(s){let e=[];for(let t of s.split(`
1572
+ `))if(t.trim())try{e.push(JSON.parse(t))}catch{}return e}function QI(s){let e=[],t="";for(let n of s){let r=n.role??n.message?.role,o=e_(n.content??n.message?.content);if(!o)continue;if(r==="assistant"){t=o;continue}if(r!=="user")continue;let i=o.slice(0,300),a=ZI(i);a&&e.push({excerpt:o.slice(0,bT).trim(),category:a,precedingAssistantPreview:t.slice(0,bT).trim()})}return e}function ZI(s){return KI.some(e=>e.test(s))?"complaint":XI.some(e=>e.test(s))?"negation":zI.some(e=>e.test(s))?"correction":null}function e_(s){return typeof s=="string"?s:Array.isArray(s)?s.map(e=>{if(typeof e=="string")return e;if(e&&typeof e=="object"&&"text"in e){let t=e.text;return typeof t=="string"?t:""}return""}).join(`
1573
+ `).trim():""}function t_(s){return[`[${s.category}] User pushback: "${s.excerpt}"`,s.precedingAssistantPreview?`Following assistant action: "${s.precedingAssistantPreview.slice(0,200)}"`:null].filter(t=>!!t).join(`
1574
+ `)}function n_(s){let e=s.toLowerCase().replace(/\s+/g," ").trim();return VI.createHash("sha256").update(e).digest("hex")}function s_(s){try{let e=r_(s);if(!e)return new Set;let t=J.recall(e,{types:["improvement-signal"],tags:{source:ST},limit:100,dedupeByKey:!1}),n=new Set;for(let r of t){let o=r.tags.key;o&&n.add(o)}return n}catch{return new Set}}function r_(s){try{let e=qe("node:fs"),n=qe("node:path").join(s,".prjct","prjct.config.json"),r=e.readFileSync(n,"utf-8");return JSON.parse(r).projectId??null}catch{return null}}var ST,JI,bT,XI,zI,KI,ET=h(()=>{"use strict";$e();ST="friction-detector",JI=5,bT=400,XI=[/^\s*no[,.!\s]/i,/^\s*nope\b/i,/^\s*así no\b/i,/^\s*espera\b/i,/^\s*stop\b/i,/^\s*wait\b/i,/^\s*cancel\b/i],zI=[/\bshould be\b/i,/\brather than\b/i,/\binstead\b/i,/\bmás bien\b/i,/\ben realidad\b/i],KI=[/\bdoesn'?t work\b/i,/\bno funciona\b/i,/\bbroken\b/i,/\bestá roto\b/i,/\bagain\b.*\bsame\b/i];c(TT,"detectFriction");c(YI,"parseJsonl");c(QI,"extractSignals");c(ZI,"classify");c(e_,"textOf");c(t_,"formatSignal");c(n_,"hashSignal");c(s_,"projectMemoryHashes");c(r_,"projectIdFromPath")});import{execFile as o_}from"node:child_process";import i_ from"node:path";import{promisify as a_}from"node:util";async function AT(s){let e={scanned:0,hotFiles:[],persisted:0,skipped:[],errors:[]},t=await I.readConfig(s).catch(()=>null);if(!t?.projectId)return e.errors.push("no project config"),e;try{let n=await f_(s);if(e.scanned+=n.length,e.hotFiles=n,n.length>0){let r=v_(t.projectId);for(let o of n){if(r.has(o.path)){e.skipped.push({reason:"already-marked-this-window",file:o.path});continue}try{await J.remember(s,{type:"learning",content:`Hot file: \`${o.path}\` \u2014 ${o.touches} touches in the last ${Dc} days. Worth a refactor pass or a deliberate decision about why it churns this often.`,tags:{source:RT,pattern:c_,file:o.path,touches:String(o.touches),window_days:String(Dc)},provenance:"inferred"}),e.persisted+=1}catch(i){e.errors.push(`remember failed for ${o.path}: ${i.message}`)}}}}catch(n){e.errors.push(`hot-file detection failed: ${n.message}`)}try{let n=y_(t.projectId);if(n.length>0){let r=b_(t.projectId);for(let o of n){if(r.has(o.topic)){e.skipped.push({reason:"recurring-bug-already-marked",file:o.topic});continue}try{await J.remember(s,{type:"learning",content:`Recurring bug pattern: gotchas tagged \`topic:${o.topic}\` reported ${o.occurrences} times in the last ${Mc} days. Likely a real underlying issue \u2014 consider a focused investigation before patching the next instance.`,tags:{source:PT,pattern:l_,topic:o.topic,occurrences:String(o.occurrences),window_days:String(Mc)},provenance:"inferred"}),e.persisted+=1}catch(i){e.errors.push(`remember failed for recurring ${o.topic}: ${i.message}`)}}}}catch(n){e.errors.push(`recurring-bug detection failed: ${n.message}`)}try{let n=await w_(s);if(n.totalCount>0){let r=k_(t.projectId),o=n.totalCount-r;if(r>0&&o>=m_)try{await J.remember(s,{type:"learning",content:`Tech debt growing: TODO/FIXME/XXX count rose by ${o} (now ${n.totalCount}, was ${r}). Consider a focused debt-reduction pass before adding more features.`,tags:{source:xT,pattern:u_,total:String(n.totalCount),previous:String(r),delta:String(o)},provenance:"inferred"}),e.persisted+=1}catch(i){e.errors.push(`remember failed for tech-debt: ${i.message}`)}}}catch(n){e.errors.push(`tech-debt detection failed: ${n.message}`)}return e}async function f_(s){let{stdout:e}=await CT("git",["log",`--since=${Dc}.days.ago`,"--name-only","--pretty=format:","-z"],{cwd:s,maxBuffer:16777216}),t=new Map;for(let r of e.split("\0")){let o=r.trim();o&&(h_(o)||t.set(o,(t.get(o)??0)+1))}let n=[];for(let[r,o]of t)o<d_||n.push({path:r,touches:o});return n.sort((r,o)=>o.touches-r.touches),n}function h_(s){let e=i_.basename(s);for(let t of g_)if(t.test(s)||t.test(e))return!0;return!1}function y_(s){try{let{prjctDb:e}=(Y(),st(bs)),t=new Date(Date.now()-Mc*24*60*60*1e3).toISOString(),n=e.query(s,"SELECT data, timestamp FROM events WHERE type = 'memory.remember.gotcha' AND timestamp >= ? ORDER BY id DESC LIMIT 500",t),r=new Map;for(let i of n){let a;try{a=JSON.parse(i.data)}catch{continue}if(!a||typeof a!="object")continue;let l=a.tags;if(!l||l.source==="transcript-auto")continue;let u=typeof l.topic=="string"?l.topic:void 0,d=typeof l.area=="string"?l.area:void 0,p=u??d;p&&r.set(p,(r.get(p)??0)+1)}let o=[];for(let[i,a]of r)a<p_||o.push({topic:i,occurrences:a});return o.sort((i,a)=>a.occurrences-i.occurrences),o}catch{return[]}}async function w_(s){try{let{stdout:e}=await CT("git",["grep","-cE","\\b(TODO|FIXME|XXX)\\b"],{cwd:s,maxBuffer:16777216}),t=0;for(let n of e.split(`
1575
+ `)){let r=n.lastIndexOf(":");if(r<=0)continue;let o=Number.parseInt(n.slice(r+1),10);Number.isFinite(o)&&(t+=o)}return{totalCount:t}}catch(e){if(e.code===1)return{totalCount:0};throw e}}function k_(s){try{let{prjctDb:e}=(Y(),st(bs)),t=e.query(s,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 50");for(let n of t){let r;try{r=JSON.parse(n.data)}catch{continue}if(!r||typeof r!="object")continue;let o=r.tags;if(!o||o.source!==xT)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}function v_(s){let e=new Set;try{let{prjctDb:t}=(Y(),st(bs)),n=t.query(s,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),r=Date.now()-Dc*24*60*60*1e3;for(let o of n){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==RT)continue;let l=a.file,u=i.rememberedAt;if(typeof l=="string"){if(typeof u=="string"){let d=Date.parse(u);if(!Number.isNaN(d)&&d<r)continue}e.add(l)}}}catch{}return e}function b_(s){let e=new Set;try{let{prjctDb:t}=(Y(),st(bs)),n=t.query(s,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),r=Date.now()-Mc*24*60*60*1e3;for(let o of n){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==PT)continue;let l=a.topic,u=i.rememberedAt;if(typeof l=="string"){if(typeof u=="string"){let d=Date.parse(u);if(!Number.isNaN(d)&&d<r)continue}e.add(l)}}}catch{}return e}var CT,c_,RT,l_,PT,u_,xT,Dc,d_,Mc,p_,m_,g_,jT=h(()=>{"use strict";re();$e();CT=a_(o_),c_="hot-file",RT="pattern-detector-auto",l_="recurring-bug",PT="pattern-detector-recurring",u_="tech-debt-growth",xT="pattern-detector-debt",Dc=7,d_=3,Mc=30,p_=2,m_=5,g_=[/^package(-lock)?\.json$/,/^bun\.lock(b)?$/,/^pnpm-lock\.yaml$/,/^yarn\.lock$/,/^CHANGELOG\.md$/,/^\.gitignore$/,/\.snap$/,/^dist\//,/^node_modules\//];c(AT,"detectAndPersistPatterns");c(f_,"detectHotFiles");c(h_,"isIgnored");c(y_,"detectRecurringBugs");c(w_,"measureTechDebt");c(k_,"collectPreviousDebtSnapshot");c(v_,"collectAlreadyMarkedHotFiles");c(b_,"collectAlreadyMarkedRecurringBugs")});import ci from"node:fs/promises";import S_ from"node:os";import $m from"node:path";function E_(s=process.env){let e=(s.PRJCT_CLEANUP_AGGRESSIVENESS??"standard").toLowerCase();return T_[e==="conservative"||e==="standard"||e==="aggressive"?e:"standard"]}async function C_(s,e){let t=Date.now()-e*24*60*60*1e3,r=J.recall(s,{types:["inbox"],limit:200}).filter(i=>Date.parse(i.rememberedAt)<t);if(r.length===0)return 0;let o=0;for(let i of r)try{dt.archive(s,{entityType:"memory_entry",entityId:i.id,entityData:{type:i.type,content:i.content,tags:i.tags,rememberedAt:i.rememberedAt},summary:i.content.slice(0,80),reason:`inbox-age-out (>${e}d)`});let a=i.id.startsWith("mem_")?i.id.slice(4):null;a&&A.run(s,"UPDATE events SET type = ? WHERE id = ?","memory.archived.inbox",Number(a)),o++}catch{}return o}async function R_(s,e){if(e===null)return 0;let t=$m.join(_.getGlobalProjectPath(s),"checkpoints"),n=[];try{n=await ci.readdir(t)}catch{return 0}let r=Date.now()-e*24*60*60*1e3,o=0;for(let i of n){if(!i.endsWith(".json"))continue;let a=$m.join(t,i);try{(await ci.stat(a)).mtimeMs<r&&(await ci.unlink(a),o++)}catch{}}return o}async function P_(){let s=$m.join(S_.homedir(),".prjct-cli","state","context7-verify.json");try{let e=await ci.stat(s);if((Date.now()-e.mtimeMs)/(24*60*60*1e3)>7)return await ci.unlink(s),!0}catch{}return!1}async function $T(s){let e=E_(),t={inboxArchived:0,archivesPruned:0,checkpointsRemoved:0,context7CacheRotated:!1};try{t.inboxArchived=await C_(s,e.inboxDays)}catch{}try{t.archivesPruned=dt.pruneOldArchives(s,e.archivesDays)}catch{}try{t.checkpointsRemoved=await R_(s,e.checkpointsDays)}catch{}try{t.context7CacheRotated=await P_()}catch{}return t}async function IT(s,e){if(e.inboxArchived+e.archivesPruned+e.checkpointsRemoved+(e.context7CacheRotated?1:0)===0)return;let n=[e.inboxArchived>0?`${e.inboxArchived} inbox archived`:null,e.archivesPruned>0?`${e.archivesPruned} archives pruned`:null,e.checkpointsRemoved>0?`${e.checkpointsRemoved} checkpoints removed`:null,e.context7CacheRotated?"context7 cache rotated":null].filter(r=>!!r).join(", ");A.appendEvent(s,"memory.remember.system-event",{content:`Session cleanup: ${n}`,tags:{source:"session-cleanup",key:"last-cleanup"},provenance:"extracted"})}var T_,_T=h(()=>{"use strict";ge();$e();Xn();Y();T_={conservative:{inboxDays:30,archivesDays:180,checkpointsDays:null},standard:{inboxDays:14,archivesDays:90,checkpointsDays:30},aggressive:{inboxDays:7,archivesDays:30,checkpointsDays:14}};c(E_,"resolveProfile");c(C_,"archiveAgedInbox");c(R_,"pruneOldCheckpoints");c(P_,"rotateContext7Cache");c($T,"runSessionCleanup");c(IT,"recordCleanupReport")});import x_ from"node:crypto";import A_ from"node:fs/promises";async function FT(s,e,t){let n="";try{n=await A_.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}let r=q_(s);if(!r)return{signalsRecorded:0,signalsSkipped:0};let o=F_(L_(n));if(!o)return{signalsRecorded:0,signalsSkipped:0};let i;try{i=B_(r,t)}catch{return{signalsRecorded:0,signalsSkipped:0}}if(i.length===0)return{signalsRecorded:0,signalsSkipped:0};let a=[];try{a=await ck(s)}catch{a=[]}let l=new Set;try{let g=Date.now()-D_;for(let k of ic.list(r))if(!(Date.parse(k.ended_at)<=g))for(let E of k.files_touched)l.add(E)}catch{l=new Set}let u=N_(o,a,i,l);if(u.length===0)return{signalsRecorded:0,signalsSkipped:0};let d=V_(r),p=0,m=0;for(let g of u.slice(0,j_)){let k=G_(g.memId,g.excerpt).slice(0,12);if(d.has(k)){m++;continue}try{await J.remember(s,{type:"improvement-signal",content:W_(g),tags:{source:OT,kind:"skill-miss",category:"skill-miss",relates:g.memId,file:g.evidenceFile,key:k,...t?{session:t}:{}},provenance:"extracted"}),p++}catch{m++}}return{signalsRecorded:p,signalsSkipped:m}}function N_(s,e,t,n=new Set){let r=DT(s);if(r.size===0)return[];let o=e.filter(l=>!n.has(l)),i=Oc(o),a=[];for(let l of t){let u=DT(`${l.content} ${l.fileTag}`);if(u.size===0)continue;let d=l.fileTag!==""&&o.some(y=>MT(y,l.fileTag))||[...i].some(y=>u.has(y)),p=U_(u),m=0;for(let y of u)p.has(y)||r.has(y)&&m++;if(!(d||m>=M_)||[...p].some(y=>r.has(y)))continue;let E=l.fileTag!==""&&o.some(y=>MT(y,l.fileTag))?l.fileTag:o.find(y=>[...Oc([y])].some(w=>u.has(w)))??"";a.push({miss:{memId:l.id,memType:l.type,excerpt:l.content.replace(/\s+/g," ").trim().slice(0,$_),evidenceFile:E,reason:d?"path-overlap-unused":"topic-overlap-unused"},rank:d?2:1,overlap:m})}return a.sort((l,u)=>u.rank-l.rank||u.overlap-l.overlap),a.map(l=>l.miss)}function L_(s){let e=[];for(let t of s.split(`
1576
+ `))if(t.trim())try{e.push(JSON.parse(t))}catch{}return e}function F_(s){let e=[];for(let t of s){let n=t.role??t.message?.role;if(n!=="user"&&n!=="assistant")continue;let r=H_(t.content??t.message?.content);r&&e.push(r)}return e.join(`
1577
+ `).toLowerCase()}function H_(s){return typeof s=="string"?s:Array.isArray(s)?s.map(e=>{if(typeof e=="string")return e;if(e&&typeof e=="object"&&"text"in e){let t=e.text;return typeof t=="string"?t:""}return""}).join(`
1578
+ `).trim():""}function DT(s){let e=new Set;for(let t of s.toLowerCase().split(/[^a-z0-9]+/))t.length<NT||LT.has(t)||e.add(t);return e}function U_(s){let e=[...s].filter(n=>n.length>=O_);if(e.length>0)return new Set(e);let t="";for(let n of s)(n.length>t.length||n.length===t.length&&n<t)&&(t=n);return t?new Set([t]):new Set}function Oc(s){let e=new Set;for(let t of s)for(let n of t.split("/")){let r=n.replace(/\.[a-z0-9]+$/i,"").toLowerCase();r.length>=NT&&!LT.has(r)&&e.add(r)}return e}function MT(s,e){let t=Oc([s]);for(let n of Oc([e]))if(t.has(n))return!0;return!1}function W_(s){let e=s.evidenceFile!==""?`touched \`${s.evidenceFile}\``:"worked the same area";return[`[skill-miss] Unused project knowledge (${s.memType}, ${s.memId}): "${s.excerpt}"`,`This session ${e} but never referenced it. Apply it, or supersede it via: prjct remember decision "<resolution>" --tags resolves:skill-miss,relates:${s.memId}`].join(`
1579
+ `)}function G_(s,e){let t=`${s}::${e.toLowerCase().replace(/\s+/g," ").trim()}`;return x_.createHash("sha256").update(t).digest("hex")}function B_(s,e){let t=J.recall(s,{types:[...I_],limit:120}),n=Date.now()-__,r=[];for(let o of t)o.provenance!=="inferred"&&(Date.parse(o.rememberedAt)>n||e&&o.tags.session===e||r.push({id:o.id,type:o.type,content:o.content,fileTag:o.tags.file??"",rememberedAt:o.rememberedAt,provenance:o.provenance,session:o.tags.session??""}));return r}function V_(s){try{let e=J.recall(s,{types:["improvement-signal"],tags:{source:OT},limit:100,dedupeByKey:!1}),t=new Set;for(let n of e)n.tags.key&&t.add(n.tags.key);return t}catch{return new Set}}function q_(s){try{let e=qe("node:fs"),n=qe("node:path").join(s,".prjct","prjct.config.json");return JSON.parse(e.readFileSync(n,"utf-8")).projectId??null}catch{return null}}var OT,j_,$_,I_,__,D_,M_,NT,O_,LT,HT=h(()=>{"use strict";$e();Ya();ac();OT="skill-miss-detector",j_=3,$_=280,I_=["decision","gotcha","anti-pattern"],__=90*60*1e3,D_=6*60*60*1e3,M_=2,NT=5,O_=8,LT=new Set(["should","because","project","prjct","instead","always","never","using","value","state","change","changes","update","updated","function","return","returns","error","errors","tests","testing","config","default","import","export","before","after","without"]);c(FT,"detectSkillMisses");c(N_,"analyze");c(L_,"parseJsonl");c(F_,"transcriptTextOf");c(H_,"textOf");c(DT,"tokenize");c(U_,"signatureOf");c(Oc,"fileStems");c(MT,"sharesStem");c(W_,"formatSkillMiss");c(G_,"hashKey");c(B_,"recallCandidates");c(V_,"existingSkillMissKeys");c(q_,"projectIdFromPath")});import J_ from"node:crypto";import X_ from"node:fs/promises";async function VT(s,e,t){let n={scanned:0,ingested:0,skipped:[],errors:[]},r=await I.readConfig(s).catch(()=>null);if(!r?.projectId)return n.errors.push("no project config"),n;let o;try{o=await X_.readFile(e,"utf-8")}catch(d){return n.errors.push(`transcript read failed: ${d.message}`),n}let i=Y_(o);if(n.scanned=i.length,i.length===0)return n;let a=eD(i);if(a.length===0)return n;let l=sD(r.projectId),u=t?t.slice(0,12):"unknown";for(let d of a){if(l.has(d.hash)){n.skipped.push({reason:"duplicate",phrase:d.matchedPhrase});continue}try{await J.remember(s,{type:d.type,content:d.content,tags:{source:GT,session:u,hash:d.hash,phrase:d.matchedPhrase},provenance:"inferred"}),n.ingested+=1}catch(p){n.errors.push(`remember failed: ${p.message}`)}}return n}function Y_(s){let e=[];for(let t of s.split(`
1580
+ `)){let n=t.trim();if(!n)continue;let r;try{r=JSON.parse(n)}catch{continue}let o=Q_(r);if(o!=="assistant")continue;let i=Z_(r);!i||i.length<BT||e.push({role:o,text:i})}return e}function Q_(s){let e=s.role;if(typeof e=="string")return WT(e);let t=s.message;if(t&&typeof t=="object"&&"role"in t){let r=t.role;if(typeof r=="string")return WT(r)}let n=s.type;return n==="assistant"||n==="user"||n==="system"?n:null}function WT(s){let e=s.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}function Z_(s){let e=s.content;if(e===void 0&&s.message&&typeof s.message=="object"&&(e=s.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n;r.type==="text"&&typeof r.text=="string"&&t.push(r.text)}return t.join(`
1581
+ `).trim()}return""}function eD(s){let e=[],t=new Set;for(let n of s){let r=tD(n.text);for(let o of r){if(e.length>=z_)return e;if(o.length<BT)continue;let i=o.toLowerCase(),a=K_.find(d=>i.includes(d.phrase));if(!a)continue;let l=o.length>UT?`${o.slice(0,UT)}\u2026`:o,u=nD(l);t.has(u)||(t.add(u),e.push({type:a.type,content:l,hash:u,matchedPhrase:a.phrase}))}}return e}function tD(s){return s.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}function nD(s){return J_.createHash("sha256").update(s.toLowerCase().trim()).digest("hex").slice(0,16)}function sD(s){let e=new Set;try{let{prjctDb:t}=(Y(),st(bs)),n=t.query(s,"SELECT data FROM events WHERE type LIKE 'memory.remember.%' ORDER BY id DESC LIMIT 500");for(let r of n){let o;try{o=JSON.parse(r.data)}catch{continue}if(!o||typeof o!="object")continue;let i=o.tags;if(!i||i.source!==GT)continue;let a=i.hash;typeof a=="string"&&e.add(a)}}catch{}return e}var GT,BT,UT,z_,K_,qT=h(()=>{"use strict";re();$e();GT="transcript-auto",BT=80,UT=1500,z_=12,K_=[{phrase:"decided to",type:"decision"},{phrase:"we chose",type:"decision"},{phrase:"going with",type:"decision"},{phrase:"the right call",type:"decision"},{phrase:"best approach is",type:"decision"},{phrase:"turns out that",type:"learning"},{phrase:"now i understand",type:"learning"},{phrase:"the key insight",type:"learning"},{phrase:"i learned that",type:"learning"},{phrase:"discovered that",type:"learning"},{phrase:"gotcha:",type:"gotcha"},{phrase:"bug:",type:"gotcha"},{phrase:"fails when",type:"gotcha"},{phrase:"breaks when",type:"gotcha"},{phrase:"be careful",type:"gotcha"}];c(VT,"ingestTranscript");c(Y_,"parseTranscript");c(Q_,"inferRole");c(WT,"normalizeRole");c(Z_,"extractText");c(eD,"extractCandidates");c(tD,"splitParagraphs");c(nD,"hashContent");c(sD,"collectExistingAutoHashes")});var JT={};D(JT,{runStopHook:()=>rD});function rD(s=process.cwd()){return St({event:"Stop",projectPath:s,afterEmit:c(async(e,t)=>{let n=await I.readConfig(t).catch(()=>null);if(n?.projectId){try{await sp(t)}catch{}try{await op(t)}catch{}if(e.transcript_path)try{await VT(t,e.transcript_path,e.session_id??null)}catch{}try{await AT(t)}catch{}try{let r=await $T(n.projectId);await IT(n.projectId,r)}catch{}if(e.transcript_path)try{await TT(t,e.transcript_path,e.session_id??null)}catch{}if(e.transcript_path)try{await FT(t,e.transcript_path,e.session_id??null)}catch{}await zo(t,n.projectId).catch(()=>{})}},"afterEmit")})}var XT=h(()=>{"use strict";re();ET();jT();_T();HT();qT();Mn();rc();cs();c(rD,"runStopHook")});var zT={};D(zT,{runSubagentStartHook:()=>oD});function oD(s=process.cwd()){return St({event:"SubagentStart",projectPath:s,build:c((e,t)=>eo(t),"build")})}var KT=h(()=>{"use strict";cs();_c();c(oD,"runSubagentStartHook")});var YT={};D(YT,{runCwdChangedHook:()=>iD});function iD(s=process.cwd()){return St({event:"CwdChanged",projectPath:s,build:c(async(e,t)=>{let n=e.cwd||t;return eo(n)},"build")})}var QT=h(()=>{"use strict";cs();_c();c(iD,"runCwdChangedHook")});var eE={};D(eE,{CrewCommands:()=>Mm});import tn from"node:fs/promises";import nn from"node:path";function cD(s,e){let t=s.indexOf(Im),n=s.indexOf(aD);if(t<0||n<0||n<t)throw new Error("reviewer template is missing the prjct:checkpoints marker pair \u2014 rebuild dist/templates.json or report a bug");if(s.indexOf(Im,t+1)>=0)throw new Error("reviewer template has duplicated checkpoints start marker");let r=s.slice(0,t+Im.length),o=s.slice(n);return`${r}
1584
1582
  ${e.trimEnd()}
1585
- ${o}`}async function cD(){let s=Je(ZT);if(!s)throw new Error(`Missing crew template: ${ZT}`);return s.trim()}async function lD(s){let e=Je(s);if(!e)throw new Error(`Missing crew template: ${s}`);return e}async function uD(s,e){await tn.mkdir(nn.dirname(s),{recursive:!0}),await tn.writeFile(s,e,"utf-8")}function li(s){return s.includes(Om)&&s.includes(ci)}function dD(s,e){if(li(s)){let n=s.indexOf(Om),r=s.indexOf(ci)+ci.length;return`${s.slice(0,n)}${e}${s.slice(r)}`}let t=s.length>0&&!s.endsWith(`
1583
+ ${o}`}async function uD(){let s=Je(ZT);if(!s)throw new Error(`Missing crew template: ${ZT}`);return s.trim()}async function dD(s){let e=Je(s);if(!e)throw new Error(`Missing crew template: ${s}`);return e}async function pD(s,e){await tn.mkdir(nn.dirname(s),{recursive:!0}),await tn.writeFile(s,e,"utf-8")}function ui(s){return s.includes(Om)&&s.includes(li)}function mD(s,e){if(ui(s)){let n=s.indexOf(Om),r=s.indexOf(li)+li.length;return`${s.slice(0,n)}${e}${s.slice(r)}`}let t=s.length>0&&!s.endsWith(`
1586
1584
  `)?`
1587
1585
 
1588
1586
  `:`
1589
1587
  `;return`${s}${t}${e}
1590
- `}function pD(s){if(!li(s))return s;let e=s.indexOf(Om),t=s.indexOf(ci)+ci.length,n=`${s.slice(0,e)}${s.slice(t)}`;return n=n.replace(/\n{3,}/g,`
1588
+ `}function gD(s){if(!ui(s))return s;let e=s.indexOf(Om),t=s.indexOf(li)+li.length,n=`${s.slice(0,e)}${s.slice(t)}`;return n=n.replace(/\n{3,}/g,`
1591
1589
 
1592
1590
  `).trimEnd(),n.length>0?`${n}
1593
- `:""}async function Dm(s){let e=nn.join(s,Vs);try{return await tn.readFile(e,"utf-8")}catch{return null}}async function mD(s){let e=await Promise.all(_m.map(async a=>({path:a.destRelative,installed:await C(nn.join(s,a.destRelative))}))),t=!1;try{let a=await I.getProjectId(s);a&&(An.get(a),t=!0)}catch{t=!1}let n={path:"kv_store[crew:checkpoints]",installed:t},r=await Dm(s),o={path:Vs,installed:r!==null&&li(r)},i=e.every(a=>a.installed)&&n.installed&&o.installed;return{agents:e,checkpoints:n,claudeSnippet:o,complete:i}}async function gD(){let s=[];for await(let e of process.stdin)s.push(typeof e=="string"?Buffer.from(e):e);return Buffer.concat(s).toString("utf-8")}var Om,ci,Im,oD,_m,aD,ZT,Vs,Mm,tE=h(()=>{"use strict";En();re();Qu();ic();F();V();Te();pe();Ie();Om="<!-- prjct:crew:start - DO NOT REMOVE THIS MARKER -->",ci="<!-- prjct:crew:end - DO NOT REMOVE THIS MARKER -->",Im="<!-- prjct:checkpoints:start - DO NOT EDIT (managed by `prjct crew checkpoints set|reset`) -->",oD="<!-- prjct:checkpoints:end -->";c(iD,"spliceCheckpoints");_m=[{templateKey:"crew/agents/leader.md",destRelative:".claude/agents/leader.md"},{templateKey:"crew/agents/implementer.md",destRelative:".claude/agents/implementer.md"},{templateKey:"crew/agents/reviewer.md",destRelative:".claude/agents/reviewer.md"}],aD={templateKey:"crew/CHECKPOINTS.md",destRelative:".prjct/CHECKPOINTS.md"},ZT="crew/CLAUDE-leader-mode.md",Vs="CLAUDE.md";c(cD,"readSnippet");c(lD,"readTemplate");c(uD,"writeFileEnsureDir");c(li,"snippetPresent");c(dD,"appendSnippet");c(pD,"stripSnippet");c(Dm,"readClaudeMd");c(mD,"getStatus");Mm=class extends X{static{c(this,"CrewCommands")}async install(e=null,t=process.cwd(),n={}){try{let r=[],o=[],i=await this.ensureProjectInit(t);if(!i.success)return i;let a=await I.getProjectId(t);if(!a)return N("No prjct project. Run `prjct init` first.",n);let l=An.get(a);for(let y of _m){let w=nn.join(t,y.destRelative),v=await lD(y.templateKey);y.destRelative===".claude/agents/reviewer.md"&&(v=iD(v,l.content));let S=await C(w);await uD(w,v),S?o.push(`${y.destRelative} (overwritten)`):r.push(y.destRelative)}let u=await cD(),d=nn.join(t,Vs),p=await Dm(t)??"",m=li(p),g=dD(p,u);g!==p?(await tn.writeFile(d,g,"utf-8"),r.push(`${Vs} (${m?"snippet refreshed":"snippet appended"})`)):o.push(`${Vs} (snippet already current)`);let k=`crew installed (${r.length} written, ${o.length} kept)`,E=["Suggested next step \u2014 wire verification hooks into .claude/settings.json:"," PostToolUse(Edit|Write) \u2192 run your test command"," Stop \u2192 run `prjct check` (when available) or your project test command","Use the /update-config skill or edit settings.json manually."].join(`
1591
+ `:""}async function Dm(s){let e=nn.join(s,Vs);try{return await tn.readFile(e,"utf-8")}catch{return null}}async function fD(s){let e=await Promise.all(_m.map(async a=>({path:a.destRelative,installed:await C(nn.join(s,a.destRelative))}))),t=!1;try{let a=await I.getProjectId(s);a&&(An.get(a),t=!0)}catch{t=!1}let n={path:"kv_store[crew:checkpoints]",installed:t},r=await Dm(s),o={path:Vs,installed:r!==null&&ui(r)},i=e.every(a=>a.installed)&&n.installed&&o.installed;return{agents:e,checkpoints:n,claudeSnippet:o,complete:i}}async function hD(){let s=[];for await(let e of process.stdin)s.push(typeof e=="string"?Buffer.from(e):e);return Buffer.concat(s).toString("utf-8")}var Om,li,Im,aD,_m,lD,ZT,Vs,Mm,tE=h(()=>{"use strict";En();re();Zu();ac();F();V();Te();pe();Ie();Om="<!-- prjct:crew:start - DO NOT REMOVE THIS MARKER -->",li="<!-- prjct:crew:end - DO NOT REMOVE THIS MARKER -->",Im="<!-- prjct:checkpoints:start - DO NOT EDIT (managed by `prjct crew checkpoints set|reset`) -->",aD="<!-- prjct:checkpoints:end -->";c(cD,"spliceCheckpoints");_m=[{templateKey:"crew/agents/leader.md",destRelative:".claude/agents/leader.md"},{templateKey:"crew/agents/implementer.md",destRelative:".claude/agents/implementer.md"},{templateKey:"crew/agents/reviewer.md",destRelative:".claude/agents/reviewer.md"}],lD={templateKey:"crew/CHECKPOINTS.md",destRelative:".prjct/CHECKPOINTS.md"},ZT="crew/CLAUDE-leader-mode.md",Vs="CLAUDE.md";c(uD,"readSnippet");c(dD,"readTemplate");c(pD,"writeFileEnsureDir");c(ui,"snippetPresent");c(mD,"appendSnippet");c(gD,"stripSnippet");c(Dm,"readClaudeMd");c(fD,"getStatus");Mm=class extends X{static{c(this,"CrewCommands")}async install(e=null,t=process.cwd(),n={}){try{let r=[],o=[],i=await this.ensureProjectInit(t);if(!i.success)return i;let a=await I.getProjectId(t);if(!a)return N("No prjct project. Run `prjct init` first.",n);let l=An.get(a);for(let y of _m){let w=nn.join(t,y.destRelative),v=await dD(y.templateKey);y.destRelative===".claude/agents/reviewer.md"&&(v=cD(v,l.content));let S=await C(w);await pD(w,v),S?o.push(`${y.destRelative} (overwritten)`):r.push(y.destRelative)}let u=await uD(),d=nn.join(t,Vs),p=await Dm(t)??"",m=ui(p),g=mD(p,u);g!==p?(await tn.writeFile(d,g,"utf-8"),r.push(`${Vs} (${m?"snippet refreshed":"snippet appended"})`)):o.push(`${Vs} (snippet already current)`);let k=`crew installed (${r.length} written, ${o.length} kept)`,E=["Suggested next step \u2014 wire verification hooks into .claude/settings.json:"," PostToolUse(Edit|Write) \u2192 run your test command"," Stop \u2192 run `prjct check` (when available) or your project test command","Use the /update-config skill or edit settings.json manually."].join(`
1594
1592
  `);if(n.md){let y=["# prjct crew installed","",`Wrote to \`${t}\`.`,"","## Files"];for(let w of r)y.push(`- written: \`${w}\``);for(let w of o)y.push(`- kept: \`${w}\``);y.push("","## Next step","",E),console.log(y.join(`
1595
- `))}else{f.done(k);for(let y of r)f.info(`written: ${y}`);for(let y of o)f.info(`kept: ${y}`);console.log(""),console.log(E)}return{success:!0,written:r,skipped:o}}catch(r){let o=b(r);return N(o)}}async uninstall(e=null,t=process.cwd(),n={}){try{let r=[],o=[],i=[..._m,aD];for(let p of i){let m=nn.join(t,p.destRelative);await C(m)?(await tn.rm(m),r.push(p.destRelative)):o.push(p.destRelative)}let a=nn.join(t,".claude/agents");try{(await tn.readdir(a)).length===0&&await tn.rmdir(a)}catch{}let l=nn.join(t,Vs),u=await Dm(t);if(u!==null&&li(u)){let p=pD(u);await tn.writeFile(l,p,"utf-8"),r.push(`${Vs} (snippet stripped)`)}let d=`crew uninstalled (${r.length} removed)`;if(n.md){let p=["# prjct crew uninstalled",""];for(let m of r)p.push(`- removed: \`${m}\``);for(let m of o)p.push(`- not present: \`${m}\``);console.log(p.join(`
1596
- `))}else{f.done(d);for(let p of r)f.info(`removed: ${p}`)}return{success:!0,removed:r,missing:o}}catch(r){let o=b(r);return N(o)}}async status(e=null,t=process.cwd(),n={}){try{let r=await mD(t),o=c(i=>i.installed?"installed":"missing","tag");if(n.md){let i=["# prjct crew status","",`Project: \`${t}\``,`Complete: **${r.complete?"yes":"no"}**`,"","## Pieces"];for(let a of r.agents)i.push(`- ${o(a)}: \`${a.path}\``);i.push(`- ${o(r.checkpoints)}: \`${r.checkpoints.path}\``),i.push(`- ${o(r.claudeSnippet)}: \`${r.claudeSnippet.path}\` (snippet)`),console.log(i.join(`
1597
- `))}else{let i=r.complete?"complete":"partial";f.info(`crew: ${i}`);for(let a of r.agents)f.info(` ${o(a)}: ${a.path}`);f.info(` ${o(r.checkpoints)}: ${r.checkpoints.path}`),f.info(` ${o(r.claudeSnippet)}: ${r.claudeSnippet.path} (snippet)`)}return{success:!0,complete:r.complete,status:r}}catch(r){let o=b(r);return N(o)}}async checkpoints(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await I.getProjectId(t);if(!o)return N("No prjct project. Run `prjct init` first.",n);if(e===null||e==="show"){let i=An.get(o);return process.stdout.write(i.content),{success:!0,source:i.source}}if(e==="set"){let i=null;if(typeof n.content=="string"&&n.content.length>0)i=n.content;else if(typeof n.file=="string"&&n.file.length>0)i=await tn.readFile(nn.resolve(t,n.file),"utf-8");else if(!process.stdin.isTTY)i=await gD();else return process.stderr.write(`error: no content provided; pipe to stdin, or pass --content / --file
1593
+ `))}else{f.done(k);for(let y of r)f.info(`written: ${y}`);for(let y of o)f.info(`kept: ${y}`);console.log(""),console.log(E)}return{success:!0,written:r,skipped:o}}catch(r){let o=b(r);return N(o)}}async uninstall(e=null,t=process.cwd(),n={}){try{let r=[],o=[],i=[..._m,lD];for(let p of i){let m=nn.join(t,p.destRelative);await C(m)?(await tn.rm(m),r.push(p.destRelative)):o.push(p.destRelative)}let a=nn.join(t,".claude/agents");try{(await tn.readdir(a)).length===0&&await tn.rmdir(a)}catch{}let l=nn.join(t,Vs),u=await Dm(t);if(u!==null&&ui(u)){let p=gD(u);await tn.writeFile(l,p,"utf-8"),r.push(`${Vs} (snippet stripped)`)}let d=`crew uninstalled (${r.length} removed)`;if(n.md){let p=["# prjct crew uninstalled",""];for(let m of r)p.push(`- removed: \`${m}\``);for(let m of o)p.push(`- not present: \`${m}\``);console.log(p.join(`
1594
+ `))}else{f.done(d);for(let p of r)f.info(`removed: ${p}`)}return{success:!0,removed:r,missing:o}}catch(r){let o=b(r);return N(o)}}async status(e=null,t=process.cwd(),n={}){try{let r=await fD(t),o=c(i=>i.installed?"installed":"missing","tag");if(n.md){let i=["# prjct crew status","",`Project: \`${t}\``,`Complete: **${r.complete?"yes":"no"}**`,"","## Pieces"];for(let a of r.agents)i.push(`- ${o(a)}: \`${a.path}\``);i.push(`- ${o(r.checkpoints)}: \`${r.checkpoints.path}\``),i.push(`- ${o(r.claudeSnippet)}: \`${r.claudeSnippet.path}\` (snippet)`),console.log(i.join(`
1595
+ `))}else{let i=r.complete?"complete":"partial";f.info(`crew: ${i}`);for(let a of r.agents)f.info(` ${o(a)}: ${a.path}`);f.info(` ${o(r.checkpoints)}: ${r.checkpoints.path}`),f.info(` ${o(r.claudeSnippet)}: ${r.claudeSnippet.path} (snippet)`)}return{success:!0,complete:r.complete,status:r}}catch(r){let o=b(r);return N(o)}}async checkpoints(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await I.getProjectId(t);if(!o)return N("No prjct project. Run `prjct init` first.",n);if(e===null||e==="show"){let i=An.get(o);return process.stdout.write(i.content),{success:!0,source:i.source}}if(e==="set"){let i=null;if(typeof n.content=="string"&&n.content.length>0)i=n.content;else if(typeof n.file=="string"&&n.file.length>0)i=await tn.readFile(nn.resolve(t,n.file),"utf-8");else if(!process.stdin.isTTY)i=await hD();else return process.stderr.write(`error: no content provided; pipe to stdin, or pass --content / --file
1598
1596
  `),process.exitCode=2,H("checkpoints set: no content provided",n);if(i===null||i.length===0)return H("checkpoints set: content is empty",n);let a=An.set(o,i,"user");return n.md?console.log(`\u2713 checkpoints updated (source=${a.source})`):f.done(`checkpoints updated (source=${a.source})`),{success:!0,source:a.source}}if(e==="reset")return An.reset(o),n.md?console.log("\u2713 checkpoints reset to bundled default"):f.done("checkpoints reset to bundled default"),{success:!0,reset:!0};if(e==="export"){let i=An.get(o),a=!An.hasCustomization(o);if(a&&process.stderr.write(`(exporting bundled default; no user customization set)
1599
- `),typeof n.file=="string"&&n.file.length>0){let l=nn.resolve(t,n.file);return await tn.mkdir(nn.dirname(l),{recursive:!0}),await tn.writeFile(l,i.content,"utf-8"),n.md?console.log(`\u2713 exported to \`${n.file}\``):f.done(`exported to ${n.file}`),{success:!0,exported:!0,file:n.file,isDefault:a}}return process.stdout.write(i.content),{success:!0,exported:!0,isDefault:a}}return H(`Unknown crew checkpoints subverb: ${e}. Use: show, set, reset, export.`,n)}catch(r){return N(b(r),n)}}async recordRun(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await I.getProjectId(e);if(!r)return N("No prjct project. Run `prjct init` first.",t);let o=t["implementer-summary"],i=t["reviewer-verdict"],a=t.files??"";if(!o)return H("crew record-run: --implementer-summary is required",t);if(i!=="APPROVED"&&i!=="CHANGES_REQUESTED")return H("crew record-run: --reviewer-verdict must be APPROVED or CHANGES_REQUESTED",t);let l=a.split(",").map(m=>m.trim()).filter(m=>m.length>0),u=lp.record(r,{runId:t["run-id"],specId:t.spec??null,taskId:t.task??null,implementerSummary:o,filesTouched:l,reviewerVerdict:i,reviewerNotes:t["reviewer-notes"]??null}),p=`~/Documents/prjct/<slug>/_generated/crew-runs/${u.spec_id??u.task_id??u.id}-${u.started_at}.md`;return t.md?(console.log(`\u2713 crew run recorded: run-id=${u.id}`),console.log(` vault: ${p}`)):f.done(`crew run recorded: run-id=${u.id}`),{success:!0,runId:u.id,vaultPath:p}}catch(n){return N(b(n),t)}}};c(gD,"readAllStdin")});var nE={};D(nE,{DoctorService:()=>Oc,doctorService:()=>hD});import{execSync as Nm}from"node:child_process";import fD from"node:path";import ls from"chalk";var Oc,hD,sE=h(()=>{"use strict";re();ge();yr();pt();V();pe();We();Ao();Oc=class{static{c(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await I.getProjectId(e),this.projectId&&(this.globalPath=_.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),r=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:r,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,n,r,o){try{let a=Nm(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),l=a?a[1]:"unknown";return{name:e,status:"ok",version:l,optional:r}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:r}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e.push(await this.checkContext7()),e.push(await this.checkCodexPRouter()),e}async checkPrjctConfig(){let e=fD.join(this.projectPath,".prjct","prjct.config.json");return await C(e)?{name:"prjct config",status:"ok",message:"initialized"}:{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}async checkGitRepo(){try{Nm("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=Nm("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
1600
- `).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await B.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}async checkContext7(){try{let e=await xn.verify();return e.installed?e.verified?{name:"context7 mcp",status:"ok",message:"ready"}:{name:"context7 mcp",status:"error",message:e.message||"configured but verification failed"}:{name:"context7 mcp",status:"error",message:'not configured - run "prjct start"'}}catch(e){return{name:"context7 mcp",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkCodexPRouter(){try{let e=await hr({autoRepair:!0});return e.installed?e.verified?{name:"codex p-router",status:"ok",message:`ready (${e.templateSource||"local-dev"})`}:{name:"codex p-router",status:"error",message:e.message||"router verification failed"}:{name:"codex p-router",status:"ok",message:"codex not detected (check skipped)",optional:!0}}catch(e){return{name:"codex p-router",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}generateRecommendations(e,t){let n=[];e.find(d=>d.name==="gh"&&d.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(d=>d.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(d=>d.name==="prjct config");i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(d=>d.name==="CLAUDE.md"&&d.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files');let l=t.find(d=>d.name==="context7 mcp");l&&l.status!=="ok"&&n.push('Run "prjct start" to install/repair Context7 MCP');let u=t.find(d=>d.name==="codex p-router");return u&&u.status==="error"&&n.push('Run "prjct start" or "prjct setup" to repair Codex p. router'),n}printHeader(){f.section(`prjct doctor v${le}`)}printSection(e,t){f.section(e);let n=t.map(r=>{let o=this.getStatusIcon(r.status,r.optional),i=r.name.padEnd(14),a=r.version||r.message||"",l=r.optional&&r.status==="error"?ls.dim(" (optional)"):"";return`${o} ${i} ${ls.dim(a)}${l}`});for(let r of n)console.log(` ${r}`)}printRecommendations(e){f.section("Recommendations"),f.list(e,{bullet:ls.yellow("\u2022")})}printSummary(e){console.log(""),console.log(ls.dim("\u2500".repeat(40))),e.hasErrors?f.fail("Some required checks failed"):e.hasWarnings?f.warn("All required checks passed (some warnings)"):f.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return ls.green("\u2713");case"warn":return ls.yellow("\u26A0");case"error":return t?ls.dim("\u25CB"):ls.red("\u2717")}}},hD=new Oc});var rE={};D(rE,{WatchService:()=>Nc,watchService:()=>bD});import yD from"node:path";import nt from"chalk";import wD from"chokidar";var kD,vD,Nc,bD,oE=h(()=>{"use strict";re();F();ue();Fa();kD=["package.json","package-lock.json","bun.lockb","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.*.json",".env",".env.*","Cargo.toml","go.mod","pyproject.toml","requirements.txt","src/**/*.ts","src/**/*.tsx","src/**/*.js","src/**/*.jsx","lib/**/*.ts","core/**/*.ts","app/**/*.ts","app/**/*.tsx","pages/**/*.ts","pages/**/*.tsx"],vD=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Nc=class{static{c(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await I.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=wD.watch(kD,{cwd:this.projectPath,ignored:vD,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",n=>this.handleChange("add",n)).on("change",n=>this.handleChange("change",n)).on("unlink",n=>this.handleChange("unlink",n)).on("error",n=>this.handleError(n)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(nt.dim(`
1597
+ `),typeof n.file=="string"&&n.file.length>0){let l=nn.resolve(t,n.file);return await tn.mkdir(nn.dirname(l),{recursive:!0}),await tn.writeFile(l,i.content,"utf-8"),n.md?console.log(`\u2713 exported to \`${n.file}\``):f.done(`exported to ${n.file}`),{success:!0,exported:!0,file:n.file,isDefault:a}}return process.stdout.write(i.content),{success:!0,exported:!0,isDefault:a}}return H(`Unknown crew checkpoints subverb: ${e}. Use: show, set, reset, export.`,n)}catch(r){return N(b(r),n)}}async recordRun(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await I.getProjectId(e);if(!r)return N("No prjct project. Run `prjct init` first.",t);let o=t["implementer-summary"],i=t["reviewer-verdict"],a=t.files??"";if(!o)return H("crew record-run: --implementer-summary is required",t);if(i!=="APPROVED"&&i!=="CHANGES_REQUESTED")return H("crew record-run: --reviewer-verdict must be APPROVED or CHANGES_REQUESTED",t);let l=a.split(",").map(m=>m.trim()).filter(m=>m.length>0),u=up.record(r,{runId:t["run-id"],specId:t.spec??null,taskId:t.task??null,implementerSummary:o,filesTouched:l,reviewerVerdict:i,reviewerNotes:t["reviewer-notes"]??null}),p=`~/Documents/prjct/<slug>/_generated/crew-runs/${u.spec_id??u.task_id??u.id}-${u.started_at}.md`;return t.md?(console.log(`\u2713 crew run recorded: run-id=${u.id}`),console.log(` vault: ${p}`)):f.done(`crew run recorded: run-id=${u.id}`),{success:!0,runId:u.id,vaultPath:p}}catch(n){return N(b(n),t)}}};c(hD,"readAllStdin")});var nE={};D(nE,{DoctorService:()=>Nc,doctorService:()=>wD});import{execSync as Nm}from"node:child_process";import yD from"node:path";import ls from"chalk";var Nc,wD,sE=h(()=>{"use strict";re();ge();yr();pt();V();pe();We();Ao();Nc=class{static{c(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await I.getProjectId(e),this.projectId&&(this.globalPath=_.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),r=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:r,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,n,r,o){try{let a=Nm(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),l=a?a[1]:"unknown";return{name:e,status:"ok",version:l,optional:r}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:r}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e.push(await this.checkContext7()),e.push(await this.checkCodexPRouter()),e}async checkPrjctConfig(){let e=yD.join(this.projectPath,".prjct","prjct.config.json");return await C(e)?{name:"prjct config",status:"ok",message:"initialized"}:{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}async checkGitRepo(){try{Nm("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=Nm("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
1598
+ `).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await B.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}async checkContext7(){try{let e=await xn.verify();return e.installed?e.verified?{name:"context7 mcp",status:"ok",message:"ready"}:{name:"context7 mcp",status:"error",message:e.message||"configured but verification failed"}:{name:"context7 mcp",status:"error",message:'not configured - run "prjct start"'}}catch(e){return{name:"context7 mcp",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkCodexPRouter(){try{let e=await hr({autoRepair:!0});return e.installed?e.verified?{name:"codex p-router",status:"ok",message:`ready (${e.templateSource||"local-dev"})`}:{name:"codex p-router",status:"error",message:e.message||"router verification failed"}:{name:"codex p-router",status:"ok",message:"codex not detected (check skipped)",optional:!0}}catch(e){return{name:"codex p-router",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}generateRecommendations(e,t){let n=[];e.find(d=>d.name==="gh"&&d.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(d=>d.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(d=>d.name==="prjct config");i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(d=>d.name==="CLAUDE.md"&&d.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files');let l=t.find(d=>d.name==="context7 mcp");l&&l.status!=="ok"&&n.push('Run "prjct start" to install/repair Context7 MCP');let u=t.find(d=>d.name==="codex p-router");return u&&u.status==="error"&&n.push('Run "prjct start" or "prjct setup" to repair Codex p. router'),n}printHeader(){f.section(`prjct doctor v${le}`)}printSection(e,t){f.section(e);let n=t.map(r=>{let o=this.getStatusIcon(r.status,r.optional),i=r.name.padEnd(14),a=r.version||r.message||"",l=r.optional&&r.status==="error"?ls.dim(" (optional)"):"";return`${o} ${i} ${ls.dim(a)}${l}`});for(let r of n)console.log(` ${r}`)}printRecommendations(e){f.section("Recommendations"),f.list(e,{bullet:ls.yellow("\u2022")})}printSummary(e){console.log(""),console.log(ls.dim("\u2500".repeat(40))),e.hasErrors?f.fail("Some required checks failed"):e.hasWarnings?f.warn("All required checks passed (some warnings)"):f.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return ls.green("\u2713");case"warn":return ls.yellow("\u26A0");case"error":return t?ls.dim("\u25CB"):ls.red("\u2717")}}},wD=new Nc});var rE={};D(rE,{WatchService:()=>Lc,watchService:()=>TD});import kD from"node:path";import nt from"chalk";import vD from"chokidar";var bD,SD,Lc,TD,oE=h(()=>{"use strict";re();F();ue();Ha();bD=["package.json","package-lock.json","bun.lockb","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.*.json",".env",".env.*","Cargo.toml","go.mod","pyproject.toml","requirements.txt","src/**/*.ts","src/**/*.tsx","src/**/*.js","src/**/*.jsx","lib/**/*.ts","core/**/*.ts","app/**/*.ts","app/**/*.tsx","pages/**/*.ts","pages/**/*.tsx"],SD=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Lc=class{static{c(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await I.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=vD.watch(bD,{cwd:this.projectPath,ignored:SD,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",n=>this.handleChange("add",n)).on("change",n=>this.handleChange("change",n)).on("unlink",n=>this.handleChange("unlink",n)).on("error",n=>this.handleError(n)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(nt.dim(`
1601
1599
  \u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,!(process.env.PRJCT_IN_DAEMON==="1"||process.env.PRJCT_DAEMON==="1")&&process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(nt.dim(` ${n} ${t}`))}this.scheduleSyncIfNeeded()}scheduleSyncIfNeeded(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{let t=Date.now()-this.lastSyncTime;if(t<this.options.minIntervalMs&&this.lastSyncTime>0){let n=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(nt.dim(` \u23F3 Rate limited, waiting ${Math.round(n/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),n);return}await this.performSync()},this.options.debounceMs)}async performSync(){let e=Array.from(this.pendingChanges);if(this.pendingChanges.clear(),e.length===0)return;let t=R().split("T")[1].split(".")[0];if(!this.options.quiet){let n=e.length===1?e[0]:`${e.length} files`;console.log(`
1602
- ${nt.dim(`[${t}]`)} ${nt.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await Qn.sync(this.projectPath,{changedFiles:e});this.lastSyncTime=Date.now(),this.syncCount++,n.success?this.options.quiet||console.log(`${nt.dim(`[${t}]`)} ${nt.green("\u2713")} Synced`):console.error(`${nt.dim(`[${t}]`)} ${nt.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${nt.dim(`[${t}]`)} ${nt.red("\u2717")} Error: ${b(n)}`)}}handleError(e){console.error(nt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(nt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(nt.dim(` Project: ${yD.basename(this.projectPath)}`)),console.log(nt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(nt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(nt.dim(" Press Ctrl+C to stop")),console.log("")}},bD=new Nc});var aE={};D(aE,{getHelp:()=>xD});import Q from"chalk";function TD(){let s=[];s.push(""),s.push(`${Q.cyan.bold("prjct")} v${le} - Context layer for AI coding agents`),s.push(Q.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),s.push(""),s.push(Q.bold("QUICK START")),s.push(Q.dim("\u2500".repeat(60))),s.push(` ${Q.green("1.")} prjct start ${Q.dim("# Configure AI providers")}`),s.push(` ${Q.green("2.")} cd my-project && prjct init`),s.push(` ${Q.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),s.push(` ${Q.green("4.")} p. sync ${Q.dim("# Analyze project")}`),s.push(""),s.push(Q.bold("TERMINAL COMMANDS")),s.push(Q.dim("\u2500".repeat(60)));for(let t of iE){let n=`prjct ${t.name}`.padEnd(22);s.push(` ${n} ${t.description}`)}s.push(""),s.push(`${Q.bold("AI AGENT COMMANDS")} ${Q.dim("(inside Claude/Gemini/Cursor)")}`),s.push(Q.dim("\u2500".repeat(60))),s.push(` ${"Command".padEnd(22)} Description`),s.push(` ${Q.dim("\u2500".repeat(56))}`);let e=Fn.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);s.push(` ${n} ${t.description}`)}s.push(` ${Q.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),s.push(""),s.push(Q.bold("FLAGS")),s.push(Q.dim("\u2500".repeat(60)));for(let t of SD)s.push(` ${t.flag.padEnd(22)} ${t.description}`);return s.push(""),s.push(Q.bold("MORE INFO")),s.push(Q.dim("\u2500".repeat(60))),s.push(` Documentation: ${Q.cyan("https://prjct.app")}`),s.push(` GitHub: ${Q.cyan("https://github.com/jlopezlira/prjct-cli")}`),s.push(" Per-command: prjct help <command>"),s.push(""),s.join(`
1603
- `)}function ED(s){let e=iE.find(n=>n.name===s);if(!e)return null;let t=[];if(t.push(""),t.push(`${Q.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(Q.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(Q.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(Q.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
1604
- `)}function CD(s){let e=Fn.find(r=>r.name===s);if(!e)return null;let t=[];if(t.push(""),t.push(`${Q.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(Q.bold("USAGE")),e.usage?.claude&&t.push(` Claude/Gemini: ${e.usage.claude.replace("/p:","p. ")}`),e.usage?.terminal&&t.push(` Terminal: ${e.usage.terminal}`),t.push(""),e.params&&(t.push(Q.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(Q.bold("FEATURES"));for(let r of e.features)t.push(` \u2022 ${r}`);t.push("")}e.blockingRules&&(t.push(Q.bold("REQUIREMENTS")),t.push(` ${Q.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=lo[e.group];return n&&(t.push(Q.dim(`Category: ${n.title}`)),e.isOptional&&t.push(Q.dim("This is an optional command.")),t.push("")),t.join(`
1605
- `)}function RD(s){let e=ED(s);if(e)return e;let t=CD(s);return t||`
1600
+ ${nt.dim(`[${t}]`)} ${nt.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await Qn.sync(this.projectPath,{changedFiles:e});this.lastSyncTime=Date.now(),this.syncCount++,n.success?this.options.quiet||console.log(`${nt.dim(`[${t}]`)} ${nt.green("\u2713")} Synced`):console.error(`${nt.dim(`[${t}]`)} ${nt.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${nt.dim(`[${t}]`)} ${nt.red("\u2717")} Error: ${b(n)}`)}}handleError(e){console.error(nt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(nt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(nt.dim(` Project: ${kD.basename(this.projectPath)}`)),console.log(nt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(nt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(nt.dim(" Press Ctrl+C to stop")),console.log("")}},TD=new Lc});var aE={};D(aE,{getHelp:()=>jD});import Q from"chalk";function CD(){let s=[];s.push(""),s.push(`${Q.cyan.bold("prjct")} v${le} - Context layer for AI coding agents`),s.push(Q.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),s.push(""),s.push(Q.bold("QUICK START")),s.push(Q.dim("\u2500".repeat(60))),s.push(` ${Q.green("1.")} prjct start ${Q.dim("# Configure AI providers")}`),s.push(` ${Q.green("2.")} cd my-project && prjct init`),s.push(` ${Q.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),s.push(` ${Q.green("4.")} p. sync ${Q.dim("# Analyze project")}`),s.push(""),s.push(Q.bold("TERMINAL COMMANDS")),s.push(Q.dim("\u2500".repeat(60)));for(let t of iE){let n=`prjct ${t.name}`.padEnd(22);s.push(` ${n} ${t.description}`)}s.push(""),s.push(`${Q.bold("AI AGENT COMMANDS")} ${Q.dim("(inside Claude/Gemini/Cursor)")}`),s.push(Q.dim("\u2500".repeat(60))),s.push(` ${"Command".padEnd(22)} Description`),s.push(` ${Q.dim("\u2500".repeat(56))}`);let e=Fn.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);s.push(` ${n} ${t.description}`)}s.push(` ${Q.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),s.push(""),s.push(Q.bold("FLAGS")),s.push(Q.dim("\u2500".repeat(60)));for(let t of ED)s.push(` ${t.flag.padEnd(22)} ${t.description}`);return s.push(""),s.push(Q.bold("MORE INFO")),s.push(Q.dim("\u2500".repeat(60))),s.push(` Documentation: ${Q.cyan("https://prjct.app")}`),s.push(` GitHub: ${Q.cyan("https://github.com/jlopezlira/prjct-cli")}`),s.push(" Per-command: prjct help <command>"),s.push(""),s.join(`
1601
+ `)}function RD(s){let e=iE.find(n=>n.name===s);if(!e)return null;let t=[];if(t.push(""),t.push(`${Q.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(Q.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(Q.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(Q.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
1602
+ `)}function PD(s){let e=Fn.find(r=>r.name===s);if(!e)return null;let t=[];if(t.push(""),t.push(`${Q.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(Q.bold("USAGE")),e.usage?.claude&&t.push(` Claude/Gemini: ${e.usage.claude.replace("/p:","p. ")}`),e.usage?.terminal&&t.push(` Terminal: ${e.usage.terminal}`),t.push(""),e.params&&(t.push(Q.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(Q.bold("FEATURES"));for(let r of e.features)t.push(` \u2022 ${r}`);t.push("")}e.blockingRules&&(t.push(Q.bold("REQUIREMENTS")),t.push(` ${Q.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=lo[e.group];return n&&(t.push(Q.dim(`Category: ${n.title}`)),e.isOptional&&t.push(Q.dim("This is an optional command.")),t.push("")),t.join(`
1603
+ `)}function xD(s){let e=RD(s);if(e)return e;let t=PD(s);return t||`
1606
1604
  ${Q.yellow(`Command '${s}' not found.`)}
1607
1605
 
1608
1606
  Run 'prjct help' to see all available commands.
1609
- `}function PD(){let s=[];s.push(""),s.push(Q.cyan.bold("All Commands")),s.push("");let e=Object.entries(lo).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let r=Fn.filter(o=>o.group===t);if(r.length!==0){s.push(`${Q.bold(n.title)} ${Q.dim(`(${r.length} commands)`)}`),s.push(Q.dim(n.description)),s.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;s.push(` ${i} ${a}`)}s.push("")}}return s.push(Q.dim("Run 'prjct help <command>' for detailed help on a specific command.")),s.push(""),s.join(`
1610
- `)}function xD(s){return s?s==="commands"||s==="all"?PD():RD(s):TD()}var iE,SD,cE=h(()=>{"use strict";mi();We();iE=[{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:"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"]}],SD=[{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(TD,"formatMainHelp");c(ED,"formatTerminalCommandHelp");c(CD,"formatAgentCommandHelp");c(RD,"formatCommandHelp");c(PD,"formatCommandList");c(xD,"getHelp")});var lE=vE((f9,AD)=>{AD.exports={name:"prjct-cli",version:"2.23.6",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 .","test:e2e":"bun test core/__tests__/e2e/"},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","@modelcontextprotocol/sdk":"1.29.0","better-sqlite3":"12.9.0",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},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 OD={};import uE from"node:os";import Lc from"node:path";import Ne from"chalk";async function jD(){let[s,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(s)){let n=await Promise.resolve().then(()=>bE(lE()));await DD(n.version),process.exit(0)}if(["-h","--help",void 0].includes(s)&&(MD(),process.exit(0)),s&&xc(s)&&!ct.getByName(s)){let n=Pc[s];n&&(f.failWithHint({message:`'prjct ${s}' was removed in v2. ${n.note}`,hint:`Use: ${n.replacement}`}),process.exit(1))}if(s&&!ct.getByName(s)&&!(e.length===0&&si(s)!==null)){let r=[s,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));s="capture",e=[r,...o]}let t=e.includes("--md");t||f.start();try{let n=ct.getByName(s);if(!n){let m=si(s),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(So("UNKNOWN_COMMAND",{message:`Unknown command: ${s}`,hint:g})),t||f.end(),process.exit(1)}if(n.deprecated){let m=n.replacedBy?`Use 'prjct ${n.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${s}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}n.implemented||(f.failWithHint({message:`Command '${s}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:r,options:o}=_D(n,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;n.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${s}' requires an AI agent to process its output`,hint:`Use 'p. ${s}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=ID(n,r);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let l=null,u=Date.now();try{l=await I.getProjectId(process.cwd()),l&&(await lr.expireIfStale(l),await lr.touch(l))}catch{}let d=new as,p;if(s==="analyze")p=await d.analyze(o);else if(s==="setup")p=await d.setup(o);else if(s==="update"||s==="upgrade")p=await d.update(o);else{let m=r.join(" ")||null,g=o.md===!0,E={task:c(y=>d.task(y,process.cwd(),{md:g,spec:o.spec?String(o.spec):void 0}),"task"),spec:c(y=>$D(d,y,o),"spec"),"audit-spec":c(y=>y?d.specAudit(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(y=>d.init({idea:y,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),ship:c(y=>d.ship(y,process.cwd(),{md:g,noSpecGate:o["no-spec-gate"]===!0}),"ship"),workflow:c(y=>d.workflowPrefs(y,process.cwd(),{md:g}),"workflow"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(y=>y?d.saveLlmAnalysis(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:g}),"regen"),start:c(()=>d.start(),"start"),context:c(y=>d.context(y),"context"),status:c(y=>d.status(y,process.cwd(),{md:g}),"status"),tag:c(y=>d.tag(y,process.cwd(),{md:g}),"tag"),remember:c(y=>d.remember(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0}),"remember"),login:c(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(y=>d.auth(y,{md:g}),"auth"),seed:c(y=>d.seed(y,process.cwd(),{md:g}),"seed"),install:c(()=>d.install(null,process.cwd(),{md:g}),"install"),capture:c(y=>d.capture(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0,force:o.force===!0}),"capture"),mcp:c(y=>d.mcp(y,process.cwd(),{md:g}),"mcp")}[s];if(E)p=await E(m);else throw new Error(`Command '${s}' has no handler`)}if(l){let m=Date.now()-u;try{await lr.trackCommand(l,s,m)}catch{}try{await To.recordTiming(l,"command_duration",m,{command:s});let g=globalThis.__perfStartNs;if(g){let k=Number(process.hrtime.bigint()-g)/1e6;await To.recordTiming(l,"startup_time",k)}await To.recordMemory(l,{command:s})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(n){console.error("Error:",b(n)),process.env.DEBUG&&console.error(Xc(n)),t||f.end(),process.exit(1)}}async function $D(s,e,t){let n=t.md===!0,r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0],i=r.slice(1).join(" ")||null,a=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","inventory"]);if(o&&new Set(["draft","new","create"]).has(o))return s.spec(i,process.cwd(),{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});if(!o||!a.has(o))return s.spec(e,process.cwd(),{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});let u=process.cwd();switch(o){case"list":return s.specList(u,{md:n,status:t.status?String(t.status):void 0});case"show":return s.specShow(i,u,{md:n});case"update":return s.specUpdate(i,u,{md:n,json:t.json?String(t.json):void 0});case"set-status":return s.specSetStatus(i,u,{md:n,status:t.status?String(t.status):void 0});case"record-review":return s.specRecordReview(i,u,{md:n,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return s.specLinkTask(i,u,{md:n,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return s.specShip(i,u,{md:n,pr:t.pr?String(t.pr):void 0});case"audit":return s.specAudit(i,u,{md:n});case"breakdown":return s.specBreakdown(i,u,{md:n,force:t.force===!0});case"inventory":return s.specInventory(u,{md:n,json:t.json===!0});default:return{success:!1,message:`unknown spec subverb: ${o}`}}}function ID(s,e){if(!s.params)return null;let t=s.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),r=s.usage.terminal||`prjct ${s.name} ${s.params}`;return So("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${r}`})}return null}function _D(s,e){let t=[],n={};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("--")?n[i]=e[++r]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function DD(s){let e=await Tn(),t=Lc.join(uE.homedir(),".claude","commands","p.md"),n=Lc.join(uE.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([C(t),C(n),C(Lc.join(process.cwd(),".cursor","commands","sync.md")),C(Lc.join(process.cwd(),".cursor"))]),l=await yo();if(console.log(`
1607
+ `}function AD(){let s=[];s.push(""),s.push(Q.cyan.bold("All Commands")),s.push("");let e=Object.entries(lo).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let r=Fn.filter(o=>o.group===t);if(r.length!==0){s.push(`${Q.bold(n.title)} ${Q.dim(`(${r.length} commands)`)}`),s.push(Q.dim(n.description)),s.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;s.push(` ${i} ${a}`)}s.push("")}}return s.push(Q.dim("Run 'prjct help <command>' for detailed help on a specific command.")),s.push(""),s.join(`
1608
+ `)}function jD(s){return s?s==="commands"||s==="all"?AD():xD(s):CD()}var iE,ED,cE=h(()=>{"use strict";gi();We();iE=[{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:"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"]}],ED=[{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(CD,"formatMainHelp");c(RD,"formatTerminalCommandHelp");c(PD,"formatAgentCommandHelp");c(xD,"formatCommandHelp");c(AD,"formatCommandList");c(jD,"getHelp")});var lE=vE((w9,$D)=>{$D.exports={name:"prjct-cli",version:"2.23.8",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 .","test:e2e":"bun test core/__tests__/e2e/"},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","@modelcontextprotocol/sdk":"1.29.0","better-sqlite3":"12.9.0",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},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 LD={};import uE from"node:os";import Fc from"node:path";import Ne from"chalk";async function ID(){let[s,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(s)){let n=await Promise.resolve().then(()=>bE(lE()));await OD(n.version),process.exit(0)}if(["-h","--help",void 0].includes(s)&&(ND(),process.exit(0)),s&&Ac(s)&&!ct.getByName(s)){let n=xc[s];n&&(f.failWithHint({message:`'prjct ${s}' was removed in v2. ${n.note}`,hint:`Use: ${n.replacement}`}),process.exit(1))}if(s&&!ct.getByName(s)&&!(e.length===0&&si(s)!==null)){let r=[s,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));s="capture",e=[r,...o]}let t=e.includes("--md");t||f.start();try{let n=ct.getByName(s);if(!n){let m=si(s),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(So("UNKNOWN_COMMAND",{message:`Unknown command: ${s}`,hint:g})),t||f.end(),process.exit(1)}if(n.deprecated){let m=n.replacedBy?`Use 'prjct ${n.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${s}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}n.implemented||(f.failWithHint({message:`Command '${s}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:r,options:o}=MD(n,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;n.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${s}' requires an AI agent to process its output`,hint:`Use 'p. ${s}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=DD(n,r);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let l=null,u=Date.now();try{l=await I.getProjectId(process.cwd()),l&&(await lr.expireIfStale(l),await lr.touch(l))}catch{}let d=new as,p;if(s==="analyze")p=await d.analyze(o);else if(s==="setup")p=await d.setup(o);else if(s==="update"||s==="upgrade")p=await d.update(o);else{let m=r.join(" ")||null,g=o.md===!0,E={task:c(y=>d.task(y,process.cwd(),{md:g,spec:o.spec?String(o.spec):void 0}),"task"),spec:c(y=>_D(d,y,o),"spec"),"audit-spec":c(y=>y?d.specAudit(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(y=>d.init({idea:y,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),ship:c(y=>d.ship(y,process.cwd(),{md:g,noSpecGate:o["no-spec-gate"]===!0}),"ship"),workflow:c(y=>d.workflowPrefs(y,process.cwd(),{md:g}),"workflow"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(y=>y?d.saveLlmAnalysis(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:g}),"regen"),start:c(()=>d.start(),"start"),context:c(y=>d.context(y),"context"),status:c(y=>d.status(y,process.cwd(),{md:g}),"status"),tag:c(y=>d.tag(y,process.cwd(),{md:g}),"tag"),remember:c(y=>d.remember(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0}),"remember"),login:c(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(y=>d.auth(y,{md:g}),"auth"),seed:c(y=>d.seed(y,process.cwd(),{md:g}),"seed"),install:c(()=>d.install(null,process.cwd(),{md:g}),"install"),capture:c(y=>d.capture(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0,force:o.force===!0}),"capture"),mcp:c(y=>d.mcp(y,process.cwd(),{md:g}),"mcp")}[s];if(E)p=await E(m);else throw new Error(`Command '${s}' has no handler`)}if(l){let m=Date.now()-u;try{await lr.trackCommand(l,s,m)}catch{}try{await To.recordTiming(l,"command_duration",m,{command:s});let g=globalThis.__perfStartNs;if(g){let k=Number(process.hrtime.bigint()-g)/1e6;await To.recordTiming(l,"startup_time",k)}await To.recordMemory(l,{command:s})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(n){console.error("Error:",b(n)),process.env.DEBUG&&console.error(zc(n)),t||f.end(),process.exit(1)}}async function _D(s,e,t){let n=t.md===!0,r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0],i=r.slice(1).join(" ")||null,a=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","inventory"]);if(o&&new Set(["draft","new","create"]).has(o))return s.spec(i,process.cwd(),{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});if(!o||!a.has(o))return s.spec(e,process.cwd(),{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});let u=process.cwd();switch(o){case"list":return s.specList(u,{md:n,status:t.status?String(t.status):void 0});case"show":return s.specShow(i,u,{md:n});case"update":return s.specUpdate(i,u,{md:n,json:t.json?String(t.json):void 0});case"set-status":return s.specSetStatus(i,u,{md:n,status:t.status?String(t.status):void 0});case"record-review":return s.specRecordReview(i,u,{md:n,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return s.specLinkTask(i,u,{md:n,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return s.specShip(i,u,{md:n,pr:t.pr?String(t.pr):void 0});case"audit":return s.specAudit(i,u,{md:n});case"breakdown":return s.specBreakdown(i,u,{md:n,force:t.force===!0});case"inventory":return s.specInventory(u,{md:n,json:t.json===!0});default:return{success:!1,message:`unknown spec subverb: ${o}`}}}function DD(s,e){if(!s.params)return null;let t=s.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),r=s.usage.terminal||`prjct ${s.name} ${s.params}`;return So("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${r}`})}return null}function MD(s,e){let t=[],n={};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("--")?n[i]=e[++r]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function OD(s){let e=await Tn(),t=Fc.join(uE.homedir(),".claude","commands","p.md"),n=Fc.join(uE.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([C(t),C(n),C(Fc.join(process.cwd(),".cursor","commands","sync.md")),C(Fc.join(process.cwd(),".cursor"))]),l=await yo();if(console.log(`
1611
1609
  ${Ne.cyan("p/")} prjct v${s}
1612
1610
  ${Ne.dim("Context layer for AI coding agents")}
1613
1611
 
1614
1612
  ${Ne.dim("Providers:")}`),e.claude.installed){let u=r?Ne.green("\u2713 ready"):Ne.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${Ne.dim(d)}`)}else console.log(` Claude Code ${Ne.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?Ne.green("\u2713 ready"):Ne.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${Ne.dim(d)}`)}else console.log(` Gemini CLI ${Ne.dim("\u25CB not installed")}`);if(l.installed){let u=l.skillInstalled?Ne.green("\u2713 ready"):Ne.yellow("\u25CF detected"),d=l.skillInstalled?"":` ${Ne.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${Ne.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${Ne.green("\u2713 ready")} ${Ne.dim("(use /sync, /task)")}`:a?` Cursor IDE ${Ne.yellow("\u25CF detected")} ${Ne.dim("(run prjct init)")}`:` Cursor IDE ${Ne.dim("\u25CB no .cursor/ folder")}`),console.log(`
1615
1613
  ${Ne.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1616
1614
  ${Ne.cyan("https://prjct.app")}
1617
- `)}function MD(){console.log(`
1615
+ `)}function ND(){console.log(`
1618
1616
  prjct - Context layer for AI coding agents
1619
1617
  Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
1620
1618
 
@@ -1673,18 +1671,18 @@ MORE INFO
1673
1671
  ---------
1674
1672
  Documentation: https://prjct.app
1675
1673
  GitHub: https://github.com/jlopezlira/prjct-cli
1676
- `)}var dE=h(()=>{"use strict";um();rm();Gr();lm();dm();rt();re();Ql();Kl();F();Hi();V();pe();c(jD,"main");c($D,"routeSpec");c(ID,"validateCommandParams");c(_D,"parseCommandArgs");c(DD,"displayVersion");c(MD,"displayHelp");jD().catch(s=>{console.error("Fatal error:",b(s)),process.env.DEBUG&&console.error(Xc(s)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var ft=process.argv.slice(2),Ht=ft.find(s=>!s.startsWith("--")&&!s.startsWith("-"));if(Ht==="__internal-auto-update"){let s=ft[1]??"";try{let{runBackgroundCheck:e}=await Promise.resolve().then(()=>(Jc(),qc));await e(s)}catch{}process.exit(0)}var pE=new Set(["daemon","stop","restart","start","setup","update","upgrade","context","hooks","doctor","uninstall","claude","hook","seed","install","crew","watch","help","-h","--help","version","-v","--version","mcp","prefs","retro","health","skill-adherence","review-risk","context-save","context-restore"]),{REGISTERED_VERBS_SET:ND}=await Promise.resolve().then(()=>(Qm(),Ym)),LD=new Set(["update","upgrade","daemon","hook","version","-v","--version"]);if(Ht&&!LD.has(Ht)&&process.stderr.isTTY&&!ft.includes("--md")&&!ft.includes("--json")&&!ft.includes("--quiet")&&!ft.includes("-q")&&process.env.PRJCT_NO_UPDATE_NOTICE!=="1"){let{triggerBackgroundRefreshIfStale:s,getUpdateNotificationSync:e}=await Promise.resolve().then(()=>(Ri(),_g)),t=await import("node:fs"),n=await import("node:path"),r="";try{let o=n.resolve(n.dirname(new URL(import.meta.url).pathname),"..","package.json");r=JSON.parse(t.readFileSync(o,"utf-8")).version??""}catch{}try{s()}catch{}r&&process.on("exit",()=>{try{let o=e(r);o&&process.stderr.write(o)}catch{}})}var FD=new Set(["daemon","update","upgrade","version","-v","--version","hook"]);if(Ht&&!FD.has(Ht)&&process.env.PRJCT_NO_SELF_SYNC!=="1")try{let{VERSION:s}=await Promise.resolve().then(()=>(We(),ms));if(s){let{isSyncCurrent:e,runSelfHeal:t}=await Promise.resolve().then(()=>(Ii(),Dl));e(s)||await t(s)}}catch{}if(Ht&&!pE.has(Ht)&&!ND.has(Ht)){let s=ft.filter(n=>!n.startsWith("-")),e=s.join(" "),t=ft.filter(n=>n.startsWith("-"));s.length===1&&/^[a-z][a-z0-9:-]+$/.test(s[0])&&process.stderr.write(`prjct: '${s[0]}' is not a known command in this install \u2014 saving it to the inbox instead. If you meant the command, this prjct may be stale: run \`prjct update\`.
1677
- `),Ht="capture",ft=["capture",e,...t]}if(Ht&&!pE.has(Ht)&&process.env.PRJCT_NO_DAEMON!=="1"){let s=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(rr(),Nl)),t=e.socket();if(s.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(Bt(),Gt)),r=await import("node:crypto"),o=[],i={};for(let a=0;a<ft.length;a++){let l=ft[a];if(l.startsWith("--")){let u=l.slice(2);if(u.includes("=")){let d=u.indexOf("=");i[u.slice(0,d)]=u.slice(d+1)}else a+1<ft.length&&!ft[a+1].startsWith("--")?i[u]=ft[++a]:i[u]=!0}else l.startsWith("-")&&l.length===2?i[l.slice(1)]=!0:a>0&&o.push(l)}try{let a=await n({id:r.randomUUID(),command:Ht,args:o,options:i,cwd:process.cwd(),perfStartNs:globalThis.__perfStartNs?.toString()});a.stdout&&console.log(a.stdout),a.stderr&&console.error(a.stderr),process.exit(a.exitCode)}catch(a){let l=a?.message??"",u=a?.code??"";u==="ECONNREFUSED"||u==="ENOENT"||l.includes("ECONNREFUSED")||l.includes("ENOENT")||(console.error(`prjct: daemon dropped the request (${l}). Retry: \`prjct ${ft.join(" ")}\``),process.exit(1))}}}async function HD(){let s=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(rt(),Ut)),r=(await Promise.resolve().then(()=>(re(),ws))).default,o=(await Promise.resolve().then(()=>(Ni(),Qg))).default,{fileExists:i}=await Promise.resolve().then(()=>(V(),rn)),{invalidateProviderCache:a}=await Promise.resolve().then(()=>(cl(),Sg)),{VERSION:l}=await Promise.resolve().then(()=>(We(),ms));async function u(){let y=s.homedir(),w=await n();if(w.claude.installed){let v=e.join(y,".claude","CLAUDE.md");try{if(!(await import("node:fs/promises").then(P=>P.readFile(v,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}if(w.gemini.installed){let v=e.join(y,".gemini","GEMINI.md");try{if(!(await import("node:fs/promises").then(P=>P.readFile(v,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}return!w.claude.installed&&!w.gemini.installed,!0}c(u,"checkRoutersInstalled");let d=process.argv.slice(2),p=d.findIndex(y=>y==="--quiet"||y==="-q"),m=p!==-1;if(m){d.splice(p,1);let{setQuietMode:y}=await Promise.resolve().then(()=>(pe(),rf));y(!0)}let g=d.indexOf("--refresh"),k=g!==-1;k&&(d.splice(g,1),await a());async function E(y){let w=Date.now();try{let v=await r.getProjectId(process.cwd());if(v){let{sessionTracker:S}=await Promise.resolve().then(()=>(Kl(),gf));return await S.expireIfStale(v),await S.touch(v),()=>{let P=Date.now()-w;S.trackCommand(v,y,P).catch(()=>{}),Promise.resolve().then(()=>(Ql(),hf)).then(({performanceTracker:T})=>{T.recordTiming(v,"command_duration",P,{command:y}).catch(()=>{}),T.recordMemory(v,{command:y}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(c(E,"trackSession"),d[0]==="daemon"){let y=d[1]||"status";if(y==="start"){let{isDaemonRunning:w,spawnDaemon:v}=await Promise.resolve().then(()=>(Bt(),Gt));if(await w())console.log("Daemon is already running."),process.exitCode=0;else if(d.includes("--foreground")||d.includes("-f")){let{startDaemon:P}=await Promise.resolve().then(()=>(ES(),TS)),T=parseInt(d.find(ae=>ae.startsWith("--port="))?.split("=")[1]||"",10)||void 0,O=d.includes("--no-http");await P({port:T,noHttp:O,foreground:!0})}else await v()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(y==="stop"){let{isDaemonRunning:w,stopDaemon:v}=await Promise.resolve().then(()=>(Bt(),Gt));if(await w()){let S=await v();console.log(S?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=S?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(y==="status"){let{getDaemonStatus:w}=await Promise.resolve().then(()=>(Bt(),Gt)),v=await w();if(v.running){let S=v.uptime?Math.round(v.uptime/1e3):0,P=v.stale;console.log(`Daemon running (PID ${v.pid})${P?" \u26A0 STALE":""}`),console.log(` Uptime: ${S}s`),console.log(` Commands served: ${v.commandsServed??0}`),v.lastActivity&&console.log(` Last activity: ${v.lastActivity}`),P&&console.log(` ${t.yellow("\u26A0 Code changed since daemon started. Run: prjct restart")}`)}else console.log("Daemon is not running.");process.exitCode=0}else if(y==="restart"){let{isDaemonRunning:w,stopDaemon:v,forceKillDaemon:S,spawnDaemon:P}=await Promise.resolve().then(()=>(Bt(),Gt));await w()?(await v()||S(),await new Promise(ae=>setTimeout(ae,300))):S(),await P()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(y==="logs"){let w=await import("node:fs"),{DAEMON_PATHS:v}=await Promise.resolve().then(()=>(rr(),Nl)),S=v.log();if(!w.existsSync(S))console.error(`No daemon log at ${S}. Start the daemon first.`),process.exitCode=1;else{let P=d.includes("--follow")||d.includes("-f"),T=d.includes("--all"),O=d.find(Ee=>Ee.startsWith("--lines="))?.split("=")[1]||(d.includes("-n")?d[d.indexOf("-n")+1]:void 0),ae=O?parseInt(O,10):50;if(P){let{spawn:Ee}=await import("node:child_process"),be=Ee("tail",["-n",String(ae),"-f",S],{stdio:"inherit"});process.on("SIGINT",()=>be.kill("SIGINT")),await new Promise(Ye=>be.on("exit",()=>Ye()))}else if(T)process.stdout.write(w.readFileSync(S,"utf-8"));else{let Ee=w.readFileSync(S,"utf-8"),Ye=Ee.split(`
1674
+ `)}var dE=h(()=>{"use strict";dm();om();Gr();um();pm();rt();re();Zl();Yl();F();Ui();V();pe();c(ID,"main");c(_D,"routeSpec");c(DD,"validateCommandParams");c(MD,"parseCommandArgs");c(OD,"displayVersion");c(ND,"displayHelp");ID().catch(s=>{console.error("Fatal error:",b(s)),process.env.DEBUG&&console.error(zc(s)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var ft=process.argv.slice(2),Ht=ft.find(s=>!s.startsWith("--")&&!s.startsWith("-"));if(Ht==="__internal-auto-update"){let s=ft[1]??"";try{let{runBackgroundCheck:e}=await Promise.resolve().then(()=>(Xc(),Jc));await e(s)}catch{}process.exit(0)}var pE=new Set(["daemon","stop","restart","start","setup","update","upgrade","context","hooks","doctor","uninstall","claude","hook","seed","install","crew","watch","help","-h","--help","version","-v","--version","mcp","prefs","retro","health","skill-adherence","review-risk","context-save","context-restore"]),{REGISTERED_VERBS_SET:FD}=await Promise.resolve().then(()=>(Qm(),Ym)),HD=new Set(["update","upgrade","daemon","hook","version","-v","--version"]);if(Ht&&!HD.has(Ht)&&process.stderr.isTTY&&!ft.includes("--md")&&!ft.includes("--json")&&!ft.includes("--quiet")&&!ft.includes("-q")&&process.env.PRJCT_NO_UPDATE_NOTICE!=="1"){let{triggerBackgroundRefreshIfStale:s,getUpdateNotificationSync:e}=await Promise.resolve().then(()=>(Pi(),_g)),t=await import("node:fs"),n=await import("node:path"),r="";try{let o=n.resolve(n.dirname(new URL(import.meta.url).pathname),"..","package.json");r=JSON.parse(t.readFileSync(o,"utf-8")).version??""}catch{}try{s()}catch{}r&&process.on("exit",()=>{try{let o=e(r);o&&process.stderr.write(o)}catch{}})}var UD=new Set(["daemon","update","upgrade","version","-v","--version","hook"]);if(Ht&&!UD.has(Ht)&&process.env.PRJCT_NO_SELF_SYNC!=="1")try{let{VERSION:s}=await Promise.resolve().then(()=>(We(),ms));if(s){let{isSyncCurrent:e,runSelfHeal:t}=await Promise.resolve().then(()=>(_i(),Ml));e(s)||await t(s)}}catch{}if(Ht&&!pE.has(Ht)&&!FD.has(Ht)){let s=ft.filter(n=>!n.startsWith("-")),e=s.join(" "),t=ft.filter(n=>n.startsWith("-"));s.length===1&&/^[a-z][a-z0-9:-]+$/.test(s[0])&&process.stderr.write(`prjct: '${s[0]}' is not a known command in this install \u2014 saving it to the inbox instead. If you meant the command, this prjct may be stale: run \`prjct update\`.
1675
+ `),Ht="capture",ft=["capture",e,...t]}if(Ht&&!pE.has(Ht)&&process.env.PRJCT_NO_DAEMON!=="1"){let s=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(rr(),Ll)),t=e.socket();if(s.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(Bt(),Gt)),r=await import("node:crypto"),o=[],i={};for(let a=0;a<ft.length;a++){let l=ft[a];if(l.startsWith("--")){let u=l.slice(2);if(u.includes("=")){let d=u.indexOf("=");i[u.slice(0,d)]=u.slice(d+1)}else a+1<ft.length&&!ft[a+1].startsWith("--")?i[u]=ft[++a]:i[u]=!0}else l.startsWith("-")&&l.length===2?i[l.slice(1)]=!0:a>0&&o.push(l)}try{let a=await n({id:r.randomUUID(),command:Ht,args:o,options:i,cwd:process.cwd(),perfStartNs:globalThis.__perfStartNs?.toString()});a.stdout&&console.log(a.stdout),a.stderr&&console.error(a.stderr),process.exit(a.exitCode)}catch(a){let l=a?.message??"",u=a?.code??"";u==="ECONNREFUSED"||u==="ENOENT"||l.includes("ECONNREFUSED")||l.includes("ENOENT")||(console.error(`prjct: daemon dropped the request (${l}). Retry: \`prjct ${ft.join(" ")}\``),process.exit(1))}}}async function WD(){let s=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(rt(),Ut)),r=(await Promise.resolve().then(()=>(re(),ws))).default,o=(await Promise.resolve().then(()=>(Li(),Qg))).default,{fileExists:i}=await Promise.resolve().then(()=>(V(),rn)),{invalidateProviderCache:a}=await Promise.resolve().then(()=>(ll(),Sg)),{VERSION:l}=await Promise.resolve().then(()=>(We(),ms));async function u(){let y=s.homedir(),w=await n();if(w.claude.installed){let v=e.join(y,".claude","CLAUDE.md");try{if(!(await import("node:fs/promises").then(P=>P.readFile(v,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}if(w.gemini.installed){let v=e.join(y,".gemini","GEMINI.md");try{if(!(await import("node:fs/promises").then(P=>P.readFile(v,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}return!w.claude.installed&&!w.gemini.installed,!0}c(u,"checkRoutersInstalled");let d=process.argv.slice(2),p=d.findIndex(y=>y==="--quiet"||y==="-q"),m=p!==-1;if(m){d.splice(p,1);let{setQuietMode:y}=await Promise.resolve().then(()=>(pe(),rf));y(!0)}let g=d.indexOf("--refresh"),k=g!==-1;k&&(d.splice(g,1),await a());async function E(y){let w=Date.now();try{let v=await r.getProjectId(process.cwd());if(v){let{sessionTracker:S}=await Promise.resolve().then(()=>(Yl(),gf));return await S.expireIfStale(v),await S.touch(v),()=>{let P=Date.now()-w;S.trackCommand(v,y,P).catch(()=>{}),Promise.resolve().then(()=>(Zl(),hf)).then(({performanceTracker:T})=>{T.recordTiming(v,"command_duration",P,{command:y}).catch(()=>{}),T.recordMemory(v,{command:y}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(c(E,"trackSession"),d[0]==="daemon"){let y=d[1]||"status";if(y==="start"){let{isDaemonRunning:w,spawnDaemon:v}=await Promise.resolve().then(()=>(Bt(),Gt));if(await w())console.log("Daemon is already running."),process.exitCode=0;else if(d.includes("--foreground")||d.includes("-f")){let{startDaemon:P}=await Promise.resolve().then(()=>(ES(),TS)),T=parseInt(d.find(ae=>ae.startsWith("--port="))?.split("=")[1]||"",10)||void 0,O=d.includes("--no-http");await P({port:T,noHttp:O,foreground:!0})}else await v()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(y==="stop"){let{isDaemonRunning:w,stopDaemon:v}=await Promise.resolve().then(()=>(Bt(),Gt));if(await w()){let S=await v();console.log(S?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=S?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(y==="status"){let{getDaemonStatus:w}=await Promise.resolve().then(()=>(Bt(),Gt)),v=await w();if(v.running){let S=v.uptime?Math.round(v.uptime/1e3):0,P=v.stale;console.log(`Daemon running (PID ${v.pid})${P?" \u26A0 STALE":""}`),console.log(` Uptime: ${S}s`),console.log(` Commands served: ${v.commandsServed??0}`),v.lastActivity&&console.log(` Last activity: ${v.lastActivity}`),P&&console.log(` ${t.yellow("\u26A0 Code changed since daemon started. Run: prjct restart")}`)}else console.log("Daemon is not running.");process.exitCode=0}else if(y==="restart"){let{isDaemonRunning:w,stopDaemon:v,forceKillDaemon:S,spawnDaemon:P}=await Promise.resolve().then(()=>(Bt(),Gt));await w()?(await v()||S(),await new Promise(ae=>setTimeout(ae,300))):S(),await P()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(y==="logs"){let w=await import("node:fs"),{DAEMON_PATHS:v}=await Promise.resolve().then(()=>(rr(),Ll)),S=v.log();if(!w.existsSync(S))console.error(`No daemon log at ${S}. Start the daemon first.`),process.exitCode=1;else{let P=d.includes("--follow")||d.includes("-f"),T=d.includes("--all"),O=d.find(Ee=>Ee.startsWith("--lines="))?.split("=")[1]||(d.includes("-n")?d[d.indexOf("-n")+1]:void 0),ae=O?parseInt(O,10):50;if(P){let{spawn:Ee}=await import("node:child_process"),be=Ee("tail",["-n",String(ae),"-f",S],{stdio:"inherit"});process.on("SIGINT",()=>be.kill("SIGINT")),await new Promise(Ye=>be.on("exit",()=>Ye()))}else if(T)process.stdout.write(w.readFileSync(S,"utf-8"));else{let Ee=w.readFileSync(S,"utf-8"),Ye=Ee.split(`
1678
1676
  `).slice(-Math.max(1,ae));process.stdout.write(Ye.join(`
1679
1677
  `)),Ee.endsWith(`
1680
1678
  `)||process.stdout.write(`
1681
- `)}process.exitCode=0}}else console.error(`Unknown daemon command: ${y}. Use: start, stop, restart, status, logs`),process.exitCode=1}else if(d[0]==="stop"){let{isDaemonRunning:y,stopDaemon:w,forceKillDaemon:v}=await Promise.resolve().then(()=>(Bt(),Gt));if(d.includes("--force")||d.includes("-f")){let P=v();console.log(P?"Daemon force-killed.":"Daemon is not running."),process.exitCode=0}else await y()?await w()?(console.log("Daemon stopped."),process.exitCode=0):(console.log("Graceful stop failed, force-killing..."),v(),console.log("Daemon force-killed."),process.exitCode=0):(v(),console.log("Daemon is not running (cleaned up stale files)."),process.exitCode=0)}else if(d[0]==="restart"){let{isDaemonRunning:y,stopDaemon:w,forceKillDaemon:v,spawnDaemon:S}=await Promise.resolve().then(()=>(Bt(),Gt));await y()?(await w()||v(),await new Promise(O=>setTimeout(O,300))):v(),await S()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(d[0]==="start"||d[0]==="setup"){let{runStart:y}=await Promise.resolve().then(()=>(PS(),RS));await y()}else if(d[0]==="context"){let y=process.cwd(),w=await r.getProjectId(y);if(!w)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let v=await E("context"),S=d.slice(1).filter(T=>T!=="--md"&&T!=="--json"),P=d.includes("--md");if(S.length===0){let{ContextCommands:T}=await Promise.resolve().then(()=>(mc(),Fv)),ae=await new T().context(null,y,{md:P});process.exitCode=ae.success?0:1}else{let{runContextTool:T}=await Promise.resolve().then(()=>(jS(),AS)),O=await T(S,w,y);console.log(JSON.stringify(O,null,2)),process.exitCode=O.tool==="error"?1:0}v()}}else if(d[0]==="hooks"){let y=await E("hooks"),{hooksService:w}=await Promise.resolve().then(()=>(HS(),FS)),v=d[1]||"status",S=await w.run(process.cwd(),v);process.exitCode=S,y()}else if(d[0]==="seed"){let y=d[1]??"list",w=d.slice(2).filter(O=>!O.startsWith("-")).join(","),v=d.includes("--md"),{SeedCommands:S}=await Promise.resolve().then(()=>(fc(),Uv)),P=new S,T={success:!1,error:"unknown"};y==="add"?T=await P.add(w||null,process.cwd(),{md:v}):y==="remove"?T=await P.remove(w||null,process.cwd(),{md:v}):y==="list"?T=await P.list(null,process.cwd(),{md:v}):y==="suggest"?T=await P.suggest(null,process.cwd(),{md:v}):console.error(`Unknown seed subcommand: ${y}. Use: add, remove, list, suggest.`),process.exitCode=T.success?0:1}else if(d[0]==="context-save"){let y=d.slice(1).find(ae=>!ae.startsWith("-"))??null,w=d.indexOf("--notes"),v=w>=0?d[w+1]:void 0,S=d.includes("--md"),{ContextCheckpointCommands:P}=await Promise.resolve().then(()=>(vm(),km)),O=await new P().save(y,process.cwd(),{md:S,notes:v});process.exitCode=O.success?0:1}else if(d[0]==="context-restore"){let y=d.includes("--list"),w=d.indexOf("--file"),v=w>=0?d[w+1]:void 0,S=d.slice(1).find(Ee=>!Ee.startsWith("-"))??null,P=d.includes("--md"),{ContextCheckpointCommands:T}=await Promise.resolve().then(()=>(vm(),km)),ae=await new T().restore(S,process.cwd(),{md:P,list:y,file:v});process.exitCode=ae.success?0:1}else if(d[0]==="health"){let y=d.includes("--md"),{HealthCommands:w}=await Promise.resolve().then(()=>(BS(),GS)),S=await new w().health(null,process.cwd(),{md:y});process.exitCode=S.success?0:1}else if(d[0]==="retro"){let y=d.slice(1).find(T=>!T.startsWith("-"))??null,w=d.includes("--md"),{RetroCommands:v}=await Promise.resolve().then(()=>(JS(),qS)),P=await new v().retro(y,process.cwd(),{md:w});process.exitCode=P.success?0:1}else if(d[0]==="skill-adherence"){let y=d.slice(1).find(T=>!T.startsWith("-"))??null,w=d.includes("--md"),{SkillAdherenceCommands:v}=await Promise.resolve().then(()=>(zS(),XS)),P=await new v().skillAdherence(y,process.cwd(),{md:w});process.exitCode=P.success?0:1}else if(d[0]==="review-risk"){let y=d.includes("--md"),{ReviewRiskCommands:w}=await Promise.resolve().then(()=>(ZS(),QS)),S=await new w().reviewRisk(null,process.cwd(),{md:y});process.exitCode=S.success?0:1}else if(d[0]==="prefs"){let y=d[1]??"list",w=d.slice(2).filter(Ee=>!Ee.startsWith("-")),v=d.indexOf("--reason"),S=v>=0?d[v+1]:void 0,P=d.includes("--md"),{PreferencesCommands:T}=await Promise.resolve().then(()=>(rT(),sT)),ae=await new T().prefs([y,...w],process.cwd(),{md:P,reason:S});process.exitCode=ae.success?0:1}else if(d[0]==="install"){let{InstallCommands:y}=await Promise.resolve().then(()=>(Ko(),Tp)),w=new y,v=d.includes("--md"),S=await w.install(null,process.cwd(),{md:v});process.exitCode=S.success?0:1}else if(d[0]==="claude"){let y=d[1]??"status",{InstallCommands:w}=await Promise.resolve().then(()=>(Ko(),Tp)),v=new w,S=d.includes("--md"),P;if(y==="install")P=await v.install(null,process.cwd(),{md:S});else if(y==="uninstall")P=await v.uninstall(null,process.cwd(),{md:S});else{let T=await v.status();T.success?(console.log(S?`# prjct Claude Code hooks
1679
+ `)}process.exitCode=0}}else console.error(`Unknown daemon command: ${y}. Use: start, stop, restart, status, logs`),process.exitCode=1}else if(d[0]==="stop"){let{isDaemonRunning:y,stopDaemon:w,forceKillDaemon:v}=await Promise.resolve().then(()=>(Bt(),Gt));if(d.includes("--force")||d.includes("-f")){let P=v();console.log(P?"Daemon force-killed.":"Daemon is not running."),process.exitCode=0}else await y()?await w()?(console.log("Daemon stopped."),process.exitCode=0):(console.log("Graceful stop failed, force-killing..."),v(),console.log("Daemon force-killed."),process.exitCode=0):(v(),console.log("Daemon is not running (cleaned up stale files)."),process.exitCode=0)}else if(d[0]==="restart"){let{isDaemonRunning:y,stopDaemon:w,forceKillDaemon:v,spawnDaemon:S}=await Promise.resolve().then(()=>(Bt(),Gt));await y()?(await w()||v(),await new Promise(O=>setTimeout(O,300))):v(),await S()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(d[0]==="start"||d[0]==="setup"){let{runStart:y}=await Promise.resolve().then(()=>(PS(),RS));await y()}else if(d[0]==="context"){let y=process.cwd(),w=await r.getProjectId(y);if(!w)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let v=await E("context"),S=d.slice(1).filter(T=>T!=="--md"&&T!=="--json"),P=d.includes("--md");if(S.length===0){let{ContextCommands:T}=await Promise.resolve().then(()=>(gc(),Fv)),ae=await new T().context(null,y,{md:P});process.exitCode=ae.success?0:1}else{let{runContextTool:T}=await Promise.resolve().then(()=>(jS(),AS)),O=await T(S,w,y);console.log(JSON.stringify(O,null,2)),process.exitCode=O.tool==="error"?1:0}v()}}else if(d[0]==="hooks"){let y=await E("hooks"),{hooksService:w}=await Promise.resolve().then(()=>(HS(),FS)),v=d[1]||"status",S=await w.run(process.cwd(),v);process.exitCode=S,y()}else if(d[0]==="seed"){let y=d[1]??"list",w=d.slice(2).filter(O=>!O.startsWith("-")).join(","),v=d.includes("--md"),{SeedCommands:S}=await Promise.resolve().then(()=>(hc(),Uv)),P=new S,T={success:!1,error:"unknown"};y==="add"?T=await P.add(w||null,process.cwd(),{md:v}):y==="remove"?T=await P.remove(w||null,process.cwd(),{md:v}):y==="list"?T=await P.list(null,process.cwd(),{md:v}):y==="suggest"?T=await P.suggest(null,process.cwd(),{md:v}):console.error(`Unknown seed subcommand: ${y}. Use: add, remove, list, suggest.`),process.exitCode=T.success?0:1}else if(d[0]==="context-save"){let y=d.slice(1).find(ae=>!ae.startsWith("-"))??null,w=d.indexOf("--notes"),v=w>=0?d[w+1]:void 0,S=d.includes("--md"),{ContextCheckpointCommands:P}=await Promise.resolve().then(()=>(bm(),vm)),O=await new P().save(y,process.cwd(),{md:S,notes:v});process.exitCode=O.success?0:1}else if(d[0]==="context-restore"){let y=d.includes("--list"),w=d.indexOf("--file"),v=w>=0?d[w+1]:void 0,S=d.slice(1).find(Ee=>!Ee.startsWith("-"))??null,P=d.includes("--md"),{ContextCheckpointCommands:T}=await Promise.resolve().then(()=>(bm(),vm)),ae=await new T().restore(S,process.cwd(),{md:P,list:y,file:v});process.exitCode=ae.success?0:1}else if(d[0]==="health"){let y=d.includes("--md"),{HealthCommands:w}=await Promise.resolve().then(()=>(BS(),GS)),S=await new w().health(null,process.cwd(),{md:y});process.exitCode=S.success?0:1}else if(d[0]==="retro"){let y=d.slice(1).find(T=>!T.startsWith("-"))??null,w=d.includes("--md"),{RetroCommands:v}=await Promise.resolve().then(()=>(JS(),qS)),P=await new v().retro(y,process.cwd(),{md:w});process.exitCode=P.success?0:1}else if(d[0]==="skill-adherence"){let y=d.slice(1).find(T=>!T.startsWith("-"))??null,w=d.includes("--md"),{SkillAdherenceCommands:v}=await Promise.resolve().then(()=>(zS(),XS)),P=await new v().skillAdherence(y,process.cwd(),{md:w});process.exitCode=P.success?0:1}else if(d[0]==="review-risk"){let y=d.includes("--md"),{ReviewRiskCommands:w}=await Promise.resolve().then(()=>(ZS(),QS)),S=await new w().reviewRisk(null,process.cwd(),{md:y});process.exitCode=S.success?0:1}else if(d[0]==="prefs"){let y=d[1]??"list",w=d.slice(2).filter(Ee=>!Ee.startsWith("-")),v=d.indexOf("--reason"),S=v>=0?d[v+1]:void 0,P=d.includes("--md"),{PreferencesCommands:T}=await Promise.resolve().then(()=>(rT(),sT)),ae=await new T().prefs([y,...w],process.cwd(),{md:P,reason:S});process.exitCode=ae.success?0:1}else if(d[0]==="install"){let{InstallCommands:y}=await Promise.resolve().then(()=>(Ko(),Ep)),w=new y,v=d.includes("--md"),S=await w.install(null,process.cwd(),{md:v});process.exitCode=S.success?0:1}else if(d[0]==="claude"){let y=d[1]??"status",{InstallCommands:w}=await Promise.resolve().then(()=>(Ko(),Ep)),v=new w,S=d.includes("--md"),P;if(y==="install")P=await v.install(null,process.cwd(),{md:S});else if(y==="uninstall")P=await v.uninstall(null,process.cwd(),{md:S});else{let T=await v.status();T.success?(console.log(S?`# prjct Claude Code hooks
1682
1680
 
1683
1681
  - installed: ${T.installed}
1684
1682
  - expected: ${T.expected}
1685
- `:`installed: ${T.installed}/${T.expected}`),P=T):(console.error(T.error),P=T)}process.exitCode=P.success?0:1}else if(d[0]==="hook"){let y=d[1],w=process.cwd();try{switch(y){case"session-start":{let{runSessionStartHook:v}=await Promise.resolve().then(()=>($c(),lT));await v(w);break}case"prompt":{let{runPromptHook:v}=await Promise.resolve().then(()=>(fT(),gT));await v(w);break}case"pre-commit":{let{runPreCommitHook:v}=await Promise.resolve().then(()=>(wT(),yT));await v(w);break}case"post-edit":{let{runPostEditHook:v}=await Promise.resolve().then(()=>(vT(),kT));await v(w);break}case"stop":{let{runStopHook:v}=await Promise.resolve().then(()=>(XT(),JT));await v(w);break}case"subagent-start":{let{runSubagentStartHook:v}=await Promise.resolve().then(()=>(KT(),zT));await v(w);break}case"cwd-changed":{let{runCwdChangedHook:v}=await Promise.resolve().then(()=>(QT(),YT));await v(w);break}default:process.stdout.write(`{}
1683
+ `:`installed: ${T.installed}/${T.expected}`),P=T):(console.error(T.error),P=T)}process.exitCode=P.success?0:1}else if(d[0]==="hook"){let y=d[1],w=process.cwd();try{switch(y){case"session-start":{let{runSessionStartHook:v}=await Promise.resolve().then(()=>(_c(),lT));await v(w);break}case"prompt":{let{runPromptHook:v}=await Promise.resolve().then(()=>(hT(),fT));await v(w);break}case"pre-commit":{let{runPreCommitHook:v}=await Promise.resolve().then(()=>(wT(),yT));await v(w);break}case"post-edit":{let{runPostEditHook:v}=await Promise.resolve().then(()=>(vT(),kT));await v(w);break}case"stop":{let{runStopHook:v}=await Promise.resolve().then(()=>(XT(),JT));await v(w);break}case"subagent-start":{let{runSubagentStartHook:v}=await Promise.resolve().then(()=>(KT(),zT));await v(w);break}case"cwd-changed":{let{runCwdChangedHook:v}=await Promise.resolve().then(()=>(QT(),YT));await v(w);break}default:process.stdout.write(`{}
1686
1684
  `)}process.exitCode=0}catch{process.stdout.write(`{}
1687
- `),process.exitCode=0}}else if(d[0]==="crew"){let y=d[1]??"status",{CrewCommands:w}=await Promise.resolve().then(()=>(tE(),eE)),v=new w,S=d.includes("--md"),P=c(O=>{let ae=d.indexOf(`--${O}`);if(ae>=0&&ae+1<d.length&&!d[ae+1].startsWith("--"))return d[ae+1]},"getFlag"),T={success:!1};if(y==="install")T=await v.install(null,process.cwd(),{md:S});else if(y==="uninstall")T=await v.uninstall(null,process.cwd(),{md:S});else if(y==="status")T=await v.status(null,process.cwd(),{md:S});else if(y==="checkpoints"){let O=d[2]??"show";T=await v.checkpoints(O,process.cwd(),{md:S,content:P("content"),file:P("file")})}else y==="record-run"?T=await v.recordRun(process.cwd(),{md:S,spec:P("spec"),task:P("task"),"implementer-summary":P("implementer-summary"),files:P("files"),"reviewer-verdict":P("reviewer-verdict"),"reviewer-notes":P("reviewer-notes"),"run-id":P("run-id")}):(console.error(`Unknown crew subcommand: ${y}. Use: install, uninstall, status, checkpoints, record-run.`),T={success:!1,error:`unknown subcommand: ${y}`});process.exitCode=T.success?0:1}else if(d[0]==="doctor"){let y=await E("doctor"),{doctorService:w}=await Promise.resolve().then(()=>(sE(),nE)),v=await w.run(process.cwd());process.exitCode=v,y()}else if(d[0]==="uninstall"){let{uninstall:y}=await Promise.resolve().then(()=>(cm(),uS)),w=d.includes("--force")||d.includes("-f"),v=d.includes("--backup")||d.includes("-b"),S=d.includes("--dry-run")||d.includes("-n"),P=d.includes("--keep-package"),T=await y({force:w,backup:v,dryRun:S,keepPackage:P});process.exitCode=T.success?0:1}else if(d[0]==="watch"){let y=process.cwd();if(!await r.getProjectId(y))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:v}=await Promise.resolve().then(()=>(oE(),rE)),S=d.includes("--verbose")||d.includes("-v"),P=d.find(be=>be.startsWith("--debounce=")),T=P?parseInt(P.split("=")[1],10):void 0,O=d.find(be=>be.startsWith("--interval=")),ae=O?parseInt(O.split("=")[1],10)*1e3:void 0,Ee=await v.start(y,{verbose:S,quiet:m,debounceMs:T,minIntervalMs:ae});Ee.success||(console.error(Ee.error),process.exitCode=1)}}else if(d[0]==="help"||d[0]==="-h"||d[0]==="--help"){let{getHelp:y}=await Promise.resolve().then(()=>(cE(),aE)),w=d[1];console.log(y(w)),process.exitCode=0}else if(d[0]==="version"||d[0]==="-v"||d[0]==="--version"){let y=await n(k),w=s.homedir(),v=process.cwd(),[S,P,T,O,ae,Ee]=await Promise.all([i(e.join(w,".claude","commands","p.md")),i(e.join(w,".gemini","commands","p.toml")),i(e.join(v,".cursor")),i(e.join(v,".cursor","rules","prjct.mdc")),i(e.join(v,".windsurf")),i(e.join(v,".windsurf","rules","prjct.md"))]);if(console.log(`
1685
+ `),process.exitCode=0}}else if(d[0]==="crew"){let y=d[1]??"status",{CrewCommands:w}=await Promise.resolve().then(()=>(tE(),eE)),v=new w,S=d.includes("--md"),P=c(O=>{let ae=d.indexOf(`--${O}`);if(ae>=0&&ae+1<d.length&&!d[ae+1].startsWith("--"))return d[ae+1]},"getFlag"),T={success:!1};if(y==="install")T=await v.install(null,process.cwd(),{md:S});else if(y==="uninstall")T=await v.uninstall(null,process.cwd(),{md:S});else if(y==="status")T=await v.status(null,process.cwd(),{md:S});else if(y==="checkpoints"){let O=d[2]??"show";T=await v.checkpoints(O,process.cwd(),{md:S,content:P("content"),file:P("file")})}else y==="record-run"?T=await v.recordRun(process.cwd(),{md:S,spec:P("spec"),task:P("task"),"implementer-summary":P("implementer-summary"),files:P("files"),"reviewer-verdict":P("reviewer-verdict"),"reviewer-notes":P("reviewer-notes"),"run-id":P("run-id")}):(console.error(`Unknown crew subcommand: ${y}. Use: install, uninstall, status, checkpoints, record-run.`),T={success:!1,error:`unknown subcommand: ${y}`});process.exitCode=T.success?0:1}else if(d[0]==="doctor"){let y=await E("doctor"),{doctorService:w}=await Promise.resolve().then(()=>(sE(),nE)),v=await w.run(process.cwd());process.exitCode=v,y()}else if(d[0]==="uninstall"){let{uninstall:y}=await Promise.resolve().then(()=>(lm(),uS)),w=d.includes("--force")||d.includes("-f"),v=d.includes("--backup")||d.includes("-b"),S=d.includes("--dry-run")||d.includes("-n"),P=d.includes("--keep-package"),T=await y({force:w,backup:v,dryRun:S,keepPackage:P});process.exitCode=T.success?0:1}else if(d[0]==="watch"){let y=process.cwd();if(!await r.getProjectId(y))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:v}=await Promise.resolve().then(()=>(oE(),rE)),S=d.includes("--verbose")||d.includes("-v"),P=d.find(be=>be.startsWith("--debounce=")),T=P?parseInt(P.split("=")[1],10):void 0,O=d.find(be=>be.startsWith("--interval=")),ae=O?parseInt(O.split("=")[1],10)*1e3:void 0,Ee=await v.start(y,{verbose:S,quiet:m,debounceMs:T,minIntervalMs:ae});Ee.success||(console.error(Ee.error),process.exitCode=1)}}else if(d[0]==="help"||d[0]==="-h"||d[0]==="--help"){let{getHelp:y}=await Promise.resolve().then(()=>(cE(),aE)),w=d[1];console.log(y(w)),process.exitCode=0}else if(d[0]==="version"||d[0]==="-v"||d[0]==="--version"){let y=await n(k),w=s.homedir(),v=process.cwd(),[S,P,T,O,ae,Ee]=await Promise.all([i(e.join(w,".claude","commands","p.md")),i(e.join(w,".gemini","commands","p.toml")),i(e.join(v,".cursor")),i(e.join(v,".cursor","rules","prjct.mdc")),i(e.join(v,".windsurf")),i(e.join(v,".windsurf","rules","prjct.md"))]);if(console.log(`
1688
1686
  ${t.cyan("p/")} prjct v${l}
1689
1687
  ${t.dim("Context layer for AI coding agents")}
1690
1688
 
@@ -1692,7 +1690,7 @@ ${t.dim("Providers:")}`),y.claude.installed){let be=S?t.green("\u2713 ready"):t.
1692
1690
  ${t.dim("Run 'prjct start' to configure (CLI providers)")}
1693
1691
  ${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
1694
1692
  ${t.cyan("https://prjct.app")}
1695
- `)}else{let{default:y}=await Promise.resolve().then(()=>(ge(),ml)),w=e.join(y.globalConfigDir,"installed-editors.json"),v=await u();if(!new Set(["auth","login","logout","init"]).has(d[0])&&(!await i(w)||!v))console.log(`
1693
+ `)}else{let{default:y}=await Promise.resolve().then(()=>(ge(),gl)),w=e.join(y.globalConfigDir,"installed-editors.json"),v=await u();if(!new Set(["auth","login","logout","init"]).has(d[0])&&(!await i(w)||!v))console.log(`
1696
1694
  ${t.cyan.bold(" Welcome to prjct!")}
1697
1695
 
1698
1696
  Run ${t.bold("prjct start")} to configure your AI providers.
@@ -1701,5 +1699,5 @@ ${t.cyan.bold(" Welcome to prjct!")}
1701
1699
  Claude Code, Gemini CLI, or both.`)}
1702
1700
  `),console.error(`prjct: not configured \u2014 \`${d[0]}\` did not run. Run \`prjct start\` (AI providers) or \`prjct init\` (project) first.`),process.exitCode=1;else{try{let P=await o.getLastVersion();if(P&&P!==l){let T=d[0]==="update",O=c(be=>be.split(".").map(Ye=>Number.parseInt(Ye,10)||0),"parts"),Ee=c((be,Ye)=>{let yn=O(be),Ln=O(Ye);for(let Mt=0;Mt<3;Mt++){if((yn[Mt]??0)>(Ln[Mt]??0))return 1;if((yn[Mt]??0)<(Ln[Mt]??0))return-1}return 0},"cmp")(l,P)>0;!T&&Ee&&console.log(`
1703
1701
  ${t.yellow("\u2139")} Updating prjct v${P} \u2192 v${l}...
1704
- `);try{let{default:be}=await Promise.resolve().then(()=>(yr(),pa));await be.run()}catch{await o.updateVersion(l).catch(()=>{})}}}catch{}d.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(Bt(),Gt)).then(({spawnDaemon:P})=>P()).catch(()=>{}),await Promise.resolve().then(()=>(dE(),OD))}}}c(HD,"main");HD().catch(s=>{process.argv[2]==="hook"&&(process.stdout.write(`{}
1702
+ `);try{let{default:be}=await Promise.resolve().then(()=>(yr(),ma));await be.run()}catch{await o.updateVersion(l).catch(()=>{})}}}catch{}d.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(Bt(),Gt)).then(({spawnDaemon:P})=>P()).catch(()=>{}),await Promise.resolve().then(()=>(dE(),LD))}}}c(WD,"main");WD().catch(s=>{process.argv[2]==="hook"&&(process.stdout.write(`{}
1705
1703
  `),process.exit(0)),console.error("Fatal error:",s.message),process.exit(1)});