swallowkit 2.0.0-alpha.2 → 2.0.0-alpha.4
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/dist/cli/commands/configure-mcp.d.ts +12 -0
- package/dist/cli/commands/configure-mcp.d.ts.map +1 -0
- package/dist/cli/commands/configure-mcp.js +42 -0
- package/dist/cli/commands/configure-mcp.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +2 -2
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +39 -27
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +43 -122
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/migrations.d.ts.map +1 -1
- package/dist/cli/commands/migrations.js +25 -0
- package/dist/cli/commands/migrations.js.map +1 -1
- package/dist/cli/commands/provision.d.ts +2 -0
- package/dist/cli/commands/provision.d.ts.map +1 -1
- package/dist/cli/commands/provision.js +45 -16
- package/dist/cli/commands/provision.js.map +1 -1
- package/dist/cli/commands/scaffold.d.ts +4 -0
- package/dist/cli/commands/scaffold.d.ts.map +1 -1
- package/dist/cli/commands/scaffold.js +40 -2
- package/dist/cli/commands/scaffold.js.map +1 -1
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +27 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/core/operations/model-migration.d.ts +22 -0
- package/dist/core/operations/model-migration.d.ts.map +1 -0
- package/dist/core/operations/model-migration.js +36 -0
- package/dist/core/operations/model-migration.js.map +1 -0
- package/dist/core/operations/provision-operations.d.ts +19 -1
- package/dist/core/operations/provision-operations.d.ts.map +1 -1
- package/dist/core/operations/provision-operations.js +62 -35
- package/dist/core/operations/provision-operations.js.map +1 -1
- package/dist/core/operations/scaffold-apply.d.ts +1 -0
- package/dist/core/operations/scaffold-apply.d.ts.map +1 -1
- package/dist/core/operations/scaffold-apply.js +1 -0
- package/dist/core/operations/scaffold-apply.js.map +1 -1
- package/dist/core/operations/scaffold-machine.d.ts +1 -0
- package/dist/core/operations/scaffold-machine.d.ts.map +1 -1
- package/dist/core/operations/scaffold-machine.js.map +1 -1
- package/dist/core/operations/scaffold-plan.d.ts +2 -0
- package/dist/core/operations/scaffold-plan.d.ts.map +1 -1
- package/dist/core/operations/scaffold-plan.js +3 -1
- package/dist/core/operations/scaffold-plan.js.map +1 -1
- package/dist/core/project/agent-instructions.d.ts.map +1 -1
- package/dist/core/project/agent-instructions.js +4 -1
- package/dist/core/project/agent-instructions.js.map +1 -1
- package/dist/core/project/boundaries.d.ts +5 -2
- package/dist/core/project/boundaries.d.ts.map +1 -1
- package/dist/core/project/boundaries.js +49 -18
- package/dist/core/project/boundaries.js.map +1 -1
- package/dist/core/project/capabilities.d.ts +1 -0
- package/dist/core/project/capabilities.d.ts.map +1 -1
- package/dist/core/project/capabilities.js +20 -2
- package/dist/core/project/capabilities.js.map +1 -1
- package/dist/core/project/home-page.d.ts +4 -0
- package/dist/core/project/home-page.d.ts.map +1 -0
- package/dist/core/project/home-page.js +113 -0
- package/dist/core/project/home-page.js.map +1 -0
- package/dist/core/project/mcp-config.d.ts +26 -0
- package/dist/core/project/mcp-config.d.ts.map +1 -0
- package/dist/core/project/mcp-config.js +117 -0
- package/dist/core/project/mcp-config.js.map +1 -0
- package/dist/core/project/react-project.d.ts +1 -1
- package/dist/core/project/react-project.d.ts.map +1 -1
- package/dist/core/project/react-project.js +45 -24
- package/dist/core/project/react-project.js.map +1 -1
- package/dist/core/project/workflows.d.ts.map +1 -1
- package/dist/core/project/workflows.js +9 -1
- package/dist/core/project/workflows.js.map +1 -1
- package/dist/core/scaffold/auth-generator.js +8 -8
- package/dist/core/scaffold/model-parser.d.ts +23 -0
- package/dist/core/scaffold/model-parser.d.ts.map +1 -1
- package/dist/core/scaffold/model-parser.js +407 -137
- package/dist/core/scaffold/model-parser.js.map +1 -1
- package/dist/core/scaffold/native-schema-generator.d.ts +11 -0
- package/dist/core/scaffold/native-schema-generator.d.ts.map +1 -1
- package/dist/core/scaffold/native-schema-generator.js +279 -91
- package/dist/core/scaffold/native-schema-generator.js.map +1 -1
- package/dist/core/scaffold/openapi-generator.d.ts +5 -0
- package/dist/core/scaffold/openapi-generator.d.ts.map +1 -1
- package/dist/core/scaffold/openapi-generator.js +53 -3
- package/dist/core/scaffold/openapi-generator.js.map +1 -1
- package/dist/core/scaffold/ui-generator.d.ts +0 -3
- package/dist/core/scaffold/ui-generator.d.ts.map +1 -1
- package/dist/core/scaffold/ui-generator.js +68 -7
- package/dist/core/scaffold/ui-generator.js.map +1 -1
- package/dist/core/verify/index.d.ts.map +1 -1
- package/dist/core/verify/index.js +24 -1
- package/dist/core/verify/index.js.map +1 -1
- package/dist/machine/index.d.ts.map +1 -1
- package/dist/machine/index.js +39 -15
- package/dist/machine/index.js.map +1 -1
- package/dist/mcp/index.d.ts +3 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +137 -13
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/version-selection.d.ts +55 -0
- package/dist/mcp/version-selection.d.ts.map +1 -0
- package/dist/mcp/version-selection.js +152 -0
- package/dist/mcp/version-selection.js.map +1 -0
- package/dist/utils/azure-cli.d.ts +44 -0
- package/dist/utils/azure-cli.d.ts.map +1 -0
- package/dist/utils/azure-cli.js +164 -0
- package/dist/utils/azure-cli.js.map +1 -0
- package/dist/utils/package-manager.js +1 -1
- package/dist/utils/package-manager.js.map +1 -1
- package/dist/utils/python-uv.d.ts +5 -7
- package/dist/utils/python-uv.d.ts.map +1 -1
- package/dist/utils/python-uv.js +50 -24
- package/dist/utils/python-uv.js.map +1 -1
- package/dist/utils/react-dev.d.ts +4 -0
- package/dist/utils/react-dev.d.ts.map +1 -0
- package/dist/utils/react-dev.js +35 -0
- package/dist/utils/react-dev.js.map +1 -0
- package/dist/utils/semver.d.ts +14 -0
- package/dist/utils/semver.d.ts.map +1 -0
- package/dist/utils/semver.js +61 -0
- package/dist/utils/semver.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/__snapshots__/boundaries.test.ts.snap +154 -0
- package/src/__tests__/agent-loop-phase34.test.ts +29 -0
- package/src/__tests__/auth.test.ts +9 -0
- package/src/__tests__/azure-cli.test.ts +199 -0
- package/src/__tests__/boundaries.test.ts +42 -0
- package/src/__tests__/csharp-schema.test.ts +261 -0
- package/src/__tests__/dev.test.ts +13 -6
- package/src/__tests__/home-page.test.ts +50 -0
- package/src/__tests__/init.test.ts +57 -0
- package/src/__tests__/mcp-version.test.ts +262 -0
- package/src/__tests__/mcp.test.ts +49 -3
- package/src/__tests__/package-manager.test.ts +2 -2
- package/src/__tests__/plan-apply.test.ts +68 -0
- package/src/__tests__/python-uv.test.ts +50 -14
- package/src/__tests__/python-venv.test.ts +48 -0
- package/src/__tests__/react-dev.test.ts +72 -0
- package/src/__tests__/react.test.ts +19 -0
- package/src/__tests__/schema-analysis.test.ts +329 -0
- package/src/cli/commands/configure-mcp.ts +54 -0
- package/src/cli/commands/dev.ts +40 -31
- package/src/cli/commands/init.ts +48 -125
- package/src/cli/commands/migrations.ts +22 -0
- package/src/cli/commands/provision.ts +53 -17
- package/src/cli/commands/scaffold.ts +40 -2
- package/src/cli/index.ts +26 -3
- package/src/core/operations/model-migration.ts +52 -0
- package/src/core/operations/provision-operations.ts +86 -42
- package/src/core/operations/scaffold-apply.ts +2 -0
- package/src/core/operations/scaffold-machine.ts +1 -0
- package/src/core/operations/scaffold-plan.ts +5 -1
- package/src/core/project/agent-instructions.ts +4 -1
- package/src/core/project/agent-templates/AGENTS.md +39 -3
- package/src/core/project/agent-templates/CLAUDE.md +3 -1
- package/src/core/project/agent-templates/copilot-instructions.md +3 -1
- package/src/core/project/boundaries.ts +60 -18
- package/src/core/project/capabilities.ts +22 -2
- package/src/core/project/home-page.ts +114 -0
- package/src/core/project/mcp-config.ts +84 -0
- package/src/core/project/react-project.ts +49 -27
- package/src/core/project/workflows.ts +9 -1
- package/src/core/scaffold/auth-generator.ts +8 -8
- package/src/core/scaffold/model-parser.ts +413 -129
- package/src/core/scaffold/native-schema-generator.ts +305 -105
- package/src/core/scaffold/openapi-generator.ts +63 -5
- package/src/core/scaffold/ui-generator.ts +70 -8
- package/src/core/verify/index.ts +23 -1
- package/src/machine/index.ts +42 -18
- package/src/mcp/index.ts +156 -14
- package/src/mcp/version-selection.ts +163 -0
- package/src/utils/azure-cli.ts +154 -0
- package/src/utils/package-manager.ts +1 -1
- package/src/utils/python-uv.ts +53 -33
- package/src/utils/react-dev.ts +31 -0
- package/src/utils/semver.ts +59 -0
|
@@ -93,6 +93,9 @@ function getBackendRules(backendLanguage) {
|
|
|
93
93
|
"- All backend business logic and data access live in `functions/`.",
|
|
94
94
|
`- SwallowKit derives OpenAPI and native ${BACKEND_LANGUAGE_LABELS[backendLanguage]} schema assets from the Zod source of truth.`,
|
|
95
95
|
"- Keep custom business logic in ai-authored locations identified by the current boundary contract.",
|
|
96
|
+
backendLanguage === "python"
|
|
97
|
+
? "- Use uv with the user's interpreter/version settings. Local Python is not pinned to the Azure deployment runtime. Preserve functions/.venv and functions/.codegen-venv; do not clear them or weaken OS application-control policy to fix interpreter errors."
|
|
98
|
+
: "- Start the isolated Functions backend with dotnet run, not func start from the source directory, so the SDK loads extensions from the build output.",
|
|
96
99
|
].join("\n");
|
|
97
100
|
}
|
|
98
101
|
function interpolateTemplate(template, context) {
|
|
@@ -112,7 +115,7 @@ function interpolateTemplate(template, context) {
|
|
|
112
115
|
? "├── src/ # React SPA (Vite + React Router)\n│ └── pages/ # generated/custom UI and route registrations\n├── bff/ # SWA managed HTTP-only Functions\n│ ├── src/ # BFF handlers and request-local helpers\n│ └── {function}/ # function.json registrations"
|
|
113
116
|
: "├── app/ # Next.js App Router\n│ ├── api/ # BFF routes\n│ └── {model}/ # generated/custom UI",
|
|
114
117
|
devGuidance: react
|
|
115
|
-
? "Use http://localhost:4280 for the app. `swallowkit dev` runs Vite (3000), the managed BFF (7073), standalone Functions (7071), and SWA CLI (4280). SWA forwards /api only to the managed BFF, never directly to standalone Functions. `--no-functions` leaves the BFF running; `--no-swa` removes same-origin routing/auth emulation. BFF local settings belong in bff/local.settings.json. Build bundles BFF dependencies and copies staticwebapp.config.json into dist/. Deploy dist/ + bff/ together, and functions/ separately."
|
|
118
|
+
? "Use http://localhost:4280 for the app. `swallowkit dev` runs Vite (3000), the managed BFF (7073), standalone Functions (7071), and SWA CLI (4280). SWA forwards /api only to the managed BFF, never directly to standalone Functions. `--no-functions` leaves the BFF running; `--no-swa` removes same-origin routing/auth emulation. BFF local settings belong in bff/local.settings.json. Build bundles BFF dependencies and copies staticwebapp.config.json into dist/. Deploy dist/ + bff/ together, and functions/ separately. Generated home, CRUD, and login pages share the Next.js presentation templates. Preserve their Tailwind styles and the light/dark defaults in src/style.css when editing them."
|
|
116
119
|
: "Use http://localhost:3000 for the app, or the SWA emulator port (4280) when testing SWA authentication. `swallowkit dev` runs Next.js and standalone Functions (7071). The BFF remains Next.js API routes.",
|
|
117
120
|
pm: context.packageManager,
|
|
118
121
|
runCmd,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../../../src/core/project/agent-instructions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,oEAEC;
|
|
1
|
+
{"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../../../src/core/project/agent-instructions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,oEAEC;AAwED,sCAEC;AAED,sCAEC;AAED,4DAEC;AAED,sEAiBC;AAED,wEASC;AAED,gEAoBC;AAtLD,uCAAyB;AACzB,2CAA6B;AAE7B,iEAA0E;AAgB7D,QAAA,oBAAoB,GAAG;IAClC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,mBAAmB,EAAE,yBAAyB;IAC9C,wBAAwB,EAAE,+BAA+B;IACzD,qBAAqB,EAAE,4BAA4B;IACnD,0BAA0B,EAAE,iCAAiC;CACrD,CAAC;AAEX,MAAM,uBAAuB,GAAoC;IAC/D,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,QAAQ,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,2CAA2C,EAAE,QAAQ,CAAC;KAC5E,CAAC;IACF,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAgB,4BAA4B,CAAC,QAAgB;IAC3D,OAAO,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,yBAAyB,CAAC,eAAgC;IACjE,IAAI,eAAe,KAAK,YAAY,EAAE,CAAC;QACrC,OAAO,4EAA4E,CAAC;IACtF,CAAC;IACD,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,uHAAuH,CAAC;IACjI,CAAC;IACD,OAAO,+HAA+H,CAAC;AACzI,CAAC;AAED,SAAS,eAAe,CAAC,eAAgC;IACvD,IAAI,eAAe,KAAK,YAAY,EAAE,CAAC;QACrC,OAAO;YACL,wEAAwE;YACxE,gFAAgF;YAChF,qGAAqG;YACrG,oEAAoE;SACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,OAAO;QACL,oEAAoE;QACpE,2CAA2C,uBAAuB,CAAC,eAAe,CAAC,8CAA8C;QACjI,oGAAoG;QACpG,eAAe,KAAK,QAAQ;YAC1B,CAAC,CAAC,+PAA+P;YACjQ,CAAC,CAAC,sJAAsJ;KAC3J,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB,EAAE,OAAgC;IAC7E,MAAM,MAAM,GAAG,IAAA,6BAAW,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC3C,MAAM,YAAY,GAA2B;QAC3C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,oBAAoB,EAAE,uBAAuB,CAAC,OAAO,CAAC,eAAe,CAAC;QACtE,sBAAsB,EAAE,yBAAyB,CAAC,OAAO,CAAC,eAAe,CAAC;QAC1E,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC;QACtD,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,oBAAoB;QAChE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB;QAChE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACtC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY;QACxC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,yBAAyB;QACxE,iBAAiB,EAAE,KAAK;YACtB,CAAC,CAAC,0UAA0U;YAC5U,CAAC,CAAC,+IAA+I;QACnJ,WAAW,EAAE,KAAK;YAChB,CAAC,CAAC,orBAAorB;YACtrB,CAAC,CAAC,4MAA4M;QAChN,EAAE,EAAE,OAAO,CAAC,cAAc;QAC1B,MAAM;KACP,CAAC;IAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,WAAW,EAAE,GAAW,EAAE,EAAE;QACnF,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,0CAA0C,WAAW,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,OAAgC;IACvE,OAAO,mBAAmB,CAAC,4BAA4B,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,aAAa,CAAC,OAAgC;IAC5D,OAAO,aAAa,CAAC,4BAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,SAAgB,aAAa,CAAC,OAAgC;IAC5D,OAAO,aAAa,CAAC,4BAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,SAAgB,wBAAwB,CAAC,OAAgC;IACvE,OAAO,aAAa,CAAC,4BAAoB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,SAAgB,6BAA6B,CAC3C,OAAgC;IAEhC,OAAO;QACL,CAAC,4BAAoB,CAAC,wBAAwB,CAAC,EAAE,aAAa,CAC5D,4BAAoB,CAAC,wBAAwB,EAC7C,OAAO,CACR;QACD,CAAC,4BAAoB,CAAC,qBAAqB,CAAC,EAAE,aAAa,CACzD,4BAAoB,CAAC,qBAAqB,EAC1C,OAAO,CACR;QACD,CAAC,4BAAoB,CAAC,0BAA0B,CAAC,EAAE,aAAa,CAC9D,4BAAoB,CAAC,0BAA0B,EAC/C,OAAO,CACR;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,8BAA8B,CAC5C,OAAgC;IAEhC,OAAO;QACL,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC;QAChC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC;QAChC,mBAAmB,EAAE,wBAAwB,CAAC,OAAO,CAAC;QACtD,wBAAwB,EAAE,6BAA6B,CAAC,OAAO,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,SAAgB,0BAA0B,CACxC,UAAkB,EAClB,OAAgC;IAEhC,MAAM,SAAS,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAElF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC7D,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,EAC/C,SAAS,CAAC,mBAAmB,EAC7B,OAAO,CACR,CAAC;IACF,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACrF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* - shared: マーカー区切りの共有領域。マーカー内は SwallowKit、外は自由。
|
|
11
11
|
*/
|
|
12
12
|
import { ArtifactOwnership } from "../operations/file-session";
|
|
13
|
+
import { BackendLanguage } from "../../types";
|
|
13
14
|
export type BoundaryZone = "deterministic" | "ai-authored" | "shared";
|
|
14
15
|
export type BoundaryEditPolicy = "never-hand-edit" | "regenerate-via-plan-apply" | "free-edit" | "edit-outside-markers";
|
|
15
16
|
export interface OwnershipPolicy {
|
|
@@ -36,6 +37,8 @@ export interface BoundaryArtifact {
|
|
|
36
37
|
export interface BoundariesContract {
|
|
37
38
|
contractVersion: number;
|
|
38
39
|
summary: string;
|
|
40
|
+
/** backend.language the convention rules were resolved for */
|
|
41
|
+
backendLanguage: BackendLanguage;
|
|
39
42
|
ownershipPolicies: OwnershipPolicy[];
|
|
40
43
|
/** 台帳に載っていないパスの既定規約 */
|
|
41
44
|
conventionRules: BoundaryPathRule[];
|
|
@@ -44,7 +47,7 @@ export interface BoundariesContract {
|
|
|
44
47
|
guidance: string[];
|
|
45
48
|
}
|
|
46
49
|
export declare const OWNERSHIP_POLICIES: OwnershipPolicy[];
|
|
47
|
-
export declare
|
|
50
|
+
export declare function buildConventionRules(backendLanguage: BackendLanguage): BoundaryPathRule[];
|
|
48
51
|
export declare const BOUNDARY_GUIDANCE: string[];
|
|
49
|
-
export declare function inspectBoundaries(projectRoot?: string): BoundariesContract;
|
|
52
|
+
export declare function inspectBoundaries(projectRoot?: string, backendLanguage?: BackendLanguage): BoundariesContract;
|
|
50
53
|
//# sourceMappingURL=boundaries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundaries.d.ts","sourceRoot":"","sources":["../../../src/core/project/boundaries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"boundaries.d.ts","sourceRoot":"","sources":["../../../src/core/project/boundaries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEtE,MAAM,MAAM,kBAAkB,GAC1B,iBAAiB,GACjB,2BAA2B,GAC3B,WAAW,GACX,sBAAsB,CAAC;AAE3B,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,iBAAiB,CAAC;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,eAAe,EAAE,CAAC;IACrC,uBAAuB;IACvB,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,yBAAyB;IACzB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAkC/C,CAAC;AAyEF,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,GAAG,gBAAgB,EAAE,CAEzF;AAID,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAMrC,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,WAAW,GAAE,MAAsB,EACnC,eAAe,GAAE,eAAsC,GACtD,kBAAkB,CAyBpB"}
|
|
@@ -11,8 +11,10 @@
|
|
|
11
11
|
* - shared: マーカー区切りの共有領域。マーカー内は SwallowKit、外は自由。
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.BOUNDARY_GUIDANCE = exports.
|
|
14
|
+
exports.BOUNDARY_GUIDANCE = exports.OWNERSHIP_POLICIES = void 0;
|
|
15
|
+
exports.buildConventionRules = buildConventionRules;
|
|
15
16
|
exports.inspectBoundaries = inspectBoundaries;
|
|
17
|
+
const config_1 = require("../config");
|
|
16
18
|
const artifacts_1 = require("./artifacts");
|
|
17
19
|
exports.OWNERSHIP_POLICIES = [
|
|
18
20
|
{
|
|
@@ -46,7 +48,7 @@ exports.OWNERSHIP_POLICIES = [
|
|
|
46
48
|
howToChange: "Managed entirely by SwallowKit tooling (.swallowkit/). Never hand-edit.",
|
|
47
49
|
},
|
|
48
50
|
];
|
|
49
|
-
|
|
51
|
+
const COMMON_LEADING_RULES = [
|
|
50
52
|
{
|
|
51
53
|
pattern: ".swallowkit/",
|
|
52
54
|
zone: "deterministic",
|
|
@@ -60,16 +62,22 @@ exports.CONVENTION_RULES = [
|
|
|
60
62
|
description: "Zod model schemas — the single source of truth. AI/developers author these freely; deterministic generation derives everything else from them.",
|
|
61
63
|
},
|
|
62
64
|
{
|
|
63
|
-
pattern: "infra/
|
|
64
|
-
zone: "
|
|
65
|
-
editPolicy: "
|
|
66
|
-
description: "
|
|
65
|
+
pattern: "infra/migrations/manifest.json",
|
|
66
|
+
zone: "deterministic",
|
|
67
|
+
editPolicy: "never-hand-edit",
|
|
68
|
+
description: "Infrastructure migration ledger with baseline checksums. Updated by scaffold, `swallowkit migrations add-model`, and `swallowkit create-migration`.",
|
|
67
69
|
},
|
|
68
70
|
{
|
|
69
|
-
pattern: "
|
|
70
|
-
zone: "
|
|
71
|
-
editPolicy: "edit
|
|
72
|
-
description: "
|
|
71
|
+
pattern: "infra/migrations/",
|
|
72
|
+
zone: "ai-authored",
|
|
73
|
+
editPolicy: "free-edit",
|
|
74
|
+
description: "Versioned Bicep migrations. Edit a migration only before it is provisioned; never change an applied migration — add a new one with `swallowkit create-migration <slug>`.",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
pattern: "infra/",
|
|
78
|
+
zone: "deterministic",
|
|
79
|
+
editPolicy: "never-hand-edit",
|
|
80
|
+
description: "Baseline infrastructure (main.bicep and modules) whose checksums are recorded in infra/migrations/manifest.json. Hand edits block scaffold with baseline-drift; add resources through a new migration instead.",
|
|
73
81
|
},
|
|
74
82
|
{
|
|
75
83
|
pattern: "shared/index.ts",
|
|
@@ -77,13 +85,35 @@ exports.CONVENTION_RULES = [
|
|
|
77
85
|
editPolicy: "edit-outside-markers",
|
|
78
86
|
description: "SwallowKit appends model exports; other exports may be added freely.",
|
|
79
87
|
},
|
|
80
|
-
{
|
|
81
|
-
pattern: "*",
|
|
82
|
-
zone: "ai-authored",
|
|
83
|
-
editPolicy: "free-edit",
|
|
84
|
-
description: "Any path not recorded in the artifact ledger is AI/developer-authored. Business logic, custom pages, custom Functions, and tests belong here.",
|
|
85
|
-
},
|
|
86
88
|
];
|
|
89
|
+
/** Backend files that SwallowKit appends to; C# and TypeScript discover functions without a registration file. */
|
|
90
|
+
const BACKEND_EXTENSION_RULES = {
|
|
91
|
+
python: [
|
|
92
|
+
{
|
|
93
|
+
pattern: "functions/function_app.py",
|
|
94
|
+
zone: "shared",
|
|
95
|
+
editPolicy: "edit-outside-markers",
|
|
96
|
+
description: "SwallowKit appends blueprint registrations under its marker; other edits are free.",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
pattern: "functions/requirements.txt",
|
|
100
|
+
zone: "shared",
|
|
101
|
+
editPolicy: "free-edit",
|
|
102
|
+
description: "SwallowKit appends connector driver requirements when connector models are scaffolded; keep those lines and edit other requirements freely.",
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
csharp: [],
|
|
106
|
+
typescript: [],
|
|
107
|
+
};
|
|
108
|
+
const FALLBACK_RULE = {
|
|
109
|
+
pattern: "*",
|
|
110
|
+
zone: "ai-authored",
|
|
111
|
+
editPolicy: "free-edit",
|
|
112
|
+
description: "Any path not recorded in the artifact ledger is AI/developer-authored. Business logic, custom pages, custom Functions, and tests belong here.",
|
|
113
|
+
};
|
|
114
|
+
function buildConventionRules(backendLanguage) {
|
|
115
|
+
return [...COMMON_LEADING_RULES, ...BACKEND_EXTENSION_RULES[backendLanguage], FALLBACK_RULE];
|
|
116
|
+
}
|
|
87
117
|
const POLICY_BY_OWNERSHIP = new Map(exports.OWNERSHIP_POLICIES.map((policy) => [policy.ownership, policy]));
|
|
88
118
|
exports.BOUNDARY_GUIDANCE = [
|
|
89
119
|
"Author models and business logic freely (ai-authored zone), then let SwallowKit derive CRUD/BFF/UI/infra deterministically via plan/apply.",
|
|
@@ -92,7 +122,7 @@ exports.BOUNDARY_GUIDANCE = [
|
|
|
92
122
|
"In shared-zone files, keep SwallowKit markers intact and edit outside them.",
|
|
93
123
|
"Run `swallowkit machine verify project` after applying changes; use `explain failure` to get repair evidence.",
|
|
94
124
|
];
|
|
95
|
-
function inspectBoundaries(projectRoot = process.cwd()) {
|
|
125
|
+
function inspectBoundaries(projectRoot = process.cwd(), backendLanguage = (0, config_1.getBackendLanguage)()) {
|
|
96
126
|
const inspected = (0, artifacts_1.inspectArtifacts)(projectRoot);
|
|
97
127
|
const artifacts = inspected.artifacts.map((artifact) => {
|
|
98
128
|
const policy = POLICY_BY_OWNERSHIP.get(artifact.ownership);
|
|
@@ -108,8 +138,9 @@ function inspectBoundaries(projectRoot = process.cwd()) {
|
|
|
108
138
|
return {
|
|
109
139
|
contractVersion: 1,
|
|
110
140
|
summary: "SwallowKit separates deterministic generation (models → CRUD/BFF/UI/infra via plan/apply) from AI free-form authoring (models, business logic, custom code). This contract tells agents which files belong to which side.",
|
|
141
|
+
backendLanguage,
|
|
111
142
|
ownershipPolicies: exports.OWNERSHIP_POLICIES,
|
|
112
|
-
conventionRules:
|
|
143
|
+
conventionRules: buildConventionRules(backendLanguage),
|
|
113
144
|
artifacts,
|
|
114
145
|
guidance: exports.BOUNDARY_GUIDANCE,
|
|
115
146
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../../src/core/project/boundaries.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;
|
|
1
|
+
{"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../../src/core/project/boundaries.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/core/project/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE;QACT,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,iBAAiB,EAAE,0BAA0B,EAAE,CAAC;IAChD,cAAc,EAAE;QACd,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,EAAE,sBAAsB,EAAE,CAAC;QACpC,qBAAqB,EAAE;YACrB,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,CAAC;YACtB,eAAe,EAAE,OAAO,CAAC;SAC1B,CAAC;KACH,CAAC;IACF,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,YAAY,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/core/project/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE;QACT,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,iBAAiB,EAAE,0BAA0B,EAAE,CAAC;IAChD,cAAc,EAAE;QACd,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,EAAE,sBAAsB,EAAE,CAAC;QACpC,qBAAqB,EAAE;YACrB,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,CAAC;YACtB,eAAe,EAAE,OAAO,CAAC;SAC1B,CAAC;KACH,CAAC;IACF,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,YAAY,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,EAAE,CAAC;KAC/B,CAAC;IACF,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE;QACZ,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,wBAAgB,mBAAmB,IAAI,oBAAoB,CA4J1D"}
|
|
@@ -48,6 +48,13 @@ function inspectCapabilities() {
|
|
|
48
48
|
description: "Role-based access control metadata applied to the generated CRUD Functions. `roles` guards all operations; `read`/`write` guard per-operation; `policy` references a named authorization policy from swallowkit.config auth.authorization.policies.",
|
|
49
49
|
format: "export const authPolicy = { roles: ['admin'] };\n// or per-operation:\nexport const authPolicy = { read: ['user'], write: ['admin'] };\n// or a named policy:\nexport const authPolicy = { policy: 'adminOnly' };",
|
|
50
50
|
},
|
|
51
|
+
{
|
|
52
|
+
name: "references",
|
|
53
|
+
required: false,
|
|
54
|
+
description: "Explicit foreign keys used by generated UI lookups. Without it, a string field named <model>Id is treated as a foreign key only when shared/models contains that model (userId -> User only if user.ts exists). Map a field to false to disable inference. References to missing models are ignored with a reference-model-not-found warning.",
|
|
55
|
+
format: "export const references = { authorId: 'User', legacyId: false };",
|
|
56
|
+
notes: ["Only single string id fields can reference a model.", "No lookup UI, fetch, or OpenAPI reference is generated for fields that do not reference an existing model."],
|
|
57
|
+
},
|
|
51
58
|
{
|
|
52
59
|
name: "connectorConfig",
|
|
53
60
|
required: false,
|
|
@@ -109,6 +116,7 @@ function inspectCapabilities() {
|
|
|
109
116
|
],
|
|
110
117
|
notGuaranteed: [
|
|
111
118
|
"Owner scoping: generated CRUD does NOT restrict rows to the authenticated principal. Any authenticated caller passing the policy can read/write any document.",
|
|
119
|
+
"Without authentication, plan scaffold reports user-scoped-data-without-auth when the partition key or an owner-like field (userId, learnerId, ownerId, ...) suggests per-user data.",
|
|
112
120
|
],
|
|
113
121
|
guidance: [
|
|
114
122
|
"For multi-user data where users may only touch their own records, add ai-authored custom endpoints that derive the scoping key (e.g. learnerId) from the verified principal — never from the request body — and restrict generated write endpoints to admin roles or disable them.",
|
|
@@ -116,6 +124,14 @@ function inspectCapabilities() {
|
|
|
116
124
|
},
|
|
117
125
|
sharedModels: {
|
|
118
126
|
idFieldRule: "id: z.string() (required). createdAt/updatedAt: z.string().optional(). The backend owns their values.",
|
|
127
|
+
nativeSchemaMapping: [
|
|
128
|
+
"C#/Python schema assets derive types from Zod, never from field names: z.string() -> string/str (including createdAt/updatedAt).",
|
|
129
|
+
"Date types only when declared: z.iso.datetime() -> DateTime/datetime, z.iso.date() -> DateOnly/date, z.date() -> DateTime/datetime.",
|
|
130
|
+
"z.number() -> double / float|int; z.number().int() or z.int() -> long / int.",
|
|
131
|
+
"Inline z.object({...}) fields become named classes <Model><Field> (e.g. ProbeItemNested); imported model schemas keep their own class.",
|
|
132
|
+
"min/max/length/nonempty/regex/int/gt/gte/lt/lte/positive/nonnegative and array min/max are enforced by C# IValidatableObject.Validate and Python Field bounds/validators. Regexes use search semantics like Zod.",
|
|
133
|
+
"String formats (email/uuid/url), refinements, and transforms are not re-implemented natively; the BFF Zod schemas remain the authoritative validation.",
|
|
134
|
+
],
|
|
119
135
|
buildNote: "verify typecheck resolves the shared package from its built dist/. SwallowKit rebuilds shared automatically during verify; when typechecking manually, build the shared package first (errors like \"no exported member\" usually mean a stale dist).",
|
|
120
136
|
},
|
|
121
137
|
seeding: {
|
|
@@ -127,10 +143,12 @@ function inspectCapabilities() {
|
|
|
127
143
|
"inspect project | entities | routes | artifacts | boundaries | infra | drift | capabilities",
|
|
128
144
|
"validate project",
|
|
129
145
|
"generate model <names...> | generate scaffold <model>",
|
|
130
|
-
"plan scaffold <models...> | plan auth --provider <p> [--scheme <name>] [--allowed-providers <csv>] | plan provision -g <rg> --location <loc> --swa-location <loc> [--adopt-existing --baseline 0 --what-if] [--reconcile --what-if]",
|
|
131
|
-
"apply scaffold [models...] --plan <id> [--approve] | apply auth --plan <id> [--approve] | apply provision --plan <id> --approve",
|
|
146
|
+
"plan scaffold <models...> [--api-only] [--skip-infra] | plan auth --provider <p> [--scheme <name>] [--allowed-providers <csv>] | plan provision -g <rg> --location <loc> --swa-location <loc> [--adopt-existing --baseline 0 --what-if] [--reconcile --what-if]",
|
|
147
|
+
"apply scaffold [models...] --plan <id> [--approve] [--skip-infra] | apply auth --plan <id> [--approve] | apply provision --plan <id> --approve",
|
|
132
148
|
"verify project [--checks <ids>] [--compact]",
|
|
133
149
|
"explain failure [--check <id>]",
|
|
150
|
+
"(regular CLI) migrations add-model <model> [--dry-run] — generate only the container migration after scaffold --skip-infra",
|
|
151
|
+
"(regular CLI) configure-mcp [--version auto|latest|<semver>] — re-select the MCP launcher version in .mcp.json",
|
|
134
152
|
],
|
|
135
153
|
verifyChecks: {
|
|
136
154
|
defaultChecks: ["structure", "drift", "typecheck"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/core/project/capabilities.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/core/project/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home-page.d.ts","sourceRoot":"","sources":["../../../src/core/project/home-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAe,MAAM,6BAA6B,CAAC;AAG1E,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,iBAAiB,EAC3B,EAAE,EAAE,cAAc,GACjB,MAAM,CA0GR"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildHomePage = buildHomePage;
|
|
4
|
+
const package_manager_1 = require("../../utils/package-manager");
|
|
5
|
+
const react_ui_generator_1 = require("../scaffold/react-ui-generator");
|
|
6
|
+
function buildHomePage(frontend, pm) {
|
|
7
|
+
const framework = frontend === "react" ? "React" : "Next.js";
|
|
8
|
+
const page = `import { useState } from 'react';
|
|
9
|
+
import Link from 'next/link';
|
|
10
|
+
import { scaffoldConfig } from '@/lib/scaffold-config';
|
|
11
|
+
|
|
12
|
+
export default function Home() {
|
|
13
|
+
const [greetingStatus, setGreetingStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle');
|
|
14
|
+
const [message, setMessage] = useState('');
|
|
15
|
+
|
|
16
|
+
const testConnection = async () => {
|
|
17
|
+
setGreetingStatus('loading');
|
|
18
|
+
try {
|
|
19
|
+
const response = await fetch('/api/greet?name=SwallowKit');
|
|
20
|
+
const data = await response.json();
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
throw new Error(data.error || \`Server error: \${response.status}\`);
|
|
23
|
+
}
|
|
24
|
+
setMessage(data.message);
|
|
25
|
+
setGreetingStatus('success');
|
|
26
|
+
} catch (error) {
|
|
27
|
+
setMessage(error instanceof Error ? error.message : 'Failed to connect to Azure Functions');
|
|
28
|
+
setGreetingStatus('error');
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50 dark:from-gray-900 dark:to-gray-800">
|
|
34
|
+
<div className="container mx-auto px-4 py-12">
|
|
35
|
+
<header className="text-center mb-16">
|
|
36
|
+
<h1 className="text-5xl font-bold text-gray-800 dark:text-white mb-4">
|
|
37
|
+
Welcome to SwallowKit
|
|
38
|
+
</h1>
|
|
39
|
+
<p className="text-xl text-gray-600 dark:text-gray-400">
|
|
40
|
+
${framework} on Azure Static Web Apps + Functions + Cosmos DB — Zod schema sharing
|
|
41
|
+
</p>
|
|
42
|
+
</header>
|
|
43
|
+
|
|
44
|
+
<section className="max-w-2xl mx-auto mb-12">
|
|
45
|
+
<div className="bg-white dark:bg-gray-800 rounded-xl p-8 border border-gray-200 dark:border-gray-700">
|
|
46
|
+
<h2 className="text-2xl font-semibold mb-4 text-gray-900 dark:text-gray-100">
|
|
47
|
+
Test BFF → Functions Connection
|
|
48
|
+
</h2>
|
|
49
|
+
<button
|
|
50
|
+
onClick={testConnection}
|
|
51
|
+
disabled={greetingStatus === 'loading'}
|
|
52
|
+
className="px-6 py-3 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-lg font-medium transition-colors"
|
|
53
|
+
>
|
|
54
|
+
{greetingStatus === 'loading' ? 'Testing...' : 'Test Connection'}
|
|
55
|
+
</button>
|
|
56
|
+
{greetingStatus === 'success' && (
|
|
57
|
+
<div role="status" className="mt-4 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg">
|
|
58
|
+
<p className="text-green-800 dark:text-green-200 font-medium">✅ Connection successful!</p>
|
|
59
|
+
<p className="text-green-700 dark:text-green-300 text-sm mt-1">{message}</p>
|
|
60
|
+
</div>
|
|
61
|
+
)}
|
|
62
|
+
{greetingStatus === 'error' && (
|
|
63
|
+
<div role="alert" className="mt-4 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg">
|
|
64
|
+
<p className="text-red-800 dark:text-red-200 font-medium">❌ Connection failed</p>
|
|
65
|
+
<p className="text-red-700 dark:text-red-300 text-sm mt-1">{message}</p>
|
|
66
|
+
</div>
|
|
67
|
+
)}
|
|
68
|
+
</div>
|
|
69
|
+
</section>
|
|
70
|
+
|
|
71
|
+
{scaffoldConfig.models.length > 0 ? (
|
|
72
|
+
<section className="max-w-6xl mx-auto">
|
|
73
|
+
<h2 className="text-3xl font-bold mb-8 text-gray-900 dark:text-gray-100">Your Models</h2>
|
|
74
|
+
<div className="grid gap-6 grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
|
|
75
|
+
{scaffoldConfig.models.map((model) => (
|
|
76
|
+
<Link
|
|
77
|
+
key={model.name}
|
|
78
|
+
href={model.path}
|
|
79
|
+
className="block p-8 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl hover:shadow-lg hover:border-blue-400 dark:hover:border-blue-600 transition-all"
|
|
80
|
+
>
|
|
81
|
+
<h3 className="text-2xl font-semibold mb-2 text-gray-900 dark:text-gray-100">{model.label}</h3>
|
|
82
|
+
<p className="text-gray-600 dark:text-gray-400">Manage {model.label.toLowerCase()}</p>
|
|
83
|
+
</Link>
|
|
84
|
+
))}
|
|
85
|
+
</div>
|
|
86
|
+
</section>
|
|
87
|
+
) : (
|
|
88
|
+
<section className="max-w-2xl mx-auto text-center">
|
|
89
|
+
<div className="bg-white dark:bg-gray-800 rounded-xl p-12 border border-gray-200 dark:border-gray-700">
|
|
90
|
+
<h2 className="text-2xl font-semibold mb-4 text-gray-900 dark:text-gray-100">Get Started</h2>
|
|
91
|
+
<p className="text-gray-600 dark:text-gray-400 mb-6">
|
|
92
|
+
Create your first model with Zod and generate CRUD operations automatically.
|
|
93
|
+
</p>
|
|
94
|
+
<code className="block bg-gray-100 dark:bg-gray-900 p-4 rounded text-left text-sm">
|
|
95
|
+
${(0, package_manager_1.getCommands)(pm).exec} swallowkit scaffold shared/models/your-model.ts
|
|
96
|
+
</code>
|
|
97
|
+
</div>
|
|
98
|
+
</section>
|
|
99
|
+
)}
|
|
100
|
+
|
|
101
|
+
<footer className="mt-16 text-center text-gray-600 dark:text-gray-400 text-sm">
|
|
102
|
+
<p>Built with SwallowKit</p>
|
|
103
|
+
</footer>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
`;
|
|
109
|
+
return frontend === "react"
|
|
110
|
+
? (0, react_ui_generator_1.adaptReactPage)(page)
|
|
111
|
+
: `'use client'\n\nexport const dynamic = 'force-dynamic';\n\n${page}`;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=home-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home-page.js","sourceRoot":"","sources":["../../../src/core/project/home-page.ts"],"names":[],"mappings":";;AAIA,sCA6GC;AAhHD,iEAA0E;AAC1E,uEAAgE;AAEhE,SAAgB,aAAa,CAC3B,QAA2B,EAC3B,EAAkB;IAElB,MAAM,SAAS,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgCD,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAuDL,IAAA,6BAAW,EAAC,EAAE,CAAC,CAAC,IAAI;;;;;;;;;;;;;CAarC,CAAC;IACA,OAAO,QAAQ,KAAK,OAAO;QACzB,CAAC,CAAC,IAAA,mCAAc,EAAC,IAAI,CAAC;QACtB,CAAC,CAAC,8DAA8D,IAAI,EAAE,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-scoped MCP launcher version management.
|
|
3
|
+
*
|
|
4
|
+
* `.mcp.json` intentionally resolves `swallowkit@latest` so that projects created
|
|
5
|
+
* with older releases still get the current stable tools. A prerelease project can
|
|
6
|
+
* be newer than `latest`; in that case the launcher is pinned to the project
|
|
7
|
+
* version until a stable release that understands project-aware delegation catches up.
|
|
8
|
+
*/
|
|
9
|
+
export declare const MCP_CONFIG_PATH = ".mcp.json";
|
|
10
|
+
export declare const MCP_VERSION_ENV = "SWALLOWKIT_MCP_VERSION";
|
|
11
|
+
export declare const MCP_LATEST = "latest";
|
|
12
|
+
export interface McpPinDecision {
|
|
13
|
+
version: string;
|
|
14
|
+
reason: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Decide the SWALLOWKIT_MCP_VERSION value for a project that uses `projectVersion`.
|
|
18
|
+
* Uses `latest` unless the project version is newer than the published `latest`.
|
|
19
|
+
* When the registry could not be reached, prereleases are pinned conservatively.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveMcpPinVersion(projectVersion: string, publishedLatest: string | null): McpPinDecision;
|
|
22
|
+
export declare function lookupPublishedLatestVersion(packageName: string, timeoutMs?: number): string | null;
|
|
23
|
+
export declare function readMcpConfigVersion(projectDir: string): string | null;
|
|
24
|
+
/** Update only the SwallowKit MCP version in .mcp.json, preserving all other content. */
|
|
25
|
+
export declare function writeMcpConfigVersion(projectDir: string, version: string): void;
|
|
26
|
+
//# sourceMappingURL=mcp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../src/core/project/mcp-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,eAAe,2BAA2B,CAAC;AACxD,eAAO,MAAM,UAAU,WAAW,CAAC;AAEnC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAa3G;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,MAAM,GAAG,IAAI,CAYlG;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUtE;AAED,yFAAyF;AACzF,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAY/E"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Project-scoped MCP launcher version management.
|
|
4
|
+
*
|
|
5
|
+
* `.mcp.json` intentionally resolves `swallowkit@latest` so that projects created
|
|
6
|
+
* with older releases still get the current stable tools. A prerelease project can
|
|
7
|
+
* be newer than `latest`; in that case the launcher is pinned to the project
|
|
8
|
+
* version until a stable release that understands project-aware delegation catches up.
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.MCP_LATEST = exports.MCP_VERSION_ENV = exports.MCP_CONFIG_PATH = void 0;
|
|
45
|
+
exports.resolveMcpPinVersion = resolveMcpPinVersion;
|
|
46
|
+
exports.lookupPublishedLatestVersion = lookupPublishedLatestVersion;
|
|
47
|
+
exports.readMcpConfigVersion = readMcpConfigVersion;
|
|
48
|
+
exports.writeMcpConfigVersion = writeMcpConfigVersion;
|
|
49
|
+
const child_process_1 = require("child_process");
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const os = __importStar(require("os"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const semver_1 = require("../../utils/semver");
|
|
54
|
+
exports.MCP_CONFIG_PATH = ".mcp.json";
|
|
55
|
+
exports.MCP_VERSION_ENV = "SWALLOWKIT_MCP_VERSION";
|
|
56
|
+
exports.MCP_LATEST = "latest";
|
|
57
|
+
/**
|
|
58
|
+
* Decide the SWALLOWKIT_MCP_VERSION value for a project that uses `projectVersion`.
|
|
59
|
+
* Uses `latest` unless the project version is newer than the published `latest`.
|
|
60
|
+
* When the registry could not be reached, prereleases are pinned conservatively.
|
|
61
|
+
*/
|
|
62
|
+
function resolveMcpPinVersion(projectVersion, publishedLatest) {
|
|
63
|
+
if (!(0, semver_1.parseSemver)(projectVersion)) {
|
|
64
|
+
return { version: exports.MCP_LATEST, reason: `Project version ${projectVersion} is not a valid semantic version.` };
|
|
65
|
+
}
|
|
66
|
+
if (publishedLatest && (0, semver_1.parseSemver)(publishedLatest)) {
|
|
67
|
+
const comparison = (0, semver_1.compareSemver)(projectVersion, publishedLatest);
|
|
68
|
+
return comparison > 0
|
|
69
|
+
? { version: projectVersion, reason: `Project version ${projectVersion} is newer than published latest ${publishedLatest}.` }
|
|
70
|
+
: { version: exports.MCP_LATEST, reason: `Published latest ${publishedLatest} is the same as or newer than project version ${projectVersion}.` };
|
|
71
|
+
}
|
|
72
|
+
return (0, semver_1.isPrerelease)(projectVersion)
|
|
73
|
+
? { version: projectVersion, reason: `Published latest is unknown; prerelease ${projectVersion} is pinned so MCP matches the project.` }
|
|
74
|
+
: { version: exports.MCP_LATEST, reason: "Published latest is unknown; stable projects keep latest." };
|
|
75
|
+
}
|
|
76
|
+
function lookupPublishedLatestVersion(packageName, timeoutMs = 15000) {
|
|
77
|
+
// Run outside the project so its devEngines/packageManager policy does not reject npm.
|
|
78
|
+
const result = (0, child_process_1.spawnSync)("npm", ["view", `${packageName}@latest`, "version"], {
|
|
79
|
+
cwd: os.tmpdir(),
|
|
80
|
+
encoding: "utf8",
|
|
81
|
+
timeout: timeoutMs,
|
|
82
|
+
shell: process.platform === "win32",
|
|
83
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
84
|
+
});
|
|
85
|
+
if (result.error || result.status !== 0)
|
|
86
|
+
return null;
|
|
87
|
+
const version = String(result.stdout).trim().split(/\s+/).pop() ?? "";
|
|
88
|
+
return (0, semver_1.parseSemver)(version) ? version : null;
|
|
89
|
+
}
|
|
90
|
+
function readMcpConfigVersion(projectDir) {
|
|
91
|
+
const configPath = path.join(projectDir, exports.MCP_CONFIG_PATH);
|
|
92
|
+
if (!fs.existsSync(configPath))
|
|
93
|
+
return null;
|
|
94
|
+
try {
|
|
95
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
96
|
+
const value = config?.mcpServers?.swallowkit?.env?.[exports.MCP_VERSION_ENV];
|
|
97
|
+
return typeof value === "string" ? value : null;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Update only the SwallowKit MCP version in .mcp.json, preserving all other content. */
|
|
104
|
+
function writeMcpConfigVersion(projectDir, version) {
|
|
105
|
+
const configPath = path.join(projectDir, exports.MCP_CONFIG_PATH);
|
|
106
|
+
if (!fs.existsSync(configPath)) {
|
|
107
|
+
throw new Error(`${exports.MCP_CONFIG_PATH} was not found. Run this command from a SwallowKit project root.`);
|
|
108
|
+
}
|
|
109
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
110
|
+
const server = config?.mcpServers?.swallowkit;
|
|
111
|
+
if (!server || typeof server !== "object") {
|
|
112
|
+
throw new Error(`${exports.MCP_CONFIG_PATH} does not define mcpServers.swallowkit.`);
|
|
113
|
+
}
|
|
114
|
+
server.env = { ...(server.env ?? {}), [exports.MCP_VERSION_ENV]: version };
|
|
115
|
+
fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../src/core/project/mcp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ export declare function buildReactSwaConfig(): {
|
|
|
17
17
|
"X-Frame-Options": string;
|
|
18
18
|
};
|
|
19
19
|
};
|
|
20
|
-
export declare function createReactProject(projectDir: string, projectName: string): void;
|
|
20
|
+
export declare function createReactProject(projectDir: string, projectName: string, pm?: PackageManager): void;
|
|
21
21
|
export declare function createReactBffProject(projectDir: string, projectName: string, pm: PackageManager): void;
|
|
22
22
|
export declare function buildReactBffBuildSource(): string;
|
|
23
23
|
export declare function buildReactReadme(projectName: string, pm: PackageManager, backend: BackendLanguage): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-project.d.ts","sourceRoot":"","sources":["../../../src/core/project/react-project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"react-project.d.ts","sourceRoot":"","sources":["../../../src/core/project/react-project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9C,OAAO,EACL,cAAc,EAIf,MAAM,6BAA6B,CAAC;AAiBrC,wBAAgB,mBAAmB;;;;;;;;;;;;;;;;EAkBlC;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,EAAE,GAAE,cAAuB,GAC1B,IAAI,CAyKN;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,cAAc,GACjB,IAAI,CAqGN;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAkBjD;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,eAAe,GACvB,MAAM,CA8ER;AAgBD,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CA4CtE;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAkCrE"}
|