swallowkit 1.0.0-beta.6 ā 1.0.0-beta.61
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.ja.md +87 -175
- package/README.md +87 -176
- package/dist/__tests__/fixtures.d.ts +12 -0
- package/dist/__tests__/fixtures.d.ts.map +1 -1
- package/dist/__tests__/fixtures.js +101 -0
- package/dist/__tests__/fixtures.js.map +1 -1
- package/dist/cli/commands/add-auth.d.ts +15 -0
- package/dist/cli/commands/add-auth.d.ts.map +1 -0
- package/dist/cli/commands/add-auth.js +790 -0
- package/dist/cli/commands/add-auth.js.map +1 -0
- package/dist/cli/commands/add-connector.d.ts +20 -0
- package/dist/cli/commands/add-connector.d.ts.map +1 -0
- package/dist/cli/commands/add-connector.js +164 -0
- package/dist/cli/commands/add-connector.js.map +1 -0
- package/dist/cli/commands/cosmos-worktree-isolation.d.ts +25 -0
- package/dist/cli/commands/cosmos-worktree-isolation.d.ts.map +1 -0
- package/dist/cli/commands/cosmos-worktree-isolation.js +124 -0
- package/dist/cli/commands/cosmos-worktree-isolation.js.map +1 -0
- package/dist/cli/commands/create-model.d.ts +1 -4
- package/dist/cli/commands/create-model.d.ts.map +1 -1
- package/dist/cli/commands/create-model.js +20 -82
- package/dist/cli/commands/create-model.js.map +1 -1
- package/dist/cli/commands/dev-seeds.d.ts +62 -0
- package/dist/cli/commands/dev-seeds.d.ts.map +1 -0
- package/dist/cli/commands/dev-seeds.js +474 -0
- package/dist/cli/commands/dev-seeds.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +38 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +733 -155
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +3 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +74 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +1376 -930
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/scaffold.d.ts +24 -0
- package/dist/cli/commands/scaffold.d.ts.map +1 -1
- package/dist/cli/commands/scaffold.js +473 -90
- package/dist/cli/commands/scaffold.js.map +1 -1
- package/dist/cli/index.d.ts +5 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +335 -55
- package/dist/cli/index.js.map +1 -1
- package/dist/core/config.d.ts +14 -3
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +179 -8
- package/dist/core/config.js.map +1 -1
- package/dist/core/mock/connector-mock-server.d.ts +101 -0
- package/dist/core/mock/connector-mock-server.d.ts.map +1 -0
- package/dist/core/mock/connector-mock-server.js +480 -0
- package/dist/core/mock/connector-mock-server.js.map +1 -0
- package/dist/core/mock/zod-mock-generator.d.ts +14 -0
- package/dist/core/mock/zod-mock-generator.d.ts.map +1 -0
- package/dist/core/mock/zod-mock-generator.js +163 -0
- package/dist/core/mock/zod-mock-generator.js.map +1 -0
- package/dist/core/operations/auth-operations.d.ts +61 -0
- package/dist/core/operations/auth-operations.d.ts.map +1 -0
- package/dist/core/operations/auth-operations.js +272 -0
- package/dist/core/operations/auth-operations.js.map +1 -0
- package/dist/core/operations/create-model.d.ts +15 -0
- package/dist/core/operations/create-model.d.ts.map +1 -0
- package/dist/core/operations/create-model.js +185 -0
- package/dist/core/operations/create-model.js.map +1 -0
- package/dist/core/operations/file-session.d.ts +56 -0
- package/dist/core/operations/file-session.d.ts.map +1 -0
- package/dist/core/operations/file-session.js +203 -0
- package/dist/core/operations/file-session.js.map +1 -0
- package/dist/core/operations/provision-operations.d.ts +52 -0
- package/dist/core/operations/provision-operations.d.ts.map +1 -0
- package/dist/core/operations/provision-operations.js +211 -0
- package/dist/core/operations/provision-operations.js.map +1 -0
- package/dist/core/operations/runtime.d.ts +37 -0
- package/dist/core/operations/runtime.d.ts.map +1 -0
- package/dist/core/operations/runtime.js +248 -0
- package/dist/core/operations/runtime.js.map +1 -0
- package/dist/core/operations/scaffold-apply.d.ts +21 -0
- package/dist/core/operations/scaffold-apply.d.ts.map +1 -0
- package/dist/core/operations/scaffold-apply.js +57 -0
- package/dist/core/operations/scaffold-apply.js.map +1 -0
- package/dist/core/operations/scaffold-machine.d.ts +16 -0
- package/dist/core/operations/scaffold-machine.d.ts.map +1 -0
- package/dist/core/operations/scaffold-machine.js +51 -0
- package/dist/core/operations/scaffold-machine.js.map +1 -0
- package/dist/core/operations/scaffold-plan.d.ts +43 -0
- package/dist/core/operations/scaffold-plan.d.ts.map +1 -0
- package/dist/core/operations/scaffold-plan.js +187 -0
- package/dist/core/operations/scaffold-plan.js.map +1 -0
- package/dist/core/project/agent-instructions.d.ts +29 -0
- package/dist/core/project/agent-instructions.d.ts.map +1 -0
- package/dist/core/project/agent-instructions.js +160 -0
- package/dist/core/project/agent-instructions.js.map +1 -0
- package/dist/core/project/artifacts.d.ts +58 -0
- package/dist/core/project/artifacts.d.ts.map +1 -0
- package/dist/core/project/artifacts.js +179 -0
- package/dist/core/project/artifacts.js.map +1 -0
- package/dist/core/project/boundaries.d.ts +50 -0
- package/dist/core/project/boundaries.d.ts.map +1 -0
- package/dist/core/project/boundaries.js +117 -0
- package/dist/core/project/boundaries.js.map +1 -0
- package/dist/core/project/capabilities.d.ts +58 -0
- package/dist/core/project/capabilities.d.ts.map +1 -0
- package/dist/core/project/capabilities.js +135 -0
- package/dist/core/project/capabilities.js.map +1 -0
- package/dist/core/project/drift.d.ts +29 -0
- package/dist/core/project/drift.d.ts.map +1 -0
- package/dist/core/project/drift.js +188 -0
- package/dist/core/project/drift.js.map +1 -0
- package/dist/core/project/infra.d.ts +49 -0
- package/dist/core/project/infra.d.ts.map +1 -0
- package/dist/core/project/infra.js +167 -0
- package/dist/core/project/infra.js.map +1 -0
- package/dist/core/project/manifest.d.ts +92 -0
- package/dist/core/project/manifest.d.ts.map +1 -0
- package/dist/core/project/manifest.js +321 -0
- package/dist/core/project/manifest.js.map +1 -0
- package/dist/core/project/state.d.ts +15 -0
- package/dist/core/project/state.d.ts.map +1 -0
- package/dist/core/project/state.js +106 -0
- package/dist/core/project/state.js.map +1 -0
- package/dist/core/project/validation.d.ts +20 -0
- package/dist/core/project/validation.d.ts.map +1 -0
- package/dist/core/project/validation.js +274 -0
- package/dist/core/project/validation.js.map +1 -0
- package/dist/core/project/workflows.d.ts +43 -0
- package/dist/core/project/workflows.d.ts.map +1 -0
- package/dist/core/project/workflows.js +299 -0
- package/dist/core/project/workflows.js.map +1 -0
- package/dist/core/scaffold/auth-generator.d.ts +63 -0
- package/dist/core/scaffold/auth-generator.d.ts.map +1 -0
- package/dist/core/scaffold/auth-generator.js +1774 -0
- package/dist/core/scaffold/auth-generator.js.map +1 -0
- package/dist/core/scaffold/connector-functions-generator.d.ts +41 -0
- package/dist/core/scaffold/connector-functions-generator.d.ts.map +1 -0
- package/dist/core/scaffold/connector-functions-generator.js +1029 -0
- package/dist/core/scaffold/connector-functions-generator.js.map +1 -0
- package/dist/core/scaffold/functions-generator.d.ts +7 -1
- package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
- package/dist/core/scaffold/functions-generator.js +771 -69
- package/dist/core/scaffold/functions-generator.js.map +1 -1
- package/dist/core/scaffold/model-parser.d.ts +21 -1
- package/dist/core/scaffold/model-parser.d.ts.map +1 -1
- package/dist/core/scaffold/model-parser.js +230 -79
- package/dist/core/scaffold/model-parser.js.map +1 -1
- package/dist/core/scaffold/native-schema-generator.d.ts +19 -0
- package/dist/core/scaffold/native-schema-generator.d.ts.map +1 -0
- package/dist/core/scaffold/native-schema-generator.js +753 -0
- package/dist/core/scaffold/native-schema-generator.js.map +1 -0
- package/dist/core/scaffold/nextjs-generator.d.ts +8 -0
- package/dist/core/scaffold/nextjs-generator.d.ts.map +1 -1
- package/dist/core/scaffold/nextjs-generator.js +153 -9
- package/dist/core/scaffold/nextjs-generator.js.map +1 -1
- package/dist/core/scaffold/openapi-generator.d.ts +3 -0
- package/dist/core/scaffold/openapi-generator.d.ts.map +1 -0
- package/dist/core/scaffold/openapi-generator.js +190 -0
- package/dist/core/scaffold/openapi-generator.js.map +1 -0
- package/dist/core/scaffold/ui-generator.d.ts +17 -4
- package/dist/core/scaffold/ui-generator.d.ts.map +1 -1
- package/dist/core/scaffold/ui-generator.js +174 -34
- package/dist/core/scaffold/ui-generator.js.map +1 -1
- package/dist/core/verify/index.d.ts +69 -0
- package/dist/core/verify/index.d.ts.map +1 -0
- package/dist/core/verify/index.js +412 -0
- package/dist/core/verify/index.js.map +1 -0
- package/dist/database/base-model.d.ts +3 -3
- package/dist/database/base-model.js +3 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/machine/contracts.d.ts +24 -0
- package/dist/machine/contracts.d.ts.map +1 -0
- package/dist/machine/contracts.js +3 -0
- package/dist/machine/contracts.js.map +1 -0
- package/dist/machine/errors.d.ts +14 -0
- package/dist/machine/errors.d.ts.map +1 -0
- package/dist/machine/errors.js +42 -0
- package/dist/machine/errors.js.map +1 -0
- package/dist/machine/index.d.ts +3 -0
- package/dist/machine/index.d.ts.map +1 -0
- package/dist/machine/index.js +566 -0
- package/dist/machine/index.js.map +1 -0
- package/dist/mcp/index.d.ts +25 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +425 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/types/index.d.ts +109 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/package-manager.d.ts +9 -12
- package/dist/utils/package-manager.d.ts.map +1 -1
- package/dist/utils/package-manager.js +51 -22
- package/dist/utils/package-manager.js.map +1 -1
- package/dist/utils/python-uv.d.ts +21 -0
- package/dist/utils/python-uv.d.ts.map +1 -0
- package/dist/utils/python-uv.js +111 -0
- package/dist/utils/python-uv.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +49 -0
- package/dist/version.js.map +1 -0
- package/package.json +16 -17
- package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +1139 -0
- package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +206 -0
- package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +532 -0
- package/src/__tests__/agent-instructions.test.ts +237 -0
- package/src/__tests__/agent-loop-phase34.test.ts +513 -0
- package/src/__tests__/auth.test.ts +770 -0
- package/src/__tests__/bff-swa-auth.test.ts +275 -0
- package/src/__tests__/config.test.ts +295 -0
- package/src/__tests__/connector-functions-generator.test.ts +288 -0
- package/src/__tests__/connector-mock-server.test.ts +459 -0
- package/src/__tests__/connector-model-bff.test.ts +162 -0
- package/src/__tests__/cosmos-worktree-isolation.test.ts +149 -0
- package/src/__tests__/dev-seeds.test.ts +236 -0
- package/src/__tests__/dev.test.ts +296 -0
- package/src/__tests__/file-session.test.ts +98 -0
- package/src/__tests__/fixtures.ts +184 -0
- package/src/__tests__/functions-generator.test.ts +237 -0
- package/src/__tests__/init.test.ts +363 -0
- package/src/__tests__/jest-globals.d.ts +8 -0
- package/src/__tests__/machine.test.ts +371 -0
- package/src/__tests__/mcp.test.ts +253 -0
- package/src/__tests__/model-parser.test.ts +142 -0
- package/src/__tests__/multi-auth.test.ts +160 -0
- package/src/__tests__/nextjs-generator.test.ts +105 -0
- package/src/__tests__/openapi-generator.test.ts +43 -0
- package/src/__tests__/package-manager.test.ts +244 -0
- package/src/__tests__/plan-apply.test.ts +499 -0
- package/src/__tests__/python-uv.test.ts +48 -0
- package/src/__tests__/scaffold.test.ts +302 -0
- package/src/__tests__/string-utils.test.ts +75 -0
- package/src/__tests__/tsconfig.json +15 -0
- package/src/__tests__/ui-generator.test.ts +248 -0
- package/src/__tests__/zod-mock-generator.test.ts +132 -0
- package/src/cli/commands/add-auth.ts +853 -0
- package/src/cli/commands/add-connector.ts +159 -0
- package/src/cli/commands/cosmos-worktree-isolation.ts +130 -0
- package/src/cli/commands/create-model.ts +62 -0
- package/src/cli/commands/dev-seeds.ts +629 -0
- package/src/cli/commands/dev.ts +1252 -0
- package/src/cli/commands/index.ts +9 -0
- package/src/cli/commands/init.ts +3414 -0
- package/src/cli/commands/provision.ts +193 -0
- package/src/cli/commands/scaffold.ts +1081 -0
- package/src/cli/index.ts +352 -0
- package/src/core/config.ts +380 -0
- package/src/core/mock/connector-mock-server.ts +555 -0
- package/src/core/mock/zod-mock-generator.ts +205 -0
- package/src/core/operations/auth-operations.ts +360 -0
- package/src/core/operations/create-model.ts +191 -0
- package/src/core/operations/file-session.ts +222 -0
- package/src/core/operations/provision-operations.ts +297 -0
- package/src/core/operations/runtime.ts +258 -0
- package/src/core/operations/scaffold-apply.ts +106 -0
- package/src/core/operations/scaffold-machine.ts +77 -0
- package/src/core/operations/scaffold-plan.ts +215 -0
- package/src/core/project/agent-instructions.ts +167 -0
- package/src/core/project/agent-templates/AGENTS.md +504 -0
- package/src/core/project/agent-templates/CLAUDE.md +31 -0
- package/src/core/project/agent-templates/azure-functions.instructions.md +22 -0
- package/src/core/project/agent-templates/bff-routes.instructions.md +18 -0
- package/src/core/project/agent-templates/copilot-instructions.md +27 -0
- package/src/core/project/agent-templates/shared-models.instructions.md +72 -0
- package/src/core/project/artifacts.ts +205 -0
- package/src/core/project/boundaries.ts +170 -0
- package/src/core/project/capabilities.ts +193 -0
- package/src/core/project/drift.ts +202 -0
- package/src/core/project/infra.ts +196 -0
- package/src/core/project/manifest.ts +402 -0
- package/src/core/project/state.ts +77 -0
- package/src/core/project/validation.ts +295 -0
- package/src/core/project/workflows.ts +295 -0
- package/src/core/scaffold/auth-generator.ts +1824 -0
- package/src/core/scaffold/connector-functions-generator.ts +1133 -0
- package/src/core/scaffold/functions-generator.ts +972 -0
- package/src/core/scaffold/model-parser.ts +781 -0
- package/src/core/scaffold/native-schema-generator.ts +904 -0
- package/src/core/scaffold/nextjs-generator.ts +382 -0
- package/src/core/scaffold/openapi-generator.ts +212 -0
- package/src/core/scaffold/ui-generator.ts +1100 -0
- package/src/core/verify/index.ts +468 -0
- package/src/database/base-model.ts +184 -0
- package/src/database/client.ts +140 -0
- package/src/database/repository.ts +104 -0
- package/src/database/runtime-check.ts +25 -0
- package/src/index.ts +27 -0
- package/src/machine/contracts.ts +33 -0
- package/src/machine/errors.ts +45 -0
- package/src/machine/index.ts +690 -0
- package/src/mcp/index.ts +423 -0
- package/src/types/index.ts +182 -0
- package/src/utils/package-manager.ts +251 -0
- package/src/utils/python-uv.ts +96 -0
- package/src/version.ts +13 -0
package/src/cli/index.ts
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { execSync } from "child_process";
|
|
4
|
+
import { readFileSync } from "fs";
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import { initCommand, devCommand, devSeedsCommand, scaffoldCommand, createModelCommand } from "./commands";
|
|
8
|
+
import { provisionCommand } from "./commands/provision";
|
|
9
|
+
import { addConnectorCommand } from "./commands/add-connector";
|
|
10
|
+
import { addAuthCommand } from "./commands/add-auth";
|
|
11
|
+
import { planScaffoldOperation } from "../core/operations/scaffold-plan";
|
|
12
|
+
import { inspectArtifacts } from "../core/project/artifacts";
|
|
13
|
+
import { detectDrift } from "../core/project/drift";
|
|
14
|
+
import { runVerify } from "../core/verify";
|
|
15
|
+
import { isMachineCommand, runMachineCli } from "../machine";
|
|
16
|
+
|
|
17
|
+
const packageJsonPath = path.resolve(__dirname, "../../package.json");
|
|
18
|
+
export const CLI_VERSION = JSON.parse(readFileSync(packageJsonPath, "utf8")).version as string;
|
|
19
|
+
|
|
20
|
+
const DEV_OPTION_ARITY = new Map<string, 0 | 1>([
|
|
21
|
+
["-p", 1],
|
|
22
|
+
["--port", 1],
|
|
23
|
+
["-f", 1],
|
|
24
|
+
["--functions-port", 1],
|
|
25
|
+
["--host", 1],
|
|
26
|
+
["--seed-env", 1],
|
|
27
|
+
["-o", 0],
|
|
28
|
+
["--open", 0],
|
|
29
|
+
["-v", 0],
|
|
30
|
+
["--verbose", 0],
|
|
31
|
+
["--no-functions", 0],
|
|
32
|
+
["--mock-connectors", 0],
|
|
33
|
+
["--swa-port", 1],
|
|
34
|
+
["--no-swa", 0],
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
function ensureUtf8ConsoleOnWindows(): void {
|
|
38
|
+
if (process.platform === 'win32') {
|
|
39
|
+
try {
|
|
40
|
+
execSync('chcp 65001', { stdio: 'ignore' });
|
|
41
|
+
} catch {
|
|
42
|
+
// ignore ā non-critical
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function isDevOptionSequence(tokens: string[]): boolean {
|
|
48
|
+
if (tokens.length === 0) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
53
|
+
const token = tokens[index];
|
|
54
|
+
const arity = DEV_OPTION_ARITY.get(token);
|
|
55
|
+
|
|
56
|
+
if (arity === undefined) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (arity === 1) {
|
|
61
|
+
const value = tokens[index + 1];
|
|
62
|
+
if (value === undefined || value === "dev") {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
index += 1;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function normalizeDevCommandArgv(argv: string[]): string[] {
|
|
73
|
+
if (argv.length <= 3) {
|
|
74
|
+
return argv;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const prefix = argv.slice(0, 2);
|
|
78
|
+
const args = argv.slice(2);
|
|
79
|
+
const devIndex = args.indexOf("dev");
|
|
80
|
+
|
|
81
|
+
if (devIndex <= 0) {
|
|
82
|
+
return argv;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const leadingTokens = args.slice(0, devIndex);
|
|
86
|
+
if (!isDevOptionSequence(leadingTokens)) {
|
|
87
|
+
return argv;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return [
|
|
91
|
+
...prefix,
|
|
92
|
+
"dev",
|
|
93
|
+
...leadingTokens,
|
|
94
|
+
...args.slice(devIndex + 1),
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function createProgram(devCommandOverride: Command = devCommand): Command {
|
|
99
|
+
const program = new Command();
|
|
100
|
+
|
|
101
|
+
program
|
|
102
|
+
.name("swallowkit")
|
|
103
|
+
.description("Next.js framework optimized for Azure deployment - Automatically splits SSR into individual Azure Functions")
|
|
104
|
+
.version(CLI_VERSION);
|
|
105
|
+
|
|
106
|
+
// Register commands
|
|
107
|
+
program
|
|
108
|
+
.command("init [project-name]")
|
|
109
|
+
.description("Initialize a new SwallowKit project")
|
|
110
|
+
.option("--template <template>", "Template to use", "default")
|
|
111
|
+
.option("--next-version <version>", "Next.js version to install (e.g., 16.0.7, latest)", "latest")
|
|
112
|
+
.option("--package-manager <manager>", "Package manager: npm | pnpm (defaults to invocation context)")
|
|
113
|
+
.option("--cicd <provider>", "CI/CD provider: github | azure | skip")
|
|
114
|
+
.option("--backend-language <language>", "Azure Functions backend language: typescript | csharp | python")
|
|
115
|
+
.option("--cosmos-db-mode <mode>", "Cosmos DB mode: freetier | serverless")
|
|
116
|
+
.option("--vnet <option>", "Network security: outbound | none")
|
|
117
|
+
.option("--swa-plan <plan>", "Azure Static Web Apps plan: free | standard")
|
|
118
|
+
.action((projectName, options) => {
|
|
119
|
+
initCommand({
|
|
120
|
+
name: projectName || "swallowkit-app",
|
|
121
|
+
template: options.template,
|
|
122
|
+
nextVersion: options.nextVersion,
|
|
123
|
+
packageManager: options.packageManager,
|
|
124
|
+
cicd: options.cicd,
|
|
125
|
+
backendLanguage: options.backendLanguage,
|
|
126
|
+
cosmosDbMode: options.cosmosDbMode,
|
|
127
|
+
vnet: options.vnet,
|
|
128
|
+
swaPlan: options.swaPlan,
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
program.addCommand(devCommandOverride);
|
|
133
|
+
program.addCommand(devSeedsCommand);
|
|
134
|
+
|
|
135
|
+
program.addCommand(provisionCommand);
|
|
136
|
+
|
|
137
|
+
program
|
|
138
|
+
.command("create-model <names...>")
|
|
139
|
+
.description("Create model template files with id, createdAt, and updatedAt fields")
|
|
140
|
+
.option("--models-dir <dir>", "Models directory", "shared/models")
|
|
141
|
+
.option("--connector <name>", "Associate model with a connector defined in swallowkit.config.js")
|
|
142
|
+
.action((names, options) => {
|
|
143
|
+
createModelCommand({
|
|
144
|
+
names,
|
|
145
|
+
modelsDir: options.modelsDir,
|
|
146
|
+
connector: options.connector,
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
program
|
|
151
|
+
.command("scaffold <model>")
|
|
152
|
+
.description("Generate CRUD code for Azure Functions and Next.js BFF from Zod models")
|
|
153
|
+
.option("--functions-dir <dir>", "Azure Functions directory", "functions")
|
|
154
|
+
.option("--api-dir <dir>", "Next.js API routes directory", "app/api")
|
|
155
|
+
.option("--api-only", "Skip UI components; still update Functions, BFF routes, OpenAPI, and native schema assets", false)
|
|
156
|
+
.option("--dry-run", "Show planned file changes without writing anything", false)
|
|
157
|
+
.action(async (model, options) => {
|
|
158
|
+
if (options.dryRun) {
|
|
159
|
+
await runScaffoldDryRun({
|
|
160
|
+
model,
|
|
161
|
+
functionsDir: options.functionsDir,
|
|
162
|
+
apiDir: options.apiDir,
|
|
163
|
+
apiOnly: options.apiOnly,
|
|
164
|
+
});
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
await scaffoldCommand({
|
|
169
|
+
model,
|
|
170
|
+
functionsDir: options.functionsDir,
|
|
171
|
+
apiDir: options.apiDir,
|
|
172
|
+
apiOnly: options.apiOnly,
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
program
|
|
177
|
+
.command("add-connector <name>")
|
|
178
|
+
.description("Add an external data source connector configuration")
|
|
179
|
+
.requiredOption("--type <type>", "Connector type: rdb | api")
|
|
180
|
+
.option("--provider <provider>", "RDB provider: mysql | postgres | sqlserver", "mysql")
|
|
181
|
+
.action((name, options) => {
|
|
182
|
+
addConnectorCommand({
|
|
183
|
+
name,
|
|
184
|
+
type: options.type,
|
|
185
|
+
provider: options.provider,
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
program
|
|
190
|
+
.command("add-auth")
|
|
191
|
+
.description("Add authentication and authorization to the project")
|
|
192
|
+
.option("--provider <provider>", "Auth provider: custom-jwt | swa | external-token | swa-custom | none", "custom-jwt")
|
|
193
|
+
.option("--scheme <name>", "Add a named authentication scheme")
|
|
194
|
+
.option("--allowed-providers <list>", "Comma-separated SWA identity providers to allow (e.g. github,aad); defaults to aad")
|
|
195
|
+
.action((options) => {
|
|
196
|
+
addAuthCommand({
|
|
197
|
+
provider: options.provider,
|
|
198
|
+
scheme: options.scheme,
|
|
199
|
+
allowedProviders: options.allowedProviders ? String(options.allowedProviders).split(",") : undefined,
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
program
|
|
204
|
+
.command("status")
|
|
205
|
+
.description("Show generated artifact status and drift against the current project state")
|
|
206
|
+
.option("--artifacts", "List all tracked artifacts with ownership", false)
|
|
207
|
+
.action(async (options) => {
|
|
208
|
+
await runStatusCommand({ artifacts: options.artifacts });
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
program
|
|
212
|
+
.command("verify")
|
|
213
|
+
.description("Run verification checks (structure, drift, typecheck)")
|
|
214
|
+
.option("--checks <ids>", "Comma-separated check ids to run (structure,drift,typecheck)")
|
|
215
|
+
.action(async (options) => {
|
|
216
|
+
await runVerifyCommand({ checks: options.checks });
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
return program;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
async function runScaffoldDryRun(options: { model: string; functionsDir?: string; apiDir?: string; apiOnly?: boolean }): Promise<void> {
|
|
223
|
+
console.log("š Scaffold dry-run ā no files will be written.\n");
|
|
224
|
+
|
|
225
|
+
const plan = await planScaffoldOperation(options);
|
|
226
|
+
|
|
227
|
+
const actionIcons: Record<string, string> = {
|
|
228
|
+
create: "ā",
|
|
229
|
+
update: "ā»ļø ",
|
|
230
|
+
overwrite: "ā ļø ",
|
|
231
|
+
append: "š",
|
|
232
|
+
delete: "šļø ",
|
|
233
|
+
skip: "āļø ",
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
for (const operation of plan.operations) {
|
|
237
|
+
if (operation.action === "skip") continue;
|
|
238
|
+
const icon = actionIcons[operation.action] ?? "ā¢";
|
|
239
|
+
const conflictNote = operation.conflict ? ` (conflict: ${operation.conflictReason})` : "";
|
|
240
|
+
console.log(` ${icon} ${operation.action.padEnd(9)} ${operation.path} [${operation.ownership}]${conflictNote}`);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const skipped = plan.operations.filter((operation) => operation.action === "skip").length;
|
|
244
|
+
if (skipped > 0) {
|
|
245
|
+
console.log(` āļø ${skipped} file(s) unchanged (skipped)`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (plan.warnings.length > 0) {
|
|
249
|
+
console.log("\nā ļø Warnings:");
|
|
250
|
+
for (const warning of plan.warnings) {
|
|
251
|
+
console.log(` - ${warning}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
console.log(`\nš Plan ${plan.planId} saved.`);
|
|
256
|
+
if (plan.requiresApproval) {
|
|
257
|
+
console.log(`ā ļø ${plan.conflicts.length} file(s) were modified after generation and would be overwritten.`);
|
|
258
|
+
console.log(` Review the conflicts, then run: swallowkit scaffold ${options.model} (or machine apply scaffold --plan ${plan.planId} --approve)`);
|
|
259
|
+
} else {
|
|
260
|
+
console.log(` Run without --dry-run to apply: swallowkit scaffold ${options.model}`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
async function runStatusCommand(options: { artifacts?: boolean }): Promise<void> {
|
|
265
|
+
const inspection = inspectArtifacts();
|
|
266
|
+
const drift = await detectDrift();
|
|
267
|
+
|
|
268
|
+
console.log("š¦ SwallowKit project status\n");
|
|
269
|
+
|
|
270
|
+
if (!inspection.ledgerFound) {
|
|
271
|
+
console.log("ā¹ļø No artifact ledger (.swallowkit/artifacts.json) found yet.");
|
|
272
|
+
console.log(" Run scaffold once with this SwallowKit version to start tracking artifacts.\n");
|
|
273
|
+
} else {
|
|
274
|
+
const total = inspection.artifacts.length;
|
|
275
|
+
const missing = inspection.artifacts.filter((artifact) => !artifact.exists).length;
|
|
276
|
+
const modified = inspection.artifacts.filter((artifact) => artifact.modified).length;
|
|
277
|
+
console.log(` Tracked artifacts: ${total}`);
|
|
278
|
+
console.log(` Modified after generation: ${modified}`);
|
|
279
|
+
console.log(` Missing: ${missing}\n`);
|
|
280
|
+
|
|
281
|
+
if (options.artifacts) {
|
|
282
|
+
for (const artifact of inspection.artifacts) {
|
|
283
|
+
const flags = [
|
|
284
|
+
artifact.modified ? "modified" : null,
|
|
285
|
+
!artifact.exists ? "missing" : null,
|
|
286
|
+
].filter(Boolean);
|
|
287
|
+
const suffix = flags.length > 0 ? ` (${flags.join(", ")})` : "";
|
|
288
|
+
console.log(` - ${artifact.path} [${artifact.ownership}]${suffix}`);
|
|
289
|
+
}
|
|
290
|
+
console.log("");
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (drift.findings.length === 0) {
|
|
295
|
+
console.log("ā
No drift detected.");
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
console.log(`ā ļø Drift findings (${drift.findings.length}):`);
|
|
300
|
+
for (const finding of drift.findings) {
|
|
301
|
+
console.log(` [${finding.severity}] ${finding.kind}: ${finding.message}`);
|
|
302
|
+
console.log(` ā ${finding.repairAction}`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
async function runVerifyCommand(options: { checks?: string }): Promise<void> {
|
|
307
|
+
console.log("š Running verification checks...\n");
|
|
308
|
+
|
|
309
|
+
const result = await runVerify(options.checks ? options.checks.split(",") : undefined);
|
|
310
|
+
|
|
311
|
+
const statusIcons: Record<string, string> = {
|
|
312
|
+
pass: "ā
",
|
|
313
|
+
fail: "ā",
|
|
314
|
+
skip: "āļø ",
|
|
315
|
+
error: "š„",
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
for (const check of result.checks) {
|
|
319
|
+
console.log(` ${statusIcons[check.status]} ${check.id.padEnd(10)} ${check.title} (${check.durationMs}ms)`);
|
|
320
|
+
if (check.status === "fail" || check.status === "error") {
|
|
321
|
+
for (const action of check.suggestedActions) {
|
|
322
|
+
console.log(` ā ${action}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
console.log(
|
|
328
|
+
`\n${result.summary.done ? "ā
" : "ā"} ${result.summary.passed} passed, ${result.summary.failed} failed, ${result.summary.skipped} skipped, ${result.summary.errors} error(s)`
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
if (!result.summary.done) {
|
|
332
|
+
console.log(' Details: swallowkit machine explain failure');
|
|
333
|
+
process.exitCode = 1;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export async function runCli(argv: string[] = process.argv): Promise<void> {
|
|
338
|
+
ensureUtf8ConsoleOnWindows();
|
|
339
|
+
if (isMachineCommand(argv)) {
|
|
340
|
+
await runMachineCli(argv);
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
await createProgram().parseAsync(normalizeDevCommandArgv(argv));
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (require.main === module) {
|
|
348
|
+
void runCli().catch((error) => {
|
|
349
|
+
console.error(error);
|
|
350
|
+
process.exitCode = 1;
|
|
351
|
+
});
|
|
352
|
+
}
|