@smartmemory/compose 0.2.15-beta → 0.2.16-beta
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/lib/feature-validator.js +20 -7
- package/package.json +2 -2
package/lib/feature-validator.js
CHANGED
|
@@ -249,7 +249,12 @@ function loadValidationContext(cwd, options = {}) {
|
|
|
249
249
|
visionStateRaw,
|
|
250
250
|
foldersByCode,
|
|
251
251
|
citationRows,
|
|
252
|
-
|
|
252
|
+
// Fall back to .compose/compose.json `externalPrefixes` when the caller did
|
|
253
|
+
// not pass them — the `compose validate` CLI/pre-push path does not, so without
|
|
254
|
+
// this fallback every externally-owned row (e.g. STRAT-*) trips folder-linkage.
|
|
255
|
+
externalPrefixes: (options.externalPrefixes && options.externalPrefixes.length)
|
|
256
|
+
? options.externalPrefixes
|
|
257
|
+
: loadExternalPrefixes(cwd),
|
|
253
258
|
featureJsonMode: options.featureJsonMode !== false,
|
|
254
259
|
// Narrative-owned (#39): ROADMAP.md is hand-authored, so a parsed roadmap row
|
|
255
260
|
// is NOT a canonical data source. Computed once here and consulted by checks
|
|
@@ -467,12 +472,20 @@ function runFolderRoadmapLinkageChecks(fctx, ctx, findings) {
|
|
|
467
472
|
const rStatus = normalizeStatus(roadmap?.status);
|
|
468
473
|
|
|
469
474
|
if (roadmap && !folder) {
|
|
470
|
-
//
|
|
471
|
-
//
|
|
472
|
-
//
|
|
473
|
-
//
|
|
474
|
-
//
|
|
475
|
-
|
|
475
|
+
// Externally-owned rows (code matches an externalPrefix, e.g. STRAT-*) are
|
|
476
|
+
// cross-repo references whose folder lives in the owning project — folder
|
|
477
|
+
// linkage does not apply, so emit nothing. (Asymmetric with the external
|
|
478
|
+
// *folder* case below, which downgrades to info: an external folder present
|
|
479
|
+
// locally is unusual; an external row without a local folder is the norm.)
|
|
480
|
+
const isExternal = ctx.externalPrefixes.some((p) => code.startsWith(p));
|
|
481
|
+
if (isExternal) {
|
|
482
|
+
// no finding — out of scope for folder-linkage validation
|
|
483
|
+
} else if (rStatus === 'IN_PROGRESS') {
|
|
484
|
+
// Severity model for missing folder:
|
|
485
|
+
// IN_PROGRESS → error (active work without a tracking artifact)
|
|
486
|
+
// PARTIAL / BLOCKED → warning (sub-tickets may live elsewhere; partial progress)
|
|
487
|
+
// PLANNED → warning (un-started work)
|
|
488
|
+
// COMPLETE / SUPERSEDED / KILLED / PARKED / unknown → warning (historical baseline)
|
|
476
489
|
findings.push(finding('error', 'ROADMAP_ROW_WITHOUT_FOLDER', code,
|
|
477
490
|
`ROADMAP row status is IN_PROGRESS (active work) but no folder exists`));
|
|
478
491
|
} else {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smartmemory/compose",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.16-beta",
|
|
4
4
|
"description": "Structured AI dev pipeline — goal-to-product orchestration with gates, iteration loops, and feature lifecycle management.",
|
|
5
5
|
"author": "SmartMemory",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"dev:client": "vite",
|
|
20
20
|
"build": "vite build",
|
|
21
21
|
"preview": "vite preview",
|
|
22
|
-
"test": "node --test test/*.test.js test/comp-obs-branch/*.test.js test/integration/*.test.js && npm run test:ui && npm run test:tracker",
|
|
22
|
+
"test": "node --import ./test/suppress-expected-drift.js --test test/*.test.js test/comp-obs-branch/*.test.js test/integration/*.test.js && npm run test:ui && npm run test:tracker",
|
|
23
23
|
"test:ui": "vitest run",
|
|
24
24
|
"test:tracker": "vitest run --config vitest.tracker.config.js",
|
|
25
25
|
"test:integration": "node --test test/integration/*.test.js",
|