@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.
- package/CHANGELOG.md +18 -0
- package/dist/bin/c4s/commands/find-references.d.ts +13 -0
- package/dist/bin/c4s/commands/find-references.js +81 -0
- package/dist/bin/c4s/commands/find-references.js.map +1 -0
- package/dist/bin/c4s.js +6 -0
- package/dist/bin/c4s.js.map +1 -1
- package/dist/client/assets/{arc-E0e7X_zn.js → arc-Bm0IE9-2.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-BzlqOVZv.js → architectureDiagram-3BPJPVTR-GJ4QxX0Q.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-BIQcApN7.js → blockDiagram-GPEHLZMM-C9rZbfxq.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CDU0V1yk.js → c4Diagram-AAUBKEIU-DyVuHGeV.js} +1 -1
- package/dist/client/assets/channel-BGn39mc8.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-PtDSwC5f.js → chunk-2J33WTMH-DePzEFC8.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-DTUPWrSO.js → chunk-4BX2VUAB-NZkVFx6P.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-Cpd59xZT.js → chunk-55IACEB6-DSelTsfa.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-C4DOvpJT.js → chunk-727SXJPM-Vk_bMeuW.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CtjeHPBB.js → chunk-AQP2D5EJ-Bv_5j6lW.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-CZA3OvVr.js → chunk-FMBD7UC4-CIwy6WRQ.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-Cbx6nQHm.js → chunk-ND2GUHAM-C-7ZR2Kw.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-3DunELI_.js → chunk-QZHKN3VN-D2pOGWp9.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DZ5eaGnY.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DZ5eaGnY.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-CKYJnuL7.js → cose-bilkent-S5V4N54A-NgRxSzcd.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BrvRwrr_.js → dagre-BM42HDAG-kwaDBrFq.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-BaVLuzcD.js → diagram-2AECGRRQ-B5OMokEe.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-9Cu7Wa7J.js → diagram-5GNKFQAL-9h9Lsrr_.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-XKiCVdjO.js → diagram-KO2AKTUF-DcNC4jPN.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-DerecU5v.js → diagram-LMA3HP47-D41zybvJ.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-BWcREvZ9.js → diagram-OG6HWLK6-D12dQiCG.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-DU3BBQJY.js → erDiagram-TEJ5UH35-brqTv2OJ.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-DXO_IJeR.js → flowDiagram-I6XJVG4X-D6q2xyWg.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CXiFZEPx.js → ganttDiagram-6RSMTGT7-DlH9o0CJ.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DHewdln-.js → gitGraphDiagram-PVQCEYII-CgNLFhAT.js} +1 -1
- package/dist/client/assets/{index-DT5g2AtL.js → index-C-gTQA-n.js} +1 -1
- package/dist/client/assets/{index-DD0GkjkG.js → index-DDRzJojo.js} +1 -1
- package/dist/client/assets/{index-BTXWIk4x.css → index-DirDnayu.css} +1 -1
- package/dist/client/assets/{index-DcIG_8JB.js → index-qO9stCkx.js} +189 -179
- package/dist/client/assets/{infoDiagram-5YYISTIA-CN40PAGW.js → infoDiagram-5YYISTIA-ThuQNCvi.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B8KsyuPk.js → ishikawaDiagram-YF4QCWOH-m-2DHbkK.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-BlEb3E_P.js → journeyDiagram-JHISSGLW-CNCSJPeY.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-B080CGS9.js → kanban-definition-UN3LZRKU-CtzjrW3p.js} +1 -1
- package/dist/client/assets/{linear-D6Tg-IET.js → linear-BF1Qhpjc.js} +1 -1
- package/dist/client/assets/{mermaid.core-DP18nW3T.js → mermaid.core-fKaK1Sz_.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-bfo7Qm5I.js → mindmap-definition-RKZ34NQL-CXuVRuzz.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-ZsPztPu6.js → pieDiagram-4H26LBE5-DdL9uKdO.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DKrTleIL.js → quadrantDiagram-W4KKPZXB-C_0FG9xH.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-D4YX8ZgG.js → requirementDiagram-4Y6WPE33-Qmg8C7k6.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Bo-xm6Mc.js → sankeyDiagram-5OEKKPKP-DuIvgSjA.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CozgdKp6.js → sequenceDiagram-3UESZ5HK-B4JsFW9i.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CiK61MwV.js → stateDiagram-AJRCARHV-lTFw6Md4.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-D2iiMzxh.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-CgHoguI7.js → timeline-definition-PNZ67QCA-C7Hc5KbB.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-TY32dxQb.js → vennDiagram-CIIHVFJN-DMyGzBh7.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-C6Q7VFwH.js → wardley-L42UT6IY-BjA5T0YY.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-nZLnVsQL.js → wardleyDiagram-YWT4CUSO-BhOipIZG.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DHdYRHEr.js → xychartDiagram-2RQKCTM6-Czx4--PM.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/core/references/find-references.d.ts +13 -0
- package/dist/core/references/find-references.js +41 -0
- package/dist/core/references/find-references.js.map +1 -0
- package/dist/core/references/index.d.ts +2 -0
- package/dist/core/references/index.js +2 -0
- package/dist/core/references/index.js.map +1 -0
- package/dist/core/references/types.d.ts +45 -0
- package/dist/core/references/types.js +9 -0
- package/dist/core/references/types.js.map +1 -0
- package/dist/server/config.d.ts +9 -0
- package/dist/server/config.js +6 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/core/plugin-host/entities-router.d.ts +2 -1
- package/dist/server/core/plugin-host/entities-router.js +19 -13
- package/dist/server/core/plugin-host/entities-router.js.map +1 -1
- package/dist/server/core/plugin-host/host.js +4 -9
- package/dist/server/core/plugin-host/host.js.map +1 -1
- package/dist/server/core/plugin-host/types.d.ts +9 -14
- package/dist/server/db/migrations/035_m29_slug_identity.sql +248 -0
- package/dist/server/domain/raw-entity-reader.d.ts +3 -5
- package/dist/server/domain/raw-entity-reader.js +28 -39
- package/dist/server/domain/raw-entity-reader.js.map +1 -1
- package/dist/server/entities/ac/ac-analysis.service.d.ts +54 -0
- package/dist/server/entities/ac/ac-analysis.service.js +162 -0
- package/dist/server/entities/ac/ac-analysis.service.js.map +1 -0
- package/dist/server/entities/ac/mcp-server.d.ts +8 -0
- package/dist/server/entities/ac/mcp-server.js +30 -2
- package/dist/server/entities/ac/mcp-server.js.map +1 -1
- package/dist/server/entities/ac/plugin.js +4 -2
- package/dist/server/entities/ac/plugin.js.map +1 -1
- package/dist/server/entities/ac/serializer.js +1 -1
- package/dist/server/entities/ac/serializer.js.map +1 -1
- package/dist/server/entities/ac/services.d.ts +19 -7
- package/dist/server/entities/ac/services.js +65 -42
- package/dist/server/entities/ac/services.js.map +1 -1
- package/dist/server/entities/database-table/plugin.js +1 -2
- package/dist/server/entities/database-table/plugin.js.map +1 -1
- package/dist/server/entities/database-table/serializer.js +1 -1
- package/dist/server/entities/database-table/serializer.js.map +1 -1
- package/dist/server/entities/database-table/services.d.ts +19 -7
- package/dist/server/entities/database-table/services.js +74 -47
- package/dist/server/entities/database-table/services.js.map +1 -1
- package/dist/server/entities/dto/plugin.js +1 -2
- package/dist/server/entities/dto/plugin.js.map +1 -1
- package/dist/server/entities/dto/serializer.js +2 -2
- package/dist/server/entities/dto/serializer.js.map +1 -1
- package/dist/server/entities/dto/services.d.ts +19 -7
- package/dist/server/entities/dto/services.js +70 -47
- package/dist/server/entities/dto/services.js.map +1 -1
- package/dist/server/entities/endpoint/plugin.js +1 -2
- package/dist/server/entities/endpoint/plugin.js.map +1 -1
- package/dist/server/entities/endpoint/serializer.js +4 -4
- package/dist/server/entities/endpoint/serializer.js.map +1 -1
- package/dist/server/entities/endpoint/services.d.ts +21 -9
- package/dist/server/entities/endpoint/services.js +91 -63
- package/dist/server/entities/endpoint/services.js.map +1 -1
- package/dist/server/entities/mutate-opts.d.ts +15 -0
- package/dist/server/entities/mutate-opts.js +2 -0
- package/dist/server/entities/mutate-opts.js.map +1 -0
- package/dist/server/entities/ui-view/plugin.js +1 -2
- package/dist/server/entities/ui-view/plugin.js.map +1 -1
- package/dist/server/entities/ui-view/serializer.js +1 -1
- package/dist/server/entities/ui-view/serializer.js.map +1 -1
- package/dist/server/entities/ui-view/services.d.ts +19 -7
- package/dist/server/entities/ui-view/services.js +65 -42
- package/dist/server/entities/ui-view/services.js.map +1 -1
- package/dist/server/fs/entities-watcher.d.ts +31 -0
- package/dist/server/fs/entities-watcher.js +68 -0
- package/dist/server/fs/entities-watcher.js.map +1 -0
- package/dist/server/fs/watcher.js +7 -1
- package/dist/server/fs/watcher.js.map +1 -1
- package/dist/server/index.js +112 -6
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/reference-tools.d.ts +3 -0
- package/dist/server/mcp/reference-tools.js +25 -161
- package/dist/server/mcp/reference-tools.js.map +1 -1
- package/dist/server/routes/static.d.ts +11 -0
- package/dist/server/routes/static.js +44 -0
- package/dist/server/routes/static.js.map +1 -0
- package/dist/server/services/entity-indexer.d.ts +42 -0
- package/dist/server/services/entity-indexer.js +179 -0
- package/dist/server/services/entity-indexer.js.map +1 -0
- package/dist/server/services/entity-store.d.ts +68 -0
- package/dist/server/services/entity-store.js +162 -0
- package/dist/server/services/entity-store.js.map +1 -0
- package/dist/server/services/entity-writer.d.ts +12 -1
- package/dist/server/services/entity-writer.js +22 -11
- package/dist/server/services/entity-writer.js.map +1 -1
- package/dist/server/services/git.js +6 -1
- package/dist/server/services/git.js.map +1 -1
- package/dist/server/services/pages.js +5 -1
- package/dist/server/services/pages.js.map +1 -1
- package/dist/server/services/references.d.ts +25 -0
- package/dist/server/services/references.js +102 -21
- package/dist/server/services/references.js.map +1 -1
- package/dist/server/services/release.d.ts +10 -10
- package/dist/server/services/release.js +32 -63
- package/dist/server/services/release.js.map +1 -1
- package/dist/server/services/section-indexer.d.ts +0 -1
- package/dist/server/services/section-indexer.js +5 -7
- package/dist/server/services/section-indexer.js.map +1 -1
- package/dist/server/services/skill-registry.d.ts +28 -1
- package/dist/server/services/skill-registry.js +51 -10
- package/dist/server/services/skill-registry.js.map +1 -1
- package/dist/server/services/static-html.d.ts +24 -0
- package/dist/server/services/static-html.js +49 -0
- package/dist/server/services/static-html.js.map +1 -0
- package/dist/server/services/tags.d.ts +13 -3
- package/dist/server/services/tags.js +65 -26
- package/dist/server/services/tags.js.map +1 -1
- package/dist/server/services/versions.d.ts +7 -7
- package/dist/server/services/versions.js +34 -37
- package/dist/server/services/versions.js.map +1 -1
- package/dist/shared/entities.d.ts +2 -2
- package/dist/shared/types.d.ts +9 -0
- package/dist/shared/xml-tags.d.ts +8 -0
- package/dist/shared/xml-tags.js +24 -0
- package/dist/shared/xml-tags.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/channel-BqjILLUr.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-LjT84-kK.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-LjT84-kK.js +0 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C6-8M5Sb.js +0 -1
- 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
|
-
|
|
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
|
-
|
|
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',
|
|
32
|
-
const created = this.
|
|
33
|
-
|
|
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
|
-
|
|
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
|
-
|
|
53
|
-
SELECT et.
|
|
54
|
-
|
|
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
|
-
|
|
63
|
-
SELECT et.
|
|
69
|
+
slug IN (
|
|
70
|
+
SELECT et.entity_slug
|
|
64
71
|
FROM entity_tag et
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
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
|
|
112
|
-
.run(nextSlug, nextName, nextUrl, input.description !== undefined ? input.description : current.description, nextParams,
|
|
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',
|
|
115
|
-
const updated = this.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
151
|
-
.run(
|
|
152
|
-
this.db.prepare(`DELETE FROM ui_view WHERE
|
|
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
|
-
|
|
175
|
+
const result = tx();
|
|
176
|
+
if (opts.writeFile !== false)
|
|
177
|
+
this.store.remove('ui-view', slug);
|
|
178
|
+
return result;
|
|
156
179
|
}
|
|
157
|
-
|
|
158
|
-
const row = this.db.prepare(`SELECT * FROM ui_view WHERE
|
|
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
|
|
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.
|
|
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
|
-
|
|
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":"AAAA,OAAO,QAA4B,MAAM,UAAU,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,MAAM,OAAO,YAAY;IAMH;IAA2B;IALvC,OAAO,GAAqB,IAAI,CAAC;IACjC,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjC,kBAAkB,GAAG,GAAG,CAAC;IAClC,SAAS,GAA2B,EAAE,CAAC;IAE/C,YAAoB,SAAiB,EAAU,OAAkB;QAA7C,cAAS,GAAT,SAAS,CAAQ;QAAU,YAAO,GAAP,OAAO,CAAW;IAAG,CAAC;IAErE,QAAQ,CAAC,EAAwB;QAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;YAC5C,aAAa,EAAE,IAAI;YACnB,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;IAED;;;;;OAKG;IACH,eAAe,CAAC,OAAe;QAC7B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrG,CAAC;IAEO,IAAI,CAAC,IAAe,EAAE,OAAe;QAC3C,IAAI,
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/server/fs/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,QAA4B,MAAM,UAAU,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,MAAM,OAAO,YAAY;IAMH;IAA2B;IALvC,OAAO,GAAqB,IAAI,CAAC;IACjC,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjC,kBAAkB,GAAG,GAAG,CAAC;IAClC,SAAS,GAA2B,EAAE,CAAC;IAE/C,YAAoB,SAAiB,EAAU,OAAkB;QAA7C,cAAS,GAAT,SAAS,CAAQ;QAAU,YAAO,GAAP,OAAO,CAAW;IAAG,CAAC;IAErE,QAAQ,CAAC,EAAwB;QAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;YAC5C,aAAa,EAAE,IAAI;YACnB,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;IAED;;;;;OAKG;IACH,eAAe,CAAC,OAAe;QAC7B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrG,CAAC;IAEO,IAAI,CAAC,IAAe,EAAE,OAAe;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrC,0FAA0F;QAC1F,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjF,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,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACjG,6FAA6F;QAC7F,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,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,2BAA2B,EAAE,GAAG,CAAC,CAAC;YAClD,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"}
|
package/dist/server/index.js
CHANGED
|
@@ -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,
|
|
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(
|
|
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
|
|
480
|
-
// the supplied MountContext. Inactive plugins are skipped
|
|
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();
|