@unbrained/pm-cli 2026.9.18 → 2026.9.20
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/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +963 -924
- package/dist/cli/invocation-profile.d.ts +26 -0
- package/dist/cli/invocation-profile.js +3 -0
- package/dist/cli/main.d.ts +10 -76
- package/dist/cli/main.js +1 -2
- package/dist/cli/register-operations.js +1 -1
- package/dist/cli/runtime/activation.d.ts +51 -0
- package/dist/cli/runtime/activation.js +2 -0
- package/dist/cli/runtime/invocation-options.d.ts +41 -0
- package/dist/cli/runtime/invocation-options.js +2 -0
- package/dist/cli/runtime/selection.d.ts +29 -0
- package/dist/cli/runtime/selection.js +2 -0
- package/dist/cli/runtime/telemetry-outcome.d.ts +20 -0
- package/dist/cli/runtime/telemetry-outcome.js +2 -0
- package/dist/cli-bundle/bundle-manifest.json +156 -156
- package/dist/cli-bundle/chunks/{chunk-T4J2X3RK.js → chunk-2FEKKSLN.js} +1255 -1255
- package/dist/cli-bundle/chunks/{chunk-XFGWFVR3.js → chunk-2QLXN6HZ.js} +46 -46
- package/dist/cli-bundle/chunks/chunk-2UNYUB4A.js +2 -0
- package/dist/cli-bundle/chunks/chunk-33R5PEKI.js +8 -0
- package/dist/cli-bundle/chunks/chunk-7YUYLYJQ.js +6 -0
- package/dist/cli-bundle/chunks/{chunk-GRFRKHFC.js → chunk-FBWAECBI.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-GRHSNUQO.js +20 -0
- package/dist/cli-bundle/chunks/chunk-HAFSMFJK.js +3 -0
- package/dist/cli-bundle/chunks/chunk-JBJUOOJI.js +238 -0
- package/dist/cli-bundle/chunks/chunk-K7RWRJLT.js +29 -0
- package/dist/cli-bundle/chunks/{chunk-AOD5WE6U.js → chunk-QZTS23BV.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-TTFVQB4S.js +2 -0
- package/dist/cli-bundle/chunks/{register-list-query-43EQISX7.js → register-list-query-5V43MYPN.js} +6 -6
- package/dist/cli-bundle/chunks/{register-mutation-TSZNAKEU.js → register-mutation-EVRYSU72.js} +4 -4
- package/dist/cli-bundle/chunks/register-operations-LJU5H2CU.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-HJUNGYBB.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3XPBKIV6.js +12 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PNCUNPSA.js → chunk-5BLRMUMK.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-QVVOXVYI.js → chunk-6MNKQKT6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-246P5AK7.js → chunk-DPBTIFW7.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-DRNXMOSV.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-FXAZPSU6.js +165 -0
- package/dist/cli-bundle/focused-chunks/{chunk-YJYSFWSW.js → chunk-HYPK5OPA.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-GEFWBVPQ.js → chunk-IA5CCSBB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-C6SH62BX.js → chunk-ISEOBALS.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-7UZHYT5B.js → chunk-K5ZCBC6Y.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-L6L4XCLY.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-N6KI3LWF.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-PC6ZZVNP.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-RQL5WLNZ.js +30 -0
- package/dist/cli-bundle/focused-chunks/{chunk-MMX7BQLH.js → chunk-U2SB2BMM.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-UIS5FVHH.js +59 -0
- package/dist/cli-bundle/main.js +26 -27
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +39 -39
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +8 -8
- package/dist/cli.js +1 -1
- package/dist/core/checkpoint/mutation-checkpoint.d.ts +1 -1
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
- package/dist/core/diagnostics/remediation.js +1 -1
- package/dist/core/extensions/extension-types.d.ts +2 -2
- package/dist/core/extensions/loader.d.ts +9 -15
- package/dist/core/extensions/loader.js +1 -1
- package/dist/core/extensions/manifest-parser.d.ts +5 -0
- package/dist/core/extensions/manifest-parser.js +2 -0
- package/dist/core/extensions/registration-contracts.d.ts +34 -0
- package/dist/core/extensions/registration-contracts.js +2 -0
- package/dist/core/fs/atomic-create.d.ts +7 -0
- package/dist/core/fs/atomic-create.js +2 -0
- package/dist/core/governance/issue-codes.d.ts +10 -1
- package/dist/core/governance/issue-codes.js +1 -1
- package/dist/core/history/history.js +1 -1
- package/dist/core/schema/runtime-schema.d.ts +1 -1
- package/dist/core/schema/runtime-schema.js +2 -2
- package/dist/core/session/session-state.js +1 -1
- package/dist/core/store/settings-concurrency.d.ts +7 -0
- package/dist/core/store/settings-concurrency.js +2 -0
- package/dist/core/store/settings.d.ts +8 -1
- package/dist/core/store/settings.js +3 -2
- package/dist/core/validate/fix-planning.d.ts +3 -3
- package/dist/core/validate/fix-planning.js +1 -1
- package/dist/sdk/agent/refusal-reachability.d.ts +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
- package/dist/sdk/completion/bash.d.ts +3 -0
- package/dist/sdk/completion/bash.js +2 -0
- package/dist/sdk/completion/fish.d.ts +3 -0
- package/dist/sdk/completion/fish.js +1054 -0
- package/dist/sdk/completion/shared.d.ts +103 -0
- package/dist/sdk/completion/shared.js +2 -0
- package/dist/sdk/completion/zsh.d.ts +3 -0
- package/dist/sdk/completion/zsh.js +1109 -0
- package/dist/sdk/completion.d.ts +5 -30
- package/dist/sdk/completion.js +1 -2160
- package/dist/sdk/contracts.d.ts +1 -0
- package/dist/sdk/contracts.js +1 -1
- package/dist/sdk/extension/install-runtime.d.ts +1 -1
- package/dist/sdk/extension/install-runtime.js +2 -2
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
- package/dist/sdk/governance/closure-timestamps.d.ts +32 -0
- package/dist/sdk/governance/closure-timestamps.js +2 -0
- package/dist/sdk/governance/health.js +1 -1
- package/dist/sdk/governance/provenance-health.d.ts +27 -0
- package/dist/sdk/governance/provenance-health.js +1 -1
- package/dist/sdk/governance/validate-normalization.d.ts +2 -0
- package/dist/sdk/governance/validate-normalization.js +1 -1
- package/dist/sdk/governance/validate.js +1 -1
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -1
- package/dist/sdk/graph/index.d.ts +1 -0
- package/dist/sdk/graph/index.js +1 -1
- package/dist/sdk/graph/query-contracts.d.ts +18 -0
- package/dist/sdk/graph/query-contracts.js +2 -0
- package/dist/sdk/graph/run.d.ts +2 -0
- package/dist/sdk/graph/run.js +1 -1
- package/dist/sdk/graph/traversal.js +1 -1
- package/dist/sdk/lifecycle-policy.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/search/corpus.d.ts +27 -0
- package/dist/sdk/query/search/corpus.js +2 -0
- package/dist/sdk/query/search/filters.d.ts +27 -0
- package/dist/sdk/query/search/filters.js +2 -0
- package/dist/sdk/query/search/input.d.ts +28 -0
- package/dist/sdk/query/search/input.js +2 -0
- package/dist/sdk/query/search/lexical.d.ts +34 -0
- package/dist/sdk/query/search/lexical.js +2 -0
- package/dist/sdk/query/search/response.d.ts +34 -0
- package/dist/sdk/query/search/response.js +2 -0
- package/dist/sdk/query/search/semantic.d.ts +229 -0
- package/dist/sdk/query/search/semantic.js +3 -0
- package/dist/sdk/query/search/types.d.ts +123 -0
- package/dist/sdk/query/search/types.js +2 -0
- package/dist/sdk/query/search.d.ts +13 -364
- package/dist/sdk/query/search.js +1 -2
- package/dist/sdk/runtime/actions.d.ts +4 -0
- package/dist/sdk/runtime/actions.js +2 -0
- package/dist/sdk/runtime/context.d.ts +38 -0
- package/dist/sdk/runtime/context.js +2 -0
- package/dist/sdk/runtime/schema.d.ts +4 -0
- package/dist/sdk/runtime/schema.js +2 -0
- package/dist/sdk/runtime.d.ts +90 -95
- package/dist/sdk/runtime.js +1 -1
- package/docs/ARCHITECTURE.md +68 -0
- package/docs/HISTORY_GOVERNANCE_REPAIR.md +66 -0
- package/docs/MCP_OPTION_CONFORMANCE.md +41 -0
- package/docs/OUTPUT_PROJECTION_CONTRACTS.md +18 -2
- package/docs/PERFORMANCE.md +37 -0
- package/docs/README.md +1 -0
- package/docs/SDK_AGENT_SESSION_CONTEXT.md +28 -4
- package/docs/SDK_LIFECYCLE.md +16 -2
- package/docs/WORKSPACE_CONCURRENCY.md +67 -0
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +4 -3
- package/marketplace.json +2 -2
- package/package.json +3 -3
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/dist/cli-bundle/chunks/chunk-CA5DRNGA.js +0 -29
- package/dist/cli-bundle/chunks/chunk-CI2JCBN2.js +0 -237
- package/dist/cli-bundle/chunks/chunk-FZZVWWQP.js +0 -2
- package/dist/cli-bundle/chunks/chunk-IPR2ICDO.js +0 -20
- package/dist/cli-bundle/chunks/chunk-WD7BQXA7.js +0 -6
- package/dist/cli-bundle/chunks/chunk-WUDF7HWM.js +0 -2
- package/dist/cli-bundle/chunks/chunk-X2EVS624.js +0 -3
- package/dist/cli-bundle/chunks/chunk-Y2OK7IAD.js +0 -8
- package/dist/cli-bundle/chunks/register-operations-KFZIKATY.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-KTJ4ZE65.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-7D6M45AN.js +0 -30
- package/dist/cli-bundle/focused-chunks/chunk-BVOQRMHF.js +0 -164
- package/dist/cli-bundle/focused-chunks/chunk-HRANNGHM.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-LG3SYXBX.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-LI6IGGB3.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-QKG7JD34.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-QYQFBJXD.js +0 -59
- package/dist/cli-bundle/focused-chunks/chunk-ZDX2BCOT.js +0 -12
package/dist/sdk/graph/run.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3a536c76-bbd6-5235-b06a-f18c5cf95a88")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{isTerminalStatus}from"../../core/item/status.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{nowIso}from"../../core/shared/time.js";import{createUnknownSubcommandError}from"../agent/subcommand-recovery.js";import{listAllItemMetadataLight}from"../../core/store/item-store.js";import{resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{parseDirection,parseKinds,parseMaxDepth,parsePositiveInteger}from"../dependencies.js";import{analyzeGraphImpact,analyzeKnowledgeGraph,analyzeRelationshipExecution}from"../relationship-analytics.js";import{RelationshipGraph}from"../relationships.js";import{computeRelationshipDominators,detectRelationshipCommunities,findRedundantRelationshipEdges}from"./analytics.js";import{computeRelationshipCentrality,findRelationshipCutStructure}from"./centrality.js";import{analyzeRelationshipSchedule}from"./scheduling.js";import{deriveRelationshipDeadlines}from"./deadline-scheduling.js";import{assembleWorkspaceRelationshipGraph,getWorkspaceHierarchyIntegrity,resolveWorkspaceRelationshipKindRegistry}from"./assembly.js";import{computeWorkspaceGraphFingerprint,workspaceGraphCache}from"./cache.js";import{clearDurableGraphCache,durableGraphCacheStatus,loadGraphAuditBaseline,openDurableGraphCache,persistDurableGraphResult,saveGraphAuditBaseline,shouldPersistDurableGraphCache,GRAPH_DURABLE_CACHE_MIN_ITEMS}from"./durable-cache.js";import{auditWorkspaceRelationshipGraph,diffRelationshipAuditSnapshots}from"./governance.js";import{RELATIONSHIP_AUDIT_FINDING_CODES}from"./governance-contracts.js";import{planRelationshipRemediation}from"./remediation.js";import{enumerateRelationshipPaths,hierarchyAncestors,hierarchyDescendants,orderingPredecessors,orderingSuccessors}from"./traversal.js";import{GRAPH_SUBCOMMAND_VALUES}from"../cli-contracts/enum-contracts.js";import{assertProjectionModeChoice}from"../output-projection.js";const ROOTED_SUBCOMMANDS=new Set(["ancestors","descendants","predecessors","successors","paths","impact","dominators"]);const DEFAULT_SAMPLE_LIMIT=10;function attachGraphProjection(result,summary,rowGroup){let projected=result;if(summary&&result.subcommand==="audit"){const{nodes,recorded_nodes,edges,active_nodes,terminal_nodes,missing_nodes,ordering_acyclic,active_ordering_acyclic,coverage_by_lifecycle}=result.profile;const populations=Object.fromEntries(Object.entries(coverage_by_lifecycle).map(([key,population])=>{const{degree_histogram:_histogram,...counts}=population;return[key,counts]}));projected={...result,profile:{nodes,recorded_nodes,edges,active_nodes,terminal_nodes,missing_nodes,ordering_acyclic,active_ordering_acyclic,coverage_by_lifecycle:populations}}}return{...projected,projection:{mode:summary?"summary":"full",declared_field_groups:rowGroup===void 0?[]:[{name:rowGroup,restore_with:"--full"}],included_field_groups:rowGroup===void 0||summary?[]:[rowGroup]}}}function normalizeIdList(raw){if(raw===void 0)return[];return(Array.isArray(raw)?raw:[raw]).flatMap(value=>value.split(",")).map(value=>value.trim()).filter(value=>value.length>0)}function parseGraphSubcommand(raw,id,target){const candidate=raw.trim().toLowerCase();if(!GRAPH_SUBCOMMAND_VALUES.includes(candidate)){throw createUnknownSubcommandError({command_path:"graph",token:candidate||"<empty>",allowed:GRAPH_SUBCOMMAND_VALUES})}const subcommand=candidate;if(ROOTED_SUBCOMMANDS.has(subcommand)&&!id?.trim()){throw new PmCliError(`graph ${subcommand} requires an item id.`,EXIT_CODE.USAGE)}if(subcommand==="paths"&&!target?.trim()){throw new PmCliError("graph paths requires a source and a target item id.",EXIT_CODE.USAGE)}return subcommand}function rethrowGraphUsage(error){if(error instanceof TypeError)throw new PmCliError(error.message,EXIT_CODE.USAGE);throw error}function projectQueryMeta(meta){return{truncated:meta.truncated,cost:{visited_nodes:meta.visitedNodes,inspected_edges:meta.inspectedEdges}}}function canonicalizeGraphId(assembly,raw){const wanted=raw.trim().toLowerCase();for(const detail of assembly.details){if(detail.id.trim().toLowerCase()===wanted&&!assembly.missingIdSet.has(detail.id.toLowerCase())){return detail.id}}throw new PmCliError(`Item ${raw} not found`,EXIT_CODE.NOT_FOUND)}function runGraphTraversal(subcommand,root,invocation){const walk={ancestors:hierarchyAncestors,descendants:hierarchyDescendants,predecessors:orderingPredecessors,successors:orderingSuccessors}[subcommand];let result;try{result=walk(invocation.assembly.graph,root,{...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth},...invocation.limit===void 0?{}:{limit:invocation.limit},...invocation.after===void 0?{}:{after:invocation.after}})}catch(error){rethrowGraphUsage(error)}const meta=projectQueryMeta(result.meta);return{subcommand,root,count:result.value.length,...meta,...result.meta.nextCursor===void 0?{}:{next_cursor:result.meta.nextCursor},...invocation.summary?{}:{ids:result.value}}}function runGraphPaths(root,target,invocation){const result=enumerateRelationshipPaths(invocation.assembly.graph,root,target,{direction:invocation.direction,...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth},...invocation.maxPaths===void 0?{}:{maxPaths:invocation.maxPaths}});return{subcommand:"paths",root,target,direction:invocation.direction,count:result.value.length,...projectQueryMeta(result.meta),...invocation.summary?{}:{paths:result.value.map(path=>({nodes:path.nodes,kinds:path.edges.map(edge=>edge.kind),length:path.length}))}}}function runGraphImpact(root,invocation){let analysis;try{analysis=analyzeGraphImpact(invocation.assembly.graph,root,{direction:invocation.direction,...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth},...invocation.unbounded?{}:{limit:invocation.limit??DEFAULT_SAMPLE_LIMIT},...invocation.after===void 0?{}:{after:invocation.after}})}catch(error){rethrowGraphUsage(error)}return{subcommand:"impact",root,direction:invocation.direction,count:analysis.affected.length,truncated:analysis.truncated,...analysis.nextCursor===void 0?{}:{next_cursor:analysis.nextCursor},cost:{visited_nodes:analysis.cost.visitedNodes,inspected_edges:analysis.cost.inspectedEdges},...invocation.summary?{}:{affected:analysis.affected}}}function buildGraphExecutionSummary(execution,summary,sampleLimit){return{acyclic:execution.acyclic,ordered_node_count:execution.order.length,layer_count:execution.layers.length,frontier_count:execution.frontier.length,critical_path_length:execution.criticalPathLength,cycle_count:execution.cycles.length,...summary?{}:{frontier:execution.frontier.slice(0,sampleLimit),critical_path:execution.criticalPath.slice(0,sampleLimit),cycles:execution.cycles.slice(0,sampleLimit)}}}function buildGraphKnowledgeSummary(knowledge,summary,sampleLimit){return{component_count:knowledge.components.length,largest_component_size:knowledge.components[0]?.length??0,orphan_count:knowledge.orphans.length,...summary?{}:{orphans:knowledge.orphans.slice(0,sampleLimit),hubs:knowledge.hubs.slice(0,sampleLimit)}}}function buildGraphHierarchySummary(hierarchy,summary,sampleLimit){let legacyCycleCount=0;let legacyCardinalityCount=0;let legacyDivergenceCount=0;for(const finding of hierarchy.cycles){legacyCycleCount+=Number(finding.legacy_terminal)}for(const finding of hierarchy.cardinality_violations){legacyCardinalityCount+=Number(finding.legacy_terminal)}for(const finding of hierarchy.divergences){legacyDivergenceCount+=Number(finding.legacy_terminal)}return{acyclic:hierarchy.cycles.length===0,relation_count:hierarchy.relations.length,cycle_count:hierarchy.cycles.length,active_cycle_count:hierarchy.cycles.length-legacyCycleCount,legacy_cycle_count:legacyCycleCount,cardinality_violation_count:hierarchy.cardinality_violations.length,active_cardinality_violation_count:hierarchy.cardinality_violations.length-legacyCardinalityCount,legacy_cardinality_violation_count:legacyCardinalityCount,parent_divergence_count:hierarchy.divergences.length,active_parent_divergence_count:hierarchy.divergences.length-legacyDivergenceCount,legacy_parent_divergence_count:legacyDivergenceCount,...summary?{}:{cycles:hierarchy.cycles.slice(0,sampleLimit).map(cycle=>cycle.item_ids)}}}function runGraphAnalyze(invocation){const graph=invocation.assembly.graph;const sampleLimit=invocation.limit??DEFAULT_SAMPLE_LIMIT;const execution=analyzeRelationshipExecution(graph,{registry:graph.registry()});const knowledge=analyzeKnowledgeGraph(graph);return{subcommand:"analyze",node_count:graph.nodes().length,edge_count:graph.edges().length,edge_basis:"deduplicated_directed",sample_limit:sampleLimit,execution:buildGraphExecutionSummary(execution,invocation.summary,sampleLimit),knowledge:buildGraphKnowledgeSummary(knowledge,invocation.summary,sampleLimit),hierarchy:buildGraphHierarchySummary(getWorkspaceHierarchyIntegrity(invocation.assembly),invocation.summary,sampleLimit)}}function runGraphAudit(invocation,isTerminal){const report=auditWorkspaceRelationshipGraph(invocation.assembly,{isTerminal,...invocation.sample===void 0?{}:{maxSampleSize:invocation.sample},...invocation.exemptIsolates.length===0?{}:{exemptIsolates:invocation.exemptIsolates},...invocation.exemptIsolateTypes.length===0?{}:{isolateExemptTypes:invocation.exemptIsolateTypes}});const bySeverity={};const byCode={};const affectedBySeverity={};const affectedByCode={};for(const finding of report.findings){bySeverity[finding.severity]=(bySeverity[finding.severity]??0)+1;byCode[finding.code]=(byCode[finding.code]??0)+1;affectedBySeverity[finding.severity]=(affectedBySeverity[finding.severity]??0)+finding.count;affectedByCode[finding.code]=(affectedByCode[finding.code]??0)+finding.count}const{finding_subjects_by_code:_findingSubjects,...compactProfile}=report.profile;return{subcommand:"audit",finding_count:report.findings.length,findings_by_severity:bySeverity,findings_by_code:byCode,affected_subjects_by_severity:affectedBySeverity,affected_subjects_by_code:affectedByCode,profile:invocation.summary?compactProfile:report.profile,legacy_alias_counts:invocation.assembly.legacyAliasCounts,...invocation.summary?{}:{findings:report.findings}}}function runGraphCommunities(invocation){const sampleLimit=invocation.limit??DEFAULT_SAMPLE_LIMIT;const options={};if(invocation.kinds!==void 0)options.kinds=invocation.kinds;const result=detectRelationshipCommunities(invocation.assembly.graph,options);const analysis=result.value;return{subcommand:"communities",community_count:analysis.communities.length,largest_community_size:analysis.communities[0]?.size??0,iterations:analysis.iterations,converged:analysis.converged,truncated:!analysis.converged||analysis.communities.length>sampleLimit,cost:{visited_nodes:result.meta.visitedNodes,inspected_edges:result.meta.inspectedEdges},...invocation.summary?{}:{communities:analysis.communities.slice(0,sampleLimit).map(community=>({representative:community.representative,size:community.size,members:community.members.slice(0,sampleLimit)}))}}}function runGraphRedundancy(invocation){let result;try{result=findRedundantRelationshipEdges(invocation.assembly.graph,{...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth},...invocation.limit===void 0?{}:{limit:invocation.limit}})}catch(error){rethrowGraphUsage(error)}return{subcommand:"redundancy",redundant_count:result.value.length,...projectQueryMeta(result.meta),...invocation.summary?{}:{redundant:result.value.map(row=>({source:row.edge.source,target:row.edge.target,kind:row.edge.kind,witness:row.witness}))}}}function runGraphDominators(root,invocation){const limit=invocation.limit??DEFAULT_SAMPLE_LIMIT;const result=computeRelationshipDominators(invocation.assembly.graph,root,{direction:invocation.direction,...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth}});const bottlenecks=result.value.rows.filter(row=>row.dominatedCount>0);return{subcommand:"dominators",root,direction:invocation.direction,reachable_count:result.value.reachableCount,bottleneck_count:bottlenecks.length,truncated:result.meta.truncated||bottlenecks.length>limit,cost:{visited_nodes:result.meta.visitedNodes,inspected_edges:result.meta.inspectedEdges},...invocation.summary?{}:{bottlenecks:bottlenecks.slice(0,limit).map(row=>({id:row.id,idom:row.idom,dominated_count:row.dominatedCount}))}}}function runGraphSlack(invocation){const limit=invocation.limit??DEFAULT_SAMPLE_LIMIT;const analysis=analyzeRelationshipSchedule(invocation.assembly.graph);const criticalCount=analysis.rows.filter(row=>row.critical).length;return{subcommand:"slack",acyclic:analysis.acyclic,makespan:analysis.makespan,scheduled_count:analysis.scheduledCount,critical_count:criticalCount,critical_path_length:analysis.criticalPathLength,cycle_count:analysis.cycles.length,truncated:analysis.rows.length>limit,...invocation.summary?{}:{critical_path:analysis.criticalPath,rows:analysis.rows.slice(0,limit).map(row=>({id:row.id,earliest_start:row.earliestStart,latest_start:row.latestStart,slack:row.slack,critical:row.critical}))}}}function runGraphCentrality(invocation){const limit=invocation.limit??DEFAULT_SAMPLE_LIMIT;const result=computeRelationshipCentrality(invocation.assembly.graph,invocation.kinds===void 0?{}:{kinds:invocation.kinds});const analysis=result.value;return{subcommand:"centrality",node_count:analysis.nodeCount,edge_count:analysis.edgeCount,edge_basis:"simple_undirected",truncated:analysis.rows.length>limit,cost:{visited_nodes:result.meta.visitedNodes,inspected_edges:result.meta.inspectedEdges},...invocation.summary?{}:{rows:analysis.rows.slice(0,limit).map(row=>({id:row.id,degree:row.degree,in_degree:row.inDegree,out_degree:row.outDegree,betweenness:row.betweenness,closeness:row.closeness}))}}}function runGraphArticulation(invocation){const limit=invocation.limit??DEFAULT_SAMPLE_LIMIT;const result=findRelationshipCutStructure(invocation.assembly.graph,invocation.kinds===void 0?{}:{kinds:invocation.kinds});const{articulationPoints,bridges}=result.value;return{subcommand:"articulation",articulation_count:articulationPoints.length,bridge_count:bridges.length,truncated:articulationPoints.length>limit||bridges.length>limit,cost:{visited_nodes:result.meta.visitedNodes,inspected_edges:result.meta.inspectedEdges},...invocation.summary?{}:{articulation_points:articulationPoints.slice(0,limit),bridges:bridges.slice(0,limit)}}}function runGraphPlan(invocation,isTerminal){const limit=invocation.limit??DEFAULT_SAMPLE_LIMIT;const plan=planRelationshipRemediation(invocation.assembly,{isTerminal,redundancyLimit:limit,...invocation.sample===void 0?{}:{maxSampleSize:invocation.sample},...invocation.exemptIsolates.length===0?{}:{exemptIsolates:invocation.exemptIsolates},...invocation.exemptIsolateTypes.length===0?{}:{isolateExemptTypes:invocation.exemptIsolateTypes}});const byOp={};const byCode={};for(const step of plan.steps){byOp[step.op]=(byOp[step.op]??0)+1;byCode[step.code]=(byCode[step.code]??0)+1}return{subcommand:"plan",step_count:plan.steps.length,steps_by_op:byOp,steps_by_code:byCode,finding_count:plan.report.findings.length,truncated:plan.truncated||plan.steps.length>limit,cost:{visited_nodes:plan.cost.visitedNodes,inspected_edges:plan.cost.inspectedEdges},...invocation.summary?{}:{steps:plan.steps.slice(0,limit)}}}function buildGraphQueryKey(subcommand,root,pathsTarget,invocation){return JSON.stringify({subcommand,root:root??null,target:pathsTarget??null,kinds:invocation.kinds??null,maxDepth:invocation.maxDepth??null,limit:invocation.limit??null,after:invocation.after??null,direction:invocation.direction,maxPaths:invocation.maxPaths??null,sample:invocation.sample??null,exemptIsolates:[...new Set(invocation.exemptIsolates.map(id=>id.toLowerCase()))].sort(),exemptIsolateTypes:[...new Set(invocation.exemptIsolateTypes.map(type=>type.toLowerCase()))].sort(),summary:invocation.summary,unbounded:invocation.unbounded})}function executeGraphSubcommand(subcommand,root,pathsTarget,invocation,isTerminal){if(subcommand==="analyze")return runGraphAnalyze(invocation);if(subcommand==="audit")return runGraphAudit(invocation,isTerminal);if(subcommand==="plan")return runGraphPlan(invocation,isTerminal);if(subcommand==="communities")return runGraphCommunities(invocation);if(subcommand==="redundancy")return runGraphRedundancy(invocation);if(subcommand==="dominators")return runGraphDominators(root,invocation);if(subcommand==="slack")return runGraphSlack(invocation);if(subcommand==="centrality")return runGraphCentrality(invocation);if(subcommand==="articulation")return runGraphArticulation(invocation);if(subcommand==="paths")return runGraphPaths(root,pathsTarget,invocation);if(subcommand==="impact")return runGraphImpact(root,invocation);return runGraphTraversal(subcommand,root,invocation)}function assertGraphFlagScope(subcommand,options){if(subcommand!=="index"&&(options.rebuild===true||options.clear===true))throw new PmCliError("--rebuild and --clear apply only to graph index.",EXIT_CODE.USAGE);if(subcommand!=="audit"&&options.saveBaseline===true)throw new PmCliError("--save-baseline applies only to graph audit.",EXIT_CODE.USAGE);if(subcommand==="slack"&&options.kind!==void 0)throw new PmCliError("graph slack analyzes every ordering kind; --kind is not supported.",EXIT_CODE.USAGE);if(options.rebuild===true&&options.clear===true)throw new PmCliError("graph index accepts either --rebuild or --clear, not both.",EXIT_CODE.USAGE);if(subcommand==="impact"&&options.full===true&&options.limit!==void 0)throw new PmCliError("graph impact accepts either --full or --limit, not both.",EXIT_CODE.USAGE)}async function runGraphIndex(pmRoot,fingerprint,invocation,itemCount,isTerminal,options){let action="status";if(options.clear===true){await clearDurableGraphCache(pmRoot);action="cleared"}if(options.rebuild===true){await clearDurableGraphCache(pmRoot);const view=await openDurableGraphCache(pmRoot,fingerprint);const warmInvocation={assembly:invocation.assembly,direction:"both",exemptIsolates:[],exemptIsolateTypes:[],saveBaseline:false,summary:true,unbounded:false};for(const warm of["analyze","audit"]){await persistDurableGraphResult(pmRoot,fingerprint,view,buildGraphQueryKey(warm,void 0,void 0,warmInvocation),executeGraphSubcommand(warm,void 0,void 0,warmInvocation,isTerminal))}action="rebuilt"}const status=await durableGraphCacheStatus(pmRoot,fingerprint);return{subcommand:"index",action,state:status.exists?status.fresh?"fresh":"stale":"absent",entry_count:status.entry_count,item_count:itemCount,min_items_threshold:GRAPH_DURABLE_CACHE_MIN_ITEMS,persist_enabled:shouldPersistDurableGraphCache(itemCount,status.exists),current_fingerprint:fingerprint.slice(0,12),...status.saved_at===void 0?{}:{saved_at:status.saved_at},...status.bytes===void 0?{}:{bytes:status.bytes}}}async function applyAuditBaseline(pmRoot,fingerprint,audit,saveBaseline){const current={saved_at:new Date().toISOString(),fingerprint,affected_subjects_by_code:audit.affected_subjects_by_code,profile:{...audit.profile,finding_subjects_by_code:Object.fromEntries(RELATIONSHIP_AUDIT_FINDING_CODES.map(code=>[code,audit.affected_subjects_by_code[code]??0]))}};const stored=await loadGraphAuditBaseline(pmRoot);if(saveBaseline)await saveGraphAuditBaseline(pmRoot,current);return stored===void 0?audit:{...audit,baseline:diffRelationshipAuditSnapshots(stored,current)}}async function persistDurableGraphResultBestEffort(pmRoot,fingerprint,view,queryKey,result){try{await persistDurableGraphResult(pmRoot,fingerprint,view,queryKey,result)}catch{}}function attachDeadlineSchedule(value,invocation,items,isTerminal){if(value.subcommand!=="slack")return;const terminal=new Set(invocation.assembly.details.filter(detail=>isTerminal(detail.status)).map(detail=>detail.id));const graph=invocation.assembly.graph;const activeGraph=new RelationshipGraph(graph.nodes().filter(id=>!terminal.has(id)),graph.edges().filter(edge=>!terminal.has(edge.source)&&!terminal.has(edge.target)),graph.registry());const analysis=deriveRelationshipDeadlines(activeGraph,items.filter(item=>!terminal.has(item.id)),{now:nowIso(),limit:invocation.limit??DEFAULT_SAMPLE_LIMIT});const{rows,residuals,overcommitted,...counts}=analysis;value.deadline_schedule={population:"active",...counts,...invocation.summary?{}:{rows,residuals,overcommitted}}}async function runGraph(subcommandRaw,id,target,options,global2){const subcommand=parseGraphSubcommand(subcommandRaw,id,target);assertProjectionModeChoice(options.summary===true,options.full===true,"--summary");const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const items=await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema);const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const isTerminal=status=>isTerminalStatus(status,statusRegistry);assertGraphFlagScope(subcommand,options);const relationshipRegistry=resolveWorkspaceRelationshipKindRegistry();const kinds=parseKinds(options.kind,relationshipRegistry);const lookup=workspaceGraphCache().lookup(pmRoot,computeWorkspaceGraphFingerprint(items,isTerminal,relationshipRegistry),()=>assembleWorkspaceRelationshipGraph(items,isTerminal,relationshipRegistry));const invocation={assembly:lookup.assembly,...kinds===void 0?{}:{kinds},maxDepth:parseMaxDepth(options.maxDepth),limit:parsePositiveInteger(options.limit,"limit"),after:options.after?.trim()||void 0,direction:parseDirection(options.direction),maxPaths:parsePositiveInteger(options.maxPaths,"max-paths"),sample:parsePositiveInteger(options.sample,"sample"),exemptIsolates:normalizeIdList(options.exemptIsolate),exemptIsolateTypes:normalizeIdList(options.exemptIsolateType),saveBaseline:options.saveBaseline===true,summary:options.summary===true,unbounded:options.full===true};if(subcommand==="index"){return attachGraphProjection(await runGraphIndex(pmRoot,lookup.fingerprint,invocation,items.length,isTerminal,options),false)}const root=ROOTED_SUBCOMMANDS.has(subcommand)?canonicalizeGraphId(invocation.assembly,id):void 0;const pathsTarget=subcommand==="paths"?canonicalizeGraphId(invocation.assembly,target):void 0;const queryKey=buildGraphQueryKey(subcommand,root,pathsTarget,invocation);const durableView=await openDurableGraphCache(pmRoot,lookup.fingerprint);const durableValue=durableView.results[queryKey];const memo=lookup.memoize(queryKey,()=>durableValue!==void 0?structuredClone(durableValue):executeGraphSubcommand(subcommand,root,pathsTarget,invocation,isTerminal));const persistEnabled=shouldPersistDurableGraphCache(items.length,durableView.exists);if(!memo.reused&&durableValue===void 0&&persistEnabled){await persistDurableGraphResultBestEffort(pmRoot,lookup.fingerprint,durableView,queryKey,memo.value)}const value=memo.value.subcommand==="audit"?await applyAuditBaseline(pmRoot,lookup.fingerprint,memo.value,invocation.saveBaseline):memo.value;value.cache={fingerprint:lookup.fingerprint.slice(0,12),assembly:lookup.assemblyReused?"hit":"miss",result:memo.reused?"hit":"miss",durable:durableValue!==void 0?"hit":persistEnabled?"miss":"off"};attachDeadlineSchedule(value,invocation,items,isTerminal);return attachGraphProjection(value,invocation.summary,"result_rows")}export{GRAPH_SUBCOMMAND_VALUES,parseGraphSubcommand,runGraph};
|
|
1
|
+
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="123fbdac-0fc7-5f02-85d9-9a7ca55e1df1")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{isTerminalStatus}from"../../core/item/status.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{nowIso}from"../../core/shared/time.js";import{createUnknownSubcommandError}from"../agent/subcommand-recovery.js";import{listAllItemMetadataLight}from"../../core/store/item-store.js";import{resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{parseDirection,parseKinds,parseMaxDepth,parsePositiveInteger}from"../dependencies.js";import{analyzeGraphImpact,analyzeKnowledgeGraph,analyzeRelationshipExecution}from"../relationship-analytics.js";import{RelationshipGraph}from"../relationships.js";import{computeRelationshipDominators,detectRelationshipCommunities,findRedundantRelationshipEdges}from"./analytics.js";import{computeRelationshipCentrality,findRelationshipCutStructure}from"./centrality.js";import{analyzeRelationshipSchedule}from"./scheduling.js";import{deriveRelationshipDeadlines}from"./deadline-scheduling.js";import{assembleWorkspaceRelationshipGraph,getWorkspaceHierarchyIntegrity,resolveWorkspaceRelationshipKindRegistry}from"./assembly.js";import{computeWorkspaceGraphFingerprint,workspaceGraphCache}from"./cache.js";import{clearDurableGraphCache,durableGraphCacheStatus,loadGraphAuditBaseline,openDurableGraphCache,persistDurableGraphResult,saveGraphAuditBaseline,shouldPersistDurableGraphCache,GRAPH_DURABLE_CACHE_MIN_ITEMS}from"./durable-cache.js";import{auditWorkspaceRelationshipGraph,diffRelationshipAuditSnapshots}from"./governance.js";import{RELATIONSHIP_AUDIT_FINDING_CODES}from"./governance-contracts.js";import{planRelationshipRemediation}from"./remediation.js";import{enumerateRelationshipPaths,hierarchyAncestors,hierarchyDescendants,orderingPredecessors,orderingSuccessors}from"./traversal.js";import{GRAPH_SUBCOMMAND_VALUES}from"../cli-contracts/enum-contracts.js";import{assertProjectionModeChoice}from"../output-projection.js";import{GRAPH_QUERY_DEFAULTS}from"./query-contracts.js";const ROOTED_SUBCOMMANDS=new Set(["ancestors","descendants","predecessors","successors","paths","impact","dominators"]);function attachGraphProjection(result,summary,rowGroup){let projected=result;if(summary&&result.subcommand==="audit"){const{nodes,recorded_nodes,edges,active_nodes,terminal_nodes,missing_nodes,ordering_acyclic,active_ordering_acyclic,coverage_by_lifecycle}=result.profile;const populations=Object.fromEntries(Object.entries(coverage_by_lifecycle).map(([key,population])=>{const{degree_histogram:_histogram,...counts}=population;return[key,counts]}));projected={...result,profile:{nodes,recorded_nodes,edges,active_nodes,terminal_nodes,missing_nodes,ordering_acyclic,active_ordering_acyclic,coverage_by_lifecycle:populations}}}return{...projected,projection:{mode:summary?"summary":"full",declared_field_groups:rowGroup===void 0?[]:[{name:rowGroup,restore_with:"--full"}],included_field_groups:rowGroup===void 0||summary?[]:[rowGroup]}}}function parseGraphInvocation(subcommand,assembly,kinds,options){return{assembly,...kinds===void 0?{}:{kinds},maxDepth:parseMaxDepth(options.maxDepth),limit:subcommand==="impact"&&Number(options.limit)===0?0:parsePositiveInteger(options.limit,"limit")??(options.full===true?Number.MAX_SAFE_INTEGER:GRAPH_QUERY_DEFAULTS.rows),after:options.after?.trim()||void 0,direction:parseDirection(options.direction),maxPaths:parsePositiveInteger(options.maxPaths,"max-paths"),sample:parsePositiveInteger(options.sample,"sample")??GRAPH_QUERY_DEFAULTS.samples,exemptIsolates:normalizeIdList(options.exemptIsolate),exemptIsolateTypes:normalizeIdList(options.exemptIsolateType),saveBaseline:options.saveBaseline===true,summary:options.summary===true,unbounded:options.full===true}}function normalizeIdList(raw){if(raw===void 0)return[];return(Array.isArray(raw)?raw:[raw]).flatMap(value=>value.split(",")).map(value=>value.trim()).filter(value=>value.length>0)}function parseGraphSubcommand(raw,id,target){const candidate=raw.trim().toLowerCase();if(!GRAPH_SUBCOMMAND_VALUES.includes(candidate)){throw createUnknownSubcommandError({command_path:"graph",token:candidate||"<empty>",allowed:GRAPH_SUBCOMMAND_VALUES})}const subcommand=candidate;if(ROOTED_SUBCOMMANDS.has(subcommand)&&!id?.trim()){throw new PmCliError(`graph ${subcommand} requires an item id.`,EXIT_CODE.USAGE)}if(subcommand==="paths"&&!target?.trim()){throw new PmCliError("graph paths requires a source and a target item id.",EXIT_CODE.USAGE)}return subcommand}function rethrowGraphUsage(error){if(error instanceof TypeError)throw new PmCliError(error.message,EXIT_CODE.USAGE);throw error}function projectQueryMeta(meta){return{truncated:meta.truncated,cost:{visited_nodes:meta.visitedNodes,inspected_edges:meta.inspectedEdges}}}function canonicalizeGraphId(assembly,raw){const wanted=raw.trim().toLowerCase();for(const detail of assembly.details){if(detail.id.trim().toLowerCase()===wanted&&!assembly.missingIdSet.has(detail.id.toLowerCase())){return detail.id}}throw new PmCliError(`Item ${raw} not found`,EXIT_CODE.NOT_FOUND)}function runGraphTraversal(subcommand,root,invocation){const walk={ancestors:hierarchyAncestors,descendants:hierarchyDescendants,predecessors:orderingPredecessors,successors:orderingSuccessors}[subcommand];let result;try{result=walk(invocation.assembly.graph,root,{...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth},limit:invocation.limit,...invocation.after===void 0?{}:{after:invocation.after}})}catch(error){rethrowGraphUsage(error)}const meta=projectQueryMeta(result.meta);return{subcommand,root,count:result.value.length,...meta,...result.meta.nextCursor===void 0?{}:{next_cursor:result.meta.nextCursor},...invocation.summary?{}:{ids:result.value}}}function runGraphPaths(root,target,invocation){const result=enumerateRelationshipPaths(invocation.assembly.graph,root,target,{direction:invocation.direction,...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth},...invocation.maxPaths===void 0?{}:{maxPaths:invocation.maxPaths}});return{subcommand:"paths",root,target,direction:invocation.direction,count:result.value.length,...projectQueryMeta(result.meta),...invocation.summary?{}:{paths:result.value.map(path=>({nodes:path.nodes,kinds:path.edges.map(edge=>edge.kind),length:path.length}))}}}function runGraphImpact(root,invocation){let analysis;try{analysis=analyzeGraphImpact(invocation.assembly.graph,root,{direction:invocation.direction,...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth},...invocation.unbounded?{}:{limit:invocation.limit},...invocation.after===void 0?{}:{after:invocation.after}})}catch(error){rethrowGraphUsage(error)}return{subcommand:"impact",root,direction:invocation.direction,count:analysis.affected.length,truncated:analysis.truncated,...analysis.nextCursor===void 0?{}:{next_cursor:analysis.nextCursor},cost:{visited_nodes:analysis.cost.visitedNodes,inspected_edges:analysis.cost.inspectedEdges},...invocation.summary?{}:{affected:analysis.affected}}}function buildGraphExecutionSummary(execution,summary,sampleLimit){return{acyclic:execution.acyclic,ordered_node_count:execution.order.length,layer_count:execution.layers.length,frontier_count:execution.frontier.length,critical_path_length:execution.criticalPathLength,cycle_count:execution.cycles.length,...summary?{}:{frontier:execution.frontier.slice(0,sampleLimit),critical_path:execution.criticalPath.slice(0,sampleLimit),cycles:execution.cycles.slice(0,sampleLimit)}}}function buildGraphKnowledgeSummary(knowledge,summary,sampleLimit){return{component_count:knowledge.components.length,largest_component_size:knowledge.components[0]?.length??0,orphan_count:knowledge.orphans.length,...summary?{}:{orphans:knowledge.orphans.slice(0,sampleLimit),hubs:knowledge.hubs.slice(0,sampleLimit)}}}function buildGraphHierarchySummary(hierarchy,summary,sampleLimit){let legacyCycleCount=0;let legacyCardinalityCount=0;let legacyDivergenceCount=0;for(const finding of hierarchy.cycles){legacyCycleCount+=Number(finding.legacy_terminal)}for(const finding of hierarchy.cardinality_violations){legacyCardinalityCount+=Number(finding.legacy_terminal)}for(const finding of hierarchy.divergences){legacyDivergenceCount+=Number(finding.legacy_terminal)}return{acyclic:hierarchy.cycles.length===0,relation_count:hierarchy.relations.length,cycle_count:hierarchy.cycles.length,active_cycle_count:hierarchy.cycles.length-legacyCycleCount,legacy_cycle_count:legacyCycleCount,cardinality_violation_count:hierarchy.cardinality_violations.length,active_cardinality_violation_count:hierarchy.cardinality_violations.length-legacyCardinalityCount,legacy_cardinality_violation_count:legacyCardinalityCount,parent_divergence_count:hierarchy.divergences.length,active_parent_divergence_count:hierarchy.divergences.length-legacyDivergenceCount,legacy_parent_divergence_count:legacyDivergenceCount,...summary?{}:{cycles:hierarchy.cycles.slice(0,sampleLimit).map(cycle=>cycle.item_ids)}}}function runGraphAnalyze(invocation){const graph=invocation.assembly.graph;const sampleLimit=invocation.limit;const execution=analyzeRelationshipExecution(graph,{registry:graph.registry()});const knowledge=analyzeKnowledgeGraph(graph);return{subcommand:"analyze",node_count:graph.nodes().length,edge_count:graph.edges().length,edge_basis:"deduplicated_directed",sample_limit:sampleLimit,execution:buildGraphExecutionSummary(execution,invocation.summary,sampleLimit),knowledge:buildGraphKnowledgeSummary(knowledge,invocation.summary,sampleLimit),hierarchy:buildGraphHierarchySummary(getWorkspaceHierarchyIntegrity(invocation.assembly),invocation.summary,sampleLimit)}}function runGraphAudit(invocation,isTerminal){const report=auditWorkspaceRelationshipGraph(invocation.assembly,{isTerminal,maxSampleSize:invocation.sample,...invocation.exemptIsolates.length===0?{}:{exemptIsolates:invocation.exemptIsolates},...invocation.exemptIsolateTypes.length===0?{}:{isolateExemptTypes:invocation.exemptIsolateTypes}});const bySeverity={};const byCode={};const affectedBySeverity={};const affectedByCode={};for(const finding of report.findings){bySeverity[finding.severity]=(bySeverity[finding.severity]??0)+1;byCode[finding.code]=(byCode[finding.code]??0)+1;affectedBySeverity[finding.severity]=(affectedBySeverity[finding.severity]??0)+finding.count;affectedByCode[finding.code]=(affectedByCode[finding.code]??0)+finding.count}const{finding_subjects_by_code:_findingSubjects,...compactProfile}=report.profile;return{subcommand:"audit",truncated:report.findings.length>invocation.limit,finding_count:report.findings.length,findings_by_severity:bySeverity,findings_by_code:byCode,affected_subjects_by_severity:affectedBySeverity,affected_subjects_by_code:affectedByCode,profile:invocation.summary?compactProfile:report.profile,legacy_alias_counts:invocation.assembly.legacyAliasCounts,...invocation.summary?{}:{findings:report.findings.slice(0,invocation.limit)}}}function runGraphCommunities(invocation){const sampleLimit=invocation.limit;const options={};if(invocation.kinds!==void 0)options.kinds=invocation.kinds;const result=detectRelationshipCommunities(invocation.assembly.graph,options);const analysis=result.value;return{subcommand:"communities",community_count:analysis.communities.length,largest_community_size:analysis.communities[0]?.size??0,iterations:analysis.iterations,converged:analysis.converged,truncated:!analysis.converged||analysis.communities.length>sampleLimit,cost:{visited_nodes:result.meta.visitedNodes,inspected_edges:result.meta.inspectedEdges},...invocation.summary?{}:{communities:analysis.communities.slice(0,sampleLimit).map(community=>({representative:community.representative,size:community.size,members:community.members.slice(0,sampleLimit)}))}}}function runGraphRedundancy(invocation){let result;try{result=findRedundantRelationshipEdges(invocation.assembly.graph,{...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth},limit:invocation.limit})}catch(error){rethrowGraphUsage(error)}return{subcommand:"redundancy",redundant_count:result.value.length,...projectQueryMeta(result.meta),...invocation.summary?{}:{redundant:result.value.map(row=>({source:row.edge.source,target:row.edge.target,kind:row.edge.kind,witness:row.witness}))}}}function runGraphDominators(root,invocation){const limit=invocation.limit;const result=computeRelationshipDominators(invocation.assembly.graph,root,{direction:invocation.direction,...invocation.kinds===void 0?{}:{kinds:invocation.kinds},...invocation.maxDepth===void 0?{}:{maxDepth:invocation.maxDepth}});const bottlenecks=result.value.rows.filter(row=>row.dominatedCount>0);return{subcommand:"dominators",root,direction:invocation.direction,reachable_count:result.value.reachableCount,bottleneck_count:bottlenecks.length,truncated:result.meta.truncated||bottlenecks.length>limit,cost:{visited_nodes:result.meta.visitedNodes,inspected_edges:result.meta.inspectedEdges},...invocation.summary?{}:{bottlenecks:bottlenecks.slice(0,limit).map(row=>({id:row.id,idom:row.idom,dominated_count:row.dominatedCount}))}}}function runGraphSlack(invocation){const limit=invocation.limit;const analysis=analyzeRelationshipSchedule(invocation.assembly.graph);const criticalCount=analysis.rows.filter(row=>row.critical).length;return{subcommand:"slack",acyclic:analysis.acyclic,makespan:analysis.makespan,scheduled_count:analysis.scheduledCount,critical_count:criticalCount,critical_path_length:analysis.criticalPathLength,cycle_count:analysis.cycles.length,truncated:analysis.rows.length>limit,...invocation.summary?{}:{critical_path:analysis.criticalPath.slice(0,limit),rows:analysis.rows.slice(0,limit).map(row=>({id:row.id,earliest_start:row.earliestStart,latest_start:row.latestStart,slack:row.slack,critical:row.critical}))}}}function runGraphCentrality(invocation){const limit=invocation.limit;const result=computeRelationshipCentrality(invocation.assembly.graph,invocation.kinds===void 0?{}:{kinds:invocation.kinds});const analysis=result.value;return{subcommand:"centrality",node_count:analysis.nodeCount,edge_count:analysis.edgeCount,edge_basis:"simple_undirected",truncated:analysis.rows.length>limit,cost:{visited_nodes:result.meta.visitedNodes,inspected_edges:result.meta.inspectedEdges},...invocation.summary?{}:{rows:analysis.rows.slice(0,limit).map(row=>({id:row.id,degree:row.degree,in_degree:row.inDegree,out_degree:row.outDegree,betweenness:row.betweenness,closeness:row.closeness}))}}}function runGraphArticulation(invocation){const limit=invocation.limit;const result=findRelationshipCutStructure(invocation.assembly.graph,invocation.kinds===void 0?{}:{kinds:invocation.kinds});const{articulationPoints,bridges}=result.value;return{subcommand:"articulation",articulation_count:articulationPoints.length,bridge_count:bridges.length,truncated:articulationPoints.length>limit||bridges.length>limit,cost:{visited_nodes:result.meta.visitedNodes,inspected_edges:result.meta.inspectedEdges},...invocation.summary?{}:{articulation_points:articulationPoints.slice(0,limit),bridges:bridges.slice(0,limit)}}}function runGraphPlan(invocation,isTerminal){const limit=invocation.limit;const plan=planRelationshipRemediation(invocation.assembly,{isTerminal,redundancyLimit:limit,maxSampleSize:invocation.sample,...invocation.exemptIsolates.length===0?{}:{exemptIsolates:invocation.exemptIsolates},...invocation.exemptIsolateTypes.length===0?{}:{isolateExemptTypes:invocation.exemptIsolateTypes}});const byOp={};const byCode={};for(const step of plan.steps){byOp[step.op]=(byOp[step.op]??0)+1;byCode[step.code]=(byCode[step.code]??0)+1}return{subcommand:"plan",step_count:plan.steps.length,steps_by_op:byOp,steps_by_code:byCode,finding_count:plan.report.findings.length,truncated:plan.truncated||plan.steps.length>limit,cost:{visited_nodes:plan.cost.visitedNodes,inspected_edges:plan.cost.inspectedEdges},...invocation.summary?{}:{steps:plan.steps.slice(0,limit)}}}function buildGraphQueryKey(subcommand,root,pathsTarget,invocation){return JSON.stringify({projection_version:2,subcommand,root:root??null,target:pathsTarget??null,kinds:invocation.kinds??null,maxDepth:invocation.maxDepth??null,limit:invocation.limit,after:invocation.after??null,direction:invocation.direction,maxPaths:invocation.maxPaths??null,sample:invocation.sample,exemptIsolates:[...new Set(invocation.exemptIsolates.map(id=>id.toLowerCase()))].sort(),exemptIsolateTypes:[...new Set(invocation.exemptIsolateTypes.map(type=>type.toLowerCase()))].sort(),summary:invocation.summary,unbounded:invocation.unbounded})}function executeGraphSubcommand(subcommand,root,pathsTarget,invocation,isTerminal){if(subcommand==="analyze")return runGraphAnalyze(invocation);if(subcommand==="audit")return runGraphAudit(invocation,isTerminal);if(subcommand==="plan")return runGraphPlan(invocation,isTerminal);if(subcommand==="communities")return runGraphCommunities(invocation);if(subcommand==="redundancy")return runGraphRedundancy(invocation);if(subcommand==="dominators")return runGraphDominators(root,invocation);if(subcommand==="slack")return runGraphSlack(invocation);if(subcommand==="centrality")return runGraphCentrality(invocation);if(subcommand==="articulation")return runGraphArticulation(invocation);if(subcommand==="paths")return runGraphPaths(root,pathsTarget,invocation);if(subcommand==="impact")return runGraphImpact(root,invocation);return runGraphTraversal(subcommand,root,invocation)}function assertGraphFlagScope(subcommand,options){if(subcommand!=="index"&&(options.rebuild===true||options.clear===true))throw new PmCliError("--rebuild and --clear apply only to graph index.",EXIT_CODE.USAGE);if(subcommand!=="audit"&&options.saveBaseline===true)throw new PmCliError("--save-baseline applies only to graph audit.",EXIT_CODE.USAGE);if(subcommand==="slack"&&options.kind!==void 0)throw new PmCliError("graph slack analyzes every ordering kind; --kind is not supported.",EXIT_CODE.USAGE);if(options.rebuild===true&&options.clear===true)throw new PmCliError("graph index accepts either --rebuild or --clear, not both.",EXIT_CODE.USAGE);if(options.full===true&&options.limit!==void 0)throw new PmCliError(`graph ${subcommand} accepts either --full or --limit, not both.`,EXIT_CODE.USAGE)}async function runGraphIndex(pmRoot,fingerprint,invocation,itemCount,isTerminal,options){let action="status";if(options.clear===true){await clearDurableGraphCache(pmRoot);action="cleared"}if(options.rebuild===true){await clearDurableGraphCache(pmRoot);const view=await openDurableGraphCache(pmRoot,fingerprint);const warmInvocation={assembly:invocation.assembly,direction:"both",exemptIsolates:[],exemptIsolateTypes:[],saveBaseline:false,summary:true,limit:GRAPH_QUERY_DEFAULTS.rows,sample:GRAPH_QUERY_DEFAULTS.samples,unbounded:false};for(const warm of["analyze","audit"]){await persistDurableGraphResult(pmRoot,fingerprint,view,buildGraphQueryKey(warm,void 0,void 0,warmInvocation),executeGraphSubcommand(warm,void 0,void 0,warmInvocation,isTerminal))}action="rebuilt"}const status=await durableGraphCacheStatus(pmRoot,fingerprint);return{subcommand:"index",action,state:status.exists?status.fresh?"fresh":"stale":"absent",entry_count:status.entry_count,item_count:itemCount,min_items_threshold:GRAPH_DURABLE_CACHE_MIN_ITEMS,persist_enabled:shouldPersistDurableGraphCache(itemCount,status.exists),current_fingerprint:fingerprint.slice(0,12),...status.saved_at===void 0?{}:{saved_at:status.saved_at},...status.bytes===void 0?{}:{bytes:status.bytes}}}async function applyAuditBaseline(pmRoot,fingerprint,audit,saveBaseline){const current={saved_at:new Date().toISOString(),fingerprint,affected_subjects_by_code:audit.affected_subjects_by_code,profile:{...audit.profile,finding_subjects_by_code:Object.fromEntries(RELATIONSHIP_AUDIT_FINDING_CODES.map(code=>[code,audit.affected_subjects_by_code[code]??0]))}};const stored=await loadGraphAuditBaseline(pmRoot);if(saveBaseline)await saveGraphAuditBaseline(pmRoot,current);return stored===void 0?audit:{...audit,baseline:diffRelationshipAuditSnapshots(stored,current)}}async function persistDurableGraphResultBestEffort(pmRoot,fingerprint,view,queryKey,result){try{await persistDurableGraphResult(pmRoot,fingerprint,view,queryKey,result)}catch{}}function attachDeadlineSchedule(value,invocation,items,isTerminal){if(value.subcommand!=="slack")return;const terminal=new Set(invocation.assembly.details.filter(detail=>isTerminal(detail.status)).map(detail=>detail.id));const graph=invocation.assembly.graph;const activeGraph=new RelationshipGraph(graph.nodes().filter(id=>!terminal.has(id)),graph.edges().filter(edge=>!terminal.has(edge.source)&&!terminal.has(edge.target)),graph.registry());const analysis=deriveRelationshipDeadlines(activeGraph,items.filter(item=>!terminal.has(item.id)),{now:nowIso(),limit:invocation.limit});const{rows,residuals,overcommitted,...counts}=analysis;value.deadline_schedule={population:"active",...counts,...invocation.summary?{}:{rows,residuals,overcommitted}}}async function runGraph(subcommandRaw,id,target,options,global2){const subcommand=parseGraphSubcommand(subcommandRaw,id,target);assertProjectionModeChoice(options.summary===true,options.full===true,"--summary");const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const items=await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema);const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const isTerminal=status=>isTerminalStatus(status,statusRegistry);assertGraphFlagScope(subcommand,options);const relationshipRegistry=resolveWorkspaceRelationshipKindRegistry();const kinds=parseKinds(options.kind,relationshipRegistry);const lookup=workspaceGraphCache().lookup(pmRoot,computeWorkspaceGraphFingerprint(items,isTerminal,relationshipRegistry),()=>assembleWorkspaceRelationshipGraph(items,isTerminal,relationshipRegistry));const invocation=parseGraphInvocation(subcommand,lookup.assembly,kinds,options);if(subcommand==="index"){return attachGraphProjection(await runGraphIndex(pmRoot,lookup.fingerprint,invocation,items.length,isTerminal,options),false)}const root=ROOTED_SUBCOMMANDS.has(subcommand)?canonicalizeGraphId(invocation.assembly,id):void 0;const pathsTarget=subcommand==="paths"?canonicalizeGraphId(invocation.assembly,target):void 0;const queryKey=buildGraphQueryKey(subcommand,root,pathsTarget,invocation);const durableView=await openDurableGraphCache(pmRoot,lookup.fingerprint);const durableValue=durableView.results[queryKey];const memo=lookup.memoize(queryKey,()=>durableValue!==void 0?structuredClone(durableValue):executeGraphSubcommand(subcommand,root,pathsTarget,invocation,isTerminal));const persistEnabled=shouldPersistDurableGraphCache(items.length,durableView.exists);if(!memo.reused&&durableValue===void 0&&persistEnabled){await persistDurableGraphResultBestEffort(pmRoot,lookup.fingerprint,durableView,queryKey,memo.value)}const value=memo.value.subcommand==="audit"?await applyAuditBaseline(pmRoot,lookup.fingerprint,memo.value,invocation.saveBaseline):memo.value;value.cache={fingerprint:lookup.fingerprint.slice(0,12),assembly:lookup.assemblyReused?"hit":"miss",result:memo.reused?"hit":"miss",durable:durableValue!==void 0?"hit":persistEnabled?"miss":"off"};attachDeadlineSchedule(value,invocation,items,isTerminal);return attachGraphProjection(value,invocation.summary,"result_rows")}export{GRAPH_SUBCOMMAND_VALUES,parseGraphSubcommand,runGraph};
|
|
2
2
|
//# sourceMappingURL=run.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
1
|
+
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2ca317ff-f6b3-5f36-acc4-cd740b3d65e3")}catch(e2){}})();import{GRAPH_QUERY_DEFAULTS}from"./query-contracts.js";const DEFAULT_MAX_PATHS=GRAPH_QUERY_DEFAULTS.paths;const DEFAULT_MAX_VISITED_PATHS=GRAPH_QUERY_DEFAULTS.visited_paths;const DEFAULT_PATH_MAX_DEPTH=GRAPH_QUERY_DEFAULTS.path_depth;function assertPathBound(name,value){if(!Number.isFinite(value)||!Number.isInteger(value)||value<0)throw new TypeError(`Invalid path ${name} bound: ${String(value)}`)}function hierarchyParentEndpoint(edge,definition){return definition.hierarchyDirection==="target_parent"?edge.target:edge.source}function orderingPredecessorEndpoint(edge,definition){return(definition.precedence??"source_before_target")==="target_before_source"?edge.target:edge.source}function orientOrderingEdge(edge,definition){const predecessor=orderingPredecessorEndpoint(edge,definition);return{predecessor,successor:predecessor===edge.source?edge.target:edge.source}}function resolveFamilyKinds(graph,kinds,family){if(kinds===void 0)return void 0;const registry=graph.registry();const resolved=new Set;for(const kind of kinds){const definition=registry.require(kind);const traversal=definition.traversal;if(traversal==="association")throw new TypeError(`Relationship kind ${definition.kind} uses association traversal; use graph impact --direction both`);if(traversal!==family&&traversal!=="semantic"){const redirect=traversal==="hierarchy"?"graph ancestors or graph descendants":"graph predecessors or graph successors";throw new TypeError(`Relationship kind ${definition.kind} uses ${traversal} traversal; use ${redirect}`)}resolved.add(definition.kind)}return resolved}function expandSemanticNeighbors(graph,nodeId,familyKinds,family,matches){const registry=graph.registry();const rows=graph.neighborEdges(nodeId,{direction:"both",...familyKinds===void 0?{}:{kinds:[...familyKinds]}});const neighbors=[];const seen=new Set;for(const row of rows.value){const definition=registry.require(row.edge.kind);if(familyKinds===void 0&&!definition[family])continue;if(!matches(row,definition,nodeId))continue;if(seen.has(row.id))continue;seen.add(row.id);neighbors.push(row.id)}return{neighbors,inspectedEdges:rows.meta.inspectedEdges}}function appendSemanticExpansion(expansion,currentDepth,maxDepth,limit,after,state){if(currentDepth>=maxDepth){if(expansion.neighbors.some(neighbor=>!state.seen.has(neighbor)))state.truncated=true;return false}for(const neighbor of expansion.neighbors){if(state.seen.has(neighbor))continue;state.seen.add(neighbor);state.queue.push({id:neighbor,depth:currentDepth+1});if(!state.resumed){if(neighbor===after)state.resumed=true;continue}if(state.value.length>=limit){state.truncated=true;return true}state.value.push(neighbor)}return false}function boundedSemanticWalk(graph,start,options,family,matches){if(!graph.hasNode(start))throw new TypeError(`Relationship node not found: ${start}`);const familyKinds=resolveFamilyKinds(graph,options.kinds,family);const limit=options.limit??Number.POSITIVE_INFINITY;const maxDepth=options.maxDepth??Number.POSITIVE_INFINITY;const after=options.after;const state={seen:new Set([start]),value:[],queue:[{id:start,depth:0}],resumed:after===void 0,truncated:false};let visitedNodes=0;let inspectedEdges=0;for(let index=0;index<state.queue.length;index+=1){options.signal?.throwIfAborted();const current=state.queue[index];visitedNodes+=1;const expansion=expandSemanticNeighbors(graph,current.id,familyKinds,family,matches);inspectedEdges+=expansion.inspectedEdges;if(appendSemanticExpansion(expansion,current.depth,maxDepth,limit,after,state))break}if(!state.resumed)throw new TypeError(`Traversal cursor not found in sequence: ${after}`);return{value:state.value,meta:{visitedNodes,inspectedEdges,truncated:state.truncated,nextCursor:state.value.at(-1)}}}function assertPathEndpoint(graph,id){if(!graph.hasNode(id))throw new TypeError(`Relationship node not found: ${id}`)}function readPathContinuations(graph,partial,options,direction,state){const rows=graph.neighborEdges(partial.nodes.at(-1),{direction,...options.kinds===void 0?{}:{kinds:options.kinds}});state.inspectedEdges+=rows.meta.inspectedEdges;return rows.value.filter(row=>!partial.nodeSet.has(row.id))}function expandPartialPath(graph,partial,target,options,direction,probeLimit,state){for(const row of readPathContinuations(graph,partial,options,direction,state)){const nodes=[...partial.nodes,row.id];const nodeSet=new Set(partial.nodeSet).add(row.id);const edges=[...partial.edges,row.edge];if(row.id===target){state.value.push({nodes,edges,length:edges.length});if(state.value.length>=probeLimit)return true}else{state.queue.push({nodes,nodeSet,edges})}}return false}function hierarchyAncestors(graph,id,options={}){return boundedSemanticWalk(graph,id,options,"hierarchy",(row,definition)=>hierarchyParentEndpoint(row.edge,definition)===row.id)}function hierarchyDescendants(graph,id,options={}){return boundedSemanticWalk(graph,id,options,"hierarchy",(row,definition,nodeId)=>hierarchyParentEndpoint(row.edge,definition)===nodeId)}function orderingPredecessors(graph,id,options={}){return boundedSemanticWalk(graph,id,options,"ordering",(row,definition)=>orderingPredecessorEndpoint(row.edge,definition)===row.id)}function orderingSuccessors(graph,id,options={}){return boundedSemanticWalk(graph,id,options,"ordering",(row,definition,nodeId)=>orderingPredecessorEndpoint(row.edge,definition)===nodeId)}function enumerateNonZeroRelationshipPaths(graph,source,target,options,maxPaths,maxVisitedPaths,maxDepth,direction){const state={value:[],queue:[{nodes:[source],nodeSet:new Set([source]),edges:[]}],inspectedEdges:0};let visitedNodes=0;let truncated=false;const probeLimit=maxPaths+1;for(let index=0;index<state.queue.length;index+=1){options.signal?.throwIfAborted();if(state.value.length>=probeLimit||visitedNodes>=maxVisitedPaths){truncated=true;break}const partial=state.queue[index];visitedNodes+=1;if(partial.edges.length>=maxDepth){if(readPathContinuations(graph,partial,options,direction,state).length>0)truncated=true;continue}if(expandPartialPath(graph,partial,target,options,direction,probeLimit,state)){truncated=true;break}}return{value:state.value.slice(0,maxPaths),meta:{visitedNodes,inspectedEdges:state.inspectedEdges,truncated}}}function enumerateRelationshipPaths(graph,source,target,options={}){assertPathEndpoint(graph,source);assertPathEndpoint(graph,target);const maxPaths=options.maxPaths??DEFAULT_MAX_PATHS;const maxVisitedPaths=options.maxVisitedPaths??DEFAULT_MAX_VISITED_PATHS;const maxDepth=options.maxDepth??DEFAULT_PATH_MAX_DEPTH;assertPathBound("maxPaths",maxPaths);assertPathBound("maxVisitedPaths",maxVisitedPaths);assertPathBound("maxDepth",maxDepth);const direction=options.direction??"outgoing";options.signal?.throwIfAborted();for(const kind of options.kinds??[])graph.registry().require(kind);if(source===target){if(maxPaths===0){return{value:[],meta:{visitedNodes:1,inspectedEdges:0,truncated:true}}}return{value:[{nodes:[source],edges:[],length:0}],meta:{visitedNodes:1,inspectedEdges:0,truncated:false}}}return enumerateNonZeroRelationshipPaths(graph,source,target,options,maxPaths,maxVisitedPaths,maxDepth,direction)}export{enumerateRelationshipPaths,hierarchyAncestors,hierarchyDescendants,hierarchyParentEndpoint,orderingPredecessorEndpoint,orderingPredecessors,orderingSuccessors,orientOrderingEdge};
|
|
2
2
|
//# sourceMappingURL=traversal.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
1
|
+
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="86c929a6-644f-5b8e-a12b-04a73b4f4b60")}catch(e2){}})();import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";const DEFAULT_TERMINAL_TRANSITION_POLICY=Object.freeze({requireCloseReason:true,orderingEdges:"preserve"});function resolveTerminalReason(input){const candidates=[{source:"explicit",value:input.explicit},{source:"duplicate",value:input.duplicateOf===void 0?void 0:`Duplicate of ${input.duplicateOf}`},{source:"resolution",value:input.resolution},{source:"message",value:input.message}];for(const candidate of candidates){const normalized=candidate.value?.trim();if(normalized){return{closeReason:normalized,source:candidate.source}}}return{source:"none"}}function requireTerminalReason(input,required){return requireTerminalReasonWithRecovery(input,required,{operation:"close"})}function requireTerminalReasonWithRecovery(input,required,recovery){const resolution=resolveTerminalReason(input);if(!required||resolution.closeReason!==void 0){return resolution}const examples=recovery.operation==="create"?[`pm create --title "<title>" --type <type> --status ${recovery.status??"closed"} --close-reason "<closing summary>"`,`pm create --title "<title>" --type <type> --status ${recovery.status??"closed"} --resolution "<resolution summary>"`,`pm create --stdin-json < item.json`]:['pm close <id> "Done: <what changed and why>"','pm close <id> --reason "<closing summary>"','pm close <id> -m "<closing summary>"',"pm close <id> --duplicate-of <canonical-id>"];throw new PmCliError("Close reason text is required because governance.require_close_reason is enabled",EXIT_CODE.USAGE,{code:"close_reason_required",required:"Provide an author-controlled closing summary as the reason, message, resolution, or duplicate target.",why:"governance.require_close_reason is enabled, so tools must not invent immutable closure evidence.",examples,nextSteps:[`Re-run the ${recovery.operation} operation with a closing summary.`,"To stop requiring reasons, run: pm config set governance-require-close-reason --policy disabled"]})}function applyTerminalOrderingPolicy(metadata,policy){const previousBlockedBy=typeof metadata.blocked_by==="string"?metadata.blocked_by.trim():"";const hadBlockedBy=metadata.blocked_by!==void 0;const dependencies=metadata.dependencies??[];const predecessorEdges=dependencies.filter(dependency=>dependency.kind==="blocked_by");const hadBlockedReason=metadata.blocked_reason!==void 0;const changedFields=[];if(hadBlockedBy){delete metadata.blocked_by;changedFields.push("blocked_by")}if(hadBlockedReason){delete metadata.blocked_reason;changedFields.push("blocked_reason")}if(policy.orderingEdges==="remove"&&predecessorEdges.length>0){const removed=new Set(predecessorEdges);const retained=dependencies.filter(dependency=>!removed.has(dependency));if(retained.length>0){metadata.dependencies=retained}else{delete metadata.dependencies}changedFields.push("dependencies")}if(policy.orderingEdges==="remove"){return{changedFields,warnings:[...previousBlockedBy?[`closed_cleared_blocked_by:${metadata.id}:${previousBlockedBy}`]:[],...predecessorEdges.length>0?[`closed_removed_predecessors:${metadata.id}:${predecessorEdges.map(edge=>edge.id).join(",")}`,`closed_removed_predecessors_count:${metadata.id}:${predecessorEdges.length}`]:[]]}}const blockerIds=[...new Set([...previousBlockedBy?[previousBlockedBy]:[],...predecessorEdges.map(dependency=>dependency.id)])];if(blockerIds.length===0){return{changedFields,warnings:[]}}return{changedFields,warnings:[`closed_preserved_predecessors:${metadata.id}:${blockerIds.join(",")}`]}}export{DEFAULT_TERMINAL_TRANSITION_POLICY,applyTerminalOrderingPolicy,requireTerminalReason,requireTerminalReasonWithRecovery,resolveTerminalReason};
|
|
2
2
|
//# sourceMappingURL=lifecycle-policy.js.map
|