@autoview/cli 0.1.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/LICENSE +661 -0
- package/README.md +407 -0
- package/lib/AutoViewAgent.d.ts +109 -0
- package/lib/AutoViewAgent.js +123 -0
- package/lib/AutoViewAgent.js.map +1 -0
- package/lib/agent/emitMcpServer.d.ts +15 -0
- package/lib/agent/emitMcpServer.js +157 -0
- package/lib/agent/emitMcpServer.js.map +1 -0
- package/lib/agent/emitReport.d.ts +14 -0
- package/lib/agent/emitReport.js +85 -0
- package/lib/agent/emitReport.js.map +1 -0
- package/lib/agent/toolSurface.d.ts +130 -0
- package/lib/agent/toolSurface.js +342 -0
- package/lib/agent/toolSurface.js.map +1 -0
- package/lib/agent/verifyAgentTasks.d.ts +87 -0
- package/lib/agent/verifyAgentTasks.js +126 -0
- package/lib/agent/verifyAgentTasks.js.map +1 -0
- package/lib/cli/main.d.ts +2 -0
- package/lib/cli/main.js +295 -0
- package/lib/cli/main.js.map +1 -0
- package/lib/compiler/AutoViewInterfaceCompiler.d.ts +27 -0
- package/lib/compiler/AutoViewInterfaceCompiler.js +68 -0
- package/lib/compiler/AutoViewInterfaceCompiler.js.map +1 -0
- package/lib/constants/AutoViewFrontendTemplate.d.ts +1 -0
- package/lib/constants/AutoViewFrontendTemplate.js +46 -0
- package/lib/constants/AutoViewFrontendTemplate.js.map +1 -0
- package/lib/constants/AutoViewSystemPromptConstant.d.ts +5 -0
- package/lib/constants/AutoViewSystemPromptConstant.js +4 -0
- package/lib/constants/AutoViewSystemPromptConstant.js.map +1 -0
- package/lib/context/IAutoViewAgentContext.d.ts +60 -0
- package/lib/context/IAutoViewAgentContext.js +3 -0
- package/lib/context/IAutoViewAgentContext.js.map +1 -0
- package/lib/fromSwagger.d.ts +53 -0
- package/lib/fromSwagger.js +513 -0
- package/lib/fromSwagger.js.map +1 -0
- package/lib/generateDeterministic.d.ts +26 -0
- package/lib/generateDeterministic.js +75 -0
- package/lib/generateDeterministic.js.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.js +41 -0
- package/lib/index.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoView.d.ts +17 -0
- package/lib/orchestrate/orchestrateAutoView.js +491 -0
- package/lib/orchestrate/orchestrateAutoView.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewProductPlan.d.ts +37 -0
- package/lib/orchestrate/orchestrateAutoViewProductPlan.js +109 -0
- package/lib/orchestrate/orchestrateAutoViewProductPlan.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewRender.d.ts +133 -0
- package/lib/orchestrate/orchestrateAutoViewRender.js +943 -0
- package/lib/orchestrate/orchestrateAutoViewRender.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewRenderDeterministic.d.ts +24 -0
- package/lib/orchestrate/orchestrateAutoViewRenderDeterministic.js +92 -0
- package/lib/orchestrate/orchestrateAutoViewRenderDeterministic.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewReview.d.ts +48 -0
- package/lib/orchestrate/orchestrateAutoViewReview.js +328 -0
- package/lib/orchestrate/orchestrateAutoViewReview.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewScaffold.d.ts +45 -0
- package/lib/orchestrate/orchestrateAutoViewScaffold.js +586 -0
- package/lib/orchestrate/orchestrateAutoViewScaffold.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewSdkStudy.d.ts +26 -0
- package/lib/orchestrate/orchestrateAutoViewSdkStudy.js +85 -0
- package/lib/orchestrate/orchestrateAutoViewSdkStudy.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewProductPlan.d.ts +96 -0
- package/lib/orchestrate/structures/IAutoViewProductPlan.js +3 -0
- package/lib/orchestrate/structures/IAutoViewProductPlan.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewProductPlanApplication.d.ts +38 -0
- package/lib/orchestrate/structures/IAutoViewProductPlanApplication.js +3 -0
- package/lib/orchestrate/structures/IAutoViewProductPlanApplication.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewRenderApplication.d.ts +38 -0
- package/lib/orchestrate/structures/IAutoViewRenderApplication.js +3 -0
- package/lib/orchestrate/structures/IAutoViewRenderApplication.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewReviewApplication.d.ts +40 -0
- package/lib/orchestrate/structures/IAutoViewReviewApplication.js +3 -0
- package/lib/orchestrate/structures/IAutoViewReviewApplication.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewSdkMap.d.ts +63 -0
- package/lib/orchestrate/structures/IAutoViewSdkMap.js +3 -0
- package/lib/orchestrate/structures/IAutoViewSdkMap.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewSdkStudyApplication.d.ts +37 -0
- package/lib/orchestrate/structures/IAutoViewSdkStudyApplication.js +3 -0
- package/lib/orchestrate/structures/IAutoViewSdkStudyApplication.js.map +1 -0
- package/lib/orchestrate/utils/HistoryMessage.d.ts +10 -0
- package/lib/orchestrate/utils/HistoryMessage.js +25 -0
- package/lib/orchestrate/utils/HistoryMessage.js.map +1 -0
- package/lib/orchestrate/utils/auditFrontendRuntime.d.ts +53 -0
- package/lib/orchestrate/utils/auditFrontendRuntime.js +362 -0
- package/lib/orchestrate/utils/auditFrontendRuntime.js.map +1 -0
- package/lib/orchestrate/utils/buildDeterministicPlan.d.ts +4 -0
- package/lib/orchestrate/utils/buildDeterministicPlan.js +233 -0
- package/lib/orchestrate/utils/buildDeterministicPlan.js.map +1 -0
- package/lib/orchestrate/utils/buildDeterministicSdkMap.d.ts +22 -0
- package/lib/orchestrate/utils/buildDeterministicSdkMap.js +154 -0
- package/lib/orchestrate/utils/buildDeterministicSdkMap.js.map +1 -0
- package/lib/orchestrate/utils/cacheNodeModules.d.ts +31 -0
- package/lib/orchestrate/utils/cacheNodeModules.js +134 -0
- package/lib/orchestrate/utils/cacheNodeModules.js.map +1 -0
- package/lib/orchestrate/utils/describeEndpointPropsShape.d.ts +37 -0
- package/lib/orchestrate/utils/describeEndpointPropsShape.js +192 -0
- package/lib/orchestrate/utils/describeEndpointPropsShape.js.map +1 -0
- package/lib/orchestrate/utils/describeEndpointRequestBodyShape.d.ts +22 -0
- package/lib/orchestrate/utils/describeEndpointRequestBodyShape.js +29 -0
- package/lib/orchestrate/utils/describeEndpointRequestBodyShape.js.map +1 -0
- package/lib/orchestrate/utils/describeEndpointResponseShape.d.ts +19 -0
- package/lib/orchestrate/utils/describeEndpointResponseShape.js +30 -0
- package/lib/orchestrate/utils/describeEndpointResponseShape.js.map +1 -0
- package/lib/orchestrate/utils/executeCachedBatch.d.ts +22 -0
- package/lib/orchestrate/utils/executeCachedBatch.js +64 -0
- package/lib/orchestrate/utils/executeCachedBatch.js.map +1 -0
- package/lib/orchestrate/utils/loadShoppingFixture.d.ts +33 -0
- package/lib/orchestrate/utils/loadShoppingFixture.js +17 -0
- package/lib/orchestrate/utils/loadShoppingFixture.js.map +1 -0
- package/lib/orchestrate/utils/normalizeProductPlanPaths.d.ts +24 -0
- package/lib/orchestrate/utils/normalizeProductPlanPaths.js +77 -0
- package/lib/orchestrate/utils/normalizeProductPlanPaths.js.map +1 -0
- package/lib/orchestrate/utils/renderJsonSchema.d.ts +23 -0
- package/lib/orchestrate/utils/renderJsonSchema.js +122 -0
- package/lib/orchestrate/utils/renderJsonSchema.js.map +1 -0
- package/lib/orchestrate/utils/renderResourcePage.d.ts +36 -0
- package/lib/orchestrate/utils/renderResourcePage.js +1415 -0
- package/lib/orchestrate/utils/renderResourcePage.js.map +1 -0
- package/lib/orchestrate/utils/validateFrontendTypecheck.d.ts +109 -0
- package/lib/orchestrate/utils/validateFrontendTypecheck.js +274 -0
- package/lib/orchestrate/utils/validateFrontendTypecheck.js.map +1 -0
- package/lib/preview/renderPreview.d.ts +22 -0
- package/lib/preview/renderPreview.js +198 -0
- package/lib/preview/renderPreview.js.map +1 -0
- package/lib/typings/compiler.d.ts +39 -0
- package/lib/typings/compiler.js +3 -0
- package/lib/typings/compiler.js.map +1 -0
- package/lib/typings/events.d.ts +106 -0
- package/lib/typings/events.js +3 -0
- package/lib/typings/events.js.map +1 -0
- package/lib/typings/index.d.ts +10 -0
- package/lib/typings/index.js +27 -0
- package/lib/typings/index.js.map +1 -0
- package/lib/typings/misc.d.ts +78 -0
- package/lib/typings/misc.js +3 -0
- package/lib/typings/misc.js.map +1 -0
- package/lib/utils/ArrayUtil.d.ts +8 -0
- package/lib/utils/ArrayUtil.js +30 -0
- package/lib/utils/ArrayUtil.js.map +1 -0
- package/lib/utils/StringUtil.d.ts +11 -0
- package/lib/utils/StringUtil.js +28 -0
- package/lib/utils/StringUtil.js.map +1 -0
- package/lib/utils/classifyEndpoints.d.ts +62 -0
- package/lib/utils/classifyEndpoints.js +216 -0
- package/lib/utils/classifyEndpoints.js.map +1 -0
- package/lib/utils/endpointFilter.d.ts +26 -0
- package/lib/utils/endpointFilter.js +0 -0
- package/lib/utils/endpointFilter.js.map +1 -0
- package/lib/utils/extractFields.d.ts +85 -0
- package/lib/utils/extractFields.js +231 -0
- package/lib/utils/extractFields.js.map +1 -0
- package/lib/utils/index.d.ts +13 -0
- package/lib/utils/index.js +30 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/normalizeForNestia.d.ts +34 -0
- package/lib/utils/normalizeForNestia.js +133 -0
- package/lib/utils/normalizeForNestia.js.map +1 -0
- package/lib/utils/resourcePlan.d.ts +39 -0
- package/lib/utils/resourcePlan.js +95 -0
- package/lib/utils/resourcePlan.js.map +1 -0
- package/lib/utils/sliceDocument.d.ts +17 -0
- package/lib/utils/sliceDocument.js +114 -0
- package/lib/utils/sliceDocument.js.map +1 -0
- package/lib/utils/toEndpoints.d.ts +90 -0
- package/lib/utils/toEndpoints.js +227 -0
- package/lib/utils/toEndpoints.js.map +1 -0
- package/lib/verify/runWorkflows.d.ts +25 -0
- package/lib/verify/runWorkflows.js +366 -0
- package/lib/verify/runWorkflows.js.map +1 -0
- package/lib/verify/workflows.d.ts +53 -0
- package/lib/verify/workflows.js +107 -0
- package/lib/verify/workflows.js.map +1 -0
- package/package.json +82 -0
- package/prompts/AUTOVIEW_RENDER.md +398 -0
- package/prompts/AUTOVIEW_REVIEW.md +60 -0
- package/prompts/AUTOVIEW_SDK_STUDY.md +89 -0
- package/src/AutoViewAgent.ts +222 -0
- package/src/agent/emitMcpServer.integration.test.ts +168 -0
- package/src/agent/emitMcpServer.test.ts +51 -0
- package/src/agent/emitMcpServer.ts +178 -0
- package/src/agent/emitReport.ts +117 -0
- package/src/agent/toolSurface.test.ts +243 -0
- package/src/agent/toolSurface.ts +501 -0
- package/src/agent/verifyAgentTasks.test.ts +106 -0
- package/src/agent/verifyAgentTasks.ts +171 -0
- package/src/cli/main.ts +363 -0
- package/src/compiler/AutoViewInterfaceCompiler.ts +69 -0
- package/src/constants/AutoViewFrontendTemplate.ts +42 -0
- package/src/constants/AutoViewSystemPromptConstant.ts +6 -0
- package/src/context/IAutoViewAgentContext.ts +84 -0
- package/src/fromSwagger.test.ts +269 -0
- package/src/fromSwagger.ts +500 -0
- package/src/generateDeterministic.test.ts +39 -0
- package/src/generateDeterministic.ts +77 -0
- package/src/index.ts +30 -0
- package/src/orchestrate/orchestrateAutoView.ts +590 -0
- package/src/orchestrate/orchestrateAutoViewProductPlan.ts +121 -0
- package/src/orchestrate/orchestrateAutoViewRender.ts +1117 -0
- package/src/orchestrate/orchestrateAutoViewRenderDeterministic.ts +101 -0
- package/src/orchestrate/orchestrateAutoViewReview.ts +272 -0
- package/src/orchestrate/orchestrateAutoViewScaffold.ts +627 -0
- package/src/orchestrate/orchestrateAutoViewSdkStudy.ts +90 -0
- package/src/orchestrate/renderNavTs.test.ts +74 -0
- package/src/orchestrate/structures/IAutoViewProductPlan.ts +119 -0
- package/src/orchestrate/structures/IAutoViewProductPlanApplication.ts +41 -0
- package/src/orchestrate/structures/IAutoViewRenderApplication.ts +40 -0
- package/src/orchestrate/structures/IAutoViewReviewApplication.ts +42 -0
- package/src/orchestrate/structures/IAutoViewSdkMap.ts +72 -0
- package/src/orchestrate/structures/IAutoViewSdkStudyApplication.ts +40 -0
- package/src/orchestrate/utils/HistoryMessage.ts +41 -0
- package/src/orchestrate/utils/auditFrontendRuntime.test.ts +18 -0
- package/src/orchestrate/utils/auditFrontendRuntime.ts +454 -0
- package/src/orchestrate/utils/buildDeterministicPlan.test.ts +170 -0
- package/src/orchestrate/utils/buildDeterministicPlan.ts +289 -0
- package/src/orchestrate/utils/buildDeterministicSdkMap.test.ts +90 -0
- package/src/orchestrate/utils/buildDeterministicSdkMap.ts +169 -0
- package/src/orchestrate/utils/cacheNodeModules.ts +136 -0
- package/src/orchestrate/utils/describeEndpointPropsShape.test.ts +86 -0
- package/src/orchestrate/utils/describeEndpointPropsShape.ts +202 -0
- package/src/orchestrate/utils/describeEndpointRequestBodyShape.test.ts +87 -0
- package/src/orchestrate/utils/describeEndpointRequestBodyShape.ts +31 -0
- package/src/orchestrate/utils/describeEndpointResponseShape.test.ts +70 -0
- package/src/orchestrate/utils/describeEndpointResponseShape.ts +32 -0
- package/src/orchestrate/utils/executeCachedBatch.ts +59 -0
- package/src/orchestrate/utils/loadShoppingFixture.ts +52 -0
- package/src/orchestrate/utils/normalizeProductPlanPaths.ts +92 -0
- package/src/orchestrate/utils/renderJsonSchema.test.ts +162 -0
- package/src/orchestrate/utils/renderJsonSchema.ts +133 -0
- package/src/orchestrate/utils/renderResourcePage.test.ts +468 -0
- package/src/orchestrate/utils/renderResourcePage.ts +1624 -0
- package/src/orchestrate/utils/validateFrontendTypecheck.test.ts +32 -0
- package/src/orchestrate/utils/validateFrontendTypecheck.ts +335 -0
- package/src/preview/renderPreview.ts +273 -0
- package/src/typings/compiler.ts +47 -0
- package/src/typings/events.ts +155 -0
- package/src/typings/index.ts +10 -0
- package/src/typings/misc.ts +93 -0
- package/src/utils/ArrayUtil.ts +16 -0
- package/src/utils/StringUtil.ts +29 -0
- package/src/utils/classifyEndpoints.test.ts +86 -0
- package/src/utils/classifyEndpoints.ts +291 -0
- package/src/utils/endpointFilter.test.ts +50 -0
- package/src/utils/endpointFilter.ts +0 -0
- package/src/utils/extractFields.test.ts +82 -0
- package/src/utils/extractFields.ts +306 -0
- package/src/utils/index.ts +13 -0
- package/src/utils/normalizeForNestia.test.ts +93 -0
- package/src/utils/normalizeForNestia.ts +139 -0
- package/src/utils/resourcePlan.test.ts +104 -0
- package/src/utils/resourcePlan.ts +180 -0
- package/src/utils/sliceDocument.test.ts +85 -0
- package/src/utils/sliceDocument.ts +119 -0
- package/src/utils/toEndpoints.test.ts +251 -0
- package/src/utils/toEndpoints.ts +343 -0
- package/src/verify/runWorkflows.ts +403 -0
- package/src/verify/workflows.test.ts +117 -0
- package/src/verify/workflows.ts +154 -0
- package/template/CLAUDE.md +140 -0
- package/template/Dockerfile +31 -0
- package/template/PROMPT.md +80 -0
- package/template/SANDBOX.md +70 -0
- package/template/app/api/health/route.ts +10 -0
- package/template/app/globals.css +97 -0
- package/template/app/layout.tsx +30 -0
- package/template/app/page.tsx +19 -0
- package/template/components/AppShell.tsx +114 -0
- package/template/components/auto/CatalogGrid.tsx +159 -0
- package/template/components/auto/ConfirmButton.tsx +67 -0
- package/template/components/auto/EmbeddedCollection.tsx +144 -0
- package/template/components/auto/ResourceDashboard.tsx +104 -0
- package/template/components/auto/ResourceDetail.tsx +93 -0
- package/template/components/auto/ResourceForm.tsx +235 -0
- package/template/components/auto/ResourceIcon.tsx +88 -0
- package/template/components/auto/ResourceLanding.tsx +155 -0
- package/template/components/auto/ResourceTable.tsx +223 -0
- package/template/components/auto/formatValue.tsx +186 -0
- package/template/components/auto/types.ts +42 -0
- package/template/components/ui/badge.tsx +40 -0
- package/template/components/ui/button.tsx +57 -0
- package/template/components/ui/card.tsx +86 -0
- package/template/components/ui/dialog.tsx +119 -0
- package/template/components/ui/input.tsx +23 -0
- package/template/components/ui/label.tsx +24 -0
- package/template/components/ui/pagination.tsx +117 -0
- package/template/components/ui/select.tsx +92 -0
- package/template/components/ui/sheet.tsx +135 -0
- package/template/components/ui/skeleton.tsx +15 -0
- package/template/components/ui/table.tsx +120 -0
- package/template/components/ui/tabs.tsx +55 -0
- package/template/lib/utils.ts +35 -0
- package/template/next.config.mjs +52 -0
- package/template/package.json +46 -0
- package/template/postcss.config.js +6 -0
- package/template/scripts/start-shopping-backend.sh +56 -0
- package/template/tailwind.config.ts +96 -0
- package/template/tsconfig.json +29 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.auditFrontendRuntime = auditFrontendRuntime;
|
|
16
|
+
const child_process_1 = require("child_process");
|
|
17
|
+
const crypto_1 = require("crypto");
|
|
18
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
19
|
+
const net_1 = require("net");
|
|
20
|
+
const os_1 = __importDefault(require("os"));
|
|
21
|
+
const path_1 = __importDefault(require("path"));
|
|
22
|
+
const cacheNodeModules_1 = require("./cacheNodeModules");
|
|
23
|
+
const PLAYWRIGHT_DEP = "playwright@^1.50.0";
|
|
24
|
+
const NEXT_DEV_BOOT_TIMEOUT_MS = 90000;
|
|
25
|
+
const PAGE_VISIT_TIMEOUT_MS = 20000;
|
|
26
|
+
const PAGE_SETTLE_MS = 2500;
|
|
27
|
+
/**
|
|
28
|
+
* Boot the assembled frontend under `next dev`, launch a headless Chromium via
|
|
29
|
+
* Playwright, visit every screen the product plan declared, and return the
|
|
30
|
+
* per-page console / pageerror / navigation diagnostics. Used by the
|
|
31
|
+
* orchestrator as Phase 6 (runtime audit) — the layer above `tsc --noEmit` that
|
|
32
|
+
* catches errors typecheck cannot see (`obj?.array.method(...)`
|
|
33
|
+
* undefined-access patterns, missing client-only guards, react render
|
|
34
|
+
* crashes).
|
|
35
|
+
*
|
|
36
|
+
* Operates in `NEXT_PUBLIC_API_SIMULATE=true` so the audit does not require a
|
|
37
|
+
* live backend — the SDK serves typia-random fixture data and pages exercise
|
|
38
|
+
* their real render paths. Live-backend variants can be added later by
|
|
39
|
+
* threading the host through.
|
|
40
|
+
*
|
|
41
|
+
* Throws on infrastructure failure (`npm install` crashed, port allocation
|
|
42
|
+
* failed, Chromium download blocked). Runtime errors on the pages themselves
|
|
43
|
+
* are returned as data; the whole point of this gate is to surface them.
|
|
44
|
+
*/
|
|
45
|
+
function auditFrontendRuntime(files, pages) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
const startedAt = Date.now();
|
|
48
|
+
const tempDir = yield promises_1.default.mkdtemp(path_1.default.join(os_1.default.tmpdir(), "autoview-runtime-audit-"));
|
|
49
|
+
let nextDev = null;
|
|
50
|
+
try {
|
|
51
|
+
yield writeFiles(tempDir, files);
|
|
52
|
+
const packageJson = files["package.json"];
|
|
53
|
+
const hash = packageJson !== undefined
|
|
54
|
+
? (0, crypto_1.createHash)("sha256").update(packageJson).digest("hex").slice(0, 16)
|
|
55
|
+
: "no-package-json";
|
|
56
|
+
const cachedNodeModules = packageJson !== undefined
|
|
57
|
+
? yield (0, cacheNodeModules_1.ensureCachedNodeModules)({
|
|
58
|
+
cacheNamespace: "runtime-audit",
|
|
59
|
+
hash,
|
|
60
|
+
packageJson,
|
|
61
|
+
extraDeps: [PLAYWRIGHT_DEP],
|
|
62
|
+
})
|
|
63
|
+
: null;
|
|
64
|
+
if (cachedNodeModules !== null) {
|
|
65
|
+
const linked = yield (0, cacheNodeModules_1.tryLinkNodeModules)(tempDir, cachedNodeModules);
|
|
66
|
+
if (!linked) {
|
|
67
|
+
yield installDependencies(tempDir);
|
|
68
|
+
yield installPlaywright(tempDir);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
yield installDependencies(tempDir);
|
|
73
|
+
yield installPlaywright(tempDir);
|
|
74
|
+
}
|
|
75
|
+
yield installChromium(tempDir);
|
|
76
|
+
const port = yield getFreePort();
|
|
77
|
+
nextDev = yield startNextDev(tempDir, port);
|
|
78
|
+
const baseUrl = `http://127.0.0.1:${port}`;
|
|
79
|
+
yield writeFile(tempDir, "scripts/.audit-runner.cjs", buildRunnerScript());
|
|
80
|
+
const stdout = yield spawnCommand("node", [
|
|
81
|
+
path_1.default.join(tempDir, "scripts", ".audit-runner.cjs"),
|
|
82
|
+
JSON.stringify(pages),
|
|
83
|
+
baseUrl,
|
|
84
|
+
String(PAGE_VISIT_TIMEOUT_MS),
|
|
85
|
+
String(PAGE_SETTLE_MS),
|
|
86
|
+
], { cwd: tempDir });
|
|
87
|
+
const diagnostics = parseRunnerOutput(stdout);
|
|
88
|
+
const byPage = groupByPage(diagnostics);
|
|
89
|
+
return {
|
|
90
|
+
diagnostics,
|
|
91
|
+
byPage,
|
|
92
|
+
visited: [...pages],
|
|
93
|
+
markdown: renderMarkdownReport(diagnostics, byPage, pages),
|
|
94
|
+
elapsedMs: Date.now() - startedAt,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
if (nextDev !== null)
|
|
99
|
+
yield killNextDev(nextDev);
|
|
100
|
+
yield promises_1.default.rm(tempDir, { recursive: true, force: true }).catch(() => { });
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/* -------------------------------------------------------------------------- */
|
|
105
|
+
/* fs */
|
|
106
|
+
/* -------------------------------------------------------------------------- */
|
|
107
|
+
function writeFiles(root, files) {
|
|
108
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
for (const [relative, content] of Object.entries(files)) {
|
|
110
|
+
yield writeFile(root, relative, content);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function writeFile(root, relative, content) {
|
|
115
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
+
const full = path_1.default.join(root, relative);
|
|
117
|
+
yield promises_1.default.mkdir(path_1.default.dirname(full), { recursive: true });
|
|
118
|
+
yield promises_1.default.writeFile(full, content, "utf-8");
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/* -------------------------------------------------------------------------- */
|
|
122
|
+
/* install */
|
|
123
|
+
/* -------------------------------------------------------------------------- */
|
|
124
|
+
function installDependencies(root) {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
yield spawnCommand("npm", ["install", "--silent", "--no-audit", "--no-fund"], { cwd: root });
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
function installPlaywright(root) {
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
yield spawnCommand("npm", [
|
|
132
|
+
"install",
|
|
133
|
+
"--silent",
|
|
134
|
+
"--no-audit",
|
|
135
|
+
"--no-fund",
|
|
136
|
+
"--no-save",
|
|
137
|
+
"playwright@^1.50.0",
|
|
138
|
+
], { cwd: root });
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function installChromium(root) {
|
|
142
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
143
|
+
yield spawnCommand(path_1.default.join(root, "node_modules", ".bin", "playwright"), ["install", "chromium"], { cwd: root });
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/* -------------------------------------------------------------------------- */
|
|
147
|
+
/* next dev */
|
|
148
|
+
/* -------------------------------------------------------------------------- */
|
|
149
|
+
function getFreePort() {
|
|
150
|
+
return new Promise((resolve, reject) => {
|
|
151
|
+
const server = (0, net_1.createServer)();
|
|
152
|
+
server.listen(0, "127.0.0.1", () => {
|
|
153
|
+
const addr = server.address();
|
|
154
|
+
if (addr === null || typeof addr === "string") {
|
|
155
|
+
server.close();
|
|
156
|
+
reject(new Error("Failed to allocate a free port"));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const port = addr.port;
|
|
160
|
+
server.close(() => resolve(port));
|
|
161
|
+
});
|
|
162
|
+
server.on("error", reject);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function startNextDev(root, port) {
|
|
166
|
+
return new Promise((resolve, reject) => {
|
|
167
|
+
var _a, _b;
|
|
168
|
+
const child = (0, child_process_1.spawn)("node", [path_1.default.join(root, "node_modules", "next", "dist", "bin", "next"), "dev"], {
|
|
169
|
+
cwd: root,
|
|
170
|
+
env: Object.assign(Object.assign({}, process.env), { PORT: String(port), NEXT_PUBLIC_API_SIMULATE: "true",
|
|
171
|
+
// Force literal Authorization header so the SDK does not crash
|
|
172
|
+
// when bootstrapAuth is a no-op in simulator mode.
|
|
173
|
+
NEXT_PUBLIC_API_TOKEN: "Bearer preview" }),
|
|
174
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
175
|
+
});
|
|
176
|
+
let buffer = "";
|
|
177
|
+
let settled = false;
|
|
178
|
+
const onData = (chunk) => {
|
|
179
|
+
var _a, _b;
|
|
180
|
+
buffer += chunk.toString("utf-8");
|
|
181
|
+
if (!settled && buffer.includes("Ready in")) {
|
|
182
|
+
settled = true;
|
|
183
|
+
(_a = child.stdout) === null || _a === void 0 ? void 0 : _a.off("data", onData);
|
|
184
|
+
(_b = child.stderr) === null || _b === void 0 ? void 0 : _b.off("data", onData);
|
|
185
|
+
resolve(child);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
(_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on("data", onData);
|
|
189
|
+
(_b = child.stderr) === null || _b === void 0 ? void 0 : _b.on("data", onData);
|
|
190
|
+
const timer = setTimeout(() => {
|
|
191
|
+
if (settled)
|
|
192
|
+
return;
|
|
193
|
+
settled = true;
|
|
194
|
+
child.kill("SIGTERM");
|
|
195
|
+
reject(new Error(`next dev did not become ready within ${NEXT_DEV_BOOT_TIMEOUT_MS}ms:\n${buffer.slice(-1000)}`));
|
|
196
|
+
}, NEXT_DEV_BOOT_TIMEOUT_MS);
|
|
197
|
+
child.on("exit", (code) => {
|
|
198
|
+
clearTimeout(timer);
|
|
199
|
+
if (settled)
|
|
200
|
+
return;
|
|
201
|
+
settled = true;
|
|
202
|
+
reject(new Error(`next dev exited with code ${code} before becoming ready:\n${buffer.slice(-1000)}`));
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
function killNextDev(child) {
|
|
207
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
208
|
+
if (child.exitCode !== null)
|
|
209
|
+
return;
|
|
210
|
+
child.kill("SIGTERM");
|
|
211
|
+
yield new Promise((r) => setTimeout(r, 1500));
|
|
212
|
+
if (child.exitCode === null)
|
|
213
|
+
child.kill("SIGKILL");
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/* -------------------------------------------------------------------------- */
|
|
217
|
+
/* runner script (executed inside the temp dir, requires installed playwright) */
|
|
218
|
+
/* -------------------------------------------------------------------------- */
|
|
219
|
+
function buildRunnerScript() {
|
|
220
|
+
// CommonJS so the temp dir does not need to be ESM-aware. Reads pages +
|
|
221
|
+
// baseUrl + timeouts from argv, emits a JSON array of `{ pagePath, type,
|
|
222
|
+
// message }` to stdout. Failures during navigation become `navigation`
|
|
223
|
+
// diagnostics so the caller never silently misses a broken page.
|
|
224
|
+
return `"use strict";
|
|
225
|
+
const { chromium } = require("playwright");
|
|
226
|
+
|
|
227
|
+
(async () => {
|
|
228
|
+
const pages = JSON.parse(process.argv[2]);
|
|
229
|
+
const baseUrl = process.argv[3];
|
|
230
|
+
const visitTimeout = parseInt(process.argv[4], 10);
|
|
231
|
+
const settleMs = parseInt(process.argv[5], 10);
|
|
232
|
+
const browser = await chromium.launch();
|
|
233
|
+
const context = await browser.newContext({
|
|
234
|
+
viewport: { width: 1280, height: 800 },
|
|
235
|
+
});
|
|
236
|
+
const diagnostics = [];
|
|
237
|
+
for (const pagePath of pages) {
|
|
238
|
+
const resolved = pagePath.replace(/\\[[^\\]]+\\]/g, "demo");
|
|
239
|
+
const url = baseUrl + (resolved.startsWith("/") ? resolved : "/" + resolved);
|
|
240
|
+
const page = await context.newPage();
|
|
241
|
+
const pageErrors = [];
|
|
242
|
+
page.on("console", (msg) => {
|
|
243
|
+
if (msg.type() === "error") {
|
|
244
|
+
pageErrors.push({ pagePath, type: "console", message: msg.text() });
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
page.on("pageerror", (err) => {
|
|
248
|
+
pageErrors.push({ pagePath, type: "pageerror", message: err.message });
|
|
249
|
+
});
|
|
250
|
+
try {
|
|
251
|
+
// \`domcontentloaded\` instead of \`networkidle\` because typia random
|
|
252
|
+
// simulator data keeps the SDK firing background requests indefinitely
|
|
253
|
+
// on data-heavy pages — \`networkidle\` then times out at 20s on a
|
|
254
|
+
// page that already rendered cleanly. DOMContentLoaded plus the
|
|
255
|
+
// explicit settle window catches the same render errors without
|
|
256
|
+
// mistaking simulator chatter for a broken page.
|
|
257
|
+
await page.goto(url, {
|
|
258
|
+
waitUntil: "domcontentloaded",
|
|
259
|
+
timeout: visitTimeout,
|
|
260
|
+
});
|
|
261
|
+
await page.waitForTimeout(settleMs);
|
|
262
|
+
} catch (err) {
|
|
263
|
+
const message = err && err.message ? err.message : String(err);
|
|
264
|
+
pageErrors.push({ pagePath, type: "navigation", message });
|
|
265
|
+
}
|
|
266
|
+
for (const d of pageErrors) diagnostics.push(d);
|
|
267
|
+
await page.close().catch(() => {});
|
|
268
|
+
}
|
|
269
|
+
await browser.close().catch(() => {});
|
|
270
|
+
process.stdout.write(JSON.stringify(diagnostics));
|
|
271
|
+
})().catch((err) => {
|
|
272
|
+
process.stderr.write(err && err.stack ? err.stack : String(err));
|
|
273
|
+
process.exit(1);
|
|
274
|
+
});
|
|
275
|
+
`;
|
|
276
|
+
}
|
|
277
|
+
function parseRunnerOutput(stdout) {
|
|
278
|
+
const trimmed = stdout.trim();
|
|
279
|
+
if (trimmed.length === 0)
|
|
280
|
+
return [];
|
|
281
|
+
try {
|
|
282
|
+
const parsed = JSON.parse(trimmed);
|
|
283
|
+
if (!Array.isArray(parsed))
|
|
284
|
+
return [];
|
|
285
|
+
return parsed.filter((entry) => entry !== null &&
|
|
286
|
+
typeof entry === "object" &&
|
|
287
|
+
typeof entry.pagePath === "string" &&
|
|
288
|
+
typeof entry.message === "string" &&
|
|
289
|
+
entry.type !== undefined);
|
|
290
|
+
}
|
|
291
|
+
catch (_a) {
|
|
292
|
+
return [];
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
function groupByPage(diagnostics) {
|
|
296
|
+
const map = new Map();
|
|
297
|
+
for (const d of diagnostics) {
|
|
298
|
+
const bucket = map.get(d.pagePath);
|
|
299
|
+
if (bucket === undefined)
|
|
300
|
+
map.set(d.pagePath, [d]);
|
|
301
|
+
else
|
|
302
|
+
bucket.push(d);
|
|
303
|
+
}
|
|
304
|
+
return map;
|
|
305
|
+
}
|
|
306
|
+
function renderMarkdownReport(diagnostics, byPage, pages) {
|
|
307
|
+
if (diagnostics.length === 0) {
|
|
308
|
+
return [
|
|
309
|
+
"# Runtime audit",
|
|
310
|
+
"",
|
|
311
|
+
`Visited **${pages.length}** page(s) under \`next dev\` (simulator mode).`,
|
|
312
|
+
"No console errors, page errors, or navigation failures detected.",
|
|
313
|
+
"",
|
|
314
|
+
].join("\n");
|
|
315
|
+
}
|
|
316
|
+
const head = [
|
|
317
|
+
"# Runtime audit",
|
|
318
|
+
"",
|
|
319
|
+
`Visited **${pages.length}** page(s) under \`next dev\` (simulator mode).`,
|
|
320
|
+
`Detected **${diagnostics.length}** diagnostic(s) across **${byPage.size}** page(s).`,
|
|
321
|
+
"",
|
|
322
|
+
];
|
|
323
|
+
const sections = [...byPage.entries()]
|
|
324
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
325
|
+
.map(([pagePath, items]) => {
|
|
326
|
+
const lines = items.map((d) => `- \`${d.type}\` — ${escape(d.message)}`);
|
|
327
|
+
return [`## \`${pagePath}\` (${items.length})`, "", ...lines, ""].join("\n");
|
|
328
|
+
});
|
|
329
|
+
return [...head, ...sections].join("\n");
|
|
330
|
+
}
|
|
331
|
+
function escape(message) {
|
|
332
|
+
return message.replace(/`/g, "\\`").replace(/\n+/g, " ").slice(0, 500);
|
|
333
|
+
}
|
|
334
|
+
/* -------------------------------------------------------------------------- */
|
|
335
|
+
/* spawn */
|
|
336
|
+
/* -------------------------------------------------------------------------- */
|
|
337
|
+
function spawnCommand(cmd, args, options) {
|
|
338
|
+
return new Promise((resolve, reject) => {
|
|
339
|
+
const child = (0, child_process_1.spawn)(cmd, args, { cwd: options.cwd, stdio: "pipe" });
|
|
340
|
+
let stdout = "";
|
|
341
|
+
let stderr = "";
|
|
342
|
+
child.stdout.on("data", (chunk) => {
|
|
343
|
+
stdout += chunk.toString("utf-8");
|
|
344
|
+
});
|
|
345
|
+
child.stderr.on("data", (chunk) => {
|
|
346
|
+
stderr += chunk.toString("utf-8");
|
|
347
|
+
});
|
|
348
|
+
child.on("error", (err) => {
|
|
349
|
+
reject(new Error(`Failed to spawn \`${cmd} ${args.join(" ")}\`: ${err.message}`));
|
|
350
|
+
});
|
|
351
|
+
child.on("close", (code) => {
|
|
352
|
+
if (code === 0) {
|
|
353
|
+
resolve(stdout);
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
reject(new Error(`\`${cmd} ${args.slice(0, 3).join(" ")}...\` exited with code ${code}` +
|
|
357
|
+
(stderr.length > 0 ? `:\n${stderr.slice(-1500)}` : "")));
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=auditFrontendRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditFrontendRuntime.js","sourceRoot":"","sources":["../../../src/orchestrate/utils/auditFrontendRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { OpenApi } from "@typia/interface";
|
|
2
|
+
import { IEndpointFilter } from "../../utils";
|
|
3
|
+
import { IAutoViewProductPlan } from "../structures/IAutoViewProductPlan";
|
|
4
|
+
export declare function buildDeterministicPlan(document: OpenApi.IDocument, actor: string, filter?: IEndpointFilter): IAutoViewProductPlan;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildDeterministicPlan = buildDeterministicPlan;
|
|
4
|
+
const utils_1 = require("../../utils");
|
|
5
|
+
const renderResourcePage_1 = require("./renderResourcePage");
|
|
6
|
+
/**
|
|
7
|
+
* Deterministic Product Plan — the LLM ProductPlan's replacement.
|
|
8
|
+
*
|
|
9
|
+
* The old Phase 2 asked an LLM to invent an information architecture from a
|
|
10
|
+
* commerce-baked prompt: non-reproducible, domain-locked, no CRUD completeness.
|
|
11
|
+
* This builds the exact same {@link IAutoViewProductPlan} shape the Scaffold /
|
|
12
|
+
* Render phases consume, but structurally — from {@link resourcePlan}. Same
|
|
13
|
+
* swagger always yields the same screens; every resource that exposes a
|
|
14
|
+
* capability gets its screen; nothing is invented.
|
|
15
|
+
*
|
|
16
|
+
* Actors are not modeled yet (the READ layer dropped `authorizationActor` when
|
|
17
|
+
* it went swagger-native), so every screen is assigned the single `actor`
|
|
18
|
+
* passed in. Multi-actor navigation is a follow-up that restores per-endpoint
|
|
19
|
+
* actor tagging.
|
|
20
|
+
*/
|
|
21
|
+
const UI_PATTERN = {
|
|
22
|
+
list: "table",
|
|
23
|
+
detail: "detail",
|
|
24
|
+
create: "form",
|
|
25
|
+
edit: "form",
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* A "top-level" screen earns a spot in the landing hub + primary nav: a list
|
|
29
|
+
* table, a catalog, or a singleton read (a bracket-less detail page like
|
|
30
|
+
* `/system`). Entity-detail / create / edit pages — which carry a `[param]` and
|
|
31
|
+
* are reached from a list — do not.
|
|
32
|
+
*/
|
|
33
|
+
function isTopLevel(screen) {
|
|
34
|
+
// A landing card is a TOP-LEVEL resource (chain depth 1). Depth ≥ 2 — a nested
|
|
35
|
+
// resource (`/sales/[saleId]/questions`) OR a param-less sub-view
|
|
36
|
+
// (`/sales/details`, `/channels/hierarchical`) — is reached from its parent,
|
|
37
|
+
// never the home hub. Using the structural depth, not a `[` heuristic, keeps
|
|
38
|
+
// bracket-less nested paths off the hub.
|
|
39
|
+
if (screen.depth !== undefined && screen.depth !== 1)
|
|
40
|
+
return false;
|
|
41
|
+
if (screen.path.includes("["))
|
|
42
|
+
return false;
|
|
43
|
+
return (screen.uiPattern === "table" ||
|
|
44
|
+
screen.uiPattern === "catalog" ||
|
|
45
|
+
screen.uiPattern === "detail");
|
|
46
|
+
}
|
|
47
|
+
/** Humanize a snake_case resource name for prose: `file_version_legal_holds`
|
|
48
|
+
* → `file version legal holds`. Keeps it lower-case for mid-sentence use. */
|
|
49
|
+
function humanizeResource(resource) {
|
|
50
|
+
return resource.replace(/_/g, " ").trim();
|
|
51
|
+
}
|
|
52
|
+
function purposeOf(screen) {
|
|
53
|
+
const name = humanizeResource(screen.resource);
|
|
54
|
+
switch (screen.kind) {
|
|
55
|
+
case "list":
|
|
56
|
+
return `Browse and search ${name}.`;
|
|
57
|
+
case "detail":
|
|
58
|
+
return `View one ${name} and act on it.`;
|
|
59
|
+
case "create":
|
|
60
|
+
return `Create a new ${name}.`;
|
|
61
|
+
case "edit":
|
|
62
|
+
return `Edit an existing ${name}.`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function notesOf(screen) {
|
|
66
|
+
switch (screen.kind) {
|
|
67
|
+
case "list":
|
|
68
|
+
return screen.secondary.some((c) => c.role === "search")
|
|
69
|
+
? "Includes search/filter; rows link to the detail screen."
|
|
70
|
+
: "Rows link to the detail screen.";
|
|
71
|
+
case "detail":
|
|
72
|
+
return "Surfaces update / delete / action endpoints as buttons.";
|
|
73
|
+
case "create":
|
|
74
|
+
return "Render a form from the request-body schema; submit creates.";
|
|
75
|
+
case "edit":
|
|
76
|
+
return "Render a form from the request-body schema, prefilled from detail.";
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function accessorsOf(screen) {
|
|
80
|
+
return [
|
|
81
|
+
screen.primary.accessor.join("."),
|
|
82
|
+
...screen.secondary.map((c) => c.endpoint.accessor.join(".")),
|
|
83
|
+
].filter((a, i, arr) => a.length > 0 && arr.indexOf(a) === i);
|
|
84
|
+
}
|
|
85
|
+
function classifyListResponse(op, document) {
|
|
86
|
+
if (op === undefined || (op.responseBody === null && op.responseSchema === null))
|
|
87
|
+
return "void";
|
|
88
|
+
// Use the SAME collection detection the table renderer uses, so a response is
|
|
89
|
+
// classed browsable iff a real row collection (incl. resource-named / inline
|
|
90
|
+
// wrappers, DigitalOcean) can actually be rendered as a table.
|
|
91
|
+
if ((0, renderResourcePage_1.responseCollection)(op, document) !== null)
|
|
92
|
+
return "browsable";
|
|
93
|
+
return op.method.toLowerCase() === "get" ? "singleton-read" : "action";
|
|
94
|
+
}
|
|
95
|
+
function buildDeterministicPlan(document, actor, filter = {}) {
|
|
96
|
+
var _a, _b, _c;
|
|
97
|
+
const endpoints = (0, utils_1.filterEndpoints)((0, utils_1.toEndpoints)(document), filter);
|
|
98
|
+
const planned = (0, utils_1.resourcePlan)(endpoints, document);
|
|
99
|
+
const byAccessor = new Map(endpoints.map((e) => [e.accessor.join("."), e]));
|
|
100
|
+
const noiseOmissions = [];
|
|
101
|
+
const resourceScreens = [];
|
|
102
|
+
for (const s of planned) {
|
|
103
|
+
const screen = {
|
|
104
|
+
path: s.path,
|
|
105
|
+
title: s.title,
|
|
106
|
+
purpose: purposeOf(s),
|
|
107
|
+
actor,
|
|
108
|
+
endpoints: accessorsOf(s),
|
|
109
|
+
uiPattern: UI_PATTERN[s.kind],
|
|
110
|
+
notes: notesOf(s),
|
|
111
|
+
depth: s.depth,
|
|
112
|
+
};
|
|
113
|
+
// A table screen must have a browsable response, or it is noise. Downgrade
|
|
114
|
+
// singleton reads to detail views; omit voids and action verbs.
|
|
115
|
+
if (screen.uiPattern === "table") {
|
|
116
|
+
const op = byAccessor.get(s.primary.accessor.join("."));
|
|
117
|
+
const cls = classifyListResponse(op, document);
|
|
118
|
+
if (cls === "void" || cls === "action") {
|
|
119
|
+
noiseOmissions.push({
|
|
120
|
+
target: `${(_a = op === null || op === void 0 ? void 0 : op.method.toUpperCase()) !== null && _a !== void 0 ? _a : "?"} ${(_b = op === null || op === void 0 ? void 0 : op.path) !== null && _b !== void 0 ? _b : s.path}`,
|
|
121
|
+
reason: cls === "void"
|
|
122
|
+
? "No response body to display."
|
|
123
|
+
: "Action endpoint (single object from a mutating verb) — not a browsable list.",
|
|
124
|
+
});
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (cls === "singleton-read") {
|
|
128
|
+
resourceScreens.push(Object.assign(Object.assign({}, screen), { uiPattern: "detail", purpose: `View ${humanizeResource(s.resource)}.`, notes: "Singleton read — one record, not a list." }));
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// Browsable: a collection whose rows carry an image + a title reads far
|
|
132
|
+
// better as a catalog of cards than a dense table. Purely structural —
|
|
133
|
+
// the element schema decides, no domain keywords.
|
|
134
|
+
const collection = op ? (0, renderResourcePage_1.responseCollection)(op, document) : null;
|
|
135
|
+
if (collection !== null && (0, utils_1.isCatalogCollection)(collection.columns)) {
|
|
136
|
+
resourceScreens.push(Object.assign(Object.assign({}, screen), { uiPattern: "catalog", notes: "Image + title rows — rendered as a card catalog." }));
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
resourceScreens.push(screen);
|
|
141
|
+
}
|
|
142
|
+
// Drop write-only resources. A browse app shows data, so a resource that has
|
|
143
|
+
// no list / detail / search screen at all — only a create/update form or an
|
|
144
|
+
// RPC verb (OAuth2 `token`/`revoke`, a `metadata_query/execute_read`) — is
|
|
145
|
+
// pure nav noise: a lone form seated next to real resources in the primary
|
|
146
|
+
// nav. Omit it (auditably) so a large swagger's sidebar shows browsable
|
|
147
|
+
// resources, not every endpoint.
|
|
148
|
+
const resourceKeyOf = (p) => { var _a; return (_a = p.split("/").filter((s) => s.length > 0 && !s.startsWith("[")).at(0)) !== null && _a !== void 0 ? _a : p; };
|
|
149
|
+
const resourceHasRead = new Map();
|
|
150
|
+
for (const s of resourceScreens) {
|
|
151
|
+
const key = resourceKeyOf(s.path);
|
|
152
|
+
const isRead = s.uiPattern === "table" || s.uiPattern === "detail";
|
|
153
|
+
resourceHasRead.set(key, ((_c = resourceHasRead.get(key)) !== null && _c !== void 0 ? _c : false) || isRead);
|
|
154
|
+
}
|
|
155
|
+
const browsableScreens = resourceScreens
|
|
156
|
+
.filter((s) => resourceHasRead.get(resourceKeyOf(s.path)) === true)
|
|
157
|
+
// Alphabetical by path so a large swagger's sidebar is scannable (same
|
|
158
|
+
// resource's pages stay grouped: /x, /x/[id], /x/[id]/edit, /x/new).
|
|
159
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
160
|
+
for (const s of resourceScreens) {
|
|
161
|
+
if (resourceHasRead.get(resourceKeyOf(s.path)) === true)
|
|
162
|
+
continue;
|
|
163
|
+
for (const accessor of s.endpoints) {
|
|
164
|
+
const op = byAccessor.get(accessor);
|
|
165
|
+
noiseOmissions.push({
|
|
166
|
+
target: op ? `${op.method.toUpperCase()} ${op.path}` : s.path,
|
|
167
|
+
reason: "Write-only resource (no list/detail/search to browse) — omitted from the UI as nav noise.",
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Root landing hub. Without an explicit `/` screen the dev server shows the
|
|
172
|
+
// template's "not customized yet" placeholder; this links to each resource's
|
|
173
|
+
// list and fetches nothing of its own.
|
|
174
|
+
const home = {
|
|
175
|
+
path: "/",
|
|
176
|
+
title: "Home",
|
|
177
|
+
purpose: "Landing hub linking to each resource.",
|
|
178
|
+
actor,
|
|
179
|
+
endpoints: [],
|
|
180
|
+
uiPattern: "landing",
|
|
181
|
+
notes: "Links to each resource's list screen; no data fetch of its own.",
|
|
182
|
+
};
|
|
183
|
+
const screens = [home, ...browsableScreens];
|
|
184
|
+
// Single-actor navigation: home + every top-level screen leads the primary
|
|
185
|
+
// nav. "Top-level" = a list table or a singleton read (a bracket-less detail
|
|
186
|
+
// page like `/system`); entity-detail / create / edit pages (which carry a
|
|
187
|
+
// `[param]` or are reached from a list) go to secondary.
|
|
188
|
+
const topLevelPaths = browsableScreens
|
|
189
|
+
.filter((s) => isTopLevel(s))
|
|
190
|
+
.map((s) => s.path);
|
|
191
|
+
const secondary = browsableScreens
|
|
192
|
+
.filter((s) => !isTopLevel(s))
|
|
193
|
+
.map((s) => s.path);
|
|
194
|
+
const navigation = [
|
|
195
|
+
{ actor, primary: ["/", ...topLevelPaths], secondary },
|
|
196
|
+
];
|
|
197
|
+
// Operations the READ layer could not turn into a screen — surfaced as
|
|
198
|
+
// honest omissions instead of vanishing. Noise screens (auth/monitoring verbs)
|
|
199
|
+
// removed above are reported here too, so "omitted, not broken" stays auditable.
|
|
200
|
+
const intentionalOmissions = [
|
|
201
|
+
...noiseOmissions,
|
|
202
|
+
...(0, utils_1.unsupportedOperations)(document).map((u) => ({
|
|
203
|
+
target: `${u.method} ${u.path}`,
|
|
204
|
+
reason: `Unsupported content type — ${u.reason}`,
|
|
205
|
+
})),
|
|
206
|
+
];
|
|
207
|
+
// Integrity backstop — "정확하게 읽는다" rule #1: nothing the READ layer parsed
|
|
208
|
+
// may silently vanish. Every operation must be referenced by some screen
|
|
209
|
+
// (primary or secondary) or appear in an omission. Anything left over (a
|
|
210
|
+
// second create on a resource that already had one, a deeply nested
|
|
211
|
+
// delete with no detail to host it, an auth verb that did not classify) is
|
|
212
|
+
// recorded here so coverage is total and auditable rather than lossy.
|
|
213
|
+
const referenced = new Set();
|
|
214
|
+
for (const s of browsableScreens)
|
|
215
|
+
for (const a of s.endpoints)
|
|
216
|
+
referenced.add(a);
|
|
217
|
+
const omittedPaths = new Set(intentionalOmissions.map((o) => o.target));
|
|
218
|
+
for (const e of endpoints) {
|
|
219
|
+
const accessor = e.accessor.join(".");
|
|
220
|
+
if (referenced.has(accessor))
|
|
221
|
+
continue;
|
|
222
|
+
const target = `${e.method.toUpperCase()} ${e.path}`;
|
|
223
|
+
if (omittedPaths.has(target))
|
|
224
|
+
continue;
|
|
225
|
+
intentionalOmissions.push({
|
|
226
|
+
target,
|
|
227
|
+
reason: `Not yet mapped to a screen (accessor ${accessor}) — a duplicate-role or deeply nested endpoint the deterministic plan does not surface yet.`,
|
|
228
|
+
});
|
|
229
|
+
omittedPaths.add(target);
|
|
230
|
+
}
|
|
231
|
+
return { screens, navigation, intentionalOmissions };
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=buildDeterministicPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildDeterministicPlan.js","sourceRoot":"","sources":["../../../src/orchestrate/utils/buildDeterministicPlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { OpenApi } from "@typia/interface";
|
|
2
|
+
import { IAutoViewSdkMap } from "../structures/IAutoViewSdkMap";
|
|
3
|
+
/**
|
|
4
|
+
* Deterministic SDK domain map — the LLM-free replacement for the Phase-1 SDK
|
|
5
|
+
* Study, and the fix for "a large swagger overflows the model's context".
|
|
6
|
+
*
|
|
7
|
+
* The original SDK Study compiled the WHOLE SDK source and asked the model to
|
|
8
|
+
* infer resources / actors / journeys. On a 200-type swagger that prompt is
|
|
9
|
+
* 300k+ tokens — a hard context overflow. But the downstream phases barely use
|
|
10
|
+
* the map's prose: the Product Plan is already deterministic and reads only
|
|
11
|
+
* `actors[0].name`; Scaffold/Review embed the map as a wiki document; Render
|
|
12
|
+
* reads an actor's journeys only on the LLM rerender fallback. So the map can be
|
|
13
|
+
* derived structurally — same swagger, same map, zero tokens — without changing
|
|
14
|
+
* what reaches the user.
|
|
15
|
+
*
|
|
16
|
+
* - resources: the top-level CRUD groups from {@link classifyEndpoints}.
|
|
17
|
+
* - actors: role segments found in the accessors (`customers`, `sellers`,
|
|
18
|
+
* `admins`), normalized; falls back to a single `user`.
|
|
19
|
+
* - journeys: a short structural summary per actor (never empty — the SDK-map
|
|
20
|
+
* invariant requires ≥1 per actor).
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildDeterministicSdkMap(document: OpenApi.IDocument): IAutoViewSdkMap;
|