@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.
@@ -249,7 +249,12 @@ function loadValidationContext(cwd, options = {}) {
249
249
  visionStateRaw,
250
250
  foldersByCode,
251
251
  citationRows,
252
- externalPrefixes: options.externalPrefixes || [],
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
- // Severity model for missing folder:
471
- // IN_PROGRESS → error (active work without a tracking artifact)
472
- // PARTIAL / BLOCKED → warning (sub-tickets may live elsewhere; partial progress)
473
- // PLANNED → warning (un-started work)
474
- // COMPLETE / SUPERSEDED / KILLED / PARKED / unknown warning (historical baseline)
475
- if (rStatus === 'IN_PROGRESS') {
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.15-beta",
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",