@pukujan/create-modular-monolith 2.0.0 → 2.2.0

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 (97) hide show
  1. package/README.md +94 -23
  2. package/index.js +47 -0
  3. package/package.json +16 -19
  4. package/template/.cursor/commands/planning-study-log.md +25 -0
  5. package/template/.cursor/commands/pre-push-dev-log.md +52 -0
  6. package/template/.cursor/rules/api-documentation.mdc +21 -0
  7. package/template/.cursor/rules/file-exchange-inbox.mdc +29 -0
  8. package/template/.github/workflows/ci.yml +44 -0
  9. package/template/AGENTS.md +41 -0
  10. package/template/README.md +25 -55
  11. package/template/backend/.env.example +38 -0
  12. package/template/backend/package-lock.json +1118 -24
  13. package/template/backend/package.json +14 -4
  14. package/template/backend/scripts/check-module-boundaries.mjs +3 -0
  15. package/template/backend/src/modules/model-condenser/README.md +7 -0
  16. package/template/backend/src/modules/model-condenser/config/index.js +20 -0
  17. package/template/backend/src/modules/model-condenser/events/index.js +1 -0
  18. package/template/backend/src/modules/model-condenser/index.js +12 -0
  19. package/template/backend/src/modules/model-condenser/routes/health.routes.js +10 -0
  20. package/template/backend/src/modules/model-condenser/routes/index.js +10 -0
  21. package/template/backend/src/modules/model-condenser/routes/modelCondenser.routes.js +44 -0
  22. package/template/backend/src/modules/model-condenser/services/health.service.js +8 -0
  23. package/template/backend/src/modules/model-condenser/services/modelCondenser.facade.js +58 -0
  24. package/template/backend/src/modules/model-condenser/services/modelCondenser.service.js +513 -0
  25. package/template/backend/src/modules/model-condenser/tests/integration/modelCondenser.routes.test.js +40 -0
  26. package/template/backend/src/modules/model-condenser/tests/unit/modelCondenser.service.test.js +31 -0
  27. package/template/backend/src/modules/model-condenser/utils/index.js +1 -0
  28. package/template/backend/src/shared/contracts/consolidatedExports.contract.js +19 -0
  29. package/template/backend/src/shared/contracts/prePushDevLog.contract.js +28 -0
  30. package/template/backend/src/shared/domain/case-filing/core-models.js +117 -0
  31. package/template/backend/src/shared/http/errors.js +8 -0
  32. package/template/backend/src/shared/utils/consolidatedExport.js +30 -0
  33. package/template/backend/src/shared/utils/formatExchangeTimestamp.js +47 -0
  34. package/template/backend/src/shared/utils/formatExchangeTimestamp.test.js +30 -0
  35. package/template/backend/src/shared/utils/traceId.js +19 -0
  36. package/template/docs/API.md +42 -0
  37. package/template/docs/PUBLISHING.md +13 -1
  38. package/template/docs/README.md +7 -1
  39. package/template/docs/STARTER_PACK.md +4 -0
  40. package/template/docs/architecture/API_DOCUMENTATION_CONTRACT.md +112 -0
  41. package/template/docs/architecture/CONTRACTS_OVERVIEW.md +180 -0
  42. package/template/docs/architecture/EVAL_AND_CI.md +79 -0
  43. package/template/docs/architecture/MODULE_INTERNAL_CONTRACT.md +2 -0
  44. package/template/docs/architecture/PLATFORM_ARCHITECTURE.md +221 -0
  45. package/template/docs/architecture/REPO_ARTIFACT_LAYOUT.md +33 -0
  46. package/template/docs/architecture/contracts/apiDocumentationRegistry.contract.md +40 -0
  47. package/template/docs/architecture/contracts/changelog.jsonl +12 -0
  48. package/template/docs/architecture/contracts/consolidatedExports.contract.md +58 -0
  49. package/template/docs/architecture/contracts/fileExchange.contract.md +47 -0
  50. package/template/docs/architecture/contracts/manifest.json +39 -0
  51. package/template/docs/architecture/contracts/prePushDevLog.contract.md +69 -0
  52. package/template/docs/model-condenser/API.md +102 -0
  53. package/template/file-exchange/README.md +41 -0
  54. package/template/file-exchange/exports/.gitkeep +0 -0
  55. package/template/file-exchange/exports/consolidated-models.json +625 -0
  56. package/template/file-exchange/imports/.gitkeep +0 -0
  57. package/template/frontend/.env.example +2 -0
  58. package/template/frontend/package-lock.json +125 -122
  59. package/template/frontend/package.json +1 -1
  60. package/template/frontend/src/index.css +311 -0
  61. package/template/frontend/src/modules/_reference/services/health-api.js +1 -1
  62. package/template/frontend/src/shared/api/client.js +67 -5
  63. package/template/models/.gitkeep +0 -0
  64. package/template/package.json +13 -4
  65. package/template/scripts/check-api-docs.mjs +183 -0
  66. package/template/scripts/condense-file-structure.mjs +44 -0
  67. package/template/scripts/condense-models.mjs +70 -0
  68. package/template/scripts/condense-prompts.mjs +161 -0
  69. package/template/scripts/consolidated-output.mjs +49 -0
  70. package/template/scripts/export-consolidated-models.mjs +11 -0
  71. package/template/scripts/git-hooks/pre-push.sample +15 -0
  72. package/template/scripts/import-to-file-exchange.mjs +43 -0
  73. package/template/scripts/lib/api-inventory.mjs +182 -0
  74. package/template/scripts/lib/dev-log-human-format.mjs +360 -0
  75. package/template/scripts/lib/git-snapshot.mjs +46 -0
  76. package/template/scripts/lib/module-scaffold.mjs +37 -1
  77. package/template/scripts/lib/repo-tree.mjs +127 -0
  78. package/template/scripts/lib/run-tests.mjs +60 -0
  79. package/template/scripts/lint-contracts.mjs +57 -0
  80. package/template/scripts/lint-repo-artifacts.mjs +37 -0
  81. package/template/scripts/new-module.mjs +7 -0
  82. package/template/scripts/resolve-import-stamp.mjs +50 -0
  83. package/template/scripts/verify-dev-log.mjs +50 -0
  84. package/template/scripts/write-pre-push-dev-log.mjs +220 -0
  85. package/template/work-log/INDEX.md +3 -0
  86. package/template/work-log/README.md +40 -0
  87. package/template/work-log/dev-logs/README.md +97 -0
  88. package/template/work-log/dev-logs/schemas/dev-log-agent.v1.schema.json +119 -0
  89. package/template/work-log/dev-logs/templates/dev-log-human.template.md +10 -0
  90. package/template/work-log/handoffs/README.md +36 -0
  91. package/template/work-log/study-docs/README.md +13 -0
  92. package/bin/create-modular-monolith.js +0 -132
  93. package/template/backend/src/modules/_reference/evals/README.md +0 -6
  94. package/template/backend/src/modules/_reference/evals/datasets/example.cases.json +0 -12
  95. package/template/backend/src/modules/_reference/evals/runners/example.eval.mjs +0 -25
  96. package/template/scripts/sync-cli-template.mjs +0 -44
  97. /package/template/{frontend/src/modules → backend/db/migrations}/.gitkeep +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "modular-monolith-starter-backend",
2
+ "name": "legal-prmpt-eng-backend",
3
3
  "private": true,
4
4
  "version": "1.0.0",
5
5
  "type": "module",
@@ -8,13 +8,23 @@
8
8
  "start": "node src/core/server.js",
9
9
  "lint:boundaries": "node scripts/check-module-boundaries.mjs",
10
10
  "lint:layers": "node scripts/check-module-layers.mjs",
11
- "lint:architecture": "npm run lint:boundaries && npm run lint:layers",
11
+ "lint:api-docs": "node ../scripts/check-api-docs.mjs",
12
+ "lint:architecture": "npm run lint:boundaries && npm run lint:layers && npm run lint:api-docs",
12
13
  "test": "node --test 'src/modules/**/tests/**/*.test.js'",
14
+ "condense-models": "node ../scripts/condense-models.mjs",
15
+ "condense-prompts": "node ../scripts/condense-prompts.mjs",
16
+ "condense-file-structure": "node ../scripts/condense-file-structure.mjs",
13
17
  "test:evals": "node ../scripts/run-module-evals.mjs"
14
18
  },
15
19
  "dependencies": {
20
+ "@napi-rs/canvas": "^1.0.0",
16
21
  "cors": "^2.8.5",
17
22
  "dotenv": "^16.4.5",
18
- "express": "^4.19.2"
23
+ "express": "^4.19.2",
24
+ "mammoth": "^1.12.0",
25
+ "multer": "^2.1.1",
26
+ "pdf-parse": "^2.4.5",
27
+ "pdfjs-dist": "^4.10.38",
28
+ "word-extractor": "^1.0.4"
19
29
  }
20
- }
30
+ }
@@ -22,6 +22,9 @@ for (const app of apps) {
22
22
  .map((d) => d.name);
23
23
 
24
24
  for (const moduleName of moduleNames) {
25
+ // model-condenser embeds repo path strings in schema inventory metadata only (no imports).
26
+ if (moduleName === "model-condenser") continue;
27
+
25
28
  const moduleRoot = join(modulesDir, moduleName);
26
29
  const files = walk(moduleRoot).filter((f) =>
27
30
  [".js", ".mjs", ".jsx"].some((ext) => f.endsWith(ext))
@@ -0,0 +1,7 @@
1
+ # Model condenser
2
+
3
+ Scans the repo and writes `models/consolidated-models.json` (JSON schema inventory).
4
+
5
+ **HTTP API:** [docs/model-condenser/API.md](../../../docs/model-condenser/API.md) · [All modules](../../../docs/API.md)
6
+
7
+ **CLI:** `npm run condense-models` (from `backend/`)
@@ -0,0 +1,20 @@
1
+ import { join } from "path";
2
+ import { fileURLToPath } from "url";
3
+
4
+ const repoRoot = join(fileURLToPath(new URL(".", import.meta.url)), "../../../../..");
5
+
6
+ export function getModuleConfig() {
7
+ const modelsDir =
8
+ process.env.MODEL_CONDENSER_OUTPUT_DIR || join(repoRoot, "models");
9
+ return {
10
+ name: "model-condenser",
11
+ label: "Model Condenser",
12
+ repoRoot,
13
+ modelsDir,
14
+ consolidatedFileName:
15
+ process.env.MODEL_CONDENSER_OUTPUT_FILE || "consolidated-models.json"
16
+ };
17
+ }
18
+
19
+ /** @deprecated Prefer getModuleConfig() */
20
+ export const moduleConfig = getModuleConfig();
@@ -0,0 +1 @@
1
+ export function registerModuleEvents(_context) {}
@@ -0,0 +1,12 @@
1
+ import { createModuleRouter } from "./routes/index.js";
2
+ import { registerModuleEvents } from "./events/index.js";
3
+ import { getModuleConfig } from "./config/index.js";
4
+ import { createModelCondenserFacade } from "./services/modelCondenser.facade.js";
5
+
6
+ export function register(app, context) {
7
+ const config = getModuleConfig();
8
+ const modelCondenser = createModelCondenserFacade({ config });
9
+ const router = createModuleRouter({ config, modelCondenser });
10
+ app.use("/api/model-condenser", router);
11
+ registerModuleEvents(context);
12
+ }
@@ -0,0 +1,10 @@
1
+ import { Router } from "express";
2
+ import { getHealth } from "../services/health.service.js";
3
+
4
+ export function createHealthRoutes({ config }) {
5
+ const router = Router();
6
+ router.get("/health", (_req, res) => {
7
+ res.json(getHealth(config));
8
+ });
9
+ return router;
10
+ }
@@ -0,0 +1,10 @@
1
+ import { Router } from "express";
2
+ import { createHealthRoutes } from "./health.routes.js";
3
+ import { createModelCondenserRoutes } from "./modelCondenser.routes.js";
4
+
5
+ export function createModuleRouter({ config, modelCondenser }) {
6
+ const router = Router();
7
+ router.use(createHealthRoutes({ config }));
8
+ router.use(createModelCondenserRoutes({ config, modelCondenser }));
9
+ return router;
10
+ }
@@ -0,0 +1,44 @@
1
+ import { Router } from "express";
2
+ import { AppError } from "../../../shared/http/errors.js";
3
+
4
+ export function createModelCondenserRoutes({ config, modelCondenser }) {
5
+ const router = Router();
6
+
7
+ router.post("/condense", async (req, res, next) => {
8
+ try {
9
+ const includePayload = Boolean(req.body?.includePayload);
10
+ const result = await modelCondenser.condense({
11
+ includePayload
12
+ });
13
+ res.status(201).json(result);
14
+ } catch (error) {
15
+ next(error);
16
+ }
17
+ });
18
+
19
+ router.get("/consolidated", async (req, res, next) => {
20
+ try {
21
+ const includePayload = req.query.includePayload === "true";
22
+ const summary = await modelCondenser.getStatus();
23
+
24
+ if (!summary.exists) {
25
+ throw new AppError(
26
+ "Consolidated models file not found. POST /api/model-condenser/condense first.",
27
+ 404
28
+ );
29
+ }
30
+
31
+ if (!includePayload) {
32
+ res.json(summary);
33
+ return;
34
+ }
35
+
36
+ const consolidated = await modelCondenser.readConsolidated();
37
+ res.json({ ...summary, consolidated });
38
+ } catch (error) {
39
+ next(error);
40
+ }
41
+ });
42
+
43
+ return router;
44
+ }
@@ -0,0 +1,8 @@
1
+ export function getHealth(config) {
2
+ return {
3
+ status: "ok",
4
+ module: config.name,
5
+ label: config.label,
6
+ outputRelativePath: `models/${config.consolidatedFileName}`
7
+ };
8
+ }
@@ -0,0 +1,58 @@
1
+ import { access } from "fs/promises";
2
+ import { join } from "path";
3
+ import {
4
+ buildConsolidatedModels,
5
+ condenseModels,
6
+ readConsolidatedModels
7
+ } from "./modelCondenser.service.js";
8
+
9
+ export function createModelCondenserFacade({ config }) {
10
+ async function condense({ includePayload = false } = {}) {
11
+ return condenseModels({
12
+ repoRoot: config.repoRoot,
13
+ modelsDir: config.modelsDir,
14
+ consolidatedFileName: config.consolidatedFileName,
15
+ includePayload
16
+ });
17
+ }
18
+
19
+ async function readConsolidated() {
20
+ return readConsolidatedModels({
21
+ modelsDir: config.modelsDir,
22
+ consolidatedFileName: config.consolidatedFileName
23
+ });
24
+ }
25
+
26
+ async function getStatus() {
27
+ const outputPath = join(config.modelsDir, config.consolidatedFileName);
28
+ let exists = false;
29
+ let generatedAt = null;
30
+ let modelCount = null;
31
+
32
+ try {
33
+ await access(outputPath);
34
+ exists = true;
35
+ const data = await readConsolidated();
36
+ generatedAt = data.meta?.generatedAt ?? null;
37
+ modelCount = data.inventory?.length ?? null;
38
+ } catch {
39
+ exists = false;
40
+ }
41
+
42
+ return {
43
+ status: exists ? "ready" : "missing",
44
+ exists,
45
+ outputPath,
46
+ outputRelativePath: `models/${config.consolidatedFileName}`,
47
+ generatedAt,
48
+ modelCount
49
+ };
50
+ }
51
+
52
+ return {
53
+ condense,
54
+ readConsolidated,
55
+ getStatus,
56
+ buildConsolidatedModels: () => buildConsolidatedModels({ repoRoot: config.repoRoot })
57
+ };
58
+ }