@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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
readManagedExtensionState,
|
|
5
5
|
runExtension
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-QRZNCRNA.js";
|
|
7
7
|
import {
|
|
8
8
|
migrateItemFilesToFormat
|
|
9
9
|
} from "./chunk-RC4UOUXA.js";
|
|
@@ -1359,6 +1359,6 @@ export {
|
|
|
1359
1359
|
_testOnlyConfigCommand,
|
|
1360
1360
|
runUpgrade
|
|
1361
1361
|
};
|
|
1362
|
-
//# sourceMappingURL=chunk-
|
|
1362
|
+
//# sourceMappingURL=chunk-IL5SPRMH.js.map
|
|
1363
1363
|
|
|
1364
1364
|
//# debugId=19ae68d5-2e1a-587a-af35-75e398c30d7c
|
|
@@ -1,27 +1,6 @@
|
|
|
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]="fd394844-de95-5cab-9dd6-7c4ef4e52320")}catch(e){}}();
|
|
3
|
-
import {
|
|
4
|
-
createQueryFingerprint,
|
|
5
|
-
encodeQueryCursor,
|
|
6
|
-
resolveQueryCursorStart
|
|
7
|
-
} from "./chunk-2IPNL3DR.js";
|
|
8
|
-
import {
|
|
9
|
-
getActiveExtensionRegistrations,
|
|
10
|
-
isTerminalStatus,
|
|
11
|
-
listAllItemMetadataLight,
|
|
12
|
-
readSettings
|
|
13
|
-
} from "./chunk-P22HGFFI.js";
|
|
14
|
-
import {
|
|
15
|
-
EXIT_CODE,
|
|
16
|
-
PmCliError,
|
|
17
|
-
getSettingsPath,
|
|
18
|
-
pathExists,
|
|
19
|
-
resolveItemTypeRegistry,
|
|
20
|
-
resolvePmRoot,
|
|
21
|
-
resolveRuntimeStatusRegistry
|
|
22
|
-
} from "./chunk-KX62NMZC.js";
|
|
23
|
-
|
|
24
1
|
// dist/sdk/relationships.js
|
|
2
|
+
|
|
3
|
+
!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]="8145f80d-99b5-53e4-a519-54b4549dca6c")}catch(e){}}();
|
|
25
4
|
var BUILTIN_RELATIONSHIP_KINDS = [
|
|
26
5
|
{
|
|
27
6
|
kind: "blocked_by",
|
|
@@ -364,6 +343,14 @@ var RelationshipGraph = class _RelationshipGraph {
|
|
|
364
343
|
nodes() {
|
|
365
344
|
return this.#nodeSnapshot;
|
|
366
345
|
}
|
|
346
|
+
/** Report whether an identifier names an indexed node. */
|
|
347
|
+
hasNode(id) {
|
|
348
|
+
return this.#nodes.has(id);
|
|
349
|
+
}
|
|
350
|
+
/** Return the registry that interprets this graph's relationship kinds. */
|
|
351
|
+
registry() {
|
|
352
|
+
return this.#registry;
|
|
353
|
+
}
|
|
367
354
|
#assertNode(id) {
|
|
368
355
|
if (!this.#nodes.has(id))
|
|
369
356
|
throw new TypeError(`Relationship node not found: ${id}`);
|
|
@@ -403,6 +390,24 @@ var RelationshipGraph = class _RelationshipGraph {
|
|
|
403
390
|
}
|
|
404
391
|
};
|
|
405
392
|
}
|
|
393
|
+
/** Return deterministic one-hop neighbor rows paired with each connecting edge. */
|
|
394
|
+
neighborEdges(id, options = {}) {
|
|
395
|
+
this.#assertNode(id);
|
|
396
|
+
options.signal?.throwIfAborted();
|
|
397
|
+
const kinds = options.kinds ? new Set(options.kinds.map((kind) => this.#registry.require(kind).kind)) : void 0;
|
|
398
|
+
const rows = this.#neighbors(id, options.direction ?? "outgoing", kinds);
|
|
399
|
+
const limit = options.limit ?? Number.POSITIVE_INFINITY;
|
|
400
|
+
const value = rows.slice(0, limit);
|
|
401
|
+
return {
|
|
402
|
+
value,
|
|
403
|
+
meta: {
|
|
404
|
+
visitedNodes: 1,
|
|
405
|
+
inspectedEdges: rows.length,
|
|
406
|
+
truncated: value.length < rows.length,
|
|
407
|
+
nextCursor: value.at(-1)?.id
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
}
|
|
406
411
|
/** Return bounded transitive closure in breadth-first discovery order. */
|
|
407
412
|
closure(id, options = {}) {
|
|
408
413
|
this.#assertNode(id);
|
|
@@ -528,193 +533,7 @@ function dependencyToRelationship(source, dependency, registry = defaultRegistry
|
|
|
528
533
|
};
|
|
529
534
|
}
|
|
530
535
|
|
|
531
|
-
// dist/sdk/
|
|
532
|
-
var tokenEncoder = new TextEncoder();
|
|
533
|
-
function positiveInteger(value, fallback, field) {
|
|
534
|
-
const resolved = value ?? fallback;
|
|
535
|
-
if (!Number.isInteger(resolved) || resolved < 1)
|
|
536
|
-
throw new TypeError(`Relationship context ${field} must be positive`);
|
|
537
|
-
return resolved;
|
|
538
|
-
}
|
|
539
|
-
function estimateTokens(value) {
|
|
540
|
-
return Math.max(1, Math.ceil(tokenEncoder.encode(JSON.stringify(value)).byteLength / 4));
|
|
541
|
-
}
|
|
542
|
-
function explainDirectEdge(edge, root, node, registry) {
|
|
543
|
-
const definition = registry.require(edge.kind);
|
|
544
|
-
if (definition.ordering) {
|
|
545
|
-
const sourceFirst = (definition.precedence ?? "source_before_target") === "source_before_target";
|
|
546
|
-
const before = sourceFirst ? edge.source : edge.target;
|
|
547
|
-
return node === before ? "prerequisite" : "dependent";
|
|
548
|
-
}
|
|
549
|
-
if (definition.hierarchy) {
|
|
550
|
-
const sourceIsParent = (definition.hierarchyDirection ?? "source_parent") === "source_parent";
|
|
551
|
-
const parent = sourceIsParent ? edge.source : edge.target;
|
|
552
|
-
return node === parent ? "ancestor" : "descendant";
|
|
553
|
-
}
|
|
554
|
-
if (edge.kind === "discovered_from" || edge.kind === "incident_from")
|
|
555
|
-
return "provenance";
|
|
556
|
-
return "related";
|
|
557
|
-
}
|
|
558
|
-
function directReasons(rootEdges, root, node, registry) {
|
|
559
|
-
const reasons = rootEdges.filter((edge) => edge.source === root && edge.target === node || edge.target === root && edge.source === node).map((edge) => explainDirectEdge(edge, root, node, registry));
|
|
560
|
-
return [...new Set(reasons)].sort();
|
|
561
|
-
}
|
|
562
|
-
function discoverNodes(graph, root, options) {
|
|
563
|
-
const direction = options.direction ?? "both";
|
|
564
|
-
const maxDepth = options.maxDepth ?? 3;
|
|
565
|
-
if (!Number.isInteger(maxDepth) || maxDepth < 0)
|
|
566
|
-
throw new TypeError("Relationship context maxDepth must be non-negative");
|
|
567
|
-
const seen = /* @__PURE__ */ new Set([root]);
|
|
568
|
-
const queue = [{ id: root, distance: 0 }];
|
|
569
|
-
const rows = [];
|
|
570
|
-
let inspectedEdges = 0;
|
|
571
|
-
let depthTruncated = false;
|
|
572
|
-
for (let index = 0; index < queue.length; index += 1) {
|
|
573
|
-
options.signal?.throwIfAborted();
|
|
574
|
-
const current = queue[index];
|
|
575
|
-
if (current.distance >= maxDepth && depthTruncated)
|
|
576
|
-
continue;
|
|
577
|
-
const adjacent = graph.adjacency(current.id, {
|
|
578
|
-
direction,
|
|
579
|
-
kinds: options.kinds,
|
|
580
|
-
signal: options.signal
|
|
581
|
-
});
|
|
582
|
-
inspectedEdges += adjacent.meta.inspectedEdges;
|
|
583
|
-
if (current.distance >= maxDepth) {
|
|
584
|
-
if (adjacent.value.some((id) => !seen.has(id)))
|
|
585
|
-
depthTruncated = true;
|
|
586
|
-
continue;
|
|
587
|
-
}
|
|
588
|
-
for (const id of adjacent.value) {
|
|
589
|
-
if (seen.has(id))
|
|
590
|
-
continue;
|
|
591
|
-
seen.add(id);
|
|
592
|
-
const row = { id, distance: current.distance + 1 };
|
|
593
|
-
rows.push(row);
|
|
594
|
-
queue.push(row);
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
rows.sort((left, right) => left.distance - right.distance || left.id.localeCompare(right.id));
|
|
598
|
-
return {
|
|
599
|
-
rows,
|
|
600
|
-
visitedNodes: queue.length,
|
|
601
|
-
inspectedEdges,
|
|
602
|
-
depthTruncated
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
function selectContextNodes(params) {
|
|
606
|
-
const nodes = [];
|
|
607
|
-
let usedTokens = params.initialTokens;
|
|
608
|
-
const rootEdges = params.graph.incidentEdges(params.rootId);
|
|
609
|
-
for (const candidate of params.candidates) {
|
|
610
|
-
if (nodes.length >= params.nodeLimit)
|
|
611
|
-
break;
|
|
612
|
-
const node = {
|
|
613
|
-
...params.details.get(candidate.id) ?? { id: candidate.id },
|
|
614
|
-
distance: candidate.distance,
|
|
615
|
-
reasons: candidate.distance === 1 ? directReasons(rootEdges, params.rootId, candidate.id, params.registry) : [`reachable at depth ${candidate.distance}`]
|
|
616
|
-
};
|
|
617
|
-
const cost = estimateTokens(node);
|
|
618
|
-
if (usedTokens + cost > params.tokenBudget)
|
|
619
|
-
break;
|
|
620
|
-
nodes.push(node);
|
|
621
|
-
usedTokens += cost;
|
|
622
|
-
}
|
|
623
|
-
if (params.candidates.length > 0 && nodes.length === 0)
|
|
624
|
-
throw new TypeError("Relationship context tokenBudget cannot fit one node");
|
|
625
|
-
return { nodes, usedTokens };
|
|
626
|
-
}
|
|
627
|
-
function selectContextEdges(params) {
|
|
628
|
-
const candidates = params.graph.edges().filter((edge) => params.included.has(edge.source) && params.included.has(edge.target));
|
|
629
|
-
const edges = [];
|
|
630
|
-
let usedTokens = params.initialTokens;
|
|
631
|
-
for (const edge of candidates) {
|
|
632
|
-
if (edges.length >= params.edgeLimit)
|
|
633
|
-
break;
|
|
634
|
-
const cost = estimateTokens(edge);
|
|
635
|
-
if (usedTokens + cost > params.tokenBudget)
|
|
636
|
-
break;
|
|
637
|
-
edges.push(edge);
|
|
638
|
-
usedTokens += cost;
|
|
639
|
-
}
|
|
640
|
-
return { edges, usedTokens, candidateCount: candidates.length };
|
|
641
|
-
}
|
|
642
|
-
function buildRelationshipContext(graph, rootId, details, options = {}) {
|
|
643
|
-
if (!graph.nodes().includes(rootId))
|
|
644
|
-
throw new TypeError(`Relationship node not found: ${rootId}`);
|
|
645
|
-
const nodeLimit = positiveInteger(options.nodeLimit, 20, "nodeLimit");
|
|
646
|
-
const edgeLimit = positiveInteger(options.edgeLimit, 40, "edgeLimit");
|
|
647
|
-
const tokenBudget = positiveInteger(options.tokenBudget, 1200, "tokenBudget");
|
|
648
|
-
const registry = options.registry ?? createRelationshipKindRegistry();
|
|
649
|
-
const byId = new Map(details.map((detail) => [detail.id, detail]));
|
|
650
|
-
const rootDetails = byId.get(rootId) ?? {
|
|
651
|
-
id: rootId
|
|
652
|
-
};
|
|
653
|
-
const { evidence: rootEvidence = [], ...root } = rootDetails;
|
|
654
|
-
const evidence = [...rootEvidence];
|
|
655
|
-
const discovery = discoverNodes(graph, rootId, options);
|
|
656
|
-
const fingerprint = createQueryFingerprint("relationship-context", {
|
|
657
|
-
rootId,
|
|
658
|
-
direction: options.direction ?? "both",
|
|
659
|
-
kinds: [...options.kinds ?? []].sort(),
|
|
660
|
-
maxDepth: options.maxDepth ?? 3
|
|
661
|
-
});
|
|
662
|
-
const pageStart = resolveQueryCursorStart(discovery.rows, options.cursor, fingerprint, ({ id }) => id);
|
|
663
|
-
const candidates = discovery.rows.slice(pageStart);
|
|
664
|
-
const initialTokens = estimateTokens(root) + estimateTokens(evidence);
|
|
665
|
-
if (initialTokens > tokenBudget)
|
|
666
|
-
throw new TypeError("Relationship context tokenBudget cannot fit root and evidence");
|
|
667
|
-
const nodeSelection = selectContextNodes({
|
|
668
|
-
candidates,
|
|
669
|
-
details: byId,
|
|
670
|
-
graph,
|
|
671
|
-
rootId,
|
|
672
|
-
registry,
|
|
673
|
-
nodeLimit,
|
|
674
|
-
tokenBudget,
|
|
675
|
-
initialTokens
|
|
676
|
-
});
|
|
677
|
-
const { nodes } = nodeSelection;
|
|
678
|
-
const included = /* @__PURE__ */ new Set([rootId, ...nodes.map(({ id }) => id)]);
|
|
679
|
-
const edgeSelection = selectContextEdges({
|
|
680
|
-
graph,
|
|
681
|
-
included,
|
|
682
|
-
edgeLimit,
|
|
683
|
-
tokenBudget,
|
|
684
|
-
initialTokens: nodeSelection.usedTokens
|
|
685
|
-
});
|
|
686
|
-
const { edges, usedTokens } = edgeSelection;
|
|
687
|
-
const consumed = pageStart + nodes.length;
|
|
688
|
-
const hasMoreNodes = consumed < discovery.rows.length;
|
|
689
|
-
const lastNode = nodes.at(-1);
|
|
690
|
-
const omittedEdges = edgeSelection.candidateCount - edges.length;
|
|
691
|
-
const truncated = discovery.depthTruncated || hasMoreNodes || omittedEdges > 0;
|
|
692
|
-
return {
|
|
693
|
-
root,
|
|
694
|
-
nodes,
|
|
695
|
-
edges,
|
|
696
|
-
evidence,
|
|
697
|
-
meta: {
|
|
698
|
-
exact: true,
|
|
699
|
-
truncated,
|
|
700
|
-
nodeLimit,
|
|
701
|
-
edgeLimit,
|
|
702
|
-
tokenBudget,
|
|
703
|
-
usedTokens,
|
|
704
|
-
visitedNodes: discovery.visitedNodes,
|
|
705
|
-
inspectedEdges: discovery.inspectedEdges,
|
|
706
|
-
omittedNodes: discovery.rows.length - consumed,
|
|
707
|
-
omittedEdges,
|
|
708
|
-
...hasMoreNodes && lastNode ? {
|
|
709
|
-
nextCursor: encodeQueryCursor(fingerprint, lastNode.id, consumed - 1)
|
|
710
|
-
} : {}
|
|
711
|
-
}
|
|
712
|
-
};
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
// dist/sdk/dependencies.js
|
|
716
|
-
var DEPS_FORMAT_VALUES = ["tree", "graph", "context"];
|
|
717
|
-
var DEPS_COLLAPSE_VALUES = ["none", "repeated"];
|
|
536
|
+
// dist/sdk/graph/assembly.js
|
|
718
537
|
function normalizeDependencyReferenceTarget(target) {
|
|
719
538
|
if (typeof target !== "string")
|
|
720
539
|
return void 0;
|
|
@@ -728,7 +547,8 @@ function normalizeDependencyGraphTarget(target) {
|
|
|
728
547
|
return normalized?.toLowerCase() === "no-active-blocker" ? void 0 : normalized;
|
|
729
548
|
}
|
|
730
549
|
function collectDanglingDependencyReferences(items, isTerminal = (status) => status === "closed" || status === "canceled") {
|
|
731
|
-
const
|
|
550
|
+
const safeItems = items.filter((item) => typeof item?.id === "string" && item.id.trim().length > 0);
|
|
551
|
+
const knownIds = new Set(safeItems.map((item) => item.id.trim().toLowerCase()));
|
|
732
552
|
const rows = /* @__PURE__ */ new Map();
|
|
733
553
|
const addReference = (item, target, kind, source) => {
|
|
734
554
|
const normalized = normalizeDependencyReferenceTarget(target);
|
|
@@ -736,7 +556,7 @@ function collectDanglingDependencyReferences(items, isTerminal = (status) => sta
|
|
|
736
556
|
return;
|
|
737
557
|
}
|
|
738
558
|
const row = {
|
|
739
|
-
holder_id: item.id,
|
|
559
|
+
holder_id: item.id.trim(),
|
|
740
560
|
target_id: normalized,
|
|
741
561
|
kind,
|
|
742
562
|
source,
|
|
@@ -746,7 +566,7 @@ function collectDanglingDependencyReferences(items, isTerminal = (status) => sta
|
|
|
746
566
|
};
|
|
747
567
|
rows.set(`${row.holder_id}::${row.target_id}::${row.kind}::${row.source}`, row);
|
|
748
568
|
};
|
|
749
|
-
for (const item of
|
|
569
|
+
for (const item of safeItems) {
|
|
750
570
|
addReference(item, item.parent, "parent", "parent");
|
|
751
571
|
addReference(item, item.blocked_by, "blocked_by", "blocked_by");
|
|
752
572
|
for (const dependency of item.dependencies ?? []) {
|
|
@@ -777,211 +597,14 @@ function collectMissingDependencyTargetIds(dangling) {
|
|
|
777
597
|
}
|
|
778
598
|
return [...targets.values()].sort((left, right) => left.localeCompare(right));
|
|
779
599
|
}
|
|
780
|
-
function
|
|
781
|
-
const
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
}
|
|
785
|
-
throw new PmCliError(`Invalid --format value "${raw}". Use "tree", "graph", or "context".`, EXIT_CODE.USAGE);
|
|
786
|
-
}
|
|
787
|
-
function parsePositiveInteger(raw, flag) {
|
|
788
|
-
if (raw === void 0)
|
|
789
|
-
return void 0;
|
|
790
|
-
const value = typeof raw === "number" ? raw : Number(raw.trim());
|
|
791
|
-
if (!Number.isInteger(value) || value < 1)
|
|
792
|
-
throw new PmCliError(`Invalid --${flag} value "${raw}". Use a positive integer.`, EXIT_CODE.USAGE);
|
|
793
|
-
return value;
|
|
794
|
-
}
|
|
795
|
-
function parseMaxDepth(raw) {
|
|
796
|
-
if (raw === void 0) {
|
|
797
|
-
return void 0;
|
|
798
|
-
}
|
|
799
|
-
const normalized = typeof raw === "number" ? raw : Number(raw.trim());
|
|
800
|
-
if (!Number.isInteger(normalized) || normalized < 0) {
|
|
801
|
-
throw new PmCliError(`Invalid --max-depth value "${raw}". Use a non-negative integer.`, EXIT_CODE.USAGE);
|
|
802
|
-
}
|
|
803
|
-
return normalized;
|
|
804
|
-
}
|
|
805
|
-
function parseCollapse(raw) {
|
|
806
|
-
const candidate = raw?.trim().toLowerCase() ?? "none";
|
|
807
|
-
if (DEPS_COLLAPSE_VALUES.includes(candidate)) {
|
|
808
|
-
return candidate;
|
|
809
|
-
}
|
|
810
|
-
throw new PmCliError(`Invalid --collapse value "${raw}". Use "none" or "repeated".`, EXIT_CODE.USAGE);
|
|
811
|
-
}
|
|
812
|
-
function normalizeDependencies(dependencies) {
|
|
813
|
-
if (!dependencies || dependencies.length === 0) {
|
|
814
|
-
return [];
|
|
815
|
-
}
|
|
816
|
-
const sorted = dependencies.map(({ id, kind }) => ({
|
|
817
|
-
id: id.trim(),
|
|
818
|
-
kind: kind.trim().toLowerCase()
|
|
819
|
-
})).sort((left, right) => {
|
|
820
|
-
const byKind = left.kind.localeCompare(right.kind);
|
|
821
|
-
if (byKind !== 0)
|
|
822
|
-
return byKind;
|
|
823
|
-
return left.id.localeCompare(right.id);
|
|
824
|
-
});
|
|
825
|
-
const deduped = /* @__PURE__ */ new Map();
|
|
826
|
-
for (const dependency of sorted) {
|
|
827
|
-
const key = `${dependency.kind.toLowerCase()}::${dependency.id.toLowerCase()}`;
|
|
828
|
-
if (!deduped.has(key)) {
|
|
829
|
-
deduped.set(key, { id: dependency.id, kind: dependency.kind });
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
return [...deduped.values()];
|
|
833
|
-
}
|
|
834
|
-
function toIndexedItem(item) {
|
|
835
|
-
return {
|
|
836
|
-
id: item.id,
|
|
837
|
-
title: item.title,
|
|
838
|
-
type: item.type,
|
|
839
|
-
status: item.status,
|
|
840
|
-
dependencies: normalizeDependencies(item.dependencies)
|
|
841
|
-
};
|
|
842
|
-
}
|
|
843
|
-
function toTreeNode(id, index, lineage, maxDepth, collapse, expanded, depth = 0, via) {
|
|
844
|
-
const lookupId = id.trim().toLowerCase();
|
|
845
|
-
const item = index.get(lookupId);
|
|
846
|
-
const baseNode = {
|
|
847
|
-
id: item?.id ?? id,
|
|
848
|
-
title: item?.title,
|
|
849
|
-
type: item?.type,
|
|
850
|
-
status: item?.status,
|
|
851
|
-
via,
|
|
852
|
-
missing: !item,
|
|
853
|
-
cycle: lineage.has(lookupId),
|
|
854
|
-
dependencies: []
|
|
855
|
-
};
|
|
856
|
-
if (!item || baseNode.cycle) {
|
|
857
|
-
return baseNode;
|
|
858
|
-
}
|
|
859
|
-
if (maxDepth !== void 0 && depth >= maxDepth) {
|
|
860
|
-
if (item.dependencies.length > 0) {
|
|
861
|
-
baseNode.truncated = true;
|
|
862
|
-
}
|
|
863
|
-
return baseNode;
|
|
864
|
-
}
|
|
865
|
-
if (collapse === "repeated" && expanded.has(lookupId)) {
|
|
866
|
-
baseNode.collapsed = true;
|
|
867
|
-
return baseNode;
|
|
868
|
-
}
|
|
869
|
-
if (collapse === "repeated") {
|
|
870
|
-
expanded.add(lookupId);
|
|
871
|
-
}
|
|
872
|
-
const nextLineage = new Set(lineage);
|
|
873
|
-
nextLineage.add(lookupId);
|
|
874
|
-
baseNode.dependencies = item.dependencies.map((dependency) => toTreeNode(dependency.id, index, nextLineage, maxDepth, collapse, expanded, depth + 1, dependency.kind));
|
|
875
|
-
return baseNode;
|
|
876
|
-
}
|
|
877
|
-
function mergeGraphNode(existing, candidate) {
|
|
878
|
-
if (!existing) {
|
|
879
|
-
return candidate;
|
|
880
|
-
}
|
|
881
|
-
if (existing.missing && !candidate.missing)
|
|
882
|
-
return candidate;
|
|
883
|
-
return {
|
|
884
|
-
...existing,
|
|
885
|
-
title: existing.title ?? candidate.title,
|
|
886
|
-
type: existing.type ?? candidate.type,
|
|
887
|
-
status: existing.status ?? candidate.status
|
|
888
|
-
};
|
|
889
|
-
}
|
|
890
|
-
function toGraph(root) {
|
|
891
|
-
const nodesById = /* @__PURE__ */ new Map();
|
|
892
|
-
const edgesByKey = /* @__PURE__ */ new Map();
|
|
893
|
-
const visit = (node) => {
|
|
894
|
-
nodesById.set(node.id, mergeGraphNode(nodesById.get(node.id), {
|
|
895
|
-
id: node.id,
|
|
896
|
-
title: node.title,
|
|
897
|
-
type: node.type,
|
|
898
|
-
status: node.status,
|
|
899
|
-
missing: node.missing
|
|
900
|
-
}));
|
|
901
|
-
for (const child of node.dependencies) {
|
|
902
|
-
nodesById.set(child.id, mergeGraphNode(nodesById.get(child.id), {
|
|
903
|
-
id: child.id,
|
|
904
|
-
title: child.title,
|
|
905
|
-
type: child.type,
|
|
906
|
-
status: child.status,
|
|
907
|
-
missing: child.missing
|
|
908
|
-
}));
|
|
909
|
-
const relationKind = child.via ?? "related";
|
|
910
|
-
const edgeKey = `${node.id}::${child.id}::${relationKind}`;
|
|
911
|
-
if (!edgesByKey.has(edgeKey)) {
|
|
912
|
-
edgesByKey.set(edgeKey, {
|
|
913
|
-
from: node.id,
|
|
914
|
-
to: child.id,
|
|
915
|
-
kind: relationKind
|
|
916
|
-
});
|
|
917
|
-
}
|
|
918
|
-
if (!child.cycle) {
|
|
919
|
-
visit(child);
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
};
|
|
923
|
-
visit(root);
|
|
924
|
-
const nodes = [...nodesById.values()].sort((left, right) => left.id.localeCompare(right.id));
|
|
925
|
-
const edges = [...edgesByKey.values()].sort((left, right) => {
|
|
926
|
-
const byFrom = left.from.localeCompare(right.from);
|
|
927
|
-
if (byFrom !== 0)
|
|
928
|
-
return byFrom;
|
|
929
|
-
const byTo = left.to.localeCompare(right.to);
|
|
930
|
-
if (byTo !== 0)
|
|
931
|
-
return byTo;
|
|
932
|
-
return left.kind.localeCompare(right.kind);
|
|
933
|
-
});
|
|
934
|
-
const missingIds = nodes.filter((node) => node.missing).map((node) => node.id);
|
|
935
|
-
return {
|
|
936
|
-
root_id: root.id,
|
|
937
|
-
nodes,
|
|
938
|
-
edges,
|
|
939
|
-
missing_ids: missingIds
|
|
940
|
-
};
|
|
941
|
-
}
|
|
942
|
-
function countDependencyGraph(rootId, index, maxDepth) {
|
|
943
|
-
const nodeIds = /* @__PURE__ */ new Set();
|
|
944
|
-
const edgeKeys = /* @__PURE__ */ new Set();
|
|
945
|
-
const missingIds = /* @__PURE__ */ new Set();
|
|
946
|
-
const expanded = /* @__PURE__ */ new Set();
|
|
947
|
-
const pending = [{ id: rootId, depth: 0 }];
|
|
948
|
-
let pendingIndex = 0;
|
|
949
|
-
while (pendingIndex < pending.length) {
|
|
950
|
-
const current = pending[pendingIndex++];
|
|
951
|
-
const lookupId = current.id.trim().toLowerCase();
|
|
952
|
-
nodeIds.add(lookupId);
|
|
953
|
-
const item = index.get(lookupId);
|
|
954
|
-
if (!item) {
|
|
955
|
-
missingIds.add(lookupId);
|
|
956
|
-
continue;
|
|
957
|
-
}
|
|
958
|
-
if (maxDepth !== void 0 && current.depth >= maxDepth) {
|
|
959
|
-
continue;
|
|
960
|
-
}
|
|
961
|
-
if (expanded.has(lookupId)) {
|
|
962
|
-
continue;
|
|
963
|
-
}
|
|
964
|
-
expanded.add(lookupId);
|
|
965
|
-
for (const dependency of item.dependencies) {
|
|
966
|
-
edgeKeys.add(`${lookupId}::${dependency.id.trim().toLowerCase()}::${dependency.kind}`);
|
|
967
|
-
pending.push({ id: dependency.id, depth: current.depth + 1 });
|
|
968
|
-
}
|
|
969
|
-
}
|
|
970
|
-
return {
|
|
971
|
-
node_count: nodeIds.size,
|
|
972
|
-
edge_count: edgeKeys.size,
|
|
973
|
-
missing_count: missingIds.size
|
|
974
|
-
};
|
|
975
|
-
}
|
|
976
|
-
function buildDepsRelationshipContext(rootId, items, options) {
|
|
977
|
-
const maxDepth = parseMaxDepth(options.maxDepth);
|
|
978
|
-
const nodeLimit = parsePositiveInteger(options.nodeLimit, "node-limit");
|
|
979
|
-
const edgeLimit = parsePositiveInteger(options.edgeLimit, "edge-limit");
|
|
980
|
-
const tokenBudget = parsePositiveInteger(options.tokenBudget, "token-budget");
|
|
981
|
-
const canonicalIds = new Map(items.map((item) => [item.id.trim().toLowerCase(), item.id.trim()]));
|
|
982
|
-
const dangling = collectDanglingDependencyReferences(items);
|
|
600
|
+
function assembleWorkspaceRelationshipGraph(items, isTerminal, registry) {
|
|
601
|
+
const safeItems = items.filter((item) => typeof item?.id === "string" && item.id.trim().length > 0);
|
|
602
|
+
const canonicalIds = new Map(safeItems.map((item) => [item.id.trim().toLowerCase(), item.id.trim()]));
|
|
603
|
+
const dangling = collectDanglingDependencyReferences(safeItems, isTerminal);
|
|
983
604
|
const missingIds = collectMissingDependencyTargetIds(dangling);
|
|
984
|
-
const
|
|
605
|
+
for (const id of missingIds)
|
|
606
|
+
canonicalIds.set(id.toLowerCase(), id);
|
|
607
|
+
const graphItems = safeItems.map((item) => {
|
|
985
608
|
const parent = normalizeDependencyGraphTarget(item.parent);
|
|
986
609
|
const blocker = normalizeDependencyGraphTarget(item.blocked_by);
|
|
987
610
|
const dependencies = (item.dependencies ?? []).flatMap((rawDependency) => {
|
|
@@ -991,91 +614,36 @@ function buildDepsRelationshipContext(rootId, items, options) {
|
|
|
991
614
|
const target = normalizeDependencyGraphTarget(dependency.id);
|
|
992
615
|
if (!target)
|
|
993
616
|
return [];
|
|
994
|
-
return [
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
617
|
+
return [
|
|
618
|
+
{
|
|
619
|
+
id: canonicalIds.get(target.toLowerCase()),
|
|
620
|
+
kind: typeof dependency.kind === "string" ? dependency.kind : "related"
|
|
621
|
+
}
|
|
622
|
+
];
|
|
998
623
|
});
|
|
999
624
|
return {
|
|
1000
|
-
id: item.id,
|
|
1001
|
-
...parent ? { parent: canonicalIds.get(parent.toLowerCase())
|
|
1002
|
-
...blocker ? { blocked_by: canonicalIds.get(blocker.toLowerCase())
|
|
625
|
+
id: item.id.trim(),
|
|
626
|
+
...parent ? { parent: canonicalIds.get(parent.toLowerCase()) } : {},
|
|
627
|
+
...blocker ? { blocked_by: canonicalIds.get(blocker.toLowerCase()) } : {},
|
|
1003
628
|
dependencies
|
|
1004
629
|
};
|
|
1005
630
|
});
|
|
1006
|
-
return buildRelationshipContext(RelationshipGraph.fromItems([...graphItems, ...missingIds.map((id) => ({ id }))]), rootId, [
|
|
1007
|
-
...items.map((item) => ({ id: item.id, title: item.title, status: item.status })),
|
|
1008
|
-
...missingIds.map((id) => ({ id, title: `[missing] ${id}`, status: "missing" }))
|
|
1009
|
-
], {
|
|
1010
|
-
...maxDepth === void 0 ? {} : { maxDepth },
|
|
1011
|
-
...nodeLimit === void 0 ? {} : { nodeLimit },
|
|
1012
|
-
...edgeLimit === void 0 ? {} : { edgeLimit },
|
|
1013
|
-
...tokenBudget === void 0 ? {} : { tokenBudget },
|
|
1014
|
-
...options.cursor?.trim() ? { cursor: options.cursor.trim() } : {}
|
|
1015
|
-
});
|
|
1016
|
-
}
|
|
1017
|
-
async function runDeps(id, options, global) {
|
|
1018
|
-
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
1019
|
-
if (!await pathExists(getSettingsPath(pmRoot))) {
|
|
1020
|
-
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
1021
|
-
}
|
|
1022
|
-
const format = parseFormat(options.format);
|
|
1023
|
-
const maxDepth = parseMaxDepth(options.maxDepth);
|
|
1024
|
-
const collapse = parseCollapse(options.collapse);
|
|
1025
|
-
const summaryOnly = options.summary === true;
|
|
1026
|
-
const settings = await readSettings(pmRoot);
|
|
1027
|
-
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
1028
|
-
const items = await listAllItemMetadataLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, void 0, settings.schema);
|
|
1029
|
-
const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
|
|
1030
|
-
const index = new Map(items.map((item) => [item.id.trim().toLowerCase(), toIndexedItem(item)]));
|
|
1031
|
-
const dangling = collectDanglingDependencyReferences(items, (status) => isTerminalStatus(status, statusRegistry));
|
|
1032
|
-
for (const reference of [...dangling.active, ...dangling.legacy_terminal]) {
|
|
1033
|
-
const holder = index.get(reference.holder_id.trim().toLowerCase());
|
|
1034
|
-
const referenceKind = reference.kind.trim().toLowerCase();
|
|
1035
|
-
if (holder && !holder.dependencies.some((dependency) => dependency.id.trim().toLowerCase() === reference.target_id.trim().toLowerCase() && dependency.kind === referenceKind)) {
|
|
1036
|
-
holder.dependencies.push({ id: reference.target_id, kind: referenceKind });
|
|
1037
|
-
}
|
|
1038
|
-
}
|
|
1039
|
-
if (!index.has(id.trim().toLowerCase())) {
|
|
1040
|
-
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
1041
|
-
}
|
|
1042
|
-
if (format === "context") {
|
|
1043
|
-
const canonicalId = index.get(id.trim().toLowerCase()).id;
|
|
1044
|
-
const context = buildDepsRelationshipContext(canonicalId, items, options);
|
|
1045
|
-
return {
|
|
1046
|
-
id: canonicalId,
|
|
1047
|
-
format,
|
|
1048
|
-
node_count: context.nodes.length + 1,
|
|
1049
|
-
edge_count: context.edges.length,
|
|
1050
|
-
missing_count: collectMissingDependencyTargetIds(dangling).length,
|
|
1051
|
-
...summaryOnly ? {} : { context }
|
|
1052
|
-
};
|
|
1053
|
-
}
|
|
1054
|
-
if (summaryOnly) {
|
|
1055
|
-
return {
|
|
1056
|
-
id,
|
|
1057
|
-
format,
|
|
1058
|
-
...countDependencyGraph(id, index, maxDepth)
|
|
1059
|
-
};
|
|
1060
|
-
}
|
|
1061
|
-
const tree = toTreeNode(id, index, /* @__PURE__ */ new Set(), maxDepth, collapse, /* @__PURE__ */ new Set());
|
|
1062
|
-
const graph = toGraph(tree);
|
|
1063
|
-
const baseResult = {
|
|
1064
|
-
id,
|
|
1065
|
-
format,
|
|
1066
|
-
node_count: graph.nodes.length,
|
|
1067
|
-
edge_count: graph.edges.length,
|
|
1068
|
-
missing_count: graph.missing_ids.length
|
|
1069
|
-
};
|
|
1070
|
-
if (format === "tree") {
|
|
1071
|
-
return {
|
|
1072
|
-
...baseResult,
|
|
1073
|
-
tree
|
|
1074
|
-
};
|
|
1075
|
-
}
|
|
1076
631
|
return {
|
|
1077
|
-
...
|
|
1078
|
-
|
|
632
|
+
graph: RelationshipGraph.fromItems([...graphItems, ...missingIds.map((id) => ({ id }))], registry),
|
|
633
|
+
details: [
|
|
634
|
+
...safeItems.map((item) => ({
|
|
635
|
+
id: item.id.trim(),
|
|
636
|
+
title: item.title,
|
|
637
|
+
status: item.status
|
|
638
|
+
})),
|
|
639
|
+
...missingIds.map((id) => ({
|
|
640
|
+
id,
|
|
641
|
+
title: `[missing] ${id}`,
|
|
642
|
+
status: "missing"
|
|
643
|
+
}))
|
|
644
|
+
],
|
|
645
|
+
missingIdSet: new Set(missingIds.map((id) => id.toLowerCase())),
|
|
646
|
+
dangling
|
|
1079
647
|
};
|
|
1080
648
|
}
|
|
1081
649
|
|
|
@@ -1085,13 +653,10 @@ export {
|
|
|
1085
653
|
isOrderingRelationshipKind,
|
|
1086
654
|
RelationshipGraph,
|
|
1087
655
|
dependencyToRelationship,
|
|
1088
|
-
buildRelationshipContext,
|
|
1089
|
-
DEPS_FORMAT_VALUES,
|
|
1090
|
-
DEPS_COLLAPSE_VALUES,
|
|
1091
656
|
collectDanglingDependencyReferences,
|
|
1092
|
-
|
|
1093
|
-
|
|
657
|
+
collectMissingDependencyTargetIds,
|
|
658
|
+
assembleWorkspaceRelationshipGraph
|
|
1094
659
|
};
|
|
1095
|
-
//# sourceMappingURL=chunk-
|
|
660
|
+
//# sourceMappingURL=chunk-L5BTTDU5.js.map
|
|
1096
661
|
|
|
1097
|
-
//# debugId=
|
|
662
|
+
//# debugId=8145f80d-99b5-53e4-a519-54b4549dca6c
|