@smartmemory/compose 0.2.49-beta → 0.2.50-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.
Files changed (89) hide show
  1. package/bin/compose.js +30 -18
  2. package/dist/assets/{App-DOerhoDp.js → App-Bxyif1yv.js} +53 -53
  3. package/dist/assets/{arc-B1TqAC_R.js → arc-DeHak63Z.js} +1 -1
  4. package/dist/assets/{architectureDiagram-3BPJPVTR-C4hfxNOw.js → architectureDiagram-3BPJPVTR-C5Nkyl9y.js} +1 -1
  5. package/dist/assets/{blockDiagram-GPEHLZMM-DRqkGncy.js → blockDiagram-GPEHLZMM-BilnUBG2.js} +1 -1
  6. package/dist/assets/{c4Diagram-AAUBKEIU-Dc6swoQo.js → c4Diagram-AAUBKEIU-BsFJmPuS.js} +1 -1
  7. package/dist/assets/channel-ZgbQ1k0u.js +1 -0
  8. package/dist/assets/{chunk-2J33WTMH-6HKDSnOw.js → chunk-2J33WTMH-AEu6HIoY.js} +1 -1
  9. package/dist/assets/{chunk-4BX2VUAB-CdqXgd68.js → chunk-4BX2VUAB-XO4S2_89.js} +1 -1
  10. package/dist/assets/{chunk-55IACEB6-D7VauOmU.js → chunk-55IACEB6-CtFSLInj.js} +1 -1
  11. package/dist/assets/{chunk-727SXJPM-CeKpXDif.js → chunk-727SXJPM-CZeBRpM9.js} +1 -1
  12. package/dist/assets/{chunk-AQP2D5EJ-y2XL-YHV.js → chunk-AQP2D5EJ-_vmxcBc4.js} +1 -1
  13. package/dist/assets/{chunk-FMBD7UC4-C1Z5m8DP.js → chunk-FMBD7UC4-BMGd_Y9a.js} +1 -1
  14. package/dist/assets/{chunk-ND2GUHAM-DmqZMEQe.js → chunk-ND2GUHAM-BlrOECEr.js} +1 -1
  15. package/dist/assets/{chunk-QZHKN3VN-DY9GU2uD.js → chunk-QZHKN3VN-DHhUJ8RK.js} +1 -1
  16. package/dist/assets/classDiagram-4FO5ZUOK-KXxOorUx.js +1 -0
  17. package/dist/assets/classDiagram-v2-Q7XG4LA2-KXxOorUx.js +1 -0
  18. package/dist/assets/{cose-bilkent-S5V4N54A-B34g9xzV.js → cose-bilkent-S5V4N54A-C3M0mZqk.js} +1 -1
  19. package/dist/assets/{dagre-BM42HDAG-klZ_GOcw.js → dagre-BM42HDAG-DJlm4fEk.js} +1 -1
  20. package/dist/assets/{diagram-2AECGRRQ-D0FmM6Wf.js → diagram-2AECGRRQ-BmcONQG5.js} +1 -1
  21. package/dist/assets/{diagram-5GNKFQAL-DYuhby6q.js → diagram-5GNKFQAL-5JbWGIwd.js} +1 -1
  22. package/dist/assets/{diagram-KO2AKTUF-CCtQZgal.js → diagram-KO2AKTUF-DAnIvyI0.js} +1 -1
  23. package/dist/assets/{diagram-LMA3HP47-Cd1OqEln.js → diagram-LMA3HP47-Bmh7tvmI.js} +1 -1
  24. package/dist/assets/{diagram-OG6HWLK6-CiJrhoxo.js → diagram-OG6HWLK6-hnHVMNnk.js} +1 -1
  25. package/dist/assets/{erDiagram-TEJ5UH35-C05_Iqmb.js → erDiagram-TEJ5UH35-AMDitV0b.js} +1 -1
  26. package/dist/assets/{flowDiagram-I6XJVG4X-lXpnb-Ch.js → flowDiagram-I6XJVG4X-C0t2ZGQv.js} +1 -1
  27. package/dist/assets/{ganttDiagram-6RSMTGT7-EPbL_2Hr.js → ganttDiagram-6RSMTGT7-BPlM-BEN.js} +1 -1
  28. package/dist/assets/{gitGraphDiagram-PVQCEYII-COCoF_vW.js → gitGraphDiagram-PVQCEYII-Lv_YTxnb.js} +1 -1
  29. package/dist/assets/index-COq21Zym.js +119 -0
  30. package/dist/assets/{infoDiagram-5YYISTIA-B1sJw6j5.js → infoDiagram-5YYISTIA-Dul1vdUm.js} +1 -1
  31. package/dist/assets/{ishikawaDiagram-YF4QCWOH-CgdsWdgu.js → ishikawaDiagram-YF4QCWOH-CCBwgjFs.js} +1 -1
  32. package/dist/assets/{journeyDiagram-JHISSGLW-CyvHmE3z.js → journeyDiagram-JHISSGLW-zUJN38EU.js} +1 -1
  33. package/dist/assets/{kanban-definition-UN3LZRKU-Bqjdyv0T.js → kanban-definition-UN3LZRKU-BNxWi-8J.js} +1 -1
  34. package/dist/assets/{linear-DecnRXf0.js → linear-CRH9b4g7.js} +1 -1
  35. package/dist/assets/{mindmap-definition-RKZ34NQL-DM1x9vNY.js → mindmap-definition-RKZ34NQL-DolYwq7Y.js} +1 -1
  36. package/dist/assets/{pieDiagram-4H26LBE5-CRtmCvwV.js → pieDiagram-4H26LBE5-oxNfr2TX.js} +1 -1
  37. package/dist/assets/{quadrantDiagram-W4KKPZXB-CsBLWg27.js → quadrantDiagram-W4KKPZXB-BmZCvD-z.js} +1 -1
  38. package/dist/assets/{requirementDiagram-4Y6WPE33-DD-Gg_y5.js → requirementDiagram-4Y6WPE33-DsXZ05jo.js} +1 -1
  39. package/dist/assets/{sankeyDiagram-5OEKKPKP-BPdMN8UU.js → sankeyDiagram-5OEKKPKP-DsnYaawP.js} +1 -1
  40. package/dist/assets/{sequenceDiagram-3UESZ5HK-D4AENdze.js → sequenceDiagram-3UESZ5HK-Dt5mu3g8.js} +1 -1
  41. package/dist/assets/{stateDiagram-AJRCARHV-DDplpCf_.js → stateDiagram-AJRCARHV-BFR5ZINQ.js} +1 -1
  42. package/dist/assets/stateDiagram-v2-BHNVJYJU-BDrQD8fR.js +1 -0
  43. package/dist/assets/{timeline-definition-PNZ67QCA-BPm2AEQj.js → timeline-definition-PNZ67QCA-Bvnhw58e.js} +1 -1
  44. package/dist/assets/{vennDiagram-CIIHVFJN-DQCDWwlj.js → vennDiagram-CIIHVFJN-5WnyjZqf.js} +1 -1
  45. package/dist/assets/{wardley-L42UT6IY-WERqOmJt.js → wardley-L42UT6IY-CTxW4xow.js} +1 -1
  46. package/dist/assets/{wardleyDiagram-YWT4CUSO-5teUSOiI.js → wardleyDiagram-YWT4CUSO-K8Y1EOvb.js} +1 -1
  47. package/dist/assets/{xychartDiagram-2RQKCTM6-Ba05SXXF.js → xychartDiagram-2RQKCTM6-BCShes6B.js} +1 -1
  48. package/dist/index.html +1 -1
  49. package/lib/build-all.js +2 -1
  50. package/lib/build.js +91 -5
  51. package/lib/checkpoint/checkpoint-writer.js +3 -2
  52. package/lib/completion-writer.js +38 -14
  53. package/lib/feature-json.js +14 -3
  54. package/lib/feature-validator.js +22 -9
  55. package/lib/feature-write-guard.js +5 -7
  56. package/lib/feature-writer.js +3 -3
  57. package/lib/followup-writer.js +2 -2
  58. package/lib/get-roadmap.js +2 -2
  59. package/lib/gsd.js +2 -1
  60. package/lib/ideabox.js +3 -2
  61. package/lib/journal-writer.js +3 -3
  62. package/lib/migrate-roadmap.js +2 -3
  63. package/lib/paths-core.js +47 -0
  64. package/lib/project-paths.js +46 -37
  65. package/lib/roadmap-gen.js +3 -4
  66. package/lib/roadmap-graph/collect.js +5 -5
  67. package/lib/roadmap-graph/index.js +2 -2
  68. package/lib/state-migrations.js +3 -3
  69. package/lib/tracker/local-provider.js +2 -2
  70. package/lib/triage.js +7 -5
  71. package/lib/xref-push.js +4 -4
  72. package/lib/xref-sync.js +4 -4
  73. package/package.json +1 -1
  74. package/server/design-routes.js +9 -4
  75. package/server/drift-axes.js +5 -3
  76. package/server/feature-scan.js +8 -2
  77. package/server/file-watcher.js +13 -7
  78. package/server/ideabox-routes.js +12 -11
  79. package/server/project-root.js +7 -4
  80. package/server/session-routes.js +2 -2
  81. package/server/stratum-sync.js +85 -9
  82. package/server/vision-routes.js +17 -2
  83. package/server/vision-server.js +4 -3
  84. package/server/vision-utils.js +23 -4
  85. package/dist/assets/channel-KsY1x-7s.js +0 -1
  86. package/dist/assets/classDiagram-4FO5ZUOK-zDEDoVPk.js +0 -1
  87. package/dist/assets/classDiagram-v2-Q7XG4LA2-zDEDoVPk.js +0 -1
  88. package/dist/assets/index-DlgxA8dX.js +0 -123
  89. package/dist/assets/stateDiagram-v2-BHNVJYJU-J4t9AVzF.js +0 -1
package/bin/compose.js CHANGED
@@ -17,6 +17,7 @@ import { fileURLToPath } from 'url'
17
17
  import { findProjectRoot } from '../server/find-root.js'
18
18
  import { resolveWorkspace, getWorkspaceFlag } from '../lib/resolve-workspace.js'
19
19
  import { resolvePort } from '../lib/resolve-port.js'
20
+ import { resolveRoadmapPath, resolveFeaturesPath, resolveContextPathFromConfig, resolveFeaturesPathFromConfig, resolveRoadmapPathFromConfig } from '../lib/project-paths.js'
20
21
 
21
22
  const __dirname = dirname(fileURLToPath(import.meta.url))
22
23
  const PACKAGE_ROOT = resolve(__dirname, '..')
@@ -412,6 +413,7 @@ async function runInit(flags, cwdOverride) {
412
413
  },
413
414
  paths: {
414
415
  docs: 'docs',
416
+ roadmap: 'ROADMAP.md',
415
417
  features: 'docs/features',
416
418
  journal: 'docs/journal',
417
419
  context: 'docs/context',
@@ -447,8 +449,9 @@ async function runInit(flags, cwdOverride) {
447
449
  }
448
450
  }
449
451
 
450
- // 5b. Scaffold docs/context/ with ambient context templates
451
- const contextDir = join(cwd, config.paths.context)
452
+ // 5b. Scaffold docs/context/ with ambient context templates.
453
+ // COMP-PATHS-EXTERNAL: resolve from the in-memory config (may be relocated).
454
+ const contextDir = resolveContextPathFromConfig(cwd, config)
452
455
  mkdirSync(contextDir, { recursive: true })
453
456
  const contextTemplates = {
454
457
  'tech-stack.md': '# Tech Stack\n\nDescribe your technology stack here.\n',
@@ -464,8 +467,8 @@ async function runInit(flags, cwdOverride) {
464
467
  }
465
468
 
466
469
  // 5c. Scaffold docs/product/ideabox.md if absent
467
- const ideaboxRel = config.paths.ideabox || 'docs/product/ideabox.md'
468
- const ideaboxDest = join(cwd, ideaboxRel)
470
+ const { resolveIdeaboxPath: _resolveIdeaboxPathInit } = await import('../lib/project-paths.js')
471
+ const ideaboxDest = _resolveIdeaboxPathInit(cwd)
469
472
  if (!existsSync(ideaboxDest)) {
470
473
  mkdirSync(dirname(ideaboxDest), { recursive: true })
471
474
  const { IDEABOX_TEMPLATE } = await import('../lib/ideabox.js')
@@ -513,8 +516,10 @@ async function runInit(flags, cwdOverride) {
513
516
  }
514
517
  }
515
518
 
516
- // 7. Scaffold ROADMAP.md from template if absent
517
- const roadmapDest = join(cwd, 'ROADMAP.md')
519
+ // 7. Scaffold ROADMAP.md from template if absent. COMP-PATHS-EXTERNAL:
520
+ // honor a configured (possibly relocated) paths.roadmap instead of always
521
+ // seeding <cwd>/ROADMAP.md. Byte-identical for the default.
522
+ const roadmapDest = resolveRoadmapPathFromConfig(cwd, config)
518
523
  if (!existsSync(roadmapDest)) {
519
524
  const roadmapSrc = join(PACKAGE_ROOT, 'templates', 'ROADMAP.md')
520
525
  if (existsSync(roadmapSrc)) {
@@ -942,10 +947,12 @@ if (cmd === 'feature') {
942
947
 
943
948
  let config = {}
944
949
  try { config = JSON.parse(readFileSync(configPath, 'utf-8')) } catch {}
945
- const featuresDir = config.paths?.features || 'docs/features'
950
+ // COMP-PATHS-EXTERNAL: absolute features dir (may be relocated outside cwd).
951
+ // Never join(cwd, …) below — that would re-root an absolute/../-escaping override.
952
+ const featuresDir = resolveFeaturesPath(cwd)
946
953
 
947
954
  // 1. Create feature folder + seed design doc
948
- const featureDir = join(cwd, featuresDir, featureCode)
955
+ const featureDir = join(featuresDir, featureCode)
949
956
  const designPath = join(featureDir, 'design.md')
950
957
 
951
958
  if (existsSync(designPath)) {
@@ -985,7 +992,7 @@ if (cmd === 'feature') {
985
992
  // Count existing features for complexity estimate
986
993
  const existingFeatureCount = (() => {
987
994
  try {
988
- const fdir = join(cwd, featuresDir)
995
+ const fdir = featuresDir
989
996
  if (!existsSync(fdir)) return 0
990
997
  return readdirSync(fdir, { withFileTypes: true })
991
998
  .filter(e => e.isDirectory() && existsSync(join(fdir, e.name, 'feature.json')))
@@ -1042,7 +1049,7 @@ _This is a seed design doc created by \`compose feature\`. The \`compose build\`
1042
1049
  console.log(`Created ${designPath}`)
1043
1050
 
1044
1051
  // 2. Add entry to ROADMAP.md
1045
- const roadmapPath = join(cwd, 'ROADMAP.md')
1052
+ const roadmapPath = resolveRoadmapPath(cwd)
1046
1053
  if (existsSync(roadmapPath)) {
1047
1054
  let roadmap = readFileSync(roadmapPath, 'utf-8')
1048
1055
 
@@ -1157,7 +1164,7 @@ if (cmd === 'roadmap') {
1157
1164
  const { checkRoundtrip, describeLossyDiff } = await import('../lib/roadmap-roundtrip.js')
1158
1165
  const { loadExternalPrefixes } = await import('../lib/project-paths.js')
1159
1166
  const { root: cwd } = resolveCwdWithWorkspace(args)
1160
- const roadmapPath = join(cwd, 'ROADMAP.md')
1167
+ const roadmapPath = resolveRoadmapPath(cwd)
1161
1168
  if (!existsSync(roadmapPath)) {
1162
1169
  console.error('No ROADMAP.md found. Run: compose roadmap generate')
1163
1170
  process.exit(1)
@@ -1350,7 +1357,7 @@ if (cmd === 'roadmap') {
1350
1357
  }
1351
1358
 
1352
1359
  const { root: cwd } = resolveCwdWithWorkspace(args)
1353
- const roadmapPath = join(cwd, 'ROADMAP.md')
1360
+ const roadmapPath = resolveRoadmapPath(cwd)
1354
1361
 
1355
1362
  if (existsSync(roadmapPath)) {
1356
1363
  // Show cwd roadmap
@@ -2426,7 +2433,11 @@ if (cmd === 'build') {
2426
2433
  } = await import('../lib/ideabox.js')
2427
2434
 
2428
2435
  const ibRelPath = getIdeaboxRelPath(ibCwd)
2429
- const ibFullPath = join(ibCwd, ibRelPath)
2436
+ // ibFullPath is used for direct file ops (existsSync/mkdirSync/writeFileSync/
2437
+ // display); resolve it absolute-safe. ibRelPath stays relative because the
2438
+ // lib readIdeabox/writeIdeabox readers re-join it under ibCwd.
2439
+ const { resolveIdeaboxPath: _resolveIdeaboxPathCli } = await import('../lib/project-paths.js')
2440
+ const ibFullPath = _resolveIdeaboxPathCli(ibCwd)
2430
2441
 
2431
2442
  if (!ibSubcmd || ibSubcmd === '--help' || ibSubcmd === '-h') {
2432
2443
  console.log('Usage: compose ideabox <subcommand>')
@@ -2544,9 +2555,10 @@ if (cmd === 'build') {
2544
2555
  resolvedCode = `IDEA-${idea.num}-${slug}`.toUpperCase()
2545
2556
  }
2546
2557
 
2547
- // Create feature folder if missing — respect paths.features from compose.json
2548
- const featuresRel = ibConfig.paths?.features || 'docs/features'
2549
- const featuresDir = join(ibCwd, featuresRel, resolvedCode)
2558
+ // Create feature folder if missing — respect paths.features (may be
2559
+ // relocated outside ibCwd COMP-PATHS-EXTERNAL; resolve absolute, no re-root)
2560
+ const featuresBase = resolveFeaturesPathFromConfig(ibCwd, ibConfig)
2561
+ const featuresDir = join(featuresBase, resolvedCode)
2550
2562
  if (!existsSync(featuresDir)) {
2551
2563
  // COMP-MCP-VALIDATE-1: route through the validated writer (schema-guarded)
2552
2564
  // instead of a raw writeFileSync.
@@ -2557,8 +2569,8 @@ if (cmd === 'build') {
2557
2569
  status: 'PLANNED',
2558
2570
  promotedFrom: ideaId,
2559
2571
  createdAt: new Date().toISOString(),
2560
- }, featuresRel)
2561
- console.log(`Created feature folder: ${featuresRel}/${resolvedCode}/`)
2572
+ }, featuresBase)
2573
+ console.log(`Created feature folder: ${join(featuresBase, resolvedCode)}/`)
2562
2574
  }
2563
2575
 
2564
2576
  _promoteIdea(parsed, ideaId, resolvedCode)