@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.
- package/README.md +94 -23
- package/index.js +47 -0
- package/package.json +16 -19
- package/template/.cursor/commands/planning-study-log.md +25 -0
- package/template/.cursor/commands/pre-push-dev-log.md +52 -0
- package/template/.cursor/rules/api-documentation.mdc +21 -0
- package/template/.cursor/rules/file-exchange-inbox.mdc +29 -0
- package/template/.github/workflows/ci.yml +44 -0
- package/template/AGENTS.md +41 -0
- package/template/README.md +25 -55
- package/template/backend/.env.example +38 -0
- package/template/backend/package-lock.json +1118 -24
- package/template/backend/package.json +14 -4
- package/template/backend/scripts/check-module-boundaries.mjs +3 -0
- package/template/backend/src/modules/model-condenser/README.md +7 -0
- package/template/backend/src/modules/model-condenser/config/index.js +20 -0
- package/template/backend/src/modules/model-condenser/events/index.js +1 -0
- package/template/backend/src/modules/model-condenser/index.js +12 -0
- package/template/backend/src/modules/model-condenser/routes/health.routes.js +10 -0
- package/template/backend/src/modules/model-condenser/routes/index.js +10 -0
- package/template/backend/src/modules/model-condenser/routes/modelCondenser.routes.js +44 -0
- package/template/backend/src/modules/model-condenser/services/health.service.js +8 -0
- package/template/backend/src/modules/model-condenser/services/modelCondenser.facade.js +58 -0
- package/template/backend/src/modules/model-condenser/services/modelCondenser.service.js +513 -0
- package/template/backend/src/modules/model-condenser/tests/integration/modelCondenser.routes.test.js +40 -0
- package/template/backend/src/modules/model-condenser/tests/unit/modelCondenser.service.test.js +31 -0
- package/template/backend/src/modules/model-condenser/utils/index.js +1 -0
- package/template/backend/src/shared/contracts/consolidatedExports.contract.js +19 -0
- package/template/backend/src/shared/contracts/prePushDevLog.contract.js +28 -0
- package/template/backend/src/shared/domain/case-filing/core-models.js +117 -0
- package/template/backend/src/shared/http/errors.js +8 -0
- package/template/backend/src/shared/utils/consolidatedExport.js +30 -0
- package/template/backend/src/shared/utils/formatExchangeTimestamp.js +47 -0
- package/template/backend/src/shared/utils/formatExchangeTimestamp.test.js +30 -0
- package/template/backend/src/shared/utils/traceId.js +19 -0
- package/template/docs/API.md +42 -0
- package/template/docs/PUBLISHING.md +13 -1
- package/template/docs/README.md +7 -1
- package/template/docs/STARTER_PACK.md +4 -0
- package/template/docs/architecture/API_DOCUMENTATION_CONTRACT.md +112 -0
- package/template/docs/architecture/CONTRACTS_OVERVIEW.md +180 -0
- package/template/docs/architecture/EVAL_AND_CI.md +79 -0
- package/template/docs/architecture/MODULE_INTERNAL_CONTRACT.md +2 -0
- package/template/docs/architecture/PLATFORM_ARCHITECTURE.md +221 -0
- package/template/docs/architecture/REPO_ARTIFACT_LAYOUT.md +33 -0
- package/template/docs/architecture/contracts/apiDocumentationRegistry.contract.md +40 -0
- package/template/docs/architecture/contracts/changelog.jsonl +12 -0
- package/template/docs/architecture/contracts/consolidatedExports.contract.md +58 -0
- package/template/docs/architecture/contracts/fileExchange.contract.md +47 -0
- package/template/docs/architecture/contracts/manifest.json +39 -0
- package/template/docs/architecture/contracts/prePushDevLog.contract.md +69 -0
- package/template/docs/model-condenser/API.md +102 -0
- package/template/file-exchange/README.md +41 -0
- package/template/file-exchange/exports/.gitkeep +0 -0
- package/template/file-exchange/exports/consolidated-models.json +625 -0
- package/template/file-exchange/imports/.gitkeep +0 -0
- package/template/frontend/.env.example +2 -0
- package/template/frontend/package-lock.json +125 -122
- package/template/frontend/package.json +1 -1
- package/template/frontend/src/index.css +311 -0
- package/template/frontend/src/modules/_reference/services/health-api.js +1 -1
- package/template/frontend/src/shared/api/client.js +67 -5
- package/template/models/.gitkeep +0 -0
- package/template/package.json +13 -4
- package/template/scripts/check-api-docs.mjs +183 -0
- package/template/scripts/condense-file-structure.mjs +44 -0
- package/template/scripts/condense-models.mjs +70 -0
- package/template/scripts/condense-prompts.mjs +161 -0
- package/template/scripts/consolidated-output.mjs +49 -0
- package/template/scripts/export-consolidated-models.mjs +11 -0
- package/template/scripts/git-hooks/pre-push.sample +15 -0
- package/template/scripts/import-to-file-exchange.mjs +43 -0
- package/template/scripts/lib/api-inventory.mjs +182 -0
- package/template/scripts/lib/dev-log-human-format.mjs +360 -0
- package/template/scripts/lib/git-snapshot.mjs +46 -0
- package/template/scripts/lib/module-scaffold.mjs +37 -1
- package/template/scripts/lib/repo-tree.mjs +127 -0
- package/template/scripts/lib/run-tests.mjs +60 -0
- package/template/scripts/lint-contracts.mjs +57 -0
- package/template/scripts/lint-repo-artifacts.mjs +37 -0
- package/template/scripts/new-module.mjs +7 -0
- package/template/scripts/resolve-import-stamp.mjs +50 -0
- package/template/scripts/verify-dev-log.mjs +50 -0
- package/template/scripts/write-pre-push-dev-log.mjs +220 -0
- package/template/work-log/INDEX.md +3 -0
- package/template/work-log/README.md +40 -0
- package/template/work-log/dev-logs/README.md +97 -0
- package/template/work-log/dev-logs/schemas/dev-log-agent.v1.schema.json +119 -0
- package/template/work-log/dev-logs/templates/dev-log-human.template.md +10 -0
- package/template/work-log/handoffs/README.md +36 -0
- package/template/work-log/study-docs/README.md +13 -0
- package/bin/create-modular-monolith.js +0 -132
- package/template/backend/src/modules/_reference/evals/README.md +0 -6
- package/template/backend/src/modules/_reference/evals/datasets/example.cases.json +0 -12
- package/template/backend/src/modules/_reference/evals/runners/example.eval.mjs +0 -25
- package/template/scripts/sync-cli-template.mjs +0 -44
- /package/template/{frontend/src/modules → backend/db/migrations}/.gitkeep +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
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:
|
|
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,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
|
+
}
|