arkgate 3.7.0 → 3.8.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.
Files changed (77) hide show
  1. package/CHANGELOG.md +76 -1145
  2. package/README.md +59 -19
  3. package/bin/ark-check-runtime.mjs +1598 -0
  4. package/bin/ark-check.mjs +32 -1565
  5. package/bin/ark-mcp-runtime.mjs +1976 -0
  6. package/bin/ark-mcp.mjs +84 -1495
  7. package/bin/ark-shared.mjs +34 -38
  8. package/bin/ark.mjs +33 -66
  9. package/bin/lib/adapter-contract.mjs +161 -9
  10. package/bin/lib/agent-gates.mjs +1 -0
  11. package/bin/lib/analysis-completeness.mjs +28 -0
  12. package/bin/lib/analysis-engine.mjs +8 -8
  13. package/bin/lib/analysis-policy.mjs +27 -0
  14. package/bin/lib/architecture-scan.mjs +70 -357
  15. package/bin/lib/auto-patch.mjs +76 -8
  16. package/bin/lib/ci-and-commands.mjs +1 -1
  17. package/bin/lib/codex-home.mjs +43 -16
  18. package/bin/lib/design-delta.mjs +4 -0
  19. package/bin/lib/doctor-advisories.mjs +4 -3
  20. package/bin/lib/doctor-plan.mjs +40 -41
  21. package/bin/lib/enforcement-state.mjs +2 -0
  22. package/bin/lib/github-enforcement.mjs +443 -0
  23. package/bin/lib/hook-templates.mjs +12 -148
  24. package/bin/lib/html-report-advisories.mjs +1 -1
  25. package/bin/lib/html-report-depth.mjs +9 -0
  26. package/bin/lib/html-report.mjs +5 -5
  27. package/bin/lib/install-migrate.mjs +83 -79
  28. package/bin/lib/managed-upgrade.mjs +622 -0
  29. package/bin/lib/mcp-adoption.mjs +3 -1
  30. package/bin/lib/parse-health.mjs +6 -5
  31. package/bin/lib/port-proof.mjs +2 -2
  32. package/bin/lib/prepare-change.mjs +68 -38
  33. package/bin/lib/prepare-write.mjs +7 -1
  34. package/bin/lib/resident-doctor-client.mjs +55 -0
  35. package/bin/lib/resident-hook.mjs +247 -0
  36. package/bin/lib/resolved-candidate-facts.mjs +1160 -0
  37. package/bin/lib/scan-files.mjs +19 -6
  38. package/bin/lib/snippet-analysis.mjs +119 -0
  39. package/bin/lib/source-policy.mjs +24 -0
  40. package/bin/lib/typescript-host.mjs +15 -18
  41. package/bin/lib/unavailable-analysis.mjs +76 -0
  42. package/bin/lib/upgrade-command.mjs +115 -0
  43. package/bin/lib/weakest-link.mjs +21 -179
  44. package/bin/lib/write-path-capabilities.mjs +167 -16
  45. package/bin/lib/write-path-detect.mjs +3 -2
  46. package/dist/eslint/index.cjs +3 -3
  47. package/dist/eslint/index.d.ts +3 -0
  48. package/dist/eslint/index.js +3 -3
  49. package/dist/index.cjs +7 -7
  50. package/dist/index.d.ts +1073 -141
  51. package/dist/index.js +7 -7
  52. package/docs/agent-guide.md +103 -59
  53. package/docs/ai-gates.md +97 -16
  54. package/docs/demos/01-write-gate-self-correction.md +2 -2
  55. package/docs/enthusiast/README.md +10 -10
  56. package/docs/enthusiast/how-to-gallery-starter.md +2 -2
  57. package/docs/enthusiast/reference-commands.md +18 -1
  58. package/docs/enthusiast/tutorial-first-project.md +2 -2
  59. package/docs/package-surface.md +98 -12
  60. package/docs/typescript-support.md +109 -37
  61. package/package.json +32 -4
  62. package/schemas/ark.analysis-result.schema.json +159 -2
  63. package/schemas/ark.design-delta.schema.json +1 -0
  64. package/schemas/ark.enforcement-state.schema.json +84 -0
  65. package/schemas/ark.resolved-candidate-facts.schema.json +1 -0
  66. package/server.json +2 -2
  67. package/templates/skills/ark-explore.md +5 -5
  68. package/templates/skills/ark-fix.md +1 -1
  69. package/templates/skills/ark-runtime.md +15 -8
  70. package/templates/skills/ark-upgrade.md +122 -182
  71. package/bin/lib/ai-velocity.mjs +0 -293
  72. package/bin/lib/graph-cycles.mjs +0 -6
  73. package/bin/lib/safety-diagnostics.mjs +0 -284
  74. package/bin/lib/ts-resolve.mjs +0 -228
  75. package/dist/configTypes-DAPvBqK6.d.cts +0 -61
  76. package/dist/eslint/index.d.cts +0 -146
  77. package/dist/index.d.cts +0 -986
@@ -1,3 +1,3 @@
1
- "use strict";var Ae=Object.create;var N=Object.defineProperty;var ke=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var Ie=Object.getPrototypeOf,we=Object.prototype.hasOwnProperty;var Re=(e,t)=>{for(var n in t)N(e,n,{get:t[n],enumerable:!0})},W=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Se(t))!we.call(e,r)&&r!==n&&N(e,r,{get:()=>t[r],enumerable:!(i=ke(t,r))||i.enumerable});return e};var z=(e,t,n)=>(n=e!=null?Ae(Ie(e)):{},W(t||!e||!e.__esModule?N(n,"default",{value:e,enumerable:!0}):n,e)),Ce=e=>W(N({},"__esModule",{value:!0}),e);var Ue={};Re(Ue,{default:()=>He,findConfigPath:()=>P,globToRegExp:()=>E,isEdgeDenied:()=>M,layerForRelativePath:()=>A,loadArkConfig:()=>j,noDeniedCapabilities:()=>he,noDomainInfraImports:()=>ge,noForbiddenGlobals:()=>be,noRawEventPublish:()=>me,patternSpecificity:()=>D,plugin:()=>$,requirePublishSource:()=>ye,resolveRelativeImport:()=>ce});module.exports=Ce(Ue);var I=z(require("fs"),1),p=z(require("path"),1);var Y=new Map;function J(e){return/[.*+?^${}()|[\]\\]/.test(e)?`\\${e}`:e}function F(e){let t="";for(let n=0;n<e.length;n+=1){let i=e[n];if(i==="\\"&&n+1<e.length){let r=e[n+1];if("*?{}[],".includes(r)||r==="\\"){t+="\\"+r,n+=1;continue}t+="/";continue}t+=i}return t}function xe(e){let t=0;for(let n=0;n<e.length;n+=1){let i=e[n];if(i==="\\"){n+=1;continue}if(i==="{")t+=1;else if(i==="}"&&(t-=1,t<0))return!1}return t===0}function E(e){let t=Y.get(e);if(t)return t;let n=F(e),i=xe(n),r="",a=0;for(let c=0;c<n.length;c+=1){let f=n[c];f==="\\"&&c+1<n.length?(r+=J(n[c+1]),c+=1):f==="*"?n[c+1]==="*"?n[c+2]==="/"?(r+="(?:.*/)?",c+=2):(r+=".*",c+=1):r+="[^/]*":f==="?"?r+="[^/]":f==="{"&&i?(r+="(?:",a+=1):f==="}"&&i&&a>0?(r+=")",a-=1):f===","&&i&&a>0?r+="|":r+=J(f)}let l=new RegExp(`^${r}$`);return Y.set(e,l),l}function D(e){let t=F(String(e)),i=t.split("*")[0].split("/").filter(Boolean).length,r=t.replace(/\*/g,"").length;return i*1e4+r}function A(e,t){let n=String(e).split(/[/\\]/).join("/"),i,r=-1;for(let a of t??[])if(!(a.exclude??[]).some(l=>E(l).test(n))){for(let l of a.patterns??[])if(E(l).test(n)){let c=D(l);c>r&&(r=c,i=a.name)}}return i}function Z(e,t){if(!t?.length)return;let n=String(e).split(/[/\\]/).filter(Boolean),i=new Set(t.map(r=>String(r).toLowerCase()));for(let r=0;r<n.length-1;r+=1)if(i.has(n[r].toLowerCase()))return`${n[r].toLowerCase()}/${n[r+1].toLowerCase()}`}function Ne(e){let t=new Set;for(let n of e??[]){let r=F(String(n)).split("/").filter(Boolean);for(let a=0;a<r.length;a+=1){let l=r[a];if((l==="**"||l==="*")&&a>0){let c=r[a-1];c&&!c.includes("*")&&!c.includes("{")&&!c.includes("}")&&t.add(c)}}}return[...t]}function Ee(e,t,n){if(Array.isArray(e.sliceFolders)&&e.sliceFolders.length>0)return e.sliceFolders.filter(r=>typeof r=="string"&&r.length>0);let i=(n??[]).find(r=>r.name===t);return Ne(i?.patterns)}function Le(e,t,n,i){for(let r of e??[])if(!(r.from!==t||r.to!==n)&&r.allowed===!1){if(r.peerIsolation){let a=i?.fromPath,l=i?.toPath;if(!a||!l)continue;let c=Ee(r,t,i?.layers);if(c.length===0)continue;let f=Z(a,c),g=Z(l,c);if(!f||!g)continue;if(f!==g)return r;continue}if(t!==n)return r}}function M(e,t,n,i){return Le(e,t,n,i)!==void 0}var X=Object.freeze(["network","filesystem","clock","randomness","environment","process","persistence"]),Oe=Object.freeze({fetch:"network",XMLHttpRequest:"network",Date:"clock","Date.now":"clock","Math.random":"randomness","process.env":"environment",process:"process"}),ze=Object.freeze(Object.keys(Oe).sort()),T=Object.freeze({fs:"filesystem","node:fs":"filesystem","fs/promises":"filesystem","node:fs/promises":"filesystem","fs-extra":"filesystem","graceful-fs":"filesystem",memfs:"filesystem",chokidar:"filesystem",http:"network",https:"network",http2:"network",net:"network",tls:"network",dgram:"network",dns:"network","node:http":"network","node:https":"network","node:http2":"network","node:net":"network","node:tls":"network","node:dgram":"network","node:dns":"network",axios:"network",undici:"network","node-fetch":"network",got:"network",ky:"network",superagent:"network",ws:"network",process:"process","node:process":"process",child_process:"process","node:child_process":"process","@prisma/client":"persistence",prisma:"persistence",pg:"persistence",mysql:"persistence",mysql2:"persistence",mongodb:"persistence",mongoose:"persistence",sqlite3:"persistence","better-sqlite3":"persistence",redis:"persistence",ioredis:"persistence",typeorm:"persistence",knex:"persistence","drizzle-orm":"persistence",sequelize:"persistence",kysely:"persistence","@supabase/supabase-js":"persistence"}),_e=Object.freeze({process:Object.freeze(["process","node:process"])});function Q(e){if(!e||e.startsWith(".")||e.startsWith("/"))return null;let t=T[e];if(t)return t;let n=e.indexOf("/");if(n<0)return null;let i=e.slice(0,n),r=T[i];if(r)return r;let a=e.indexOf("/",n+1);return a<0?null:T[e.slice(0,a)]??null}function V(e,t){for(let n of t)if(_e[n]?.includes(e))return n;return null}function ee(e){if(e?.pure===!0)return[...X].sort();let n=(e?.capabilities?.deny??[]).filter(i=>X.includes(i));return[...new Set(n)].sort()}var K="https://unpkg.com/arkgate@2/schemas/ark.config.schema.json",te=["DomainModel","ApplicationOrchestration","PersistenceAdapters","IntegrationAdapters","WorkflowSagaEngine","BackgroundJobsScheduling","PresentationAdapters","ReportingReadModels","ExtensibilityMetadata","SecurityAuditObservability","Kernel"],$e=new Set(["PresentationAdapters->ApplicationOrchestration","ApplicationOrchestration->DomainModel","WorkflowSagaEngine->ApplicationOrchestration","WorkflowSagaEngine->DomainModel","BackgroundJobsScheduling->ApplicationOrchestration"]);function Pe(){let e=[];for(let t of te)for(let n of te)t===n||$e.has(`${t}->${n}`)||e.push({from:t,to:n,allowed:!1});return e}var re=Pe();var h={type:"array",items:{type:"string",minLength:1},uniqueItems:!0},ne={$schema:"https://json-schema.org/draft/2020-12/schema",$id:K,title:"ArkGate architecture contract",description:"Versioned contract consumed identically by ArkGate CLI, MCP, and ESLint surfaces.",type:"object",additionalProperties:!1,required:["$schema","schemaVersion","include","layers","rules"],properties:{$schema:{type:"string",minLength:1,default:K,description:"Editor-facing URL or local path for this JSON Schema."},schemaVersion:{type:"string",const:"1.0",default:"1.0"},name:{type:"string",minLength:1},include:{...h,minItems:1,default:["src"]},exclude:{...h,default:[]},excludeGenerated:{type:"boolean",default:!0},frameworkOverlay:{type:"string",minLength:1},layers:{type:"array",default:[],items:{$ref:"#/$defs/layer"}},rules:{type:"array",default:re,items:{$ref:"#/$defs/rule"}},cyclePolicy:{type:"string",enum:["strict","soft","framework-soft","off"],default:"strict"},dynamicImportAllowlist:{...h,default:[]},safety:{$ref:"#/$defs/safety",default:{maxTsSuppressions:0,maxAnyCasts:0,allowInMemory:!1,allowDisabledPeerIsolation:!1}}},$defs:{layer:{type:"object",additionalProperties:!1,required:["name","patterns"],properties:{name:{type:"string",minLength:1},patterns:{...h,minItems:1},exclude:h,intentPrefixes:h,description:{type:"string",minLength:1},forbiddenGlobals:h,capabilities:{type:"object",additionalProperties:!1,properties:{deny:{type:"array",uniqueItems:!0,items:{type:"string",enum:["network","filesystem","clock","randomness","environment","process","persistence"]}}}},pure:{type:"boolean"},mayImportInfrastructure:{type:"boolean"},optional:{type:"boolean"}}},rule:{type:"object",additionalProperties:!1,required:["from","to","allowed"],properties:{from:{type:"string",minLength:1},to:{type:"string",minLength:1},allowed:{type:"boolean"},message:{type:"string",minLength:1},peerIsolation:{type:"boolean"},sliceFolders:{...h,minItems:1}}},safety:{type:"object",additionalProperties:!1,properties:{maxTsSuppressions:{type:"integer",minimum:0,default:0},maxAnyCasts:{type:"integer",minimum:0,default:0},allowInMemory:{type:"boolean",default:!1},allowDisabledPeerIsolation:{type:"boolean",default:!1}}}}},S=class extends Error{issues;source;constructor(t,n){super(`Invalid ArkGate config (${t}):
2
- ${n.map(i=>`- ${i.path}: ${i.message}`).join(`
3
- `)}`),this.name="ArkConfigValidationError",this.source=t,this.issues=n}};function ie(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function G(e,t){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(t)?`${e}.${t}`:`${e}[${JSON.stringify(t)}]`}function k(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function je(e,t){let n="#/$defs/";if(e.startsWith(n))return t.$defs[e.slice(n.length)]}function L(e,t,n,i,r){if(t.$ref){let a=je(t.$ref,i);if(!a){r.push({path:n,message:`schema reference ${t.$ref} cannot be resolved`});return}L(e,a,n,i,r);return}if(t.const!==void 0&&!Object.is(e,t.const)){r.push({path:n,message:`must equal ${JSON.stringify(t.const)}`});return}if(t.enum&&!t.enum.some(a=>Object.is(a,e))){r.push({path:n,message:`must be one of ${t.enum.map(String).join(", ")}`});return}if(t.type==="object"){if(!ie(e)){r.push({path:n,message:`must be an object; received ${k(e)}`});return}let a=t.properties??{};for(let l of t.required??[])e[l]===void 0&&r.push({path:G(n,l),message:"is required"});if(t.additionalProperties===!1)for(let l of Object.keys(e))l in a||r.push({path:G(n,l),message:"unknown field"});for(let[l,c]of Object.entries(a))e[l]!==void 0&&L(e[l],c,G(n,l),i,r);return}if(t.type==="array"){if(!Array.isArray(e)){r.push({path:n,message:`must be an array; received ${k(e)}`});return}if(t.minItems!==void 0&&e.length<t.minItems&&r.push({path:n,message:`must contain at least ${t.minItems} item(s)`}),t.uniqueItems){let a=e.map(l=>JSON.stringify(l));new Set(a).size!==a.length&&r.push({path:n,message:"must not contain duplicate items"})}t.items&&e.forEach((a,l)=>L(a,t.items,`${n}[${l}]`,i,r));return}if(t.type==="string"){if(typeof e!="string"){r.push({path:n,message:`must be a string; received ${k(e)}`});return}t.minLength!==void 0&&e.length<t.minLength&&r.push({path:n,message:`must contain at least ${t.minLength} character(s)`});return}if(t.type==="boolean"){typeof e!="boolean"&&r.push({path:n,message:`must be a boolean; received ${k(e)}`});return}if(t.type==="integer"){if(!Number.isInteger(e)){r.push({path:n,message:`must be an integer; received ${k(e)}`});return}t.minimum!==void 0&&e<t.minimum&&r.push({path:n,message:`must be at least ${t.minimum}`})}}function ve(e){return{...e,$schema:e.$schema===void 0?K:e.$schema,schemaVersion:e.schemaVersion===void 0?"1.0":e.schemaVersion,include:e.include===void 0?["src"]:e.include,layers:e.layers===void 0?[]:e.layers,rules:e.rules===void 0?re.map(t=>({...t})):e.rules}}function Fe(e,t="ark.config.json"){if(!ie(e))throw new S(t,[{path:"$",message:`must be an object; received ${k(e)}`}]);let n=e.schemaVersion===void 0?"unversioned":null;if(e.schemaVersion!==void 0&&e.schemaVersion!=="1.0")throw new S(t,[{path:"$.schemaVersion",message:`unsupported version ${JSON.stringify(e.schemaVersion)}; expected 1.0`}]);return{candidate:ve(e),migratedFrom:n}}function De(e,t="ark.config.json"){let{candidate:n,migratedFrom:i}=Fe(e,t),r=[];if(L(n,ne,"$",ne,r),r.length>0)throw new S(t,r);return{config:n,migratedFrom:i}}function oe(e,t="ark.config.json"){let n;try{n=JSON.parse(e)}catch(i){throw new S(t,[{path:"$",message:`invalid JSON: ${i instanceof Error?i.message:String(i)}`}])}return De(n,t)}function b(e){return typeof e=="string"&&e.length>0?e:void 0}function se(e,t){return Number.isInteger(e)&&Number(e)>0?Number(e):t}function Me(e,t,n){return e==="LAYER_IMPORT_VIOLATION"?t.typeOnly||n.targetTypeOnlyExports===!0||n.namedBindingsTypeOnly===!0?"Move the referenced type to a mutually allowed layer, use `import type`, then preflight again.":n.peerIsolation===!0?"Extract the shared dependency to a shared layer, then preflight again.":`Define a port in ${t.fromLayer??"the source layer"}, inject the ${t.toLayer??"outer-layer"} implementation, then preflight again.`:e==="FORBIDDEN_GLOBAL"?`Inject ${t.target??"the capability"} through a port, then preflight again.`:e==="CAPABILITY_VIOLATION"?`Define a ${b(n.capability)??"capability"} port in ${t.fromLayer??"the walled layer"}, bind the implementation outside it, then preflight again.`:e==="CIRCULAR_DEPENDENCY"?"Extract the shared dependency into a third module, then preflight again.":e==="RAW_EVENT_PUBLISH"?"Publish through a registered intent creator, then run Ark again.":e==="PUBLISH_MISSING_SOURCE"?"Add metadata.source to the publish call, then run Ark again.":`Resolve ${e} without weakening ark.config.json, then run Ark again.`}function ae(e,t="error"){let n=b(e.ruleId)??b(e.code)??"ARK_UNKNOWN",i=e.severity==="warning"?"warning":t,r={...b(e.target)?{target:b(e.target)}:{},...b(e.fromLayer)?{fromLayer:b(e.fromLayer)}:{},...b(e.toLayer)?{toLayer:b(e.toLayer)}:{},...typeof e.typeOnly=="boolean"?{typeOnly:e.typeOnly}:{}};return{ruleId:n,severity:i,message:b(e.message)??n,location:{file:b(e.file)??"<unknown>",line:se(e.line,1),column:se(e.column,1)},evidence:r,nextAction:b(e.nextAction)??Me(n,r,e)}}var le={RAW_EVENT_PUBLISH:"Publish through a registered intent creator; raw event objects or intent strings bypass Ark contracts and tooling.",PUBLISH_MISSING_SOURCE:"Strict Ark publish calls must include metadata.source."};function Te(e){return/^(Domain|Application|Adapter|Workflow|Job|Presentation|Reporting|Metadata|Security|Audit|Observability|Kernel)\.[A-Za-z0-9_.]+$/.test(e)}function B(e){if(!e.publishCall)return[];let t=[];return(e.rawIntentName!==void 0&&Te(e.rawIntentName)||e.objectHasIntent)&&t.push({ruleId:"RAW_EVENT_PUBLISH",message:le.RAW_EVENT_PUBLISH}),e.arkPublishCandidate&&!e.hasSource&&t.push({ruleId:"PUBLISH_MISSING_SOURCE",message:le.PUBLISH_MISSING_SOURCE}),t}function C(e){if(typeof e.physicalFilename=="string"&&e.physicalFilename.length>0)return e.physicalFilename;if(typeof e.filename=="string"&&e.filename.length>0)return e.filename;if(typeof e.getFilename=="function")try{let t=e.getFilename();if(typeof t=="string"&&t.length>0)return t}catch{}return""}function w(e,t,n,i,r){let a=ae({...i,line:i.line??t.loc?.start?.line,column:i.column??(typeof t.loc?.start?.column=="number"?t.loc.start.column+1:void 0)});return e.report({node:t,messageId:n,...r?{data:r}:{},diagnostic:a}),a}function P(e){if(!e||e==="<input>"||e.startsWith("stdin"))return null;let t=p.default.dirname(p.default.resolve(e));for(;;){let n=p.default.join(t,"ark.config.json");if(I.default.existsSync(n))return n;let i=p.default.dirname(t);if(i===t)return null;t=i}}var H=new Map;function j(e){if(H.has(e))return H.get(e)??null;if(!I.default.existsSync(e))return null;let t=oe(I.default.readFileSync(e,"utf8"),e).config;return H.set(e,t),t}function ce(e,t){if(!t.startsWith("."))return null;let n=p.default.resolve(p.default.dirname(e),t),i=[n,`${n}.ts`,`${n}.tsx`,`${n}.mts`,`${n}.cts`,`${n}.js`,`${n}.jsx`,p.default.join(n,"index.ts"),p.default.join(n,"index.tsx"),p.default.join(n,"index.js")];for(let r of i)try{if(I.default.existsSync(r)&&I.default.statSync(r).isFile())return r}catch{}return`${n}.ts`}function v(e){return typeof e?.value=="string"?e.value:void 0}function U(e){return e?.name??v(e)}function q(e){return e.sourceCode??e.getSourceCode?.()}function ue(e,t){let n=q(e)?.getScope?.(t);for(;n;){let i=n.references?.find(r=>r.identifier===t);if(i)return i;n=n.upper??void 0}}function O(e,t,n){let i=ue(e,t);if(i?.resolved)return(i.resolved.defs?.length??0)>0;let r=q(e)?.getScope?.(t);for(;r;){let a=r.set?.get(n);if(a)return(a.defs?.length??0)>0;r=r.upper??void 0}return!1}function Ve(e,t){let n=ue(e,t);return n?n.isValueReference!==!1:t.parent?.type==="VariableDeclarator"&&t.parent.init===t}function de(e){if(e?.type==="Identifier"&&e.name)return{root:e,segments:[e.name]};if(!e||!(e.type==="MemberExpression"||!!(e.object&&e.property))||e.computed===!0)return;let n=de(e.object),i=U(e.property);if(!(!n||!i))return{root:n.root,segments:[...n.segments,i]}}function Ge(e){return U(e.callee?.property)}function pe(e,t){return e?.properties?.find(n=>U(n.key)===t)}function _(e,t){return pe(e,t)!==void 0}function Ke(e){let t=pe(e,"metadata")?.value;return _(t,"source")}function fe(e){return Ge(e)==="publish"}var ge={meta:{type:"problem",docs:{description:"Disallow imports that violate ark.config.json layer rules (same contract as arkgate-check)."},messages:{forbiddenImport:"Architecture: {{fromLayer}} must not import {{toLayer}} (ark.config.json). Specifier: {{specifier}}",forbiddenImportHeuristic:"Domain code must not import infrastructure, adapters, repositories, or database modules."},schema:[]},create(e){let t=C(e),n=P(t),i=n?j(n):null,r=n?p.default.dirname(n):null,a=l=>{let c=v(l.source);if(c&&i&&r&&t){let f=p.default.isAbsolute(t)?t:p.default.resolve(t),g=p.default.relative(r,f).split(p.default.sep).join("/"),d=A(g,i.layers);if(!d)return;let o=ce(f,c);if(!o)return;let s=p.default.relative(r,o).split(p.default.sep).join("/");if(s.startsWith(".."))return;let u=A(s,i.layers);if(!u)return;M(i.rules,d,u,{fromPath:g,toPath:s,layers:i.layers})&&w(e,l,"forbiddenImport",{ruleId:"LAYER_IMPORT_VIOLATION",file:g,fromLayer:d,toLayer:u,target:s,...l.importKind==="type"?{typeOnly:!0}:{},message:`${d} must not import ${u}.`},{fromLayer:d,toLayer:u,specifier:c});return}};return{ImportDeclaration:a,ExportNamedDeclaration:a,ExportAllDeclaration:a}}},me={meta:{type:"problem",docs:{description:"Require event bus publish calls to use registered intent creators instead of raw event objects or intent strings."},messages:{rawPublish:"Publish through a registered intent creator; raw event objects or intent strings bypass Ark contracts."},schema:[]},create(e){return{CallExpression(t){let n=t.arguments?.[0],i=v(n),r=B({publishCall:fe(t),rawIntentName:i,objectHasIntent:_(n,"intent"),arkPublishCandidate:!1,hasSource:!0});if(r.some(a=>a.ruleId==="RAW_EVENT_PUBLISH")){let a=r.find(l=>l.ruleId==="RAW_EVENT_PUBLISH");w(e,t,"rawPublish",{...a,file:C(e)})}}}}},ye={meta:{type:"problem",docs:{description:"Require event bus publish calls to include source metadata."},messages:{missingSource:"Strict Ark publish calls must include metadata.source."},schema:[]},create(e){return{CallExpression(t){let n=t.arguments?.[0],i=t.arguments?.[2],a=B({publishCall:fe(t),rawIntentName:v(n),objectHasIntent:_(n,"intent"),arkPublishCandidate:!0,hasSource:Ke(n)||_(i,"source")}).find(l=>l.ruleId==="PUBLISH_MISSING_SOURCE");a&&w(e,t,"missingSource",{...a,file:C(e)})}}}},be={meta:{type:"problem",docs:{description:"Disallow ambient globals from the layer\u2019s forbiddenGlobals in ark.config.json (same purity surface as ark-check). Option `globals` is a standalone fallback when no project config applies."},messages:{forbiddenGlobal:'Ambient global "{{name}}" is forbidden in {{layer}} (ark.config.json); inject the capability through a port instead.',forbiddenGlobalDefault:'Ambient global "{{name}}" is forbidden here; inject the capability through a port instead.',forbiddenModule:'{{layer}} must not use module "{{specifier}}" because it is the import form of forbidden global "{{name}}".'},schema:[{type:"object",properties:{globals:{type:"array",items:{type:"string"}}},additionalProperties:!1}]},create(e){let t=C(e),n=e.options?.[0],i=P(t),r=i?j(i):null,a=i?p.default.dirname(i):null,l=null,c="this layer";if(r&&a&&t){let o=p.default.isAbsolute(t)?t:p.default.resolve(t),s=p.default.relative(a,o).split(p.default.sep).join("/"),u=r.layers?.find(m=>m.name===A(s,r.layers));u?.forbiddenGlobals?.length?(l=new Set(u.forbiddenGlobals),c=u.name):l=null}else n?.globals&&(l=new Set(n.globals));if(!l)return{};let f=typeof q(e)?.getScope=="function",g=(o,s)=>{let u=p.default.isAbsolute(t)?t:p.default.resolve(t),m=a?p.default.relative(a,u).split(p.default.sep).join("/"):t;w(e,o,r?"forbiddenGlobal":"forbiddenGlobalDefault",{ruleId:"FORBIDDEN_GLOBAL",file:m,fromLayer:c,target:s,message:`${c} must not use the ambient global "${s}".`},{name:s,layer:c})},d=(o,s,u,m)=>{if(u||typeof s!="string")return;let y=V(s,l);if(!y)return;let R=p.default.isAbsolute(t)?t:p.default.resolve(t),x=a?p.default.relative(a,R).split(p.default.sep).join("/"):t;w(e,o,"forbiddenModule",{ruleId:"FORBIDDEN_GLOBAL",file:x,fromLayer:c,target:s,message:`${c} must not use module "${s}" because it is the import form of forbidden global "${y}".`},{layer:c,name:y,specifier:s,importKind:m})};return{MemberExpression(o){if(o.parent?.type==="MemberExpression"&&o.parent.object===o)return;let s=de(o);if(!s||O(e,s.root,s.segments[0]))return;let u=s.segments[0]==="globalThis",m=u?s.segments.slice(1):s.segments,y;for(let R=m.length;R>=(u?1:2);R-=1){let x=m.slice(0,R).join(".");if(l.has(x)){y=x;break}}y?g(o,y):!f&&l.has(s.segments[0])&&g(o,s.segments[0])},CallExpression(o){let s=o;if(s.callee?.type==="Identifier"&&s.callee.name==="require"&&s.arguments?.[0]?.type==="Literal"&&!O(e,o,"require")&&d(o,s.arguments[0].value,!1,"require"),f)return;let u=s.callee?.type==="Identifier"?s.callee.name:void 0;u&&l.has(u)&&g(o,u)},ImportDeclaration(o){let s=o,u=(s.specifiers??[]).filter(y=>y.type==="ImportSpecifier"),m=u.length>0&&u.length===(s.specifiers??[]).length&&u.every(y=>y.importKind==="type");d(o,s.source?.value,s.importKind==="type"||m,"import")},ImportExpression(o){let s=o;s.source?.type==="Literal"&&d(o,s.source.value,!1,"dynamic-import")},TSImportEqualsDeclaration(o){let s=o;d(o,s.moduleReference?.expression?.value,s.importKind==="type"||s.isTypeOnly===!0,"require")},ExportNamedDeclaration(o){let s=o;if(!s.source)return;let u=s.specifiers??[],m=u.length>0&&u.every(y=>y.exportKind==="type");d(o,s.source.value,s.exportKind==="type"||m,"export")},ExportAllDeclaration(o){let s=o;d(o,s.source?.value,s.exportKind==="type","export")},NewExpression(o){if(f)return;let s=o.callee?.type==="Identifier"?o.callee.name:void 0;s&&l.has(s)&&g(o,s)},Identifier(o){!f||!o.name||!l.has(o.name)||!Ve(e,o)||O(e,o,o.name)||g(o,o.name)}}}},he={meta:{type:"problem",docs:{description:"Disallow importing modules whose effect capability the layer denies (ark.config.json capabilities.deny / pure \u2014 same wall surface as ark-check). Import dimension only: ambient globals stay with no-forbidden-globals and the CLI/hook symbol path."},messages:{deniedCapability:'{{layer}} denies the {{capability}} capability (ark.config.json); "{{specifier}}" imports it. Define a port and bind the implementation in an adapter layer.'},schema:[]},create(e){let t=C(e),n=P(t),i=n?j(n):null,r=n?p.default.dirname(n):null;if(!i||!r||!t)return{};let a=p.default.isAbsolute(t)?t:p.default.resolve(t),l=p.default.relative(r,a).split(p.default.sep).join("/"),c=i.layers?.find(d=>d.name===A(l,i.layers));if(!c)return{};let f=new Set(ee(c));if(f.size===0)return{};let g=(d,o,s)=>{if(s||typeof o!="string"||V(o,c.forbiddenGlobals??[]))return;let u=Q(o);!u||!f.has(u)||w(e,d,"deniedCapability",{ruleId:"CAPABILITY_VIOLATION",file:l,fromLayer:c.name,target:o,capability:u,message:`${c.name} denies the ${u} capability; found import of "${o}".`},{layer:c.name,capability:u,specifier:o})};return{ImportDeclaration(d){let o=d,s=(o.specifiers??[]).filter(m=>m.type==="ImportSpecifier"),u=s.length>0&&s.length===(o.specifiers??[]).length&&s.every(m=>m.importKind==="type");g(d,o.source?.value,o.importKind==="type"||u)},ImportExpression(d){let o=d;o.source?.type==="Literal"&&g(d,o.source.value,!1)},TSImportEqualsDeclaration(d){let o=d;g(d,o.moduleReference?.expression?.value,o.importKind==="type"||o.isTypeOnly===!0)},ExportNamedDeclaration(d){let o=d;if(!o.source)return;let s=o.specifiers??[],u=s.length>0&&s.every(m=>m.exportKind==="type");g(d,o.source.value,o.exportKind==="type"||u)},ExportAllDeclaration(d){let o=d;g(d,o.source?.value,o.exportKind==="type")},CallExpression(d){let o=d;o.callee?.type==="Identifier"&&o.callee.name==="require"&&o.arguments?.[0]?.type==="Literal"&&!O(e,d,"require")&&g(d,o.arguments[0].value,!1)}}}},Be={"no-domain-infra-imports":ge,"no-raw-event-publish":me,"require-publish-source":ye,"no-forbidden-globals":be,"no-denied-capabilities":he},$={rules:Be};$.configs={recommended:{plugins:{ark:$},rules:{"ark/no-domain-infra-imports":"error","ark/no-raw-event-publish":"error","ark/require-publish-source":"error","ark/no-forbidden-globals":"error","ark/no-denied-capabilities":"error"}}};var He=$;0&&(module.exports={findConfigPath,globToRegExp,isEdgeDenied,layerForRelativePath,loadArkConfig,noDeniedCapabilities,noDomainInfraImports,noForbiddenGlobals,noRawEventPublish,patternSpecificity,plugin,requirePublishSource,resolveRelativeImport});
1
+ "use strict";var Se=Object.create;var N=Object.defineProperty;var xe=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var we=Object.getPrototypeOf,Ee=Object.prototype.hasOwnProperty;var Ce=(e,t)=>{for(var n in t)N(e,n,{get:t[n],enumerable:!0})},Y=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Re(t))!Ee.call(e,r)&&r!==n&&N(e,r,{get:()=>t[r],enumerable:!(s=xe(t,r))||s.enumerable});return e};var z=(e,t,n)=>(n=e!=null?Se(we(e)):{},Y(t||!e||!e.__esModule?N(n,"default",{value:e,enumerable:!0}):n,e)),Ne=e=>Y(N({},"__esModule",{value:!0}),e);var Xe={};Ce(Xe,{default:()=>Ze,findConfigPath:()=>P,globToRegExp:()=>w,isEdgeDenied:()=>M,layerForRelativePath:()=>A,loadArkConfig:()=>$,noDeniedCapabilities:()=>ke,noDomainInfraImports:()=>be,noForbiddenGlobals:()=>Ie,noRawEventPublish:()=>he,patternSpecificity:()=>D,plugin:()=>_,requirePublishSource:()=>Ae,resolveRelativeImport:()=>ue});module.exports=Ne(Xe);var S=z(require("fs"),1),d=z(require("path"),1);var J=new Map;function Z(e){return/[.*+?^${}()|[\]\\]/.test(e)?`\\${e}`:e}function j(e){let t="";for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="\\"&&n+1<e.length){let r=e[n+1];if("*?{}[],".includes(r)||r==="\\"){t+="\\"+r,n+=1;continue}t+="/";continue}t+=s}return t}function Le(e){let t=0;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="\\"){n+=1;continue}if(s==="{")t+=1;else if(s==="}"&&(t-=1,t<0))return!1}return t===0}function w(e){let t=J.get(e);if(t)return t;let n=j(e),s=Le(n),r="",a=0;for(let c=0;c<n.length;c+=1){let g=n[c];g==="\\"&&c+1<n.length?(r+=Z(n[c+1]),c+=1):g==="*"?n[c+1]==="*"?n[c+2]==="/"?(r+="(?:.*/)?",c+=2):(r+=".*",c+=1):r+="[^/]*":g==="?"?r+="[^/]":g==="{"&&s?(r+="(?:",a+=1):g==="}"&&s&&a>0?(r+=")",a-=1):g===","&&s&&a>0?r+="|":r+=Z(g)}let l=new RegExp(`^${r}$`);return J.set(e,l),l}function D(e){let t=j(String(e)),s=t.split("*")[0].split("/").filter(Boolean).length,r=t.replace(/\*/g,"").length;return s*1e4+r}function A(e,t){let n=String(e).split(/[/\\]/).join("/"),s,r=-1;for(let a of t??[])if(!(a.exclude??[]).some(l=>w(l).test(n))){for(let l of a.patterns??[])if(w(l).test(n)){let c=D(l);c>r&&(r=c,s=a.name)}}return s}function X(e,t){if(!t?.length)return;let n=String(e).split(/[/\\]/).filter(Boolean),s=new Set(t.map(r=>String(r).toLowerCase()));for(let r=0;r<n.length-1;r+=1)if(s.has(n[r].toLowerCase()))return`${n[r].toLowerCase()}/${n[r+1].toLowerCase()}`}function Oe(e){let t=new Set;for(let n of e??[]){let r=j(String(n)).split("/").filter(Boolean);for(let a=0;a<r.length;a+=1){let l=r[a];if((l==="**"||l==="*")&&a>0){let c=r[a-1];c&&!c.includes("*")&&!c.includes("{")&&!c.includes("}")&&t.add(c)}}}return[...t]}function ve(e,t,n){if(Array.isArray(e.sliceFolders)&&e.sliceFolders.length>0)return e.sliceFolders.filter(r=>typeof r=="string"&&r.length>0);let s=(n??[]).find(r=>r.name===t);return Oe(s?.patterns)}function _e(e,t,n,s){for(let r of e??[])if(!(r.from!==t||r.to!==n)&&r.allowed===!1){if(r.peerIsolation){let a=s?.fromPath,l=s?.toPath;if(!a||!l)continue;let c=ve(r,t,s?.layers);if(c.length===0)continue;let g=X(a,c),m=X(l,c);if(!g||!m)continue;if(g!==m)return r;continue}if(t!==n)return r}}function M(e,t,n,s){return _e(e,t,n,s)!==void 0}var Pe=["**/*.gen.ts","**/*.gen.tsx","**/*.generated.ts","**/*.generated.tsx"];function $e(e){let t=Array.isArray(e?.exclude)?e.exclude.filter(s=>typeof s=="string"):[];return[...e?.excludeGenerated===!1?[]:Pe,...t]}function Q(e,t){let n=String(e).split(/[/\\]/).join("/");return $e(t).some(s=>w(s).test(n))}var ee=Object.freeze(["network","filesystem","clock","randomness","environment","process","persistence"]),Te=Object.freeze({fetch:"network",XMLHttpRequest:"network",Date:"clock","Date.now":"clock","Math.random":"randomness","process.env":"environment",process:"process"}),tt=Object.freeze(Object.keys(Te).sort()),F=Object.freeze({fs:"filesystem","node:fs":"filesystem","fs/promises":"filesystem","node:fs/promises":"filesystem","fs-extra":"filesystem","graceful-fs":"filesystem",memfs:"filesystem",chokidar:"filesystem",http:"network",https:"network",http2:"network",net:"network",tls:"network",dgram:"network",dns:"network","node:http":"network","node:https":"network","node:http2":"network","node:net":"network","node:tls":"network","node:dgram":"network","node:dns":"network",axios:"network",undici:"network","node-fetch":"network",got:"network",ky:"network",superagent:"network",ws:"network",process:"process","node:process":"process",child_process:"process","node:child_process":"process","@prisma/client":"persistence",prisma:"persistence",pg:"persistence",mysql:"persistence",mysql2:"persistence",mongodb:"persistence",mongoose:"persistence",sqlite3:"persistence","better-sqlite3":"persistence",redis:"persistence",ioredis:"persistence",typeorm:"persistence",knex:"persistence","drizzle-orm":"persistence",sequelize:"persistence",kysely:"persistence","@supabase/supabase-js":"persistence"}),je=Object.freeze({process:Object.freeze(["process","node:process"])});function te(e){if(!e||e.startsWith(".")||e.startsWith("/"))return null;let t=F[e];if(t)return t;let n=e.indexOf("/");if(n<0)return null;let s=e.slice(0,n),r=F[s];if(r)return r;let a=e.indexOf("/",n+1);return a<0?null:F[e.slice(0,a)]??null}function V(e,t){for(let n of t)if(je[n]?.includes(e))return n;return null}function ne(e){if(e?.pure===!0)return[...ee].sort();let n=(e?.capabilities?.deny??[]).filter(s=>ee.includes(s));return[...new Set(n)].sort()}var K="https://unpkg.com/arkgate@2/schemas/ark.config.schema.json",re=["DomainModel","ApplicationOrchestration","PersistenceAdapters","IntegrationAdapters","WorkflowSagaEngine","BackgroundJobsScheduling","PresentationAdapters","ReportingReadModels","ExtensibilityMetadata","SecurityAuditObservability","Kernel"],De=new Set(["PresentationAdapters->ApplicationOrchestration","ApplicationOrchestration->DomainModel","WorkflowSagaEngine->ApplicationOrchestration","WorkflowSagaEngine->DomainModel","BackgroundJobsScheduling->ApplicationOrchestration"]);function Me(){let e=[];for(let t of re)for(let n of re)t===n||De.has(`${t}->${n}`)||e.push({from:t,to:n,allowed:!1});return e}var ie=Me();var h={type:"array",items:{type:"string",minLength:1},uniqueItems:!0},se={$schema:"https://json-schema.org/draft/2020-12/schema",$id:K,title:"ArkGate architecture contract",description:"Versioned contract consumed identically by ArkGate CLI, MCP, and ESLint surfaces.",type:"object",additionalProperties:!1,required:["$schema","schemaVersion","include","layers","rules"],properties:{$schema:{type:"string",minLength:1,default:K,description:"Editor-facing URL or local path for this JSON Schema."},schemaVersion:{type:"string",const:"1.0",default:"1.0"},name:{type:"string",minLength:1},include:{...h,minItems:1,default:["src"]},exclude:{...h,default:[]},excludeGenerated:{type:"boolean",default:!0},frameworkOverlay:{type:"string",minLength:1},layers:{type:"array",default:[],items:{$ref:"#/$defs/layer"}},rules:{type:"array",default:ie,items:{$ref:"#/$defs/rule"}},cyclePolicy:{type:"string",enum:["strict","soft","framework-soft","off"],default:"strict"},dynamicImportAllowlist:{...h,default:[]},safety:{$ref:"#/$defs/safety",default:{maxTsSuppressions:0,maxAnyCasts:0,allowInMemory:!1,allowDisabledPeerIsolation:!1}}},$defs:{layer:{type:"object",additionalProperties:!1,required:["name","patterns"],properties:{name:{type:"string",minLength:1},patterns:{...h,minItems:1},exclude:h,intentPrefixes:h,description:{type:"string",minLength:1},forbiddenGlobals:h,capabilities:{type:"object",additionalProperties:!1,properties:{deny:{type:"array",uniqueItems:!0,items:{type:"string",enum:["network","filesystem","clock","randomness","environment","process","persistence"]}}}},pure:{type:"boolean"},mayImportInfrastructure:{type:"boolean"},optional:{type:"boolean"}}},rule:{type:"object",additionalProperties:!1,required:["from","to","allowed"],properties:{from:{type:"string",minLength:1},to:{type:"string",minLength:1},allowed:{type:"boolean"},message:{type:"string",minLength:1},peerIsolation:{type:"boolean"},sliceFolders:{...h,minItems:1}}},safety:{type:"object",additionalProperties:!1,properties:{maxTsSuppressions:{type:"integer",minimum:0,default:0},maxAnyCasts:{type:"integer",minimum:0,default:0},allowInMemory:{type:"boolean",default:!1},allowDisabledPeerIsolation:{type:"boolean",default:!1}}}}},k=class extends Error{issues;source;constructor(t,n){super(`Invalid ArkGate config (${t}):
2
+ ${n.map(s=>`- ${s.path}: ${s.message}`).join(`
3
+ `)}`),this.name="ArkConfigValidationError",this.source=t,this.issues=n}};function oe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function H(e,t){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(t)?`${e}.${t}`:`${e}[${JSON.stringify(t)}]`}function I(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function Fe(e,t){let n="#/$defs/";if(e.startsWith(n))return t.$defs[e.slice(n.length)]}function L(e,t,n,s,r){if(t.$ref){let a=Fe(t.$ref,s);if(!a){r.push({path:n,message:`schema reference ${t.$ref} cannot be resolved`});return}L(e,a,n,s,r);return}if(t.const!==void 0&&!Object.is(e,t.const)){r.push({path:n,message:`must equal ${JSON.stringify(t.const)}`});return}if(t.enum&&!t.enum.some(a=>Object.is(a,e))){r.push({path:n,message:`must be one of ${t.enum.map(String).join(", ")}`});return}if(t.type==="object"){if(!oe(e)){r.push({path:n,message:`must be an object; received ${I(e)}`});return}let a=t.properties??{};for(let l of t.required??[])e[l]===void 0&&r.push({path:H(n,l),message:"is required"});if(t.additionalProperties===!1)for(let l of Object.keys(e))l in a||r.push({path:H(n,l),message:"unknown field"});for(let[l,c]of Object.entries(a))e[l]!==void 0&&L(e[l],c,H(n,l),s,r);return}if(t.type==="array"){if(!Array.isArray(e)){r.push({path:n,message:`must be an array; received ${I(e)}`});return}if(t.minItems!==void 0&&e.length<t.minItems&&r.push({path:n,message:`must contain at least ${t.minItems} item(s)`}),t.uniqueItems){let a=e.map(l=>JSON.stringify(l));new Set(a).size!==a.length&&r.push({path:n,message:"must not contain duplicate items"})}t.items&&e.forEach((a,l)=>L(a,t.items,`${n}[${l}]`,s,r));return}if(t.type==="string"){if(typeof e!="string"){r.push({path:n,message:`must be a string; received ${I(e)}`});return}t.minLength!==void 0&&e.length<t.minLength&&r.push({path:n,message:`must contain at least ${t.minLength} character(s)`});return}if(t.type==="boolean"){typeof e!="boolean"&&r.push({path:n,message:`must be a boolean; received ${I(e)}`});return}if(t.type==="integer"){if(!Number.isInteger(e)){r.push({path:n,message:`must be an integer; received ${I(e)}`});return}t.minimum!==void 0&&e<t.minimum&&r.push({path:n,message:`must be at least ${t.minimum}`})}}function Ve(e){return{...e,$schema:e.$schema===void 0?K:e.$schema,schemaVersion:e.schemaVersion===void 0?"1.0":e.schemaVersion,include:e.include===void 0?["src"]:e.include,layers:e.layers===void 0?[]:e.layers,rules:e.rules===void 0?ie.map(t=>({...t})):e.rules}}function He(e,t="ark.config.json"){if(!oe(e))throw new k(t,[{path:"$",message:`must be an object; received ${I(e)}`}]);let n=e.schemaVersion===void 0?"unversioned":null;if(e.schemaVersion!==void 0&&e.schemaVersion!=="1.0")throw new k(t,[{path:"$.schemaVersion",message:`unsupported version ${JSON.stringify(e.schemaVersion)}; expected 1.0`}]);return{candidate:Ve(e),migratedFrom:n}}function Ke(e,t="ark.config.json"){let{candidate:n,migratedFrom:s}=He(e,t),r=[];if(L(n,se,"$",se,r),r.length>0)throw new k(t,r);return{config:n,migratedFrom:s}}function ae(e,t="ark.config.json"){let n;try{n=JSON.parse(e)}catch(s){throw new k(t,[{path:"$",message:`invalid JSON: ${s instanceof Error?s.message:String(s)}`}])}return Ke(n,t)}function y(e){return typeof e=="string"&&e.length>0?e:void 0}function le(e,t){return Number.isInteger(e)&&Number(e)>0?Number(e):t}function Be(e,t,n){return e==="LAYER_IMPORT_VIOLATION"?t.typeOnly||n.targetTypeOnlyExports===!0||n.namedBindingsTypeOnly===!0?"Move the referenced type to a mutually allowed layer, use `import type`, then preflight again.":n.peerIsolation===!0?"Extract the shared dependency to a shared layer, then preflight again.":`Define a port in ${t.fromLayer??"the source layer"}, inject the ${t.toLayer??"outer-layer"} implementation, then preflight again.`:e==="FORBIDDEN_GLOBAL"?`Inject ${t.target??"the capability"} through a port, then preflight again.`:e==="CAPABILITY_VIOLATION"?`Define a ${y(n.capability)??"capability"} port in ${t.fromLayer??"the walled layer"}, bind the implementation outside it, then preflight again.`:e==="CIRCULAR_DEPENDENCY"?"Extract the shared dependency into a third module, then preflight again.":e==="RAW_EVENT_PUBLISH"?"Publish through a registered intent creator, then run Ark again.":e==="PUBLISH_MISSING_SOURCE"?"Add metadata.source to the publish call, then run Ark again.":`Resolve ${e} without weakening ark.config.json, then run Ark again.`}function ce(e,t="error"){let n=y(e.ruleId)??y(e.code)??"ARK_UNKNOWN",s=e.severity==="warning"?"warning":t,r={...y(e.target)?{target:y(e.target)}:{},...y(e.fromLayer)?{fromLayer:y(e.fromLayer)}:{},...y(e.toLayer)?{toLayer:y(e.toLayer)}:{},...typeof e.typeOnly=="boolean"?{typeOnly:e.typeOnly}:{},...typeof e.targetTypeOnlyExports=="boolean"?{targetTypeOnlyExports:e.targetTypeOnlyExports}:{},...typeof e.sourcePureTypeModule=="boolean"?{sourcePureTypeModule:e.sourcePureTypeModule}:{},...typeof e.namedBindingsTypeOnly=="boolean"?{namedBindingsTypeOnly:e.namedBindingsTypeOnly}:{},...typeof e.portProofEligible=="boolean"?{portProofEligible:e.portProofEligible}:{},...typeof e.peerIsolation=="boolean"?{peerIsolation:e.peerIsolation}:{},...y(e.capability)?{capability:y(e.capability)}:{},...y(e.edgeKind)?{edgeKind:y(e.edgeKind)}:{}};return{ruleId:n,severity:s,message:y(e.message)??n,location:{file:y(e.file)??"<unknown>",line:le(e.line,1),column:le(e.column,1)},evidence:r,nextAction:y(e.nextAction)??Be(n,r,e)}}var pe={RAW_EVENT_PUBLISH:"Publish through a registered intent creator; raw event objects or intent strings bypass Ark contracts and tooling.",PUBLISH_MISSING_SOURCE:"Strict Ark publish calls must include metadata.source."},it=Object.freeze([{layer:"DomainModel",prefixes:["Domain."]},{layer:"ApplicationOrchestration",prefixes:["Application."]},{layer:"PersistenceAdapters",prefixes:["Adapter.Persistence.","Adapter.Repository."]},{layer:"IntegrationAdapters",prefixes:["Adapter.Integration.","Adapter.External."]},{layer:"WorkflowSagaEngine",prefixes:["Workflow."]},{layer:"BackgroundJobsScheduling",prefixes:["Job."]},{layer:"PresentationAdapters",prefixes:["Presentation.","Adapter.Presentation.","Adapter.Api."]},{layer:"ReportingReadModels",prefixes:["Reporting."]},{layer:"ExtensibilityMetadata",prefixes:["Metadata."]},{layer:"SecurityAuditObservability",prefixes:["Security.","Audit.","Observability."]},{layer:"Kernel",prefixes:["Kernel."]}]);function Ge(e){return/^(Domain|Application|Adapter|Workflow|Job|Presentation|Reporting|Metadata|Security|Audit|Observability|Kernel)\.[A-Za-z0-9_.]+$/.test(e)}function B(e){if(!e.publishCall)return[];let t=[];return(e.rawIntentName!==void 0&&Ge(e.rawIntentName)||e.objectHasIntent)&&t.push({ruleId:"RAW_EVENT_PUBLISH",message:pe.RAW_EVENT_PUBLISH}),e.arkPublishCandidate&&!e.hasSource&&t.push({ruleId:"PUBLISH_MISSING_SOURCE",message:pe.PUBLISH_MISSING_SOURCE}),t}function E(e){if(typeof e.physicalFilename=="string"&&e.physicalFilename.length>0)return e.physicalFilename;if(typeof e.filename=="string"&&e.filename.length>0)return e.filename;if(typeof e.getFilename=="function")try{let t=e.getFilename();if(typeof t=="string"&&t.length>0)return t}catch{}return""}function x(e,t,n,s,r){let a=ce({...s,line:s.line??t.loc?.start?.line,column:s.column??(typeof t.loc?.start?.column=="number"?t.loc.start.column+1:void 0)});return e.report({node:t,messageId:n,...r?{data:r}:{},diagnostic:a}),a}function P(e){if(!e||e==="<input>"||e.startsWith("stdin"))return null;let t=d.default.dirname(d.default.resolve(e));for(;;){let n=d.default.join(t,"ark.config.json");if(S.default.existsSync(n))return n;let s=d.default.dirname(t);if(s===t)return null;t=s}}var de=new Map;function $(e){if(!S.default.existsSync(e))return null;let t=S.default.readFileSync(e,"utf8"),n=de.get(e);if(n?.source===t)return n.config;let s=ae(t,e).config;return de.set(e,{source:t,config:s}),s}function q(e,t){return(e.include??[]).some(s=>{let r=String(s).replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/$/,"");return r==="."||t===r||t.startsWith(`${r}/`)})&&!Q(t,e)}function ue(e,t){if(!t.startsWith("."))return null;let n=d.default.resolve(d.default.dirname(e),t),s=[n,`${n}.ts`,`${n}.tsx`,`${n}.mts`,`${n}.cts`,`${n}.js`,`${n}.jsx`,d.default.join(n,"index.ts"),d.default.join(n,"index.tsx"),d.default.join(n,"index.js")];for(let r of s)try{if(S.default.existsSync(r)&&S.default.statSync(r).isFile())return r}catch{}return null}function T(e){return typeof e?.value=="string"?e.value:void 0}function U(e){return e?.name??T(e)}function W(e){return e.sourceCode??e.getSourceCode?.()}function fe(e,t){let n=W(e)?.getScope?.(t);for(;n;){let s=n.references?.find(r=>r.identifier===t);if(s)return s;n=n.upper??void 0}}function O(e,t,n){let s=fe(e,t);if(s?.resolved)return(s.resolved.defs?.length??0)>0;let r=W(e)?.getScope?.(t);for(;r;){let a=r.set?.get(n);if(a)return(a.defs?.length??0)>0;r=r.upper??void 0}return!1}function qe(e,t){let n=fe(e,t);return n?n.isValueReference!==!1:t.parent?.type==="VariableDeclarator"&&t.parent.init===t}function ge(e){if(e?.type==="Identifier"&&e.name)return{root:e,segments:[e.name]};if(!e||!(e.type==="MemberExpression"||!!(e.object&&e.property))||e.computed===!0)return;let n=ge(e.object),s=U(e.property);if(!(!n||!s))return{root:n.root,segments:[...n.segments,s]}}function Ue(e){return U(e.callee?.property)}function me(e,t){return e?.properties?.find(n=>U(n.key)===t)}function v(e,t){return me(e,t)!==void 0}function We(e){let t=me(e,"metadata")?.value;return v(t,"source")}function ye(e){return Ue(e)==="publish"}function G(e){if(e.importKind==="type"||e.exportKind==="type")return!0;let t=e.specifiers??[];return t.length===0?!1:t.every(n=>n.type==="ImportSpecifier")?t.every(n=>n.importKind==="type"):t.every(n=>n.exportKind==="type")}function Ye(e){let t=e;for(;t?.parent;)t=t.parent;return t?.type==="Program"?t:void 0}function ze(e){let t=Ye(e)?.body;if(!t)return!1;let n=!1;for(let s of t){if(s.type==="ImportDeclaration"){if(!G(s))return!1;continue}if(!(s.type==="TSInterfaceDeclaration"||s.type==="TSTypeAliasDeclaration")){if(s.type==="ExportNamedDeclaration"){if(s.declaration){if(s.declaration.type!=="TSInterfaceDeclaration"&&s.declaration.type!=="TSTypeAliasDeclaration")return!1}else if(!G(s))return!1;n=!0;continue}return!1}}return n}var be={meta:{type:"problem",docs:{description:"Disallow imports that violate ark.config.json layer rules (same contract as arkgate-check)."},messages:{forbiddenImport:"Architecture: {{fromLayer}} must not import {{toLayer}} (ark.config.json). Specifier: {{specifier}}",forbiddenImportHeuristic:"Domain code must not import infrastructure, adapters, repositories, or database modules."},schema:[]},create(e){let t=E(e),n=P(t),s=n?$(n):null,r=n?d.default.dirname(n):null,a=l=>{let c=T(l.source);if(c&&s&&r&&t){let g=d.default.isAbsolute(t)?t:d.default.resolve(t),m=d.default.relative(r,g).split(d.default.sep).join("/");if(!q(s,m))return;let p=A(m,s.layers);if(!p)return;let i=ue(g,c);if(!i)return;let o=d.default.relative(r,i).split(d.default.sep).join("/");if(o.startsWith(".."))return;let u=A(o,s.layers);if(!u)return;if(M(s.rules,p,u,{fromPath:m,toPath:o,layers:s.layers})){let f=l.type?.startsWith("Export")?"export":"import";x(e,l,"forbiddenImport",{ruleId:"LAYER_IMPORT_VIOLATION",file:m,fromLayer:p,toLayer:u,target:o,edgeKind:f,...G(l)?{typeOnly:!0}:{},...ze(l)?{sourcePureTypeModule:!0}:{},message:`${p} must not ${f} ${u}.`},{fromLayer:p,toLayer:u,specifier:c})}return}};return{ImportDeclaration:a,ExportNamedDeclaration:a,ExportAllDeclaration:a}}},he={meta:{type:"problem",docs:{description:"Require event bus publish calls to use registered intent creators instead of raw event objects or intent strings."},messages:{rawPublish:"Publish through a registered intent creator; raw event objects or intent strings bypass Ark contracts."},schema:[]},create(e){return{CallExpression(t){let n=t.arguments?.[0],s=T(n),r=B({publishCall:ye(t),rawIntentName:s,objectHasIntent:v(n,"intent"),arkPublishCandidate:!1,hasSource:!0});if(r.some(a=>a.ruleId==="RAW_EVENT_PUBLISH")){let a=r.find(l=>l.ruleId==="RAW_EVENT_PUBLISH");x(e,t,"rawPublish",{...a,file:E(e)})}}}}},Ae={meta:{type:"problem",docs:{description:"Require event bus publish calls to include source metadata."},messages:{missingSource:"Strict Ark publish calls must include metadata.source."},schema:[]},create(e){return{CallExpression(t){let n=t.arguments?.[0],s=t.arguments?.[2],a=B({publishCall:ye(t),rawIntentName:T(n),objectHasIntent:v(n,"intent"),arkPublishCandidate:!0,hasSource:We(n)||v(s,"source")}).find(l=>l.ruleId==="PUBLISH_MISSING_SOURCE");a&&x(e,t,"missingSource",{...a,file:E(e)})}}}},Ie={meta:{type:"problem",docs:{description:"Disallow ambient globals from the layer\u2019s forbiddenGlobals in ark.config.json (same purity surface as ark-check). Option `globals` is a standalone fallback when no project config applies."},messages:{forbiddenGlobal:'Ambient global "{{name}}" is forbidden in {{layer}} (ark.config.json); inject the capability through a port instead.',forbiddenGlobalDefault:'Ambient global "{{name}}" is forbidden here; inject the capability through a port instead.',forbiddenModule:'{{layer}} must not use module "{{specifier}}" because it is the import form of forbidden global "{{name}}".'},schema:[{type:"object",properties:{globals:{type:"array",items:{type:"string"}}},additionalProperties:!1}]},create(e){let t=E(e),n=e.options?.[0],s=P(t),r=s?$(s):null,a=s?d.default.dirname(s):null,l=null,c="this layer";if(r&&a&&t){let i=d.default.isAbsolute(t)?t:d.default.resolve(t),o=d.default.relative(a,i).split(d.default.sep).join("/");if(!q(r,o))return{};let u=r.layers?.find(f=>f.name===A(o,r.layers));u?.forbiddenGlobals?.length?(l=new Set(u.forbiddenGlobals),c=u.name):l=null}else n?.globals&&(l=new Set(n.globals));if(!l)return{};let g=typeof W(e)?.getScope=="function",m=(i,o)=>{let u=d.default.isAbsolute(t)?t:d.default.resolve(t),f=a?d.default.relative(a,u).split(d.default.sep).join("/"):t;x(e,i,r?"forbiddenGlobal":"forbiddenGlobalDefault",{ruleId:"FORBIDDEN_GLOBAL",file:f,fromLayer:c,target:o,message:`${c} must not use the ambient global "${o}".`},{name:o,layer:c})},p=(i,o,u,f)=>{if(u||typeof o!="string")return;let b=V(o,l);if(!b)return;let R=d.default.isAbsolute(t)?t:d.default.resolve(t),C=a?d.default.relative(a,R).split(d.default.sep).join("/"):t;x(e,i,"forbiddenModule",{ruleId:"FORBIDDEN_GLOBAL",file:C,fromLayer:c,target:o,edgeKind:f,message:`${c} must not use module "${o}" because it is the import form of forbidden global "${b}".`},{layer:c,name:b,specifier:o,importKind:f})};return{MemberExpression(i){if(i.parent?.type==="MemberExpression"&&i.parent.object===i)return;let o=ge(i);if(!o||O(e,o.root,o.segments[0]))return;let u=o.segments[0]==="globalThis",f=u?o.segments.slice(1):o.segments,b;for(let R=f.length;R>=(u?1:2);R-=1){let C=f.slice(0,R).join(".");if(l.has(C)){b=C;break}}b?m(i,b):!g&&l.has(o.segments[0])&&m(i,o.segments[0])},CallExpression(i){let o=i;if(o.callee?.type==="Identifier"&&o.callee.name==="require"&&o.arguments?.[0]?.type==="Literal"&&!O(e,i,"require")&&p(i,o.arguments[0].value,!1,"require"),g)return;let u=o.callee?.type==="Identifier"?o.callee.name:void 0;u&&l.has(u)&&m(i,u)},ImportDeclaration(i){let o=i,u=(o.specifiers??[]).filter(b=>b.type==="ImportSpecifier"),f=u.length>0&&u.length===(o.specifiers??[]).length&&u.every(b=>b.importKind==="type");p(i,o.source?.value,o.importKind==="type"||f,"import")},ImportExpression(i){let o=i;o.source?.type==="Literal"&&p(i,o.source.value,!1,"dynamic-import")},TSImportEqualsDeclaration(i){let o=i;p(i,o.moduleReference?.expression?.value,o.importKind==="type"||o.isTypeOnly===!0,"require")},ExportNamedDeclaration(i){let o=i;if(!o.source)return;let u=o.specifiers??[],f=u.length>0&&u.every(b=>b.exportKind==="type");p(i,o.source.value,o.exportKind==="type"||f,"export")},ExportAllDeclaration(i){let o=i;p(i,o.source?.value,o.exportKind==="type","export")},NewExpression(i){if(g)return;let o=i.callee?.type==="Identifier"?i.callee.name:void 0;o&&l.has(o)&&m(i,o)},Identifier(i){!g||!i.name||!l.has(i.name)||!qe(e,i)||O(e,i,i.name)||m(i,i.name)}}}},ke={meta:{type:"problem",docs:{description:"Disallow importing modules whose effect capability the layer denies (ark.config.json capabilities.deny / pure \u2014 same wall surface as ark-check). Import dimension only: ambient globals stay with no-forbidden-globals and the CLI/hook symbol path."},messages:{deniedCapability:'{{layer}} denies the {{capability}} capability (ark.config.json); "{{specifier}}" imports it. Define a port and bind the implementation in an adapter layer.'},schema:[]},create(e){let t=E(e),n=P(t),s=n?$(n):null,r=n?d.default.dirname(n):null;if(!s||!r||!t)return{};let a=d.default.isAbsolute(t)?t:d.default.resolve(t),l=d.default.relative(r,a).split(d.default.sep).join("/");if(!q(s,l))return{};let c=s.layers?.find(p=>p.name===A(l,s.layers));if(!c)return{};let g=new Set(ne(c));if(g.size===0)return{};let m=(p,i,o,u)=>{if(o||typeof i!="string"||V(i,c.forbiddenGlobals??[]))return;let f=te(i);!f||!g.has(f)||x(e,p,"deniedCapability",{ruleId:"CAPABILITY_VIOLATION",file:l,fromLayer:c.name,target:i,capability:f,edgeKind:u,message:`${c.name} denies the ${f} capability; found import of "${i}".`},{layer:c.name,capability:f,specifier:i})};return{ImportDeclaration(p){let i=p,o=(i.specifiers??[]).filter(f=>f.type==="ImportSpecifier"),u=o.length>0&&o.length===(i.specifiers??[]).length&&o.every(f=>f.importKind==="type");m(p,i.source?.value,i.importKind==="type"||u,"import")},ImportExpression(p){let i=p;i.source?.type==="Literal"&&m(p,i.source.value,!1,"dynamic-import")},TSImportEqualsDeclaration(p){let i=p;m(p,i.moduleReference?.expression?.value,i.importKind==="type"||i.isTypeOnly===!0,"require")},ExportNamedDeclaration(p){let i=p;if(!i.source)return;let o=i.specifiers??[],u=o.length>0&&o.every(f=>f.exportKind==="type");m(p,i.source.value,i.exportKind==="type"||u,"export")},ExportAllDeclaration(p){let i=p;m(p,i.source?.value,i.exportKind==="type","export")},CallExpression(p){let i=p;i.callee?.type==="Identifier"&&i.callee.name==="require"&&i.arguments?.[0]?.type==="Literal"&&!O(e,p,"require")&&m(p,i.arguments[0].value,!1,"require")}}}},Je={"no-domain-infra-imports":be,"no-raw-event-publish":he,"require-publish-source":Ae,"no-forbidden-globals":Ie,"no-denied-capabilities":ke},_={rules:Je};_.configs={recommended:{plugins:{ark:_},rules:{"ark/no-domain-infra-imports":"error","ark/no-raw-event-publish":"error","ark/require-publish-source":"error","ark/no-forbidden-globals":"error","ark/no-denied-capabilities":"error"}}};var Ze=_;0&&(module.exports={findConfigPath,globToRegExp,isEdgeDenied,layerForRelativePath,loadArkConfig,noDeniedCapabilities,noDomainInfraImports,noForbiddenGlobals,noRawEventPublish,patternSpecificity,plugin,requirePublishSource,resolveRelativeImport});
@@ -98,7 +98,10 @@ type AstNode = {
98
98
  key?: AstNode;
99
99
  arguments?: AstNode[];
100
100
  properties?: AstNode[];
101
+ body?: AstNode[];
102
+ declaration?: AstNode;
101
103
  importKind?: string;
104
+ exportKind?: string;
102
105
  specifiers?: AstNode[];
103
106
  parent?: AstNode;
104
107
  init?: AstNode;
@@ -1,3 +1,3 @@
1
- import R from"fs";import p from"path";var H=new Map;function U(e){return/[.*+?^${}()|[\]\\]/.test(e)?`\\${e}`:e}function $(e){let t="";for(let n=0;n<e.length;n+=1){let i=e[n];if(i==="\\"&&n+1<e.length){let r=e[n+1];if("*?{}[],".includes(r)||r==="\\"){t+="\\"+r,n+=1;continue}t+="/";continue}t+=i}return t}function ue(e){let t=0;for(let n=0;n<e.length;n+=1){let i=e[n];if(i==="\\"){n+=1;continue}if(i==="{")t+=1;else if(i==="}"&&(t-=1,t<0))return!1}return t===0}function _(e){let t=H.get(e);if(t)return t;let n=$(e),i=ue(n),r="",a=0;for(let c=0;c<n.length;c+=1){let f=n[c];f==="\\"&&c+1<n.length?(r+=U(n[c+1]),c+=1):f==="*"?n[c+1]==="*"?n[c+2]==="/"?(r+="(?:.*/)?",c+=2):(r+=".*",c+=1):r+="[^/]*":f==="?"?r+="[^/]":f==="{"&&i?(r+="(?:",a+=1):f==="}"&&i&&a>0?(r+=")",a-=1):f===","&&i&&a>0?r+="|":r+=U(f)}let l=new RegExp(`^${r}$`);return H.set(e,l),l}function W(e){let t=$(String(e)),i=t.split("*")[0].split("/").filter(Boolean).length,r=t.replace(/\*/g,"").length;return i*1e4+r}function w(e,t){let n=String(e).split(/[/\\]/).join("/"),i,r=-1;for(let a of t??[])if(!(a.exclude??[]).some(l=>_(l).test(n))){for(let l of a.patterns??[])if(_(l).test(n)){let c=W(l);c>r&&(r=c,i=a.name)}}return i}function q(e,t){if(!t?.length)return;let n=String(e).split(/[/\\]/).filter(Boolean),i=new Set(t.map(r=>String(r).toLowerCase()));for(let r=0;r<n.length-1;r+=1)if(i.has(n[r].toLowerCase()))return`${n[r].toLowerCase()}/${n[r+1].toLowerCase()}`}function de(e){let t=new Set;for(let n of e??[]){let r=$(String(n)).split("/").filter(Boolean);for(let a=0;a<r.length;a+=1){let l=r[a];if((l==="**"||l==="*")&&a>0){let c=r[a-1];c&&!c.includes("*")&&!c.includes("{")&&!c.includes("}")&&t.add(c)}}}return[...t]}function pe(e,t,n){if(Array.isArray(e.sliceFolders)&&e.sliceFolders.length>0)return e.sliceFolders.filter(r=>typeof r=="string"&&r.length>0);let i=(n??[]).find(r=>r.name===t);return de(i?.patterns)}function fe(e,t,n,i){for(let r of e??[])if(!(r.from!==t||r.to!==n)&&r.allowed===!1){if(r.peerIsolation){let a=i?.fromPath,l=i?.toPath;if(!a||!l)continue;let c=pe(r,t,i?.layers);if(c.length===0)continue;let f=q(a,c),g=q(l,c);if(!f||!g)continue;if(f!==g)return r;continue}if(t!==n)return r}}function z(e,t,n,i){return fe(e,t,n,i)!==void 0}var Y=Object.freeze(["network","filesystem","clock","randomness","environment","process","persistence"]),ge=Object.freeze({fetch:"network",XMLHttpRequest:"network",Date:"clock","Date.now":"clock","Math.random":"randomness","process.env":"environment",process:"process"}),ve=Object.freeze(Object.keys(ge).sort()),P=Object.freeze({fs:"filesystem","node:fs":"filesystem","fs/promises":"filesystem","node:fs/promises":"filesystem","fs-extra":"filesystem","graceful-fs":"filesystem",memfs:"filesystem",chokidar:"filesystem",http:"network",https:"network",http2:"network",net:"network",tls:"network",dgram:"network",dns:"network","node:http":"network","node:https":"network","node:http2":"network","node:net":"network","node:tls":"network","node:dgram":"network","node:dns":"network",axios:"network",undici:"network","node-fetch":"network",got:"network",ky:"network",superagent:"network",ws:"network",process:"process","node:process":"process",child_process:"process","node:child_process":"process","@prisma/client":"persistence",prisma:"persistence",pg:"persistence",mysql:"persistence",mysql2:"persistence",mongodb:"persistence",mongoose:"persistence",sqlite3:"persistence","better-sqlite3":"persistence",redis:"persistence",ioredis:"persistence",typeorm:"persistence",knex:"persistence","drizzle-orm":"persistence",sequelize:"persistence",kysely:"persistence","@supabase/supabase-js":"persistence"}),me=Object.freeze({process:Object.freeze(["process","node:process"])});function J(e){if(!e||e.startsWith(".")||e.startsWith("/"))return null;let t=P[e];if(t)return t;let n=e.indexOf("/");if(n<0)return null;let i=e.slice(0,n),r=P[i];if(r)return r;let a=e.indexOf("/",n+1);return a<0?null:P[e.slice(0,a)]??null}function j(e,t){for(let n of t)if(me[n]?.includes(e))return n;return null}function Z(e){if(e?.pure===!0)return[...Y].sort();let n=(e?.capabilities?.deny??[]).filter(i=>Y.includes(i));return[...new Set(n)].sort()}var F="https://unpkg.com/arkgate@2/schemas/ark.config.schema.json",X=["DomainModel","ApplicationOrchestration","PersistenceAdapters","IntegrationAdapters","WorkflowSagaEngine","BackgroundJobsScheduling","PresentationAdapters","ReportingReadModels","ExtensibilityMetadata","SecurityAuditObservability","Kernel"],ye=new Set(["PresentationAdapters->ApplicationOrchestration","ApplicationOrchestration->DomainModel","WorkflowSagaEngine->ApplicationOrchestration","WorkflowSagaEngine->DomainModel","BackgroundJobsScheduling->ApplicationOrchestration"]);function be(){let e=[];for(let t of X)for(let n of X)t===n||ye.has(`${t}->${n}`)||e.push({from:t,to:n,allowed:!1});return e}var ee=be();var h={type:"array",items:{type:"string",minLength:1},uniqueItems:!0},Q={$schema:"https://json-schema.org/draft/2020-12/schema",$id:F,title:"ArkGate architecture contract",description:"Versioned contract consumed identically by ArkGate CLI, MCP, and ESLint surfaces.",type:"object",additionalProperties:!1,required:["$schema","schemaVersion","include","layers","rules"],properties:{$schema:{type:"string",minLength:1,default:F,description:"Editor-facing URL or local path for this JSON Schema."},schemaVersion:{type:"string",const:"1.0",default:"1.0"},name:{type:"string",minLength:1},include:{...h,minItems:1,default:["src"]},exclude:{...h,default:[]},excludeGenerated:{type:"boolean",default:!0},frameworkOverlay:{type:"string",minLength:1},layers:{type:"array",default:[],items:{$ref:"#/$defs/layer"}},rules:{type:"array",default:ee,items:{$ref:"#/$defs/rule"}},cyclePolicy:{type:"string",enum:["strict","soft","framework-soft","off"],default:"strict"},dynamicImportAllowlist:{...h,default:[]},safety:{$ref:"#/$defs/safety",default:{maxTsSuppressions:0,maxAnyCasts:0,allowInMemory:!1,allowDisabledPeerIsolation:!1}}},$defs:{layer:{type:"object",additionalProperties:!1,required:["name","patterns"],properties:{name:{type:"string",minLength:1},patterns:{...h,minItems:1},exclude:h,intentPrefixes:h,description:{type:"string",minLength:1},forbiddenGlobals:h,capabilities:{type:"object",additionalProperties:!1,properties:{deny:{type:"array",uniqueItems:!0,items:{type:"string",enum:["network","filesystem","clock","randomness","environment","process","persistence"]}}}},pure:{type:"boolean"},mayImportInfrastructure:{type:"boolean"},optional:{type:"boolean"}}},rule:{type:"object",additionalProperties:!1,required:["from","to","allowed"],properties:{from:{type:"string",minLength:1},to:{type:"string",minLength:1},allowed:{type:"boolean"},message:{type:"string",minLength:1},peerIsolation:{type:"boolean"},sliceFolders:{...h,minItems:1}}},safety:{type:"object",additionalProperties:!1,properties:{maxTsSuppressions:{type:"integer",minimum:0,default:0},maxAnyCasts:{type:"integer",minimum:0,default:0},allowInMemory:{type:"boolean",default:!1},allowDisabledPeerIsolation:{type:"boolean",default:!1}}}}},k=class extends Error{issues;source;constructor(t,n){super(`Invalid ArkGate config (${t}):
2
- ${n.map(i=>`- ${i.path}: ${i.message}`).join(`
3
- `)}`),this.name="ArkConfigValidationError",this.source=t,this.issues=n}};function te(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function v(e,t){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(t)?`${e}.${t}`:`${e}[${JSON.stringify(t)}]`}function A(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function he(e,t){let n="#/$defs/";if(e.startsWith(n))return t.$defs[e.slice(n.length)]}function N(e,t,n,i,r){if(t.$ref){let a=he(t.$ref,i);if(!a){r.push({path:n,message:`schema reference ${t.$ref} cannot be resolved`});return}N(e,a,n,i,r);return}if(t.const!==void 0&&!Object.is(e,t.const)){r.push({path:n,message:`must equal ${JSON.stringify(t.const)}`});return}if(t.enum&&!t.enum.some(a=>Object.is(a,e))){r.push({path:n,message:`must be one of ${t.enum.map(String).join(", ")}`});return}if(t.type==="object"){if(!te(e)){r.push({path:n,message:`must be an object; received ${A(e)}`});return}let a=t.properties??{};for(let l of t.required??[])e[l]===void 0&&r.push({path:v(n,l),message:"is required"});if(t.additionalProperties===!1)for(let l of Object.keys(e))l in a||r.push({path:v(n,l),message:"unknown field"});for(let[l,c]of Object.entries(a))e[l]!==void 0&&N(e[l],c,v(n,l),i,r);return}if(t.type==="array"){if(!Array.isArray(e)){r.push({path:n,message:`must be an array; received ${A(e)}`});return}if(t.minItems!==void 0&&e.length<t.minItems&&r.push({path:n,message:`must contain at least ${t.minItems} item(s)`}),t.uniqueItems){let a=e.map(l=>JSON.stringify(l));new Set(a).size!==a.length&&r.push({path:n,message:"must not contain duplicate items"})}t.items&&e.forEach((a,l)=>N(a,t.items,`${n}[${l}]`,i,r));return}if(t.type==="string"){if(typeof e!="string"){r.push({path:n,message:`must be a string; received ${A(e)}`});return}t.minLength!==void 0&&e.length<t.minLength&&r.push({path:n,message:`must contain at least ${t.minLength} character(s)`});return}if(t.type==="boolean"){typeof e!="boolean"&&r.push({path:n,message:`must be a boolean; received ${A(e)}`});return}if(t.type==="integer"){if(!Number.isInteger(e)){r.push({path:n,message:`must be an integer; received ${A(e)}`});return}t.minimum!==void 0&&e<t.minimum&&r.push({path:n,message:`must be at least ${t.minimum}`})}}function Ae(e){return{...e,$schema:e.$schema===void 0?F:e.$schema,schemaVersion:e.schemaVersion===void 0?"1.0":e.schemaVersion,include:e.include===void 0?["src"]:e.include,layers:e.layers===void 0?[]:e.layers,rules:e.rules===void 0?ee.map(t=>({...t})):e.rules}}function ke(e,t="ark.config.json"){if(!te(e))throw new k(t,[{path:"$",message:`must be an object; received ${A(e)}`}]);let n=e.schemaVersion===void 0?"unversioned":null;if(e.schemaVersion!==void 0&&e.schemaVersion!=="1.0")throw new k(t,[{path:"$.schemaVersion",message:`unsupported version ${JSON.stringify(e.schemaVersion)}; expected 1.0`}]);return{candidate:Ae(e),migratedFrom:n}}function Se(e,t="ark.config.json"){let{candidate:n,migratedFrom:i}=ke(e,t),r=[];if(N(n,Q,"$",Q,r),r.length>0)throw new k(t,r);return{config:n,migratedFrom:i}}function ne(e,t="ark.config.json"){let n;try{n=JSON.parse(e)}catch(i){throw new k(t,[{path:"$",message:`invalid JSON: ${i instanceof Error?i.message:String(i)}`}])}return Se(n,t)}function b(e){return typeof e=="string"&&e.length>0?e:void 0}function re(e,t){return Number.isInteger(e)&&Number(e)>0?Number(e):t}function Ie(e,t,n){return e==="LAYER_IMPORT_VIOLATION"?t.typeOnly||n.targetTypeOnlyExports===!0||n.namedBindingsTypeOnly===!0?"Move the referenced type to a mutually allowed layer, use `import type`, then preflight again.":n.peerIsolation===!0?"Extract the shared dependency to a shared layer, then preflight again.":`Define a port in ${t.fromLayer??"the source layer"}, inject the ${t.toLayer??"outer-layer"} implementation, then preflight again.`:e==="FORBIDDEN_GLOBAL"?`Inject ${t.target??"the capability"} through a port, then preflight again.`:e==="CAPABILITY_VIOLATION"?`Define a ${b(n.capability)??"capability"} port in ${t.fromLayer??"the walled layer"}, bind the implementation outside it, then preflight again.`:e==="CIRCULAR_DEPENDENCY"?"Extract the shared dependency into a third module, then preflight again.":e==="RAW_EVENT_PUBLISH"?"Publish through a registered intent creator, then run Ark again.":e==="PUBLISH_MISSING_SOURCE"?"Add metadata.source to the publish call, then run Ark again.":`Resolve ${e} without weakening ark.config.json, then run Ark again.`}function ie(e,t="error"){let n=b(e.ruleId)??b(e.code)??"ARK_UNKNOWN",i=e.severity==="warning"?"warning":t,r={...b(e.target)?{target:b(e.target)}:{},...b(e.fromLayer)?{fromLayer:b(e.fromLayer)}:{},...b(e.toLayer)?{toLayer:b(e.toLayer)}:{},...typeof e.typeOnly=="boolean"?{typeOnly:e.typeOnly}:{}};return{ruleId:n,severity:i,message:b(e.message)??n,location:{file:b(e.file)??"<unknown>",line:re(e.line,1),column:re(e.column,1)},evidence:r,nextAction:b(e.nextAction)??Ie(n,r,e)}}var oe={RAW_EVENT_PUBLISH:"Publish through a registered intent creator; raw event objects or intent strings bypass Ark contracts and tooling.",PUBLISH_MISSING_SOURCE:"Strict Ark publish calls must include metadata.source."};function we(e){return/^(Domain|Application|Adapter|Workflow|Job|Presentation|Reporting|Metadata|Security|Audit|Observability|Kernel)\.[A-Za-z0-9_.]+$/.test(e)}function D(e){if(!e.publishCall)return[];let t=[];return(e.rawIntentName!==void 0&&we(e.rawIntentName)||e.objectHasIntent)&&t.push({ruleId:"RAW_EVENT_PUBLISH",message:oe.RAW_EVENT_PUBLISH}),e.arkPublishCandidate&&!e.hasSource&&t.push({ruleId:"PUBLISH_MISSING_SOURCE",message:oe.PUBLISH_MISSING_SOURCE}),t}function C(e){if(typeof e.physicalFilename=="string"&&e.physicalFilename.length>0)return e.physicalFilename;if(typeof e.filename=="string"&&e.filename.length>0)return e.filename;if(typeof e.getFilename=="function")try{let t=e.getFilename();if(typeof t=="string"&&t.length>0)return t}catch{}return""}function S(e,t,n,i,r){let a=ie({...i,line:i.line??t.loc?.start?.line,column:i.column??(typeof t.loc?.start?.column=="number"?t.loc.start.column+1:void 0)});return e.report({node:t,messageId:n,...r?{data:r}:{},diagnostic:a}),a}function V(e){if(!e||e==="<input>"||e.startsWith("stdin"))return null;let t=p.dirname(p.resolve(e));for(;;){let n=p.join(t,"ark.config.json");if(R.existsSync(n))return n;let i=p.dirname(t);if(i===t)return null;t=i}}var M=new Map;function G(e){if(M.has(e))return M.get(e)??null;if(!R.existsSync(e))return null;let t=ne(R.readFileSync(e,"utf8"),e).config;return M.set(e,t),t}function Re(e,t){if(!t.startsWith("."))return null;let n=p.resolve(p.dirname(e),t),i=[n,`${n}.ts`,`${n}.tsx`,`${n}.mts`,`${n}.cts`,`${n}.js`,`${n}.jsx`,p.join(n,"index.ts"),p.join(n,"index.tsx"),p.join(n,"index.js")];for(let r of i)try{if(R.existsSync(r)&&R.statSync(r).isFile())return r}catch{}return`${n}.ts`}function O(e){return typeof e?.value=="string"?e.value:void 0}function K(e){return e?.name??O(e)}function B(e){return e.sourceCode??e.getSourceCode?.()}function se(e,t){let n=B(e)?.getScope?.(t);for(;n;){let i=n.references?.find(r=>r.identifier===t);if(i)return i;n=n.upper??void 0}}function E(e,t,n){let i=se(e,t);if(i?.resolved)return(i.resolved.defs?.length??0)>0;let r=B(e)?.getScope?.(t);for(;r;){let a=r.set?.get(n);if(a)return(a.defs?.length??0)>0;r=r.upper??void 0}return!1}function Ce(e,t){let n=se(e,t);return n?n.isValueReference!==!1:t.parent?.type==="VariableDeclarator"&&t.parent.init===t}function ae(e){if(e?.type==="Identifier"&&e.name)return{root:e,segments:[e.name]};if(!e||!(e.type==="MemberExpression"||!!(e.object&&e.property))||e.computed===!0)return;let n=ae(e.object),i=K(e.property);if(!(!n||!i))return{root:n.root,segments:[...n.segments,i]}}function xe(e){return K(e.callee?.property)}function le(e,t){return e?.properties?.find(n=>K(n.key)===t)}function L(e,t){return le(e,t)!==void 0}function Ne(e){let t=le(e,"metadata")?.value;return L(t,"source")}function ce(e){return xe(e)==="publish"}var Ee={meta:{type:"problem",docs:{description:"Disallow imports that violate ark.config.json layer rules (same contract as arkgate-check)."},messages:{forbiddenImport:"Architecture: {{fromLayer}} must not import {{toLayer}} (ark.config.json). Specifier: {{specifier}}",forbiddenImportHeuristic:"Domain code must not import infrastructure, adapters, repositories, or database modules."},schema:[]},create(e){let t=C(e),n=V(t),i=n?G(n):null,r=n?p.dirname(n):null,a=l=>{let c=O(l.source);if(c&&i&&r&&t){let f=p.isAbsolute(t)?t:p.resolve(t),g=p.relative(r,f).split(p.sep).join("/"),d=w(g,i.layers);if(!d)return;let o=Re(f,c);if(!o)return;let s=p.relative(r,o).split(p.sep).join("/");if(s.startsWith(".."))return;let u=w(s,i.layers);if(!u)return;z(i.rules,d,u,{fromPath:g,toPath:s,layers:i.layers})&&S(e,l,"forbiddenImport",{ruleId:"LAYER_IMPORT_VIOLATION",file:g,fromLayer:d,toLayer:u,target:s,...l.importKind==="type"?{typeOnly:!0}:{},message:`${d} must not import ${u}.`},{fromLayer:d,toLayer:u,specifier:c});return}};return{ImportDeclaration:a,ExportNamedDeclaration:a,ExportAllDeclaration:a}}},Le={meta:{type:"problem",docs:{description:"Require event bus publish calls to use registered intent creators instead of raw event objects or intent strings."},messages:{rawPublish:"Publish through a registered intent creator; raw event objects or intent strings bypass Ark contracts."},schema:[]},create(e){return{CallExpression(t){let n=t.arguments?.[0],i=O(n),r=D({publishCall:ce(t),rawIntentName:i,objectHasIntent:L(n,"intent"),arkPublishCandidate:!1,hasSource:!0});if(r.some(a=>a.ruleId==="RAW_EVENT_PUBLISH")){let a=r.find(l=>l.ruleId==="RAW_EVENT_PUBLISH");S(e,t,"rawPublish",{...a,file:C(e)})}}}}},Oe={meta:{type:"problem",docs:{description:"Require event bus publish calls to include source metadata."},messages:{missingSource:"Strict Ark publish calls must include metadata.source."},schema:[]},create(e){return{CallExpression(t){let n=t.arguments?.[0],i=t.arguments?.[2],a=D({publishCall:ce(t),rawIntentName:O(n),objectHasIntent:L(n,"intent"),arkPublishCandidate:!0,hasSource:Ne(n)||L(i,"source")}).find(l=>l.ruleId==="PUBLISH_MISSING_SOURCE");a&&S(e,t,"missingSource",{...a,file:C(e)})}}}},_e={meta:{type:"problem",docs:{description:"Disallow ambient globals from the layer\u2019s forbiddenGlobals in ark.config.json (same purity surface as ark-check). Option `globals` is a standalone fallback when no project config applies."},messages:{forbiddenGlobal:'Ambient global "{{name}}" is forbidden in {{layer}} (ark.config.json); inject the capability through a port instead.',forbiddenGlobalDefault:'Ambient global "{{name}}" is forbidden here; inject the capability through a port instead.',forbiddenModule:'{{layer}} must not use module "{{specifier}}" because it is the import form of forbidden global "{{name}}".'},schema:[{type:"object",properties:{globals:{type:"array",items:{type:"string"}}},additionalProperties:!1}]},create(e){let t=C(e),n=e.options?.[0],i=V(t),r=i?G(i):null,a=i?p.dirname(i):null,l=null,c="this layer";if(r&&a&&t){let o=p.isAbsolute(t)?t:p.resolve(t),s=p.relative(a,o).split(p.sep).join("/"),u=r.layers?.find(m=>m.name===w(s,r.layers));u?.forbiddenGlobals?.length?(l=new Set(u.forbiddenGlobals),c=u.name):l=null}else n?.globals&&(l=new Set(n.globals));if(!l)return{};let f=typeof B(e)?.getScope=="function",g=(o,s)=>{let u=p.isAbsolute(t)?t:p.resolve(t),m=a?p.relative(a,u).split(p.sep).join("/"):t;S(e,o,r?"forbiddenGlobal":"forbiddenGlobalDefault",{ruleId:"FORBIDDEN_GLOBAL",file:m,fromLayer:c,target:s,message:`${c} must not use the ambient global "${s}".`},{name:s,layer:c})},d=(o,s,u,m)=>{if(u||typeof s!="string")return;let y=j(s,l);if(!y)return;let I=p.isAbsolute(t)?t:p.resolve(t),x=a?p.relative(a,I).split(p.sep).join("/"):t;S(e,o,"forbiddenModule",{ruleId:"FORBIDDEN_GLOBAL",file:x,fromLayer:c,target:s,message:`${c} must not use module "${s}" because it is the import form of forbidden global "${y}".`},{layer:c,name:y,specifier:s,importKind:m})};return{MemberExpression(o){if(o.parent?.type==="MemberExpression"&&o.parent.object===o)return;let s=ae(o);if(!s||E(e,s.root,s.segments[0]))return;let u=s.segments[0]==="globalThis",m=u?s.segments.slice(1):s.segments,y;for(let I=m.length;I>=(u?1:2);I-=1){let x=m.slice(0,I).join(".");if(l.has(x)){y=x;break}}y?g(o,y):!f&&l.has(s.segments[0])&&g(o,s.segments[0])},CallExpression(o){let s=o;if(s.callee?.type==="Identifier"&&s.callee.name==="require"&&s.arguments?.[0]?.type==="Literal"&&!E(e,o,"require")&&d(o,s.arguments[0].value,!1,"require"),f)return;let u=s.callee?.type==="Identifier"?s.callee.name:void 0;u&&l.has(u)&&g(o,u)},ImportDeclaration(o){let s=o,u=(s.specifiers??[]).filter(y=>y.type==="ImportSpecifier"),m=u.length>0&&u.length===(s.specifiers??[]).length&&u.every(y=>y.importKind==="type");d(o,s.source?.value,s.importKind==="type"||m,"import")},ImportExpression(o){let s=o;s.source?.type==="Literal"&&d(o,s.source.value,!1,"dynamic-import")},TSImportEqualsDeclaration(o){let s=o;d(o,s.moduleReference?.expression?.value,s.importKind==="type"||s.isTypeOnly===!0,"require")},ExportNamedDeclaration(o){let s=o;if(!s.source)return;let u=s.specifiers??[],m=u.length>0&&u.every(y=>y.exportKind==="type");d(o,s.source.value,s.exportKind==="type"||m,"export")},ExportAllDeclaration(o){let s=o;d(o,s.source?.value,s.exportKind==="type","export")},NewExpression(o){if(f)return;let s=o.callee?.type==="Identifier"?o.callee.name:void 0;s&&l.has(s)&&g(o,s)},Identifier(o){!f||!o.name||!l.has(o.name)||!Ce(e,o)||E(e,o,o.name)||g(o,o.name)}}}},$e={meta:{type:"problem",docs:{description:"Disallow importing modules whose effect capability the layer denies (ark.config.json capabilities.deny / pure \u2014 same wall surface as ark-check). Import dimension only: ambient globals stay with no-forbidden-globals and the CLI/hook symbol path."},messages:{deniedCapability:'{{layer}} denies the {{capability}} capability (ark.config.json); "{{specifier}}" imports it. Define a port and bind the implementation in an adapter layer.'},schema:[]},create(e){let t=C(e),n=V(t),i=n?G(n):null,r=n?p.dirname(n):null;if(!i||!r||!t)return{};let a=p.isAbsolute(t)?t:p.resolve(t),l=p.relative(r,a).split(p.sep).join("/"),c=i.layers?.find(d=>d.name===w(l,i.layers));if(!c)return{};let f=new Set(Z(c));if(f.size===0)return{};let g=(d,o,s)=>{if(s||typeof o!="string"||j(o,c.forbiddenGlobals??[]))return;let u=J(o);!u||!f.has(u)||S(e,d,"deniedCapability",{ruleId:"CAPABILITY_VIOLATION",file:l,fromLayer:c.name,target:o,capability:u,message:`${c.name} denies the ${u} capability; found import of "${o}".`},{layer:c.name,capability:u,specifier:o})};return{ImportDeclaration(d){let o=d,s=(o.specifiers??[]).filter(m=>m.type==="ImportSpecifier"),u=s.length>0&&s.length===(o.specifiers??[]).length&&s.every(m=>m.importKind==="type");g(d,o.source?.value,o.importKind==="type"||u)},ImportExpression(d){let o=d;o.source?.type==="Literal"&&g(d,o.source.value,!1)},TSImportEqualsDeclaration(d){let o=d;g(d,o.moduleReference?.expression?.value,o.importKind==="type"||o.isTypeOnly===!0)},ExportNamedDeclaration(d){let o=d;if(!o.source)return;let s=o.specifiers??[],u=s.length>0&&s.every(m=>m.exportKind==="type");g(d,o.source.value,o.exportKind==="type"||u)},ExportAllDeclaration(d){let o=d;g(d,o.source?.value,o.exportKind==="type")},CallExpression(d){let o=d;o.callee?.type==="Identifier"&&o.callee.name==="require"&&o.arguments?.[0]?.type==="Literal"&&!E(e,d,"require")&&g(d,o.arguments[0].value,!1)}}}},Pe={"no-domain-infra-imports":Ee,"no-raw-event-publish":Le,"require-publish-source":Oe,"no-forbidden-globals":_e,"no-denied-capabilities":$e},T={rules:Pe};T.configs={recommended:{plugins:{ark:T},rules:{"ark/no-domain-infra-imports":"error","ark/no-raw-event-publish":"error","ark/require-publish-source":"error","ark/no-forbidden-globals":"error","ark/no-denied-capabilities":"error"}}};var We=T;export{We as default,V as findConfigPath,_ as globToRegExp,z as isEdgeDenied,w as layerForRelativePath,G as loadArkConfig,$e as noDeniedCapabilities,Ee as noDomainInfraImports,_e as noForbiddenGlobals,Le as noRawEventPublish,W as patternSpecificity,T as plugin,Oe as requirePublishSource,Re as resolveRelativeImport};
1
+ import R from"fs";import d from"path";var q=new Map;function U(e){return/[.*+?^${}()|[\]\\]/.test(e)?`\\${e}`:e}function _(e){let t="";for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="\\"&&n+1<e.length){let r=e[n+1];if("*?{}[],".includes(r)||r==="\\"){t+="\\"+r,n+=1;continue}t+="/";continue}t+=s}return t}function fe(e){let t=0;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="\\"){n+=1;continue}if(s==="{")t+=1;else if(s==="}"&&(t-=1,t<0))return!1}return t===0}function C(e){let t=q.get(e);if(t)return t;let n=_(e),s=fe(n),r="",a=0;for(let c=0;c<n.length;c+=1){let g=n[c];g==="\\"&&c+1<n.length?(r+=U(n[c+1]),c+=1):g==="*"?n[c+1]==="*"?n[c+2]==="/"?(r+="(?:.*/)?",c+=2):(r+=".*",c+=1):r+="[^/]*":g==="?"?r+="[^/]":g==="{"&&s?(r+="(?:",a+=1):g==="}"&&s&&a>0?(r+=")",a-=1):g===","&&s&&a>0?r+="|":r+=U(g)}let l=new RegExp(`^${r}$`);return q.set(e,l),l}function Y(e){let t=_(String(e)),s=t.split("*")[0].split("/").filter(Boolean).length,r=t.replace(/\*/g,"").length;return s*1e4+r}function x(e,t){let n=String(e).split(/[/\\]/).join("/"),s,r=-1;for(let a of t??[])if(!(a.exclude??[]).some(l=>C(l).test(n))){for(let l of a.patterns??[])if(C(l).test(n)){let c=Y(l);c>r&&(r=c,s=a.name)}}return s}function W(e,t){if(!t?.length)return;let n=String(e).split(/[/\\]/).filter(Boolean),s=new Set(t.map(r=>String(r).toLowerCase()));for(let r=0;r<n.length-1;r+=1)if(s.has(n[r].toLowerCase()))return`${n[r].toLowerCase()}/${n[r+1].toLowerCase()}`}function ge(e){let t=new Set;for(let n of e??[]){let r=_(String(n)).split("/").filter(Boolean);for(let a=0;a<r.length;a+=1){let l=r[a];if((l==="**"||l==="*")&&a>0){let c=r[a-1];c&&!c.includes("*")&&!c.includes("{")&&!c.includes("}")&&t.add(c)}}}return[...t]}function me(e,t,n){if(Array.isArray(e.sliceFolders)&&e.sliceFolders.length>0)return e.sliceFolders.filter(r=>typeof r=="string"&&r.length>0);let s=(n??[]).find(r=>r.name===t);return ge(s?.patterns)}function ye(e,t,n,s){for(let r of e??[])if(!(r.from!==t||r.to!==n)&&r.allowed===!1){if(r.peerIsolation){let a=s?.fromPath,l=s?.toPath;if(!a||!l)continue;let c=me(r,t,s?.layers);if(c.length===0)continue;let g=W(a,c),m=W(l,c);if(!g||!m)continue;if(g!==m)return r;continue}if(t!==n)return r}}function z(e,t,n,s){return ye(e,t,n,s)!==void 0}var be=["**/*.gen.ts","**/*.gen.tsx","**/*.generated.ts","**/*.generated.tsx"];function he(e){let t=Array.isArray(e?.exclude)?e.exclude.filter(s=>typeof s=="string"):[];return[...e?.excludeGenerated===!1?[]:be,...t]}function J(e,t){let n=String(e).split(/[/\\]/).join("/");return he(t).some(s=>C(s).test(n))}var Z=Object.freeze(["network","filesystem","clock","randomness","environment","process","persistence"]),Ae=Object.freeze({fetch:"network",XMLHttpRequest:"network",Date:"clock","Date.now":"clock","Math.random":"randomness","process.env":"environment",process:"process"}),Ke=Object.freeze(Object.keys(Ae).sort()),P=Object.freeze({fs:"filesystem","node:fs":"filesystem","fs/promises":"filesystem","node:fs/promises":"filesystem","fs-extra":"filesystem","graceful-fs":"filesystem",memfs:"filesystem",chokidar:"filesystem",http:"network",https:"network",http2:"network",net:"network",tls:"network",dgram:"network",dns:"network","node:http":"network","node:https":"network","node:http2":"network","node:net":"network","node:tls":"network","node:dgram":"network","node:dns":"network",axios:"network",undici:"network","node-fetch":"network",got:"network",ky:"network",superagent:"network",ws:"network",process:"process","node:process":"process",child_process:"process","node:child_process":"process","@prisma/client":"persistence",prisma:"persistence",pg:"persistence",mysql:"persistence",mysql2:"persistence",mongodb:"persistence",mongoose:"persistence",sqlite3:"persistence","better-sqlite3":"persistence",redis:"persistence",ioredis:"persistence",typeorm:"persistence",knex:"persistence","drizzle-orm":"persistence",sequelize:"persistence",kysely:"persistence","@supabase/supabase-js":"persistence"}),Ie=Object.freeze({process:Object.freeze(["process","node:process"])});function X(e){if(!e||e.startsWith(".")||e.startsWith("/"))return null;let t=P[e];if(t)return t;let n=e.indexOf("/");if(n<0)return null;let s=e.slice(0,n),r=P[s];if(r)return r;let a=e.indexOf("/",n+1);return a<0?null:P[e.slice(0,a)]??null}function $(e,t){for(let n of t)if(Ie[n]?.includes(e))return n;return null}function Q(e){if(e?.pure===!0)return[...Z].sort();let n=(e?.capabilities?.deny??[]).filter(s=>Z.includes(s));return[...new Set(n)].sort()}var j="https://unpkg.com/arkgate@2/schemas/ark.config.schema.json",ee=["DomainModel","ApplicationOrchestration","PersistenceAdapters","IntegrationAdapters","WorkflowSagaEngine","BackgroundJobsScheduling","PresentationAdapters","ReportingReadModels","ExtensibilityMetadata","SecurityAuditObservability","Kernel"],ke=new Set(["PresentationAdapters->ApplicationOrchestration","ApplicationOrchestration->DomainModel","WorkflowSagaEngine->ApplicationOrchestration","WorkflowSagaEngine->DomainModel","BackgroundJobsScheduling->ApplicationOrchestration"]);function Se(){let e=[];for(let t of ee)for(let n of ee)t===n||ke.has(`${t}->${n}`)||e.push({from:t,to:n,allowed:!1});return e}var ne=Se();var h={type:"array",items:{type:"string",minLength:1},uniqueItems:!0},te={$schema:"https://json-schema.org/draft/2020-12/schema",$id:j,title:"ArkGate architecture contract",description:"Versioned contract consumed identically by ArkGate CLI, MCP, and ESLint surfaces.",type:"object",additionalProperties:!1,required:["$schema","schemaVersion","include","layers","rules"],properties:{$schema:{type:"string",minLength:1,default:j,description:"Editor-facing URL or local path for this JSON Schema."},schemaVersion:{type:"string",const:"1.0",default:"1.0"},name:{type:"string",minLength:1},include:{...h,minItems:1,default:["src"]},exclude:{...h,default:[]},excludeGenerated:{type:"boolean",default:!0},frameworkOverlay:{type:"string",minLength:1},layers:{type:"array",default:[],items:{$ref:"#/$defs/layer"}},rules:{type:"array",default:ne,items:{$ref:"#/$defs/rule"}},cyclePolicy:{type:"string",enum:["strict","soft","framework-soft","off"],default:"strict"},dynamicImportAllowlist:{...h,default:[]},safety:{$ref:"#/$defs/safety",default:{maxTsSuppressions:0,maxAnyCasts:0,allowInMemory:!1,allowDisabledPeerIsolation:!1}}},$defs:{layer:{type:"object",additionalProperties:!1,required:["name","patterns"],properties:{name:{type:"string",minLength:1},patterns:{...h,minItems:1},exclude:h,intentPrefixes:h,description:{type:"string",minLength:1},forbiddenGlobals:h,capabilities:{type:"object",additionalProperties:!1,properties:{deny:{type:"array",uniqueItems:!0,items:{type:"string",enum:["network","filesystem","clock","randomness","environment","process","persistence"]}}}},pure:{type:"boolean"},mayImportInfrastructure:{type:"boolean"},optional:{type:"boolean"}}},rule:{type:"object",additionalProperties:!1,required:["from","to","allowed"],properties:{from:{type:"string",minLength:1},to:{type:"string",minLength:1},allowed:{type:"boolean"},message:{type:"string",minLength:1},peerIsolation:{type:"boolean"},sliceFolders:{...h,minItems:1}}},safety:{type:"object",additionalProperties:!1,properties:{maxTsSuppressions:{type:"integer",minimum:0,default:0},maxAnyCasts:{type:"integer",minimum:0,default:0},allowInMemory:{type:"boolean",default:!1},allowDisabledPeerIsolation:{type:"boolean",default:!1}}}}},I=class extends Error{issues;source;constructor(t,n){super(`Invalid ArkGate config (${t}):
2
+ ${n.map(s=>`- ${s.path}: ${s.message}`).join(`
3
+ `)}`),this.name="ArkConfigValidationError",this.source=t,this.issues=n}};function re(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function T(e,t){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(t)?`${e}.${t}`:`${e}[${JSON.stringify(t)}]`}function A(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function xe(e,t){let n="#/$defs/";if(e.startsWith(n))return t.$defs[e.slice(n.length)]}function N(e,t,n,s,r){if(t.$ref){let a=xe(t.$ref,s);if(!a){r.push({path:n,message:`schema reference ${t.$ref} cannot be resolved`});return}N(e,a,n,s,r);return}if(t.const!==void 0&&!Object.is(e,t.const)){r.push({path:n,message:`must equal ${JSON.stringify(t.const)}`});return}if(t.enum&&!t.enum.some(a=>Object.is(a,e))){r.push({path:n,message:`must be one of ${t.enum.map(String).join(", ")}`});return}if(t.type==="object"){if(!re(e)){r.push({path:n,message:`must be an object; received ${A(e)}`});return}let a=t.properties??{};for(let l of t.required??[])e[l]===void 0&&r.push({path:T(n,l),message:"is required"});if(t.additionalProperties===!1)for(let l of Object.keys(e))l in a||r.push({path:T(n,l),message:"unknown field"});for(let[l,c]of Object.entries(a))e[l]!==void 0&&N(e[l],c,T(n,l),s,r);return}if(t.type==="array"){if(!Array.isArray(e)){r.push({path:n,message:`must be an array; received ${A(e)}`});return}if(t.minItems!==void 0&&e.length<t.minItems&&r.push({path:n,message:`must contain at least ${t.minItems} item(s)`}),t.uniqueItems){let a=e.map(l=>JSON.stringify(l));new Set(a).size!==a.length&&r.push({path:n,message:"must not contain duplicate items"})}t.items&&e.forEach((a,l)=>N(a,t.items,`${n}[${l}]`,s,r));return}if(t.type==="string"){if(typeof e!="string"){r.push({path:n,message:`must be a string; received ${A(e)}`});return}t.minLength!==void 0&&e.length<t.minLength&&r.push({path:n,message:`must contain at least ${t.minLength} character(s)`});return}if(t.type==="boolean"){typeof e!="boolean"&&r.push({path:n,message:`must be a boolean; received ${A(e)}`});return}if(t.type==="integer"){if(!Number.isInteger(e)){r.push({path:n,message:`must be an integer; received ${A(e)}`});return}t.minimum!==void 0&&e<t.minimum&&r.push({path:n,message:`must be at least ${t.minimum}`})}}function Re(e){return{...e,$schema:e.$schema===void 0?j:e.$schema,schemaVersion:e.schemaVersion===void 0?"1.0":e.schemaVersion,include:e.include===void 0?["src"]:e.include,layers:e.layers===void 0?[]:e.layers,rules:e.rules===void 0?ne.map(t=>({...t})):e.rules}}function we(e,t="ark.config.json"){if(!re(e))throw new I(t,[{path:"$",message:`must be an object; received ${A(e)}`}]);let n=e.schemaVersion===void 0?"unversioned":null;if(e.schemaVersion!==void 0&&e.schemaVersion!=="1.0")throw new I(t,[{path:"$.schemaVersion",message:`unsupported version ${JSON.stringify(e.schemaVersion)}; expected 1.0`}]);return{candidate:Re(e),migratedFrom:n}}function Ee(e,t="ark.config.json"){let{candidate:n,migratedFrom:s}=we(e,t),r=[];if(N(n,te,"$",te,r),r.length>0)throw new I(t,r);return{config:n,migratedFrom:s}}function se(e,t="ark.config.json"){let n;try{n=JSON.parse(e)}catch(s){throw new I(t,[{path:"$",message:`invalid JSON: ${s instanceof Error?s.message:String(s)}`}])}return Ee(n,t)}function y(e){return typeof e=="string"&&e.length>0?e:void 0}function ie(e,t){return Number.isInteger(e)&&Number(e)>0?Number(e):t}function Ce(e,t,n){return e==="LAYER_IMPORT_VIOLATION"?t.typeOnly||n.targetTypeOnlyExports===!0||n.namedBindingsTypeOnly===!0?"Move the referenced type to a mutually allowed layer, use `import type`, then preflight again.":n.peerIsolation===!0?"Extract the shared dependency to a shared layer, then preflight again.":`Define a port in ${t.fromLayer??"the source layer"}, inject the ${t.toLayer??"outer-layer"} implementation, then preflight again.`:e==="FORBIDDEN_GLOBAL"?`Inject ${t.target??"the capability"} through a port, then preflight again.`:e==="CAPABILITY_VIOLATION"?`Define a ${y(n.capability)??"capability"} port in ${t.fromLayer??"the walled layer"}, bind the implementation outside it, then preflight again.`:e==="CIRCULAR_DEPENDENCY"?"Extract the shared dependency into a third module, then preflight again.":e==="RAW_EVENT_PUBLISH"?"Publish through a registered intent creator, then run Ark again.":e==="PUBLISH_MISSING_SOURCE"?"Add metadata.source to the publish call, then run Ark again.":`Resolve ${e} without weakening ark.config.json, then run Ark again.`}function oe(e,t="error"){let n=y(e.ruleId)??y(e.code)??"ARK_UNKNOWN",s=e.severity==="warning"?"warning":t,r={...y(e.target)?{target:y(e.target)}:{},...y(e.fromLayer)?{fromLayer:y(e.fromLayer)}:{},...y(e.toLayer)?{toLayer:y(e.toLayer)}:{},...typeof e.typeOnly=="boolean"?{typeOnly:e.typeOnly}:{},...typeof e.targetTypeOnlyExports=="boolean"?{targetTypeOnlyExports:e.targetTypeOnlyExports}:{},...typeof e.sourcePureTypeModule=="boolean"?{sourcePureTypeModule:e.sourcePureTypeModule}:{},...typeof e.namedBindingsTypeOnly=="boolean"?{namedBindingsTypeOnly:e.namedBindingsTypeOnly}:{},...typeof e.portProofEligible=="boolean"?{portProofEligible:e.portProofEligible}:{},...typeof e.peerIsolation=="boolean"?{peerIsolation:e.peerIsolation}:{},...y(e.capability)?{capability:y(e.capability)}:{},...y(e.edgeKind)?{edgeKind:y(e.edgeKind)}:{}};return{ruleId:n,severity:s,message:y(e.message)??n,location:{file:y(e.file)??"<unknown>",line:ie(e.line,1),column:ie(e.column,1)},evidence:r,nextAction:y(e.nextAction)??Ce(n,r,e)}}var ae={RAW_EVENT_PUBLISH:"Publish through a registered intent creator; raw event objects or intent strings bypass Ark contracts and tooling.",PUBLISH_MISSING_SOURCE:"Strict Ark publish calls must include metadata.source."},Ue=Object.freeze([{layer:"DomainModel",prefixes:["Domain."]},{layer:"ApplicationOrchestration",prefixes:["Application."]},{layer:"PersistenceAdapters",prefixes:["Adapter.Persistence.","Adapter.Repository."]},{layer:"IntegrationAdapters",prefixes:["Adapter.Integration.","Adapter.External."]},{layer:"WorkflowSagaEngine",prefixes:["Workflow."]},{layer:"BackgroundJobsScheduling",prefixes:["Job."]},{layer:"PresentationAdapters",prefixes:["Presentation.","Adapter.Presentation.","Adapter.Api."]},{layer:"ReportingReadModels",prefixes:["Reporting."]},{layer:"ExtensibilityMetadata",prefixes:["Metadata."]},{layer:"SecurityAuditObservability",prefixes:["Security.","Audit.","Observability."]},{layer:"Kernel",prefixes:["Kernel."]}]);function Ne(e){return/^(Domain|Application|Adapter|Workflow|Job|Presentation|Reporting|Metadata|Security|Audit|Observability|Kernel)\.[A-Za-z0-9_.]+$/.test(e)}function D(e){if(!e.publishCall)return[];let t=[];return(e.rawIntentName!==void 0&&Ne(e.rawIntentName)||e.objectHasIntent)&&t.push({ruleId:"RAW_EVENT_PUBLISH",message:ae.RAW_EVENT_PUBLISH}),e.arkPublishCandidate&&!e.hasSource&&t.push({ruleId:"PUBLISH_MISSING_SOURCE",message:ae.PUBLISH_MISSING_SOURCE}),t}function w(e){if(typeof e.physicalFilename=="string"&&e.physicalFilename.length>0)return e.physicalFilename;if(typeof e.filename=="string"&&e.filename.length>0)return e.filename;if(typeof e.getFilename=="function")try{let t=e.getFilename();if(typeof t=="string"&&t.length>0)return t}catch{}return""}function k(e,t,n,s,r){let a=oe({...s,line:s.line??t.loc?.start?.line,column:s.column??(typeof t.loc?.start?.column=="number"?t.loc.start.column+1:void 0)});return e.report({node:t,messageId:n,...r?{data:r}:{},diagnostic:a}),a}function V(e){if(!e||e==="<input>"||e.startsWith("stdin"))return null;let t=d.dirname(d.resolve(e));for(;;){let n=d.join(t,"ark.config.json");if(R.existsSync(n))return n;let s=d.dirname(t);if(s===t)return null;t=s}}var le=new Map;function H(e){if(!R.existsSync(e))return null;let t=R.readFileSync(e,"utf8"),n=le.get(e);if(n?.source===t)return n.config;let s=se(t,e).config;return le.set(e,{source:t,config:s}),s}function K(e,t){return(e.include??[]).some(s=>{let r=String(s).replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/$/,"");return r==="."||t===r||t.startsWith(`${r}/`)})&&!J(t,e)}function Le(e,t){if(!t.startsWith("."))return null;let n=d.resolve(d.dirname(e),t),s=[n,`${n}.ts`,`${n}.tsx`,`${n}.mts`,`${n}.cts`,`${n}.js`,`${n}.jsx`,d.join(n,"index.ts"),d.join(n,"index.tsx"),d.join(n,"index.js")];for(let r of s)try{if(R.existsSync(r)&&R.statSync(r).isFile())return r}catch{}return null}function v(e){return typeof e?.value=="string"?e.value:void 0}function B(e){return e?.name??v(e)}function G(e){return e.sourceCode??e.getSourceCode?.()}function ce(e,t){let n=G(e)?.getScope?.(t);for(;n;){let s=n.references?.find(r=>r.identifier===t);if(s)return s;n=n.upper??void 0}}function L(e,t,n){let s=ce(e,t);if(s?.resolved)return(s.resolved.defs?.length??0)>0;let r=G(e)?.getScope?.(t);for(;r;){let a=r.set?.get(n);if(a)return(a.defs?.length??0)>0;r=r.upper??void 0}return!1}function Oe(e,t){let n=ce(e,t);return n?n.isValueReference!==!1:t.parent?.type==="VariableDeclarator"&&t.parent.init===t}function pe(e){if(e?.type==="Identifier"&&e.name)return{root:e,segments:[e.name]};if(!e||!(e.type==="MemberExpression"||!!(e.object&&e.property))||e.computed===!0)return;let n=pe(e.object),s=B(e.property);if(!(!n||!s))return{root:n.root,segments:[...n.segments,s]}}function ve(e){return B(e.callee?.property)}function de(e,t){return e?.properties?.find(n=>B(n.key)===t)}function O(e,t){return de(e,t)!==void 0}function _e(e){let t=de(e,"metadata")?.value;return O(t,"source")}function ue(e){return ve(e)==="publish"}function M(e){if(e.importKind==="type"||e.exportKind==="type")return!0;let t=e.specifiers??[];return t.length===0?!1:t.every(n=>n.type==="ImportSpecifier")?t.every(n=>n.importKind==="type"):t.every(n=>n.exportKind==="type")}function Pe(e){let t=e;for(;t?.parent;)t=t.parent;return t?.type==="Program"?t:void 0}function $e(e){let t=Pe(e)?.body;if(!t)return!1;let n=!1;for(let s of t){if(s.type==="ImportDeclaration"){if(!M(s))return!1;continue}if(!(s.type==="TSInterfaceDeclaration"||s.type==="TSTypeAliasDeclaration")){if(s.type==="ExportNamedDeclaration"){if(s.declaration){if(s.declaration.type!=="TSInterfaceDeclaration"&&s.declaration.type!=="TSTypeAliasDeclaration")return!1}else if(!M(s))return!1;n=!0;continue}return!1}}return n}var Te={meta:{type:"problem",docs:{description:"Disallow imports that violate ark.config.json layer rules (same contract as arkgate-check)."},messages:{forbiddenImport:"Architecture: {{fromLayer}} must not import {{toLayer}} (ark.config.json). Specifier: {{specifier}}",forbiddenImportHeuristic:"Domain code must not import infrastructure, adapters, repositories, or database modules."},schema:[]},create(e){let t=w(e),n=V(t),s=n?H(n):null,r=n?d.dirname(n):null,a=l=>{let c=v(l.source);if(c&&s&&r&&t){let g=d.isAbsolute(t)?t:d.resolve(t),m=d.relative(r,g).split(d.sep).join("/");if(!K(s,m))return;let p=x(m,s.layers);if(!p)return;let i=Le(g,c);if(!i)return;let o=d.relative(r,i).split(d.sep).join("/");if(o.startsWith(".."))return;let u=x(o,s.layers);if(!u)return;if(z(s.rules,p,u,{fromPath:m,toPath:o,layers:s.layers})){let f=l.type?.startsWith("Export")?"export":"import";k(e,l,"forbiddenImport",{ruleId:"LAYER_IMPORT_VIOLATION",file:m,fromLayer:p,toLayer:u,target:o,edgeKind:f,...M(l)?{typeOnly:!0}:{},...$e(l)?{sourcePureTypeModule:!0}:{},message:`${p} must not ${f} ${u}.`},{fromLayer:p,toLayer:u,specifier:c})}return}};return{ImportDeclaration:a,ExportNamedDeclaration:a,ExportAllDeclaration:a}}},je={meta:{type:"problem",docs:{description:"Require event bus publish calls to use registered intent creators instead of raw event objects or intent strings."},messages:{rawPublish:"Publish through a registered intent creator; raw event objects or intent strings bypass Ark contracts."},schema:[]},create(e){return{CallExpression(t){let n=t.arguments?.[0],s=v(n),r=D({publishCall:ue(t),rawIntentName:s,objectHasIntent:O(n,"intent"),arkPublishCandidate:!1,hasSource:!0});if(r.some(a=>a.ruleId==="RAW_EVENT_PUBLISH")){let a=r.find(l=>l.ruleId==="RAW_EVENT_PUBLISH");k(e,t,"rawPublish",{...a,file:w(e)})}}}}},De={meta:{type:"problem",docs:{description:"Require event bus publish calls to include source metadata."},messages:{missingSource:"Strict Ark publish calls must include metadata.source."},schema:[]},create(e){return{CallExpression(t){let n=t.arguments?.[0],s=t.arguments?.[2],a=D({publishCall:ue(t),rawIntentName:v(n),objectHasIntent:O(n,"intent"),arkPublishCandidate:!0,hasSource:_e(n)||O(s,"source")}).find(l=>l.ruleId==="PUBLISH_MISSING_SOURCE");a&&k(e,t,"missingSource",{...a,file:w(e)})}}}},Me={meta:{type:"problem",docs:{description:"Disallow ambient globals from the layer\u2019s forbiddenGlobals in ark.config.json (same purity surface as ark-check). Option `globals` is a standalone fallback when no project config applies."},messages:{forbiddenGlobal:'Ambient global "{{name}}" is forbidden in {{layer}} (ark.config.json); inject the capability through a port instead.',forbiddenGlobalDefault:'Ambient global "{{name}}" is forbidden here; inject the capability through a port instead.',forbiddenModule:'{{layer}} must not use module "{{specifier}}" because it is the import form of forbidden global "{{name}}".'},schema:[{type:"object",properties:{globals:{type:"array",items:{type:"string"}}},additionalProperties:!1}]},create(e){let t=w(e),n=e.options?.[0],s=V(t),r=s?H(s):null,a=s?d.dirname(s):null,l=null,c="this layer";if(r&&a&&t){let i=d.isAbsolute(t)?t:d.resolve(t),o=d.relative(a,i).split(d.sep).join("/");if(!K(r,o))return{};let u=r.layers?.find(f=>f.name===x(o,r.layers));u?.forbiddenGlobals?.length?(l=new Set(u.forbiddenGlobals),c=u.name):l=null}else n?.globals&&(l=new Set(n.globals));if(!l)return{};let g=typeof G(e)?.getScope=="function",m=(i,o)=>{let u=d.isAbsolute(t)?t:d.resolve(t),f=a?d.relative(a,u).split(d.sep).join("/"):t;k(e,i,r?"forbiddenGlobal":"forbiddenGlobalDefault",{ruleId:"FORBIDDEN_GLOBAL",file:f,fromLayer:c,target:o,message:`${c} must not use the ambient global "${o}".`},{name:o,layer:c})},p=(i,o,u,f)=>{if(u||typeof o!="string")return;let b=$(o,l);if(!b)return;let S=d.isAbsolute(t)?t:d.resolve(t),E=a?d.relative(a,S).split(d.sep).join("/"):t;k(e,i,"forbiddenModule",{ruleId:"FORBIDDEN_GLOBAL",file:E,fromLayer:c,target:o,edgeKind:f,message:`${c} must not use module "${o}" because it is the import form of forbidden global "${b}".`},{layer:c,name:b,specifier:o,importKind:f})};return{MemberExpression(i){if(i.parent?.type==="MemberExpression"&&i.parent.object===i)return;let o=pe(i);if(!o||L(e,o.root,o.segments[0]))return;let u=o.segments[0]==="globalThis",f=u?o.segments.slice(1):o.segments,b;for(let S=f.length;S>=(u?1:2);S-=1){let E=f.slice(0,S).join(".");if(l.has(E)){b=E;break}}b?m(i,b):!g&&l.has(o.segments[0])&&m(i,o.segments[0])},CallExpression(i){let o=i;if(o.callee?.type==="Identifier"&&o.callee.name==="require"&&o.arguments?.[0]?.type==="Literal"&&!L(e,i,"require")&&p(i,o.arguments[0].value,!1,"require"),g)return;let u=o.callee?.type==="Identifier"?o.callee.name:void 0;u&&l.has(u)&&m(i,u)},ImportDeclaration(i){let o=i,u=(o.specifiers??[]).filter(b=>b.type==="ImportSpecifier"),f=u.length>0&&u.length===(o.specifiers??[]).length&&u.every(b=>b.importKind==="type");p(i,o.source?.value,o.importKind==="type"||f,"import")},ImportExpression(i){let o=i;o.source?.type==="Literal"&&p(i,o.source.value,!1,"dynamic-import")},TSImportEqualsDeclaration(i){let o=i;p(i,o.moduleReference?.expression?.value,o.importKind==="type"||o.isTypeOnly===!0,"require")},ExportNamedDeclaration(i){let o=i;if(!o.source)return;let u=o.specifiers??[],f=u.length>0&&u.every(b=>b.exportKind==="type");p(i,o.source.value,o.exportKind==="type"||f,"export")},ExportAllDeclaration(i){let o=i;p(i,o.source?.value,o.exportKind==="type","export")},NewExpression(i){if(g)return;let o=i.callee?.type==="Identifier"?i.callee.name:void 0;o&&l.has(o)&&m(i,o)},Identifier(i){!g||!i.name||!l.has(i.name)||!Oe(e,i)||L(e,i,i.name)||m(i,i.name)}}}},Fe={meta:{type:"problem",docs:{description:"Disallow importing modules whose effect capability the layer denies (ark.config.json capabilities.deny / pure \u2014 same wall surface as ark-check). Import dimension only: ambient globals stay with no-forbidden-globals and the CLI/hook symbol path."},messages:{deniedCapability:'{{layer}} denies the {{capability}} capability (ark.config.json); "{{specifier}}" imports it. Define a port and bind the implementation in an adapter layer.'},schema:[]},create(e){let t=w(e),n=V(t),s=n?H(n):null,r=n?d.dirname(n):null;if(!s||!r||!t)return{};let a=d.isAbsolute(t)?t:d.resolve(t),l=d.relative(r,a).split(d.sep).join("/");if(!K(s,l))return{};let c=s.layers?.find(p=>p.name===x(l,s.layers));if(!c)return{};let g=new Set(Q(c));if(g.size===0)return{};let m=(p,i,o,u)=>{if(o||typeof i!="string"||$(i,c.forbiddenGlobals??[]))return;let f=X(i);!f||!g.has(f)||k(e,p,"deniedCapability",{ruleId:"CAPABILITY_VIOLATION",file:l,fromLayer:c.name,target:i,capability:f,edgeKind:u,message:`${c.name} denies the ${f} capability; found import of "${i}".`},{layer:c.name,capability:f,specifier:i})};return{ImportDeclaration(p){let i=p,o=(i.specifiers??[]).filter(f=>f.type==="ImportSpecifier"),u=o.length>0&&o.length===(i.specifiers??[]).length&&o.every(f=>f.importKind==="type");m(p,i.source?.value,i.importKind==="type"||u,"import")},ImportExpression(p){let i=p;i.source?.type==="Literal"&&m(p,i.source.value,!1,"dynamic-import")},TSImportEqualsDeclaration(p){let i=p;m(p,i.moduleReference?.expression?.value,i.importKind==="type"||i.isTypeOnly===!0,"require")},ExportNamedDeclaration(p){let i=p;if(!i.source)return;let o=i.specifiers??[],u=o.length>0&&o.every(f=>f.exportKind==="type");m(p,i.source.value,i.exportKind==="type"||u,"export")},ExportAllDeclaration(p){let i=p;m(p,i.source?.value,i.exportKind==="type","export")},CallExpression(p){let i=p;i.callee?.type==="Identifier"&&i.callee.name==="require"&&i.arguments?.[0]?.type==="Literal"&&!L(e,p,"require")&&m(p,i.arguments[0].value,!1,"require")}}}},Ve={"no-domain-infra-imports":Te,"no-raw-event-publish":je,"require-publish-source":De,"no-forbidden-globals":Me,"no-denied-capabilities":Fe},F={rules:Ve};F.configs={recommended:{plugins:{ark:F},rules:{"ark/no-domain-infra-imports":"error","ark/no-raw-event-publish":"error","ark/require-publish-source":"error","ark/no-forbidden-globals":"error","ark/no-denied-capabilities":"error"}}};var tt=F;export{tt as default,V as findConfigPath,C as globToRegExp,z as isEdgeDenied,x as layerForRelativePath,H as loadArkConfig,Fe as noDeniedCapabilities,Te as noDomainInfraImports,Me as noForbiddenGlobals,je as noRawEventPublish,Y as patternSpecificity,F as plugin,De as requirePublishSource,Le as resolveRelativeImport};