@unbrained/pm-cli 2026.7.17 → 2026.7.18
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 +13 -0
- package/dist/cli/commands/close.d.ts +1 -1
- package/dist/cli/commands/close.js +3 -3
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/completion.js +47 -5
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/context.d.ts +2 -2
- package/dist/cli/commands/context.js +42 -28
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js +5 -3
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/graph.d.ts +7 -0
- package/dist/cli/commands/graph.js +11 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.js +3 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/next.d.ts +1 -1
- package/dist/cli/commands/next.js +3 -3
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/main.js +3 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +49 -7
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +7 -3
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli-bundle/bundle-manifest.json +157 -149
- package/dist/cli-bundle/chunks/{chunk-N7I2DGLP.js → chunk-35FHWD4C.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-37V5MXAU.js.map → chunk-35FHWD4C.js.map} +1 -7
- package/dist/cli-bundle/chunks/{chunk-MSGETE6I.js → chunk-3CUQZNQ6.js} +67 -509
- package/dist/cli-bundle/chunks/chunk-3CUQZNQ6.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-3QDR6ZLU.js +800 -0
- package/dist/cli-bundle/chunks/chunk-3QDR6ZLU.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-QNUAZYGW.js → chunk-43UMFKCK.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-HF63SBLC.js → chunk-6VHUGVNP.js} +39 -16
- package/dist/cli-bundle/chunks/chunk-6VHUGVNP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-B6SH2YNN.js → chunk-7R6UIHYY.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NCAFUBJX.js → chunk-7UCY6DR5.js} +183 -12
- package/dist/cli-bundle/chunks/chunk-7UCY6DR5.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-23TCGBRK.js → chunk-ADXDCAKP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-7LTCLTRG.js → chunk-AXRT7K5V.js} +16 -3
- package/dist/cli-bundle/chunks/chunk-AXRT7K5V.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-P56LKFQX.js → chunk-BDA35QG5.js} +34 -4
- package/dist/cli-bundle/chunks/chunk-BDA35QG5.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-2MPMKJF2.js → chunk-DHNG452T.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-AFSV5HBB.js → chunk-E4FXM2XB.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QKVVV6QO.js → chunk-EWIT5WIC.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-EX7OQT3Y.js +783 -0
- package/dist/cli-bundle/chunks/chunk-EX7OQT3Y.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-LLODAQMP.js → chunk-F3VC3GOV.js} +41 -18
- package/dist/cli-bundle/chunks/chunk-F3VC3GOV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-S46R2M3W.js → chunk-GKPCTQYG.js} +1709 -5
- package/dist/cli-bundle/chunks/chunk-GKPCTQYG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-HXVHBERL.js → chunk-HPAYDSR2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-XNPMDSQQ.js → chunk-HYTOJW2Q.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-V3VBXQQV.js → chunk-I3INI567.js} +516 -429
- package/dist/cli-bundle/chunks/chunk-I3INI567.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-V7MP6YTN.js → chunk-IL5SPRMH.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YQCWK2MB.js → chunk-L5BTTDU5.js} +68 -503
- package/dist/cli-bundle/chunks/chunk-L5BTTDU5.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-SIJV365F.js → chunk-NCVT6XEL.js} +17 -4
- package/dist/cli-bundle/chunks/chunk-NCVT6XEL.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-DCC2AQBD.js → chunk-OGVTB5VO.js} +32 -31
- package/dist/cli-bundle/chunks/chunk-OGVTB5VO.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-6XAZB6SE.js → chunk-QPGQNLPI.js} +1660 -7
- package/dist/cli-bundle/chunks/chunk-QPGQNLPI.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KOEZCHRF.js → chunk-QRZNCRNA.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-G6KM4YKY.js → chunk-RXPQ5Q23.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-7CTQ7WW5.js → chunk-SIPOACV5.js} +514 -427
- package/dist/cli-bundle/chunks/chunk-SIPOACV5.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-XYJK6GIQ.js → chunk-TGBTLGPX.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-37V5MXAU.js → chunk-TLWJP5BF.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-TLWJP5BF.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-3D4YVTNG.js → chunk-TZAE66GQ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-S6FF7VW6.js → chunk-WQXRZMFN.js} +187 -16
- package/dist/cli-bundle/chunks/chunk-WQXRZMFN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-SPFZV2GR.js → chunk-XPUTSGJU.js} +32 -31
- package/dist/cli-bundle/chunks/chunk-XPUTSGJU.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-CFSUNEL7.js → chunk-XWBD6DSR.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-MNV226E4.js → chunk-XWYQ2LT4.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-I7GY4X6Y.js → chunk-YFE7JHX3.js} +26 -5
- package/dist/cli-bundle/chunks/chunk-YFE7JHX3.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FZGM3PNA.js → chunk-YIIIAKCE.js} +2 -2
- package/dist/cli-bundle/chunks/{close-BEP7MHF3.js → close-GPD7DTJV.js} +3 -3
- package/dist/cli-bundle/chunks/{close-Y6QFUJQN.js → close-X3CF6FQP.js} +3 -3
- package/dist/cli-bundle/chunks/{close-many-JJFW7KTT.js → close-many-J7A5EHOQ.js} +5 -5
- package/dist/cli-bundle/chunks/{close-many-QJ6FKJUE.js → close-many-NQLYGPYW.js} +5 -5
- package/dist/cli-bundle/chunks/{deps-EVTOQMKW.js → deps-MQ4ZIGZB.js} +13 -4
- package/dist/cli-bundle/chunks/{deps-5NC4IZH7.js → deps-NIIKXLPB.js} +13 -4
- package/dist/cli-bundle/chunks/{profile-U2B6Y7GE.js → profile-AVCIIZID.js} +3 -3
- package/dist/cli-bundle/chunks/{profile-AGUKS52S.js → profile-LFYO3HHX.js} +3 -3
- package/dist/cli-bundle/chunks/{register-list-query-A5KRJ5J2.js → register-list-query-MZUF2EEC.js} +41 -13
- package/dist/cli-bundle/chunks/register-list-query-MZUF2EEC.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-NEYP3TXO.js → register-list-query-UKMF55FT.js} +40 -12
- package/dist/cli-bundle/chunks/register-list-query-UKMF55FT.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-6LOPBAHC.js → register-mutation-2PBW2GEX.js} +15 -13
- package/dist/cli-bundle/chunks/register-mutation-2PBW2GEX.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-GCZOALNJ.js → register-mutation-T6RVNJC4.js} +14 -12
- package/dist/cli-bundle/chunks/{register-mutation-GCZOALNJ.js.map → register-mutation-T6RVNJC4.js.map} +2 -2
- package/dist/cli-bundle/chunks/{register-operations-6ZZIF27A.js → register-operations-KHZYR6MG.js} +11 -11
- package/dist/cli-bundle/chunks/{register-operations-REDIAEGI.js → register-operations-WPQ2LWZJ.js} +11 -11
- package/dist/cli-bundle/chunks/{register-setup-J3JS2ZVT.js → register-setup-PGDNOXDQ.js} +5 -5
- package/dist/cli-bundle/chunks/{register-setup-BHPMN5SK.js → register-setup-TDN7WAO6.js} +5 -5
- package/dist/cli-bundle/chunks/{update-SA6AG23P.js → update-SQYZA3ZW.js} +4 -4
- package/dist/cli-bundle/chunks/{update-PQQHLYCC.js → update-XZJYS5X7.js} +4 -4
- package/dist/cli-bundle/chunks/{update-many-RQVTFJPD.js → update-many-R24B3GBK.js} +6 -6
- package/dist/cli-bundle/chunks/{update-many-TV3L3KBX.js → update-many-WQ3R3J6N.js} +6 -6
- package/dist/cli-bundle/main.js +25 -9
- package/dist/cli-bundle/main.js.map +2 -2
- package/dist/cli-bundle/sdk-runtime.js +19 -16
- package/dist/cli-bundle/sdk.js +95 -305
- package/dist/cli-bundle/sdk.js.map +4 -4
- package/dist/core/item/actionability.d.ts +12 -0
- package/dist/core/item/actionability.js +39 -4
- package/dist/core/item/actionability.js.map +1 -1
- package/dist/core/sentry/instrument.d.ts +11 -0
- package/dist/core/sentry/instrument.js +21 -2
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/mcp/server.d.ts +16 -18
- package/dist/mcp/server.js +84 -31
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-definitions.js +17 -4
- package/dist/mcp/tool-definitions.js.map +1 -1
- package/dist/sdk/actionability.d.ts +10 -0
- package/dist/sdk/actionability.js +14 -0
- package/dist/sdk/actionability.js.map +1 -0
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +6 -2
- package/dist/sdk/cli-contracts/enum-contracts.js +19 -2
- package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.d.ts +2 -0
- package/dist/sdk/cli-contracts/flag-contracts.js +21 -2
- package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +2 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.js +16 -2
- package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +80 -3
- package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-schema.d.ts +20 -0
- package/dist/sdk/cli-contracts/tool-schema.js +97 -9
- package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +2 -2
- package/dist/sdk/cli-contracts.js +4 -4
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/dependencies.d.ts +42 -53
- package/dist/sdk/dependencies.js +177 -125
- package/dist/sdk/dependencies.js.map +1 -1
- package/dist/sdk/governance/validate.js +3 -3
- package/dist/sdk/governance/validate.js.map +1 -1
- package/dist/sdk/graph/analytics.d.ts +124 -0
- package/dist/sdk/graph/analytics.js +464 -0
- package/dist/sdk/graph/analytics.js.map +1 -0
- package/dist/sdk/graph/assembly.d.ts +97 -0
- package/dist/sdk/graph/assembly.js +146 -0
- package/dist/sdk/graph/assembly.js.map +1 -0
- package/dist/sdk/graph/cache.d.ts +66 -0
- package/dist/sdk/graph/cache.js +148 -0
- package/dist/sdk/graph/cache.js.map +1 -0
- package/dist/sdk/graph/governance.d.ts +108 -0
- package/dist/sdk/graph/governance.js +360 -0
- package/dist/sdk/graph/governance.js.map +1 -0
- package/dist/sdk/graph/index.d.ts +16 -0
- package/dist/sdk/graph/index.js +20 -0
- package/dist/sdk/graph/index.js.map +1 -0
- package/dist/sdk/graph/remediation.d.ts +52 -0
- package/dist/sdk/graph/remediation.js +148 -0
- package/dist/sdk/graph/remediation.js.map +1 -0
- package/dist/sdk/graph/run.d.ts +295 -0
- package/dist/sdk/graph/run.js +468 -0
- package/dist/sdk/graph/run.js.map +1 -0
- package/dist/sdk/graph/traversal.d.ts +77 -0
- package/dist/sdk/graph/traversal.js +262 -0
- package/dist/sdk/graph/traversal.js.map +1 -0
- package/dist/sdk/index.d.ts +4 -2
- package/dist/sdk/index.js +6 -4
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/query/list.d.ts +8 -0
- package/dist/sdk/query/list.js +19 -3
- package/dist/sdk/query/list.js.map +1 -1
- package/dist/sdk/relationship-context.d.ts +42 -0
- package/dist/sdk/relationship-context.js +99 -20
- package/dist/sdk/relationship-context.js.map +1 -1
- package/dist/sdk/relationships.d.ts +13 -0
- package/dist/sdk/relationships.js +30 -2
- package/dist/sdk/relationships.js.map +1 -1
- package/dist/sdk/runtime-input.d.ts +41 -0
- package/dist/sdk/runtime-input.js +422 -2
- package/dist/sdk/runtime-input.js.map +1 -1
- package/dist/sdk/runtime.d.ts +12 -23
- package/dist/sdk/runtime.js +19 -371
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/sdk/test/linked-command-detection.js +12 -3
- package/dist/sdk/test/linked-command-detection.js.map +1 -1
- package/docs/AGENT_GUIDE.md +1 -0
- package/docs/COMMANDS.md +19 -1
- package/docs/RELATIONSHIP_GRAPH.md +99 -3
- package/docs/SDK.md +17 -3
- package/marketplace.json +2 -2
- package/package.json +1 -1
- 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-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/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-6XAZB6SE.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7CTQ7WW5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7LTCLTRG.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-DCC2AQBD.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HF63SBLC.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-I7GY4X6Y.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-LLODAQMP.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-MSGETE6I.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-N7I2DGLP.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-NCAFUBJX.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-P56LKFQX.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-S46R2M3W.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-S6FF7VW6.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-SIJV365F.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-SPFZV2GR.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-V3VBXQQV.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-YQCWK2MB.js.map +0 -1
- package/dist/cli-bundle/chunks/register-list-query-A5KRJ5J2.js.map +0 -1
- package/dist/cli-bundle/chunks/register-list-query-NEYP3TXO.js.map +0 -7
- package/dist/cli-bundle/chunks/register-mutation-6LOPBAHC.js.map +0 -1
- /package/dist/cli-bundle/chunks/{chunk-QNUAZYGW.js.map → chunk-43UMFKCK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B6SH2YNN.js.map → chunk-7R6UIHYY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-23TCGBRK.js.map → chunk-ADXDCAKP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2MPMKJF2.js.map → chunk-DHNG452T.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AFSV5HBB.js.map → chunk-E4FXM2XB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QKVVV6QO.js.map → chunk-EWIT5WIC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HXVHBERL.js.map → chunk-HPAYDSR2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XNPMDSQQ.js.map → chunk-HYTOJW2Q.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-V7MP6YTN.js.map → chunk-IL5SPRMH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KOEZCHRF.js.map → chunk-QRZNCRNA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-G6KM4YKY.js.map → chunk-RXPQ5Q23.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XYJK6GIQ.js.map → chunk-TGBTLGPX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3D4YVTNG.js.map → chunk-TZAE66GQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CFSUNEL7.js.map → chunk-XWBD6DSR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MNV226E4.js.map → chunk-XWYQ2LT4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FZGM3PNA.js.map → chunk-YIIIAKCE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-BEP7MHF3.js.map → close-GPD7DTJV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-Y6QFUJQN.js.map → close-X3CF6FQP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-JJFW7KTT.js.map → close-many-J7A5EHOQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-QJ6FKJUE.js.map → close-many-NQLYGPYW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-EVTOQMKW.js.map → deps-MQ4ZIGZB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-5NC4IZH7.js.map → deps-NIIKXLPB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-U2B6Y7GE.js.map → profile-AVCIIZID.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-AGUKS52S.js.map → profile-LFYO3HHX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-6ZZIF27A.js.map → register-operations-KHZYR6MG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-REDIAEGI.js.map → register-operations-WPQ2LWZJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-J3JS2ZVT.js.map → register-setup-PGDNOXDQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-BHPMN5SK.js.map → register-setup-TDN7WAO6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-SA6AG23P.js.map → update-SQYZA3ZW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-PQQHLYCC.js.map → update-XZJYS5X7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-RQVTFJPD.js.map → update-many-R24B3GBK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-TV3L3KBX.js.map → update-many-WQ3R3J6N.js.map} +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { WorkspaceRelationshipAssembly } from "./assembly.js";
|
|
2
|
+
import { type RelationshipAuditFindingCode, type RelationshipAuditOptions, type RelationshipAuditReport } from "./governance.js";
|
|
3
|
+
/** Exact operation family a remediation step proposes; audits never auto-apply. */
|
|
4
|
+
export type RelationshipRemediationOperation = "add" | "remove" | "retype" | "supersede" | "waive" | "investigate";
|
|
5
|
+
/** Planner confidence that applying the proposed operation is safe and correct. */
|
|
6
|
+
export type RelationshipRemediationConfidence = "high" | "medium" | "low";
|
|
7
|
+
/** Policy source a remediation step was derived from. */
|
|
8
|
+
export type RelationshipRemediationCode = RelationshipAuditFindingCode | "redundant_edge";
|
|
9
|
+
/** One exact dry-run remediation proposal with evidence and confidence. */
|
|
10
|
+
export interface RelationshipRemediationStep {
|
|
11
|
+
/** Proposed operation family. */
|
|
12
|
+
op: RelationshipRemediationOperation;
|
|
13
|
+
/** Audit finding code or `redundant_edge` for witnessed transitive shortcuts. */
|
|
14
|
+
code: RelationshipRemediationCode;
|
|
15
|
+
/** Compact deterministic subject — the edge, reference, or node to act on. */
|
|
16
|
+
subject: string;
|
|
17
|
+
/** Why this operation is proposed and what applying it means. */
|
|
18
|
+
rationale: string;
|
|
19
|
+
/** Deterministic evidence strings backing the proposal. */
|
|
20
|
+
evidence: string[];
|
|
21
|
+
/** Planner confidence in the proposal. */
|
|
22
|
+
confidence: RelationshipRemediationConfidence;
|
|
23
|
+
}
|
|
24
|
+
/** Tuning inputs accepted by dry-run remediation planning. */
|
|
25
|
+
export interface RelationshipRemediationPlanOptions extends RelationshipAuditOptions {
|
|
26
|
+
/** Maximum witnessed redundant edges scanned into proposals; defaults to the audit sample bound. */
|
|
27
|
+
redundancyLimit?: number;
|
|
28
|
+
}
|
|
29
|
+
/** Complete deterministic result of one dry-run remediation planning pass. */
|
|
30
|
+
export interface RelationshipRemediationPlan {
|
|
31
|
+
/** Proposed steps in audit severity order, redundancy proposals last. */
|
|
32
|
+
steps: RelationshipRemediationStep[];
|
|
33
|
+
/** The governance-audit report the plan was derived from. */
|
|
34
|
+
report: RelationshipAuditReport;
|
|
35
|
+
/** Whether bounded samples or scan limits omitted derivable proposals. */
|
|
36
|
+
truncated: boolean;
|
|
37
|
+
/** Nodes visited and edges inspected by the redundancy witness scan. */
|
|
38
|
+
cost: {
|
|
39
|
+
visitedNodes: number;
|
|
40
|
+
inspectedEdges: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Build one deterministic dry-run remediation plan over an assembled workspace
|
|
45
|
+
* relationship graph. The plan runs the shared governance audit, derives one
|
|
46
|
+
* exact proposal per bounded finding subject, then appends witnessed
|
|
47
|
+
* transitive-shortcut removal proposals from the redundancy scan (medium
|
|
48
|
+
* confidence, because shortcut edges are sometimes deliberate emphasis).
|
|
49
|
+
* `truncated` reports whether sample or scan bounds omitted derivable steps;
|
|
50
|
+
* nothing is ever applied automatically.
|
|
51
|
+
*/
|
|
52
|
+
export declare function planRelationshipRemediation(assembly: WorkspaceRelationshipAssembly, options?: RelationshipRemediationPlanOptions): RelationshipRemediationPlan;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
|
|
2
|
+
!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]="662a9796-dbb3-5fd5-bc23-22dba9adde9e")}catch(e){}}();
|
|
3
|
+
import { findRedundantRelationshipEdges } from "./analytics.js";
|
|
4
|
+
import { auditWorkspaceRelationshipGraph, collectDuplicateRelationshipEdgeGroups, formatDuplicateEdgeGroup, } from "./governance.js";
|
|
5
|
+
/** Per-finding-code operation template applied to every sampled subject. */
|
|
6
|
+
const FINDING_STEP_TEMPLATES = {
|
|
7
|
+
missing_reference_active: {
|
|
8
|
+
op: "investigate",
|
|
9
|
+
confidence: "medium",
|
|
10
|
+
rationale: "Restore or re-create the referenced item, or remove/retype the reference on the active holder; the correct fix depends on why the target is absent.",
|
|
11
|
+
},
|
|
12
|
+
missing_reference_terminal: {
|
|
13
|
+
op: "waive",
|
|
14
|
+
confidence: "high",
|
|
15
|
+
rationale: "Terminal-holder reference to an absent item is historical debt; waive it or clean it up only in a dedicated changelog-safe closed-item batch.",
|
|
16
|
+
},
|
|
17
|
+
legacy_no_blocker_sentinel: {
|
|
18
|
+
op: "remove",
|
|
19
|
+
confidence: "high",
|
|
20
|
+
rationale: "The pre-structured-dependency no-active-blocker sentinel is retired and carries no information; blocker state derives from blocked_by edges.",
|
|
21
|
+
},
|
|
22
|
+
ordering_cycle: {
|
|
23
|
+
op: "investigate",
|
|
24
|
+
confidence: "low",
|
|
25
|
+
rationale: "Every cycle member is unschedulable until one ordering edge is removed or retyped; the planner never chooses which edge to cut.",
|
|
26
|
+
},
|
|
27
|
+
legacy_ordering_cycle: {
|
|
28
|
+
op: "waive",
|
|
29
|
+
confidence: "high",
|
|
30
|
+
rationale: "Terminal-only ordering cycles have no scheduling effect; repairing them would mutate closed history (changelog drag).",
|
|
31
|
+
},
|
|
32
|
+
// duplicate_edge findings are expanded into per-stored-edge remove steps by
|
|
33
|
+
// the planner itself (see stepsFromDuplicateGroup); this template documents
|
|
34
|
+
// the family for exhaustiveness and backs any future sample-only fallback.
|
|
35
|
+
duplicate_edge: {
|
|
36
|
+
op: "remove",
|
|
37
|
+
confidence: "high",
|
|
38
|
+
rationale: "Parallel same-family spellings state one relationship twice; remove all but one stored spelling, keeping the holder's canonical direction.",
|
|
39
|
+
},
|
|
40
|
+
legacy_duplicate_edge: {
|
|
41
|
+
op: "waive",
|
|
42
|
+
confidence: "high",
|
|
43
|
+
rationale: "Duplicated spellings between terminal items are historical noise; waive or batch changelog-safe cleanup.",
|
|
44
|
+
},
|
|
45
|
+
stale_lifecycle_block: {
|
|
46
|
+
op: "investigate",
|
|
47
|
+
confidence: "medium",
|
|
48
|
+
rationale: "Re-open the missing prerequisite as an ordering edge, or move the item back to an active status; only the holder's owner knows which is true.",
|
|
49
|
+
},
|
|
50
|
+
isolated_active_node: {
|
|
51
|
+
op: "investigate",
|
|
52
|
+
confidence: "medium",
|
|
53
|
+
rationale: "Link the item to its parent, prerequisite, or origin — or register it as an explicitly exempt isolate; the audit never fabricates an edge.",
|
|
54
|
+
},
|
|
55
|
+
sparse_active_node: {
|
|
56
|
+
op: "investigate",
|
|
57
|
+
confidence: "low",
|
|
58
|
+
rationale: "Investigate for an honest second edge (story-to-task, defect family, cross-epic complement); sparse is not automatically defective.",
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
/** Format one stored edge as a concrete removable identity. */
|
|
62
|
+
function formatStoredEdge(edge) {
|
|
63
|
+
return `${edge.source} -${edge.kind}-> ${edge.target}`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Expand one active duplicate group into concrete per-stored-edge removals.
|
|
67
|
+
* The deterministic keeper is the group's first sorted edge; every other
|
|
68
|
+
* stored spelling gets its own remove proposal naming the exact edge to drop,
|
|
69
|
+
* so the plan stays machine-executable instead of pointing at a display
|
|
70
|
+
* string that spans several stored rows.
|
|
71
|
+
*/
|
|
72
|
+
function stepsFromDuplicateGroup(group) {
|
|
73
|
+
const [keeper, ...extras] = group.edges;
|
|
74
|
+
return extras.map((edge) => ({
|
|
75
|
+
op: "remove",
|
|
76
|
+
code: "duplicate_edge",
|
|
77
|
+
subject: formatStoredEdge(edge),
|
|
78
|
+
rationale: "This stored spelling restates the kept canonical edge of the same semantic family; removing it leaves the relationship stated exactly once.",
|
|
79
|
+
evidence: [
|
|
80
|
+
`keep: ${formatStoredEdge(keeper)}`,
|
|
81
|
+
`group: ${formatDuplicateEdgeGroup(group)}`,
|
|
82
|
+
],
|
|
83
|
+
confidence: "high",
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
/** Derive one proposal per bounded sample subject of an audit finding. */
|
|
87
|
+
function stepsFromFinding(finding, duplicateGroups) {
|
|
88
|
+
if (finding.code === "duplicate_edge") {
|
|
89
|
+
// Sample subjects are the deterministic group format strings, so each one
|
|
90
|
+
// resolves to its concrete stored-edge group for exact removal targeting.
|
|
91
|
+
return finding.sample.flatMap((subject) => stepsFromDuplicateGroup(duplicateGroups.get(subject)));
|
|
92
|
+
}
|
|
93
|
+
const template = FINDING_STEP_TEMPLATES[finding.code];
|
|
94
|
+
return finding.sample.map((subject) => ({
|
|
95
|
+
op: template.op,
|
|
96
|
+
code: finding.code,
|
|
97
|
+
subject,
|
|
98
|
+
rationale: template.rationale,
|
|
99
|
+
evidence: [finding.policy],
|
|
100
|
+
confidence: template.confidence,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Build one deterministic dry-run remediation plan over an assembled workspace
|
|
105
|
+
* relationship graph. The plan runs the shared governance audit, derives one
|
|
106
|
+
* exact proposal per bounded finding subject, then appends witnessed
|
|
107
|
+
* transitive-shortcut removal proposals from the redundancy scan (medium
|
|
108
|
+
* confidence, because shortcut edges are sometimes deliberate emphasis).
|
|
109
|
+
* `truncated` reports whether sample or scan bounds omitted derivable steps;
|
|
110
|
+
* nothing is ever applied automatically.
|
|
111
|
+
*/
|
|
112
|
+
export function planRelationshipRemediation(assembly, options = {}) {
|
|
113
|
+
const { redundancyLimit, ...auditOptions } = options;
|
|
114
|
+
const report = auditWorkspaceRelationshipGraph(assembly, auditOptions);
|
|
115
|
+
const duplicateGroups = new Map(collectDuplicateRelationshipEdgeGroups(assembly).map((group) => [
|
|
116
|
+
formatDuplicateEdgeGroup(group),
|
|
117
|
+
group,
|
|
118
|
+
]));
|
|
119
|
+
const steps = report.findings.flatMap((finding) => stepsFromFinding(finding, duplicateGroups));
|
|
120
|
+
let truncated = report.findings.some((finding) => finding.sample_truncated);
|
|
121
|
+
options.signal?.throwIfAborted();
|
|
122
|
+
const redundancy = findRedundantRelationshipEdges(assembly.graph, {
|
|
123
|
+
limit: redundancyLimit ?? options.maxSampleSize ?? 25,
|
|
124
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
125
|
+
});
|
|
126
|
+
for (const row of redundancy.value) {
|
|
127
|
+
steps.push({
|
|
128
|
+
op: "remove",
|
|
129
|
+
code: "redundant_edge",
|
|
130
|
+
subject: `${row.edge.source} -> ${row.edge.target} (${row.edge.kind})`,
|
|
131
|
+
rationale: "The stored edge is implied by a longer same-family witness path; shortcut edges are sometimes deliberate emphasis, so confirm intent before removing.",
|
|
132
|
+
evidence: [`witness: ${row.witness.join(" -> ")}`],
|
|
133
|
+
confidence: "medium",
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
truncated = truncated || redundancy.meta.truncated;
|
|
137
|
+
return {
|
|
138
|
+
steps,
|
|
139
|
+
report,
|
|
140
|
+
truncated,
|
|
141
|
+
cost: {
|
|
142
|
+
visitedNodes: redundancy.meta.visitedNodes,
|
|
143
|
+
inspectedEdges: redundancy.meta.inspectedEdges,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=remediation.js.map
|
|
148
|
+
//# debugId=662a9796-dbb3-5fd5-bc23-22dba9adde9e
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remediation.js","sources":["sdk/graph/remediation.ts"],"sourceRoot":"/","sourcesContent":["/**\n * @module sdk/graph/remediation\n *\n * Dry-run remediation planning over the relationship governance audit. The\n * planner turns bounded audit findings and transitive-redundancy evidence into\n * exact, machine-readable proposed operations — remove, retype, supersede,\n * waive, or investigate — each carrying its policy code, evidence, confidence,\n * and rationale. Planning never mutates the workspace and never invents an\n * edge: proposals with structural proof (duplicates, retired sentinels,\n * witnessed shortcuts) get actionable operations, while judgment calls stay\n * explicit `investigate` steps for a human or agent to resolve.\n */\nimport type { RelationshipEdge } from \"../relationships.js\";\nimport { findRedundantRelationshipEdges } from \"./analytics.js\";\nimport type { WorkspaceRelationshipAssembly } from \"./assembly.js\";\nimport {\n auditWorkspaceRelationshipGraph,\n collectDuplicateRelationshipEdgeGroups,\n formatDuplicateEdgeGroup,\n type DuplicateRelationshipEdgeGroup,\n type RelationshipAuditFinding,\n type RelationshipAuditFindingCode,\n type RelationshipAuditOptions,\n type RelationshipAuditReport,\n} from \"./governance.js\";\n\n/** Exact operation family a remediation step proposes; audits never auto-apply. */\nexport type RelationshipRemediationOperation =\n | \"add\"\n | \"remove\"\n | \"retype\"\n | \"supersede\"\n | \"waive\"\n | \"investigate\";\n\n/** Planner confidence that applying the proposed operation is safe and correct. */\nexport type RelationshipRemediationConfidence = \"high\" | \"medium\" | \"low\";\n\n/** Policy source a remediation step was derived from. */\nexport type RelationshipRemediationCode =\n | RelationshipAuditFindingCode\n | \"redundant_edge\";\n\n/** One exact dry-run remediation proposal with evidence and confidence. */\nexport interface RelationshipRemediationStep {\n /** Proposed operation family. */\n op: RelationshipRemediationOperation;\n /** Audit finding code or `redundant_edge` for witnessed transitive shortcuts. */\n code: RelationshipRemediationCode;\n /** Compact deterministic subject — the edge, reference, or node to act on. */\n subject: string;\n /** Why this operation is proposed and what applying it means. */\n rationale: string;\n /** Deterministic evidence strings backing the proposal. */\n evidence: string[];\n /** Planner confidence in the proposal. */\n confidence: RelationshipRemediationConfidence;\n}\n\n/** Tuning inputs accepted by dry-run remediation planning. */\nexport interface RelationshipRemediationPlanOptions\n extends RelationshipAuditOptions {\n /** Maximum witnessed redundant edges scanned into proposals; defaults to the audit sample bound. */\n redundancyLimit?: number;\n}\n\n/** Complete deterministic result of one dry-run remediation planning pass. */\nexport interface RelationshipRemediationPlan {\n /** Proposed steps in audit severity order, redundancy proposals last. */\n steps: RelationshipRemediationStep[];\n /** The governance-audit report the plan was derived from. */\n report: RelationshipAuditReport;\n /** Whether bounded samples or scan limits omitted derivable proposals. */\n truncated: boolean;\n /** Nodes visited and edges inspected by the redundancy witness scan. */\n cost: { visitedNodes: number; inspectedEdges: number };\n}\n\n/** Per-finding-code operation template applied to every sampled subject. */\nconst FINDING_STEP_TEMPLATES: Record<\n RelationshipAuditFindingCode,\n {\n op: RelationshipRemediationOperation;\n confidence: RelationshipRemediationConfidence;\n rationale: string;\n }\n> = {\n missing_reference_active: {\n op: \"investigate\",\n confidence: \"medium\",\n rationale:\n \"Restore or re-create the referenced item, or remove/retype the reference on the active holder; the correct fix depends on why the target is absent.\",\n },\n missing_reference_terminal: {\n op: \"waive\",\n confidence: \"high\",\n rationale:\n \"Terminal-holder reference to an absent item is historical debt; waive it or clean it up only in a dedicated changelog-safe closed-item batch.\",\n },\n legacy_no_blocker_sentinel: {\n op: \"remove\",\n confidence: \"high\",\n rationale:\n \"The pre-structured-dependency no-active-blocker sentinel is retired and carries no information; blocker state derives from blocked_by edges.\",\n },\n ordering_cycle: {\n op: \"investigate\",\n confidence: \"low\",\n rationale:\n \"Every cycle member is unschedulable until one ordering edge is removed or retyped; the planner never chooses which edge to cut.\",\n },\n legacy_ordering_cycle: {\n op: \"waive\",\n confidence: \"high\",\n rationale:\n \"Terminal-only ordering cycles have no scheduling effect; repairing them would mutate closed history (changelog drag).\",\n },\n // duplicate_edge findings are expanded into per-stored-edge remove steps by\n // the planner itself (see stepsFromDuplicateGroup); this template documents\n // the family for exhaustiveness and backs any future sample-only fallback.\n duplicate_edge: {\n op: \"remove\",\n confidence: \"high\",\n rationale:\n \"Parallel same-family spellings state one relationship twice; remove all but one stored spelling, keeping the holder's canonical direction.\",\n },\n legacy_duplicate_edge: {\n op: \"waive\",\n confidence: \"high\",\n rationale:\n \"Duplicated spellings between terminal items are historical noise; waive or batch changelog-safe cleanup.\",\n },\n stale_lifecycle_block: {\n op: \"investigate\",\n confidence: \"medium\",\n rationale:\n \"Re-open the missing prerequisite as an ordering edge, or move the item back to an active status; only the holder's owner knows which is true.\",\n },\n isolated_active_node: {\n op: \"investigate\",\n confidence: \"medium\",\n rationale:\n \"Link the item to its parent, prerequisite, or origin — or register it as an explicitly exempt isolate; the audit never fabricates an edge.\",\n },\n sparse_active_node: {\n op: \"investigate\",\n confidence: \"low\",\n rationale:\n \"Investigate for an honest second edge (story-to-task, defect family, cross-epic complement); sparse is not automatically defective.\",\n },\n};\n\n/** Format one stored edge as a concrete removable identity. */\nfunction formatStoredEdge(edge: RelationshipEdge): string {\n return `${edge.source} -${edge.kind}-> ${edge.target}`;\n}\n\n/**\n * Expand one active duplicate group into concrete per-stored-edge removals.\n * The deterministic keeper is the group's first sorted edge; every other\n * stored spelling gets its own remove proposal naming the exact edge to drop,\n * so the plan stays machine-executable instead of pointing at a display\n * string that spans several stored rows.\n */\nfunction stepsFromDuplicateGroup(\n group: DuplicateRelationshipEdgeGroup,\n): RelationshipRemediationStep[] {\n const [keeper, ...extras] = group.edges;\n return extras.map((edge) => ({\n op: \"remove\" as const,\n code: \"duplicate_edge\" as const,\n subject: formatStoredEdge(edge),\n rationale:\n \"This stored spelling restates the kept canonical edge of the same semantic family; removing it leaves the relationship stated exactly once.\",\n evidence: [\n `keep: ${formatStoredEdge(keeper!)}`,\n `group: ${formatDuplicateEdgeGroup(group)}`,\n ],\n confidence: \"high\" as const,\n }));\n}\n\n/** Derive one proposal per bounded sample subject of an audit finding. */\nfunction stepsFromFinding(\n finding: RelationshipAuditFinding,\n duplicateGroups: Map<string, DuplicateRelationshipEdgeGroup>,\n): RelationshipRemediationStep[] {\n if (finding.code === \"duplicate_edge\") {\n // Sample subjects are the deterministic group format strings, so each one\n // resolves to its concrete stored-edge group for exact removal targeting.\n return finding.sample.flatMap((subject) =>\n stepsFromDuplicateGroup(duplicateGroups.get(subject)!),\n );\n }\n const template = FINDING_STEP_TEMPLATES[finding.code];\n return finding.sample.map((subject) => ({\n op: template.op,\n code: finding.code,\n subject,\n rationale: template.rationale,\n evidence: [finding.policy],\n confidence: template.confidence,\n }));\n}\n\n/**\n * Build one deterministic dry-run remediation plan over an assembled workspace\n * relationship graph. The plan runs the shared governance audit, derives one\n * exact proposal per bounded finding subject, then appends witnessed\n * transitive-shortcut removal proposals from the redundancy scan (medium\n * confidence, because shortcut edges are sometimes deliberate emphasis).\n * `truncated` reports whether sample or scan bounds omitted derivable steps;\n * nothing is ever applied automatically.\n */\nexport function planRelationshipRemediation(\n assembly: WorkspaceRelationshipAssembly,\n options: RelationshipRemediationPlanOptions = {},\n): RelationshipRemediationPlan {\n const { redundancyLimit, ...auditOptions } = options;\n const report = auditWorkspaceRelationshipGraph(assembly, auditOptions);\n const duplicateGroups = new Map(\n collectDuplicateRelationshipEdgeGroups(assembly).map((group) => [\n formatDuplicateEdgeGroup(group),\n group,\n ]),\n );\n const steps = report.findings.flatMap((finding) =>\n stepsFromFinding(finding, duplicateGroups),\n );\n let truncated = report.findings.some((finding) => finding.sample_truncated);\n options.signal?.throwIfAborted();\n const redundancy = findRedundantRelationshipEdges(assembly.graph, {\n limit: redundancyLimit ?? options.maxSampleSize ?? 25,\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n });\n for (const row of redundancy.value) {\n steps.push({\n op: \"remove\",\n code: \"redundant_edge\",\n subject: `${row.edge.source} -> ${row.edge.target} (${row.edge.kind})`,\n rationale:\n \"The stored edge is implied by a longer same-family witness path; shortcut edges are sometimes deliberate emphasis, so confirm intent before removing.\",\n evidence: [`witness: ${row.witness.join(\" -> \")}`],\n confidence: \"medium\",\n });\n }\n truncated = truncated || redundancy.meta.truncated;\n return {\n steps,\n report,\n truncated,\n cost: {\n visitedNodes: redundancy.meta.visitedNodes,\n inspectedEdges: redundancy.meta.inspectedEdges,\n },\n };\n}\n"],"names":[],"mappings":"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","debugId":"662a9796-dbb3-5fd5-bc23-22dba9adde9e"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
|
+
import { type GraphCacheMetadata } from "./cache.js";
|
|
3
|
+
import { type RelationshipAuditReport } from "./governance.js";
|
|
4
|
+
import { type RelationshipRemediationStep } from "./remediation.js";
|
|
5
|
+
import { GRAPH_SUBCOMMAND_VALUES, type GraphSubcommand } from "../cli-contracts/enum-contracts.js";
|
|
6
|
+
export { GRAPH_SUBCOMMAND_VALUES, type GraphSubcommand };
|
|
7
|
+
/** Documents the graph command options payload exchanged by command, SDK, and package integrations. */
|
|
8
|
+
export interface GraphCommandOptions {
|
|
9
|
+
/** Restricts traversal to registered relationship kinds (repeatable or comma-separated). */
|
|
10
|
+
kind?: string | string[];
|
|
11
|
+
/** Maximum traversal depth as a non-negative integer. */
|
|
12
|
+
maxDepth?: string | number;
|
|
13
|
+
/** Maximum returned rows per bounded collection. */
|
|
14
|
+
limit?: string | number;
|
|
15
|
+
/** Resume a traversal after this previously returned node id. */
|
|
16
|
+
after?: string;
|
|
17
|
+
/** Edge orientation for paths and impact queries (outgoing, incoming, or both). */
|
|
18
|
+
direction?: string;
|
|
19
|
+
/** Maximum enumerated paths for the paths subcommand. */
|
|
20
|
+
maxPaths?: string | number;
|
|
21
|
+
/** Maximum evidence sample entries per audit finding. */
|
|
22
|
+
sample?: string | number;
|
|
23
|
+
/** Item ids treated as explicitly valid isolates by the audit. */
|
|
24
|
+
exemptIsolate?: string | string[];
|
|
25
|
+
/** Return counts-first envelopes without row collections. */
|
|
26
|
+
summary?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** Cost metadata attached to every graph query projection. */
|
|
29
|
+
export interface GraphQueryCost {
|
|
30
|
+
/** Nodes expanded while answering the query. */
|
|
31
|
+
visited_nodes: number;
|
|
32
|
+
/** Edges inspected while answering the query. */
|
|
33
|
+
inspected_edges: number;
|
|
34
|
+
}
|
|
35
|
+
/** Result envelope for the transitive traversal subcommands. */
|
|
36
|
+
export interface GraphTraversalResult {
|
|
37
|
+
/** Executed graph subcommand. */
|
|
38
|
+
subcommand: "ancestors" | "descendants" | "predecessors" | "successors";
|
|
39
|
+
/** Canonical root item id. */
|
|
40
|
+
root: string;
|
|
41
|
+
/** Total emitted node ids before summary suppression. */
|
|
42
|
+
count: number;
|
|
43
|
+
/** Whether configured bounds omitted reachable work. */
|
|
44
|
+
truncated: boolean;
|
|
45
|
+
/** Cursor resuming emission after the last returned node. */
|
|
46
|
+
next_cursor?: string;
|
|
47
|
+
/** Query cost metadata. */
|
|
48
|
+
cost: GraphQueryCost;
|
|
49
|
+
/** Emitted node ids in deterministic breadth-first order; absent with summary. */
|
|
50
|
+
ids?: string[];
|
|
51
|
+
/** Cache observability for this invocation. */
|
|
52
|
+
cache?: GraphCacheMetadata;
|
|
53
|
+
}
|
|
54
|
+
/** One enumerated path projected with relationship kinds instead of raw edges. */
|
|
55
|
+
export interface GraphPathRow {
|
|
56
|
+
/** Ordered node ids from source to target inclusive. */
|
|
57
|
+
nodes: string[];
|
|
58
|
+
/** Relationship kind of each traversed edge, in path order. */
|
|
59
|
+
kinds: string[];
|
|
60
|
+
/** Number of edges in the path. */
|
|
61
|
+
length: number;
|
|
62
|
+
}
|
|
63
|
+
/** Result envelope for the paths subcommand. */
|
|
64
|
+
export interface GraphPathsResult {
|
|
65
|
+
/** Executed graph subcommand. */
|
|
66
|
+
subcommand: "paths";
|
|
67
|
+
/** Canonical source item id. */
|
|
68
|
+
root: string;
|
|
69
|
+
/** Canonical target item id. */
|
|
70
|
+
target: string;
|
|
71
|
+
/** Traversal orientation used for the enumeration. */
|
|
72
|
+
direction: string;
|
|
73
|
+
/** Total enumerated paths before summary suppression. */
|
|
74
|
+
count: number;
|
|
75
|
+
/** Whether depth, path-count, or safety bounds stopped the search early. */
|
|
76
|
+
truncated: boolean;
|
|
77
|
+
/** Query cost metadata. */
|
|
78
|
+
cost: GraphQueryCost;
|
|
79
|
+
/** Enumerated paths, shortest first; absent with summary. */
|
|
80
|
+
paths?: GraphPathRow[];
|
|
81
|
+
/** Cache observability for this invocation. */
|
|
82
|
+
cache?: GraphCacheMetadata;
|
|
83
|
+
}
|
|
84
|
+
/** One affected item row in an impact projection. */
|
|
85
|
+
export interface GraphImpactRow {
|
|
86
|
+
/** Affected item id. */
|
|
87
|
+
id: string;
|
|
88
|
+
/** Shortest relationship distance from the root. */
|
|
89
|
+
distance: number;
|
|
90
|
+
/** Exact node path explaining why the item is affected. */
|
|
91
|
+
path: string[];
|
|
92
|
+
}
|
|
93
|
+
/** Result envelope for the impact subcommand. */
|
|
94
|
+
export interface GraphImpactResult {
|
|
95
|
+
/** Executed graph subcommand. */
|
|
96
|
+
subcommand: "impact";
|
|
97
|
+
/** Canonical impact-origin item id. */
|
|
98
|
+
root: string;
|
|
99
|
+
/** Traversal orientation used for the blast-radius walk. */
|
|
100
|
+
direction: string;
|
|
101
|
+
/** Total affected items before summary suppression. */
|
|
102
|
+
count: number;
|
|
103
|
+
/** Whether configured bounds omitted reachable work. */
|
|
104
|
+
truncated: boolean;
|
|
105
|
+
/** Query cost metadata. */
|
|
106
|
+
cost: GraphQueryCost;
|
|
107
|
+
/** Affected item rows ordered by discovery; absent with summary. */
|
|
108
|
+
affected?: GraphImpactRow[];
|
|
109
|
+
/** Cache observability for this invocation. */
|
|
110
|
+
cache?: GraphCacheMetadata;
|
|
111
|
+
}
|
|
112
|
+
/** Bounded execution-graph projection inside an analyze result. */
|
|
113
|
+
export interface GraphExecutionSummary {
|
|
114
|
+
/** Whether the order-bearing graph is acyclic. */
|
|
115
|
+
acyclic: boolean;
|
|
116
|
+
/** Nodes participating in the topological order. */
|
|
117
|
+
ordered_node_count: number;
|
|
118
|
+
/** Number of parallelizable topological layers. */
|
|
119
|
+
layer_count: number;
|
|
120
|
+
/** Total items with no open prerequisites. */
|
|
121
|
+
frontier_count: number;
|
|
122
|
+
/** Bounded prerequisite-free sample; absent with summary. */
|
|
123
|
+
frontier?: string[];
|
|
124
|
+
/** Edge count of the longest execution path. */
|
|
125
|
+
critical_path_length: number;
|
|
126
|
+
/** Longest deterministic execution path; absent with summary. */
|
|
127
|
+
critical_path?: string[];
|
|
128
|
+
/** Total genuine ordering cycles. */
|
|
129
|
+
cycle_count: number;
|
|
130
|
+
/** Bounded ordering-cycle sample; absent with summary. */
|
|
131
|
+
cycles?: string[][];
|
|
132
|
+
}
|
|
133
|
+
/** Bounded knowledge-graph projection inside an analyze result. */
|
|
134
|
+
export interface GraphKnowledgeSummary {
|
|
135
|
+
/** Total weakly connected components. */
|
|
136
|
+
component_count: number;
|
|
137
|
+
/** Node count of the largest component. */
|
|
138
|
+
largest_component_size: number;
|
|
139
|
+
/** Total nodes without any relationship edges. */
|
|
140
|
+
orphan_count: number;
|
|
141
|
+
/** Bounded orphan sample; absent with summary. */
|
|
142
|
+
orphans?: string[];
|
|
143
|
+
/** Bounded maximum-degree hubs; absent with summary. */
|
|
144
|
+
hubs?: {
|
|
145
|
+
id: string;
|
|
146
|
+
degree: number;
|
|
147
|
+
}[];
|
|
148
|
+
}
|
|
149
|
+
/** Result envelope for the analyze subcommand. */
|
|
150
|
+
export interface GraphAnalyzeResult {
|
|
151
|
+
/** Executed graph subcommand. */
|
|
152
|
+
subcommand: "analyze";
|
|
153
|
+
/** Total indexed graph nodes. */
|
|
154
|
+
node_count: number;
|
|
155
|
+
/** Total deduplicated graph edges. */
|
|
156
|
+
edge_count: number;
|
|
157
|
+
/** Bound applied to every sample collection. */
|
|
158
|
+
sample_limit: number;
|
|
159
|
+
/** Execution-order analytics over registered ordering kinds. */
|
|
160
|
+
execution: GraphExecutionSummary;
|
|
161
|
+
/** Structural analytics over every stored edge. */
|
|
162
|
+
knowledge: GraphKnowledgeSummary;
|
|
163
|
+
/** Cache observability for this invocation. */
|
|
164
|
+
cache?: GraphCacheMetadata;
|
|
165
|
+
}
|
|
166
|
+
/** Result envelope for the audit subcommand. */
|
|
167
|
+
export interface GraphAuditResult {
|
|
168
|
+
/** Executed graph subcommand. */
|
|
169
|
+
subcommand: "audit";
|
|
170
|
+
/** Total audit findings. */
|
|
171
|
+
finding_count: number;
|
|
172
|
+
/** Finding counts keyed by severity. */
|
|
173
|
+
findings_by_severity: Record<string, number>;
|
|
174
|
+
/** Affected-subject counts keyed by finding code. */
|
|
175
|
+
findings_by_code: Record<string, number>;
|
|
176
|
+
/** Structural coverage metrics computed during the audit. */
|
|
177
|
+
profile: RelationshipAuditReport["profile"];
|
|
178
|
+
/** Ordered findings with bounded evidence samples; absent with summary. */
|
|
179
|
+
findings?: RelationshipAuditReport["findings"];
|
|
180
|
+
/** Cache observability for this invocation. */
|
|
181
|
+
cache?: GraphCacheMetadata;
|
|
182
|
+
}
|
|
183
|
+
/** One bounded community row projected by the communities subcommand. */
|
|
184
|
+
export interface GraphCommunityRow {
|
|
185
|
+
/** Lexicographically smallest member id, naming the community. */
|
|
186
|
+
representative: string;
|
|
187
|
+
/** Total member count before sampling. */
|
|
188
|
+
size: number;
|
|
189
|
+
/** Bounded sorted member sample. */
|
|
190
|
+
members: string[];
|
|
191
|
+
}
|
|
192
|
+
/** Result envelope for the communities subcommand. */
|
|
193
|
+
export interface GraphCommunitiesResult {
|
|
194
|
+
/** Executed graph subcommand. */
|
|
195
|
+
subcommand: "communities";
|
|
196
|
+
/** Total detected communities meeting the size floor. */
|
|
197
|
+
community_count: number;
|
|
198
|
+
/** Member count of the largest community. */
|
|
199
|
+
largest_community_size: number;
|
|
200
|
+
/** Label-propagation sweeps executed. */
|
|
201
|
+
iterations: number;
|
|
202
|
+
/** Whether labels stabilized before the iteration bound. */
|
|
203
|
+
converged: boolean;
|
|
204
|
+
/** Whether the iteration bound stopped propagation early or the sample bound omitted rows. */
|
|
205
|
+
truncated: boolean;
|
|
206
|
+
/** Query cost metadata. */
|
|
207
|
+
cost: GraphQueryCost;
|
|
208
|
+
/** Bounded community rows, largest first; absent with summary. */
|
|
209
|
+
communities?: GraphCommunityRow[];
|
|
210
|
+
/** Cache observability for this invocation. */
|
|
211
|
+
cache?: GraphCacheMetadata;
|
|
212
|
+
}
|
|
213
|
+
/** One redundant stored edge projected with its witness path. */
|
|
214
|
+
export interface GraphRedundancyRow {
|
|
215
|
+
/** Stored edge source id. */
|
|
216
|
+
source: string;
|
|
217
|
+
/** Stored edge target id. */
|
|
218
|
+
target: string;
|
|
219
|
+
/** Stored relationship kind. */
|
|
220
|
+
kind: string;
|
|
221
|
+
/** Semantic-orientation node path proving the edge is implied. */
|
|
222
|
+
witness: string[];
|
|
223
|
+
}
|
|
224
|
+
/** Result envelope for the redundancy subcommand. */
|
|
225
|
+
export interface GraphRedundancyResult {
|
|
226
|
+
/** Executed graph subcommand. */
|
|
227
|
+
subcommand: "redundancy";
|
|
228
|
+
/** Total redundant edges found within configured bounds. */
|
|
229
|
+
redundant_count: number;
|
|
230
|
+
/** Whether the row limit omitted further redundant edges. */
|
|
231
|
+
truncated: boolean;
|
|
232
|
+
/** Query cost metadata. */
|
|
233
|
+
cost: GraphQueryCost;
|
|
234
|
+
/** Redundant edge rows in deterministic scan order; absent with summary. */
|
|
235
|
+
redundant?: GraphRedundancyRow[];
|
|
236
|
+
/** Cache observability for this invocation. */
|
|
237
|
+
cache?: GraphCacheMetadata;
|
|
238
|
+
}
|
|
239
|
+
/** One structural bottleneck row projected by the dominators subcommand. */
|
|
240
|
+
export interface GraphDominatorRow {
|
|
241
|
+
/** Bottleneck node id. */
|
|
242
|
+
id: string;
|
|
243
|
+
/** Immediate dominator appearing on every root-to-node path. */
|
|
244
|
+
idom: string;
|
|
245
|
+
/** Reachable nodes strictly gated by this node. */
|
|
246
|
+
dominated_count: number;
|
|
247
|
+
}
|
|
248
|
+
/** Result envelope for the dominators subcommand. */
|
|
249
|
+
export interface GraphDominatorsResult {
|
|
250
|
+
/** Executed graph subcommand. */
|
|
251
|
+
subcommand: "dominators";
|
|
252
|
+
/** Canonical analyzed root id. */
|
|
253
|
+
root: string;
|
|
254
|
+
/** Traversal orientation used for reachability. */
|
|
255
|
+
direction: string;
|
|
256
|
+
/** Reachable node count including the root. */
|
|
257
|
+
reachable_count: number;
|
|
258
|
+
/** Total nodes gating at least one other reachable node. */
|
|
259
|
+
bottleneck_count: number;
|
|
260
|
+
/** Whether the depth bound cut reachability or the row limit omitted bottleneck rows. */
|
|
261
|
+
truncated: boolean;
|
|
262
|
+
/** Query cost metadata. */
|
|
263
|
+
cost: GraphQueryCost;
|
|
264
|
+
/** Bounded bottleneck rows, most-gating first; absent with summary. */
|
|
265
|
+
bottlenecks?: GraphDominatorRow[];
|
|
266
|
+
/** Cache observability for this invocation. */
|
|
267
|
+
cache?: GraphCacheMetadata;
|
|
268
|
+
}
|
|
269
|
+
/** Result envelope for the dry-run remediation planning subcommand. */
|
|
270
|
+
export interface GraphPlanResult {
|
|
271
|
+
/** Executed graph subcommand. */
|
|
272
|
+
subcommand: "plan";
|
|
273
|
+
/** Total derived remediation proposals before row bounding. */
|
|
274
|
+
step_count: number;
|
|
275
|
+
/** Proposal counts keyed by operation family. */
|
|
276
|
+
steps_by_op: Record<string, number>;
|
|
277
|
+
/** Proposal counts keyed by policy code. */
|
|
278
|
+
steps_by_code: Record<string, number>;
|
|
279
|
+
/** Total governance-audit findings the plan was derived from. */
|
|
280
|
+
finding_count: number;
|
|
281
|
+
/** Whether sample, scan, or row bounds omitted derivable proposals. */
|
|
282
|
+
truncated: boolean;
|
|
283
|
+
/** Query cost metadata. */
|
|
284
|
+
cost: GraphQueryCost;
|
|
285
|
+
/** Bounded proposal rows in audit severity order; absent with summary. */
|
|
286
|
+
steps?: RelationshipRemediationStep[];
|
|
287
|
+
/** Cache observability for this invocation. */
|
|
288
|
+
cache?: GraphCacheMetadata;
|
|
289
|
+
}
|
|
290
|
+
/** Union of every graph subcommand result envelope. */
|
|
291
|
+
export type GraphResult = GraphTraversalResult | GraphPathsResult | GraphImpactResult | GraphAnalyzeResult | GraphAuditResult | GraphCommunitiesResult | GraphRedundancyResult | GraphDominatorsResult | GraphPlanResult;
|
|
292
|
+
/** Validate the graph subcommand and its positional-id requirements. */
|
|
293
|
+
export declare function parseGraphSubcommand(raw: string, id: string | undefined, target: string | undefined): GraphSubcommand;
|
|
294
|
+
/** Implements run graph for the public runtime surface of this module. */
|
|
295
|
+
export declare function runGraph(subcommandRaw: string, id: string | undefined, target: string | undefined, options: GraphCommandOptions, global: GlobalOptions): Promise<GraphResult>;
|