arkgate 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,12 @@
1
1
  /** Read-only-first `ark upgrade` orchestration. Managed identity logic lives separately. */
2
2
  import { spawnSync } from 'node:child_process';
3
+ import fs from 'node:fs';
3
4
  import { createRequire } from 'node:module';
4
5
  import path from 'node:path';
5
6
 
7
+ import { arkCommand } from '../ark-shared.mjs';
6
8
  import { describePackageVersionDualTruth } from './field-install.mjs';
9
+ import { __packageRoot } from './gate-files.mjs';
7
10
  import {
8
11
  applyManagedUpgrade,
9
12
  managedUpgradeJson,
@@ -17,6 +20,259 @@ function installedCli(root) {
17
20
  return path.join(path.dirname(packageJson), 'bin', 'ark.mjs');
18
21
  }
19
22
 
23
+ /**
24
+ * Resolve the project's installed arkgate package.json.
25
+ * Shallow `node_modules/arkgate` first, then Node module resolution (hoisted monorepos).
26
+ * @returns {string|null} absolute path to package.json, or null when not installed for this root
27
+ */
28
+ export function resolveProjectArkgatePackageJson(root) {
29
+ const resolvedRoot = path.resolve(root);
30
+ const shallow = path.join(resolvedRoot, 'node_modules', 'arkgate', 'package.json');
31
+ if (fs.existsSync(shallow)) return shallow;
32
+ try {
33
+ const requireFromProject = createRequire(path.join(resolvedRoot, 'package.json'));
34
+ return requireFromProject.resolve('arkgate/package.json');
35
+ } catch {
36
+ return null;
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Compare numeric major.minor.patch cores (prerelease / build ignored).
42
+ * @returns {-1|0|1}
43
+ */
44
+ export function compareSemverCore(a, b) {
45
+ const parse = (value) => {
46
+ const core = String(value ?? '')
47
+ .trim()
48
+ .replace(/^v/i, '')
49
+ .split(/[-+]/)[0];
50
+ const parts = core.split('.').map((part) => {
51
+ const n = Number.parseInt(part, 10);
52
+ return Number.isFinite(n) ? n : 0;
53
+ });
54
+ return [parts[0] || 0, parts[1] || 0, parts[2] || 0];
55
+ };
56
+ const left = parse(a);
57
+ const right = parse(b);
58
+ for (let i = 0; i < 3; i += 1) {
59
+ if (left[i] < right[i]) return -1;
60
+ if (left[i] > right[i]) return 1;
61
+ }
62
+ return 0;
63
+ }
64
+
65
+ /** True when candidate is the same path as root or a descendant (after resolve). */
66
+ export function isPathInside(candidate, root) {
67
+ const resolvedCandidate = path.resolve(candidate);
68
+ const resolvedRoot = path.resolve(root);
69
+ if (resolvedCandidate === resolvedRoot) return true;
70
+ const relative = path.relative(resolvedRoot, resolvedCandidate);
71
+ return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);
72
+ }
73
+
74
+ function tryRealpath(filePath) {
75
+ try {
76
+ return fs.realpathSync(filePath);
77
+ } catch {
78
+ return path.resolve(filePath);
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Recovery guidance for refused upgrades. Prefer package-manager-aware
84
+ * `arkCommand` (works for hoisted monorepos where nested `--root` has no shallow
85
+ * `node_modules/arkgate`). Shallow `node …/ark.mjs` is secondary and install-root only.
86
+ * @param {string} root
87
+ */
88
+ export function recoveryUseLocal(root) {
89
+ const preferred = arkCommand(root, 'arkgate', 'upgrade …');
90
+ return (
91
+ `Use the project-local CLI (package-manager runner preferred):\n` +
92
+ ` ${preferred}\n` +
93
+ `From the workspace install root you may also run:\n` +
94
+ ` node node_modules/arkgate/bin/ark.mjs upgrade …\n` +
95
+ `Hoisted monorepos: prefer the package-manager form above — nested packages may lack a shallow node_modules/arkgate path.`
96
+ );
97
+ }
98
+
99
+ /**
100
+ * @param {{
101
+ * root?: string,
102
+ * cliVersion: string|null,
103
+ * projectVersion: string|null,
104
+ * cliPackageRoot: string,
105
+ * kind: 'older' | 'unknown-cli' | 'project-unreadable',
106
+ * projectPkgPath?: string,
107
+ * }} detail
108
+ */
109
+ function staleCliRefuseMessage(detail) {
110
+ const { cliVersion, projectVersion, cliPackageRoot, kind, projectPkgPath } = detail;
111
+ const recovery = recoveryUseLocal(detail.root ?? '.');
112
+ if (kind === 'project-unreadable') {
113
+ const where = projectPkgPath ? ` at ${projectPkgPath}` : '';
114
+ const cliPart = cliVersion
115
+ ? `this CLI (v${cliVersion} at ${cliPackageRoot})`
116
+ : `this CLI (unknown version at ${cliPackageRoot})`;
117
+ return (
118
+ `Refusing ark upgrade: cannot read the project's arkgate version${where}; ${cliPart} is outside the install tree.\n` +
119
+ `Use the project-local binary so managed upgrade can resolve a real install.\n` +
120
+ recovery
121
+ );
122
+ }
123
+
124
+ const versionLine =
125
+ kind === 'unknown-cli' || !cliVersion
126
+ ? `Refusing ark upgrade: this CLI (unknown version at ${cliPackageRoot}) is outside the project's arkgate install ` +
127
+ `(v${projectVersion}).`
128
+ : `Refusing ark upgrade: this CLI (v${cliVersion} at ${cliPackageRoot}) is older than the project's arkgate (v${projectVersion}).`;
129
+
130
+ // Pre-managed era (before content-identity / plan-digest, ~3.8.0): mutative 2.x wording.
131
+ const preManaged = !cliVersion || compareSemverCore(cliVersion, '3.8.0') < 0;
132
+ const second = preManaged
133
+ ? 'Global/stale arkgate 2.x mutates skills and is unsafe next to 3.8+/4.0 managed upgrade.'
134
+ : 'Older outside-tree CLI must not manage a newer project install; use the project-local binary.';
135
+
136
+ return `${versionLine}\n${second}\n${recovery}`;
137
+ }
138
+
139
+ /**
140
+ * Fail-closed when this process is a global/stale arkgate CLI older than the
141
+ * project's installed arkgate. Legacy global 2.x mutates skills; a newer
142
+ * project pin must not be managed by an older outside-tree binary.
143
+ *
144
+ * Allow: no local install; CLI package root inside the project install tree
145
+ * (realpath); running CLI version >= project installed version (including newer globals).
146
+ *
147
+ * @param {string} root project root for --root
148
+ * @param {{
149
+ * cliVersion?: string|null,
150
+ * cliPackageRoot?: string|null,
151
+ * projectPackageJsonPath?: string|null,
152
+ * }} [options]
153
+ * @returns {{ refuse: boolean, reason: string, message?: string, cliVersion?: string|null, projectVersion?: string|null, cliPackageRoot?: string|null, projectPackageRoot?: string|null }}
154
+ */
155
+ export function evaluateStaleUpgradeCli(root, options = {}) {
156
+ const projectPkgPath =
157
+ options.projectPackageJsonPath ?? resolveProjectArkgatePackageJson(root);
158
+ if (!projectPkgPath || !fs.existsSync(projectPkgPath)) {
159
+ return { refuse: false, reason: 'no-local-arkgate' };
160
+ }
161
+
162
+ const cliPackageRoot = tryRealpath(options.cliPackageRoot ?? __packageRoot);
163
+ const projectPackageRoot = tryRealpath(path.dirname(projectPkgPath));
164
+
165
+ // Project-local CLI (node_modules/arkgate or same realpath via pnpm link) is always trusted.
166
+ if (isPathInside(cliPackageRoot, projectPackageRoot)) {
167
+ let projectVersion = null;
168
+ try {
169
+ const pkg = JSON.parse(fs.readFileSync(projectPkgPath, 'utf8'));
170
+ projectVersion = typeof pkg.version === 'string' ? pkg.version : null;
171
+ } catch {
172
+ /* local path still trusted */
173
+ }
174
+ return {
175
+ refuse: false,
176
+ reason: 'project-local-cli',
177
+ cliVersion: options.cliVersion ?? null,
178
+ projectVersion,
179
+ cliPackageRoot,
180
+ projectPackageRoot,
181
+ };
182
+ }
183
+
184
+ // Outside tree: need a readable project version to compare; fail closed if we cannot prove safety.
185
+ let projectVersion = null;
186
+ try {
187
+ const pkg = JSON.parse(fs.readFileSync(projectPkgPath, 'utf8'));
188
+ projectVersion = typeof pkg.version === 'string' ? pkg.version : null;
189
+ } catch {
190
+ return {
191
+ refuse: true,
192
+ reason: 'project-unreadable',
193
+ message: staleCliRefuseMessage({
194
+ root,
195
+ cliVersion: typeof options.cliVersion === 'string' ? options.cliVersion : null,
196
+ projectVersion: null,
197
+ cliPackageRoot,
198
+ kind: 'project-unreadable',
199
+ projectPkgPath,
200
+ }),
201
+ cliVersion: typeof options.cliVersion === 'string' ? options.cliVersion : null,
202
+ projectVersion: null,
203
+ cliPackageRoot,
204
+ projectPackageRoot,
205
+ };
206
+ }
207
+ if (!projectVersion) {
208
+ return {
209
+ refuse: true,
210
+ reason: 'project-version-missing',
211
+ message: staleCliRefuseMessage({
212
+ root,
213
+ cliVersion: typeof options.cliVersion === 'string' ? options.cliVersion : null,
214
+ projectVersion: null,
215
+ cliPackageRoot,
216
+ kind: 'project-unreadable',
217
+ projectPkgPath,
218
+ }),
219
+ cliVersion: typeof options.cliVersion === 'string' ? options.cliVersion : null,
220
+ projectVersion: null,
221
+ cliPackageRoot,
222
+ projectPackageRoot,
223
+ };
224
+ }
225
+
226
+ const cliVersion =
227
+ typeof options.cliVersion === 'string' && options.cliVersion
228
+ ? options.cliVersion
229
+ : null;
230
+ if (!cliVersion) {
231
+ return {
232
+ refuse: true,
233
+ reason: 'outside-tree-unknown-version',
234
+ message: staleCliRefuseMessage({
235
+ root,
236
+ cliVersion: null,
237
+ projectVersion,
238
+ cliPackageRoot,
239
+ kind: 'unknown-cli',
240
+ }),
241
+ cliVersion,
242
+ projectVersion,
243
+ cliPackageRoot,
244
+ projectPackageRoot,
245
+ };
246
+ }
247
+
248
+ if (compareSemverCore(cliVersion, projectVersion) < 0) {
249
+ return {
250
+ refuse: true,
251
+ reason: 'stale-outside-cli',
252
+ message: staleCliRefuseMessage({
253
+ root,
254
+ cliVersion,
255
+ projectVersion,
256
+ cliPackageRoot,
257
+ kind: 'older',
258
+ }),
259
+ cliVersion,
260
+ projectVersion,
261
+ cliPackageRoot,
262
+ projectPackageRoot,
263
+ };
264
+ }
265
+
266
+ return {
267
+ refuse: false,
268
+ reason: 'outside-cli-ok',
269
+ cliVersion,
270
+ projectVersion,
271
+ cliPackageRoot,
272
+ projectPackageRoot,
273
+ };
274
+ }
275
+
20
276
  function previewArgs(args) {
21
277
  const next = ['upgrade', '--root', args.root, '--no-install'];
22
278
  if (args.tools) next.push('--tools', args.tools);
@@ -31,15 +287,22 @@ function quote(value) {
31
287
  return /^[A-Za-z0-9_./:@=-]+$/.test(text) ? text : `'${text.replace(/'/g, `'"'"'`)}'`;
32
288
  }
33
289
 
34
- function nextCommand(args, planDigest) {
35
- const parts = ['ark', 'upgrade', '--apply', '--root', args.root];
36
- if (!args.install) parts.push('--no-install');
37
- if (!args.install && planDigest) parts.push('--plan-digest', planDigest);
38
- if (args.tools) parts.push('--tools', args.tools);
39
- if (args.acceptConflicts) parts.push('--accept-conflicts');
40
- if (!args.strict) parts.push('--no-strict');
41
- if (args.json) parts.push('--json');
42
- return parts.map(quote).join(' ');
290
+ /**
291
+ * Project-local nextCommand (never bare PATH `ark`) so paste-from-preview cannot re-hit global 2.x.
292
+ * Uses package-manager-aware runner (`npx` / `pnpm exec` / `yarn`) + `arkgate` bin name.
293
+ * @param {{ root: string, install?: boolean, tools?: string, acceptConflicts?: boolean, strict?: boolean, json?: boolean }} args
294
+ * @param {string|null|undefined} planDigest
295
+ */
296
+ export function buildUpgradeNextCommand(args, planDigest) {
297
+ const flagParts = ['upgrade', '--apply', '--root', args.root];
298
+ if (!args.install) flagParts.push('--no-install');
299
+ if (!args.install && planDigest) flagParts.push('--plan-digest', planDigest);
300
+ if (args.tools) flagParts.push('--tools', args.tools);
301
+ if (args.acceptConflicts) flagParts.push('--accept-conflicts');
302
+ if (!args.strict) flagParts.push('--no-strict');
303
+ if (args.json) flagParts.push('--json');
304
+ const argsStr = flagParts.map(quote).join(' ');
305
+ return arkCommand(args.root, 'arkgate', argsStr);
43
306
  }
44
307
 
45
308
  function verify(root, json, arkCheck, runArkCheck) {
@@ -55,6 +318,44 @@ function verify(root, json, arkCheck, runArkCheck) {
55
318
 
56
319
  export function runUpgradeCommand(args, dependencies) {
57
320
  const root = args.root;
321
+ // Fail closed before install/plan when PATH resolves a global/stale CLI older
322
+ // than the project's installed arkgate (field footgun: Homebrew 2.x next to 3.8+/4.0).
323
+ const staleGuard =
324
+ typeof dependencies?.evaluateStaleUpgradeCli === 'function'
325
+ ? dependencies.evaluateStaleUpgradeCli(root, {
326
+ cliVersion: dependencies.cliVersion,
327
+ cliPackageRoot: dependencies.cliPackageRoot,
328
+ })
329
+ : evaluateStaleUpgradeCli(root, {
330
+ cliVersion: dependencies?.cliVersion,
331
+ cliPackageRoot: dependencies?.cliPackageRoot,
332
+ });
333
+ if (staleGuard?.refuse) {
334
+ const message = staleGuard.message || 'Refusing ark upgrade: stale CLI.';
335
+ if (args.json) {
336
+ // Machine-readable refuse (same exit 2) so agents parsing stdout JSON are not blind.
337
+ console.log(
338
+ JSON.stringify(
339
+ {
340
+ refused: true,
341
+ reason: staleGuard.reason,
342
+ message,
343
+ cliVersion: staleGuard.cliVersion ?? null,
344
+ projectVersion: staleGuard.projectVersion ?? null,
345
+ cliPackageRoot: staleGuard.cliPackageRoot ?? null,
346
+ projectPackageRoot: staleGuard.projectPackageRoot ?? null,
347
+ nextCommand: arkCommand(root, 'arkgate', 'upgrade …'),
348
+ },
349
+ null,
350
+ 2
351
+ )
352
+ );
353
+ } else {
354
+ console.error(message);
355
+ }
356
+ return 2;
357
+ }
358
+
58
359
  if (args.apply && args.install) {
59
360
  const skip =
60
361
  typeof dependencies.shouldSkipArkgateInstall === 'function'
@@ -78,13 +379,23 @@ export function runUpgradeCommand(args, dependencies) {
78
379
  if (exitCode !== 0) {
79
380
  if (args.json && install.stderr) console.error(install.stderr.trim());
80
381
  const recovery = `${command} ${commandArgs.join(' ')}`;
382
+ const rePreview = arkCommand(
383
+ root,
384
+ 'arkgate',
385
+ [
386
+ 'upgrade',
387
+ '--no-install',
388
+ '--root',
389
+ quote(root),
390
+ ...(args.tools ? ['--tools', args.tools] : []),
391
+ ...(!args.strict ? ['--no-strict'] : []),
392
+ ...(args.json ? ['--json'] : []),
393
+ ].join(' ')
394
+ );
81
395
  console.error(
82
396
  `Package update failed (exit ${exitCode}). Fix the install and re-run:\n` +
83
397
  ` ${recovery}\n` +
84
- `Then: ark upgrade --no-install --root ${JSON.stringify(root)}` +
85
- (args.tools ? ` --tools ${args.tools}` : '') +
86
- (!args.strict ? ' --no-strict' : '') +
87
- (args.json ? ' --json' : '')
398
+ `Then: ${rePreview}`
88
399
  );
89
400
  return exitCode;
90
401
  }
@@ -114,7 +425,7 @@ export function runUpgradeCommand(args, dependencies) {
114
425
  const wouldWrite = plan.summary?.wouldWrite ?? 0;
115
426
  const blocked = plan.summary?.blocked ?? 0;
116
427
  const needsApply = wouldWrite > 0 || blocked > 0;
117
- const command = nextCommand(args, plan.planDigest);
428
+ const command = buildUpgradeNextCommand(args, plan.planDigest);
118
429
  if (args.json) {
119
430
  // Always expose nextCommand for digest-bound apply (metadata/manifest optional);
120
431
  // nothingToApply flags when content writes are zero so UIs do not urge apply.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var Ct=Object.defineProperty;var Un=Object.getOwnPropertyDescriptor;var Gn=Object.getOwnPropertyNames;var Bn=Object.prototype.hasOwnProperty;var qn=(e,t)=>{for(var n in t)Ct(e,n,{get:t[n],enumerable:!0})},zn=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Gn(t))!Bn.call(e,r)&&r!==n&&Ct(e,r,{get:()=>t[r],enumerable:!(s=Un(t,r))||s.enumerable});return e};var Kn=e=>zn(Ct({},"__esModule",{value:!0}),e);var ms={};qn(ms,{ANALYSIS_IR_SCHEMA_VERSION:()=>rt,ARK_ANALYSIS_RESULT_SCHEMA:()=>Qt,ARK_ANALYSIS_RESULT_SCHEMA_VERSION:()=>Zt,ARK_CONFIG_SCHEMA:()=>Xe,ARK_CONFIG_SCHEMA_VERSION:()=>pn,ARK_DESIGN_DELTA_SCHEMA_VERSION:()=>Vn,ARK_ENFORCEMENT_STATE_SCHEMA_VERSION:()=>Hn,ARK_RULES_SCHEMA:()=>it,ARK_RULES_SCHEMA_VERSION:()=>vn,ARK_RULE_SENSORS:()=>Ut,EffectiveContractError:()=>Ve,POLICY_DELTA_SCHEMA_VERSION:()=>ut,RESOLVED_CANDIDATE_FACTS_SCHEMA:()=>nt,RESOLVED_CANDIDATE_FACTS_SCHEMA_VERSION:()=>Q,analyzeArchitectureConvergence:()=>ae,analyzeChange:()=>Ge,analyzePolicyDelta:()=>Gt,analyzeProject:()=>Re,analyzeResolvedProject:()=>Ie,buildArkRuleFileHints:()=>Rt,buildEffectiveArkRules:()=>at,buildRulesInventory:()=>Dn,canPromoteInvariant:()=>ct,classifyArkPolicyDelta:()=>ft,collectAnalysisConfigWarnings:()=>qe,collectEmptyAppliesToFindings:()=>bt,collectForbiddenCapabilityUses:()=>se,createAICodeGate:()=>Dt,createAdapterResult:()=>Xt,createArchitectureProfile:()=>Te,createArchitectureProfileFromArkConfig:()=>Ht,createElevenLayerArkConfig:()=>Vt,createResolvedCandidateFacts:()=>tt,deriveArkRuleFileHints:()=>qt,detectArchitectureCycles:()=>gt,deterministicHash:()=>w,effectiveContractPolicyPayload:()=>ot,elevenLayerProfile:()=>_e,emptyEffectiveArkRules:()=>te,evaluateArchitectureGraph:()=>de,evaluateArkRuleSensors:()=>At,evaluateInvariantCoverage:()=>lt,explainViolation:()=>Bt,extractClassShapesFromSource:()=>Tn,extractSemanticDependencies:()=>re,inventoryToExtractionCard:()=>Mn,loadArkConfigContract:()=>Le,loadArkRulesContract:()=>He,loadContract:()=>Ue,loadResolvedCandidateFacts:()=>J,parseArkConfigJson:()=>et,parseArkRulesJson:()=>In,policyDeltaAcknowledgementMatches:()=>yt,preflightChange:()=>zt,preflightResolvedChange:()=>Kt,resolveEffectiveContract:()=>En,resolvedFactsEvidenceRequirementsHash:()=>Ae,stableSerialize:()=>S,toAdapterDiagnostic:()=>Ke,version:()=>Wt});module.exports=Kn(ms);var Wt="4.0.0";var Zt="1.4";function I(e){return typeof e=="string"&&e.length>0?e:void 0}function Jt(e,t){return Number.isInteger(e)&&Number(e)>0?Number(e):t}function Yn(e,t,n){if(e==="LAYER_IMPORT_VIOLATION")return 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.`;if(e==="FORBIDDEN_GLOBAL")return`Inject ${t.target??"the capability"} through a port, then preflight again.`;if(e==="CAPABILITY_VIOLATION")return`Define a ${I(n.capability)??"capability"} port in ${t.fromLayer??"the walled layer"}, bind the implementation outside it, then preflight again.`;if(e==="CIRCULAR_DEPENDENCY")return"Extract the shared dependency into a third module, then preflight again.";if(e==="RAW_EVENT_PUBLISH")return"Publish through a registered intent creator, then run Ark again.";if(e==="PUBLISH_MISSING_SOURCE")return"Add metadata.source to the publish call, then run Ark again.";if(e==="ARKRULE_STRUCTURE"||e==="ARKRULE_INVARIANT"||e==="INVARIANT_UNCOVERED"||e.startsWith("ARKRULE_")){let s=t.arkruleSource??"arkrules/<Layer>.json";return`Fix the structure or invariant for ${t.arkruleId??"the ArkRule"} (declared in ${s}), then preflight again. Do not demote the rule without a hash-bound policy acknowledgement.`}return`Resolve ${e} without weakening ark.config.json, then run Ark again.`}function Ke(e,t="error"){let n=I(e.ruleId)??I(e.code)??"ARK_UNKNOWN",s=e.severity==="warning"?"warning":t,r={...I(e.target)?{target:I(e.target)}:{},...I(e.fromLayer)?{fromLayer:I(e.fromLayer)}:{},...I(e.toLayer)?{toLayer:I(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}:{},...I(e.capability)?{capability:I(e.capability)}:{},...I(e.edgeKind)?{edgeKind:I(e.edgeKind)}:{},...I(e.arkruleId)?{arkruleId:I(e.arkruleId)}:{},...I(e.arkruleSource)?{arkruleSource:I(e.arkruleSource)}:{}};return{ruleId:n,severity:s,message:I(e.message)??n,location:{file:I(e.file)??"<unknown>",line:Jt(e.line,1),column:Jt(e.column,1)},evidence:r,nextAction:I(e.nextAction)??Yn(n,r,e)}}function Xt(e){let t=e.completeness??"complete",n=e.mode??"lexical-compatibility";if(t==="complete"&&(e.completenessReasons?.length??0)>0)throw new Error("completenessReasons must be empty when completeness is complete.");let s=t==="complete"?[]:e.completenessReasons&&e.completenessReasons.length>0?e.completenessReasons.map(c=>({code:I(c.code)??"ANALYSIS_EVIDENCE_INCOMPLETE",message:I(c.message)??`Analysis ${t}: required evidence is incomplete.`,...I(c.file)?{file:I(c.file)}:{}})):[{code:t==="unavailable"?"ANALYSIS_UNAVAILABLE":"ANALYSIS_EVIDENCE_INCOMPLETE",message:`Analysis ${t}: required evidence is incomplete.`}],r={...I(e.policyHash)?{policyHash:I(e.policyHash)}:{},...I(e.resolverIdentity)?{resolverIdentity:I(e.resolverIdentity)}:{},...I(e.factsHash)?{factsHash:I(e.factsHash)}:{},...I(e.candidateTreeHash)?{candidateTreeHash:I(e.candidateTreeHash)}:{}};if(n==="resolved-candidate-facts"&&t!=="unavailable"){for(let c of["policyHash","resolverIdentity","factsHash","candidateTreeHash"])if(!r[c])throw new Error(`${c} is required for resolved ${t} adapter evidence.`)}let i=[...(e.violations??[]).map(c=>Ke(c,"error")),...(e.warnings??[]).map(c=>Ke(c,"warning"))],a={schemaVersion:"1.4",completenessReasons:s,diagnostics:i};if(n==="resolved-candidate-facts"){if(t==="unavailable")return{...a,mode:n,valid:!1,completeness:t,...r};let c={policyHash:r.policyHash,resolverIdentity:r.resolverIdentity,factsHash:r.factsHash,candidateTreeHash:r.candidateTreeHash};return t==="complete"?{...a,mode:n,valid:e.valid,completeness:t,...c}:{...a,mode:n,valid:!1,completeness:t,...c}}return t==="complete"?{...a,mode:n,valid:e.valid,completeness:t,...r}:{...a,mode:n,valid:!1,completeness:t,...r}}var Qt={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://unpkg.com/arkgate@3/schemas/ark.analysis-result.schema.json",title:"ArkGate analysis result",type:"object",additionalProperties:!1,required:["schemaVersion","mode","valid","completeness","completenessReasons","diagnostics"],allOf:[{if:{properties:{completeness:{enum:["partial","unavailable"]}},required:["completeness"]},then:{properties:{valid:{const:!1}}}},{if:{properties:{mode:{const:"resolved-candidate-facts"},completeness:{enum:["complete","partial"]}},required:["mode","completeness"]},then:{required:["policyHash","resolverIdentity","factsHash","candidateTreeHash"]}},{if:{properties:{completeness:{const:"complete"}},required:["completeness"]},then:{properties:{completenessReasons:{maxItems:0}}},else:{properties:{completenessReasons:{minItems:1}}}}],properties:{schemaVersion:{const:"1.4"},mode:{enum:["lexical-compatibility","resolved-candidate-facts"]},valid:{type:"boolean"},completeness:{enum:["complete","partial","unavailable"]},completenessReasons:{type:"array",items:{type:"object",additionalProperties:!1,required:["code","message"],properties:{code:{type:"string",minLength:1},message:{type:"string",minLength:1},file:{type:"string",minLength:1}}}},policyHash:{type:"string",minLength:1},resolverIdentity:{type:"string",minLength:1},factsHash:{type:"string",minLength:1},candidateTreeHash:{type:"string",minLength:1},diagnostics:{type:"array",items:{type:"object",additionalProperties:!1,required:["ruleId","severity","message","location","evidence"],properties:{ruleId:{type:"string",minLength:1},severity:{enum:["error","warning"]},message:{type:"string",minLength:1},location:{type:"object",additionalProperties:!1,required:["file","line","column"],properties:{file:{type:"string",minLength:1},line:{type:"integer",minimum:1},column:{type:"integer",minimum:1}}},evidence:{type:"object",additionalProperties:!1,properties:{target:{type:"string"},fromLayer:{type:"string"},toLayer:{type:"string"},typeOnly:{type:"boolean"},targetTypeOnlyExports:{type:"boolean"},sourcePureTypeModule:{type:"boolean"},namedBindingsTypeOnly:{type:"boolean"},portProofEligible:{type:"boolean"},peerIsolation:{type:"boolean"},capability:{type:"string",minLength:1},edgeKind:{type:"string",minLength:1},arkruleId:{type:"string",minLength:1},arkruleSource:{type:"string",minLength:1}}},nextAction:{type:"string",minLength:1}}}}}};var St=Object.freeze(["network","filesystem","clock","randomness","environment","process","persistence"]),xt=Object.freeze({fetch:"network",XMLHttpRequest:"network",Date:"clock","Date.now":"clock","Math.random":"randomness","process.env":"environment",process:"process"}),wt=Object.freeze(Object.keys(xt).sort()),Et=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"}),kt=Object.freeze({process:Object.freeze(["process","node:process"])});function Se(e){if(!e||e.startsWith(".")||e.startsWith("/"))return null;let t=Et[e];if(t)return t;let n=e.indexOf("/");if(n<0)return null;let s=e.slice(0,n),r=Et[s];if(r)return r;let i=e.indexOf("/",n+1);return i<0?null:Et[e.slice(0,i)]??null}function Z(e,t){for(let n of t)if(kt[n]?.includes(e))return n;return null}function Ye(e){let t=e.split(".");for(let n=t.length;n>=1;n-=1){let s=t.slice(0,n).join("."),r=xt[s];if(r)return r}return null}function ue(e){if(e?.pure===!0)return[...St].sort();let n=(e?.capabilities?.deny??[]).filter(s=>St.includes(s));return[...new Set(n)].sort()}function ke(e,t){if(t.length===0)return!1;let n=new Set(t),s=e.split(".");for(let r=s.length;r>=1;r-=1)if(n.has(s.slice(0,r).join(".")))return!0;return!1}function We(e){let t=new Set,n=new Set,s=Object.keys(xt);for(let r of e?.forbiddenGlobals??[]){let i=s.filter(a=>a===r||a.startsWith(`${r}.`));if(i.length===0)n.add(r);else for(let a of i)t.add(`ambient:${a}`);for(let a of kt[r]??[])t.add(`import-exact:${a}`)}for(let r of ue(e)){if(t.add(`import:${r}`),r==="process")for(let i of kt.process)t.add(`import-exact:${i}`);for(let i of s)Ye(i)===r&&t.add(`ambient:${i}`)}return{atoms:[...t].sort(),rawGlobals:[...n].sort()}}var en=new Map;function tn(e){return/[.*+?^${}()|[\]\\]/.test(e)?`\\${e}`:e}function $t(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 Wn(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 ne(e){let t=en.get(e);if(t)return t;let n=$t(e),s=Wn(n),r="",i=0;for(let c=0;c<n.length;c+=1){let p=n[c];p==="\\"&&c+1<n.length?(r+=tn(n[c+1]),c+=1):p==="*"?n[c+1]==="*"?n[c+2]==="/"?(r+="(?:.*/)?",c+=2):(r+=".*",c+=1):r+="[^/]*":p==="?"?r+="[^/]":p==="{"&&s?(r+="(?:",i+=1):p==="}"&&s&&i>0?(r+=")",i-=1):p===","&&s&&i>0?r+="|":r+=tn(p)}let a=new RegExp(`^${r}$`);return en.set(e,a),a}function Pt(e){let t=$t(String(e)),s=t.split("*")[0].split("/").filter(Boolean).length,r=t.replace(/\*/g,"").length;return s*1e4+r}function z(e,t){let n=String(e).split(/[/\\]/).join("/"),s,r=-1;for(let i of t??[])if(!(i.exclude??[]).some(a=>ne(a).test(n))){for(let a of i.patterns??[])if(ne(a).test(n)){let c=Pt(a);c>r&&(r=c,s=i.name)}}return s}function nn(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 Jn(e){let t=new Set;for(let n of e??[]){let r=$t(String(n)).split("/").filter(Boolean);for(let i=0;i<r.length;i+=1){let a=r[i];if((a==="**"||a==="*")&&i>0){let c=r[i-1];c&&!c.includes("*")&&!c.includes("{")&&!c.includes("}")&&t.add(c)}}}return[...t]}function Zn(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 Jn(s?.patterns)}function K(e,t,n,s){for(let r of e??[])if(!(r.from!==t||r.to!==n)&&r.allowed===!1){if(r.peerIsolation){let i=s?.fromPath,a=s?.toPath;if(!i||!a)return r;let c=Zn(r,t,s?.layers);if(c.length===0)return r;let p=nn(i,c),y=nn(a,c);if(!p||!y||p!==y)return r;continue}if(t!==n)return r}}function fe(e,t){return t&&e.isStringLiteralLike(t)?t.text:void 0}function an(e,t){return e.getLineAndCharacterOfPosition(t.getStart(e)).line+1}function rn(e,t){if(e.isImportDeclaration(t)){let s=t.importClause;if(!s)return!1;if(s.isTypeOnly)return!0;let r=s.namedBindings;return!!(r&&e.isNamedImports(r)&&r.elements.length>0&&r.elements.every(i=>i.isTypeOnly))}if(t.isTypeOnly)return!0;let n=t.exportClause;return!!(n&&e.isNamedExports(n)&&n.elements.length>0&&n.elements.every(s=>s.isTypeOnly))}function on(e,t){let n={noLib:!0,noResolve:!0,target:e.ScriptTarget.Latest},s=e.createCompilerHost(n,!0);return s.getSourceFile=r=>r===t.fileName?t:void 0,s.fileExists=r=>r===t.fileName,s.readFile=r=>r===t.fileName?t.text:void 0,e.createProgram([t.fileName],n,s).getTypeChecker()}function Ot(e,t){try{return e.getSymbolAtLocation(t)}catch{return}}function Lt(e,t,n,s){let r=s.parent&&e.isShorthandPropertyAssignment(s.parent)&&s.parent.name===s,i;try{i=r?t.getShorthandAssignmentValueSymbol(s.parent):Ot(t,s)}catch{i=void 0}return!!i?.declarations?.some(a=>a.getSourceFile().fileName===n.fileName)}function re(e,t){let n,s=[],r=(a,c,p,y=!1)=>s.push({specifier:p,kind:c,line:an(t,a),typeOnly:y,unresolved:p===void 0,node:a}),i=a=>{if(e.isImportDeclaration(a))r(a,"import",fe(e,a.moduleSpecifier),rn(e,a));else if(e.isExportDeclaration(a)&&a.moduleSpecifier)r(a,"export",fe(e,a.moduleSpecifier),rn(e,a));else if(e.isImportEqualsDeclaration(a)&&e.isExternalModuleReference(a.moduleReference))r(a,"require",fe(e,a.moduleReference.expression),a.isTypeOnly===!0);else if(e.isCallExpression(a)){let c=a.expression.kind===e.SyntaxKind.ImportKeyword,y=e.isIdentifier(a.expression)&&a.expression.text==="require"&&!Lt(e,n??(n=on(e,t)),t,a.expression);(c||y)&&r(a,y?"require":"dynamic-import",fe(e,a.arguments[0]))}e.forEachChild(a,i)};return i(t),s}function Xn(e,t){let n=[],s=t;for(;e.isPropertyAccessExpression(s)||e.isElementAccessExpression(s);){if(e.isPropertyAccessExpression(s))n.unshift(s.name.text);else{let r=fe(e,s.argumentExpression);if(r===void 0)return;n.unshift(r)}s=s.expression}if(e.isIdentifier(s))return n.unshift(s.text),{root:s,segments:n}}function Qn(e,t){let n=t.parent;return e.isPropertyAccessExpression(n)||e.isElementAccessExpression(n)?!1:e.isExpressionNode(t)&&!e.isInTypeQuery(t)||e.isShorthandPropertyAssignment(n)&&n.name===t}function sn(e,t){let n=t[0]==="globalThis"?t.slice(1):t;for(let s=n.length;s>=1;s-=1){let r=n.slice(0,s).join(".");if(e.has(r))return r}}function se(e,t,n){if(n.length===0)return[];let s=new Set(n),r=on(e,t),i=new Map,a=new Set;for(let o of t.statements)if(e.isVariableStatement(o))for(let l of o.declarationList.declarations)e.isIdentifier(l.name)&&a.add(l.name.text);let c=o=>{let l=Xn(e,o);if(!l)return;let g=Ot(r,l.root),u=g?i.get(g):void 0;return u?[...u,...l.segments.slice(1)]:Lt(e,r,t,l.root)||a.has(l.root.text)?void 0:l.segments};for(let o of t.statements)if(e.isVariableStatement(o))for(let l of o.declarationList.declarations){if(!l.initializer||!e.isIdentifier(l.name))continue;let g=c(l.initializer),u=Ot(r,l.name);!g||!u||i.set(u,g)}let p=[],y=new Set,h=(o,l)=>{let g=an(t,l),u=`${o}:${l.getStart(t)}`;y.has(u)||(y.add(u),p.push({name:o,line:g,node:l}))},m=o=>{let l=o.parent&&(e.isPropertyAccessExpression(o.parent)||e.isElementAccessExpression(o.parent))&&o.parent.expression===o;if((e.isPropertyAccessExpression(o)||e.isElementAccessExpression(o))&&!l){let g=c(o),u=g?sn(s,g):void 0;u&&h(u,o)}else e.isIdentifier(o)&&s.has(o.text)&&Qn(e,o)&&!Lt(e,r,t,o)&&h(o.text,o);if(e.isVariableDeclaration(o)&&e.isObjectBindingPattern(o.name)&&o.initializer){let g=c(o.initializer);if(g)for(let u of o.name.elements){if(!e.isIdentifier(u.name))continue;let b=u.propertyName?fe(e,u.propertyName)??u.propertyName.text:u.name.text,v=sn(s,[...g,b]);v&&h(v,o.initializer)}}e.forEachChild(o,m)};return m(t),p}function _t(e,t,n){let s=[];for(let r of n?.dependencies??re(e,t)){if(r.typeOnly||!r.specifier)continue;let i=Se(r.specifier);i&&s.push({capability:i,symbol:r.specifier,line:r.line,source:"import-based"})}for(let r of n?.ambientUses??se(e,t,wt)){let i=Ye(r.name);i&&s.push({capability:i,symbol:r.name,line:r.line,source:"ambient-global"})}return s.sort((r,i)=>r.line-i.line||r.capability.localeCompare(i.capability)||r.symbol.localeCompare(i.symbol))}var Tt={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."},Ft=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 Nt(e,t){return t.flatMap((s,r)=>(s.prefixes??s.intentPrefixes??[]).map(i=>({layer:s.name,layerIndex:r,prefix:i.endsWith(".")?i:`${i}.`}))).filter(({prefix:s})=>e.startsWith(s)).sort((s,r)=>r.prefix.length-s.prefix.length||s.layerIndex-r.layerIndex)[0]?.layer}function ie(e){return/^(Domain|Application|Adapter|Workflow|Job|Presentation|Reporting|Metadata|Security|Audit|Observability|Kernel)\.[A-Za-z0-9_.]+$/.test(e)}function xe(e){if(!e.publishCall)return[];let t=[];return(e.rawIntentName!==void 0&&ie(e.rawIntentName)||e.objectHasIntent)&&t.push({ruleId:"RAW_EVENT_PUBLISH",message:Tt.RAW_EVENT_PUBLISH}),e.arkPublishCandidate&&!e.hasSource&&t.push({ruleId:"PUBLISH_MISSING_SOURCE",message:Tt.PUBLISH_MISSING_SOURCE}),t}function x(e,t,n){return{ruleId:e,code:e,message:t,...n}}function ye(e,t){return e.slice(0,t).split(`
1
+ "use strict";var Ct=Object.defineProperty;var Un=Object.getOwnPropertyDescriptor;var Gn=Object.getOwnPropertyNames;var Bn=Object.prototype.hasOwnProperty;var qn=(e,t)=>{for(var n in t)Ct(e,n,{get:t[n],enumerable:!0})},zn=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Gn(t))!Bn.call(e,r)&&r!==n&&Ct(e,r,{get:()=>t[r],enumerable:!(s=Un(t,r))||s.enumerable});return e};var Kn=e=>zn(Ct({},"__esModule",{value:!0}),e);var ms={};qn(ms,{ANALYSIS_IR_SCHEMA_VERSION:()=>rt,ARK_ANALYSIS_RESULT_SCHEMA:()=>Qt,ARK_ANALYSIS_RESULT_SCHEMA_VERSION:()=>Zt,ARK_CONFIG_SCHEMA:()=>Xe,ARK_CONFIG_SCHEMA_VERSION:()=>pn,ARK_DESIGN_DELTA_SCHEMA_VERSION:()=>Vn,ARK_ENFORCEMENT_STATE_SCHEMA_VERSION:()=>Hn,ARK_RULES_SCHEMA:()=>it,ARK_RULES_SCHEMA_VERSION:()=>vn,ARK_RULE_SENSORS:()=>Ut,EffectiveContractError:()=>Ve,POLICY_DELTA_SCHEMA_VERSION:()=>ut,RESOLVED_CANDIDATE_FACTS_SCHEMA:()=>nt,RESOLVED_CANDIDATE_FACTS_SCHEMA_VERSION:()=>Q,analyzeArchitectureConvergence:()=>ae,analyzeChange:()=>Ge,analyzePolicyDelta:()=>Gt,analyzeProject:()=>Re,analyzeResolvedProject:()=>Ie,buildArkRuleFileHints:()=>Rt,buildEffectiveArkRules:()=>at,buildRulesInventory:()=>Dn,canPromoteInvariant:()=>ct,classifyArkPolicyDelta:()=>ft,collectAnalysisConfigWarnings:()=>qe,collectEmptyAppliesToFindings:()=>bt,collectForbiddenCapabilityUses:()=>se,createAICodeGate:()=>Dt,createAdapterResult:()=>Xt,createArchitectureProfile:()=>Te,createArchitectureProfileFromArkConfig:()=>Ht,createElevenLayerArkConfig:()=>Vt,createResolvedCandidateFacts:()=>tt,deriveArkRuleFileHints:()=>qt,detectArchitectureCycles:()=>gt,deterministicHash:()=>w,effectiveContractPolicyPayload:()=>ot,elevenLayerProfile:()=>_e,emptyEffectiveArkRules:()=>te,evaluateArchitectureGraph:()=>de,evaluateArkRuleSensors:()=>At,evaluateInvariantCoverage:()=>lt,explainViolation:()=>Bt,extractClassShapesFromSource:()=>Tn,extractSemanticDependencies:()=>re,inventoryToExtractionCard:()=>Mn,loadArkConfigContract:()=>Le,loadArkRulesContract:()=>He,loadContract:()=>Ue,loadResolvedCandidateFacts:()=>J,parseArkConfigJson:()=>et,parseArkRulesJson:()=>In,policyDeltaAcknowledgementMatches:()=>yt,preflightChange:()=>zt,preflightResolvedChange:()=>Kt,resolveEffectiveContract:()=>En,resolvedFactsEvidenceRequirementsHash:()=>Ae,stableSerialize:()=>S,toAdapterDiagnostic:()=>Ke,version:()=>Wt});module.exports=Kn(ms);var Wt="4.0.1";var Zt="1.4";function I(e){return typeof e=="string"&&e.length>0?e:void 0}function Jt(e,t){return Number.isInteger(e)&&Number(e)>0?Number(e):t}function Yn(e,t,n){if(e==="LAYER_IMPORT_VIOLATION")return 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.`;if(e==="FORBIDDEN_GLOBAL")return`Inject ${t.target??"the capability"} through a port, then preflight again.`;if(e==="CAPABILITY_VIOLATION")return`Define a ${I(n.capability)??"capability"} port in ${t.fromLayer??"the walled layer"}, bind the implementation outside it, then preflight again.`;if(e==="CIRCULAR_DEPENDENCY")return"Extract the shared dependency into a third module, then preflight again.";if(e==="RAW_EVENT_PUBLISH")return"Publish through a registered intent creator, then run Ark again.";if(e==="PUBLISH_MISSING_SOURCE")return"Add metadata.source to the publish call, then run Ark again.";if(e==="ARKRULE_STRUCTURE"||e==="ARKRULE_INVARIANT"||e==="INVARIANT_UNCOVERED"||e.startsWith("ARKRULE_")){let s=t.arkruleSource??"arkrules/<Layer>.json";return`Fix the structure or invariant for ${t.arkruleId??"the ArkRule"} (declared in ${s}), then preflight again. Do not demote the rule without a hash-bound policy acknowledgement.`}return`Resolve ${e} without weakening ark.config.json, then run Ark again.`}function Ke(e,t="error"){let n=I(e.ruleId)??I(e.code)??"ARK_UNKNOWN",s=e.severity==="warning"?"warning":t,r={...I(e.target)?{target:I(e.target)}:{},...I(e.fromLayer)?{fromLayer:I(e.fromLayer)}:{},...I(e.toLayer)?{toLayer:I(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}:{},...I(e.capability)?{capability:I(e.capability)}:{},...I(e.edgeKind)?{edgeKind:I(e.edgeKind)}:{},...I(e.arkruleId)?{arkruleId:I(e.arkruleId)}:{},...I(e.arkruleSource)?{arkruleSource:I(e.arkruleSource)}:{}};return{ruleId:n,severity:s,message:I(e.message)??n,location:{file:I(e.file)??"<unknown>",line:Jt(e.line,1),column:Jt(e.column,1)},evidence:r,nextAction:I(e.nextAction)??Yn(n,r,e)}}function Xt(e){let t=e.completeness??"complete",n=e.mode??"lexical-compatibility";if(t==="complete"&&(e.completenessReasons?.length??0)>0)throw new Error("completenessReasons must be empty when completeness is complete.");let s=t==="complete"?[]:e.completenessReasons&&e.completenessReasons.length>0?e.completenessReasons.map(c=>({code:I(c.code)??"ANALYSIS_EVIDENCE_INCOMPLETE",message:I(c.message)??`Analysis ${t}: required evidence is incomplete.`,...I(c.file)?{file:I(c.file)}:{}})):[{code:t==="unavailable"?"ANALYSIS_UNAVAILABLE":"ANALYSIS_EVIDENCE_INCOMPLETE",message:`Analysis ${t}: required evidence is incomplete.`}],r={...I(e.policyHash)?{policyHash:I(e.policyHash)}:{},...I(e.resolverIdentity)?{resolverIdentity:I(e.resolverIdentity)}:{},...I(e.factsHash)?{factsHash:I(e.factsHash)}:{},...I(e.candidateTreeHash)?{candidateTreeHash:I(e.candidateTreeHash)}:{}};if(n==="resolved-candidate-facts"&&t!=="unavailable"){for(let c of["policyHash","resolverIdentity","factsHash","candidateTreeHash"])if(!r[c])throw new Error(`${c} is required for resolved ${t} adapter evidence.`)}let i=[...(e.violations??[]).map(c=>Ke(c,"error")),...(e.warnings??[]).map(c=>Ke(c,"warning"))],a={schemaVersion:"1.4",completenessReasons:s,diagnostics:i};if(n==="resolved-candidate-facts"){if(t==="unavailable")return{...a,mode:n,valid:!1,completeness:t,...r};let c={policyHash:r.policyHash,resolverIdentity:r.resolverIdentity,factsHash:r.factsHash,candidateTreeHash:r.candidateTreeHash};return t==="complete"?{...a,mode:n,valid:e.valid,completeness:t,...c}:{...a,mode:n,valid:!1,completeness:t,...c}}return t==="complete"?{...a,mode:n,valid:e.valid,completeness:t,...r}:{...a,mode:n,valid:!1,completeness:t,...r}}var Qt={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://unpkg.com/arkgate@3/schemas/ark.analysis-result.schema.json",title:"ArkGate analysis result",type:"object",additionalProperties:!1,required:["schemaVersion","mode","valid","completeness","completenessReasons","diagnostics"],allOf:[{if:{properties:{completeness:{enum:["partial","unavailable"]}},required:["completeness"]},then:{properties:{valid:{const:!1}}}},{if:{properties:{mode:{const:"resolved-candidate-facts"},completeness:{enum:["complete","partial"]}},required:["mode","completeness"]},then:{required:["policyHash","resolverIdentity","factsHash","candidateTreeHash"]}},{if:{properties:{completeness:{const:"complete"}},required:["completeness"]},then:{properties:{completenessReasons:{maxItems:0}}},else:{properties:{completenessReasons:{minItems:1}}}}],properties:{schemaVersion:{const:"1.4"},mode:{enum:["lexical-compatibility","resolved-candidate-facts"]},valid:{type:"boolean"},completeness:{enum:["complete","partial","unavailable"]},completenessReasons:{type:"array",items:{type:"object",additionalProperties:!1,required:["code","message"],properties:{code:{type:"string",minLength:1},message:{type:"string",minLength:1},file:{type:"string",minLength:1}}}},policyHash:{type:"string",minLength:1},resolverIdentity:{type:"string",minLength:1},factsHash:{type:"string",minLength:1},candidateTreeHash:{type:"string",minLength:1},diagnostics:{type:"array",items:{type:"object",additionalProperties:!1,required:["ruleId","severity","message","location","evidence"],properties:{ruleId:{type:"string",minLength:1},severity:{enum:["error","warning"]},message:{type:"string",minLength:1},location:{type:"object",additionalProperties:!1,required:["file","line","column"],properties:{file:{type:"string",minLength:1},line:{type:"integer",minimum:1},column:{type:"integer",minimum:1}}},evidence:{type:"object",additionalProperties:!1,properties:{target:{type:"string"},fromLayer:{type:"string"},toLayer:{type:"string"},typeOnly:{type:"boolean"},targetTypeOnlyExports:{type:"boolean"},sourcePureTypeModule:{type:"boolean"},namedBindingsTypeOnly:{type:"boolean"},portProofEligible:{type:"boolean"},peerIsolation:{type:"boolean"},capability:{type:"string",minLength:1},edgeKind:{type:"string",minLength:1},arkruleId:{type:"string",minLength:1},arkruleSource:{type:"string",minLength:1}}},nextAction:{type:"string",minLength:1}}}}}};var St=Object.freeze(["network","filesystem","clock","randomness","environment","process","persistence"]),xt=Object.freeze({fetch:"network",XMLHttpRequest:"network",Date:"clock","Date.now":"clock","Math.random":"randomness","process.env":"environment",process:"process"}),wt=Object.freeze(Object.keys(xt).sort()),Et=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"}),kt=Object.freeze({process:Object.freeze(["process","node:process"])});function Se(e){if(!e||e.startsWith(".")||e.startsWith("/"))return null;let t=Et[e];if(t)return t;let n=e.indexOf("/");if(n<0)return null;let s=e.slice(0,n),r=Et[s];if(r)return r;let i=e.indexOf("/",n+1);return i<0?null:Et[e.slice(0,i)]??null}function Z(e,t){for(let n of t)if(kt[n]?.includes(e))return n;return null}function Ye(e){let t=e.split(".");for(let n=t.length;n>=1;n-=1){let s=t.slice(0,n).join("."),r=xt[s];if(r)return r}return null}function ue(e){if(e?.pure===!0)return[...St].sort();let n=(e?.capabilities?.deny??[]).filter(s=>St.includes(s));return[...new Set(n)].sort()}function ke(e,t){if(t.length===0)return!1;let n=new Set(t),s=e.split(".");for(let r=s.length;r>=1;r-=1)if(n.has(s.slice(0,r).join(".")))return!0;return!1}function We(e){let t=new Set,n=new Set,s=Object.keys(xt);for(let r of e?.forbiddenGlobals??[]){let i=s.filter(a=>a===r||a.startsWith(`${r}.`));if(i.length===0)n.add(r);else for(let a of i)t.add(`ambient:${a}`);for(let a of kt[r]??[])t.add(`import-exact:${a}`)}for(let r of ue(e)){if(t.add(`import:${r}`),r==="process")for(let i of kt.process)t.add(`import-exact:${i}`);for(let i of s)Ye(i)===r&&t.add(`ambient:${i}`)}return{atoms:[...t].sort(),rawGlobals:[...n].sort()}}var en=new Map;function tn(e){return/[.*+?^${}()|[\]\\]/.test(e)?`\\${e}`:e}function $t(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 Wn(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 ne(e){let t=en.get(e);if(t)return t;let n=$t(e),s=Wn(n),r="",i=0;for(let c=0;c<n.length;c+=1){let p=n[c];p==="\\"&&c+1<n.length?(r+=tn(n[c+1]),c+=1):p==="*"?n[c+1]==="*"?n[c+2]==="/"?(r+="(?:.*/)?",c+=2):(r+=".*",c+=1):r+="[^/]*":p==="?"?r+="[^/]":p==="{"&&s?(r+="(?:",i+=1):p==="}"&&s&&i>0?(r+=")",i-=1):p===","&&s&&i>0?r+="|":r+=tn(p)}let a=new RegExp(`^${r}$`);return en.set(e,a),a}function Pt(e){let t=$t(String(e)),s=t.split("*")[0].split("/").filter(Boolean).length,r=t.replace(/\*/g,"").length;return s*1e4+r}function z(e,t){let n=String(e).split(/[/\\]/).join("/"),s,r=-1;for(let i of t??[])if(!(i.exclude??[]).some(a=>ne(a).test(n))){for(let a of i.patterns??[])if(ne(a).test(n)){let c=Pt(a);c>r&&(r=c,s=i.name)}}return s}function nn(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 Jn(e){let t=new Set;for(let n of e??[]){let r=$t(String(n)).split("/").filter(Boolean);for(let i=0;i<r.length;i+=1){let a=r[i];if((a==="**"||a==="*")&&i>0){let c=r[i-1];c&&!c.includes("*")&&!c.includes("{")&&!c.includes("}")&&t.add(c)}}}return[...t]}function Zn(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 Jn(s?.patterns)}function K(e,t,n,s){for(let r of e??[])if(!(r.from!==t||r.to!==n)&&r.allowed===!1){if(r.peerIsolation){let i=s?.fromPath,a=s?.toPath;if(!i||!a)return r;let c=Zn(r,t,s?.layers);if(c.length===0)return r;let p=nn(i,c),y=nn(a,c);if(!p||!y||p!==y)return r;continue}if(t!==n)return r}}function fe(e,t){return t&&e.isStringLiteralLike(t)?t.text:void 0}function an(e,t){return e.getLineAndCharacterOfPosition(t.getStart(e)).line+1}function rn(e,t){if(e.isImportDeclaration(t)){let s=t.importClause;if(!s)return!1;if(s.isTypeOnly)return!0;let r=s.namedBindings;return!!(r&&e.isNamedImports(r)&&r.elements.length>0&&r.elements.every(i=>i.isTypeOnly))}if(t.isTypeOnly)return!0;let n=t.exportClause;return!!(n&&e.isNamedExports(n)&&n.elements.length>0&&n.elements.every(s=>s.isTypeOnly))}function on(e,t){let n={noLib:!0,noResolve:!0,target:e.ScriptTarget.Latest},s=e.createCompilerHost(n,!0);return s.getSourceFile=r=>r===t.fileName?t:void 0,s.fileExists=r=>r===t.fileName,s.readFile=r=>r===t.fileName?t.text:void 0,e.createProgram([t.fileName],n,s).getTypeChecker()}function Ot(e,t){try{return e.getSymbolAtLocation(t)}catch{return}}function Lt(e,t,n,s){let r=s.parent&&e.isShorthandPropertyAssignment(s.parent)&&s.parent.name===s,i;try{i=r?t.getShorthandAssignmentValueSymbol(s.parent):Ot(t,s)}catch{i=void 0}return!!i?.declarations?.some(a=>a.getSourceFile().fileName===n.fileName)}function re(e,t){let n,s=[],r=(a,c,p,y=!1)=>s.push({specifier:p,kind:c,line:an(t,a),typeOnly:y,unresolved:p===void 0,node:a}),i=a=>{if(e.isImportDeclaration(a))r(a,"import",fe(e,a.moduleSpecifier),rn(e,a));else if(e.isExportDeclaration(a)&&a.moduleSpecifier)r(a,"export",fe(e,a.moduleSpecifier),rn(e,a));else if(e.isImportEqualsDeclaration(a)&&e.isExternalModuleReference(a.moduleReference))r(a,"require",fe(e,a.moduleReference.expression),a.isTypeOnly===!0);else if(e.isCallExpression(a)){let c=a.expression.kind===e.SyntaxKind.ImportKeyword,y=e.isIdentifier(a.expression)&&a.expression.text==="require"&&!Lt(e,n??(n=on(e,t)),t,a.expression);(c||y)&&r(a,y?"require":"dynamic-import",fe(e,a.arguments[0]))}e.forEachChild(a,i)};return i(t),s}function Xn(e,t){let n=[],s=t;for(;e.isPropertyAccessExpression(s)||e.isElementAccessExpression(s);){if(e.isPropertyAccessExpression(s))n.unshift(s.name.text);else{let r=fe(e,s.argumentExpression);if(r===void 0)return;n.unshift(r)}s=s.expression}if(e.isIdentifier(s))return n.unshift(s.text),{root:s,segments:n}}function Qn(e,t){let n=t.parent;return e.isPropertyAccessExpression(n)||e.isElementAccessExpression(n)?!1:e.isExpressionNode(t)&&!e.isInTypeQuery(t)||e.isShorthandPropertyAssignment(n)&&n.name===t}function sn(e,t){let n=t[0]==="globalThis"?t.slice(1):t;for(let s=n.length;s>=1;s-=1){let r=n.slice(0,s).join(".");if(e.has(r))return r}}function se(e,t,n){if(n.length===0)return[];let s=new Set(n),r=on(e,t),i=new Map,a=new Set;for(let o of t.statements)if(e.isVariableStatement(o))for(let l of o.declarationList.declarations)e.isIdentifier(l.name)&&a.add(l.name.text);let c=o=>{let l=Xn(e,o);if(!l)return;let g=Ot(r,l.root),u=g?i.get(g):void 0;return u?[...u,...l.segments.slice(1)]:Lt(e,r,t,l.root)||a.has(l.root.text)?void 0:l.segments};for(let o of t.statements)if(e.isVariableStatement(o))for(let l of o.declarationList.declarations){if(!l.initializer||!e.isIdentifier(l.name))continue;let g=c(l.initializer),u=Ot(r,l.name);!g||!u||i.set(u,g)}let p=[],y=new Set,h=(o,l)=>{let g=an(t,l),u=`${o}:${l.getStart(t)}`;y.has(u)||(y.add(u),p.push({name:o,line:g,node:l}))},m=o=>{let l=o.parent&&(e.isPropertyAccessExpression(o.parent)||e.isElementAccessExpression(o.parent))&&o.parent.expression===o;if((e.isPropertyAccessExpression(o)||e.isElementAccessExpression(o))&&!l){let g=c(o),u=g?sn(s,g):void 0;u&&h(u,o)}else e.isIdentifier(o)&&s.has(o.text)&&Qn(e,o)&&!Lt(e,r,t,o)&&h(o.text,o);if(e.isVariableDeclaration(o)&&e.isObjectBindingPattern(o.name)&&o.initializer){let g=c(o.initializer);if(g)for(let u of o.name.elements){if(!e.isIdentifier(u.name))continue;let b=u.propertyName?fe(e,u.propertyName)??u.propertyName.text:u.name.text,v=sn(s,[...g,b]);v&&h(v,o.initializer)}}e.forEachChild(o,m)};return m(t),p}function _t(e,t,n){let s=[];for(let r of n?.dependencies??re(e,t)){if(r.typeOnly||!r.specifier)continue;let i=Se(r.specifier);i&&s.push({capability:i,symbol:r.specifier,line:r.line,source:"import-based"})}for(let r of n?.ambientUses??se(e,t,wt)){let i=Ye(r.name);i&&s.push({capability:i,symbol:r.name,line:r.line,source:"ambient-global"})}return s.sort((r,i)=>r.line-i.line||r.capability.localeCompare(i.capability)||r.symbol.localeCompare(i.symbol))}var Tt={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."},Ft=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 Nt(e,t){return t.flatMap((s,r)=>(s.prefixes??s.intentPrefixes??[]).map(i=>({layer:s.name,layerIndex:r,prefix:i.endsWith(".")?i:`${i}.`}))).filter(({prefix:s})=>e.startsWith(s)).sort((s,r)=>r.prefix.length-s.prefix.length||s.layerIndex-r.layerIndex)[0]?.layer}function ie(e){return/^(Domain|Application|Adapter|Workflow|Job|Presentation|Reporting|Metadata|Security|Audit|Observability|Kernel)\.[A-Za-z0-9_.]+$/.test(e)}function xe(e){if(!e.publishCall)return[];let t=[];return(e.rawIntentName!==void 0&&ie(e.rawIntentName)||e.objectHasIntent)&&t.push({ruleId:"RAW_EVENT_PUBLISH",message:Tt.RAW_EVENT_PUBLISH}),e.arkPublishCandidate&&!e.hasSource&&t.push({ruleId:"PUBLISH_MISSING_SOURCE",message:Tt.PUBLISH_MISSING_SOURCE}),t}function x(e,t,n){return{ruleId:e,code:e,message:t,...n}}function ye(e,t){return e.slice(0,t).split(`
2
2
  `).length}function er(e){let t=[],n=/['"`]([A-Za-z][A-Za-z0-9_.]*)['"`]/g,s;for(;(s=n.exec(e))!==null;)t.push({value:s[1],index:s.index});return t}function tr(e){let t=[],n=[{kind:"import",re:/\bimport\s+(?:type\s+)?(?:[^'"]*?\s+from\s*)?['"]([^'"]+)['"]/g},{kind:"export",re:/\bexport\s+(?:type\s+)?[^'"]*?\s+from\s*['"]([^'"]+)['"]/g},{kind:"dynamic-import",re:/\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/g},{kind:"require",re:/\brequire\s*\(\s*['"]([^'"]+)['"]\s*\)/g}];for(let s of n){let r;for(;(r=s.re.exec(e))!==null;){let i=r.index+r[0].indexOf(r[1]),a=r[0],c=s.kind==="import"&&/\bimport\s+type\b/.test(a)||s.kind==="export"&&/\bexport\s+type\b/.test(a);t.push({value:r[1],index:i,kind:s.kind,typeOnly:c})}}return t.sort((s,r)=>s.index-r.index)}function nr(e,t){let n=e.createSourceFile("generated.ts",t,e.ScriptTarget.Latest,!0),s=[],r=i=>{e.isStringLiteralLike(i)&&s.push({value:i.text,index:i.getStart(n)}),e.forEachChild(i,r)};return r(n),s}function rr(e){let t=e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);return["adapter","adapters","infra","infrastructure","persistence","repository","repositories","integration","database","db"].some(n=>t.includes(n))}function sr(e){let t=e.toLowerCase();return["sequelize","prisma","typeorm","mongoose","knex"].some(n=>t===n||t.startsWith(`${n}/`))}function ir(e){let t=e.toLowerCase();return["adapter","infra","persistence","repository","repositories","integration","database"].some(n=>t.includes(n))}function $e(e,t){return t&&e.isStringLiteralLike(t)?t.text:void 0}function ar(e,t){if(t&&(e.isIdentifier(t)||e.isStringLiteralLike(t)))return t.text}function ln(e,t,n){if(!(!t||!e.isObjectLiteralExpression(t)))return t.properties.find(s=>!e.isPropertyAssignment(s)&&!e.isShorthandPropertyAssignment(s)?!1:ar(e,s.name)===n)}function Pe(e,t,n){return ln(e,t,n)!==void 0}function we(e,t,n){let s=ln(e,t,n);return s&&e.isPropertyAssignment(s)?s.initializer:void 0}function or(e,t){let n=we(e,t,"metadata");return Pe(e,n,"source")}function cn(e,t){return t?e.isIdentifier(t)?/^[A-Z]/.test(t.text):e.isPropertyAccessExpression(t)?cn(e,t.name):!1:!1}function lr(e,t){if(!e.isCallExpression(t))return!1;let n=t.expression;return e.isPropertyAccessExpression(n)?n.name.text==="publish":e.isIdentifier(n)&&n.text==="publish"}function cr(e,t){if(!e.isCallExpression(t))return!1;let n=t.arguments[0],s=$e(e,n);return s!==void 0&&ie(s)||Pe(e,n,"intent")||cn(e,n)}function dr(e,t){if(!e.isCallExpression(t))return!1;let[n,s,r]=t.arguments;return or(e,n)||Pe(e,s,"source")||Pe(e,r,"source")}function pr(e,t){if(!e.isCallExpression(t))return;let[n,s,r]=t.arguments,i=we(e,n,"metadata");return $e(e,we(e,i,"source"))??$e(e,we(e,s,"source"))??$e(e,we(e,r,"source"))}function ur(e,t,n,s){let r=e.createSourceFile("generated.ts",t,e.ScriptTarget.Latest,!0),i=n,a=i?.filePath,c=i?.layer,p=[],y=m=>r.getLineAndCharacterOfPosition(m.getStart(r)).line+1,h=m=>{if(lr(e,m)){let o=m.arguments[0],l=$e(e,o);for(let u of xe({publishCall:!0,rawIntentName:l,objectHasIntent:Pe(e,o,"intent"),arkPublishCandidate:cr(e,m),hasSource:dr(e,m)}))p.push(x(u.ruleId,u.message,{line:y(m),filePath:a}));let g=pr(e,m);if(s&&c&&g&&ie(g)){let u=s.resolveLayer(g);u&&u!==c&&p.push(x("PUBLISH_SOURCE_LAYER_MISMATCH",`Publish source "${g}" resolves to ${u}, but the target file is classified as ${c}.`,{line:y(m),filePath:a,target:g,fromLayer:c,toLayer:u}))}}e.forEachChild(m,h)};return h(r),p}function Dt(e={}){let t=new Set((e.intents||[]).map(i=>typeof i=="string"?i:i.name)),n=e.forbiddenPatterns||[],s=new Set(e.infrastructureLayers??[]),r=e.enforceIntentAllowlist??t.size>0;return{validate(i,a){let c=[],p=a,y=p?.filePath,h=p?.layer,m=e.typescript,o=m?m.createSourceFile(y??"generated.ts",i,m.ScriptTarget.Latest,!0):void 0,l=o?re(e.typescript,o):void 0,g=l?l.filter(d=>d.specifier!==void 0).map(d=>({value:d.specifier,index:d.node.getStart(o),kind:d.kind,typeOnly:d.typeOnly})):tr(i),u=e.typescript?nr(e.typescript,i):er(i);if(e.typescript&&!e.allowNonLiteralDynamicImport?.(y))for(let d of l?.filter(({unresolved:f})=>f)??[]){let f=d.kind==="require";c.push(x(f?"DYNAMIC_REQUIRE_NOT_ALLOWLISTED":"DYNAMIC_IMPORT_NOT_ALLOWLISTED",`Non-literal ${f?"require call":"dynamic import"} cannot be resolved statically; add the reviewed file to dynamicImportAllowlist.`,{line:d.line,filePath:y}))}let b=h!==void 0&&(s.has(h)||ir(h)),v=h!==void 0?` If "${h}" is an infrastructure layer, mark it in ark.config.json with "mayImportInfrastructure": true (or name it with an infra token like Adapters/Persistence/Repository).`:"";for(let d of n)if(d instanceof RegExp){d.lastIndex=0;let f=d.exec(i);d.lastIndex=0,f&&c.push(x("FORBIDDEN_PATTERN",`Forbidden pattern matched: ${d}`,{line:f.index===void 0?void 0:ye(i,f.index),filePath:y,suggestion:"Remove infrastructure imports from domain/application layers."+v}))}else i.includes(d)&&c.push(x("FORBIDDEN_SUBSTRING",`Forbidden substring: ${d}`,{line:ye(i,i.indexOf(d)),filePath:y}));for(let d of g){let f=e.resolveImportTarget?.(d.value,y)??(e.resolveImportLayer?{layer:e.resolveImportLayer(d.value,y)}:void 0),R=typeof y=="string"?e.resolveImportTarget?.(y)??(e.resolveImportLayer?{layer:h,relPath:void 0}:void 0):void 0,E=f?.layer;if(E&&h){let O=K(e.architectureProfile?.rules,h,E,{fromPath:R?.relPath,toPath:f?.relPath,layers:e.architectureLayers});if(O){if(d.typeOnly&&!O.peerIsolation)continue;let L=!!O.peerIsolation;c.push(x("LAYER_IMPORT_VIOLATION",O.message??(L?`Layer "${h}" must not import across slices into "${E}".`:`Layer "${h}" must not import "${E}".`),{line:ye(i,d.index),source:d.value,target:d.value,filePath:y,fromLayer:h,toLayer:E,suggestion:L?"Extract shared code to a shared layer, or coordinate slices via events/ports \u2014 do not import across feature/context slices.":"Depend on a port/interface owned by an inner layer instead, or move this code to a layer allowed to make this import.",details:{importKind:d.kind,peerIsolation:L,...d.typeOnly?{typeOnly:!0}:{}}}));continue}continue}b||d.typeOnly||!rr(d.value)&&!sr(d.value)||c.push(x("FORBIDDEN_IMPORT",`Forbidden ${d.kind} target: "${d.value}".`,{line:ye(i,d.index),source:d.value,target:d.value,filePath:y,suggestion:"Route infrastructure access through an allowed adapter or port boundary."+v,details:{importKind:d.kind}}))}if(e.policies)for(let d of e.policies){let f=d.check({source:i,context:a});if(f!==!0)if(Array.isArray(f))for(let R of f)c.push(x("POLICY_VIOLATION",R.message,{filePath:y,suggestion:`Fix violation of policy "${d.name}".`}));else f===!1?c.push(x("POLICY_VIOLATION",`Policy ${d.name} failed on generated code`)):c.push(x("POLICY_VIOLATION",f.message))}if(r&&t.size>0)for(let d of u)ie(d.value)&&!t.has(d.value)&&c.push(x("UNKNOWN_INTENT",`Unknown intent reference: "${d.value}"`,{line:ye(i,d.index),filePath:y,target:d.value,suggestion:`Register intent "${d.value}" via defineIntent() or remove the reference.`}));if(e.architectureProfile&&h)for(let d of u){if(!ie(d.value))continue;let f=e.architectureProfile.resolveLayer(d.value);if(!f)continue;let R=K(e.architectureProfile.rules,h,f);R&&c.push(x("LAYER_REFERENCE_VIOLATION",R.message??`Layer "${h}" must not reference "${f}" through "${d.value}".`,{line:ye(i,d.index),filePath:y,target:d.value,fromLayer:h,toLayer:f,suggestion:"Route the dependency through an allowed intent, port, or event.",details:{rule:R}}))}if(e.extensions)for(let d of e.extensions)try{let f=d.analyze(i,a);c.push(...f)}catch(f){c.push(x("EXTENSION_ERROR",`Extension "${d.name}" failed: ${f instanceof Error?f.message:String(f)}`))}if(e.typescript&&o&&h&&e.forbiddenGlobals?.[h]?.length)try{let d=e.forbiddenGlobals[h];c.push(...se(e.typescript,o,d).map(f=>x("FORBIDDEN_GLOBAL",`${h} must not use the ambient global "${f.name}".`,{line:f.line,filePath:y,target:f.name,fromLayer:h,suggestion:"Inject the capability through a port (e.g. a Clock, IdGenerator, or HttpPort) instead of reaching for the ambient global."})));for(let f of l??[]){if(f.typeOnly||!f.specifier)continue;let R=Z(f.specifier,d);R&&c.push(x("FORBIDDEN_GLOBAL",`${h} must not use module "${f.specifier}" because it is the import form of forbidden global "${R}".`,{line:f.line,filePath:y,source:f.specifier,target:f.specifier,fromLayer:h,details:{importKind:f.kind,forbiddenGlobal:R},suggestion:"Inject the capability through a port instead of importing the ambient global module form."}))}}catch(d){c.push(x("AST_ANALYZER_ERROR",`TypeScript AST analyzer failed: ${d instanceof Error?d.message:String(d)}`))}if(e.typescript&&o&&h&&e.capabilityWalls?.[h]?.length)try{let d=new Set(e.capabilityWalls[h]),f=e.forbiddenGlobals?.[h]??[];for(let R of _t(e.typescript,o))d.has(R.capability)&&(R.source==="ambient-global"&&ke(R.symbol,f)||R.source==="import-based"&&Z(R.symbol,f)||c.push(x("CAPABILITY_VIOLATION",R.source==="import-based"?`${h} denies the ${R.capability} capability; found import of "${R.symbol}".`:`${h} denies the ${R.capability} capability; found ambient "${R.symbol}".`,{line:R.line,filePath:y,target:R.symbol,capability:R.capability,fromLayer:h,suggestion:"Define a small port (ClockPort, HttpPort, StoragePort) and bind the implementation in an adapter layer."})))}catch(d){c.push(x("AST_ANALYZER_ERROR",`TypeScript AST analyzer failed: ${d instanceof Error?d.message:String(d)}`))}if(e.typescript)try{c.push(...ur(e.typescript,i,a,e.architectureProfile))}catch(d){c.push(x("AST_ANALYZER_ERROR",`TypeScript AST analyzer failed: ${d instanceof Error?d.message:String(d)}`))}return{mode:"lexical-compatibility",completeness:"partial",completenessReasons:["LEXICAL_EVIDENCE_INCOMPLETE"],valid:!1,lexicalValid:c.length===0,violations:c}}}}var pn="1.1",Ze="https://unpkg.com/arkgate@2/schemas/ark.config.schema.json",dn=["DomainModel","ApplicationOrchestration","PersistenceAdapters","IntegrationAdapters","WorkflowSagaEngine","BackgroundJobsScheduling","PresentationAdapters","ReportingReadModels","ExtensibilityMetadata","SecurityAuditObservability","Kernel"],fr=new Set(["PresentationAdapters->ApplicationOrchestration","ApplicationOrchestration->DomainModel","WorkflowSagaEngine->ApplicationOrchestration","WorkflowSagaEngine->DomainModel","BackgroundJobsScheduling->ApplicationOrchestration"]);function yr(){let e=[];for(let t of dn)for(let n of dn)t===n||fr.has(`${t}->${n}`)||e.push({from:t,to:n,allowed:!1});return e}var Qe=yr(),Mt=[{from:"unversioned",to:"1.0"},{from:"1.0",to:"1.1"}],X={type:"array",items:{type:"string",minLength:1},uniqueItems:!0},Xe={$schema:"https://json-schema.org/draft/2020-12/schema",$id:Ze,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:Ze,description:"Editor-facing URL or local path for this JSON Schema."},schemaVersion:{type:"string",const:"1.1",default:"1.1"},name:{type:"string",minLength:1},include:{...X,minItems:1,default:["src"]},exclude:{...X,default:[]},excludeGenerated:{type:"boolean",default:!0},frameworkOverlay:{type:"string",minLength:1},layers:{type:"array",default:[],items:{$ref:"#/$defs/layer"}},rules:{type:"array",default:Qe,items:{$ref:"#/$defs/rule"}},cyclePolicy:{type:"string",enum:["strict","soft","framework-soft","off"],default:"strict"},dynamicImportAllowlist:{...X,default:[]},safety:{$ref:"#/$defs/safety",default:{maxTsSuppressions:0,maxAnyCasts:0,allowInMemory:!1,allowDisabledPeerIsolation:!1}},arkRules:{type:"object",additionalProperties:{type:"string",minLength:1},default:{}}},$defs:{layer:{type:"object",additionalProperties:!1,required:["name","patterns"],properties:{name:{type:"string",minLength:1},patterns:{...X,minItems:1},exclude:X,intentPrefixes:X,description:{type:"string",minLength:1},forbiddenGlobals:X,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:{...X,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}}}}},Y=class extends Error{issues;source;constructor(t,n){super(`Invalid ArkGate config (${t}):
3
3
  ${n.map(s=>`- ${s.path}: ${s.message}`).join(`
4
4
  `)}`),this.name="ArkConfigValidationError",this.source=t,this.issues=n}};function un(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Je(e,t){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(t)?`${e}.${t}`:`${e}[${JSON.stringify(t)}]`}function me(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function mr(e,t){let n="#/$defs/";if(e.startsWith(n))return t.$defs[e.slice(n.length)]}function Oe(e,t,n,s,r){if(t.$ref){let i=mr(t.$ref,s);if(!i){r.push({path:n,message:`schema reference ${t.$ref} cannot be resolved`});return}Oe(e,i,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(i=>Object.is(i,e))){r.push({path:n,message:`must be one of ${t.enum.map(String).join(", ")}`});return}if(t.type==="object"){if(!un(e)){r.push({path:n,message:`must be an object; received ${me(e)}`});return}let i=t.properties??{};for(let a of t.required??[])e[a]===void 0&&r.push({path:Je(n,a),message:"is required"});if(t.additionalProperties===!1)for(let a of Object.keys(e))a in i||r.push({path:Je(n,a),message:"unknown field"});else if(t.additionalProperties!==void 0&&t.additionalProperties!==!0&&typeof t.additionalProperties=="object"){let a=t.additionalProperties;for(let c of Object.keys(e))c in i||Oe(e[c],a,Je(n,c),s,r)}for(let[a,c]of Object.entries(i))e[a]!==void 0&&Oe(e[a],c,Je(n,a),s,r);return}if(t.type==="array"){if(!Array.isArray(e)){r.push({path:n,message:`must be an array; received ${me(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 i=e.map(a=>JSON.stringify(a));new Set(i).size!==i.length&&r.push({path:n,message:"must not contain duplicate items"})}t.items&&e.forEach((i,a)=>Oe(i,t.items,`${n}[${a}]`,s,r));return}if(t.type==="string"){if(typeof e!="string"){r.push({path:n,message:`must be a string; received ${me(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 ${me(e)}`});return}if(t.type==="integer"){if(!Number.isInteger(e)){r.push({path:n,message:`must be an integer; received ${me(e)}`});return}t.minimum!==void 0&&e<t.minimum&&r.push({path:n,message:`must be at least ${t.minimum}`})}}function gr(e){return{...e,$schema:e.$schema===void 0?Ze:e.$schema,schemaVersion:e.schemaVersion===void 0?"1.1":e.schemaVersion,include:e.include===void 0?["src"]:e.include,layers:e.layers===void 0?[]:e.layers,rules:e.rules===void 0?Qe.map(t=>({...t})):e.rules}}function hr(){let e=new Set(["1.1"]);for(let t of Mt)t.from!=="unversioned"&&e.add(t.from),e.add(t.to);return e}function Ar(e,t="ark.config.json"){if(!un(e))throw new Y(t,[{path:"$",message:`must be an object; received ${me(e)}`}]);let n=hr(),s=e.schemaVersion===void 0?"unversioned":typeof e.schemaVersion=="string"?e.schemaVersion:null;if(s===null)throw new Y(t,[{path:"$.schemaVersion",message:`unsupported version ${JSON.stringify(e.schemaVersion)}; expected 1.1`}]);if(s!=="unversioned"&&!n.has(s))throw new Y(t,[{path:"$.schemaVersion",message:`unsupported version ${JSON.stringify(s)}; expected 1.1`}]);let r=s,i={...e},a=0;for(;r!=="1.1"&&a<Mt.length+1;){a+=1;let p=Mt.find(y=>y.from===r);if(!p)throw new Y(t,[{path:"$.schemaVersion",message:`unsupported version ${JSON.stringify(r)}; expected 1.1`}]);r=p.to,i.schemaVersion=r}if(r!=="1.1")throw new Y(t,[{path:"$.schemaVersion",message:`unsupported version ${JSON.stringify(s)}; expected 1.1`}]);let c=s==="unversioned"?"unversioned":s==="1.0"?"1.0":null;return{candidate:gr(i),migratedFrom:c}}function Le(e,t="ark.config.json"){let{candidate:n,migratedFrom:s}=Ar(e,t),r=[];if(Oe(n,Xe,"$",Xe,r),r.length>0)throw new Y(t,r);return{config:n,migratedFrom:s}}function et(e,t="ark.config.json"){let n;try{n=JSON.parse(e)}catch(s){throw new Y(t,[{path:"$",message:`invalid JSON: ${s instanceof Error?s.message:String(s)}`}])}return Le(n,t)}function fn(e){let t={$schema:typeof e.$schema=="string"&&e.$schema.length>0?e.$schema:Ze,schemaVersion:"1.1"};for(let[n,s]of Object.entries(e))n!=="$schema"&&n!=="schemaVersion"&&(t[n]=s);return t}function br(e){return e.endsWith(".")?e:`${e}.`}function Rr(e,t){let n=e.prefixes.length?Math.max(...e.prefixes.map(r=>r.length)):0;return(t.prefixes.length?Math.max(...t.prefixes.map(r=>r.length)):0)-n}function Te(e){let t=e.layers.map(r=>({...r,prefixes:r.prefixes.map(br)})),n=[...t].sort(Rr),s=[...e.rules??[]];return{name:e.name,layers:t,rules:s,resolveLayer(r){return t.find(i=>i.match?.(r))?.name??n.find(i=>i.prefixes.some(a=>r.startsWith(a)))?.name}}}function Ht(e,t={}){return Te({name:t.name??e.name??"ark.config.json",layers:e.layers.map((n,s)=>({name:n.name,prefixes:n.intentPrefixes??[],description:n.description,order:s+1})),rules:e.rules??[]})}var vr=[{name:"DomainModel",prefixes:["Domain"],description:"Rich domain model, business rules, and domain events.",order:1},{name:"ApplicationOrchestration",prefixes:["Application"],description:"Use cases and command orchestration.",order:2},{name:"PersistenceAdapters",prefixes:["Adapter.Persistence","Adapter.Repository"],description:"Database, repository, and storage adapters.",order:3},{name:"IntegrationAdapters",prefixes:["Adapter.Integration","Adapter.External"],description:"External systems, APIs, and integration adapters.",order:4},{name:"WorkflowSagaEngine",prefixes:["Workflow"],description:"Sagas, workflows, and long-running processes.",order:5},{name:"BackgroundJobsScheduling",prefixes:["Job"],description:"Background jobs, scheduled work, and async processors.",order:6},{name:"PresentationAdapters",prefixes:["Presentation","Adapter.Presentation","Adapter.Api"],description:"API, UI, controller, and presentation adapters.",order:7},{name:"ReportingReadModels",prefixes:["Reporting"],description:"Read models, projections, and reporting surfaces.",order:8},{name:"ExtensibilityMetadata",prefixes:["Metadata"],description:"Metadata, extensions, and schema contracts.",order:9},{name:"SecurityAuditObservability",prefixes:["Security","Audit","Observability"],description:"Security, audit, and observability concerns.",order:10},{name:"Kernel",prefixes:["Kernel"],description:"Ark-owned governance and kernel signals.",order:11}],_e=Te({name:"Ark 11-layer Hexagonal Event-Driven Profile",layers:vr,rules:Qe.map(e=>({...e}))}),Ir={DomainModel:["domain"],ApplicationOrchestration:["application","app"],PersistenceAdapters:["adapters/persistence","adapters/repository","repositories","infra/persistence"],IntegrationAdapters:["adapters/integration","adapters/external","integrations"],WorkflowSagaEngine:["workflows","sagas"],BackgroundJobsScheduling:["jobs","schedules"],PresentationAdapters:["presentation","adapters/presentation","adapters/api"],ReportingReadModels:["reporting","read-models","projections"],ExtensibilityMetadata:["metadata","extensions"],SecurityAuditObservability:["security","audit","observability"],Kernel:["kernel"]};function Vt(e={}){let t=e.rootDir??"src",n=e.optionalLayers??!0,s=t==="."?"":`${t}/`;return fn({include:e.include??[t],layers:_e.layers.map(r=>({name:r.name,patterns:(Ir[r.name]??[r.name]).map(i=>`${s}${i}/**`),intentPrefixes:r.prefixes,optional:n})),rules:[..._e.rules]})}function w(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return`fnv1a-${(t>>>0).toString(16).padStart(8,"0")}`}function S(e){if(e===null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(S).join(",")}]`;let t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${S(t[n])}`).join(",")}}`}var Q="1.1";var yn=["network","filesystem","clock","randomness","environment","process","persistence"];function W(e,t){let n=S(e),s=S(t);return n<s?-1:n>s?1:0}function B(e){return[...new Set(e)].sort((t,n)=>t<n?-1:t>n?1:0)}function Ae(e){let t={schemaVersion:"1.1",include:B(e.include??[]),exclude:B(e.exclude??[]),excludeGenerated:e.excludeGenerated!==!1,dynamicImportAllowlist:B(e.dynamicImportAllowlist??[]),layers:e.layers.map(n=>({name:n.name,patterns:B(n.patterns??[]),exclude:B(n.exclude??[]),forbiddenGlobals:B(n.forbiddenGlobals??[]),intentPrefixes:B(n.intentPrefixes??[]),capabilityDeny:B(n.capabilities?.deny??[]),pure:n.pure===!0})).sort(W),safety:{maxTsSuppressions:e.safety?.maxTsSuppressions??0,maxAnyCasts:e.safety?.maxAnyCasts??0,allowInMemory:e.safety?.allowInMemory===!0,allowDisabledPeerIsolation:e.safety?.allowDisabledPeerIsolation===!0}};return w(S(t))}function Cr(e){let t=e.completenessReasons.map(o=>({code:o.code,message:o.message,...o.file?{file:o.file}:{}})).sort(W),n=e.files.map(o=>({...o,typeOnlyExportNames:B(o.typeOnlyExportNames)})).sort((o,l)=>o.path<l.path?-1:o.path>l.path?1:0),s=e.dependencies.map(o=>({...o,...o.namedBindings?{namedBindings:B(o.namedBindings)}:{}})).sort(W),r=e.capabilityUses.map(o=>({...o})).sort(W),i=e.ambientUses.map(o=>({...o})).sort(W),a=e.publishCalls.map(o=>({...o})).sort(W),c=e.intentReferences.map(o=>({...o})).sort(W),p=e.safetyUses.map(o=>({...o})).sort(W),y=(e.classShapes??[]).map(o=>({...o,mutatingMethods:[...o.mutatingMethods??[]].map(l=>({...l}))})).sort(W),h=e.files.map(({path:o,contentHash:l})=>({path:o,contentHash:l})).sort((o,l)=>o.path<l.path?-1:o.path>l.path?1:0),m=w(S(h));return{schemaVersion:"1.1",completeness:e.completeness,completenessReasons:t,resolverIdentity:e.resolverIdentity,compilerIdentity:e.compilerIdentity,compilerOptionsHash:e.compilerOptionsHash,tsconfigHash:e.tsconfigHash,candidateTreeHash:m,evidenceRequirementsHash:e.evidenceRequirementsHash,...e.projectPackageName?{projectPackageName:e.projectPackageName}:{},files:n,dependencies:s,capabilityUses:r,ambientUses:i,publishCalls:a,intentReferences:c,safetyUses:p,classShapes:y}}function gn(e){let t=Cr(e);return{...t,factsHash:w(S(t))}}function tt(e){return gn(An(D(e,"$"),!1))}function D(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object.`);return e}function V(e,t,n){let s=new Set(t),r=Object.keys(e).find(i=>!s.has(i));if(r)throw new Error(`${n}.${r} is not part of schema ${"1.1"}.`)}function P(e,t,n){let s=e[t];if(typeof s!="string"||s.length===0)throw new Error(`${n}.${t} must be a non-empty string.`);return s}function ge(e,t,n){if(e[t]!==void 0)return P(e,t,n)}function U(e,t,n){let s=P(e,t,n),r=s.replace(/\\/g,"/");if(!r||r.startsWith("/")||/^[A-Za-z]:\//.test(r)||/[\u0000-\u001f\u007f]/.test(r))throw new Error(`${n}.${t} must be a canonical project-relative path.`);let i=[];for(let c of r.split("/"))if(!(!c||c==="."))if(c===".."){if(i.length===0)throw new Error(`${n}.${t} must be a canonical project-relative path.`);i.pop()}else i.push(c);let a=i.join("/");if(!a||a!==s)throw new Error(`${n}.${t} must be a canonical project-relative path.`);return a}function $(e,t,n){if(typeof e[t]!="boolean")throw new Error(`${n}.${t} must be a boolean.`);return e[t]}function hn(e,t,n){let s=e[t];if(!Number.isInteger(s)||Number(s)<0)throw new Error(`${n}.${t} must be a non-negative integer.`);return Number(s)}function he(e,t,n){let s=hn(e,t,n);if(s===0)throw new Error(`${n}.${t} must be a positive integer.`);return s}function G(e,t,n){let s=e[t];if(!Array.isArray(s))throw new Error(`${n}.${t} must be an array.`);return s}function ee(e,t,n,s){let r=e[t];if(typeof r!="string"||!n.includes(r))throw new Error(`${s}.${t} must be one of ${n.join(", ")}.`);return r}function mn(e,t){if(!Array.isArray(e)||e.some(n=>typeof n!="string"||!n))throw new Error(`${t} must be an array of non-empty strings.`);return[...e]}function Er(e,t,n){let s=new Set;for(let r of e){let i=t(r);if(s.has(i))throw new Error(`${n} must not contain duplicate facts (${i}).`);s.add(i)}}function An(e,t){V(e,["schemaVersion","completeness","completenessReasons","resolverIdentity","compilerIdentity","compilerOptionsHash","tsconfigHash","evidenceRequirementsHash","projectPackageName","files","dependencies","capabilityUses","ambientUses","publishCalls","intentReferences","safetyUses","classShapes",...t?["candidateTreeHash","factsHash"]:[]],"$");let n=ee(e,"schemaVersion",["1.0","1.1"],"$"),s=ee(e,"completeness",["complete","partial","unavailable"],"$"),r=G(e,"completenessReasons","$").map((b,v)=>{let d=`$.completenessReasons[${v}]`,f=D(b,d);V(f,["code","message","file"],d);let R=f.file===void 0?void 0:U(f,"file",d);return{code:P(f,"code",d),message:P(f,"message",d),...R?{file:R}:{}}});if(s==="complete"&&r.length>0)throw new Error("$.completenessReasons must be empty when completeness is complete.");if(s!=="complete"&&r.length===0)throw new Error("$.completenessReasons must explain partial or unavailable facts.");let i=G(e,"files","$").map((b,v)=>{let d=`$.files[${v}]`,f=D(b,d);return V(f,["path","contentHash","parseStatus","parseDiagnosticCount","exportsOnlyTypes","typeOnlyExportNames","hasTopLevelSideEffects"],d),{path:U(f,"path",d),contentHash:P(f,"contentHash",d),parseStatus:ee(f,"parseStatus",["parsed","invalid"],d),parseDiagnosticCount:hn(f,"parseDiagnosticCount",d),exportsOnlyTypes:$(f,"exportsOnlyTypes",d),typeOnlyExportNames:mn(f.typeOnlyExportNames,`${d}.typeOnlyExportNames`),hasTopLevelSideEffects:$(f,"hasTopLevelSideEffects",d)}}),a=G(e,"dependencies","$").map((b,v)=>{let d=`$.dependencies[${v}]`,f=D(b,d);V(f,["from","specifier","kind","typeOnly","line","resolution","target","namedBindings","targetTypeOnlyExports","sourcePureTypeModule","namedBindingsTypeOnly","portProofEligible"],d);let R=ge(f,"specifier",d),E=ge(f,"target",d),O=ee(f,"resolution",["resolved-project","resolved-external","unresolved","dynamic"],d);if(O==="resolved-project"&&!E)throw new Error(`${d}.target is required for resolved-project dependencies.`);if(O!=="resolved-project"&&E)throw new Error(`${d}.target is only allowed for resolved-project dependencies.`);if(O!=="dynamic"&&!R)throw new Error(`${d}.specifier is required unless resolution is dynamic.`);return{from:U(f,"from",d),...R?{specifier:R}:{},kind:ee(f,"kind",["import","export","dynamic-import","require"],d),typeOnly:$(f,"typeOnly",d),line:he(f,"line",d),resolution:O,...E?{target:U(f,"target",d)}:{},...f.namedBindings!==void 0?{namedBindings:mn(f.namedBindings,`${d}.namedBindings`)}:{},...f.targetTypeOnlyExports!==void 0?{targetTypeOnlyExports:$(f,"targetTypeOnlyExports",d)}:{},...f.sourcePureTypeModule!==void 0?{sourcePureTypeModule:$(f,"sourcePureTypeModule",d)}:{},...f.namedBindingsTypeOnly!==void 0?{namedBindingsTypeOnly:$(f,"namedBindingsTypeOnly",d)}:{},...f.portProofEligible!==void 0?{portProofEligible:$(f,"portProofEligible",d)}:{}}}),c=G(e,"capabilityUses","$").map((b,v)=>{let d=`$.capabilityUses[${v}]`,f=D(b,d);return V(f,["file","line","symbol","capability","source"],d),{file:U(f,"file",d),line:he(f,"line",d),symbol:P(f,"symbol",d),capability:ee(f,"capability",yn,d),source:ee(f,"source",["ambient-global","import-based"],d)}}),p=G(e,"ambientUses","$").map((b,v)=>{let d=`$.ambientUses[${v}]`,f=D(b,d);return V(f,["file","line","symbol"],d),{file:U(f,"file",d),line:he(f,"line",d),symbol:P(f,"symbol",d)}}),y=G(e,"publishCalls","$").map((b,v)=>{let d=`$.publishCalls[${v}]`,f=D(b,d);V(f,["file","line","rawIntentName","objectHasIntent","arkPublishCandidate","hasSource","sourceIntent"],d);let R=ge(f,"rawIntentName",d),E=ge(f,"sourceIntent",d);return{file:U(f,"file",d),line:he(f,"line",d),...R?{rawIntentName:R}:{},objectHasIntent:$(f,"objectHasIntent",d),arkPublishCandidate:$(f,"arkPublishCandidate",d),hasSource:$(f,"hasSource",d),...E?{sourceIntent:E}:{}}}),h=G(e,"intentReferences","$").map((b,v)=>{let d=`$.intentReferences[${v}]`,f=D(b,d);return V(f,["file","line","intent"],d),{file:U(f,"file",d),line:he(f,"line",d),intent:P(f,"intent",d)}}),m=G(e,"safetyUses","$").map((b,v)=>{let d=`$.safetyUses[${v}]`,f=D(b,d);V(f,["file","line","kind","symbol"],d);let R=ge(f,"symbol",d),E=ee(f,"kind",["ts-suppression","any-cast","dynamic-import","dynamic-require","in-memory-store"],d);if(E==="in-memory-store"&&!R)throw new Error(`${d}.symbol is required for in-memory-store facts.`);if(E!=="in-memory-store"&&R)throw new Error(`${d}.symbol is only allowed for in-memory-store facts.`);return{file:U(f,"file",d),line:he(f,"line",d),kind:E,...R?{symbol:R}:{}}});Er(i,b=>b.path,"$.files");let o=new Set(i.map(b=>b.path));for(let b of i){if(b.parseStatus==="parsed"&&b.parseDiagnosticCount!==0)throw new Error(`$.files[${b.path}].parseDiagnosticCount must be 0 when parseStatus is parsed.`);if(b.parseStatus==="invalid"&&b.parseDiagnosticCount===0)throw new Error(`$.files[${b.path}].parseDiagnosticCount must be positive when parseStatus is invalid.`)}if(s==="complete"&&i.some(b=>b.parseStatus==="invalid"))throw new Error("$.completeness cannot be complete when a candidate file failed to parse.");for(let b of a)if(!o.has(b.from))throw new Error(`$.dependencies references missing source file ${b.from}.`);for(let[b,v]of[["$.capabilityUses",c],["$.ambientUses",p],["$.publishCalls",y],["$.intentReferences",h],["$.safetyUses",m]])for(let d of v)if(!o.has(d.file))throw new Error(`${b} references missing file ${d.file}.`);let l=ge(e,"projectPackageName","$"),u=(e.classShapes===void 0?[]:G(e,"classShapes","$")).map((b,v)=>{let d=`$.classShapes[${v}]`,f=D(b,d);V(f,["file","className","exported","hasPublicMutableFields","hasPublicSetters","hasPublicConstructor","hasStaticFactory","mutatingMethods","dataOnly"],d);let R=G(f,"mutatingMethods",d).map((E,O)=>{let L=`${d}.mutatingMethods[${O}]`,_=D(E,L);return V(_,["name","referencesGuardOrPublish"],L),{name:P(_,"name",L),referencesGuardOrPublish:$(_,"referencesGuardOrPublish",L)}});return{file:U(f,"file",d),className:P(f,"className",d),exported:$(f,"exported",d),hasPublicMutableFields:$(f,"hasPublicMutableFields",d),hasPublicSetters:$(f,"hasPublicSetters",d),hasPublicConstructor:$(f,"hasPublicConstructor",d),hasStaticFactory:$(f,"hasStaticFactory",d),mutatingMethods:R,...f.dataOnly===void 0?{}:{dataOnly:$(f,"dataOnly",d)}}});return{schemaVersion:n,completeness:s,completenessReasons:r,resolverIdentity:P(e,"resolverIdentity","$"),compilerIdentity:P(e,"compilerIdentity","$"),compilerOptionsHash:P(e,"compilerOptionsHash","$"),tsconfigHash:P(e,"tsconfigHash","$"),evidenceRequirementsHash:P(e,"evidenceRequirementsHash","$"),...l?{projectPackageName:l}:{},files:i,dependencies:a,capabilityUses:c,ambientUses:p,publishCalls:y,intentReferences:h,safetyUses:m,classShapes:u}}function J(e){let t=D(e,"$"),n=P(t,"factsHash","$"),s=P(t,"candidateTreeHash","$"),r=gn(An(t,!0));if(r.factsHash!==n)throw new Error(`$.factsHash does not match the canonical payload (${r.factsHash}).`);if(s!==r.candidateTreeHash)throw new Error(`$.candidateTreeHash does not match the canonical file tree (${r.candidateTreeHash}).`);return r}var Sr=["network","filesystem","clock","randomness","environment","process","persistence"],k={type:"string",minLength:1},be={type:"integer",minimum:1},q={type:"string",minLength:1,pattern:"^(?!/)(?![A-Za-z]:/)(?!.*\\\\)(?!.*//)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*[\\u0000-\\u001f\\u007f])(?!.*\\/$).+$"},nt={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://unpkg.com/arkgate@3/schemas/ark.resolved-candidate-facts.schema.json",title:"ArkGate resolved candidate facts",type:"object",additionalProperties:!1,required:["schemaVersion","completeness","completenessReasons","resolverIdentity","compilerIdentity","compilerOptionsHash","tsconfigHash","candidateTreeHash","evidenceRequirementsHash","files","dependencies","capabilityUses","ambientUses","publishCalls","intentReferences","safetyUses","factsHash"],properties:{schemaVersion:{enum:["1.0","1.1"]},completeness:{enum:["complete","partial","unavailable"]},completenessReasons:{type:"array",items:{type:"object",additionalProperties:!1,required:["code","message"],properties:{code:k,message:k,file:q}}},resolverIdentity:k,compilerIdentity:k,compilerOptionsHash:k,tsconfigHash:k,candidateTreeHash:k,evidenceRequirementsHash:k,projectPackageName:k,files:{type:"array",uniqueItems:!0,items:{type:"object",additionalProperties:!1,required:["path","contentHash","parseStatus","parseDiagnosticCount","exportsOnlyTypes","typeOnlyExportNames","hasTopLevelSideEffects"],properties:{path:q,contentHash:k,parseStatus:{enum:["parsed","invalid"]},parseDiagnosticCount:{type:"integer",minimum:0},exportsOnlyTypes:{type:"boolean"},typeOnlyExportNames:{type:"array",items:k},hasTopLevelSideEffects:{type:"boolean"}},allOf:[{if:{properties:{parseStatus:{const:"parsed"}}},then:{properties:{parseDiagnosticCount:{const:0}}}},{if:{properties:{parseStatus:{const:"invalid"}}},then:{properties:{parseDiagnosticCount:{minimum:1}}}}]}},dependencies:{type:"array",items:{type:"object",additionalProperties:!1,required:["from","kind","typeOnly","line","resolution"],properties:{from:q,specifier:k,kind:{enum:["import","export","dynamic-import","require"]},typeOnly:{type:"boolean"},line:be,resolution:{enum:["resolved-project","resolved-external","unresolved","dynamic"]},target:q,namedBindings:{type:"array",items:k},targetTypeOnlyExports:{type:"boolean"},sourcePureTypeModule:{type:"boolean"},namedBindingsTypeOnly:{type:"boolean"},portProofEligible:{type:"boolean"}},allOf:[{if:{properties:{resolution:{const:"resolved-project"}}},then:{required:["target"]},else:{not:{required:["target"]}}},{if:{properties:{resolution:{const:"dynamic"}}},else:{required:["specifier"]}}]}},capabilityUses:{type:"array",items:{type:"object",additionalProperties:!1,required:["file","line","symbol","capability","source"],properties:{file:q,line:be,symbol:k,capability:{enum:Sr},source:{enum:["ambient-global","import-based"]}}}},ambientUses:{type:"array",items:{type:"object",additionalProperties:!1,required:["file","line","symbol"],properties:{file:q,line:be,symbol:k}}},publishCalls:{type:"array",items:{type:"object",additionalProperties:!1,required:["file","line","objectHasIntent","arkPublishCandidate","hasSource"],properties:{file:q,line:be,rawIntentName:k,objectHasIntent:{type:"boolean"},arkPublishCandidate:{type:"boolean"},hasSource:{type:"boolean"},sourceIntent:k}}},intentReferences:{type:"array",items:{type:"object",additionalProperties:!1,required:["file","line","intent"],properties:{file:q,line:be,intent:k}}},safetyUses:{type:"array",items:{type:"object",additionalProperties:!1,required:["file","line","kind"],properties:{file:q,line:be,kind:{enum:["ts-suppression","any-cast","dynamic-import","dynamic-require","in-memory-store"]},symbol:k},allOf:[{if:{properties:{kind:{const:"in-memory-store"}}},then:{required:["symbol"]},else:{not:{required:["symbol"]}}}]}},classShapes:{type:"array",items:{type:"object",additionalProperties:!1,required:["file","className","exported","hasPublicMutableFields","hasPublicSetters","hasPublicConstructor","hasStaticFactory","mutatingMethods"],properties:{file:q,className:k,exported:{type:"boolean"},hasPublicMutableFields:{type:"boolean"},hasPublicSetters:{type:"boolean"},hasPublicConstructor:{type:"boolean"},hasStaticFactory:{type:"boolean"},dataOnly:{type:"boolean"},mutatingMethods:{type:"array",items:{type:"object",additionalProperties:!1,required:["name","referencesGuardOrPublish"],properties:{name:k,referencesGuardOrPublish:{type:"boolean"}}}}}}},factsHash:k},allOf:[{if:{properties:{completeness:{const:"complete"}}},then:{properties:{completenessReasons:{maxItems:0},files:{items:{properties:{parseStatus:{const:"parsed"}}}}}}},{if:{properties:{completeness:{enum:["partial","unavailable"]}}},then:{properties:{completenessReasons:{minItems:1}}}}]};var rt="1.0";function F(e){return`${e.from}->${e.to}`}function Fe(e,t,n,s="dependency"){return{id:`${e}:${s}:${F(t)}`,classification:e,subject:"dependency",from:t.from,to:t.to,message:n,...e==="missing"?{nextAction:`Add the planned dependency ${F(t)} to the candidate, then preflight again.`}:e==="contradictory"?{nextAction:`Replace the reverse dependency with ${F(t)}, then preflight again.`}:e==="unplanned"?{nextAction:s==="dependency-removed"?`Restore the removed dependency ${F(t)} in the candidate, then preflight again.`:`Remove the unplanned dependency ${F(t)} from the candidate, then preflight again.`}:{}}}function ae(e){let t=[],n=new Map(e.changeMap.map.files.map(o=>[o.path,o])),s=new Map(e.changes.map(o=>[o.path,o])),r=new Map(e.changeMap.map.dependencies.map(o=>[F(o),o])),i=new Map(e.baseDependencies.map(o=>[F(o),o])),a=new Map(e.candidateDependencies.map(o=>[F(o),o]));for(let o of[...n.values()].sort((l,g)=>l.path.localeCompare(g.path))){let l=s.get(o.path);l?l.operation!==o.operation?t.push({id:`contradictory:file:${o.path}`,classification:"contradictory",subject:"file",path:o.path,expectedOperation:o.operation,actualOperation:l.operation,message:`${o.path} was planned as ${o.operation} but the actual operation is ${l.operation}.`,nextAction:`Change ${o.path} to the planned ${o.operation} operation, then preflight again.`}):t.push({id:`satisfied:file:${o.path}`,classification:"satisfied",subject:"file",path:o.path,expectedOperation:o.operation,actualOperation:l.operation,message:`${o.path} matches the planned ${o.operation} operation.`}):t.push({id:`missing:file:${o.path}`,classification:"missing",subject:"file",path:o.path,expectedOperation:o.operation,message:`${o.path} was planned as ${o.operation} but is absent from the actual change.`,nextAction:`${o.operation[0].toUpperCase()}${o.operation.slice(1)} ${o.path} in the complete change set, then preflight again.`})}for(let o of[...s.values()].sort((l,g)=>l.path.localeCompare(g.path)))n.has(o.path)||t.push({id:`unplanned:file:${o.path}`,classification:"unplanned",subject:"file",path:o.path,actualOperation:o.operation,message:`${o.path} has an unplanned ${o.operation} operation.`,nextAction:`Remove ${o.path} from the change set, then preflight again.`});let c=new Set;for(let o of[...r.values()].sort((l,g)=>F(l).localeCompare(F(g)))){if(a.has(F(o))){t.push(Fe("satisfied",o,`${o.from} -> ${o.to} exists in the candidate architecture.`));continue}let l={from:o.to,to:o.from};a.has(F(l))?(c.add(F(l)),t.push(Fe("contradictory",o,`${o.from} -> ${o.to} was planned, but the candidate contains the reverse edge.`))):t.push(Fe("missing",o,`${o.from} -> ${o.to} is absent from the candidate architecture.`))}let p=new Set([...n.keys(),...s.keys()]);for(let[o,l]of[...a].sort(([g],[u])=>g.localeCompare(u)))i.has(o)||r.has(o)||c.has(o)||!p.has(l.from)&&!p.has(l.to)||t.push({...Fe("unplanned",l,`${l.from} -> ${l.to} was added without a matching planned dependency.`,"dependency-added"),actualOperation:"added"});let y=new Set(e.changeMap.map.files.filter(o=>o.operation==="delete").map(o=>o.path));for(let[o,l]of[...i].sort(([g],[u])=>g.localeCompare(u)))a.has(o)||y.has(l.from)||y.has(l.to)||!p.has(l.from)&&!p.has(l.to)||t.push({...Fe("unplanned",l,`${l.from} -> ${l.to} was removed without a planned file deletion.`,"dependency-removed"),actualOperation:"removed"});let h={satisfied:0,missing:1,contradictory:2,unplanned:3};t.sort((o,l)=>h[o.classification]-h[l.classification]||(o.subject===l.subject?0:o.subject==="file"?-1:1)||o.id.localeCompare(l.id));let m={satisfied:t.filter(o=>o.classification==="satisfied").length,missing:t.filter(o=>o.classification==="missing").length,contradictory:t.filter(o=>o.classification==="contradictory").length,unplanned:t.filter(o=>o.classification==="unplanned").length};return{schemaVersion:"1.0",readOnly:!0,changeMapHash:e.changeMap.hash,structurallyConverged:m.missing===0&&m.contradictory===0&&m.unplanned===0,behavioralCompletion:"not-evaluated",summary:m,findings:t}}var vn="1.0",jt="https://unpkg.com/arkgate/schemas/ark.arkrules.schema.json",Ut=["aggregate-private-state","always-valid-factory","domain-event-on-mutation","orchestration-only","thin-adapter","no-anemic-model","invariant-coverage"],kr=["no-anemic-model"],bn={type:"array",items:{type:"string",minLength:1},uniqueItems:!0},it={$schema:"https://json-schema.org/draft/2020-12/schema",$id:jt,title:"ArkGate ArkRules (intra-layer contract)",description:"Per-layer structure sensors and invariant catalog consumed by the ArkGate Effective Contract.",type:"object",additionalProperties:!1,required:["schemaVersion","layer"],properties:{$schema:{type:"string",minLength:1,default:jt},schemaVersion:{type:"string",const:"1.0",default:"1.0"},layer:{type:"string",minLength:1},structure:{type:"array",default:[],items:{$ref:"#/$defs/structureEntry"}},invariants:{type:"array",default:[],items:{$ref:"#/$defs/invariantEntry"}}},$defs:{structureEntry:{type:"object",additionalProperties:!1,required:["id","sensor"],properties:{id:{type:"string",minLength:1},sensor:{type:"string",enum:[...Ut]},mode:{type:"string",enum:["advisory","enforced"],default:"advisory"},appliesTo:bn,description:{type:"string",minLength:1}}},invariantEntry:{type:"object",additionalProperties:!1,required:["id","description"],properties:{id:{type:"string",minLength:1},description:{type:"string",minLength:1},aggregate:{type:"string",minLength:1},coverage:{type:"object",additionalProperties:!1,properties:{test:{type:"boolean"},symbol:{type:"string",minLength:1}}},mode:{type:"string",enum:["advisory","enforced"],default:"advisory"},appliesTo:bn}}}},oe=class extends Error{issues;source;constructor(t,n){super(`Invalid ArkRules (${t}):
package/dist/index.d.ts CHANGED
@@ -244,7 +244,7 @@ declare function loadArkConfigContract(input: unknown, source?: string): ArkConf
244
244
  declare function parseArkConfigJson(json: string, source?: string): ArkConfigLoadResult;
245
245
 
246
246
  /** ArkGate library version — single source of truth. */
247
- declare const version = "4.0.0";
247
+ declare const version = "4.0.1";
248
248
 
249
249
  /** Versioned public result contract shared by every ArkGate enforcement adapter. */
250
250
  /** 1.4 adds optional evidence.arkruleId + evidence.arkruleSource (ADR 0012 / AR03). */