@schnick371/devsteps-shared 1.0.0 → 1.1.0-next.2
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/README.md +8 -3
- package/dist/constants/index.d.ts +26 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +26 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/core/add.d.ts +7 -0
- package/dist/core/add.d.ts.map +1 -1
- package/dist/core/add.js +7 -0
- package/dist/core/add.js.map +1 -1
- package/dist/core/archive.d.ts +7 -0
- package/dist/core/archive.d.ts.map +1 -1
- package/dist/core/archive.js +28 -18
- package/dist/core/archive.js.map +1 -1
- package/dist/core/auto-migrate-detect.d.ts +61 -0
- package/dist/core/auto-migrate-detect.d.ts.map +1 -0
- package/dist/core/auto-migrate-detect.js +68 -0
- package/dist/core/auto-migrate-detect.js.map +1 -0
- package/dist/core/auto-migrate-impl.d.ts +32 -0
- package/dist/core/auto-migrate-impl.d.ts.map +1 -0
- package/dist/core/auto-migrate-impl.js +120 -0
- package/dist/core/auto-migrate-impl.js.map +1 -0
- package/dist/core/auto-migrate.d.ts +16 -131
- package/dist/core/auto-migrate.d.ts.map +1 -1
- package/dist/core/auto-migrate.js +24 -326
- package/dist/core/auto-migrate.js.map +1 -1
- package/dist/core/bulk-update.d.ts +7 -0
- package/dist/core/bulk-update.d.ts.map +1 -1
- package/dist/core/bulk-update.js +7 -0
- package/dist/core/bulk-update.js.map +1 -1
- package/dist/core/config.d.ts +7 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +7 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/context.d.ts +9 -0
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +9 -0
- package/dist/core/context.js.map +1 -1
- package/dist/core/get.d.ts +7 -0
- package/dist/core/get.d.ts.map +1 -1
- package/dist/core/get.js +7 -0
- package/dist/core/get.js.map +1 -1
- package/dist/core/index-rebuild.d.ts +3 -0
- package/dist/core/index-rebuild.d.ts.map +1 -1
- package/dist/core/index-rebuild.js +3 -0
- package/dist/core/index-rebuild.js.map +1 -1
- package/dist/core/index-refs-core.d.ts +114 -0
- package/dist/core/index-refs-core.d.ts.map +1 -0
- package/dist/core/index-refs-core.js +306 -0
- package/dist/core/index-refs-core.js.map +1 -0
- package/dist/core/index-refs.d.ts +9 -124
- package/dist/core/index-refs.d.ts.map +1 -1
- package/dist/core/index-refs.js +19 -345
- package/dist/core/index-refs.js.map +1 -1
- package/dist/core/index.d.ts +10 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +10 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/link.d.ts +33 -0
- package/dist/core/link.d.ts.map +1 -0
- package/dist/core/link.js +102 -0
- package/dist/core/link.js.map +1 -0
- package/dist/core/list.d.ts +8 -0
- package/dist/core/list.d.ts.map +1 -1
- package/dist/core/list.js +70 -1
- package/dist/core/list.js.map +1 -1
- package/dist/core/unlink.d.ts +26 -0
- package/dist/core/unlink.d.ts.map +1 -0
- package/dist/core/unlink.js +78 -0
- package/dist/core/unlink.js.map +1 -0
- package/dist/core/update.d.ts +7 -0
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +9 -1
- package/dist/core/update.js.map +1 -1
- package/dist/core/validation.d.ts +26 -1
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +56 -0
- package/dist/core/validation.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/schemas/analysis.d.ts +206 -0
- package/dist/schemas/analysis.d.ts.map +1 -0
- package/dist/schemas/analysis.js +138 -0
- package/dist/schemas/analysis.js.map +1 -0
- package/dist/schemas/cbp-loops.d.ts +154 -0
- package/dist/schemas/cbp-loops.d.ts.map +1 -0
- package/dist/schemas/cbp-loops.js +160 -0
- package/dist/schemas/cbp-loops.js.map +1 -0
- package/dist/schemas/cbp-loops.test.d.ts +10 -0
- package/dist/schemas/cbp-loops.test.d.ts.map +1 -0
- package/dist/schemas/cbp-loops.test.js +268 -0
- package/dist/schemas/cbp-loops.test.js.map +1 -0
- package/dist/schemas/cbp-mandate.d.ts +107 -0
- package/dist/schemas/cbp-mandate.d.ts.map +1 -0
- package/dist/schemas/cbp-mandate.js +107 -0
- package/dist/schemas/cbp-mandate.js.map +1 -0
- package/dist/schemas/cbp-mandate.test.d.ts +10 -0
- package/dist/schemas/cbp-mandate.test.d.ts.map +1 -0
- package/dist/schemas/cbp-mandate.test.js +188 -0
- package/dist/schemas/cbp-mandate.test.js.map +1 -0
- package/dist/schemas/index-refs.schema.d.ts +3 -0
- package/dist/schemas/index-refs.schema.d.ts.map +1 -1
- package/dist/schemas/index-refs.schema.js +3 -0
- package/dist/schemas/index-refs.schema.js.map +1 -1
- package/dist/schemas/index.d.ts +10 -0
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +13 -0
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/project.d.ts +7 -0
- package/dist/schemas/project.d.ts.map +1 -1
- package/dist/schemas/project.js +7 -0
- package/dist/schemas/project.js.map +1 -1
- package/dist/schemas/relationships.d.ts +3 -0
- package/dist/schemas/relationships.d.ts.map +1 -1
- package/dist/schemas/relationships.js +3 -0
- package/dist/schemas/relationships.js.map +1 -1
- package/dist/types/commands.d.ts +7 -0
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/commands.js +7 -0
- package/dist/types/commands.js.map +1 -1
- package/dist/types/index-refs.types.d.ts +3 -0
- package/dist/types/index-refs.types.d.ts.map +1 -1
- package/dist/types/index-refs.types.js +3 -0
- package/dist/types/index-refs.types.js.map +1 -1
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/cache.d.ts +7 -0
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +7 -0
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/init-helpers.d.ts +30 -0
- package/dist/utils/init-helpers.d.ts.map +1 -0
- package/dist/utils/init-helpers.js +134 -0
- package/dist/utils/init-helpers.js.map +1 -0
- package/package.json +1 -1
package/dist/core/index.d.ts
CHANGED
|
@@ -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
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/core/index.js
CHANGED
|
@@ -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
|
package/dist/core/index.js.map
CHANGED
|
@@ -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,
|
|
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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"}
|
package/dist/core/list.d.ts
CHANGED
|
@@ -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;
|
package/dist/core/list.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/core/list.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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)) {
|
package/dist/core/list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/core/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/core/list.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,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;AAiBzB;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,IAAmB;IAEnB,MAAM,QAAQ,GAAe;QAC3B,MAAM;QACN,OAAO;QACP,MAAM;QACN,KAAK;QACL,OAAO;QACP,MAAM;QACN,SAAS;QACT,aAAa;KACd,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEvD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAEtC,IAAI,KAAe,CAAC;QACpB,IAAI,CAAC;YACH,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;gBAEjD,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;oBAAE,SAAS;gBAC7D,IAAI,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;oBAAE,SAAS;gBACzE,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACnE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAAE,SAAS;gBAC/E,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,QAAQ,CAAC,EAAE;oBACf,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACtF,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACnD,CAAC;AAED;;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,mCAAmC;IACnC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC9C,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"}
|
|
@@ -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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAgBnC,2CAA2C;AAC3C,MAAM,iBAAiB,GAAuC;IAC5D,UAAU,EAAE,gBAAgB;IAC5B,gBAAgB,EAAE,YAAY;IAC9B,WAAW,EAAE,OAAO;IACpB,KAAK,EAAE,WAAW;IAClB,MAAM,EAAE,YAAY;IACpB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,aAAa;IAC3B,aAAa,EAAE,YAAY;IAC3B,YAAY,EAAE,YAAY;IAC1B,UAAU,EAAE,eAAe;IAC3B,eAAe,EAAE,YAAY;CAC9B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,IAAoB;IAEpB,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAElD,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;IAE1E,MAAM,YAAY,GAAG,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;IAEvE,gDAAgD;IAChD,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACtE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEtE,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,+CAA+C;IAC/C,MAAM,WAAW,GAAG,UAAU,CAAC,YAA2B,CAAC;IAC3D,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjC,UAAU,CAAC,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAC3C,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,uDAAuD;IACvD,MAAM,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,UAAU,CAAC,YAA2B,CAAC;IAC3D,MAAM,WAAW,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjC,UAAU,CAAC,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAC3C,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO;QACrB,CAAC,CAAC,YAAY,QAAQ,MAAM,YAAY,OAAO,QAAQ,EAAE;QACzD,CAAC,CAAC,YAAY,QAAQ,MAAM,YAAY,OAAO,QAAQ,0BAA0B,CAAC;IAEpF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,QAAQ,EAAE,YAAY;KACvB,CAAC;AACJ,CAAC"}
|
package/dist/core/update.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/core/update.js
CHANGED
|
@@ -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
|
-
|
|
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) {
|
package/dist/core/update.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
|
|
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":"
|
|
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"}
|
package/dist/core/validation.js
CHANGED
|
@@ -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
|