@inharness-ai/claude4spec 1.0.13 → 1.0.15

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 (180) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/bin/c4s/commands/find-references.d.ts +13 -0
  3. package/dist/bin/c4s/commands/find-references.js +81 -0
  4. package/dist/bin/c4s/commands/find-references.js.map +1 -0
  5. package/dist/bin/c4s.js +6 -0
  6. package/dist/bin/c4s.js.map +1 -1
  7. package/dist/client/assets/{arc-E0e7X_zn.js → arc-Bm0IE9-2.js} +1 -1
  8. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BzlqOVZv.js → architectureDiagram-3BPJPVTR-GJ4QxX0Q.js} +1 -1
  9. package/dist/client/assets/{blockDiagram-GPEHLZMM-BIQcApN7.js → blockDiagram-GPEHLZMM-C9rZbfxq.js} +1 -1
  10. package/dist/client/assets/{c4Diagram-AAUBKEIU-CDU0V1yk.js → c4Diagram-AAUBKEIU-DyVuHGeV.js} +1 -1
  11. package/dist/client/assets/channel-BGn39mc8.js +1 -0
  12. package/dist/client/assets/{chunk-2J33WTMH-PtDSwC5f.js → chunk-2J33WTMH-DePzEFC8.js} +1 -1
  13. package/dist/client/assets/{chunk-4BX2VUAB-DTUPWrSO.js → chunk-4BX2VUAB-NZkVFx6P.js} +1 -1
  14. package/dist/client/assets/{chunk-55IACEB6-Cpd59xZT.js → chunk-55IACEB6-DSelTsfa.js} +1 -1
  15. package/dist/client/assets/{chunk-727SXJPM-C4DOvpJT.js → chunk-727SXJPM-Vk_bMeuW.js} +1 -1
  16. package/dist/client/assets/{chunk-AQP2D5EJ-CtjeHPBB.js → chunk-AQP2D5EJ-Bv_5j6lW.js} +1 -1
  17. package/dist/client/assets/{chunk-FMBD7UC4-CZA3OvVr.js → chunk-FMBD7UC4-CIwy6WRQ.js} +1 -1
  18. package/dist/client/assets/{chunk-ND2GUHAM-Cbx6nQHm.js → chunk-ND2GUHAM-C-7ZR2Kw.js} +1 -1
  19. package/dist/client/assets/{chunk-QZHKN3VN-3DunELI_.js → chunk-QZHKN3VN-D2pOGWp9.js} +1 -1
  20. package/dist/client/assets/classDiagram-4FO5ZUOK-DZ5eaGnY.js +1 -0
  21. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DZ5eaGnY.js +1 -0
  22. package/dist/client/assets/{cose-bilkent-S5V4N54A-CKYJnuL7.js → cose-bilkent-S5V4N54A-NgRxSzcd.js} +1 -1
  23. package/dist/client/assets/{dagre-BM42HDAG-BrvRwrr_.js → dagre-BM42HDAG-kwaDBrFq.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-BaVLuzcD.js → diagram-2AECGRRQ-B5OMokEe.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-9Cu7Wa7J.js → diagram-5GNKFQAL-9h9Lsrr_.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-XKiCVdjO.js → diagram-KO2AKTUF-DcNC4jPN.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-DerecU5v.js → diagram-LMA3HP47-D41zybvJ.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-BWcREvZ9.js → diagram-OG6HWLK6-D12dQiCG.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-DU3BBQJY.js → erDiagram-TEJ5UH35-brqTv2OJ.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-DXO_IJeR.js → flowDiagram-I6XJVG4X-D6q2xyWg.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CXiFZEPx.js → ganttDiagram-6RSMTGT7-DlH9o0CJ.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DHewdln-.js → gitGraphDiagram-PVQCEYII-CgNLFhAT.js} +1 -1
  33. package/dist/client/assets/{index-DT5g2AtL.js → index-C-gTQA-n.js} +1 -1
  34. package/dist/client/assets/{index-DD0GkjkG.js → index-DDRzJojo.js} +1 -1
  35. package/dist/client/assets/{index-BTXWIk4x.css → index-DirDnayu.css} +1 -1
  36. package/dist/client/assets/{index-DcIG_8JB.js → index-qO9stCkx.js} +189 -179
  37. package/dist/client/assets/{infoDiagram-5YYISTIA-CN40PAGW.js → infoDiagram-5YYISTIA-ThuQNCvi.js} +1 -1
  38. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B8KsyuPk.js → ishikawaDiagram-YF4QCWOH-m-2DHbkK.js} +1 -1
  39. package/dist/client/assets/{journeyDiagram-JHISSGLW-BlEb3E_P.js → journeyDiagram-JHISSGLW-CNCSJPeY.js} +1 -1
  40. package/dist/client/assets/{kanban-definition-UN3LZRKU-B080CGS9.js → kanban-definition-UN3LZRKU-CtzjrW3p.js} +1 -1
  41. package/dist/client/assets/{linear-D6Tg-IET.js → linear-BF1Qhpjc.js} +1 -1
  42. package/dist/client/assets/{mermaid.core-DP18nW3T.js → mermaid.core-fKaK1Sz_.js} +4 -4
  43. package/dist/client/assets/{mindmap-definition-RKZ34NQL-bfo7Qm5I.js → mindmap-definition-RKZ34NQL-CXuVRuzz.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-4H26LBE5-ZsPztPu6.js → pieDiagram-4H26LBE5-DdL9uKdO.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DKrTleIL.js → quadrantDiagram-W4KKPZXB-C_0FG9xH.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-4Y6WPE33-D4YX8ZgG.js → requirementDiagram-4Y6WPE33-Qmg8C7k6.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Bo-xm6Mc.js → sankeyDiagram-5OEKKPKP-DuIvgSjA.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CozgdKp6.js → sequenceDiagram-3UESZ5HK-B4JsFW9i.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-AJRCARHV-CiK61MwV.js → stateDiagram-AJRCARHV-lTFw6Md4.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-D2iiMzxh.js +1 -0
  51. package/dist/client/assets/{timeline-definition-PNZ67QCA-CgHoguI7.js → timeline-definition-PNZ67QCA-C7Hc5KbB.js} +1 -1
  52. package/dist/client/assets/{vennDiagram-CIIHVFJN-TY32dxQb.js → vennDiagram-CIIHVFJN-DMyGzBh7.js} +1 -1
  53. package/dist/client/assets/{wardley-L42UT6IY-C6Q7VFwH.js → wardley-L42UT6IY-BjA5T0YY.js} +1 -1
  54. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-nZLnVsQL.js → wardleyDiagram-YWT4CUSO-BhOipIZG.js} +1 -1
  55. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DHdYRHEr.js → xychartDiagram-2RQKCTM6-Czx4--PM.js} +1 -1
  56. package/dist/client/index.html +2 -2
  57. package/dist/core/references/find-references.d.ts +13 -0
  58. package/dist/core/references/find-references.js +41 -0
  59. package/dist/core/references/find-references.js.map +1 -0
  60. package/dist/core/references/index.d.ts +2 -0
  61. package/dist/core/references/index.js +2 -0
  62. package/dist/core/references/index.js.map +1 -0
  63. package/dist/core/references/types.d.ts +45 -0
  64. package/dist/core/references/types.js +9 -0
  65. package/dist/core/references/types.js.map +1 -0
  66. package/dist/server/config.d.ts +9 -0
  67. package/dist/server/config.js +6 -0
  68. package/dist/server/config.js.map +1 -1
  69. package/dist/server/core/plugin-host/entities-router.d.ts +2 -1
  70. package/dist/server/core/plugin-host/entities-router.js +19 -13
  71. package/dist/server/core/plugin-host/entities-router.js.map +1 -1
  72. package/dist/server/core/plugin-host/host.js +4 -9
  73. package/dist/server/core/plugin-host/host.js.map +1 -1
  74. package/dist/server/core/plugin-host/types.d.ts +9 -14
  75. package/dist/server/db/migrations/035_m29_slug_identity.sql +248 -0
  76. package/dist/server/domain/raw-entity-reader.d.ts +3 -5
  77. package/dist/server/domain/raw-entity-reader.js +28 -39
  78. package/dist/server/domain/raw-entity-reader.js.map +1 -1
  79. package/dist/server/entities/ac/ac-analysis.service.d.ts +54 -0
  80. package/dist/server/entities/ac/ac-analysis.service.js +162 -0
  81. package/dist/server/entities/ac/ac-analysis.service.js.map +1 -0
  82. package/dist/server/entities/ac/mcp-server.d.ts +8 -0
  83. package/dist/server/entities/ac/mcp-server.js +30 -2
  84. package/dist/server/entities/ac/mcp-server.js.map +1 -1
  85. package/dist/server/entities/ac/plugin.js +4 -2
  86. package/dist/server/entities/ac/plugin.js.map +1 -1
  87. package/dist/server/entities/ac/serializer.js +1 -1
  88. package/dist/server/entities/ac/serializer.js.map +1 -1
  89. package/dist/server/entities/ac/services.d.ts +19 -7
  90. package/dist/server/entities/ac/services.js +65 -42
  91. package/dist/server/entities/ac/services.js.map +1 -1
  92. package/dist/server/entities/database-table/plugin.js +1 -2
  93. package/dist/server/entities/database-table/plugin.js.map +1 -1
  94. package/dist/server/entities/database-table/serializer.js +1 -1
  95. package/dist/server/entities/database-table/serializer.js.map +1 -1
  96. package/dist/server/entities/database-table/services.d.ts +19 -7
  97. package/dist/server/entities/database-table/services.js +74 -47
  98. package/dist/server/entities/database-table/services.js.map +1 -1
  99. package/dist/server/entities/dto/plugin.js +1 -2
  100. package/dist/server/entities/dto/plugin.js.map +1 -1
  101. package/dist/server/entities/dto/serializer.js +2 -2
  102. package/dist/server/entities/dto/serializer.js.map +1 -1
  103. package/dist/server/entities/dto/services.d.ts +19 -7
  104. package/dist/server/entities/dto/services.js +70 -47
  105. package/dist/server/entities/dto/services.js.map +1 -1
  106. package/dist/server/entities/endpoint/plugin.js +1 -2
  107. package/dist/server/entities/endpoint/plugin.js.map +1 -1
  108. package/dist/server/entities/endpoint/serializer.js +4 -4
  109. package/dist/server/entities/endpoint/serializer.js.map +1 -1
  110. package/dist/server/entities/endpoint/services.d.ts +21 -9
  111. package/dist/server/entities/endpoint/services.js +91 -63
  112. package/dist/server/entities/endpoint/services.js.map +1 -1
  113. package/dist/server/entities/mutate-opts.d.ts +15 -0
  114. package/dist/server/entities/mutate-opts.js +2 -0
  115. package/dist/server/entities/mutate-opts.js.map +1 -0
  116. package/dist/server/entities/ui-view/plugin.js +1 -2
  117. package/dist/server/entities/ui-view/plugin.js.map +1 -1
  118. package/dist/server/entities/ui-view/serializer.js +1 -1
  119. package/dist/server/entities/ui-view/serializer.js.map +1 -1
  120. package/dist/server/entities/ui-view/services.d.ts +19 -7
  121. package/dist/server/entities/ui-view/services.js +65 -42
  122. package/dist/server/entities/ui-view/services.js.map +1 -1
  123. package/dist/server/fs/entities-watcher.d.ts +31 -0
  124. package/dist/server/fs/entities-watcher.js +68 -0
  125. package/dist/server/fs/entities-watcher.js.map +1 -0
  126. package/dist/server/fs/watcher.js +7 -1
  127. package/dist/server/fs/watcher.js.map +1 -1
  128. package/dist/server/index.js +112 -6
  129. package/dist/server/index.js.map +1 -1
  130. package/dist/server/mcp/reference-tools.d.ts +3 -0
  131. package/dist/server/mcp/reference-tools.js +25 -161
  132. package/dist/server/mcp/reference-tools.js.map +1 -1
  133. package/dist/server/routes/static.d.ts +11 -0
  134. package/dist/server/routes/static.js +44 -0
  135. package/dist/server/routes/static.js.map +1 -0
  136. package/dist/server/services/entity-indexer.d.ts +42 -0
  137. package/dist/server/services/entity-indexer.js +179 -0
  138. package/dist/server/services/entity-indexer.js.map +1 -0
  139. package/dist/server/services/entity-store.d.ts +68 -0
  140. package/dist/server/services/entity-store.js +162 -0
  141. package/dist/server/services/entity-store.js.map +1 -0
  142. package/dist/server/services/entity-writer.d.ts +12 -1
  143. package/dist/server/services/entity-writer.js +22 -11
  144. package/dist/server/services/entity-writer.js.map +1 -1
  145. package/dist/server/services/git.js +6 -1
  146. package/dist/server/services/git.js.map +1 -1
  147. package/dist/server/services/pages.js +5 -1
  148. package/dist/server/services/pages.js.map +1 -1
  149. package/dist/server/services/references.d.ts +25 -0
  150. package/dist/server/services/references.js +102 -21
  151. package/dist/server/services/references.js.map +1 -1
  152. package/dist/server/services/release.d.ts +10 -10
  153. package/dist/server/services/release.js +32 -63
  154. package/dist/server/services/release.js.map +1 -1
  155. package/dist/server/services/section-indexer.d.ts +0 -1
  156. package/dist/server/services/section-indexer.js +5 -7
  157. package/dist/server/services/section-indexer.js.map +1 -1
  158. package/dist/server/services/skill-registry.d.ts +28 -1
  159. package/dist/server/services/skill-registry.js +51 -10
  160. package/dist/server/services/skill-registry.js.map +1 -1
  161. package/dist/server/services/static-html.d.ts +24 -0
  162. package/dist/server/services/static-html.js +49 -0
  163. package/dist/server/services/static-html.js.map +1 -0
  164. package/dist/server/services/tags.d.ts +13 -3
  165. package/dist/server/services/tags.js +65 -26
  166. package/dist/server/services/tags.js.map +1 -1
  167. package/dist/server/services/versions.d.ts +7 -7
  168. package/dist/server/services/versions.js +34 -37
  169. package/dist/server/services/versions.js.map +1 -1
  170. package/dist/shared/entities.d.ts +2 -2
  171. package/dist/shared/types.d.ts +9 -0
  172. package/dist/shared/xml-tags.d.ts +8 -0
  173. package/dist/shared/xml-tags.js +24 -0
  174. package/dist/shared/xml-tags.js.map +1 -1
  175. package/package.json +1 -1
  176. package/dist/client/assets/channel-BqjILLUr.js +0 -1
  177. package/dist/client/assets/classDiagram-4FO5ZUOK-LjT84-kK.js +0 -1
  178. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-LjT84-kK.js +0 -1
  179. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C6-8M5Sb.js +0 -1
  180. package/dist/server/db/migrations/026_ac_seed.sql +0 -75
@@ -5,12 +5,14 @@ export class UiViewService {
5
5
  db;
6
6
  tags;
7
7
  versions;
8
- constructor(db, tags, versions) {
8
+ store;
9
+ constructor(db, tags, versions, store) {
9
10
  this.db = db;
10
11
  this.tags = tags;
11
12
  this.versions = versions;
13
+ this.store = store;
12
14
  }
13
- create(input, actor) {
15
+ create(input, actor, opts = {}) {
14
16
  if (!input.name)
15
17
  throw new DomainError('VALIDATION', 'name is required');
16
18
  const slug = input.slug?.trim() || uiViewSlug(input.name);
@@ -22,19 +24,25 @@ export class UiViewService {
22
24
  const conflict = this.db.prepare(`SELECT 1 FROM ui_view WHERE slug = ?`).get(slug);
23
25
  if (conflict)
24
26
  throw new DomainError('SLUG_CONFLICT', `ui view slug '${slug}' already exists`);
25
- const info = this.db
27
+ this.db
26
28
  .prepare(`INSERT INTO ui_view (slug, name, url, description, params)
27
29
  VALUES (?, ?, ?, ?, ?)`)
28
30
  .run(slug, input.name, url, input.description ?? null, JSON.stringify(params));
29
- const id = Number(info.lastInsertRowid);
30
31
  if (input.tags?.length)
31
- this.tags.assignTags('ui-view', id, input.tags);
32
- const created = this.getByIdInternal(id);
33
- this.versions.captureEntitySnapshot('ui-view', id, 'create', actor, 'Created', '1.0.0');
32
+ this.tags.assignTags('ui-view', slug, input.tags);
33
+ const created = this.getBySlugInternal(slug);
34
+ if (opts.capture !== false) {
35
+ this.versions.captureEntitySnapshot('ui-view', slug, 'create', actor, 'Created', '1.0.0');
36
+ }
34
37
  const warnings = computeWarnings(url, params);
35
38
  return { uiView: created, warnings };
36
39
  });
37
- return tx();
40
+ const created = tx();
41
+ // M29: the entity file is the source of truth — persist after the index
42
+ // commit (skipped on the index-rebuild path, opts.writeFile === false).
43
+ if (opts.writeFile !== false)
44
+ this.store.persist('ui-view', created.uiView.slug);
45
+ return created;
38
46
  }
39
47
  list(query = {}) {
40
48
  const where = [];
@@ -49,23 +57,21 @@ export class UiViewService {
49
57
  const placeholders = tagSlugs.map(() => '?').join(',');
50
58
  if (query.tagFilter === 'or') {
51
59
  where.push(`
52
- id IN (
53
- SELECT et.entity_id FROM entity_tag et
54
- JOIN tag t ON t.id = et.tag_id
55
- WHERE et.entity_type = 'ui-view' AND t.slug IN (${placeholders})
60
+ slug IN (
61
+ SELECT et.entity_slug FROM entity_tag et
62
+ WHERE et.entity_type = 'ui-view' AND et.tag_slug IN (${placeholders})
56
63
  )
57
64
  `);
58
65
  params.push(...tagSlugs);
59
66
  }
60
67
  else {
61
68
  where.push(`
62
- id IN (
63
- SELECT et.entity_id
69
+ slug IN (
70
+ SELECT et.entity_slug
64
71
  FROM entity_tag et
65
- JOIN tag t ON t.id = et.tag_id
66
- WHERE et.entity_type = 'ui-view' AND t.slug IN (${placeholders})
67
- GROUP BY et.entity_id
68
- HAVING COUNT(DISTINCT t.slug) = ?
72
+ WHERE et.entity_type = 'ui-view' AND et.tag_slug IN (${placeholders})
73
+ GROUP BY et.entity_slug
74
+ HAVING COUNT(DISTINCT et.tag_slug) = ?
69
75
  )
70
76
  `);
71
77
  params.push(...tagSlugs, tagSlugs.length);
@@ -85,11 +91,7 @@ export class UiViewService {
85
91
  const row = this.db.prepare(`SELECT * FROM ui_view WHERE slug = ?`).get(slug);
86
92
  return row ? this.hydrate(row) : null;
87
93
  }
88
- getIdBySlug(slug) {
89
- const row = this.db.prepare(`SELECT id FROM ui_view WHERE slug = ?`).get(slug);
90
- return row?.id ?? null;
91
- }
92
- update(slug, input, actor) {
94
+ update(slug, input, actor, opts = {}) {
93
95
  const tx = this.db.transaction(() => {
94
96
  const current = this.db.prepare(`SELECT * FROM ui_view WHERE slug = ?`).get(slug);
95
97
  if (!current)
@@ -108,26 +110,42 @@ export class UiViewService {
108
110
  .prepare(`UPDATE ui_view
109
111
  SET slug = ?, name = ?, url = ?, description = ?, params = ?,
110
112
  updated_at = datetime('now')
111
- WHERE id = ?`)
112
- .run(nextSlug, nextName, nextUrl, input.description !== undefined ? input.description : current.description, nextParams, current.id);
113
+ WHERE slug = ?`)
114
+ .run(nextSlug, nextName, nextUrl, input.description !== undefined ? input.description : current.description, nextParams, slug);
115
+ // M29: a rename moves entity_tag rows to the new slug (entity_tag is
116
+ // polymorphic, no FK on entity_slug — must follow the rename explicitly).
117
+ if (nextSlug !== slug) {
118
+ this.db
119
+ .prepare(`UPDATE entity_tag SET entity_slug = ? WHERE entity_type = 'ui-view' AND entity_slug = ?`)
120
+ .run(nextSlug, slug);
121
+ }
113
122
  if (input.tags)
114
- this.tags.assignTags('ui-view', current.id, input.tags);
115
- const updated = this.getByIdInternal(current.id);
123
+ this.tags.assignTags('ui-view', nextSlug, input.tags);
124
+ const updated = this.getBySlugInternal(nextSlug);
116
125
  const summary = nextSlug !== slug ? `Renamed from '${slug}' to '${nextSlug}'` : 'Updated';
117
- this.versions.captureEntitySnapshot('ui-view', current.id, 'update', actor, summary, '1.0.0');
126
+ if (opts.capture !== false) {
127
+ this.versions.captureEntitySnapshot('ui-view', nextSlug, 'update', actor, summary, '1.0.0');
128
+ }
118
129
  const warnings = computeWarnings(updated.url, updated.params);
119
130
  return { uiView: updated, previousSlug: slug, warnings };
120
131
  });
121
- return tx();
132
+ const result = tx();
133
+ if (opts.writeFile !== false) {
134
+ const nextSlug = result.uiView.slug;
135
+ if (nextSlug !== slug)
136
+ this.store.remove('ui-view', slug); // rename: drop the old file
137
+ this.store.persist('ui-view', nextSlug);
138
+ }
139
+ return result;
122
140
  }
123
141
  /**
124
142
  * Idempotent UPSERT for M17 restore. CREATE if slug missing, UPDATE
125
143
  * otherwise; preserves slug.
126
144
  */
127
- upsert(slug, input, actor) {
145
+ upsert(slug, input, actor, opts = {}) {
128
146
  const existing = this.getBySlug(slug);
129
147
  if (!existing) {
130
- const result = this.create({ ...input, slug }, actor);
148
+ const result = this.create({ ...input, slug }, actor, opts);
131
149
  return { uiView: result.uiView, op: 'created', warnings: result.warnings };
132
150
  }
133
151
  const result = this.update(slug, {
@@ -136,28 +154,33 @@ export class UiViewService {
136
154
  description: input.description,
137
155
  params: input.params,
138
156
  tags: input.tags,
139
- }, actor);
157
+ }, actor, opts);
140
158
  return { uiView: result.uiView, op: 'updated', warnings: result.warnings };
141
159
  }
142
- remove(slug, actor, brokenReferences = []) {
160
+ remove(slug, actor, brokenReferences = [], opts = {}) {
143
161
  const tx = this.db.transaction(() => {
144
162
  const row = this.db.prepare(`SELECT * FROM ui_view WHERE slug = ?`).get(slug);
145
163
  if (!row)
146
164
  throw new DomainError('NOT_FOUND', `ui view '${slug}' not found`);
147
165
  // M17: capture snapshot BEFORE delete.
148
- this.versions.captureEntitySnapshot('ui-view', row.id, 'delete', actor, 'Deleted', '1.0.0');
166
+ if (opts.capture !== false) {
167
+ this.versions.captureEntitySnapshot('ui-view', slug, 'delete', actor, 'Deleted', '1.0.0');
168
+ }
149
169
  this.db
150
- .prepare(`DELETE FROM entity_tag WHERE entity_type = 'ui-view' AND entity_id = ?`)
151
- .run(row.id);
152
- this.db.prepare(`DELETE FROM ui_view WHERE id = ?`).run(row.id);
170
+ .prepare(`DELETE FROM entity_tag WHERE entity_type = 'ui-view' AND entity_slug = ?`)
171
+ .run(slug);
172
+ this.db.prepare(`DELETE FROM ui_view WHERE slug = ?`).run(slug);
153
173
  return { deleted: true, brokenReferences };
154
174
  });
155
- return tx();
175
+ const result = tx();
176
+ if (opts.writeFile !== false)
177
+ this.store.remove('ui-view', slug);
178
+ return result;
156
179
  }
157
- getByIdInternal(id) {
158
- const row = this.db.prepare(`SELECT * FROM ui_view WHERE id = ?`).get(id);
180
+ getBySlugInternal(slug) {
181
+ const row = this.db.prepare(`SELECT * FROM ui_view WHERE slug = ?`).get(slug);
159
182
  if (!row)
160
- throw new Error(`ui_view id ${id} disappeared mid-tx`);
183
+ throw new Error(`ui_view '${slug}' disappeared mid-tx`);
161
184
  return this.hydrate(row);
162
185
  }
163
186
  hydrate(row) {
@@ -167,7 +190,7 @@ export class UiViewService {
167
190
  url: row.url,
168
191
  description: row.description,
169
192
  params: parseParams(row.params),
170
- tags: this.tags.getEntityTagSlugs('ui-view', row.id),
193
+ tags: this.tags.getEntityTagSlugs('ui-view', row.slug),
171
194
  createdAt: row.created_at,
172
195
  updatedAt: row.updated_at,
173
196
  };
@@ -1 +1 @@
1
- {"version":3,"file":"services.js","sourceRoot":"","sources":["../../../../src/server/entities/ui-view/services.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../../../src/server/entities/ui-view/services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ type EventKind = 'add' | 'change' | 'unlink';
2
+ export type EntitiesWatcherCallback = (relPath: string, kind: EventKind) => void;
3
+ /**
4
+ * M29: dedicated chokidar watcher for the committed entity store
5
+ * (`<entitiesDir>/<type>/<slug>.json` + `tags.json`). A sibling of
6
+ * `PagesWatcher` rather than a reuse because it differs in two load-bearing
7
+ * ways:
8
+ * - it watches `.json` (PagesWatcher hard-filters `.md`),
9
+ * - it does NOT broadcast on its own — the `EntityIndexerService` owns the WS
10
+ * `entity:indexed` event, emitted only after a successful reindex.
11
+ *
12
+ * Rooted directly AT `<entitiesDir>` so chokidar's leading-dot ignore (the
13
+ * `.claude4spec/` segment) never excludes its own contents. The 3 page-family
14
+ * watchers (pages/briefs/patches) are rooted outside `.claude4spec/`, so they
15
+ * never traverse the entity store — this watcher owns it exclusively.
16
+ */
17
+ export declare class EntitiesWatcher {
18
+ private entitiesRoot;
19
+ private watcher;
20
+ private suppressUntil;
21
+ private readonly SUPPRESS_WINDOW_MS;
22
+ private callbacks;
23
+ constructor(entitiesRoot: string);
24
+ onChange(cb: EntitiesWatcherCallback): void;
25
+ start(): void;
26
+ /** Call before a programmatic write so the resulting chokidar event is suppressed. */
27
+ suppress(relPath: string): void;
28
+ private emit;
29
+ close(): Promise<void>;
30
+ }
31
+ export {};
@@ -0,0 +1,68 @@
1
+ import chokidar from 'chokidar';
2
+ import path from 'node:path';
3
+ /**
4
+ * M29: dedicated chokidar watcher for the committed entity store
5
+ * (`<entitiesDir>/<type>/<slug>.json` + `tags.json`). A sibling of
6
+ * `PagesWatcher` rather than a reuse because it differs in two load-bearing
7
+ * ways:
8
+ * - it watches `.json` (PagesWatcher hard-filters `.md`),
9
+ * - it does NOT broadcast on its own — the `EntityIndexerService` owns the WS
10
+ * `entity:indexed` event, emitted only after a successful reindex.
11
+ *
12
+ * Rooted directly AT `<entitiesDir>` so chokidar's leading-dot ignore (the
13
+ * `.claude4spec/` segment) never excludes its own contents. The 3 page-family
14
+ * watchers (pages/briefs/patches) are rooted outside `.claude4spec/`, so they
15
+ * never traverse the entity store — this watcher owns it exclusively.
16
+ */
17
+ export class EntitiesWatcher {
18
+ entitiesRoot;
19
+ watcher = null;
20
+ suppressUntil = new Map();
21
+ SUPPRESS_WINDOW_MS = 500;
22
+ callbacks = [];
23
+ constructor(entitiesRoot) {
24
+ this.entitiesRoot = entitiesRoot;
25
+ }
26
+ onChange(cb) {
27
+ this.callbacks.push(cb);
28
+ }
29
+ start() {
30
+ this.watcher = chokidar.watch(this.entitiesRoot, {
31
+ ignoreInitial: true,
32
+ // Ignore editor/dotfiles (e.g. `.foo.json.swp`, `.DS_Store`). Entity files
33
+ // are `<type>/<slug>.json` / `tags.json` — never dot-prefixed basenames.
34
+ ignored: (p) => /(^|\/|\\)\./.test(path.basename(p)),
35
+ awaitWriteFinish: { stabilityThreshold: 80, pollInterval: 20 },
36
+ });
37
+ this.watcher.on('add', (p) => this.emit('add', p));
38
+ this.watcher.on('change', (p) => this.emit('change', p));
39
+ this.watcher.on('unlink', (p) => this.emit('unlink', p));
40
+ }
41
+ /** Call before a programmatic write so the resulting chokidar event is suppressed. */
42
+ suppress(relPath) {
43
+ this.suppressUntil.set(relPath, Date.now() + this.SUPPRESS_WINDOW_MS);
44
+ }
45
+ emit(kind, absPath) {
46
+ if (!absPath.endsWith('.json'))
47
+ return;
48
+ const relPath = path.relative(this.entitiesRoot, absPath).replaceAll(path.sep, '/');
49
+ const suppressedUntil = this.suppressUntil.get(relPath);
50
+ if (suppressedUntil && Date.now() < suppressedUntil) {
51
+ this.suppressUntil.delete(relPath);
52
+ return;
53
+ }
54
+ for (const cb of this.callbacks) {
55
+ try {
56
+ cb(relPath, kind);
57
+ }
58
+ catch (err) {
59
+ console.error('[entities-watcher] callback error:', err);
60
+ }
61
+ }
62
+ }
63
+ async close() {
64
+ await this.watcher?.close();
65
+ this.watcher = null;
66
+ }
67
+ }
68
+ //# sourceMappingURL=entities-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities-watcher.js","sourceRoot":"","sources":["../../../src/server/fs/entities-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,QAA4B,MAAM,UAAU,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,eAAe;IAMN;IALZ,OAAO,GAAqB,IAAI,CAAC;IACjC,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjC,kBAAkB,GAAG,GAAG,CAAC;IAClC,SAAS,GAA8B,EAAE,CAAC;IAElD,YAAoB,YAAoB;QAApB,iBAAY,GAAZ,YAAY,CAAQ;IAAG,CAAC;IAE5C,QAAQ,CAAC,EAA2B;QAClC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE;YAC/C,aAAa,EAAE,IAAI;YACnB,2EAA2E;YAC3E,yEAAyE;YACzE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACpD,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;SAC/D,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,sFAAsF;IACtF,QAAQ,CAAC,OAAe;QACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACxE,CAAC;IAEO,IAAI,CAAC,IAAe,EAAE,OAAe;QAC3C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpF,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,eAAe,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAAE,CAAC;YACpD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF"}
@@ -38,7 +38,10 @@ export class PagesWatcher {
38
38
  this.gateway.broadcast({ kind: 'page:changed', event: 'change', path: relPath, origin: 'server' });
39
39
  }
40
40
  emit(kind, absPath) {
41
- if (!absPath.endsWith('.md'))
41
+ const isMd = absPath.endsWith('.md');
42
+ // M30: watch .html too (so the preview iframe can refresh), but only .md drives indexing.
43
+ const isHtml = absPath.endsWith('.html');
44
+ if (!isMd && !isHtml)
42
45
  return;
43
46
  const relPath = path.relative(this.pagesRoot, absPath).replaceAll(path.sep, '/');
44
47
  const suppressedUntil = this.suppressUntil.get(relPath);
@@ -47,6 +50,9 @@ export class PagesWatcher {
47
50
  return;
48
51
  }
49
52
  this.gateway.broadcast({ kind: 'page:changed', event: kind, path: relPath, origin: 'external' });
53
+ // Indexer callbacks (M06 section index) run for .md only — .html is never indexed/versioned.
54
+ if (!isMd)
55
+ return;
50
56
  for (const cb of this.callbacks) {
51
57
  try {
52
58
  cb(relPath, kind);
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/server/fs/watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/server/fs/watcher.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ import { readConfig, writeConfig } from './config.js';
8
8
  import { openDb } from './db/index.js';
9
9
  import { PagesService } from './services/pages.js';
10
10
  import { pagesRouter } from './routes/pages.js';
11
+ import { StaticHtmlService } from './services/static-html.js';
12
+ import { staticRouter } from './routes/static.js';
11
13
  import { tagsRouter } from './routes/tags.js';
12
14
  import { entitiesRouter } from './core/plugin-host/entities-router.js';
13
15
  import { referencesRouter } from './routes/references.js';
@@ -45,8 +47,11 @@ import { GitService } from './services/git.js';
45
47
  import { gitRouter } from './routes/git.js';
46
48
  import { WsGateway } from './ws/gateway.js';
47
49
  import { PagesWatcher } from './fs/watcher.js';
50
+ import { EntitiesWatcher } from './fs/entities-watcher.js';
51
+ import { EntityStore } from './services/entity-store.js';
52
+ import { EntityIndexerService } from './services/entity-indexer.js';
48
53
  import { createReferenceToolsServer } from './mcp/reference-tools.js';
49
- import { SkillRegistry, SkillResolver, findSkillsDir } from './services/skill-registry.js';
54
+ import { SkillRegistry, SkillResolver, findSkillsRoots } from './services/skill-registry.js';
50
55
  import { chatRouter } from './routes/chat.js';
51
56
  import { threadsRouter } from './routes/threads.js';
52
57
  import { sectionsRouter } from './routes/sections.js';
@@ -59,6 +64,22 @@ import { pluginHostRouter } from './core/plugin-host/cross-cutting.js';
59
64
  import './serialization/registerAll.js';
60
65
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
61
66
  const DEFAULT_PORT = 3000;
67
+ /**
68
+ * M29: one-time best-effort backup of the derived SQLite before a DB→text
69
+ * export / divergent-rebuild, so the prior index is recoverable. Idempotent —
70
+ * skips if the `.pre-migration.bak` already exists.
71
+ */
72
+ function backupDbBeforeMigration(cwd) {
73
+ const src = path.join(cwd, '.claude4spec', 'db.sqlite');
74
+ const bak = path.join(cwd, '.claude4spec', 'db.sqlite.pre-migration.bak');
75
+ try {
76
+ if (fs.existsSync(src) && !fs.existsSync(bak))
77
+ fs.copyFileSync(src, bak);
78
+ }
79
+ catch (err) {
80
+ console.warn('[m29] db backup failed:', err.message);
81
+ }
82
+ }
62
83
  // M01: deterministyczny port. Przy zajetym porcie serwer NIE wskakuje juz na
63
84
  // `port+1` — failuje z czytelnym bledem i niezerowym exit code. Powod: stały
64
85
  // `config.json.port` jest warunkiem discovery serwera przez `c4s ask`.
@@ -160,7 +181,7 @@ export async function startServer(opts) {
160
181
  const serverStartedAt = new Date().toISOString();
161
182
  const app = express();
162
183
  app.use(express.json({ limit: '2mb' }));
163
- const skillRegistry = SkillRegistry.load(findSkillsDir());
184
+ const skillRegistry = SkillRegistry.load(findSkillsRoots(cwd));
164
185
  const bootConfig = readConfig(cwd);
165
186
  // Effective pagesDir precedence: CLI flag > config.json > hardcoded 'pages'.
166
187
  const pagesDir = opts.pagesDir ?? bootConfig.pagesDir ?? 'pages';
@@ -193,6 +214,18 @@ export async function startServer(opts) {
193
214
  if (patchesDir === pagesDir || patchesDir === briefsDir) {
194
215
  console.warn(`[config] patchesDir collides with pagesDir/briefsDir ("${patchesDir}") — patch files will be visible in multiple indexers`);
195
216
  }
217
+ // M29: entitiesDir, default '.claude4spec/entities'. Same path-safety as
218
+ // briefsDir/patchesDir — but this directory is COMMITTED to git (source of
219
+ // truth for entities; SQLite is a derived index rebuilt from it at boot).
220
+ const entitiesDir = bootConfig.entitiesDir ?? '.claude4spec/entities';
221
+ if (path.isAbsolute(entitiesDir)) {
222
+ throw new Error(`config.json: entitiesDir must be relative to cwd, got: ${entitiesDir}`);
223
+ }
224
+ const entitiesAbs = path.resolve(cwd, entitiesDir);
225
+ const entitiesRel = path.relative(cwd, entitiesAbs);
226
+ if (entitiesRel.startsWith('..') || path.isAbsolute(entitiesRel)) {
227
+ throw new Error(`config.json: entitiesDir must not escape project root, got: ${entitiesDir}`);
228
+ }
196
229
  // M01 (0.1.36): resolve the remote base URL with precedence
197
230
  // `--remote-url` flag (opts) > config.json > prod constant. The prod-constant
198
231
  // fallback lives in RemoteHttpClient; here `null` means "use prod".
@@ -216,6 +249,8 @@ export async function startServer(opts) {
216
249
  const db = openDb(cwd);
217
250
  const pages = new PagesService(cwd, pagesDir);
218
251
  await pages.ensureRoot();
252
+ // M30: static file server rooted at the same pagesDir, backing the HTML preview iframe.
253
+ const staticHtml = new StaticHtmlService(cwd, pagesDir);
219
254
  // M21 m02multidir: drugi PagesService dla briefsDir. Wspoldziel z pierwszym
220
255
  // zarowno PageVersionService jak i WsGateway, ale ma osobny watcher (debounce
221
256
  // independent per katalog) i osobny PageSerializer (constructor-bound do
@@ -431,6 +466,7 @@ export async function startServer(opts) {
431
466
  description: s.description,
432
467
  version: s.version,
433
468
  language: s.language,
469
+ source: s.source,
434
470
  })),
435
471
  });
436
472
  });
@@ -443,6 +479,13 @@ export async function startServer(opts) {
443
479
  const briefsWatcher = new PagesWatcher(briefsPages.root, gateway);
444
480
  // M23 m02multidir: trzeci PagesWatcher na patchesDir.
445
481
  const patchesWatcher = new PagesWatcher(patchesPages.root, gateway);
482
+ // M29: dedicated watcher + file store + indexer for the committed entity store.
483
+ // The page-family watchers above are rooted outside `.claude4spec/`, so this
484
+ // watcher owns `<entitiesDir>` exclusively.
485
+ const entitiesWatcher = new EntitiesWatcher(entitiesAbs);
486
+ const entityStore = new EntityStore(cwd, entitiesDir, entitiesWatcher, rawReader, pluginHost);
487
+ entityStore.ensureRoot();
488
+ const entityIndexer = new EntityIndexerService(db.handle, entityStore, entitiesWatcher, gateway, pluginHost, tagsService, rawReader);
446
489
  const referencesService = new ReferencesService(pages, watcher);
447
490
  const sectionsService = new SectionsService(db.handle);
448
491
  sectionsService.setWriteDeps({ pages, watcher });
@@ -476,17 +519,19 @@ export async function startServer(opts) {
476
519
  // M21 m02fmidx / M23: in-memory frontmatter indexer feeded przez trzy watchery.
477
520
  const pagesFrontmatterIndexer = new PagesFrontmatterIndexer(pages, briefsPages, patchesPages, gateway);
478
521
  // Mount all active backend modules — each plugin constructs its own service,
479
- // mounts its router, registers its MCP server, and wires its id resolver via
480
- // the supplied MountContext. Inactive plugins are skipped (config.entities).
522
+ // mounts its router, registers its MCP server, and registers its entity
523
+ // service via the supplied MountContext. Inactive plugins are skipped
524
+ // (config.entities).
481
525
  pluginHost.mountBackend({
482
526
  app,
483
527
  db: db.handle,
528
+ cwd,
484
529
  ws: gateway,
485
530
  tagsService,
486
531
  versionService,
487
532
  referencesService,
533
+ entityStore,
488
534
  registerMcpServer: (name, server) => pluginHost.registerMcpServer(name, server),
489
- setIdResolver: (type, fn) => pluginHost.setIdResolver(type, fn),
490
535
  registerEntityService: (type, service) => pluginHost.registerEntityService(type, service),
491
536
  });
492
537
  // Cross-cutting MCP server — owned by the host, not a plugin (M13).
@@ -500,11 +545,14 @@ export async function startServer(opts) {
500
545
  ws: gateway,
501
546
  db: db.handle,
502
547
  cwd,
548
+ entityStore,
503
549
  }));
504
550
  // M17: ReleaseService + cross-cutting `release-tools` MCP. Like
505
551
  // reference-tools, owned by the host (not a plugin) — release semantics
506
552
  // are dual-track (entities + pages), neither side is a plugin owner.
507
553
  const releaseService = new ReleaseService(db.handle, pluginHost, versionService, pageVersions, pageSerializer, rawReader, tagsService, pages, watcher, cwd);
554
+ // M29: release restore must persist restored entities' files.
555
+ releaseService.setEntityStore(entityStore);
508
556
  // M28 Git Sync — best-effort mirroring of release create/push into the user's
509
557
  // git repo. Probes `pages.root` for the worktree; reads config per-action.
510
558
  const gitService = new GitService(cwd, pages.root);
@@ -559,9 +607,10 @@ export async function startServer(opts) {
559
607
  });
560
608
  app.use('/api', pluginHostRouter(pluginHost));
561
609
  app.use('/api/pages', pagesRouter(pages, watcher, pageVersions));
610
+ app.use('/api/static', staticRouter(staticHtml));
562
611
  app.use('/api/tags', tagsRouter(tagsService, referencesService));
563
612
  app.use('/api/references', referencesRouter(referencesService));
564
- app.use('/api/entities', entitiesRouter(tagsService, versionService));
613
+ app.use('/api/entities', entitiesRouter(tagsService, versionService, entityStore));
565
614
  // Wspolne deps tury agenta — `threadsRouter` (POST /:id/ask) i `chatRouter`
566
615
  // (POST /api/chat, SSE) dziela ten sam runtime i rejestr `activeAdapters`.
567
616
  const agentDeps = {
@@ -661,6 +710,17 @@ export async function startServer(opts) {
661
710
  });
662
711
  }
663
712
  });
713
+ // M29: external edits / git pull of entity files → incremental reindex.
714
+ entitiesWatcher.onChange((relPath, kind) => {
715
+ if (kind === 'unlink') {
716
+ entityIndexer.handleUnlink(relPath).catch((err) => {
717
+ console.error(`[entity-indexer] unlink ${relPath}:`, err);
718
+ });
719
+ }
720
+ else {
721
+ entityIndexer.schedulePage(relPath);
722
+ }
723
+ });
664
724
  watcher.start();
665
725
  briefsWatcher.start();
666
726
  patchesWatcher.start();
@@ -725,6 +785,51 @@ export async function startServer(opts) {
725
785
  console.warn('[pages-frontmatter-indexer] initial sync failed:', err.message);
726
786
  }
727
787
  })();
788
+ // M29: entity store boot. (1) one-time DB→text export for pre-M29 projects
789
+ // whose entities live only in SQLite; (2) rebuild the derived index from the
790
+ // committed files. Awaited BEFORE listen() — the app is entity-centric, so
791
+ // serving REST/MCP before the index is ready would 404 / return empty.
792
+ try {
793
+ const fileEntityCount = entityStore.listAll().length;
794
+ const hasTagsFile = entityStore.readTags().length > 0;
795
+ const dbEntityCount = rawReader
796
+ .listTypes()
797
+ .filter((t) => pluginHost.getEntity(t))
798
+ .reduce((n, t) => n + rawReader.listSlugs(t).length, 0);
799
+ const filesPresent = fileEntityCount > 0 || hasTagsFile;
800
+ if (!filesPresent && dbEntityCount > 0) {
801
+ // Pre-M29 project: entities live only in SQLite → export to text once.
802
+ console.log(`[m29] exporting ${dbEntityCount} entities DB→text into ${entitiesDir} ...`);
803
+ backupDbBeforeMigration(cwd);
804
+ for (const type of rawReader.listTypes()) {
805
+ if (!pluginHost.getEntity(type))
806
+ continue;
807
+ for (const slug of rawReader.listSlugs(type))
808
+ entityStore.persist(type, slug);
809
+ }
810
+ entityStore.persistTags();
811
+ }
812
+ else if (filesPresent && dbEntityCount > 0 && fileEntityCount !== dbEntityCount) {
813
+ // Edge (brief migrt001 §3): committed files differ from a non-empty DB
814
+ // (e.g. a git pull dropped/added entities). Files win on rebuild — back up
815
+ // the derived DB first so the prior index is recoverable.
816
+ console.warn(`[m29] entity file count (${fileEntityCount}) != DB count (${dbEntityCount}); rebuilding from files (db backed up)`);
817
+ backupDbBeforeMigration(cwd);
818
+ }
819
+ await entityIndexer.indexAll();
820
+ }
821
+ catch (err) {
822
+ console.error('[entity-indexer] boot indexAll failed:', err);
823
+ }
824
+ // M29: enable tags.json persistence only AFTER the boot rebuild, so any
825
+ // auto-created tag during indexAll does not write files mid-rebuild.
826
+ tagsService.setEntityStore(entityStore);
827
+ // M29: enable slug-rename propagation into entity files (dto→endpoint
828
+ // linked_dtos, *→ac verifies). After indexAll so the index is consistent.
829
+ referencesService.setEntityDeps(db.handle, entityStore);
830
+ // Start the entities watcher only after the boot export/rebuild, so bulk
831
+ // self-writes during export never race a live reindex.
832
+ entitiesWatcher.start();
728
833
  const closeAssets = mode === 'dev' ? await mountDevVite(app, cwd) : mountProd(app, cwd);
729
834
  const port = await listenOrExit(httpServer, portRef.current);
730
835
  portRef.current = port;
@@ -740,6 +845,7 @@ export async function startServer(opts) {
740
845
  await watcher.close();
741
846
  await briefsWatcher.close();
742
847
  await patchesWatcher.close();
848
+ await entitiesWatcher.close();
743
849
  await gateway.close();
744
850
  await closeAssets();
745
851
  db.close();