@schnick371/devsteps-shared 1.0.0 → 1.1.0-next.1

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.
Files changed (142) hide show
  1. package/README.md +8 -3
  2. package/dist/constants/index.d.ts +26 -0
  3. package/dist/constants/index.d.ts.map +1 -1
  4. package/dist/constants/index.js +26 -0
  5. package/dist/constants/index.js.map +1 -1
  6. package/dist/core/add.d.ts +7 -0
  7. package/dist/core/add.d.ts.map +1 -1
  8. package/dist/core/add.js +7 -0
  9. package/dist/core/add.js.map +1 -1
  10. package/dist/core/archive.d.ts +7 -0
  11. package/dist/core/archive.d.ts.map +1 -1
  12. package/dist/core/archive.js +28 -18
  13. package/dist/core/archive.js.map +1 -1
  14. package/dist/core/auto-migrate-detect.d.ts +61 -0
  15. package/dist/core/auto-migrate-detect.d.ts.map +1 -0
  16. package/dist/core/auto-migrate-detect.js +68 -0
  17. package/dist/core/auto-migrate-detect.js.map +1 -0
  18. package/dist/core/auto-migrate-impl.d.ts +32 -0
  19. package/dist/core/auto-migrate-impl.d.ts.map +1 -0
  20. package/dist/core/auto-migrate-impl.js +120 -0
  21. package/dist/core/auto-migrate-impl.js.map +1 -0
  22. package/dist/core/auto-migrate.d.ts +16 -131
  23. package/dist/core/auto-migrate.d.ts.map +1 -1
  24. package/dist/core/auto-migrate.js +24 -326
  25. package/dist/core/auto-migrate.js.map +1 -1
  26. package/dist/core/bulk-update.d.ts +7 -0
  27. package/dist/core/bulk-update.d.ts.map +1 -1
  28. package/dist/core/bulk-update.js +7 -0
  29. package/dist/core/bulk-update.js.map +1 -1
  30. package/dist/core/config.d.ts +7 -0
  31. package/dist/core/config.d.ts.map +1 -1
  32. package/dist/core/config.js +7 -0
  33. package/dist/core/config.js.map +1 -1
  34. package/dist/core/context.d.ts +9 -0
  35. package/dist/core/context.d.ts.map +1 -1
  36. package/dist/core/context.js +9 -0
  37. package/dist/core/context.js.map +1 -1
  38. package/dist/core/get.d.ts +7 -0
  39. package/dist/core/get.d.ts.map +1 -1
  40. package/dist/core/get.js +7 -0
  41. package/dist/core/get.js.map +1 -1
  42. package/dist/core/index-rebuild.d.ts +3 -0
  43. package/dist/core/index-rebuild.d.ts.map +1 -1
  44. package/dist/core/index-rebuild.js +3 -0
  45. package/dist/core/index-rebuild.js.map +1 -1
  46. package/dist/core/index-refs-core.d.ts +114 -0
  47. package/dist/core/index-refs-core.d.ts.map +1 -0
  48. package/dist/core/index-refs-core.js +306 -0
  49. package/dist/core/index-refs-core.js.map +1 -0
  50. package/dist/core/index-refs.d.ts +9 -124
  51. package/dist/core/index-refs.d.ts.map +1 -1
  52. package/dist/core/index-refs.js +19 -345
  53. package/dist/core/index-refs.js.map +1 -1
  54. package/dist/core/index.d.ts +10 -1
  55. package/dist/core/index.d.ts.map +1 -1
  56. package/dist/core/index.js +10 -1
  57. package/dist/core/index.js.map +1 -1
  58. package/dist/core/link.d.ts +33 -0
  59. package/dist/core/link.d.ts.map +1 -0
  60. package/dist/core/link.js +102 -0
  61. package/dist/core/link.js.map +1 -0
  62. package/dist/core/list.d.ts +8 -0
  63. package/dist/core/list.d.ts.map +1 -1
  64. package/dist/core/list.js +70 -1
  65. package/dist/core/list.js.map +1 -1
  66. package/dist/core/unlink.d.ts +26 -0
  67. package/dist/core/unlink.d.ts.map +1 -0
  68. package/dist/core/unlink.js +78 -0
  69. package/dist/core/unlink.js.map +1 -0
  70. package/dist/core/update.d.ts +7 -0
  71. package/dist/core/update.d.ts.map +1 -1
  72. package/dist/core/update.js +9 -1
  73. package/dist/core/update.js.map +1 -1
  74. package/dist/core/validation.d.ts +26 -1
  75. package/dist/core/validation.d.ts.map +1 -1
  76. package/dist/core/validation.js +56 -0
  77. package/dist/core/validation.js.map +1 -1
  78. package/dist/index.d.ts +7 -0
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +7 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/schemas/analysis.d.ts +206 -0
  83. package/dist/schemas/analysis.d.ts.map +1 -0
  84. package/dist/schemas/analysis.js +138 -0
  85. package/dist/schemas/analysis.js.map +1 -0
  86. package/dist/schemas/cbp-loops.d.ts +154 -0
  87. package/dist/schemas/cbp-loops.d.ts.map +1 -0
  88. package/dist/schemas/cbp-loops.js +160 -0
  89. package/dist/schemas/cbp-loops.js.map +1 -0
  90. package/dist/schemas/cbp-loops.test.d.ts +10 -0
  91. package/dist/schemas/cbp-loops.test.d.ts.map +1 -0
  92. package/dist/schemas/cbp-loops.test.js +268 -0
  93. package/dist/schemas/cbp-loops.test.js.map +1 -0
  94. package/dist/schemas/cbp-mandate.d.ts +107 -0
  95. package/dist/schemas/cbp-mandate.d.ts.map +1 -0
  96. package/dist/schemas/cbp-mandate.js +107 -0
  97. package/dist/schemas/cbp-mandate.js.map +1 -0
  98. package/dist/schemas/cbp-mandate.test.d.ts +10 -0
  99. package/dist/schemas/cbp-mandate.test.d.ts.map +1 -0
  100. package/dist/schemas/cbp-mandate.test.js +188 -0
  101. package/dist/schemas/cbp-mandate.test.js.map +1 -0
  102. package/dist/schemas/index-refs.schema.d.ts +3 -0
  103. package/dist/schemas/index-refs.schema.d.ts.map +1 -1
  104. package/dist/schemas/index-refs.schema.js +3 -0
  105. package/dist/schemas/index-refs.schema.js.map +1 -1
  106. package/dist/schemas/index.d.ts +10 -0
  107. package/dist/schemas/index.d.ts.map +1 -1
  108. package/dist/schemas/index.js +13 -0
  109. package/dist/schemas/index.js.map +1 -1
  110. package/dist/schemas/project.d.ts +7 -0
  111. package/dist/schemas/project.d.ts.map +1 -1
  112. package/dist/schemas/project.js +7 -0
  113. package/dist/schemas/project.js.map +1 -1
  114. package/dist/schemas/relationships.d.ts +3 -0
  115. package/dist/schemas/relationships.d.ts.map +1 -1
  116. package/dist/schemas/relationships.js +3 -0
  117. package/dist/schemas/relationships.js.map +1 -1
  118. package/dist/types/commands.d.ts +7 -0
  119. package/dist/types/commands.d.ts.map +1 -1
  120. package/dist/types/commands.js +7 -0
  121. package/dist/types/commands.js.map +1 -1
  122. package/dist/types/index-refs.types.d.ts +3 -0
  123. package/dist/types/index-refs.types.d.ts.map +1 -1
  124. package/dist/types/index-refs.types.js +3 -0
  125. package/dist/types/index-refs.types.js.map +1 -1
  126. package/dist/types/index.d.ts +8 -0
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/types/index.js +7 -0
  129. package/dist/types/index.js.map +1 -1
  130. package/dist/utils/cache.d.ts +7 -0
  131. package/dist/utils/cache.d.ts.map +1 -1
  132. package/dist/utils/cache.js +7 -0
  133. package/dist/utils/cache.js.map +1 -1
  134. package/dist/utils/index.d.ts +8 -0
  135. package/dist/utils/index.d.ts.map +1 -1
  136. package/dist/utils/index.js +9 -0
  137. package/dist/utils/index.js.map +1 -1
  138. package/dist/utils/init-helpers.d.ts +30 -0
  139. package/dist/utils/init-helpers.d.ts.map +1 -0
  140. package/dist/utils/init-helpers.js +134 -0
  141. package/dist/utils/init-helpers.js.map +1 -0
  142. package/package.json +1 -1
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core module barrel export
6
+ * Re-exports all public operations from the shared core layer.
7
+ */
1
8
  export { type AddItemArgs, type AddItemResult, addItem } from './add.js';
2
9
  export { type ArchiveItemResult, archiveItem, type PurgeItemsArgs, type PurgeItemsResult, purgeItems, } from './archive.js';
3
10
  export { type AutoMigrationOptions, checkMigrationNeeded, ensureFullMigration, ensureIndexMigrated, getMigrationStatusMessage, type MigrationCheckResult, type MigrationStats, migrateItemsDirectory, needsItemsDirectoryMigration, performMigration, } from './auto-migrate.js';
@@ -8,6 +15,8 @@ export { type GetItemResult, getItem } from './get.js';
8
15
  export { type RebuildOptions, type RebuildResult, rebuildIndex, } from './index-rebuild.js';
9
16
  export * from './index-refs.js';
10
17
  export { type ListItemsArgs, type ListItemsResult, listItems } from './list.js';
18
+ export { type LinkItemArgs, type LinkItemResult, linkItem } from './link.js';
19
+ export { type UnlinkItemArgs, type UnlinkItemResult, unlinkItem, } from './unlink.js';
11
20
  export { type UpdateItemArgs, type UpdateItemResult, updateItem } from './update.js';
12
- export { type ValidationResult, validateRelationship, type WorkItem } from './validation.js';
21
+ export { type ValidationResult, validateRelationConflict, validateRelationship, type WorkItem, } from './validation.js';
13
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EACL,KAAK,iBAAiB,EACtB,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,gBAAgB,EACrB,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,KAAK,gBAAgB,EAAE,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EACL,KAAK,iBAAiB,EACtB,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,gBAAgB,EACrB,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EACL,KAAK,gBAAgB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,QAAQ,GACd,MAAM,iBAAiB,CAAC"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core module barrel export
6
+ * Re-exports all public operations from the shared core layer.
7
+ */
1
8
  export { addItem } from './add.js';
2
9
  export { archiveItem, purgeItems, } from './archive.js';
3
10
  // Auto-migration for external projects
@@ -11,6 +18,8 @@ export { rebuildIndex, } from './index-rebuild.js';
11
18
  // Refs-style index operations
12
19
  export * from './index-refs.js';
13
20
  export { listItems } from './list.js';
21
+ export { linkItem } from './link.js';
22
+ export { unlinkItem, } from './unlink.js';
14
23
  export { updateItem } from './update.js';
15
- export { validateRelationship } from './validation.js';
24
+ export { validateRelationConflict, validateRelationship, } from './validation.js';
16
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,OAAO,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAEL,WAAW,EAGX,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,uCAAuC;AACvC,OAAO,EAEL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EAGzB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAsB,OAAO,EAAE,MAAM,UAAU,CAAC;AACvD,2BAA2B;AAC3B,OAAO,EAGL,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,8BAA8B;AAC9B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAA4C,SAAS,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAA8C,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAyB,oBAAoB,EAAiB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAwC,OAAO,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAEL,WAAW,EAGX,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,uCAAuC;AACvC,OAAO,EAEL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EAGzB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAsB,OAAO,EAAE,MAAM,UAAU,CAAC;AACvD,2BAA2B;AAC3B,OAAO,EAGL,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,8BAA8B;AAC9B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAA4C,SAAS,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAA0C,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAGL,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAA8C,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAEL,wBAAwB,EACxB,oBAAoB,GAErB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core link creation — extracted from MCP link handler
6
+ * Implements TASK-216 (createLink in shared) and TASK-219 (link.ts refactor)
7
+ */
8
+ import type { RelationType } from '../schemas/index.js';
9
+ export interface LinkItemArgs {
10
+ sourceId: string;
11
+ relationType: RelationType;
12
+ targetId: string;
13
+ }
14
+ export interface LinkItemResult {
15
+ success: boolean;
16
+ message?: string;
17
+ error?: string;
18
+ suggestion?: string;
19
+ validation_failed?: boolean;
20
+ sourceId?: string;
21
+ targetId?: string;
22
+ relation?: RelationType;
23
+ source_type?: string;
24
+ target_type?: string;
25
+ methodology?: string;
26
+ }
27
+ /**
28
+ * Create a bi-directional relationship between two items.
29
+ * Validates methodology rules and conflict constraints before writing.
30
+ * Idempotent: adding an already-existing link returns success without re-writing.
31
+ */
32
+ export declare function linkItem(devstepsDir: string, args: LinkItemArgs): Promise<LinkItemResult>;
33
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/core/link.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAiBD;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CA2FzB"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core link creation — extracted from MCP link handler
6
+ * Implements TASK-216 (createLink in shared) and TASK-219 (link.ts refactor)
7
+ */
8
+ import { existsSync, writeFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { getCurrentTimestamp, parseItemId, TYPE_TO_DIRECTORY, } from '../utils/index.js';
11
+ import { getConfig } from './config.js';
12
+ import { getItem } from './get.js';
13
+ import { validateRelationConflict, validateRelationship } from './validation.js';
14
+ /** Bi-directional inverse relation map. */
15
+ const INVERSE_RELATIONS = {
16
+ implements: 'implemented-by',
17
+ 'implemented-by': 'implements',
18
+ 'tested-by': 'tests',
19
+ tests: 'tested-by',
20
+ blocks: 'blocked-by',
21
+ 'blocked-by': 'blocks',
22
+ 'depends-on': 'required-by',
23
+ 'required-by': 'depends-on',
24
+ 'relates-to': 'relates-to',
25
+ supersedes: 'superseded-by',
26
+ 'superseded-by': 'supersedes',
27
+ };
28
+ /**
29
+ * Create a bi-directional relationship between two items.
30
+ * Validates methodology rules and conflict constraints before writing.
31
+ * Idempotent: adding an already-existing link returns success without re-writing.
32
+ */
33
+ export async function linkItem(devstepsDir, args) {
34
+ const { sourceId, relationType, targetId } = args;
35
+ const sourceParsed = parseItemId(sourceId);
36
+ const targetParsed = parseItemId(targetId);
37
+ if (!sourceParsed)
38
+ throw new Error(`Invalid source item ID: ${sourceId}`);
39
+ if (!targetParsed)
40
+ throw new Error(`Invalid target item ID: ${targetId}`);
41
+ const sourceFolder = TYPE_TO_DIRECTORY[sourceParsed.type];
42
+ const targetFolder = TYPE_TO_DIRECTORY[targetParsed.type];
43
+ const sourcePath = join(devstepsDir, sourceFolder, `${sourceId}.json`);
44
+ const targetPath = join(devstepsDir, targetFolder, `${targetId}.json`);
45
+ if (!existsSync(sourcePath))
46
+ throw new Error(`Source item not found: ${sourceId}`);
47
+ if (!existsSync(targetPath))
48
+ throw new Error(`Target item not found: ${targetId}`);
49
+ const { metadata: sourceMeta } = await getItem(devstepsDir, sourceId);
50
+ const { metadata: targetMeta } = await getItem(devstepsDir, targetId);
51
+ const config = await getConfig(devstepsDir);
52
+ const methodology = (config.settings?.methodology ?? 'hybrid');
53
+ // Validate methodology hierarchy rules
54
+ const validation = validateRelationship({ id: sourceMeta.id, type: sourceMeta.type }, { id: targetMeta.id, type: targetMeta.type }, relationType, methodology);
55
+ if (!validation.valid) {
56
+ return {
57
+ success: false,
58
+ error: validation.error,
59
+ suggestion: validation.suggestion,
60
+ validation_failed: true,
61
+ source_type: sourceMeta.type,
62
+ target_type: targetMeta.type,
63
+ relation: relationType,
64
+ methodology,
65
+ };
66
+ }
67
+ // Validate no conflicting relations to the same target
68
+ const conflictCheck = validateRelationConflict(targetId, relationType, sourceMeta.linked_items);
69
+ if (!conflictCheck.valid) {
70
+ return {
71
+ success: false,
72
+ error: conflictCheck.error,
73
+ suggestion: conflictCheck.suggestion,
74
+ validation_failed: true,
75
+ };
76
+ }
77
+ // Write forward relation (idempotent)
78
+ const forwardArray = sourceMeta.linked_items[relationType];
79
+ if (!forwardArray.includes(targetId)) {
80
+ forwardArray.push(targetId);
81
+ sourceMeta.updated = getCurrentTimestamp();
82
+ writeFileSync(sourcePath, JSON.stringify(sourceMeta, null, 2));
83
+ }
84
+ // Write inverse relation (idempotent)
85
+ const inverseRelation = INVERSE_RELATIONS[relationType];
86
+ if (inverseRelation) {
87
+ const inverseArray = targetMeta.linked_items[inverseRelation];
88
+ if (!inverseArray.includes(sourceId)) {
89
+ inverseArray.push(sourceId);
90
+ targetMeta.updated = getCurrentTimestamp();
91
+ writeFileSync(targetPath, JSON.stringify(targetMeta, null, 2));
92
+ }
93
+ }
94
+ return {
95
+ success: true,
96
+ message: `Linked ${sourceId} --${relationType}--> ${targetId}`,
97
+ sourceId,
98
+ targetId,
99
+ relation: relationType,
100
+ };
101
+ }
102
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/core/link.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core list-items operation
6
+ * Queries work items with filtering by type, status, priority, and tag.
7
+ */
1
8
  import type { DevStepsIndex, EisenhowerQuadrant, ItemStatus, ItemType } from '../schemas/index.js';
2
9
  export interface ListItemsArgs {
3
10
  type?: ItemType;
@@ -6,6 +13,7 @@ export interface ListItemsArgs {
6
13
  assignee?: string;
7
14
  tags?: string[];
8
15
  limit?: number;
16
+ archived?: boolean;
9
17
  }
10
18
  export interface ListItemsResult {
11
19
  count: number;
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/core/list.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAWnG,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,eAAe,CAAC,CA8H1B"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/core/list.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAElB,UAAU,EACV,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAW7B,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B;AAgED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,eAAe,CAAC,CAmI1B"}
package/dist/core/list.js CHANGED
@@ -1,8 +1,73 @@
1
- import { existsSync } from 'node:fs';
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core list-items operation
6
+ * Queries work items with filtering by type, status, priority, and tag.
7
+ */
8
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
9
  import { join } from 'node:path';
3
10
  import { TYPE_TO_DIRECTORY } from '../utils/index.js';
4
11
  import { getItem } from './get.js';
5
12
  import { hasRefsStyleIndex, loadIndexByPriority, loadIndexByStatus, loadIndexByType, loadLegacyIndex, } from './index-refs.js';
13
+ /**
14
+ * List items from the archive directory
15
+ */
16
+ async function listArchivedItems(devstepsDir, args) {
17
+ const allTypes = [
18
+ 'epic',
19
+ 'story',
20
+ 'task',
21
+ 'bug',
22
+ 'spike',
23
+ 'test',
24
+ 'feature',
25
+ 'requirement',
26
+ ];
27
+ const typesToScan = args.type ? [args.type] : allTypes;
28
+ const results = [];
29
+ for (const type of typesToScan) {
30
+ const archiveDir = join(devstepsDir, 'archive', TYPE_TO_DIRECTORY[type]);
31
+ if (!existsSync(archiveDir))
32
+ continue;
33
+ let files;
34
+ try {
35
+ files = readdirSync(archiveDir).filter((f) => f.endsWith('.json'));
36
+ }
37
+ catch {
38
+ continue;
39
+ }
40
+ for (const file of files) {
41
+ try {
42
+ const raw = readFileSync(join(archiveDir, file), 'utf-8');
43
+ const metadata = JSON.parse(raw);
44
+ if (args.status && metadata.status !== args.status)
45
+ continue;
46
+ if (args.eisenhower && metadata.eisenhower !== args.eisenhower)
47
+ continue;
48
+ if (args.assignee && metadata.assignee !== args.assignee)
49
+ continue;
50
+ if (args.tags && args.tags.length > 0) {
51
+ if (!args.tags.every((tag) => (metadata.tags ?? []).includes(tag)))
52
+ continue;
53
+ }
54
+ results.push({
55
+ id: metadata.id,
56
+ type: metadata.type,
57
+ title: metadata.title,
58
+ status: metadata.status,
59
+ eisenhower: metadata.eisenhower,
60
+ updated: metadata.updated,
61
+ });
62
+ }
63
+ catch {
64
+ // Skip corrupt files
65
+ }
66
+ }
67
+ }
68
+ const limited = args.limit && args.limit > 0 ? results.slice(0, args.limit) : results;
69
+ return { count: limited.length, items: limited };
70
+ }
6
71
  /**
7
72
  * Core business logic for listing items with filters
8
73
  */
@@ -10,6 +75,10 @@ export async function listItems(devstepsDir, args = {}) {
10
75
  if (!existsSync(devstepsDir)) {
11
76
  throw new Error('Project not initialized. Run devsteps-init first.');
12
77
  }
78
+ // Handle archived items separately
79
+ if (args.archived) {
80
+ return listArchivedItems(devstepsDir, args);
81
+ }
13
82
  // Try new refs-style index first, fall back to legacy
14
83
  let allIndexItems = [];
15
84
  if (hasRefsStyleIndex(devstepsDir)) {
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/core/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAgBzB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,WAAmB,EACnB,OAAsB,EAAE;IAExB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,sDAAsD;IACtD,IAAI,aAAa,GAAa,EAAE,CAAC;IAEjC,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,8CAA8C;QAC9C,mEAAmE;QACnE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,yCAAyC;YACzC,aAAa,GAAG,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,aAAa,GAAG,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3B,aAAa,GAAG,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,wCAAwC;YACxC,MAAM,QAAQ,GAAe;gBAC3B,MAAM;gBACN,OAAO;gBACP,MAAM;gBACN,KAAK;gBACL,OAAO;gBACP,MAAM;gBACN,SAAS;gBACT,aAAa;aACd,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACrD,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,oBAAoB;QACpB,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QACjD,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,0DAA0D;IAC1D,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAClD,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;YAC1B,IAAI,EAAE,MAAe;YACrB,KAAK,EAAE,OAAgB;YACvB,IAAI,EAAE,MAAe;YACrB,GAAG,EAAE,KAAc;YACnB,KAAK,EAAE,OAAgB;YACvB,IAAI,EAAE,MAAe;YACrB,IAAI,EAAE,SAAkB;YACxB,GAAG,EAAE,aAAsB;SAC5B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAElD,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACpD,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAClD,CAAC,IAAI,EAAoC,EAAE,CAAC,IAAI,KAAK,IAAI,CAC1D,CAAC;IAEF,wDAAwD;IACxD,0DAA0D;IAC1D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,kBAAkB;IAClB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;QAC7B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,wDAAwD;IACxD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC;IAED,cAAc;IACd,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/core/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core unlink operation
6
+ * Removes a relationship between two work items and updates both sides.
7
+ */
8
+ import type { RelationType } from '../schemas/index.js';
9
+ export interface UnlinkItemArgs {
10
+ sourceId: string;
11
+ relationType: RelationType;
12
+ targetId: string;
13
+ }
14
+ export interface UnlinkItemResult {
15
+ success: boolean;
16
+ message: string;
17
+ sourceId: string;
18
+ targetId: string;
19
+ relation: RelationType;
20
+ }
21
+ /**
22
+ * Remove a relationship between two items bi-directionally.
23
+ * Idempotent: calling when the relation already does not exist returns success.
24
+ */
25
+ export declare function unlinkItem(devstepsDir: string, args: UnlinkItemArgs): Promise<UnlinkItemResult>;
26
+ //# sourceMappingURL=unlink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlink.d.ts","sourceRoot":"","sources":["../../src/core/unlink.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIrE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAiBD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAsD3B"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core unlink operation
6
+ * Removes a relationship between two work items and updates both sides.
7
+ */
8
+ import { writeFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { getCurrentTimestamp, parseItemId, TYPE_TO_DIRECTORY } from '../utils/index.js';
11
+ import { getItem } from './get.js';
12
+ /** Bi-directional inverse relation map. */
13
+ const INVERSE_RELATIONS = {
14
+ implements: 'implemented-by',
15
+ 'implemented-by': 'implements',
16
+ 'tested-by': 'tests',
17
+ tests: 'tested-by',
18
+ blocks: 'blocked-by',
19
+ 'blocked-by': 'blocks',
20
+ 'depends-on': 'required-by',
21
+ 'required-by': 'depends-on',
22
+ 'relates-to': 'relates-to',
23
+ supersedes: 'superseded-by',
24
+ 'superseded-by': 'supersedes',
25
+ };
26
+ /**
27
+ * Remove a relationship between two items bi-directionally.
28
+ * Idempotent: calling when the relation already does not exist returns success.
29
+ */
30
+ export async function unlinkItem(devstepsDir, args) {
31
+ const { sourceId, relationType, targetId } = args;
32
+ const sourceParsed = parseItemId(sourceId);
33
+ const targetParsed = parseItemId(targetId);
34
+ if (!sourceParsed)
35
+ throw new Error(`Invalid source item ID: ${sourceId}`);
36
+ if (!targetParsed)
37
+ throw new Error(`Invalid target item ID: ${targetId}`);
38
+ const sourceFolder = TYPE_TO_DIRECTORY[sourceParsed.type];
39
+ const targetFolder = TYPE_TO_DIRECTORY[targetParsed.type];
40
+ const sourcePath = join(devstepsDir, sourceFolder, `${sourceId}.json`);
41
+ const targetPath = join(devstepsDir, targetFolder, `${targetId}.json`);
42
+ // Load both items (getItem throws on not-found)
43
+ const { metadata: sourceMeta } = await getItem(devstepsDir, sourceId);
44
+ const { metadata: targetMeta } = await getItem(devstepsDir, targetId);
45
+ let changed = false;
46
+ // Remove targetId from source's relation array
47
+ const sourceLinks = sourceMeta.linked_items;
48
+ const sourceArray = sourceLinks[relationType];
49
+ const sourceIdx = sourceArray.indexOf(targetId);
50
+ if (sourceIdx !== -1) {
51
+ sourceArray.splice(sourceIdx, 1);
52
+ sourceMeta.updated = getCurrentTimestamp();
53
+ writeFileSync(sourcePath, JSON.stringify(sourceMeta, null, 2));
54
+ changed = true;
55
+ }
56
+ // Remove sourceId from target's inverse relation array
57
+ const inverseRelation = INVERSE_RELATIONS[relationType];
58
+ const targetLinks = targetMeta.linked_items;
59
+ const targetArray = targetLinks[inverseRelation];
60
+ const targetIdx = targetArray.indexOf(sourceId);
61
+ if (targetIdx !== -1) {
62
+ targetArray.splice(targetIdx, 1);
63
+ targetMeta.updated = getCurrentTimestamp();
64
+ writeFileSync(targetPath, JSON.stringify(targetMeta, null, 2));
65
+ changed = true;
66
+ }
67
+ const message = changed
68
+ ? `Unlinked ${sourceId} -/${relationType}/-> ${targetId}`
69
+ : `Relation ${sourceId} --${relationType}--> ${targetId} was not present (no-op)`;
70
+ return {
71
+ success: true,
72
+ message,
73
+ sourceId,
74
+ targetId,
75
+ relation: relationType,
76
+ };
77
+ }
78
+ //# sourceMappingURL=unlink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlink.js","sourceRoot":"","sources":["../../src/core/unlink.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core update-item operation
6
+ * Patches item metadata fields and synchronizes the distributed index.
7
+ */
1
8
  import type { EisenhowerQuadrant, ItemMetadata, ItemStatus } from '../schemas/index.js';
2
9
  export interface UpdateItemArgs {
3
10
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKxF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAgH3B"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKxF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAiH3B"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Core update-item operation
6
+ * Patches item metadata fields and synchronizes the distributed index.
7
+ */
1
8
  import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
9
  import { join } from 'node:path';
3
10
  import { RELATIONSHIP_TYPE, STATUS } from '../constants/index.js';
@@ -28,7 +35,8 @@ export async function updateItem(devstepsDir, args) {
28
35
  if (args.status === STATUS.DONE) {
29
36
  // Helper function to validate children are complete
30
37
  const validateChildren = async (relationshipType) => {
31
- const children = metadata.linked_items[relationshipType];
38
+ // Guard: old-format items may lack linked_items or specific relation keys
39
+ const children = metadata.linked_items?.[relationshipType] ?? [];
32
40
  if (children.length > 0) {
33
41
  const openChildren = [];
34
42
  for (const childId of children) {
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAoBpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,IAAoB;IAEpB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAEvE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,2BAA2B;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;IAElC,mDAAmD;IACnD,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAChC,oDAAoD;QACpD,MAAM,gBAAgB,GAAG,KAAK,EAC5B,gBAA8F,EAC/E,EAAE;YACjB,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;YACzD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,YAAY,GAAa,EAAE,CAAC;gBAClC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;oBACzC,IAAI,WAAW,EAAE,CAAC;wBAChB,IAAI,CAAC;4BACH,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;4BACpE,IACE,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI;gCAChC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,SAAS;gCACrC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,EACpC,CAAC;gCACD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;4BAC7B,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,yBAAyB;wBAC3B,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,aAAa,GACjB,gBAAgB,KAAK,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;oBACpF,MAAM,IAAI,KAAK,CACb,gBAAgB,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,MAAM,IAAI,aAAa,wBAAwB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,iJAAiJ;QACjJ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/E,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC;QAED,0EAA0E;QAC1E,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM;QAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/C,IAAI,IAAI,CAAC,UAAU;QAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3D,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;QAAE,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IAClF,IAAI,IAAI,CAAC,KAAK;QAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC5C,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACnE,IAAI,IAAI,CAAC,IAAI;QAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACzC,IAAI,IAAI,CAAC,cAAc;QAAE,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAEvE,QAAQ,CAAC,OAAO,GAAG,mBAAmB,EAAE,CAAC;IAEzC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/D,qBAAqB;IACrB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,6BAA6B;QAC7B,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;SAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACnC,sDAAsD;QACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,aAAa,CAAC,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACrE,CAAC;IAED,oEAAoE;IACpE,qEAAqE;IACrE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,iBAAiB,CACf,WAAW,EACX,IAAI,CAAC,EAAE,EACP,SAAS,EACT,IAAI,CAAC,MAAM,EACX,SAAS,EAAE,yCAAyC;QACpD,IAAI,CAAC,UAAU,CAChB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAoBpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,IAAoB;IAEpB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAEvE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,2BAA2B;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;IAElC,mDAAmD;IACnD,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAChC,oDAAoD;QACpD,MAAM,gBAAgB,GAAG,KAAK,EAC5B,gBAA8F,EAC/E,EAAE;YACjB,0EAA0E;YAC1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;YACjE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,YAAY,GAAa,EAAE,CAAC;gBAClC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;oBACzC,IAAI,WAAW,EAAE,CAAC;wBAChB,IAAI,CAAC;4BACH,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;4BACpE,IACE,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI;gCAChC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,SAAS;gCACrC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,EACpC,CAAC;gCACD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;4BAC7B,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,yBAAyB;wBAC3B,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,aAAa,GACjB,gBAAgB,KAAK,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;oBACpF,MAAM,IAAI,KAAK,CACb,gBAAgB,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,MAAM,IAAI,aAAa,wBAAwB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,iJAAiJ;QACjJ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/E,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC;QAED,0EAA0E;QAC1E,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM;QAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/C,IAAI,IAAI,CAAC,UAAU;QAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3D,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;QAAE,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IAClF,IAAI,IAAI,CAAC,KAAK;QAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC5C,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACnE,IAAI,IAAI,CAAC,IAAI;QAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACzC,IAAI,IAAI,CAAC,cAAc;QAAE,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAEvE,QAAQ,CAAC,OAAO,GAAG,mBAAmB,EAAE,CAAC;IAEzC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/D,qBAAqB;IACrB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,6BAA6B;QAC7B,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;SAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACnC,sDAAsD;QACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,aAAa,CAAC,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACrE,CAAC;IAED,oEAAoE;IACpE,qEAAqE;IACrE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,iBAAiB,CACf,WAAW,EACX,IAAI,CAAC,EAAE,EACP,SAAS,EACT,IAAI,CAAC,MAAM,EACX,SAAS,EAAE,yCAAyC;QACpD,IAAI,CAAC,UAAU,CAChB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -1,4 +1,12 @@
1
- import type { ItemType, Methodology } from '../schemas/index.js';
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Relationship validation
6
+ * Enforces hierarchy rules and flexible relationship constraints
7
+ * based on the active project methodology.
8
+ */
9
+ import type { ItemType, LinkedItems, Methodology } from '../schemas/index.js';
2
10
  /**
3
11
  * Validation result with detailed error messaging
4
12
  */
@@ -25,4 +33,21 @@ export interface WorkItem {
25
33
  * @returns ValidationResult with valid flag and optional error/suggestion
26
34
  */
27
35
  export declare function validateRelationship(source: WorkItem, target: WorkItem, relationType: string, methodology: Methodology): ValidationResult;
36
+ /**
37
+ * Validate that no conflicting relation types exist between the same source and target.
38
+ *
39
+ * Blocks:
40
+ * - hierarchy + any other type to same target
41
+ * - multiple hierarchy types to same target
42
+ *
43
+ * Allows:
44
+ * - bidirectional symmetric flexible relations (e.g. relates-to)
45
+ * - multiple flexible types to same target (e.g. depends-on + relates-to)
46
+ *
47
+ * @param targetId - The target item ID being linked
48
+ * @param newRelationType - The new relation type being added
49
+ * @param existingLinks - Current linked_items of the source item
50
+ * @returns ValidationResult indicating conflict or success
51
+ */
52
+ export declare function validateRelationConflict(targetId: string, newRelationType: string, existingLinks: LinkedItems): ValidationResult;
28
53
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGjE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,QAAQ,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,WAAW,GACvB,gBAAgB,CA2DlB"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG9E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,QAAQ,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,WAAW,GACvB,gBAAgB,CA2DlB;AAmLD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,WAAW,GACzB,gBAAgB,CAoClB"}
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Relationship validation
6
+ * Enforces hierarchy rules and flexible relationship constraints
7
+ * based on the active project methodology.
8
+ */
1
9
  import { ITEM_TYPE, METHODOLOGY, RELATIONSHIP_TYPE } from '../constants/index.js';
2
10
  import { isFlexibleRelation, isHierarchyRelation } from '../schemas/relationships.js';
3
11
  /**
@@ -217,4 +225,52 @@ function validateWaterfallHierarchy(source, target) {
217
225
  suggestion: 'Check Waterfall hierarchy: Requirement → Feature|Spike → Task',
218
226
  };
219
227
  }
228
+ /**
229
+ * Validate that no conflicting relation types exist between the same source and target.
230
+ *
231
+ * Blocks:
232
+ * - hierarchy + any other type to same target
233
+ * - multiple hierarchy types to same target
234
+ *
235
+ * Allows:
236
+ * - bidirectional symmetric flexible relations (e.g. relates-to)
237
+ * - multiple flexible types to same target (e.g. depends-on + relates-to)
238
+ *
239
+ * @param targetId - The target item ID being linked
240
+ * @param newRelationType - The new relation type being added
241
+ * @param existingLinks - Current linked_items of the source item
242
+ * @returns ValidationResult indicating conflict or success
243
+ */
244
+ export function validateRelationConflict(targetId, newRelationType, existingLinks) {
245
+ const newIsHierarchy = isHierarchyRelation(newRelationType);
246
+ for (const [existingType, targetIds] of Object.entries(existingLinks)) {
247
+ // Skip same type — duplicate check is handled separately
248
+ if (existingType === newRelationType)
249
+ continue;
250
+ // Skip if target not in this relation list
251
+ if (!Array.isArray(targetIds) || !targetIds.includes(targetId))
252
+ continue;
253
+ const existingIsHierarchy = isHierarchyRelation(existingType);
254
+ // Block: both hierarchy types to same target
255
+ if (newIsHierarchy && existingIsHierarchy) {
256
+ return {
257
+ valid: false,
258
+ error: `Cannot add "${newRelationType}" to ${targetId} — already has hierarchy relation "${existingType}" to same target`,
259
+ suggestion: `Remove the existing "${existingType}" link first, or use a different target`,
260
+ };
261
+ }
262
+ // Block: hierarchy mixed with any flexible type to same target
263
+ if (newIsHierarchy || existingIsHierarchy) {
264
+ const hierarchyType = newIsHierarchy ? newRelationType : existingType;
265
+ const flexibleType = newIsHierarchy ? existingType : newRelationType;
266
+ return {
267
+ valid: false,
268
+ error: `Cannot mix hierarchy relation "${hierarchyType}" with flexible relation "${flexibleType}" to same target ${targetId}`,
269
+ suggestion: `Use only "${hierarchyType}" (hierarchy takes precedence) and remove "${flexibleType}", or use a different target`,
270
+ };
271
+ }
272
+ // Multiple flexible types to same target: allowed
273
+ }
274
+ return { valid: true };
275
+ }
220
276
  //# sourceMappingURL=validation.js.map