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/CHANGELOG.md +18 -0
- package/dist/cli.js +108 -81
- package/dist/index.cjs +147 -119
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +95 -68
- package/package.json +1 -1
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
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(
|
|
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("/") ?
|
|
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 =
|
|
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
|
|
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:
|
|
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 =
|
|
2682
|
-
const lockPath =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
4022
|
+
const entries = await readdir2(contractsDir, { withFileTypes: true });
|
|
3988
4023
|
for (const entry of entries) {
|
|
3989
4024
|
if (entry.isDirectory()) {
|
|
3990
|
-
const schemaPath =
|
|
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
|
|
4436
|
-
import { basename as basename3, dirname as dirname3, extname, isAbsolute as isAbsolute3, join as
|
|
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 =
|
|
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(
|
|
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(
|
|
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 =
|
|
5192
|
+
const cacheDir = join7(root, ".artifact-graph");
|
|
5158
5193
|
await mkdir4(cacheDir, { recursive: true });
|
|
5159
|
-
await writeFile3(
|
|
5194
|
+
await writeFile3(join7(cacheDir, "index.json"), `${JSON.stringify(graph, null, 2)}
|
|
5160
5195
|
`);
|
|
5161
|
-
const db = new Database(
|
|
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 =
|
|
6879
|
+
const e2eDir = join7(root, "artifacts", "tests", "e2e");
|
|
6845
6880
|
let e2eFiles;
|
|
6846
6881
|
try {
|
|
6847
|
-
e2eFiles = (await
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
-
|
|
6915
|
-
|
|
6916
|
-
|
|
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(
|
|
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:
|
|
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(
|
|
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 =
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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 =
|
|
7382
|
+
const e2eDir = join7(root, "artifacts", "tests", "e2e");
|
|
7346
7383
|
let files;
|
|
7347
7384
|
try {
|
|
7348
|
-
files = (await
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
7623
|
-
const
|
|
7624
|
-
|
|
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 =
|
|
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,
|