@a-company/paradigm 5.21.2 → 5.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import*as d from'fs';import*as l from'path';import*as c from'js-yaml';var m=[{id:"explore-before-implement",name:"Explore Before Implementing",description:"Call ripple/navigate/search before modifying existing symbols to understand impact",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple","paradigm_navigate","paradigm_search","paradigm_related"]}},enabled:true},{id:"ripple-before-modify",name:"Ripple Before Modifying",description:"Run ripple analysis before modifying symbols with dependents",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple"]}},enabled:true},{id:"check-fragility",name:"Check Fragility",description:"Check history fragility for symbols before modifying frequently-broken code",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_history_fragility"]}},enabled:true},{id:"wisdom-before-implement",name:"Check Team Wisdom",description:"Check team wisdom (preferences, antipatterns, decisions) before implementing",category:"collaboration",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_wisdom_context","paradigm_wisdom_expert"]}},enabled:true},{id:"verify-before-done",name:"Verify Before Done",description:"Run postflight compliance checks before finishing a session",category:"verification",trigger:"on-stop",severity:"warn",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight"]}},enabled:true},{id:"postflight-compliance",name:"Postflight Compliance",description:"Ensure postflight checks pass without errors before finishing",category:"verification",trigger:"on-stop",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight","paradigm_reindex"]}},enabled:true},{id:"test-new-components",name:"Test New Components",description:"New components should have associated tests or test plan documented",category:"testing",trigger:"postflight",severity:"advisory",check:{type:"tests-exist",params:{patterns:["**/*.test.*","**/*.spec.*","**/tests/**"]}},enabled:true},{id:"purpose-coverage",name:"Purpose File Coverage",description:"All modified source directories should have .purpose file coverage",category:"documentation",trigger:"postflight",severity:"warn",check:{type:"file-exists",params:{patterns:["**/.purpose"]}},enabled:true},{id:"record-lore-for-significant",name:"Record Lore for Significant Changes",description:"Sessions modifying 3+ files should record a lore entry",category:"documentation",trigger:"on-stop",severity:"warn",check:{type:"lore-recorded",params:{}},enabled:true},{id:"gates-for-routes",name:"Gates for Routes",description:"API routes should have corresponding gate declarations in portal.yaml",category:"security",trigger:"postflight",severity:"warn",check:{type:"gates-declared",params:{requireRoutes:true}},enabled:true},{id:"commit-message-symbols",name:"Commit Message Format",description:"Commit messages should follow type(#symbol): format and include a Symbols: trailer",category:"documentation",trigger:"on-commit",severity:"advisory",check:{type:"commit-message-format",params:{messagePatterns:["^(feat|fix|refactor|chore|docs|test|style|perf|ci|build)\\(","Symbols:"]}},enabled:true},{id:"flow-coverage-for-multi-component",name:"Flow Coverage",description:"Changes spanning 3+ components should have a documented $flow",category:"documentation",trigger:"postflight",severity:"advisory",check:{type:"flow-coverage",params:{minSteps:3}},enabled:true},{id:"context-session-awareness",name:"Context Awareness",description:"Use session recovery or context check tools for session continuity",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"context-checked",params:{contextTools:["paradigm_context_check","paradigm_session_recover","paradigm_session_checkpoint"]}},enabled:true},{id:"aspect-anchors-valid",name:"Aspect Anchors Valid",description:"Aspects touched during the session should have their code anchors validated",category:"verification",trigger:"postflight",severity:"advisory",check:{type:"aspect-anchored",params:{checkAnchors:true}},enabled:true}];var C=m,_=30*1e3;function k(e){try{let t=l.join(e,".paradigm","config.yaml");if(d.existsSync(t)){let s=d.readFileSync(t,"utf8"),o=c.load(s)?.limits;if(o?.habitsCacheTtlMs&&typeof o.habitsCacheTtlMs=="number")return o.habitsCacheTtlMs}}catch{}return _}var f=new Map;function E(e){let t=l.resolve(e),s=f.get(t),i=k(t);if(s&&Date.now()-s.loadedAt<i)return s.habits;let o=T(t);return f.set(t,{habits:o,loadedAt:Date.now()}),o}function T(e){let t=new Map;for(let a of C)t.set(a.id,{...a});let s=process.env.HOME||process.env.USERPROFILE||"~",i=y(l.join(s,".paradigm","habits.yaml"));i&&v(t,i);let o=h(l.join(s,".paradigm","habits"));for(let a of o)t.set(a.id,a);let r=y(l.join(e,".paradigm","habits.yaml"));r&&v(t,r);let u=h(l.join(e,".paradigm","habits"));for(let a of u)t.set(a.id,a);return Array.from(t.values())}function h(e){if(!d.existsSync(e))return [];try{let t=d.readdirSync(e).filter(i=>i.endsWith(".habit")).sort(),s=[];for(let i of t)try{let o=d.readFileSync(l.join(e,i),"utf8"),r=c.load(o);r?.id&&r?.name&&s.push(r);}catch{}return s}catch{return []}}function y(e){if(!d.existsSync(e))return null;try{let t=d.readFileSync(e,"utf8");return c.load(t)}catch{return null}}function v(e,t){if(t.habits)for(let s of t.habits)e.set(s.id,{...s});if(t.overrides)for(let[s,i]of Object.entries(t.overrides)){let o=e.get(s);o&&D(o,i);}}function D(e,t){t.severity!==void 0&&(e.severity=t.severity),t.enabled!==void 0&&(e.enabled=t.enabled);}function p(e,t){return e.filter(s=>s.enabled&&s.trigger===t)}function M(e){return e.filter(t=>t.enabled)}function x(e){let t=l.resolve(e);f.delete(t);}function R(e,t,s){let i=p(e,t),o=[];for(let n of i){let H=F(n,s);o.push(H);}let r=o.filter(n=>n.result==="followed").length,u=o.filter(n=>n.result==="skipped").length,a=o.filter(n=>n.result==="partial").length,g=o.filter(n=>n.result==="skipped"&&n.habit.severity==="block").length;return {trigger:t,evaluations:o,summary:{total:o.length,followed:r,skipped:u,partial:a,blockingViolations:g},blocksCompletion:g>0}}function F(e,t){switch(e.check.type){case "tool-called":return A(e,t);case "file-exists":return P(e,t);case "lore-recorded":return j(e,t);case "symbols-registered":return S(e,t);case "gates-declared":return W(e,t);case "tests-exist":return $(e,t);case "file-modified":return N(e,t);case "git-clean":return q(e,t);case "commit-message-format":return B(e,t);case "flow-coverage":return I(e,t);case "context-checked":return O(e,t);case "aspect-anchored":return U(e,t);default:return {habit:e,result:"partial",reason:`Unknown check type: ${e.check.type}`}}}function A(e,t){let s=e.check.params.tools||[];if(s.length===0)return {habit:e,result:"followed",reason:"No tools required"};let i=s.filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Called: ${i.join(", ")}`,evidence:i}:t.filesModified.length===0&&t.symbolsTouched.length===0?{habit:e,result:"followed",reason:"No modifications made, habit not applicable"}:{habit:e,result:"skipped",reason:`None of [${s.join(", ")}] were called before modifying code`}}function P(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified, check not applicable"};if(t.filesModified.some(o=>o.endsWith(".purpose")||o.includes(".paradigm/")))return {habit:e,result:"followed",reason:"Purpose files were updated alongside source changes"};let i=t.filesModified.filter(o=>!o.endsWith(".md")&&!o.endsWith(".json")&&!o.endsWith(".yaml")&&!o.endsWith(".yml")&&!o.endsWith(".lock")&&!o.endsWith(".purpose")&&!o.includes(".paradigm/"));return i.length===0?{habit:e,result:"followed",reason:"Only non-source files modified"}:{habit:e,result:"skipped",reason:`${i.length} source file(s) modified without .purpose updates`,evidence:i.slice(0,5)}}function j(e,t){let s=t.filesModified.filter(i=>!i.endsWith(".md")&&!i.endsWith(".json")&&!i.endsWith(".yaml")&&!i.endsWith(".yml")&&!i.endsWith(".lock")&&!i.endsWith(".purpose")&&!i.includes(".paradigm/"));return s.length<3?{habit:e,result:"followed",reason:"Session not significant enough to require lore (< 3 source files)"}:t.loreRecorded?{habit:e,result:"followed",reason:"Lore entry was recorded for this session"}:t.toolsCalled.includes("paradigm_lore_record")?{habit:e,result:"followed",reason:"paradigm_lore_record was called during session"}:{habit:e,result:"skipped",reason:`${s.length} source files modified but no lore entry recorded`,evidence:s.slice(0,5)}}function S(e,t){if(t.symbolsTouched.length===0)return {habit:e,result:"followed",reason:"No symbols touched"};let i=["paradigm_purpose_add_component","paradigm_purpose_add_signal","paradigm_purpose_add_flow","paradigm_purpose_add_gate","paradigm_purpose_add_aspect","paradigm_purpose_add_state","paradigm_purpose_init"].filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Purpose tools called: ${i.join(", ")}`,evidence:i}:{habit:e,result:"partial",reason:`${t.symbolsTouched.length} symbol(s) touched but no purpose registration tools called`}}function W(e,t){if(!t.taskAddsRoutes)return {habit:e,result:"followed",reason:"Task does not add routes"};if(t.hasPortalRoutes)return {habit:e,result:"followed",reason:"Portal.yaml has route declarations"};let i=["paradigm_gates_for_route","paradigm_portal_add_route","paradigm_portal_add_gate"].filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Gate tools called: ${i.join(", ")}`,evidence:i}:{habit:e,result:"skipped",reason:"Task adds routes but no gate declarations or portal tools called"}}function $(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified"};let s=t.filesModified.filter(o=>o.includes(".test.")||o.includes(".spec.")||o.includes("/tests/")||o.includes("/test/")||o.includes("__tests__"));if(s.length>0)return {habit:e,result:"followed",reason:`Test files modified: ${s.length}`,evidence:s.slice(0,5)};let i=t.filesModified.filter(o=>!o.endsWith(".md")&&!o.endsWith(".json")&&!o.endsWith(".yaml")&&!o.endsWith(".lock")&&!o.endsWith(".purpose")&&!o.includes(".paradigm/")&&!o.includes("node_modules/"));return i.length===0?{habit:e,result:"followed",reason:"No new source files to test"}:{habit:e,result:"partial",reason:`${i.length} source file(s) modified but no test files updated`,evidence:i.slice(0,5)}}function N(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified"};let s=e.check.params.patterns||[];if(s.length===0)return {habit:e,result:"followed",reason:"No patterns specified"};let i=t.filesModified.filter(o=>s.some(r=>o.includes(r)||l.basename(o)===r));return i.length>0?{habit:e,result:"followed",reason:`Matching files: ${i.join(", ")}`,evidence:i}:{habit:e,result:"skipped",reason:`None of [${s.join(", ")}] found in modified files`}}function q(e,t){return t.filesModified.length===0?{habit:e,result:"followed",reason:"No files modified"}:t.gitClean===void 0?{habit:e,result:"partial",reason:"Git status not available"}:t.gitClean?{habit:e,result:"followed",reason:"Working tree is clean \u2014 changes committed"}:{habit:e,result:"skipped",reason:"Uncommitted changes in working tree"}}function B(e,t){if(!t.commitMessage)return {habit:e,result:"followed",reason:"No commit message to check (not a commit trigger)"};let s=e.check.params.messagePatterns||["^(feat|fix|refactor|chore|docs|test|style|perf|ci|build)\\(","Symbols:"],i=s.filter(o=>new RegExp(o,"m").test(t.commitMessage));if(i.length===s.length)return {habit:e,result:"followed",reason:"Commit message matches all required patterns",evidence:i};if(i.length>0){let o=s.filter(r=>!new RegExp(r,"m").test(t.commitMessage));return {habit:e,result:"partial",reason:`Commit message matches ${i.length}/${s.length} patterns. Missing: ${o.join(", ")}`}}return {habit:e,result:"skipped",reason:"Commit message does not match required format patterns"}}function I(e,t){let s=t.symbolsTouched.filter(r=>r.startsWith("#"));if(s.length<3)return {habit:e,result:"followed",reason:"Fewer than 3 components touched \u2014 flow not required"};if(t.hasFlowCoverage)return {habit:e,result:"followed",reason:"Flow coverage exists for multi-component changes"};let o=["paradigm_flow_validate","paradigm_flows_affected","paradigm_purpose_add_flow"].filter(r=>t.toolsCalled.includes(r));return o.length>0?{habit:e,result:"followed",reason:`Flow tools called: ${o.join(", ")}`,evidence:o}:{habit:e,result:"skipped",reason:`${s.length} components touched without flow coverage or flow tools called`,evidence:s.slice(0,5)}}function O(e,t){let i=(e.check.params.contextTools||["paradigm_context_check","paradigm_session_recover","paradigm_session_checkpoint"]).filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Context tools called: ${i.join(", ")}`,evidence:i}:t.filesModified.length===0&&t.symbolsTouched.length===0?{habit:e,result:"followed",reason:"No modifications made, context check not applicable"}:{habit:e,result:"skipped",reason:"No context/session tools called during session"}}function U(e,t){let s=t.symbolsTouched.filter(i=>i.startsWith("~"));return s.length===0?{habit:e,result:"followed",reason:"No aspects touched"}:t.aspectAnchorsValid===true?{habit:e,result:"followed",reason:"Aspect anchors validated and valid"}:t.toolsCalled.includes("paradigm_aspect_check")?{habit:e,result:"followed",reason:"paradigm_aspect_check was called to validate anchors"}:{habit:e,result:"skipped",reason:`${s.length} aspect(s) touched without anchor validation`,evidence:s.slice(0,5)}}function V(e){return {toolsCalled:e.toolsCalled||[],filesModified:e.filesModified||[],symbolsTouched:e.symbolsTouched||[],loreRecorded:e.loreRecorded||false,hasPortalRoutes:e.hasPortalRoutes||false,taskAddsRoutes:e.taskAddsRoutes||false,taskDescription:e.taskDescription,gitClean:e.gitClean,commitMessage:e.commitMessage,hasFlowCoverage:e.hasFlowCoverage,aspectAnchorsValid:e.aspectAnchorsValid}}export{E as a,M as b,x as c,R as d,V as e};
2
+ import*as d from'fs';import*as l from'path';import*as c from'js-yaml';var m=[{id:"explore-before-implement",name:"Explore Before Implementing",description:"Call ripple/navigate/search before modifying existing symbols to understand impact",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple","paradigm_navigate","paradigm_search","paradigm_related"]}},enabled:true},{id:"ripple-before-modify",name:"Ripple Before Modifying",description:"Run ripple analysis before modifying symbols with dependents",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple"]}},enabled:true},{id:"check-fragility",name:"Check Fragility",description:"Check history fragility for symbols before modifying frequently-broken code",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_history_fragility"]}},enabled:true},{id:"wisdom-before-implement",name:"Check Team Wisdom",description:"Check team wisdom (preferences, antipatterns, decisions) before implementing",category:"collaboration",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_wisdom_context","paradigm_wisdom_expert"]}},enabled:true},{id:"verify-before-done",name:"Verify Before Done",description:"Run postflight compliance checks before finishing a session",category:"verification",trigger:"on-stop",severity:"warn",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight"]}},enabled:true},{id:"postflight-compliance",name:"Postflight Compliance",description:"Ensure postflight checks pass without errors before finishing",category:"verification",trigger:"on-stop",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight","paradigm_reindex"]}},enabled:true},{id:"test-new-components",name:"Test New Components",description:"New components should have associated tests or test plan documented",category:"testing",trigger:"postflight",severity:"advisory",check:{type:"tests-exist",params:{patterns:["**/*.test.*","**/*.spec.*","**/tests/**"]}},enabled:true},{id:"purpose-coverage",name:"Purpose File Coverage",description:"All modified source directories should have .purpose file coverage",category:"documentation",trigger:"postflight",severity:"warn",check:{type:"file-exists",params:{patterns:["**/.purpose"]}},enabled:true},{id:"record-lore-for-significant",name:"Record Lore for Significant Changes",description:"Sessions modifying 3+ files should record a lore entry",category:"documentation",trigger:"on-stop",severity:"warn",check:{type:"lore-recorded",params:{}},enabled:true},{id:"gates-for-routes",name:"Gates for Routes",description:"API routes should have corresponding gate declarations in portal.yaml",category:"security",trigger:"postflight",severity:"warn",check:{type:"gates-declared",params:{requireRoutes:true}},enabled:true},{id:"commit-message-symbols",name:"Commit Message Format",description:"Commit messages should follow type(#symbol): format and include a Symbols: trailer",category:"documentation",trigger:"on-commit",severity:"advisory",check:{type:"commit-message-format",params:{messagePatterns:["^(feat|fix|refactor|chore|docs|test|style|perf|ci|build)\\(","Symbols:"]}},enabled:true},{id:"flow-coverage-for-multi-component",name:"Flow Coverage",description:"Changes spanning 3+ components should have a documented $flow",category:"documentation",trigger:"postflight",severity:"advisory",check:{type:"flow-coverage",params:{minSteps:3}},enabled:true},{id:"context-session-awareness",name:"Context Awareness",description:"Use session recovery or context check tools for session continuity",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"context-checked",params:{contextTools:["paradigm_context_check","paradigm_session_recover","paradigm_session_checkpoint"]}},enabled:true},{id:"aspect-anchors-valid",name:"Aspect Anchors Valid",description:"Aspects touched during the session should have their code anchors validated",category:"verification",trigger:"postflight",severity:"advisory",check:{type:"aspect-anchored",params:{checkAnchors:true}},enabled:true}];var C=m,k=30*1e3;function _(e){try{let t=l.join(e,".paradigm","config.yaml");if(d.existsSync(t)){let s=d.readFileSync(t,"utf8"),o=c.load(s)?.limits;if(o?.habitsCacheTtlMs&&typeof o.habitsCacheTtlMs=="number")return o.habitsCacheTtlMs}}catch{}return k}var f=new Map;function E(e){let t=l.resolve(e),s=f.get(t),i=_(t);if(s&&Date.now()-s.loadedAt<i)return s.habits;let o=T(t);return f.set(t,{habits:o,loadedAt:Date.now()}),o}function T(e){let t=new Map;for(let a of C)t.set(a.id,{...a});let s=process.env.HOME||process.env.USERPROFILE||"~",i=y(l.join(s,".paradigm","habits.yaml"));i&&v(t,i);let o=h(l.join(s,".paradigm","habits"));for(let a of o)t.set(a.id,a);let r=y(l.join(e,".paradigm","habits.yaml"));r&&v(t,r);let u=h(l.join(e,".paradigm","habits"));for(let a of u)t.set(a.id,a);return Array.from(t.values())}function h(e){if(!d.existsSync(e))return [];try{let t=d.readdirSync(e).filter(i=>i.endsWith(".habit")).sort(),s=[];for(let i of t)try{let o=d.readFileSync(l.join(e,i),"utf8"),r=c.load(o);r?.id&&r?.name&&s.push(r);}catch{}return s}catch{return []}}function y(e){if(!d.existsSync(e))return null;try{let t=d.readFileSync(e,"utf8");return c.load(t)}catch{return null}}function v(e,t){if(t.habits)for(let s of t.habits)e.set(s.id,{...s});if(t.overrides)for(let[s,i]of Object.entries(t.overrides)){let o=e.get(s);o&&D(o,i);}}function D(e,t){t.severity!==void 0&&(e.severity=t.severity),t.enabled!==void 0&&(e.enabled=t.enabled);}function p(e,t){return e.filter(s=>s.enabled&&s.trigger===t)}function M(e){return e.filter(t=>t.enabled)}function x(e){let t=l.resolve(e);f.delete(t);}function R(e,t,s){let i=p(e,t),o=[];for(let n of i){let w=F(n,s);o.push(w);}let r=o.filter(n=>n.result==="followed").length,u=o.filter(n=>n.result==="skipped").length,a=o.filter(n=>n.result==="partial").length,g=o.filter(n=>n.result==="skipped"&&n.habit.severity==="block").length;return {trigger:t,evaluations:o,summary:{total:o.length,followed:r,skipped:u,partial:a,blockingViolations:g},blocksCompletion:g>0}}function F(e,t){switch(e.check.type){case "tool-called":return j(e,t);case "file-exists":return A(e,t);case "lore-recorded":return P(e,t);case "symbols-registered":return S(e,t);case "gates-declared":return W(e,t);case "tests-exist":return $(e,t);case "file-modified":return N(e,t);case "git-clean":return q(e,t);case "commit-message-format":return B(e,t);case "flow-coverage":return I(e,t);case "context-checked":return O(e,t);case "aspect-anchored":return U(e,t);default:return {habit:e,result:"partial",reason:`Unknown check type: ${e.check.type}`}}}function j(e,t){let s=e.check.params.tools||[];if(s.length===0)return {habit:e,result:"followed",reason:"No tools required"};let i=s.filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Called: ${i.join(", ")}`,evidence:i}:t.filesModified.length===0&&t.symbolsTouched.length===0?{habit:e,result:"followed",reason:"No modifications made, habit not applicable"}:{habit:e,result:"skipped",reason:`None of [${s.join(", ")}] were called before modifying code`}}function A(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified, check not applicable"};if(t.filesModified.some(o=>o.endsWith(".purpose")||o.includes(".paradigm/")))return {habit:e,result:"followed",reason:"Purpose files were updated alongside source changes"};let i=t.filesModified.filter(o=>!o.endsWith(".md")&&!o.endsWith(".json")&&!o.endsWith(".yaml")&&!o.endsWith(".yml")&&!o.endsWith(".lock")&&!o.endsWith(".purpose")&&!o.includes(".paradigm/"));return i.length===0?{habit:e,result:"followed",reason:"Only non-source files modified"}:{habit:e,result:"skipped",reason:`${i.length} source file(s) modified without .purpose updates`,evidence:i.slice(0,5)}}function P(e,t){let s=t.filesModified.filter(i=>!i.endsWith(".md")&&!i.endsWith(".json")&&!i.endsWith(".yaml")&&!i.endsWith(".yml")&&!i.endsWith(".lock")&&!i.endsWith(".purpose")&&!i.includes(".paradigm/"));return s.length<3?{habit:e,result:"followed",reason:"Session not significant enough to require lore (< 3 source files)"}:t.loreRecorded?{habit:e,result:"followed",reason:"Lore entry was recorded for this session"}:t.toolsCalled.includes("paradigm_lore_record")?{habit:e,result:"followed",reason:"paradigm_lore_record was called during session"}:{habit:e,result:"skipped",reason:`${s.length} source files modified but no lore entry recorded`,evidence:s.slice(0,5)}}function S(e,t){if(t.symbolsTouched.length===0)return {habit:e,result:"followed",reason:"No symbols touched"};let i=["paradigm_purpose_add_component","paradigm_purpose_add_signal","paradigm_purpose_add_flow","paradigm_purpose_add_gate","paradigm_purpose_add_aspect","paradigm_purpose_add_state","paradigm_purpose_init"].filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Purpose tools called: ${i.join(", ")}`,evidence:i}:{habit:e,result:"partial",reason:`${t.symbolsTouched.length} symbol(s) touched but no purpose registration tools called`}}function W(e,t){if(!t.taskAddsRoutes)return {habit:e,result:"followed",reason:"Task does not add routes"};if(t.hasPortalRoutes)return {habit:e,result:"followed",reason:"Portal.yaml has route declarations"};let i=["paradigm_gates_for_route","paradigm_portal_add_route","paradigm_portal_add_gate"].filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Gate tools called: ${i.join(", ")}`,evidence:i}:{habit:e,result:"skipped",reason:"Task adds routes but no gate declarations or portal tools called"}}function $(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified"};let s=t.filesModified.filter(o=>o.includes(".test.")||o.includes(".spec.")||o.includes("/tests/")||o.includes("/test/")||o.includes("__tests__"));if(s.length>0)return {habit:e,result:"followed",reason:`Test files modified: ${s.length}`,evidence:s.slice(0,5)};let i=t.filesModified.filter(o=>!o.endsWith(".md")&&!o.endsWith(".json")&&!o.endsWith(".yaml")&&!o.endsWith(".lock")&&!o.endsWith(".purpose")&&!o.includes(".paradigm/")&&!o.includes("node_modules/"));return i.length===0?{habit:e,result:"followed",reason:"No new source files to test"}:{habit:e,result:"partial",reason:`${i.length} source file(s) modified but no test files updated`,evidence:i.slice(0,5)}}function N(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified"};let s=e.check.params.patterns||[];if(s.length===0)return {habit:e,result:"followed",reason:"No patterns specified"};let i=t.filesModified.filter(o=>s.some(r=>o.includes(r)||l.basename(o)===r));return i.length>0?{habit:e,result:"followed",reason:`Matching files: ${i.join(", ")}`,evidence:i}:e.trigger==="on-stop"&&e.severity==="block"?{habit:e,result:"partial",reason:`None of [${s.join(", ")}] in git diff yet (may not be committed). Use on-commit trigger for reliable check.`}:{habit:e,result:"skipped",reason:`None of [${s.join(", ")}] found in modified files`}}function q(e,t){return t.filesModified.length===0?{habit:e,result:"followed",reason:"No files modified"}:e.trigger==="on-stop"?{habit:e,result:"followed",reason:"git-clean skipped on-stop (uncommitted changes expected before commit)"}:t.gitClean===void 0?{habit:e,result:"partial",reason:"Git status not available"}:t.gitClean?{habit:e,result:"followed",reason:"Working tree is clean \u2014 changes committed"}:{habit:e,result:"skipped",reason:"Uncommitted changes in working tree"}}function B(e,t){if(!t.commitMessage)return {habit:e,result:"followed",reason:"No commit message to check (not a commit trigger)"};let s=e.check.params.messagePatterns||["^(feat|fix|refactor|chore|docs|test|style|perf|ci|build)\\(","Symbols:"],i=s.filter(o=>new RegExp(o,"m").test(t.commitMessage));if(i.length===s.length)return {habit:e,result:"followed",reason:"Commit message matches all required patterns",evidence:i};if(i.length>0){let o=s.filter(r=>!new RegExp(r,"m").test(t.commitMessage));return {habit:e,result:"partial",reason:`Commit message matches ${i.length}/${s.length} patterns. Missing: ${o.join(", ")}`}}return {habit:e,result:"skipped",reason:"Commit message does not match required format patterns"}}function I(e,t){let s=t.symbolsTouched.filter(r=>r.startsWith("#"));if(s.length<3)return {habit:e,result:"followed",reason:"Fewer than 3 components touched \u2014 flow not required"};if(t.hasFlowCoverage)return {habit:e,result:"followed",reason:"Flow coverage exists for multi-component changes"};let o=["paradigm_flow_validate","paradigm_flows_affected","paradigm_purpose_add_flow"].filter(r=>t.toolsCalled.includes(r));return o.length>0?{habit:e,result:"followed",reason:`Flow tools called: ${o.join(", ")}`,evidence:o}:{habit:e,result:"skipped",reason:`${s.length} components touched without flow coverage or flow tools called`,evidence:s.slice(0,5)}}function O(e,t){let i=(e.check.params.contextTools||["paradigm_context_check","paradigm_session_recover","paradigm_session_checkpoint"]).filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Context tools called: ${i.join(", ")}`,evidence:i}:t.filesModified.length===0&&t.symbolsTouched.length===0?{habit:e,result:"followed",reason:"No modifications made, context check not applicable"}:{habit:e,result:"skipped",reason:"No context/session tools called during session"}}function U(e,t){let s=t.symbolsTouched.filter(i=>i.startsWith("~"));return s.length===0?{habit:e,result:"followed",reason:"No aspects touched"}:t.aspectAnchorsValid===true?{habit:e,result:"followed",reason:"Aspect anchors validated and valid"}:t.toolsCalled.includes("paradigm_aspect_check")?{habit:e,result:"followed",reason:"paradigm_aspect_check was called to validate anchors"}:{habit:e,result:"skipped",reason:`${s.length} aspect(s) touched without anchor validation`,evidence:s.slice(0,5)}}function V(e){return {toolsCalled:e.toolsCalled||[],filesModified:e.filesModified||[],symbolsTouched:e.symbolsTouched||[],loreRecorded:e.loreRecorded||false,hasPortalRoutes:e.hasPortalRoutes||false,taskAddsRoutes:e.taskAddsRoutes||false,taskDescription:e.taskDescription,gitClean:e.gitClean,commitMessage:e.commitMessage,hasFlowCoverage:e.hasFlowCoverage,aspectAnchorsValid:e.aspectAnchorsValid}}export{E as a,M as b,x as c,R as d,V as e};
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import {a,e,d}from'./chunk-ET5XJTSX.js';import'./chunk-5TAVYPOV.js';import*as c from'fs';import*as p from'path';import {execSync}from'child_process';import n from'chalk';import*as w from'js-yaml';function R(s){return s.match(/(?:^|\s)((?:\/|\.\/|[a-zA-Z0-9_-]+\/)[^\s,;:'"]+\.[a-zA-Z]{1,10})\b/)?.[1]}async function $(s,l){try{let a$1=a(s),f=[];try{f=execSync("git diff --name-only HEAD",{cwd:s,encoding:"utf8",timeout:5e3}).trim().split(`
2
+ import {a,e,d}from'./chunk-RMOALQJN.js';import'./chunk-5TAVYPOV.js';import*as c from'fs';import*as p from'path';import {execSync}from'child_process';import n from'chalk';import*as w from'js-yaml';function R(s){return s.match(/(?:^|\s)((?:\/|\.\/|[a-zA-Z0-9_-]+\/)[^\s,;:'"]+\.[a-zA-Z]{1,10})\b/)?.[1]}async function $(s,l){try{let a$1=a(s),f=[];try{f=execSync("git diff --name-only HEAD",{cwd:s,encoding:"utf8",timeout:5e3}).trim().split(`
3
3
  `).filter(Boolean);}catch{}let i;try{i=execSync("git status --porcelain",{cwd:s,encoding:"utf8",timeout:5e3}).trim()==="";}catch{}let u=p.join(s,"portal.yaml"),g=!1;if(c.existsSync(u))try{let t=c.readFileSync(u,"utf8"),e=w.load(t);g=e?.routes!=null&&Object.keys(e.routes).length>0;}catch{}let r=e({toolsCalled:[],filesModified:f,symbolsTouched:[],loreRecorded:!1,hasPortalRoutes:g,taskAddsRoutes:!1,gitClean:i}),o=d(a$1,l,r),d$1=0;if(o.evaluations.length>0)try{let t=p.join(s,".paradigm","sentinel");if(c.existsSync(t)){let{SentinelStorage:e}=await import('./dist-VGFSP3XM.js'),m=new e(t);for(let b of o.evaluations)m.recordPracticeEvent({habitId:b.habit.id,habitCategory:b.habit.category,result:b.result,engineer:"agent",sessionId:`cli-${Date.now().toString(36)}`,symbolsTouched:[],filesModified:f,notes:b.reason}),d$1++;}}catch{}let h=p.join(s,".paradigm",".habits-blocking");try{if(l==="on-stop"&&o.blocksCompletion){let t=o.evaluations.filter(e=>e.result==="skipped"&&e.habit.severity==="block").map(e=>`${e.habit.name}: ${e.reason}`);c.writeFileSync(h,t.join(`
4
- `),"utf8");}else l==="on-stop"&&c.existsSync(h)&&c.unlinkSync(h);}catch{}return {trigger:l,evaluation:{total:o.summary.total,followed:o.summary.followed,skipped:o.summary.skipped,partial:o.summary.partial,blockingViolations:o.summary.blockingViolations,blocksCompletion:o.blocksCompletion},habits:o.evaluations.map(t=>({id:t.habit.id,name:t.habit.name,category:t.habit.category,severity:t.habit.severity,result:t.result,reason:t.reason,evidence:t.evidence})),recorded:d$1}}catch{return null}}async function P(s,l){let a=p.join(s,".paradigm","aspect-graph.db");if(!c.existsSync(a))return {driftedCount:0,healedCount:0,cleanCount:0,missingCount:0,details:[]};try{let{driftCheckCommand:f}=await import('./drift-ILZE5BFJ.js'),i="",u=console.log;console.log=g=>{i=g;};try{await f({json:!0,autoHeal:l});}finally{console.log=u;}return i?JSON.parse(i):null}catch{return null}}async function B(s){if(!c.existsSync(p.join(s,"portal.yaml")))return null;try{let{checkPortalCompliance:l}=await import('./portal-compliance-4MG5F2GI.js'),a=await l(s);return {status:a.status,declaredButUnusedCount:a.declaredButUnused.length,usedButUndeclaredCount:a.usedButUndeclared.length,properlyDeclaredCount:a.properlyDeclared.length,declaredButUnused:a.declaredButUnused,usedButUndeclared:a.usedButUndeclared,properlyDeclared:a.properlyDeclared}}catch{return null}}async function j(s){try{let{runPostflightLearning:l}=await import('./ambient-HYZR42NX.js');return await l(s)}catch{return null}}async function A(s){let l=process.cwd(),a=s.trigger||"on-stop",f=s.autoHeal!==false,i=[],u=[],g=await $(l,a),r=await P(l,f),o=await B(l);if(g?.evaluation.blocksCompletion){let t=g.habits.filter(e=>e.result==="skipped"&&e.severity==="block");for(let e of t){let m=`Blocking habit not satisfied: ${e.name} \u2014 ${e.reason}`;i.push(m),u.push({message:m,source:"habits",file:R(e.reason),severity:"blocking"});}}if(r&&r.driftedCount>0){let t=`${r.driftedCount} aspect anchor(s) have drifted (content genuinely changed). Run paradigm_aspect_check to review.`;i.push(t);for(let e of r.details.filter(m=>m.status==="drifted"))u.push({message:`Aspect ~${e.aspectId} drifted at lines ${e.startLine}-${e.endLine}`,source:"drift",file:e.path,severity:"advisory"});u.filter(e=>e.source==="drift").length===0&&u.push({message:t,source:"drift",severity:"advisory"});}if(o&&o.usedButUndeclaredCount>0){let t=`${o.usedButUndeclaredCount} gate(s) used in code but not declared in portal.yaml: ${o.usedButUndeclared.join(", ")}`;i.push(t);for(let e of o.usedButUndeclared)u.push({message:`Gate ^${e} used in code but not declared in portal.yaml`,source:"portal",file:"portal.yaml",severity:"blocking"});}let d=null;s.learn&&(d=await j(l));let h={habits:g,drift:r,portal:o,violations:i,structuredViolations:u,postflight:s.learn?d:void 0};if(s.json)console.log(JSON.stringify(h));else {if(console.log(n.magenta(`
4
+ `),"utf8");}else l==="on-stop"&&c.existsSync(h)&&c.unlinkSync(h);}catch{}return {trigger:l,evaluation:{total:o.summary.total,followed:o.summary.followed,skipped:o.summary.skipped,partial:o.summary.partial,blockingViolations:o.summary.blockingViolations,blocksCompletion:o.blocksCompletion},habits:o.evaluations.map(t=>({id:t.habit.id,name:t.habit.name,category:t.habit.category,severity:t.habit.severity,result:t.result,reason:t.reason,evidence:t.evidence})),recorded:d$1}}catch{return null}}async function P(s,l){let a=p.join(s,".paradigm","aspect-graph.db");if(!c.existsSync(a))return {driftedCount:0,healedCount:0,cleanCount:0,missingCount:0,details:[]};try{let{driftCheckCommand:f}=await import('./drift-ILZE5BFJ.js'),i="",u=console.log;console.log=g=>{i=g;};try{await f({json:!0,autoHeal:l});}finally{console.log=u;}return i?JSON.parse(i):null}catch{return null}}async function B(s){if(!c.existsSync(p.join(s,"portal.yaml")))return null;try{let{checkPortalCompliance:l}=await import('./portal-compliance-4MG5F2GI.js'),a=await l(s);return {status:a.status,declaredButUnusedCount:a.declaredButUnused.length,usedButUndeclaredCount:a.usedButUndeclared.length,properlyDeclaredCount:a.properlyDeclared.length,declaredButUnused:a.declaredButUnused,usedButUndeclared:a.usedButUndeclared,properlyDeclared:a.properlyDeclared}}catch{return null}}async function j(s){try{let{runPostflightLearning:l}=await import('./ambient-WEPHBAJD.js');return await l(s)}catch{return null}}async function A(s){let l=process.cwd(),a=s.trigger||"on-stop",f=s.autoHeal!==false,i=[],u=[],g=await $(l,a),r=await P(l,f),o=await B(l);if(g?.evaluation.blocksCompletion){let t=g.habits.filter(e=>e.result==="skipped"&&e.severity==="block");for(let e of t){let m=`Blocking habit not satisfied: ${e.name} \u2014 ${e.reason}`;i.push(m),u.push({message:m,source:"habits",file:R(e.reason),severity:"blocking"});}}if(r&&r.driftedCount>0){let t=`${r.driftedCount} aspect anchor(s) have drifted (content genuinely changed). Run paradigm_aspect_check to review.`;i.push(t);for(let e of r.details.filter(m=>m.status==="drifted"))u.push({message:`Aspect ~${e.aspectId} drifted at lines ${e.startLine}-${e.endLine}`,source:"drift",file:e.path,severity:"advisory"});u.filter(e=>e.source==="drift").length===0&&u.push({message:t,source:"drift",severity:"advisory"});}if(o&&o.usedButUndeclaredCount>0){let t=`${o.usedButUndeclaredCount} gate(s) used in code but not declared in portal.yaml: ${o.usedButUndeclared.join(", ")}`;i.push(t);for(let e of o.usedButUndeclared)u.push({message:`Gate ^${e} used in code but not declared in portal.yaml`,source:"portal",file:"portal.yaml",severity:"blocking"});}let d=null;s.learn&&(d=await j(l));let h={habits:g,drift:r,portal:o,violations:i,structuredViolations:u,postflight:s.learn?d:void 0};if(s.json)console.log(JSON.stringify(h));else {if(console.log(n.magenta(`
5
5
  Paradigm Compliance Check
6
6
  `)),g){let{evaluation:t}=g,e=t.blocksCompletion?n.red:n.green;console.log(n.white(" Habits:")),console.log(` ${e(`${t.followed} followed, ${t.skipped} skipped, ${t.partial} partial`)}`),t.blockingViolations>0&&console.log(n.red(` ${t.blockingViolations} blocking violation(s)`)),console.log();}if(r&&(console.log(n.white(" Drift:")),r.healedCount>0&&console.log(n.green(` Auto-healed: ${r.healedCount} shifted anchor(s)`)),r.cleanCount>0&&console.log(n.green(` Clean: ${r.cleanCount} anchor(s)`)),r.driftedCount>0&&console.log(n.red(` Drifted: ${r.driftedCount} anchor(s)`)),r.missingCount>0&&console.log(n.yellow(` Missing: ${r.missingCount} anchor file(s)`)),console.log()),o){console.log(n.white(" Portal:"));let t=o.status==="compliant"?n.green:o.status==="warnings"?n.yellow:n.red;console.log(` Status: ${t(o.status)}`),o.usedButUndeclaredCount>0&&console.log(n.red(` ${o.usedButUndeclaredCount} undeclared gate(s)`)),console.log();}if(d){if(console.log(n.white(" Postflight Learning:")),d.journalsWritten>0){console.log(n.green(` Journals written: ${d.journalsWritten}`));for(let[t,e]of Object.entries(d.journalsByAgent))e>0&&console.log(n.gray(` ${t}: ${e} entries`));}else console.log(n.gray(" No verdicts to learn from"));d.promoted>0&&console.log(n.green(` Promoted to notebooks: ${d.promoted}`)),console.log();}if(i.length>0){console.log(n.red(` ${i.length} violation(s):`));for(let t of i)console.log(n.red(` - ${t}`));}else console.log(n.green(" All checks passed."));console.log();}i.length>0&&(process.exitCode=1);}export{A as complianceCheckCommand};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-5TAVYPOV.js';import {z}from'zod';import*as r from'js-yaml';var p=z.enum(["web","backend","fullstack","api","cli","ml","mobile","game","embedded","devops","data","library","monorepo","custom"]),g=z.enum(["auto","claude","claude-code","cursor-cli","claude-cli","manual"]),i=z.object({name:z.string(),description:z.string(),examples:z.array(z.string()).optional()}).passthrough(),u=z.object({file:z.string().optional(),"core-tags":z.array(z.string()).optional(),"allow-suggestions":z.boolean().optional()}).passthrough(),m=z.object({overview:z.string().optional(),"how-to-use":z.array(z.string()).optional(),"update-rules":z.array(z.string()).optional()}).passthrough(),d=z.object({enforce:z.boolean().optional(),"default-level":z.enum(["debug","info","warn","error"]).optional(),"symbol-mapping":z.record(z.string(),z.string()).optional()}).passthrough(),b=z.object({pattern:z.string(),depth:z.number().optional()}),h=z.object({toolCacheTtlMs:z.number().optional()}).passthrough(),f=z.object({model:z.string().optional(),"context-window":z.number().optional()}).passthrough(),y=z.object({enabled:z.boolean().optional(),"index-file":z.string().optional(),"docs-path":z.string().optional()}).passthrough(),w=z.object({enabled:z.boolean().optional(),"auto-include":z.boolean().optional()}).passthrough(),j=z.object({version:z.string(),project:z.string(),discipline:p.optional(),"agent-provider":g.optional(),"agent-guidelines":m.optional(),"symbol-system":z.record(z.string(),i).optional(),"tag-bank":u.optional(),component_types:z.record(z.string(),z.string()).optional(),logging:d.optional(),"purpose-required":z.array(b).optional(),conventions:z.array(z.string()).optional(),workspace:z.string().optional(),limits:h.optional(),"ai-agent":f.optional(),context:y.optional(),probe:w.optional(),states:z.record(z.string(),z.unknown()).optional(),"custom-symbols":z.record(z.string(),i).optional()}).passthrough(),v=new Set(["version","project","discipline","agent-provider","agent-guidelines","symbol-system","tag-bank","component_types","logging","purpose-required","conventions","workspace","limits","ai-agent","context","probe","states","custom-symbols","docs","features"]);function S(l){let s=[],e=[],t;try{t=r.load(l);}catch(n){return {valid:false,warnings:[],errors:[`YAML parse error: ${n.message}`]}}if(!t||typeof t!="object")return {valid:false,warnings:[],errors:["Config must be a YAML object"]};for(let n of Object.keys(t))v.has(n)||s.push(`Unrecognized config key: "${n}"`);let a=j.safeParse(t);if(!a.success)for(let n of a.error.issues){let c=n.path.join(".");e.push(`${c}: ${n.message}`);}return {valid:e.length===0,warnings:s,errors:e}}export{j as paradigmConfigSchema,S as validateConfig};
2
+ import'./chunk-5TAVYPOV.js';import {z}from'zod';import*as i from'js-yaml';var p=z.enum(["web","backend","fullstack","api","cli","ml","mobile","game","embedded","devops","data","library","monorepo","custom"]),g=z.enum(["auto","claude","claude-code","cursor-cli","claude-cli","manual"]),r=z.object({name:z.string(),description:z.string(),examples:z.array(z.string()).optional()}).passthrough(),u=z.object({file:z.string().optional(),"core-tags":z.array(z.string()).optional(),"allow-suggestions":z.boolean().optional()}).passthrough(),m=z.object({overview:z.string().optional(),"how-to-use":z.array(z.string()).optional(),"update-rules":z.array(z.string()).optional()}).passthrough(),d=z.object({enforce:z.boolean().optional(),"default-level":z.enum(["debug","info","warn","error"]).optional(),"symbol-mapping":z.record(z.string(),z.string()).optional()}).passthrough(),b=z.object({pattern:z.string(),depth:z.number().optional()}),h=z.object({toolCacheTtlMs:z.number().optional()}).passthrough(),f=z.object({model:z.string().optional(),"context-window":z.number().optional()}).passthrough(),y=z.object({enabled:z.boolean().optional(),"index-file":z.string().optional(),"docs-path":z.string().optional()}).passthrough(),w=z.object({enabled:z.boolean().optional(),"auto-include":z.boolean().optional()}).passthrough(),j=z.object({version:z.string(),project:z.string(),discipline:p.optional(),"agent-provider":g.optional(),"agent-guidelines":m.optional(),"symbol-system":z.record(z.string(),r).optional(),"tag-bank":u.optional(),component_types:z.record(z.string(),z.string()).optional(),logging:d.optional(),"purpose-required":z.array(b).optional(),conventions:z.array(z.string()).optional(),workspace:z.string().optional(),limits:h.optional(),"ai-agent":f.optional(),context:y.optional(),probe:w.optional(),states:z.record(z.string(),z.unknown()).optional(),"custom-symbols":z.record(z.string(),r).optional()}).passthrough(),v=new Set(["version","project","discipline","agent-provider","agent-guidelines","symbol-system","tag-bank","component_types","logging","purpose-required","conventions","workspace","limits","ai-agent","context","probe","states","custom-symbols","docs","features","enforcement","model-resolution"]);function S(l){let s=[],e=[],t;try{t=i.load(l);}catch(n){return {valid:false,warnings:[],errors:[`YAML parse error: ${n.message}`]}}if(!t||typeof t!="object")return {valid:false,warnings:[],errors:["Config must be a YAML object"]};for(let n of Object.keys(t))v.has(n)||s.push(`Unrecognized config key: "${n}"`);let a=j.safeParse(t);if(!a.success)for(let n of a.error.issues){let c=n.path.join(".");e.push(`${c}: ${n.message}`);}return {valid:e.length===0,warnings:s,errors:e}}export{j as paradigmConfigSchema,S as validateConfig};
@@ -2,5 +2,5 @@
2
2
  import {a}from'./chunk-LKAT7IAK.js';import'./chunk-5TAVYPOV.js';import*as h from'fs';import*as f from'path';import*as v from'js-yaml';var w=["CLAUDE.md",".cursorrules","AGENTS.md"];function k(i){let e=[];for(let r of w){let t=f.join(i,r);if(h.existsSync(t)){let l=h.readFileSync(t,"utf8");e.push({name:r,content:l,lines:l.split(`
3
3
  `)});}}return e}function C(i,e){let r=new Set,t=new Set(["node_modules","dist",".git",".paradigm","coverage","build","__pycache__","target",".next",".nuxt"]);function l(n){let u;try{u=h.readdirSync(n,{withFileTypes:!0});}catch{return}let a=false;for(let o of u){if(t.has(o.name))continue;let s=f.join(n,o.name);if(o.isDirectory())l(s);else if(o.isFile()){let c=f.extname(o.name);e.includes(c)&&(a=true);}}a&&r.add(n);}return l(i),r}function S(i,e){let r=i;for(;;){if(h.existsSync(f.join(r,".purpose")))return true;if(r===e)break;let t=f.dirname(r);if(t===r)break;r=t;}return false}async function $(i){let e=[],r=k(i);if(r.length===0)return e.push({check:"stale-references",status:"advisory",message:"No instruction files found (CLAUDE.md, .cursorrules, AGENTS.md)"}),e;let t=/(?:^|\s|`|"|')([.a-zA-Z0-9_-]+(?:\/[.a-zA-Z0-9_*{}-]+)+\/?)/gm,l=/(?:^|\s|`|"|')([a-zA-Z0-9_-]+\.(?:ts|js|py|rs|go|yaml|yml|json|md|toml))\b/gm,n=[],u=new Set;for(let a of r){let o=[],s;for(t.lastIndex=0;(s=t.exec(a.content))!==null;)o.push(s[1]);for(l.lastIndex=0;(s=l.exec(a.content))!==null;)o.push(s[1]);for(let c of o){let d=c.replace(/\/+$/,"").replace(/`/g,"");if(d.startsWith("http")||d.startsWith("//")||d.includes("*")||d.includes("{")||d.startsWith("paradigm://")||d.startsWith("node_modules/")||u.has(d))continue;u.add(d);let p=/\.(ts|js|py|rs|go|yaml|yml|json|md|toml)(?:\/|$)/.test(d),g=/^(\.|src\/|packages\/|lib\/|app\/|docs\/)/.test(d);if(!p&&!g)continue;let y=f.join(i,d);h.existsSync(y)||n.push(`${a.name}: ${d}`);}}return n.length>0?e.push({check:"stale-references",status:"error",message:`${n.length} dead path reference${n.length>1?"s":""} in instruction files`,details:n,fix:"Update or remove dead paths from instruction files"}):e.push({check:"stale-references",status:"ok",message:"All referenced paths exist"}),e}async function A(i){let e=[],r=k(i),t=f.join(i,".paradigm","config.yaml");if(h.existsSync(t)){let o=h.readFileSync(t,"utf8");r.push({name:"config.yaml",content:o,lines:o.split(`
4
4
  `)});}if(r.length===0)return e.push({check:"convention-contradictions",status:"ok",message:"No instruction files to check"}),e;let l=[],n=[],u=[[/\bcamelCase\b/i,"camelCase"],[/\bkebab[- ]?case\b/i,"kebab-case"],[/\bsnake[_ ]?case\b/i,"snake_case"],[/\bPascalCase\b/i,"PascalCase"]];for(let o of r)for(let s=0;s<o.lines.length;s++){let c=o.lines[s];for(let[d,p]of u)if(d.test(c)){let g=c.match(/\b(file|variable|function|class|component|symbol|directory|folder|module|import)\s*nam/i),y=g?g[1].toLowerCase():"general";l.push({scope:y,directive:p,source:o.name,line:s+1});}}let a=new Map;for(let o of l){let s=a.get(o.scope)||[];s.push(o),a.set(o.scope,s);}for(let[o,s]of a){let c=new Set(s.map(p=>p.directive)),d=[["camelCase","kebab-case"],["camelCase","snake_case"],["kebab-case","snake_case"]];for(let[p,g]of d)if(c.has(p)&&c.has(g)){let y=s.find(b=>b.directive===p),m=s.find(b=>b.directive===g);n.push(`${o} naming: ${p} (${y.source}:${y.line}) vs ${g} (${m.source}:${m.line})`);}}return n.length>0?e.push({check:"convention-contradictions",status:"warn",message:`${n.length} potential convention contradiction${n.length>1?"s":""}`,details:n,fix:"Reconcile conflicting naming/style conventions in instruction files"}):e.push({check:"convention-contradictions",status:"ok",message:"No contradictions detected"}),e}var R=new Set(["typescript","tsup","vitest","eslint","prettier","rimraf","tsx","ts-node","nodemon","concurrently","husky","lint-staged","unbuild","turbo","lerna","changesets"]),P=["@types/","@typescript-eslint/","@eslint/"];async function j(i){let e=[],r=f.join(i,"package.json");if(!h.existsSync(r))return e.push({check:"undocumented-stack",status:"ok",message:"No package.json found (not a JS/TS project or monorepo root)"}),e;let t;try{t=JSON.parse(h.readFileSync(r,"utf8"));}catch{return e.push({check:"undocumented-stack",status:"advisory",message:"Could not parse package.json"}),e}let l=new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.devDependencies||{})]),n=[];for(let s of l)R.has(s)||P.some(c=>s.startsWith(c))||n.push(s);if(n.length===0)return e.push({check:"undocumented-stack",status:"ok",message:"No major dependencies to document"}),e;let a=k(i).map(s=>s.content).join(`
5
- `).toLowerCase(),o=[];for(let s of n){let c=s.toLowerCase(),d=s.includes("/")?s.split("/").pop():s;!a.includes(c)&&!a.includes(d.toLowerCase())&&o.push(s);}return o.length>0?e.push({check:"undocumented-stack",status:"advisory",message:`${o.length} dependenc${o.length>1?"ies":"y"} not mentioned in instruction files`,details:o.slice(0,20),fix:"Consider documenting major dependencies in CLAUDE.md for AI context"}):e.push({check:"undocumented-stack",status:"ok",message:"All major dependencies are documented"}),e}async function E(i){let e=[],t=C(i,[".ts",".js",".py",".rs",".go",".tsx",".jsx"]);if(t.size===0)return e.push({check:"purpose-coverage",status:"ok",message:"No source directories found"}),e;let l=0,n=[];for(let o of t)if(S(o,i))l++;else {let s=f.relative(i,o);n.push(s);}let u=t.size,a=Math.round(l/u*100);return a<80?e.push({check:"purpose-coverage",status:"warn",message:`${a}% purpose coverage (${l}/${u} source directories) \u2014 below 80% threshold`,details:n.slice(0,15),fix:"Create .purpose files in uncovered source directories"}):e.push({check:"purpose-coverage",status:"ok",message:`${a}% purpose coverage (${l}/${u} source directories)`}),e}async function N(i){let e=[],r=f.join(i,".paradigm","scan-index.json");if(!h.existsSync(r))return e.push({check:"orphaned-symbols",status:"advisory",message:"No scan-index.json found \u2014 run paradigm scan first"}),e;let t;try{t=JSON.parse(h.readFileSync(r,"utf8"));}catch{return e.push({check:"orphaned-symbols",status:"advisory",message:"Could not parse scan-index.json"}),e}let l=["components","gates","signals","flows","aspects"],n=new Map,u=new Set;for(let s of l){let c=t[s];if(!(!c||typeof c!="object")){for(let[d,p]of Object.entries(c))if(p.symbol&&n.set(p.symbol,d),p.related&&Array.isArray(p.related))for(let g of p.related)u.add(g);}}let a=new Set;for(let s of l){let c=t[s];if(!(!c||typeof c!="object"))for(let[,d]of Object.entries(c))d.symbol&&d.related&&Array.isArray(d.related)&&d.related.length>0&&a.add(d.symbol);}let o=[];for(let[s]of n)!u.has(s)&&!a.has(s)&&o.push(s);return o.length>0?e.push({check:"orphaned-symbols",status:"advisory",message:`${o.length} isolated symbol${o.length>1?"s":""} (no connections to other symbols)`,details:o.slice(0,20),fix:"Wire isolated symbols into features or remove them from .purpose files"}):e.push({check:"orphaned-symbols",status:"ok",message:"All symbols are connected"}),e}async function F(i){let e=[],r=f.join(i,"portal.yaml");if(!h.existsSync(r))return e.push({check:"stale-portal",status:"ok",message:"No portal.yaml found (no routes to check)"}),e;let t;try{t=v.load(h.readFileSync(r,"utf8"));}catch{return e.push({check:"stale-portal",status:"error",message:"Could not parse portal.yaml"}),e}if(!t?.routes||typeof t.routes!="object")return e.push({check:"stale-portal",status:"ok",message:"No routes defined in portal.yaml"}),e;let l=Object.keys(t.routes),n=[],u=[".ts",".js",".py",".rs",".go"],a=[];function o(c){let d=new Set(["node_modules","dist",".git",".paradigm","coverage","build","target"]);try{let p=h.readdirSync(c,{withFileTypes:!0});for(let g of p){if(d.has(g.name))continue;let y=f.join(c,g.name);if(g.isDirectory())o(y);else if(g.isFile()){let m=f.extname(g.name);u.includes(m)&&a.push(y);}}}catch{}}o(i);let s=a.map(c=>({full:c,name:f.basename(c,f.extname(c)).toLowerCase(),relPath:f.relative(i,c).toLowerCase()}));for(let c of l){let p=c.replace(/^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+/i,"").split("/").filter(m=>m&&!m.startsWith(":")&&m!=="api");if(p.length===0)continue;let g=p[0].toLowerCase();s.some(m=>m.name.includes(g)||m.relPath.includes(g))||n.push(c);}return n.length>0?e.push({check:"stale-portal",status:"error",message:`${n.length} portal route${n.length>1?"s":""} with no matching implementation file`,details:n,fix:"Implement missing route handlers or remove stale routes from portal.yaml"}):e.push({check:"stale-portal",status:"ok",message:`All ${l.length} portal routes have matching implementation files`}),e}var _=[{pattern:/\btry to\b/i,label:"try to"},{pattern:/\bmaybe\b/i,label:"maybe"},{pattern:/\bif possible\b/i,label:"if possible"},{pattern:/\bconsider\b(?!-handoff)/i,label:"consider"},{pattern:/\bmight want to\b/i,label:"might want to"},{pattern:/\byou could\b/i,label:"you could"},{pattern:/\boptionally\b/i,label:"optionally"}];async function T(i){let e=[],r=k(i);if(r.length===0)return e.push({check:"instruction-vagueness",status:"ok",message:"No instruction files to check"}),e;let t=[];for(let l of r)for(let n=0;n<l.lines.length;n++){let u=l.lines[n];if(!u.trimStart().startsWith("```")&&!u.trim().startsWith("|---")){for(let{pattern:a,label:o}of _)if(a.test(u)){let s=u.trim(),c=s.length>80?s.slice(0,77)+"...":s;t.push(`${l.name}:${n+1} \u2014 "${o}" \u2014 ${c}`);}}}return t.length>0?e.push({check:"instruction-vagueness",status:"advisory",message:`${t.length} vague phrase${t.length>1?"s":""} in instruction files`,details:t.slice(0,20),fix:"Replace vague language with clear, actionable directives"}):e.push({check:"instruction-vagueness",status:"ok",message:"No vague language detected"}),e}async function I(i){let e=[],r=f.join(i,".paradigm","config.yaml");if(!h.existsSync(r))return e.push({check:"config-schema-validation",status:"advisory",message:"No .paradigm/config.yaml found"}),e;try{let t=h.readFileSync(r,"utf8"),{validateConfig:l}=await import('./config-schema-HR7LDEQ6.js'),n=l(t),u=[];for(let a of n.errors)u.push(`Error: ${a}`);for(let a of n.warnings)u.push(`Warning: ${a}`);n.errors.length>0?e.push({check:"config-schema-validation",status:"error",message:`${n.errors.length} schema error${n.errors.length>1?"s":""} in config.yaml`,details:u,fix:"Fix invalid fields in .paradigm/config.yaml"}):n.warnings.length>0?e.push({check:"config-schema-validation",status:"warn",message:`${n.warnings.length} unrecognized key${n.warnings.length>1?"s":""} in config.yaml`,details:u,fix:"Check for typos in .paradigm/config.yaml field names"}):e.push({check:"config-schema-validation",status:"ok",message:"config.yaml schema is valid"});}catch(t){e.push({check:"config-schema-validation",status:"error",message:`Could not validate config.yaml: ${t.message}`});}return e}async function L(i){let e=[],r=[];function t(a){let o=new Set(["node_modules","dist",".git",".paradigm","coverage","build"]);try{let s=h.readdirSync(a,{withFileTypes:!0});for(let c of s){if(o.has(c.name))continue;let d=f.join(a,c.name);c.isDirectory()?t(d):c.name===".purpose"&&r.push(d);}}catch{}}if(t(i),r.length===0)return e.push({check:"purpose-file-health",status:"ok",message:"No .purpose files to check"}),e;let l=[],n=0,u="";for(let a of r)try{let s=h.readFileSync(a,"utf8").split(`
5
+ `).toLowerCase(),o=[];for(let s of n){let c=s.toLowerCase(),d=s.includes("/")?s.split("/").pop():s;!a.includes(c)&&!a.includes(d.toLowerCase())&&o.push(s);}return o.length>0?e.push({check:"undocumented-stack",status:"advisory",message:`${o.length} dependenc${o.length>1?"ies":"y"} not mentioned in instruction files`,details:o.slice(0,20),fix:"Consider documenting major dependencies in CLAUDE.md for AI context"}):e.push({check:"undocumented-stack",status:"ok",message:"All major dependencies are documented"}),e}async function E(i){let e=[],t=C(i,[".ts",".js",".py",".rs",".go",".tsx",".jsx"]);if(t.size===0)return e.push({check:"purpose-coverage",status:"ok",message:"No source directories found"}),e;let l=0,n=[];for(let o of t)if(S(o,i))l++;else {let s=f.relative(i,o);n.push(s);}let u=t.size,a=Math.round(l/u*100);return a<80?e.push({check:"purpose-coverage",status:"warn",message:`${a}% purpose coverage (${l}/${u} source directories) \u2014 below 80% threshold`,details:n.slice(0,15),fix:"Create .purpose files in uncovered source directories"}):e.push({check:"purpose-coverage",status:"ok",message:`${a}% purpose coverage (${l}/${u} source directories)`}),e}async function N(i){let e=[],r=f.join(i,".paradigm","scan-index.json");if(!h.existsSync(r))return e.push({check:"orphaned-symbols",status:"advisory",message:"No scan-index.json found \u2014 run paradigm scan first"}),e;let t;try{t=JSON.parse(h.readFileSync(r,"utf8"));}catch{return e.push({check:"orphaned-symbols",status:"advisory",message:"Could not parse scan-index.json"}),e}let l=["components","gates","signals","flows","aspects"],n=new Map,u=new Set;for(let s of l){let c=t[s];if(!(!c||typeof c!="object")){for(let[d,p]of Object.entries(c))if(p.symbol&&n.set(p.symbol,d),p.related&&Array.isArray(p.related))for(let g of p.related)u.add(g);}}let a=new Set;for(let s of l){let c=t[s];if(!(!c||typeof c!="object"))for(let[,d]of Object.entries(c))d.symbol&&d.related&&Array.isArray(d.related)&&d.related.length>0&&a.add(d.symbol);}let o=[];for(let[s]of n)!u.has(s)&&!a.has(s)&&o.push(s);return o.length>0?e.push({check:"orphaned-symbols",status:"advisory",message:`${o.length} isolated symbol${o.length>1?"s":""} (no connections to other symbols)`,details:o.slice(0,20),fix:"Wire isolated symbols into features or remove them from .purpose files"}):e.push({check:"orphaned-symbols",status:"ok",message:"All symbols are connected"}),e}async function F(i){let e=[],r=f.join(i,"portal.yaml");if(!h.existsSync(r))return e.push({check:"stale-portal",status:"ok",message:"No portal.yaml found (no routes to check)"}),e;let t;try{t=v.load(h.readFileSync(r,"utf8"));}catch{return e.push({check:"stale-portal",status:"error",message:"Could not parse portal.yaml"}),e}if(!t?.routes||typeof t.routes!="object")return e.push({check:"stale-portal",status:"ok",message:"No routes defined in portal.yaml"}),e;let l=Object.keys(t.routes),n=[],u=[".ts",".js",".py",".rs",".go"],a=[];function o(c){let d=new Set(["node_modules","dist",".git",".paradigm","coverage","build","target"]);try{let p=h.readdirSync(c,{withFileTypes:!0});for(let g of p){if(d.has(g.name))continue;let y=f.join(c,g.name);if(g.isDirectory())o(y);else if(g.isFile()){let m=f.extname(g.name);u.includes(m)&&a.push(y);}}}catch{}}o(i);let s=a.map(c=>({full:c,name:f.basename(c,f.extname(c)).toLowerCase(),relPath:f.relative(i,c).toLowerCase()}));for(let c of l){let p=c.replace(/^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+/i,"").split("/").filter(m=>m&&!m.startsWith(":")&&m!=="api");if(p.length===0)continue;let g=p[0].toLowerCase();s.some(m=>m.name.includes(g)||m.relPath.includes(g))||n.push(c);}return n.length>0?e.push({check:"stale-portal",status:"error",message:`${n.length} portal route${n.length>1?"s":""} with no matching implementation file`,details:n,fix:"Implement missing route handlers or remove stale routes from portal.yaml"}):e.push({check:"stale-portal",status:"ok",message:`All ${l.length} portal routes have matching implementation files`}),e}var _=[{pattern:/\btry to\b/i,label:"try to"},{pattern:/\bmaybe\b/i,label:"maybe"},{pattern:/\bif possible\b/i,label:"if possible"},{pattern:/\bconsider\b(?!-handoff)/i,label:"consider"},{pattern:/\bmight want to\b/i,label:"might want to"},{pattern:/\byou could\b/i,label:"you could"},{pattern:/\boptionally\b/i,label:"optionally"}];async function T(i){let e=[],r=k(i);if(r.length===0)return e.push({check:"instruction-vagueness",status:"ok",message:"No instruction files to check"}),e;let t=[];for(let l of r)for(let n=0;n<l.lines.length;n++){let u=l.lines[n];if(!u.trimStart().startsWith("```")&&!u.trim().startsWith("|---")){for(let{pattern:a,label:o}of _)if(a.test(u)){let s=u.trim(),c=s.length>80?s.slice(0,77)+"...":s;t.push(`${l.name}:${n+1} \u2014 "${o}" \u2014 ${c}`);}}}return t.length>0?e.push({check:"instruction-vagueness",status:"advisory",message:`${t.length} vague phrase${t.length>1?"s":""} in instruction files`,details:t.slice(0,20),fix:"Replace vague language with clear, actionable directives"}):e.push({check:"instruction-vagueness",status:"ok",message:"No vague language detected"}),e}async function I(i){let e=[],r=f.join(i,".paradigm","config.yaml");if(!h.existsSync(r))return e.push({check:"config-schema-validation",status:"advisory",message:"No .paradigm/config.yaml found"}),e;try{let t=h.readFileSync(r,"utf8"),{validateConfig:l}=await import('./config-schema-GUQY2QN7.js'),n=l(t),u=[];for(let a of n.errors)u.push(`Error: ${a}`);for(let a of n.warnings)u.push(`Warning: ${a}`);n.errors.length>0?e.push({check:"config-schema-validation",status:"error",message:`${n.errors.length} schema error${n.errors.length>1?"s":""} in config.yaml`,details:u,fix:"Fix invalid fields in .paradigm/config.yaml"}):n.warnings.length>0?e.push({check:"config-schema-validation",status:"warn",message:`${n.warnings.length} unrecognized key${n.warnings.length>1?"s":""} in config.yaml`,details:u,fix:"Check for typos in .paradigm/config.yaml field names"}):e.push({check:"config-schema-validation",status:"ok",message:"config.yaml schema is valid"});}catch(t){e.push({check:"config-schema-validation",status:"error",message:`Could not validate config.yaml: ${t.message}`});}return e}async function L(i){let e=[],r=[];function t(a){let o=new Set(["node_modules","dist",".git",".paradigm","coverage","build"]);try{let s=h.readdirSync(a,{withFileTypes:!0});for(let c of s){if(o.has(c.name))continue;let d=f.join(a,c.name);c.isDirectory()?t(d):c.name===".purpose"&&r.push(d);}}catch{}}if(t(i),r.length===0)return e.push({check:"purpose-file-health",status:"ok",message:"No .purpose files to check"}),e;let l=[],n=0,u="";for(let a of r)try{let s=h.readFileSync(a,"utf8").split(`
6
6
  `).length;if(s>n&&(n=s,u=f.relative(i,a)),s>500){let c=s>1e3?"!!":"!";l.push(`${c} ${f.relative(i,a)} (${s} lines)`);}}catch{continue}return l.length>0?e.push({check:"purpose-file-health",status:"warn",message:`${l.length} oversized .purpose file${l.length>1?"s":""} (largest: ${u} at ${n} lines)`,details:l,fix:"Split large .purpose files by component type or subdirectory"}):e.push({check:"purpose-file-health",status:"ok",message:`${r.length} .purpose files, all under 500 lines`}),e}async function W(i,e){let r=a.command("doctor:context-audit").start("Running context audit checks"),t=[];t.push(...await $(i)),t.push(...await A(i)),t.push(...await j(i)),t.push(...await E(i)),t.push(...await N(i)),t.push(...await F(i)),t.push(...await T(i)),t.push(...await I(i)),t.push(...await L(i));let l=t.filter(a=>a.status==="error").length,n=t.filter(a=>a.status==="warn").length,u=t.filter(a=>a.status==="advisory").length;return l>0?r.error("Context audit found issues",{errors:l,warnings:n,advisories:u}):r.success("Context audit complete",{warnings:n,advisories:u}),t}export{W as runContextAudit};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{a as doctorCommand}from'./chunk-CSXVL2U7.js';import'./chunk-HMQ5BHP2.js';import'./chunk-JQKKVAAN.js';import'./chunk-LKAT7IAK.js';import'./chunk-5TAVYPOV.js';
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import {g,i,a as a$1,f as f$1,j,d as d$1,e,k,m,l}from'./chunk-27FBCZX6.js';import {h,f,a,g as g$1,d,b}from'./chunk-WR6D3SC6.js';import'./chunk-5TAVYPOV.js';import t from'chalk';async function M(e){let o=process.cwd(),r=g(o),c=i(r),f$1=Object.keys(r.checks);if(e.json){h({level:r.level,orchestration:r.orchestration,overrides:r.checks,resolved:c});return}f("Enforcement Configuration"),a(""),g$1("Level",$(r.level)),g$1("Orchestration threshold",String(r.orchestration.threshold)+" files"),g$1("Detection",r.orchestration.detection),g$1("Overrides",f$1.length>0?String(f$1.length):t.dim("none")),a("");let i$1=30,m=12,b=12;a(" "+t.dim("Check ID".padEnd(i$1))+t.dim("Severity".padEnd(m))+t.dim("Source")),a(" "+t.dim("\u2500".repeat(i$1+m+b)));for(let v of a$1){let j=c[v],D=r.checks[v]!==void 0?t.cyan("override"):t.dim("preset");a(" "+v.padEnd(i$1)+y(j).padEnd(m+10)+D);}a("");}async function U(e){if(!f$1(e)){d(`Invalid level: ${e}. Must be one of: strict, balanced, minimal`),process.exitCode=1;return}let o=process.cwd();try{j(o,e),b(`Enforcement level set to ${$(e)}`);}catch(r){d(`Failed to set level: ${r.message}`),process.exitCode=1;}}async function H(e$1,o){if(!d$1(e$1)){d(`Unknown check ID: ${e$1}`),a(" Valid IDs: "+a$1.join(", ")),process.exitCode=1;return}if(!e(o)){d(`Invalid severity: ${o}. Must be one of: block, warn, off`),process.exitCode=1;return}let r=process.cwd();try{k(r,e$1,o),b(`Override set: ${e$1} = ${y(o)}`);}catch(c){d(`Failed to set override: ${c.message}`),process.exitCode=1;}}async function P(e){let o=process.cwd();if(!e){try{m(o),b("All enforcement overrides cleared");}catch(r){d(`Failed to reset overrides: ${r.message}`),process.exitCode=1;}return}if(!d$1(e)){d(`Unknown check ID: ${e}`),a(" Valid IDs: "+a$1.join(", ")),process.exitCode=1;return}try{l(o,e),b(`Override removed: ${e} (reverted to preset default)`);}catch(r){d(`Failed to reset override: ${r.message}`),process.exitCode=1;}}async function _(e){let o=process.cwd(),r=g(o),c=i(r);if(e.json){h(c);return}f("Resolved Enforcement Checks"),a("");for(let[f,i]of Object.entries(c))a(" "+f.padEnd(30)+y(i));a("");}function y(e){switch(e){case "block":return t.red("block");case "warn":return t.yellow("warn");case "off":return t.dim("off");default:return String(e)}}function $(e){switch(e){case "strict":return t.red(e);case "balanced":return t.yellow(e);case "minimal":return t.green(e);default:return e}}export{H as enforcementOverrideCommand,P as enforcementResetCommand,_ as enforcementResolveCommand,U as enforcementSetCommand,M as enforcementStatusCommand};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{a as CHECK_IDS,n as ensureEnforcementDefaults,h as getCheckSeverity,b as getPreset,c as getPresetSeverity,d as isValidCheckId,f as isValidLevel,e as isValidSeverity,g as loadEnforcementConfig,m as resetAllOverrides,l as resetCheckOverride,i as resolveAllChecks,k as setCheckOverride,j as setEnforcementLevel}from'./chunk-27FBCZX6.js';import'./chunk-5TAVYPOV.js';
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {a,b,c,e,d}from'./chunk-ET5XJTSX.js';import'./chunk-5TAVYPOV.js';import*as g from'fs';import*as u from'path';import {execSync}from'child_process';import o from'chalk';import*as C from'js-yaml';var $=".paradigm/habits.yaml",G=new Set(["explore-before-implement","ripple-before-modify","check-fragility","wisdom-before-implement","verify-before-done","postflight-compliance","test-new-components","purpose-coverage","record-lore-for-significant","gates-for-routes"]),x=["discovery","verification","testing","documentation","collaboration","security"],E=["preflight","postflight","on-stop","on-commit"],I=["advisory","warn","block"],P=["tool-called","file-exists","file-modified","lore-recorded","symbols-registered","gates-declared","tests-exist","git-clean"];function T(e,t){let r=u.join(e,$),i=F(r,t);if(i)return {source:"project",...i};let n=process.env.HOME||process.env.USERPROFILE||"~",l=u.join(n,".paradigm","habits.yaml"),c=F(l,t);return c?{source:"global",...c}:G.has(t)?{source:"seed",filePath:"",index:-1}:null}function F(e,t){if(!g.existsSync(e))return null;try{let r=g.readFileSync(e,"utf8"),i=C.load(r);if(!i?.habits)return null;let n=i.habits.findIndex(l=>l.id===t);return n===-1?null:{filePath:e,index:n}}catch{return null}}function D(e){let t=g.readFileSync(e,"utf8"),r=C.load(t);return r.habits||(r.habits=[]),r.overrides||(r.overrides={}),r}function w(e,t){g.writeFileSync(e,C.dump(t,{lineWidth:80,noRefs:true}),"utf8");}function L(e){let t=u.join(e,$);if(!g.existsSync(t)){let r=u.dirname(t);g.existsSync(r)||g.mkdirSync(r,{recursive:true}),w(t,{version:"1.0",habits:[],overrides:{}});}return t}async function J(e){let t=process.cwd(),r;try{r=a(t);}catch(s){console.log(o.red("Failed to load habits:"),s.message);return}if(e.trigger&&(r=r.filter(s=>s.trigger===e.trigger)),e.category&&(r=r.filter(s=>s.category===e.category)),e.json){console.log(JSON.stringify(r,null,2));return}let i=r.filter(s=>s.enabled),n=r.filter(s=>!s.enabled);console.log(o.magenta(`
2
+ import {a,b,c,e,d}from'./chunk-RMOALQJN.js';import'./chunk-5TAVYPOV.js';import*as g from'fs';import*as u from'path';import {execSync}from'child_process';import o from'chalk';import*as C from'js-yaml';var $=".paradigm/habits.yaml",G=new Set(["explore-before-implement","ripple-before-modify","check-fragility","wisdom-before-implement","verify-before-done","postflight-compliance","test-new-components","purpose-coverage","record-lore-for-significant","gates-for-routes"]),x=["discovery","verification","testing","documentation","collaboration","security"],E=["preflight","postflight","on-stop","on-commit"],I=["advisory","warn","block"],P=["tool-called","file-exists","file-modified","lore-recorded","symbols-registered","gates-declared","tests-exist","git-clean"];function T(e,t){let r=u.join(e,$),i=F(r,t);if(i)return {source:"project",...i};let n=process.env.HOME||process.env.USERPROFILE||"~",l=u.join(n,".paradigm","habits.yaml"),c=F(l,t);return c?{source:"global",...c}:G.has(t)?{source:"seed",filePath:"",index:-1}:null}function F(e,t){if(!g.existsSync(e))return null;try{let r=g.readFileSync(e,"utf8"),i=C.load(r);if(!i?.habits)return null;let n=i.habits.findIndex(l=>l.id===t);return n===-1?null:{filePath:e,index:n}}catch{return null}}function D(e){let t=g.readFileSync(e,"utf8"),r=C.load(t);return r.habits||(r.habits=[]),r.overrides||(r.overrides={}),r}function w(e,t){g.writeFileSync(e,C.dump(t,{lineWidth:80,noRefs:true}),"utf8");}function L(e){let t=u.join(e,$);if(!g.existsSync(t)){let r=u.dirname(t);g.existsSync(r)||g.mkdirSync(r,{recursive:true}),w(t,{version:"1.0",habits:[],overrides:{}});}return t}async function J(e){let t=process.cwd(),r;try{r=a(t);}catch(s){console.log(o.red("Failed to load habits:"),s.message);return}if(e.trigger&&(r=r.filter(s=>s.trigger===e.trigger)),e.category&&(r=r.filter(s=>s.category===e.category)),e.json){console.log(JSON.stringify(r,null,2));return}let i=r.filter(s=>s.enabled),n=r.filter(s=>!s.enabled);console.log(o.magenta(`
3
3
  Habits (${i.length} active, ${n.length} disabled)
4
4
  `));let l=["preflight","postflight","on-stop","on-commit"];for(let s of l){let y=r.filter(d=>d.trigger===s);if(y.length!==0){console.log(o.cyan(` ${s}:`));for(let d of y){let a=d.enabled?o.green("ON"):o.gray("OFF"),m=d.severity==="block"?o.red(d.severity):d.severity==="warn"?o.yellow(d.severity):o.gray(d.severity);console.log(` ${a} ${o.white(d.id)} [${m}] - ${d.name}`),console.log(o.gray(` ${d.description}`));}console.log();}}let c=u.join(t,$);g.existsSync(c)?console.log(o.gray(` Config: ${$}`)):console.log(o.gray(" Config: using seed habits only (run 'paradigm habits init' to customize)")),console.log();}async function W(e){let t=process.cwd(),r;try{r=a(t);}catch(c){console.log(o.red("Failed to load habits:"),c.message);return}let i=b(r),n=null;try{let{SentinelStorage:c}=await import('./dist-VGFSP3XM.js'),s=u.join(t,".paradigm","sentinel");if(g.existsSync(s)){let y=new c(s),d=e.period||"30d",a=parseInt(d.replace("d",""),10)||30,m=d==="all"?void 0:new Date(Date.now()-a*24*60*60*1e3).toISOString(),v=y.getComplianceRate({dateFrom:m}),f=y.getPracticeEvents({dateFrom:m,limit:500}),b=new Map;for(let h of f){let p=h.habitCategory,S=b.get(p)||{followed:0,skipped:0,partial:0};S[h.result]++,b.set(p,S);}let j=Array.from(b.entries()).map(([h,p])=>{let S=p.followed+p.skipped+p.partial,O=S>0?Math.round((p.followed+p.partial*.5)/S*100):100;return {category:h,rate:O,total:S}}).sort((h,p)=>h.rate-p.rate);n={total:v.total,followed:v.followed,skipped:v.skipped,partial:v.partial,rate:v.rate,byCategory:j};}}catch{}if(e.json){console.log(JSON.stringify({habits:{total:r.length,enabled:i.length},practice:n},null,2));return}console.log(o.magenta(`
5
5
  Habits Practice Profile
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{a as hooksInstallCommand,c as hooksStatusCommand,b as hooksUninstallCommand}from'./chunk-SWFC4HD7.js';import'./chunk-5TAVYPOV.js';
2
+ export{a as hooksInstallCommand,c as hooksStatusCommand,b as hooksUninstallCommand}from'./chunk-FSOI3CCD.js';import'./chunk-5TAVYPOV.js';