artifact-graph 0.8.4 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1479,6 +1479,7 @@ interface E2eRegistry {
1479
1479
  declare function generateE2eRegistry(root: string, opts?: {
1480
1480
  deterministic?: boolean;
1481
1481
  }): Promise<E2eRegistry>;
1482
+ declare function matchesConfiguredArtifactPath(path: string, schema: ArtifactSchema): boolean;
1482
1483
  interface DiscoverOptions {
1483
1484
  limit?: number;
1484
1485
  schema?: ArtifactSchema;
@@ -1497,4 +1498,4 @@ declare function discoverTargets(graph: ArtifactGraph, options?: DiscoverOptions
1497
1498
  declare function resolveArtifactContext(graph: ArtifactGraph, opts: ContextOptions): ContextManifest;
1498
1499
  declare function formatContextMarkdown(manifest: ContextManifest): string;
1499
1500
 
1500
- export { ALWAYS_PRESENT_ITEMS as ALWAYS_PRESENT, type ArtifactChainDoctorReport, type ArtifactEdge, type ArtifactEdgeRule, type ArtifactExtraFieldSchema, type ArtifactGraph, type ArtifactGraphCliCandidate, type ArtifactGraphCliResolution, type ArtifactGraphCliSource, type ArtifactNode, type ArtifactSchema, type ArtifactTarget, type ArtifactTypeMetadata, type ArtifactTypeRole, type ArtifactTypeSchema, BASELINE_CONSTRAINTS, BASELINE_CONSTRAINTS_COUNT, BASELINE_ITEMS_COUNT, type BatchDefinition, CONTRACT_ERROR_CODES, type CanonicalIR, type CollectChangedPathsOptions, type ContextItem, type ContextManifest, type ContextMode, type ContextOptions, type ContextTier, ContractCatalog, type ContractCatalogEntry, type ContractDefinition, ContractError, type ContractErrorCode, type ContractIdentity, ContractRegistry, type ContractRegistryEntry, type ContractSchema, DEFAULT_MAX_CHARS, DEFAULT_SCHEMA, type DiscoverOptions, E2E_NORMALIZER_CONFIG, type E2eCoverageStats, type E2eCoverageThresholds, type E2eRegistry, type E2eRegistryBatch, type E2eRunnerConfig, type E2eWaiver, type Evidence, type EvidenceObject, type ExecutorType, type Finding, type FindingLocation, type FindingSeverity, type FindingStatus, type GitChangeMode, type GitChangeResult, type GitHookName, type HookInstallResult, type ImplementationBlueprintDraft, type ImplementationPacket, type LegacyFieldMapping, type LoadContractOptions, MIN_PROMPT_CHARS, type ManagedHookBlockOptions, type MissingDetail, type NormalizationResult, type NormalizerConfig, type PacketAuditEntry, type PacketAuditSummary, type PacketCategory, type PacketItem, type PacketOmittedItem, type PacketOptions, type PacketPromptError, type PacketPromptOptions, type PacketTarget, type PacketTargetType, type PacketValidationIssue, type PacketValidationResult, type PolicyCompatibilityResult, type PreparedManagedHookBlock, type Producer, type ProjectPolicy, type PromptValidationIssue, type PromptValidationResult, type QueryOptions, type RepairData, type RepairValidation, type ResolveArtifactGraphCliOptions, type ReviewData, type ReviewDecision, type ReviewMetrics, type ReviewOrderStep, type ReviewResult, type ReviewStatus, type RiskChecklistItem, type SchemaValidationResult, TARGET_ARTIFACT_TYPES, type TargetArtifactType, type TraceVersionResult, VALID_PACKET_TARGET_TYPES, VERSION_INDEX_SCHEMA_VERSION, VERSION_LOCK_PATH, VERSION_LOCK_SCHEMA_VERSION, type ValidationError, type ValidationIssue, type VersionEdgeKind, type VersionIndex, type VersionLockAuditMarkdownOptions, type VersionLockAuditResult, type VersionLockBootstrapOptions, type VersionLockEntry, type VersionLockFile, type VersionLockIssue, type VersionLockIssueSeverity, type VersionLockRef, type VersionLockRefreshOptions, type VersionLockRefreshResult, type VersionLockSourceRef, type VersionLockStatus, type VersionLockUpdateOptions, type VersionSourceKind, type VersionedEdge, type VersionedNode, applyPreparedManagedHookBlocks, assemblePacket, auditPackets, auditVersionLock, bootstrapVersionLock, buildGraph, buildVersionIndex, collectChangedPaths, computeE2eCoverageStats, computeRevisionDigest, discoverAndAuditPackets, discoverTargets, doctorArtifactChain, formatContextMarkdown, generateE2eRegistry, getArtifactTypeMetadata, getTargetArtifactTypes, installManagedHookBlock, isOfficialNamespace, isPacketTargetType, isPacketTargetTypeDynamic, isTargetArtifactType, isVersionLockIssueBlocking, loadConfig, loadContract, loadContractCatalog, loadContractsFromDirectory, nextId, normalizeE2eLegacyArtifact, normalizeToCanonical, parseTargetSelector, parseTargetsFile, prepareManagedHookBlock, queryGraph, refreshVersionLock, renderDoctorMarkdown, renderMermaid, renderPacketMarkdown, renderPacketPrompt, renderTraceVersionMarkdown, renderVersionLockAuditMarkdown, renderVersionLockRefreshMarkdown, resolveArtifactContext, resolveArtifactGraphCli, resolveArtifactTypeName, resolveCliTarget, resolveGitHookPath, resolveMatrixEdges, scanArtifacts, traceVersion, updateVersionLock, validateContractAgainstSchema, validateExecutableTraceability, validateGraph, validateNamespaceAuthority, validatePacket, validatePacketMarkdown, validatePacketPrompt, validatePolicyCompatibility, validateReviewResult, validateScenarioPrdLinkIndex, validateScenarioPrdLinks, verifyDigest, versionLockIssueSeverity, writeGraphCache };
1501
+ export { ALWAYS_PRESENT_ITEMS as ALWAYS_PRESENT, type ArtifactChainDoctorReport, type ArtifactEdge, type ArtifactEdgeRule, type ArtifactExtraFieldSchema, type ArtifactGraph, type ArtifactGraphCliCandidate, type ArtifactGraphCliResolution, type ArtifactGraphCliSource, type ArtifactNode, type ArtifactSchema, type ArtifactTarget, type ArtifactTypeMetadata, type ArtifactTypeRole, type ArtifactTypeSchema, BASELINE_CONSTRAINTS, BASELINE_CONSTRAINTS_COUNT, BASELINE_ITEMS_COUNT, type BatchDefinition, CONTRACT_ERROR_CODES, type CanonicalIR, type CollectChangedPathsOptions, type ContextItem, type ContextManifest, type ContextMode, type ContextOptions, type ContextTier, ContractCatalog, type ContractCatalogEntry, type ContractDefinition, ContractError, type ContractErrorCode, type ContractIdentity, ContractRegistry, type ContractRegistryEntry, type ContractSchema, DEFAULT_MAX_CHARS, DEFAULT_SCHEMA, type DiscoverOptions, E2E_NORMALIZER_CONFIG, type E2eCoverageStats, type E2eCoverageThresholds, type E2eRegistry, type E2eRegistryBatch, type E2eRunnerConfig, type E2eWaiver, type Evidence, type EvidenceObject, type ExecutorType, type Finding, type FindingLocation, type FindingSeverity, type FindingStatus, type GitChangeMode, type GitChangeResult, type GitHookName, type HookInstallResult, type ImplementationBlueprintDraft, type ImplementationPacket, type LegacyFieldMapping, type LoadContractOptions, MIN_PROMPT_CHARS, type ManagedHookBlockOptions, type MissingDetail, type NormalizationResult, type NormalizerConfig, type PacketAuditEntry, type PacketAuditSummary, type PacketCategory, type PacketItem, type PacketOmittedItem, type PacketOptions, type PacketPromptError, type PacketPromptOptions, type PacketTarget, type PacketTargetType, type PacketValidationIssue, type PacketValidationResult, type PolicyCompatibilityResult, type PreparedManagedHookBlock, type Producer, type ProjectPolicy, type PromptValidationIssue, type PromptValidationResult, type QueryOptions, type RepairData, type RepairValidation, type ResolveArtifactGraphCliOptions, type ReviewData, type ReviewDecision, type ReviewMetrics, type ReviewOrderStep, type ReviewResult, type ReviewStatus, type RiskChecklistItem, type SchemaValidationResult, TARGET_ARTIFACT_TYPES, type TargetArtifactType, type TraceVersionResult, VALID_PACKET_TARGET_TYPES, VERSION_INDEX_SCHEMA_VERSION, VERSION_LOCK_PATH, VERSION_LOCK_SCHEMA_VERSION, type ValidationError, type ValidationIssue, type VersionEdgeKind, type VersionIndex, type VersionLockAuditMarkdownOptions, type VersionLockAuditResult, type VersionLockBootstrapOptions, type VersionLockEntry, type VersionLockFile, type VersionLockIssue, type VersionLockIssueSeverity, type VersionLockRef, type VersionLockRefreshOptions, type VersionLockRefreshResult, type VersionLockSourceRef, type VersionLockStatus, type VersionLockUpdateOptions, type VersionSourceKind, type VersionedEdge, type VersionedNode, applyPreparedManagedHookBlocks, assemblePacket, auditPackets, auditVersionLock, bootstrapVersionLock, buildGraph, buildVersionIndex, collectChangedPaths, computeE2eCoverageStats, computeRevisionDigest, discoverAndAuditPackets, discoverTargets, doctorArtifactChain, formatContextMarkdown, generateE2eRegistry, getArtifactTypeMetadata, getTargetArtifactTypes, installManagedHookBlock, isOfficialNamespace, isPacketTargetType, isPacketTargetTypeDynamic, isTargetArtifactType, isVersionLockIssueBlocking, loadConfig, loadContract, loadContractCatalog, loadContractsFromDirectory, matchesConfiguredArtifactPath, nextId, normalizeE2eLegacyArtifact, normalizeToCanonical, parseTargetSelector, parseTargetsFile, prepareManagedHookBlock, queryGraph, refreshVersionLock, renderDoctorMarkdown, renderMermaid, renderPacketMarkdown, renderPacketPrompt, renderTraceVersionMarkdown, renderVersionLockAuditMarkdown, renderVersionLockRefreshMarkdown, resolveArtifactContext, resolveArtifactGraphCli, resolveArtifactTypeName, resolveCliTarget, resolveGitHookPath, resolveMatrixEdges, scanArtifacts, traceVersion, updateVersionLock, validateContractAgainstSchema, validateExecutableTraceability, validateGraph, validateNamespaceAuthority, validatePacket, validatePacketMarkdown, validatePacketPrompt, validatePolicyCompatibility, validateReviewResult, validateScenarioPrdLinkIndex, validateScenarioPrdLinks, verifyDigest, versionLockIssueSeverity, writeGraphCache };
package/dist/index.d.ts CHANGED
@@ -1479,6 +1479,7 @@ interface E2eRegistry {
1479
1479
  declare function generateE2eRegistry(root: string, opts?: {
1480
1480
  deterministic?: boolean;
1481
1481
  }): Promise<E2eRegistry>;
1482
+ declare function matchesConfiguredArtifactPath(path: string, schema: ArtifactSchema): boolean;
1482
1483
  interface DiscoverOptions {
1483
1484
  limit?: number;
1484
1485
  schema?: ArtifactSchema;
@@ -1497,4 +1498,4 @@ declare function discoverTargets(graph: ArtifactGraph, options?: DiscoverOptions
1497
1498
  declare function resolveArtifactContext(graph: ArtifactGraph, opts: ContextOptions): ContextManifest;
1498
1499
  declare function formatContextMarkdown(manifest: ContextManifest): string;
1499
1500
 
1500
- export { ALWAYS_PRESENT_ITEMS as ALWAYS_PRESENT, type ArtifactChainDoctorReport, type ArtifactEdge, type ArtifactEdgeRule, type ArtifactExtraFieldSchema, type ArtifactGraph, type ArtifactGraphCliCandidate, type ArtifactGraphCliResolution, type ArtifactGraphCliSource, type ArtifactNode, type ArtifactSchema, type ArtifactTarget, type ArtifactTypeMetadata, type ArtifactTypeRole, type ArtifactTypeSchema, BASELINE_CONSTRAINTS, BASELINE_CONSTRAINTS_COUNT, BASELINE_ITEMS_COUNT, type BatchDefinition, CONTRACT_ERROR_CODES, type CanonicalIR, type CollectChangedPathsOptions, type ContextItem, type ContextManifest, type ContextMode, type ContextOptions, type ContextTier, ContractCatalog, type ContractCatalogEntry, type ContractDefinition, ContractError, type ContractErrorCode, type ContractIdentity, ContractRegistry, type ContractRegistryEntry, type ContractSchema, DEFAULT_MAX_CHARS, DEFAULT_SCHEMA, type DiscoverOptions, E2E_NORMALIZER_CONFIG, type E2eCoverageStats, type E2eCoverageThresholds, type E2eRegistry, type E2eRegistryBatch, type E2eRunnerConfig, type E2eWaiver, type Evidence, type EvidenceObject, type ExecutorType, type Finding, type FindingLocation, type FindingSeverity, type FindingStatus, type GitChangeMode, type GitChangeResult, type GitHookName, type HookInstallResult, type ImplementationBlueprintDraft, type ImplementationPacket, type LegacyFieldMapping, type LoadContractOptions, MIN_PROMPT_CHARS, type ManagedHookBlockOptions, type MissingDetail, type NormalizationResult, type NormalizerConfig, type PacketAuditEntry, type PacketAuditSummary, type PacketCategory, type PacketItem, type PacketOmittedItem, type PacketOptions, type PacketPromptError, type PacketPromptOptions, type PacketTarget, type PacketTargetType, type PacketValidationIssue, type PacketValidationResult, type PolicyCompatibilityResult, type PreparedManagedHookBlock, type Producer, type ProjectPolicy, type PromptValidationIssue, type PromptValidationResult, type QueryOptions, type RepairData, type RepairValidation, type ResolveArtifactGraphCliOptions, type ReviewData, type ReviewDecision, type ReviewMetrics, type ReviewOrderStep, type ReviewResult, type ReviewStatus, type RiskChecklistItem, type SchemaValidationResult, TARGET_ARTIFACT_TYPES, type TargetArtifactType, type TraceVersionResult, VALID_PACKET_TARGET_TYPES, VERSION_INDEX_SCHEMA_VERSION, VERSION_LOCK_PATH, VERSION_LOCK_SCHEMA_VERSION, type ValidationError, type ValidationIssue, type VersionEdgeKind, type VersionIndex, type VersionLockAuditMarkdownOptions, type VersionLockAuditResult, type VersionLockBootstrapOptions, type VersionLockEntry, type VersionLockFile, type VersionLockIssue, type VersionLockIssueSeverity, type VersionLockRef, type VersionLockRefreshOptions, type VersionLockRefreshResult, type VersionLockSourceRef, type VersionLockStatus, type VersionLockUpdateOptions, type VersionSourceKind, type VersionedEdge, type VersionedNode, applyPreparedManagedHookBlocks, assemblePacket, auditPackets, auditVersionLock, bootstrapVersionLock, buildGraph, buildVersionIndex, collectChangedPaths, computeE2eCoverageStats, computeRevisionDigest, discoverAndAuditPackets, discoverTargets, doctorArtifactChain, formatContextMarkdown, generateE2eRegistry, getArtifactTypeMetadata, getTargetArtifactTypes, installManagedHookBlock, isOfficialNamespace, isPacketTargetType, isPacketTargetTypeDynamic, isTargetArtifactType, isVersionLockIssueBlocking, loadConfig, loadContract, loadContractCatalog, loadContractsFromDirectory, nextId, normalizeE2eLegacyArtifact, normalizeToCanonical, parseTargetSelector, parseTargetsFile, prepareManagedHookBlock, queryGraph, refreshVersionLock, renderDoctorMarkdown, renderMermaid, renderPacketMarkdown, renderPacketPrompt, renderTraceVersionMarkdown, renderVersionLockAuditMarkdown, renderVersionLockRefreshMarkdown, resolveArtifactContext, resolveArtifactGraphCli, resolveArtifactTypeName, resolveCliTarget, resolveGitHookPath, resolveMatrixEdges, scanArtifacts, traceVersion, updateVersionLock, validateContractAgainstSchema, validateExecutableTraceability, validateGraph, validateNamespaceAuthority, validatePacket, validatePacketMarkdown, validatePacketPrompt, validatePolicyCompatibility, validateReviewResult, validateScenarioPrdLinkIndex, validateScenarioPrdLinks, verifyDigest, versionLockIssueSeverity, writeGraphCache };
1501
+ export { ALWAYS_PRESENT_ITEMS as ALWAYS_PRESENT, type ArtifactChainDoctorReport, type ArtifactEdge, type ArtifactEdgeRule, type ArtifactExtraFieldSchema, type ArtifactGraph, type ArtifactGraphCliCandidate, type ArtifactGraphCliResolution, type ArtifactGraphCliSource, type ArtifactNode, type ArtifactSchema, type ArtifactTarget, type ArtifactTypeMetadata, type ArtifactTypeRole, type ArtifactTypeSchema, BASELINE_CONSTRAINTS, BASELINE_CONSTRAINTS_COUNT, BASELINE_ITEMS_COUNT, type BatchDefinition, CONTRACT_ERROR_CODES, type CanonicalIR, type CollectChangedPathsOptions, type ContextItem, type ContextManifest, type ContextMode, type ContextOptions, type ContextTier, ContractCatalog, type ContractCatalogEntry, type ContractDefinition, ContractError, type ContractErrorCode, type ContractIdentity, ContractRegistry, type ContractRegistryEntry, type ContractSchema, DEFAULT_MAX_CHARS, DEFAULT_SCHEMA, type DiscoverOptions, E2E_NORMALIZER_CONFIG, type E2eCoverageStats, type E2eCoverageThresholds, type E2eRegistry, type E2eRegistryBatch, type E2eRunnerConfig, type E2eWaiver, type Evidence, type EvidenceObject, type ExecutorType, type Finding, type FindingLocation, type FindingSeverity, type FindingStatus, type GitChangeMode, type GitChangeResult, type GitHookName, type HookInstallResult, type ImplementationBlueprintDraft, type ImplementationPacket, type LegacyFieldMapping, type LoadContractOptions, MIN_PROMPT_CHARS, type ManagedHookBlockOptions, type MissingDetail, type NormalizationResult, type NormalizerConfig, type PacketAuditEntry, type PacketAuditSummary, type PacketCategory, type PacketItem, type PacketOmittedItem, type PacketOptions, type PacketPromptError, type PacketPromptOptions, type PacketTarget, type PacketTargetType, type PacketValidationIssue, type PacketValidationResult, type PolicyCompatibilityResult, type PreparedManagedHookBlock, type Producer, type ProjectPolicy, type PromptValidationIssue, type PromptValidationResult, type QueryOptions, type RepairData, type RepairValidation, type ResolveArtifactGraphCliOptions, type ReviewData, type ReviewDecision, type ReviewMetrics, type ReviewOrderStep, type ReviewResult, type ReviewStatus, type RiskChecklistItem, type SchemaValidationResult, TARGET_ARTIFACT_TYPES, type TargetArtifactType, type TraceVersionResult, VALID_PACKET_TARGET_TYPES, VERSION_INDEX_SCHEMA_VERSION, VERSION_LOCK_PATH, VERSION_LOCK_SCHEMA_VERSION, type ValidationError, type ValidationIssue, type VersionEdgeKind, type VersionIndex, type VersionLockAuditMarkdownOptions, type VersionLockAuditResult, type VersionLockBootstrapOptions, type VersionLockEntry, type VersionLockFile, type VersionLockIssue, type VersionLockIssueSeverity, type VersionLockRef, type VersionLockRefreshOptions, type VersionLockRefreshResult, type VersionLockSourceRef, type VersionLockStatus, type VersionLockUpdateOptions, type VersionSourceKind, type VersionedEdge, type VersionedNode, applyPreparedManagedHookBlocks, assemblePacket, auditPackets, auditVersionLock, bootstrapVersionLock, buildGraph, buildVersionIndex, collectChangedPaths, computeE2eCoverageStats, computeRevisionDigest, discoverAndAuditPackets, discoverTargets, doctorArtifactChain, formatContextMarkdown, generateE2eRegistry, getArtifactTypeMetadata, getTargetArtifactTypes, installManagedHookBlock, isOfficialNamespace, isPacketTargetType, isPacketTargetTypeDynamic, isTargetArtifactType, isVersionLockIssueBlocking, loadConfig, loadContract, loadContractCatalog, loadContractsFromDirectory, matchesConfiguredArtifactPath, nextId, normalizeE2eLegacyArtifact, normalizeToCanonical, parseTargetSelector, parseTargetsFile, prepareManagedHookBlock, queryGraph, refreshVersionLock, renderDoctorMarkdown, renderMermaid, renderPacketMarkdown, renderPacketPrompt, renderTraceVersionMarkdown, renderVersionLockAuditMarkdown, renderVersionLockRefreshMarkdown, resolveArtifactContext, resolveArtifactGraphCli, resolveArtifactTypeName, resolveCliTarget, resolveGitHookPath, resolveMatrixEdges, scanArtifacts, traceVersion, updateVersionLock, validateContractAgainstSchema, validateExecutableTraceability, validateGraph, validateNamespaceAuthority, validatePacket, validatePacketMarkdown, validatePacketPrompt, validatePolicyCompatibility, validateReviewResult, validateScenarioPrdLinkIndex, validateScenarioPrdLinks, verifyDigest, versionLockIssueSeverity, writeGraphCache };
package/dist/index.js CHANGED
@@ -335,6 +335,41 @@ var init_glob_matcher = __esm({
335
335
  }
336
336
  });
337
337
 
338
+ // src/file-walker.ts
339
+ import { readdir } from "fs/promises";
340
+ import { join, relative } from "path";
341
+ async function walkFiles(root, current = root, readDirectory = defaultReadDirectory) {
342
+ let entries;
343
+ try {
344
+ entries = await readDirectory(current, { withFileTypes: true });
345
+ } catch (error) {
346
+ if (current !== root && error.code === "ENOENT") {
347
+ return [];
348
+ }
349
+ throw error;
350
+ }
351
+ const files = [];
352
+ for (const entry of entries) {
353
+ if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git" || entry.name === ".artifact-graph") {
354
+ continue;
355
+ }
356
+ const fullPath = join(current, entry.name);
357
+ if (entry.isDirectory()) {
358
+ files.push(...await walkFiles(root, fullPath, readDirectory));
359
+ } else {
360
+ files.push(relative(root, fullPath).split("\\").join("/"));
361
+ }
362
+ }
363
+ return files;
364
+ }
365
+ var defaultReadDirectory;
366
+ var init_file_walker = __esm({
367
+ "src/file-walker.ts"() {
368
+ "use strict";
369
+ defaultReadDirectory = readdir;
370
+ }
371
+ });
372
+
338
373
  // src/target-selector.ts
339
374
  function parseTargetSelector(value) {
340
375
  const separator = value.indexOf(":");
@@ -849,7 +884,7 @@ var init_packet_assembler = __esm({
849
884
 
850
885
  // src/packet-audit.ts
851
886
  import { mkdir, writeFile } from "fs/promises";
852
- import { join } from "path";
887
+ import { join as join2 } from "path";
853
888
  function parseTargetsFile(content, schema) {
854
889
  const validTypes = schema ? new Set(getTargetArtifactTypes(schema)) : VALID_TYPES;
855
890
  const validTypesLabel = [...validTypes].join(", ");
@@ -940,7 +975,7 @@ async function auditSingleTarget(target, graph, options) {
940
975
  const fmt = options.format ?? "markdown";
941
976
  const ext = fmt === "json" ? "json" : "md";
942
977
  const filename = `${target.type}-${target.id}.packet.${ext}`;
943
- const outPath = join(options.outDir, filename);
978
+ const outPath = join2(options.outDir, filename);
944
979
  let content;
945
980
  if (fmt === "json") {
946
981
  content = JSON.stringify(packet, null, 2) + "\n";
@@ -1020,7 +1055,7 @@ async function auditPackets(root, targets, options, graph) {
1020
1055
  ...isCompact ? { summaryDetail: "compact", countsByType } : {}
1021
1056
  };
1022
1057
  if (options.outDir) {
1023
- const summaryPath = join(options.outDir, "summary.json");
1058
+ const summaryPath = join2(options.outDir, "summary.json");
1024
1059
  await writeFile(summaryPath, JSON.stringify(summary, null, 2) + "\n", "utf-8");
1025
1060
  }
1026
1061
  return summary;
@@ -1392,7 +1427,7 @@ var init_packet_prompt_validator = __esm({
1392
1427
  import { createHash } from "crypto";
1393
1428
  import { existsSync } from "fs";
1394
1429
  import { mkdir as mkdir2, readFile, writeFile as writeFile2 } from "fs/promises";
1395
- import { dirname, join as join2, relative } from "path";
1430
+ import { dirname, join as join3, relative as relative2 } from "path";
1396
1431
  async function buildVersionIndex(root, graph) {
1397
1432
  const scannedGraph = graph ?? await scanArtifacts(root);
1398
1433
  const hashCache = /* @__PURE__ */ new Map();
@@ -1528,7 +1563,7 @@ async function auditVersionLock(root, lockPath = VERSION_LOCK_PATH, graph, confi
1528
1563
  for (const entry of lock.locks) {
1529
1564
  if (entry.kind !== "verifies") continue;
1530
1565
  const sourcePath = entry.source.path;
1531
- const fullSourcePath = join2(root, sourcePath);
1566
+ const fullSourcePath = join3(root, sourcePath);
1532
1567
  if (!existsSync(fullSourcePath)) continue;
1533
1568
  let liveness = livenessCache.get(sourcePath);
1534
1569
  if (liveness === void 0) {
@@ -1623,14 +1658,14 @@ async function auditVersionLock(root, lockPath = VERSION_LOCK_PATH, graph, confi
1623
1658
  currentArtifactHash: targetNode.contentHash
1624
1659
  });
1625
1660
  }
1626
- if (!existsSync(join2(root, sourceNode.path))) {
1661
+ if (!existsSync(join3(root, sourceNode.path))) {
1627
1662
  entryIssues.push({
1628
1663
  status: "orphan_lock",
1629
1664
  edgeId: relEdgeId,
1630
1665
  message: `Artifact relation source file ${sourceNode.path} no longer exists`
1631
1666
  });
1632
1667
  }
1633
- if (!existsSync(join2(root, targetNode.path))) {
1668
+ if (!existsSync(join3(root, targetNode.path))) {
1634
1669
  entryIssues.push({
1635
1670
  status: "orphan_lock",
1636
1671
  edgeId: relEdgeId,
@@ -2203,7 +2238,7 @@ function renderTraceVersionMarkdown(result) {
2203
2238
  async function readVersionLock(root, lockPath) {
2204
2239
  const safeLockPath = normalizeRelativePath(root, lockPath);
2205
2240
  try {
2206
- const raw = await readFile(join2(root, safeLockPath), "utf-8");
2241
+ const raw = await readFile(join3(root, safeLockPath), "utf-8");
2207
2242
  let parsed;
2208
2243
  try {
2209
2244
  parsed = JSON.parse(raw);
@@ -2362,7 +2397,7 @@ function requireSafeRelativePath(value, path) {
2362
2397
  }
2363
2398
  async function writeVersionLock(root, lockPath, lock) {
2364
2399
  const safeLockPath = normalizeRelativePath(root, lockPath);
2365
- const fullPath = join2(root, safeLockPath);
2400
+ const fullPath = join3(root, safeLockPath);
2366
2401
  await mkdir2(dirname(fullPath), { recursive: true });
2367
2402
  await writeFile2(fullPath, `${JSON.stringify(lock, null, 2)}
2368
2403
  `);
@@ -2545,14 +2580,14 @@ async function hashRelativePath(root, path, cache) {
2545
2580
  const normalized = normalizeRelativePath(root, path);
2546
2581
  const cached = cache.get(normalized);
2547
2582
  if (cached) return cached;
2548
- const content = await readFile(join2(root, normalized));
2583
+ const content = await readFile(join3(root, normalized));
2549
2584
  const hash = `sha256:${createHash("sha256").update(content).digest("hex")}`;
2550
2585
  cache.set(normalized, hash);
2551
2586
  return hash;
2552
2587
  }
2553
2588
  function normalizeRelativePath(root, path) {
2554
2589
  const normalized = path.replace(/\\/g, "/");
2555
- const relativePath = normalized.startsWith("/") ? relative(root, normalized).replace(/\\/g, "/") : normalized.replace(/^\.\//, "");
2590
+ const relativePath = normalized.startsWith("/") ? relative2(root, normalized).replace(/\\/g, "/") : normalized.replace(/^\.\//, "");
2556
2591
  if (relativePath === ".." || relativePath.startsWith("../")) {
2557
2592
  throw new Error(`Path is outside root: ${path}`);
2558
2593
  }
@@ -2568,7 +2603,7 @@ async function getTestFileRunnerLiveness(root, filePath, config) {
2568
2603
  if (!/e2e/i.test(filePath) && !/\.e2e\./i.test(filePath)) {
2569
2604
  return "active";
2570
2605
  }
2571
- const fullSourcePath = join2(root, filePath);
2606
+ const fullSourcePath = join3(root, filePath);
2572
2607
  if (!existsSync(fullSourcePath)) return "inactive";
2573
2608
  try {
2574
2609
  const content = await readFile(fullSourcePath, "utf-8");
@@ -2637,7 +2672,7 @@ var init_versioned_traceability = __esm({
2637
2672
  import { execFile } from "child_process";
2638
2673
  import { constants } from "fs";
2639
2674
  import { access } from "fs/promises";
2640
- import { isAbsolute, join as join3, resolve } from "path";
2675
+ import { isAbsolute, join as join4, resolve } from "path";
2641
2676
  import { promisify } from "util";
2642
2677
  async function resolveArtifactGraphCli(root, options = {}) {
2643
2678
  const pathCli = await findCommandOnPath("artifact-graph");
@@ -2645,7 +2680,7 @@ async function resolveArtifactGraphCli(root, options = {}) {
2645
2680
  const candidates = [
2646
2681
  {
2647
2682
  source: "node_modules",
2648
- path: join3(root, "node_modules/.bin/artifact-graph"),
2683
+ path: join4(root, "node_modules/.bin/artifact-graph"),
2649
2684
  exists: false
2650
2685
  },
2651
2686
  {
@@ -2678,8 +2713,8 @@ async function resolveArtifactGraphCli(root, options = {}) {
2678
2713
  }
2679
2714
  async function doctorArtifactChain(root, options = {}) {
2680
2715
  const cli = await resolveArtifactGraphCli(root, options);
2681
- const configPath = join3(root, "artifact-graph.config.yaml");
2682
- const lockPath = join3(root, VERSION_LOCK_PATH);
2716
+ const configPath = join4(root, "artifact-graph.config.yaml");
2717
+ const lockPath = join4(root, VERSION_LOCK_PATH);
2683
2718
  const supportedCommands = cli.path ? await detectSupportedCommands(cli.path) : [];
2684
2719
  const nodeCompatible = isNodeCompatible(process.versions.node);
2685
2720
  const warnings = [
@@ -2904,7 +2939,7 @@ var init_git_hook_path = __esm({
2904
2939
  import { constants as constants2 } from "fs";
2905
2940
  import { randomUUID } from "crypto";
2906
2941
  import { lstat, mkdir as mkdir3, open, readlink, rename, unlink } from "fs/promises";
2907
- import { basename, dirname as dirname2, join as join4 } from "path";
2942
+ import { basename, dirname as dirname2, join as join5 } from "path";
2908
2943
  function detectHookInterpreter(content) {
2909
2944
  if (content.trim().length === 0) {
2910
2945
  return "empty";
@@ -3216,7 +3251,7 @@ async function removeHookAtomically(hookPath, snapshot) {
3216
3251
  }
3217
3252
  async function writeHookAtomically(hookPath, content, snapshot, mode) {
3218
3253
  await mkdir3(dirname2(hookPath), { recursive: true });
3219
- const temporaryPath = join4(dirname2(hookPath), `.${basename(hookPath)}.${randomUUID()}.tmp`);
3254
+ const temporaryPath = join5(dirname2(hookPath), `.${basename(hookPath)}.${randomUUID()}.tmp`);
3220
3255
  let temporaryExists = false;
3221
3256
  try {
3222
3257
  const temporary = await open(temporaryPath, "wx", mode);
@@ -3654,8 +3689,8 @@ var init_review_result_validator = __esm({
3654
3689
 
3655
3690
  // src/contract-kernel.ts
3656
3691
  import { createHash as createHash2 } from "crypto";
3657
- import { readFile as readFile2, readdir } from "fs/promises";
3658
- import { join as join5 } from "path";
3692
+ import { readFile as readFile2, readdir as readdir2 } from "fs/promises";
3693
+ import { join as join6 } from "path";
3659
3694
  import _AjvModule from "ajv";
3660
3695
  function isOfficialNamespace(namespace) {
3661
3696
  return OFFICIAL_NAMESPACE_PATTERN.test(namespace);
@@ -3984,10 +4019,10 @@ async function loadContract(contractPath, options) {
3984
4019
  }
3985
4020
  async function loadContractsFromDirectory(contractsDir, options) {
3986
4021
  const contracts = [];
3987
- const entries = await readdir(contractsDir, { withFileTypes: true });
4022
+ const entries = await readdir2(contractsDir, { withFileTypes: true });
3988
4023
  for (const entry of entries) {
3989
4024
  if (entry.isDirectory()) {
3990
- const schemaPath = join5(contractsDir, entry.name, "schema.json");
4025
+ const schemaPath = join6(contractsDir, entry.name, "schema.json");
3991
4026
  const contract = await loadContract(schemaPath, options);
3992
4027
  contracts.push(contract);
3993
4028
  }
@@ -4432,8 +4467,8 @@ import Database from "better-sqlite3";
4432
4467
  import matter from "gray-matter";
4433
4468
  import yaml from "js-yaml";
4434
4469
  import { accessSync, constants as fsConstants, existsSync as existsSync2, statSync } from "fs";
4435
- import { mkdir as mkdir4, readFile as readFile3, readdir as readdir2, writeFile as writeFile3 } from "fs/promises";
4436
- import { basename as basename3, dirname as dirname3, extname, isAbsolute as isAbsolute3, join as join6, relative as relative2, resolve as resolve3 } from "path";
4470
+ import { mkdir as mkdir4, readFile as readFile3, readdir as readdir3, writeFile as writeFile3 } from "fs/promises";
4471
+ import { basename as basename3, dirname as dirname3, extname, isAbsolute as isAbsolute3, join as join7, relative as relative3, resolve as resolve3 } from "path";
4437
4472
  function isTargetArtifactType(type) {
4438
4473
  return isPacketTargetType(type);
4439
4474
  }
@@ -4475,7 +4510,7 @@ function resolveArtifactTypeName(schema, token) {
4475
4510
  return void 0;
4476
4511
  }
4477
4512
  async function loadConfig(root) {
4478
- const configPath = join6(root, "artifact-graph.config.yaml");
4513
+ const configPath = join7(root, "artifact-graph.config.yaml");
4479
4514
  let parsed = {};
4480
4515
  try {
4481
4516
  const raw = await readFile3(configPath, "utf-8");
@@ -4652,7 +4687,7 @@ async function scanArtifacts(root, schema) {
4652
4687
  continue;
4653
4688
  }
4654
4689
  scannedFiles.set(file, type);
4655
- const raw = await readFile3(join6(root, file), "utf-8");
4690
+ const raw = await readFile3(join7(root, file), "utf-8");
4656
4691
  const parsed = parseFile(type, file, raw, config);
4657
4692
  nodes.push(...parsed.nodes);
4658
4693
  edges.push(...parsed.edges);
@@ -4964,7 +4999,7 @@ async function validateScenarioPrdLinkIndex(root, graph) {
4964
4999
  const indexPath = "artifacts/prd/feature-index.md";
4965
5000
  let raw = "";
4966
5001
  try {
4967
- raw = await readFile3(join6(root, indexPath), "utf-8");
5002
+ raw = await readFile3(join7(root, indexPath), "utf-8");
4968
5003
  } catch (error) {
4969
5004
  if (error.code === "ENOENT") {
4970
5005
  return [];
@@ -5154,11 +5189,11 @@ function nextId(graph, schema, type, rangeName) {
5154
5189
  throw new Error(`ID range ${type}.${rangeName} is exhausted`);
5155
5190
  }
5156
5191
  async function writeGraphCache(root, graph) {
5157
- const cacheDir = join6(root, ".artifact-graph");
5192
+ const cacheDir = join7(root, ".artifact-graph");
5158
5193
  await mkdir4(cacheDir, { recursive: true });
5159
- await writeFile3(join6(cacheDir, "index.json"), `${JSON.stringify(graph, null, 2)}
5194
+ await writeFile3(join7(cacheDir, "index.json"), `${JSON.stringify(graph, null, 2)}
5160
5195
  `);
5161
- const db = new Database(join6(cacheDir, "graph.sqlite"));
5196
+ const db = new Database(join7(cacheDir, "graph.sqlite"));
5162
5197
  try {
5163
5198
  db.exec(`
5164
5199
  DROP TABLE IF EXISTS nodes;
@@ -6841,10 +6876,10 @@ function validateE2eRegistry(graph) {
6841
6876
  async function validateExecutableTraceability(root, config) {
6842
6877
  const issues = [];
6843
6878
  const schema = config ?? await loadConfig(root);
6844
- const e2eDir = join6(root, "artifacts", "tests", "e2e");
6879
+ const e2eDir = join7(root, "artifacts", "tests", "e2e");
6845
6880
  let e2eFiles;
6846
6881
  try {
6847
- e2eFiles = (await readdir2(e2eDir)).filter((name) => /^test-.*\.md$/.test(name)).map((name) => join6(e2eDir, name));
6882
+ e2eFiles = (await readdir3(e2eDir)).filter((name) => /^test-.*\.md$/.test(name)).map((name) => join7(e2eDir, name));
6848
6883
  } catch {
6849
6884
  return [];
6850
6885
  }
@@ -6854,7 +6889,7 @@ async function validateExecutableTraceability(root, config) {
6854
6889
  const mdBatches = /* @__PURE__ */ new Set();
6855
6890
  for (const filePath of e2eFiles) {
6856
6891
  const raw = await readFile3(filePath, "utf-8");
6857
- const relPath = relative2(root, filePath).split("\\").join("/");
6892
+ const relPath = relative3(root, filePath).split("\\").join("/");
6858
6893
  const parsed = matter(raw);
6859
6894
  const data = parsed.data;
6860
6895
  const batch = String(data.test_batch ?? basename3(filePath, extname(filePath))).trim();
@@ -6882,7 +6917,7 @@ async function validateExecutableTraceability(root, config) {
6882
6917
  }
6883
6918
  }
6884
6919
  }
6885
- const allFiles = await walk(root);
6920
+ const allFiles = await walkFiles(root);
6886
6921
  const specFiles = /* @__PURE__ */ new Set();
6887
6922
  const configuredRunners = schema.e2e?.runners ?? [];
6888
6923
  if (configuredRunners.length > 0) {
@@ -6902,7 +6937,7 @@ async function validateExecutableTraceability(root, config) {
6902
6937
  const tcAnnotationRegex = /\/\/!?\s*@(?:e2e_test|tc)\s+(\S+?)\s+\[(\w+)\]/;
6903
6938
  const tcAnnotationNoLevelRegex = /\/\/!?\s*@(?:e2e_test|tc)\s+(\S+)/;
6904
6939
  for (const specFile of specFiles) {
6905
- const fullSpecPath = join6(root, specFile);
6940
+ const fullSpecPath = join7(root, specFile);
6906
6941
  let content;
6907
6942
  try {
6908
6943
  content = await readFile3(fullSpecPath, "utf-8");
@@ -6911,14 +6946,16 @@ async function validateExecutableTraceability(root, config) {
6911
6946
  }
6912
6947
  const level = detectTestLevel(specFile, content);
6913
6948
  const specLines = content.split(/\r?\n/);
6914
- for (let lineIndex = 0; lineIndex < specLines.length; lineIndex += 1) {
6915
- const line = specLines[lineIndex];
6916
- let match = tcAnnotationRegex.exec(line);
6949
+ const lineComments = scanCodeComments(content).filter((comment) => comment.kind === "line" && comment.standalone);
6950
+ for (const comment of lineComments) {
6951
+ const lineIndex = comment.lineNumber - 1;
6952
+ const commentText = comment.text.replace(/^!/, "");
6953
+ let match = tcAnnotationRegex.exec(`//${commentText}`);
6917
6954
  let annotatedLevel = "";
6918
6955
  if (match) {
6919
6956
  annotatedLevel = match[2];
6920
6957
  } else {
6921
- match = tcAnnotationNoLevelRegex.exec(line);
6958
+ match = tcAnnotationNoLevelRegex.exec(`//${commentText}`);
6922
6959
  }
6923
6960
  if (!match) {
6924
6961
  continue;
@@ -6945,7 +6982,7 @@ async function validateExecutableTraceability(root, config) {
6945
6982
  level: effectiveLevel,
6946
6983
  file: specFile,
6947
6984
  testName,
6948
- line: lineIndex + 1
6985
+ line: comment.lineNumber
6949
6986
  };
6950
6987
  const key = `${batch}:${tcId}`;
6951
6988
  const existing = refToSource.get(key) ?? [];
@@ -6982,7 +7019,7 @@ async function validateExecutableTraceability(root, config) {
6982
7019
  if (entry.testId) {
6983
7020
  let content;
6984
7021
  try {
6985
- content = await readFile3(join6(root, normalizedRefFile), "utf-8");
7022
+ content = await readFile3(join7(root, normalizedRefFile), "utf-8");
6986
7023
  } catch {
6987
7024
  continue;
6988
7025
  }
@@ -7159,11 +7196,11 @@ async function computeE2eCoverageStats(graph, root, thresholds = {}) {
7159
7196
  let withExecutableRef = 0;
7160
7197
  const statusBreakdown = {};
7161
7198
  const chainTypeBreakdown = {};
7162
- const e2eDir = join6(root, "artifacts", "tests", "e2e");
7199
+ const e2eDir = join7(root, "artifacts", "tests", "e2e");
7163
7200
  const tcFieldsMap = /* @__PURE__ */ new Map();
7164
7201
  let e2eFiles;
7165
7202
  try {
7166
- e2eFiles = (await readdir2(e2eDir)).filter((name) => /^test-.*\.md$/.test(name)).map((name) => join6(e2eDir, name));
7203
+ e2eFiles = (await readdir3(e2eDir)).filter((name) => /^test-.*\.md$/.test(name)).map((name) => join7(e2eDir, name));
7167
7204
  } catch {
7168
7205
  e2eFiles = [];
7169
7206
  }
@@ -7230,7 +7267,7 @@ async function computeE2eCoverageStats(graph, root, thresholds = {}) {
7230
7267
  }
7231
7268
  }
7232
7269
  const runners = (await loadConfig(root)).e2e?.runners ?? [];
7233
- const allProjectFiles = await walk(root);
7270
+ const allProjectFiles = await walkFiles(root);
7234
7271
  for (const node of e2eNodes) {
7235
7272
  const fields = tcFieldsMap.get(node.code) ?? asRecord(node.attrs?.tcFields);
7236
7273
  const status = String(fields["status"] ?? "").trim().toLowerCase();
@@ -7241,7 +7278,7 @@ async function computeE2eCoverageStats(graph, root, thresholds = {}) {
7241
7278
  let hasActiveE2eRef = false;
7242
7279
  for (const entry of parseExecutableRefLines(execRef)) {
7243
7280
  const normalized = resolveExecutableRefFile(entry.file, allProjectFiles);
7244
- if (!normalized || !existsSync2(join6(root, normalized))) continue;
7281
+ if (!normalized || !existsSync2(join7(root, normalized))) continue;
7245
7282
  const accepting = await getAcceptingRunners(root, normalized, runners);
7246
7283
  if (accepting.some((runner) => runner.kind === "e2e")) {
7247
7284
  hasActiveE2eRef = true;
@@ -7300,7 +7337,7 @@ async function computeE2eCoverageStats(graph, root, thresholds = {}) {
7300
7337
  const acCoverageRateByFeature = {};
7301
7338
  const featureAcMap = /* @__PURE__ */ new Map();
7302
7339
  for (const node of featureNodes) {
7303
- const acs = parseAcceptanceCriteria(await readFile3(join6(root, node.path), "utf-8"));
7340
+ const acs = parseAcceptanceCriteria(await readFile3(join7(root, node.path), "utf-8"));
7304
7341
  featureAcMap.set(node.code, new Set(acs));
7305
7342
  }
7306
7343
  const coveredAcByFeature = /* @__PURE__ */ new Map();
@@ -7342,10 +7379,10 @@ async function computeE2eCoverageStats(graph, root, thresholds = {}) {
7342
7379
  };
7343
7380
  }
7344
7381
  async function generateE2eRegistry(root, opts) {
7345
- const e2eDir = join6(root, "artifacts", "tests", "e2e");
7382
+ const e2eDir = join7(root, "artifacts", "tests", "e2e");
7346
7383
  let files;
7347
7384
  try {
7348
- files = (await readdir2(e2eDir)).filter((name) => /^test-.*\.md$/.test(name)).sort();
7385
+ files = (await readdir3(e2eDir)).filter((name) => /^test-.*\.md$/.test(name)).sort();
7349
7386
  } catch {
7350
7387
  return {
7351
7388
  registry_version: "1.0",
@@ -7358,7 +7395,7 @@ async function generateE2eRegistry(root, opts) {
7358
7395
  const batches = [];
7359
7396
  let totalTestCases = 0;
7360
7397
  for (const file of files) {
7361
- const filePath = join6(e2eDir, file);
7398
+ const filePath = join7(e2eDir, file);
7362
7399
  const raw = await readFile3(filePath, "utf-8");
7363
7400
  const parsed = matter(raw);
7364
7401
  const data = parsed.data;
@@ -7486,7 +7523,7 @@ async function validatePartialRustEvidence(tcFields, tcKey, root, allFiles) {
7486
7523
  if (!normalizedPath) {
7487
7524
  return { hasValidPartialRust: false, detail: `partial_rust file not found: ${ref.file}` };
7488
7525
  }
7489
- const fullPath = join6(root, normalizedPath);
7526
+ const fullPath = join7(root, normalizedPath);
7490
7527
  let content;
7491
7528
  try {
7492
7529
  content = await readFile3(fullPath, "utf-8");
@@ -7598,7 +7635,7 @@ function escapeRegExp(value) {
7598
7635
  }
7599
7636
  async function hasMarkdownTc(tcKey, e2eDir) {
7600
7637
  const [batch, tcId] = tcKey.split(":");
7601
- const filePath = join6(e2eDir, `${batch}.md`);
7638
+ const filePath = join7(e2eDir, `${batch}.md`);
7602
7639
  try {
7603
7640
  const raw = await readFile3(filePath, "utf-8");
7604
7641
  const tcRegex = new RegExp(`^#{2,3}\\s+${escapeRegExp(tcId)}\\s*[:\uFF1A]?`, "m");
@@ -7608,7 +7645,7 @@ async function hasMarkdownTc(tcKey, e2eDir) {
7608
7645
  }
7609
7646
  }
7610
7647
  async function findFiles(root, patterns) {
7611
- const all = await walk(root);
7648
+ const all = await walkFiles(root);
7612
7649
  const matched = /* @__PURE__ */ new Set();
7613
7650
  for (const pattern of patterns) {
7614
7651
  for (const file of all) {
@@ -7619,21 +7656,9 @@ async function findFiles(root, patterns) {
7619
7656
  }
7620
7657
  return [...matched].sort();
7621
7658
  }
7622
- async function walk(root, current = root) {
7623
- const entries = await readdir2(current, { withFileTypes: true });
7624
- const files = [];
7625
- for (const entry of entries) {
7626
- if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git" || entry.name === ".artifact-graph") {
7627
- continue;
7628
- }
7629
- const fullPath = join6(current, entry.name);
7630
- if (entry.isDirectory()) {
7631
- files.push(...await walk(root, fullPath));
7632
- } else {
7633
- files.push(relative2(root, fullPath).split("\\").join("/"));
7634
- }
7635
- }
7636
- return files;
7659
+ function matchesConfiguredArtifactPath(path, schema) {
7660
+ const normalizedPath = path.replace(/\\/g, "/").replace(/^\.\//, "");
7661
+ return Object.values(schema.types).some((definition) => definition.paths.some((pattern) => matchesPattern(normalizedPath, pattern)));
7637
7662
  }
7638
7663
  function matchesPattern(file, pattern) {
7639
7664
  if (!pattern.includes("*")) {
@@ -8110,7 +8135,7 @@ function resolveArtifactContext(graph, opts) {
8110
8135
  }
8111
8136
  if (root) {
8112
8137
  for (const ap of ALWAYS_PRESENT_ITEMS) {
8113
- const fullPath = join6(root, ap.path);
8138
+ const fullPath = join7(root, ap.path);
8114
8139
  let stat;
8115
8140
  try {
8116
8141
  stat = statSync(fullPath);
@@ -8346,6 +8371,7 @@ var init_index = __esm({
8346
8371
  init_packet_constants();
8347
8372
  init_packet_validator();
8348
8373
  init_glob_matcher();
8374
+ init_file_walker();
8349
8375
  init_packet_constants();
8350
8376
  init_target_selector();
8351
8377
  init_packet_assembler();
@@ -8495,6 +8521,7 @@ export {
8495
8521
  loadContract,
8496
8522
  loadContractCatalog,
8497
8523
  loadContractsFromDirectory,
8524
+ matchesConfiguredArtifactPath,
8498
8525
  nextId,
8499
8526
  normalizeE2eLegacyArtifact,
8500
8527
  normalizeToCanonical,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "artifact-graph",
3
- "version": "0.8.4",
3
+ "version": "0.9.0",
4
4
  "description": "Git-native Markdown artifact graph scanner and validator",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",