@kindgi/cli 0.0.0-bootstrap.0 → 0.1.1
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 +201 -0
- package/README.md +738 -1
- package/dist/build/apt.d.ts +16 -0
- package/dist/build/apt.d.ts.map +1 -0
- package/dist/build/apt.js +50 -0
- package/dist/build/apt.js.map +1 -0
- package/dist/build/bundle.d.ts +48 -0
- package/dist/build/bundle.d.ts.map +1 -0
- package/dist/build/bundle.js +125 -0
- package/dist/build/bundle.js.map +1 -0
- package/dist/build/containerfile.d.ts +27 -0
- package/dist/build/containerfile.d.ts.map +1 -0
- package/dist/build/containerfile.js +197 -0
- package/dist/build/containerfile.js.map +1 -0
- package/dist/build/context-files.d.ts +24 -0
- package/dist/build/context-files.d.ts.map +1 -0
- package/dist/build/context-files.js +99 -0
- package/dist/build/context-files.js.map +1 -0
- package/dist/build/defaults.d.ts +66 -0
- package/dist/build/defaults.d.ts.map +1 -0
- package/dist/build/defaults.js +597 -0
- package/dist/build/defaults.js.map +1 -0
- package/dist/build/envelope.d.ts +72 -0
- package/dist/build/envelope.d.ts.map +1 -0
- package/dist/build/envelope.js +76 -0
- package/dist/build/envelope.js.map +1 -0
- package/dist/build/host-install.d.ts +100 -0
- package/dist/build/host-install.d.ts.map +1 -0
- package/dist/build/host-install.js +443 -0
- package/dist/build/host-install.js.map +1 -0
- package/dist/build/image-config.d.ts +32 -0
- package/dist/build/image-config.d.ts.map +1 -0
- package/dist/build/image-config.js +129 -0
- package/dist/build/image-config.js.map +1 -0
- package/dist/build/integrity.d.ts +51 -0
- package/dist/build/integrity.d.ts.map +1 -0
- package/dist/build/integrity.js +75 -0
- package/dist/build/integrity.js.map +1 -0
- package/dist/build/node-image.d.ts +18 -0
- package/dist/build/node-image.d.ts.map +1 -0
- package/dist/build/node-image.js +46 -0
- package/dist/build/node-image.js.map +1 -0
- package/dist/build/pack-root.d.ts +69 -0
- package/dist/build/pack-root.d.ts.map +1 -0
- package/dist/build/pack-root.js +102 -0
- package/dist/build/pack-root.js.map +1 -0
- package/dist/build/poetry-requirements.d.ts +5 -0
- package/dist/build/poetry-requirements.d.ts.map +1 -0
- package/dist/build/poetry-requirements.js +8 -0
- package/dist/build/poetry-requirements.js.map +1 -0
- package/dist/build/python-image.d.ts +40 -0
- package/dist/build/python-image.d.ts.map +1 -0
- package/dist/build/python-image.js +197 -0
- package/dist/build/python-image.js.map +1 -0
- package/dist/build/runners.d.ts +259 -0
- package/dist/build/runners.d.ts.map +1 -0
- package/dist/build/runners.js +4 -0
- package/dist/build/runners.js.map +1 -0
- package/dist/build/version-specifier.d.ts +2 -0
- package/dist/build/version-specifier.d.ts.map +1 -0
- package/dist/build/version-specifier.js +70 -0
- package/dist/build/version-specifier.js.map +1 -0
- package/dist/cli-package.d.ts +15 -0
- package/dist/cli-package.d.ts.map +1 -0
- package/dist/cli-package.js +37 -0
- package/dist/cli-package.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +26 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/adapters.d.ts +3 -0
- package/dist/commands/adapters.d.ts.map +1 -0
- package/dist/commands/adapters.js +148 -0
- package/dist/commands/adapters.js.map +1 -0
- package/dist/commands/agents.d.ts +3 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +82 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/approvals.d.ts +3 -0
- package/dist/commands/approvals.d.ts.map +1 -0
- package/dist/commands/approvals.js +92 -0
- package/dist/commands/approvals.js.map +1 -0
- package/dist/commands/artifacts.d.ts +3 -0
- package/dist/commands/artifacts.d.ts.map +1 -0
- package/dist/commands/artifacts.js +87 -0
- package/dist/commands/artifacts.js.map +1 -0
- package/dist/commands/auth.d.ts +25 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +283 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/build.d.ts +46 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +902 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/capabilities.d.ts +3 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +38 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/conversations.d.ts +3 -0
- package/dist/commands/conversations.d.ts.map +1 -0
- package/dist/commands/conversations.js +75 -0
- package/dist/commands/conversations.js.map +1 -0
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +697 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +43 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +1110 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/env.d.ts +27 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +816 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/feedback.d.ts +33 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +374 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/flows.d.ts +3 -0
- package/dist/commands/flows.d.ts.map +1 -0
- package/dist/commands/flows.js +60 -0
- package/dist/commands/flows.js.map +1 -0
- package/dist/commands/guardrails.d.ts +3 -0
- package/dist/commands/guardrails.d.ts.map +1 -0
- package/dist/commands/guardrails.js +89 -0
- package/dist/commands/guardrails.js.map +1 -0
- package/dist/commands/health.d.ts +8 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +40 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/helpers.d.ts +48 -0
- package/dist/commands/helpers.d.ts.map +1 -0
- package/dist/commands/helpers.js +110 -0
- package/dist/commands/helpers.js.map +1 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +90 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +46 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +454 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/key.d.ts +3 -0
- package/dist/commands/key.d.ts.map +1 -0
- package/dist/commands/key.js +322 -0
- package/dist/commands/key.js.map +1 -0
- package/dist/commands/mcp.d.ts +43 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +433 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/memory.d.ts +3 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +82 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/observations.d.ts +3 -0
- package/dist/commands/observations.d.ts.map +1 -0
- package/dist/commands/observations.js +27 -0
- package/dist/commands/observations.js.map +1 -0
- package/dist/commands/proposals.d.ts +3 -0
- package/dist/commands/proposals.d.ts.map +1 -0
- package/dist/commands/proposals.js +116 -0
- package/dist/commands/proposals.js.map +1 -0
- package/dist/commands/provenance.d.ts +3 -0
- package/dist/commands/provenance.d.ts.map +1 -0
- package/dist/commands/provenance.js +53 -0
- package/dist/commands/provenance.js.map +1 -0
- package/dist/commands/providers.d.ts +3 -0
- package/dist/commands/providers.d.ts.map +1 -0
- package/dist/commands/providers.js +212 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/reviewers.d.ts +3 -0
- package/dist/commands/reviewers.d.ts.map +1 -0
- package/dist/commands/reviewers.js +78 -0
- package/dist/commands/reviewers.js.map +1 -0
- package/dist/commands/runs.d.ts +3 -0
- package/dist/commands/runs.d.ts.map +1 -0
- package/dist/commands/runs.js +223 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/commands/secrets.d.ts +18 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +702 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/skills.d.ts +64 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +430 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/test.d.ts +5 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +181 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/tokens.d.ts +3 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +33 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/commands/tools.d.ts +3 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +162 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/types.d.ts +54 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +4 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/unwired.d.ts +22 -0
- package/dist/commands/unwired.d.ts.map +1 -0
- package/dist/commands/unwired.js +52 -0
- package/dist/commands/unwired.js.map +1 -0
- package/dist/commands/version.d.ts +8 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +41 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +83 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +162 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +45 -0
- package/dist/context.js.map +1 -0
- package/dist/deploy/defaults.d.ts +14 -0
- package/dist/deploy/defaults.d.ts.map +1 -0
- package/dist/deploy/defaults.js +37 -0
- package/dist/deploy/defaults.js.map +1 -0
- package/dist/deploy/envelope-loader.d.ts +24 -0
- package/dist/deploy/envelope-loader.d.ts.map +1 -0
- package/dist/deploy/envelope-loader.js +141 -0
- package/dist/deploy/envelope-loader.js.map +1 -0
- package/dist/deploy/post.d.ts +48 -0
- package/dist/deploy/post.d.ts.map +1 -0
- package/dist/deploy/post.js +210 -0
- package/dist/deploy/post.js.map +1 -0
- package/dist/deploy/response.d.ts +42 -0
- package/dist/deploy/response.d.ts.map +1 -0
- package/dist/deploy/response.js +128 -0
- package/dist/deploy/response.js.map +1 -0
- package/dist/deploy/runners.d.ts +218 -0
- package/dist/deploy/runners.d.ts.map +1 -0
- package/dist/deploy/runners.js +4 -0
- package/dist/deploy/runners.js.map +1 -0
- package/dist/dev/bundler.d.ts +10 -0
- package/dist/dev/bundler.d.ts.map +1 -0
- package/dist/dev/bundler.js +235 -0
- package/dist/dev/bundler.js.map +1 -0
- package/dist/dev/defaults.d.ts +140 -0
- package/dist/dev/defaults.d.ts.map +1 -0
- package/dist/dev/defaults.js +709 -0
- package/dist/dev/defaults.js.map +1 -0
- package/dist/dev/dev-only-imports.d.ts +15 -0
- package/dist/dev/dev-only-imports.d.ts.map +1 -0
- package/dist/dev/dev-only-imports.js +57 -0
- package/dist/dev/dev-only-imports.js.map +1 -0
- package/dist/dev/docker-compose.dev.yml +68 -0
- package/dist/dev/index-child.d.ts +2 -0
- package/dist/dev/index-child.d.ts.map +1 -0
- package/dist/dev/index-child.js +53 -0
- package/dist/dev/index-child.js.map +1 -0
- package/dist/dev/pack-code.d.ts +36 -0
- package/dist/dev/pack-code.d.ts.map +1 -0
- package/dist/dev/pack-code.js +129 -0
- package/dist/dev/pack-code.js.map +1 -0
- package/dist/dev/pack-env.d.ts +13 -0
- package/dist/dev/pack-env.d.ts.map +1 -0
- package/dist/dev/pack-env.js +36 -0
- package/dist/dev/pack-env.js.map +1 -0
- package/dist/dev/pack-service.d.ts +40 -0
- package/dist/dev/pack-service.d.ts.map +1 -0
- package/dist/dev/pack-service.js +189 -0
- package/dist/dev/pack-service.js.map +1 -0
- package/dist/dev/paths.d.ts +22 -0
- package/dist/dev/paths.d.ts.map +1 -0
- package/dist/dev/paths.js +35 -0
- package/dist/dev/paths.js.map +1 -0
- package/dist/dev/postgres-container.d.ts +77 -0
- package/dist/dev/postgres-container.d.ts.map +1 -0
- package/dist/dev/postgres-container.js +346 -0
- package/dist/dev/postgres-container.js.map +1 -0
- package/dist/dev/python-builder.d.ts +16 -0
- package/dist/dev/python-builder.d.ts.map +1 -0
- package/dist/dev/python-builder.js +122 -0
- package/dist/dev/python-builder.js.map +1 -0
- package/dist/dev/register.d.ts +71 -0
- package/dist/dev/register.d.ts.map +1 -0
- package/dist/dev/register.js +54 -0
- package/dist/dev/register.js.map +1 -0
- package/dist/dev/runners.d.ts +312 -0
- package/dist/dev/runners.d.ts.map +1 -0
- package/dist/dev/runners.js +4 -0
- package/dist/dev/runners.js.map +1 -0
- package/dist/dev/runtime-container.d.ts +71 -0
- package/dist/dev/runtime-container.d.ts.map +1 -0
- package/dist/dev/runtime-container.js +173 -0
- package/dist/dev/runtime-container.js.map +1 -0
- package/dist/dev/runtime-env.d.ts +62 -0
- package/dist/dev/runtime-env.d.ts.map +1 -0
- package/dist/dev/runtime-env.js +100 -0
- package/dist/dev/runtime-env.js.map +1 -0
- package/dist/dev/runtime-image.d.ts +26 -0
- package/dist/dev/runtime-image.d.ts.map +1 -0
- package/dist/dev/runtime-image.js +44 -0
- package/dist/dev/runtime-image.js.map +1 -0
- package/dist/dev/runtime-registry.d.ts +73 -0
- package/dist/dev/runtime-registry.d.ts.map +1 -0
- package/dist/dev/runtime-registry.js +111 -0
- package/dist/dev/runtime-registry.js.map +1 -0
- package/dist/env/defaults.d.ts +3 -0
- package/dist/env/defaults.d.ts.map +1 -0
- package/dist/env/defaults.js +22 -0
- package/dist/env/defaults.js.map +1 -0
- package/dist/env/pack-env-plan.d.ts +70 -0
- package/dist/env/pack-env-plan.d.ts.map +1 -0
- package/dist/env/pack-env-plan.js +236 -0
- package/dist/env/pack-env-plan.js.map +1 -0
- package/dist/env/parser.d.ts +9 -0
- package/dist/env/parser.d.ts.map +1 -0
- package/dist/env/parser.js +11 -0
- package/dist/env/parser.js.map +1 -0
- package/dist/env/project-env.d.ts +34 -0
- package/dist/env/project-env.d.ts.map +1 -0
- package/dist/env/project-env.js +45 -0
- package/dist/env/project-env.js.map +1 -0
- package/dist/env/runners.d.ts +22 -0
- package/dist/env/runners.d.ts.map +1 -0
- package/dist/env/runners.js +4 -0
- package/dist/env/runners.js.map +1 -0
- package/dist/env/writer.d.ts +7 -0
- package/dist/env/writer.d.ts.map +1 -0
- package/dist/env/writer.js +9 -0
- package/dist/env/writer.js.map +1 -0
- package/dist/errors.d.ts +31 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +111 -0
- package/dist/errors.js.map +1 -0
- package/dist/help.d.ts +5 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +61 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/init/augment-scaffolder.d.ts +86 -0
- package/dist/init/augment-scaffolder.d.ts.map +1 -0
- package/dist/init/augment-scaffolder.js +538 -0
- package/dist/init/augment-scaffolder.js.map +1 -0
- package/dist/init/dependency-specs.d.ts +58 -0
- package/dist/init/dependency-specs.d.ts.map +1 -0
- package/dist/init/dependency-specs.js +153 -0
- package/dist/init/dependency-specs.js.map +1 -0
- package/dist/init/gitignore-patcher.d.ts +23 -0
- package/dist/init/gitignore-patcher.d.ts.map +1 -0
- package/dist/init/gitignore-patcher.js +103 -0
- package/dist/init/gitignore-patcher.js.map +1 -0
- package/dist/init/mode-detect.d.ts +34 -0
- package/dist/init/mode-detect.d.ts.map +1 -0
- package/dist/init/mode-detect.js +115 -0
- package/dist/init/mode-detect.js.map +1 -0
- package/dist/init/package-json-patcher.d.ts +36 -0
- package/dist/init/package-json-patcher.d.ts.map +1 -0
- package/dist/init/package-json-patcher.js +128 -0
- package/dist/init/package-json-patcher.js.map +1 -0
- package/dist/init/pnpm-workspace-patcher.d.ts +55 -0
- package/dist/init/pnpm-workspace-patcher.d.ts.map +1 -0
- package/dist/init/pnpm-workspace-patcher.js +248 -0
- package/dist/init/pnpm-workspace-patcher.js.map +1 -0
- package/dist/init/pyproject-patcher.d.ts +56 -0
- package/dist/init/pyproject-patcher.d.ts.map +1 -0
- package/dist/init/pyproject-patcher.js +324 -0
- package/dist/init/pyproject-patcher.js.map +1 -0
- package/dist/init/python-augment.d.ts +22 -0
- package/dist/init/python-augment.d.ts.map +1 -0
- package/dist/init/python-augment.js +300 -0
- package/dist/init/python-augment.js.map +1 -0
- package/dist/init/template-files.d.ts +18 -0
- package/dist/init/template-files.d.ts.map +1 -0
- package/dist/init/template-files.js +53 -0
- package/dist/init/template-files.js.map +1 -0
- package/dist/key/defaults.d.ts +3 -0
- package/dist/key/defaults.d.ts.map +1 -0
- package/dist/key/defaults.js +60 -0
- package/dist/key/defaults.js.map +1 -0
- package/dist/key/fingerprint.d.ts +6 -0
- package/dist/key/fingerprint.d.ts.map +1 -0
- package/dist/key/fingerprint.js +25 -0
- package/dist/key/fingerprint.js.map +1 -0
- package/dist/key/paths.d.ts +30 -0
- package/dist/key/paths.d.ts.map +1 -0
- package/dist/key/paths.js +51 -0
- package/dist/key/paths.js.map +1 -0
- package/dist/key/runners.d.ts +60 -0
- package/dist/key/runners.d.ts.map +1 -0
- package/dist/key/runners.js +4 -0
- package/dist/key/runners.js.map +1 -0
- package/dist/main.d.ts +113 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +199 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/launcher.d.ts +143 -0
- package/dist/mcp/launcher.d.ts.map +1 -0
- package/dist/mcp/launcher.js +393 -0
- package/dist/mcp/launcher.js.map +1 -0
- package/dist/mcp/preset-loader.d.ts +29 -0
- package/dist/mcp/preset-loader.d.ts.map +1 -0
- package/dist/mcp/preset-loader.js +217 -0
- package/dist/mcp/preset-loader.js.map +1 -0
- package/dist/mcp/preset-types.d.ts +71 -0
- package/dist/mcp/preset-types.d.ts.map +1 -0
- package/dist/mcp/preset-types.js +4 -0
- package/dist/mcp/preset-types.js.map +1 -0
- package/dist/mcp/presets/README.md +68 -0
- package/dist/mcp/presets/postgres.json +15 -0
- package/dist/output.d.ts +26 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +46 -0
- package/dist/output.js.map +1 -0
- package/dist/pack-config.d.ts +37 -0
- package/dist/pack-config.d.ts.map +1 -0
- package/dist/pack-config.js +65 -0
- package/dist/pack-config.js.map +1 -0
- package/dist/package-manager.d.ts +33 -0
- package/dist/package-manager.d.ts.map +1 -0
- package/dist/package-manager.js +129 -0
- package/dist/package-manager.js.map +1 -0
- package/dist/parse.d.ts +88 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +100 -0
- package/dist/parse.js.map +1 -0
- package/dist/providers/preset-loader.d.ts +47 -0
- package/dist/providers/preset-loader.d.ts.map +1 -0
- package/dist/providers/preset-loader.js +107 -0
- package/dist/providers/preset-loader.js.map +1 -0
- package/dist/providers/presets/anthropic.json +47 -0
- package/dist/providers/presets/gemini.json +40 -0
- package/dist/reference.d.ts +28 -0
- package/dist/reference.d.ts.map +1 -0
- package/dist/reference.js +52 -0
- package/dist/reference.js.map +1 -0
- package/dist/sdk-package.d.ts +9 -0
- package/dist/sdk-package.d.ts.map +1 -0
- package/dist/sdk-package.js +20 -0
- package/dist/sdk-package.js.map +1 -0
- package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +252 -0
- package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +302 -0
- package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +297 -0
- package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +289 -0
- package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +705 -0
- package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +298 -0
- package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +211 -0
- package/dist/sdk-skills/kindgi-getting-started/SKILL.md +189 -0
- package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +205 -0
- package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +325 -0
- package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +176 -0
- package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +305 -0
- package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +242 -0
- package/dist/stop-signal.d.ts +15 -0
- package/dist/stop-signal.d.ts.map +1 -0
- package/dist/stop-signal.js +16 -0
- package/dist/stop-signal.js.map +1 -0
- package/dist/templates/minimal/.nvmrc +1 -0
- package/dist/templates/minimal/AGENTS.md +23 -0
- package/dist/templates/minimal/README.md.tmpl +69 -0
- package/dist/templates/minimal/agents/.gitkeep +0 -0
- package/dist/templates/minimal/flows/.gitkeep +0 -0
- package/dist/templates/minimal/gitignore +8 -0
- package/dist/templates/minimal/guardrails/.gitkeep +0 -0
- package/dist/templates/minimal/kindgi.config.ts.tmpl +44 -0
- package/dist/templates/minimal/package.json.tmpl +25 -0
- package/dist/templates/minimal/pnpm-workspace.yaml +8 -0
- package/dist/templates/minimal/tools/.gitkeep +0 -0
- package/dist/templates/minimal/tsconfig.json.tmpl +27 -0
- package/dist/templates/minimal/vitest.config.ts.tmpl +14 -0
- package/dist/templates/python/AGENTS.md +30 -0
- package/dist/templates/python/README.md.tmpl +56 -0
- package/dist/templates/python/agents/echo_agent.py.tmpl +23 -0
- package/dist/templates/python/flows/echo_flow.py.tmpl +17 -0
- package/dist/templates/python/gitignore +9 -0
- package/dist/templates/python/guardrails/response_not_empty.py.tmpl +27 -0
- package/dist/templates/python/pyproject.toml.tmpl +42 -0
- package/dist/templates/python/tests/test_tools.py.tmpl +22 -0
- package/dist/templates/python/tools/echo.py.tmpl +27 -0
- package/dist/templates/python/tools/greet.py.tmpl +20 -0
- package/dist/templates/sample/.nvmrc +1 -0
- package/dist/templates/sample/AGENTS.md +23 -0
- package/dist/templates/sample/README.md.tmpl +85 -0
- package/dist/templates/sample/agents/echo-agent/index.ts.tmpl +34 -0
- package/dist/templates/sample/flows/echo-flow/index.ts.tmpl +59 -0
- package/dist/templates/sample/gitignore +8 -0
- package/dist/templates/sample/guardrails/response-not-empty/index.ts.tmpl +58 -0
- package/dist/templates/sample/kindgi.config.ts.tmpl +41 -0
- package/dist/templates/sample/package.json.tmpl +25 -0
- package/dist/templates/sample/pnpm-workspace.yaml +8 -0
- package/dist/templates/sample/tools/echo/index.test.ts.tmpl +31 -0
- package/dist/templates/sample/tools/echo/index.ts.tmpl +37 -0
- package/dist/templates/sample/tools/fetch-httpbin/index.ts.tmpl +60 -0
- package/dist/templates/sample/tools/greet/index.ts.tmpl +35 -0
- package/dist/templates/sample/tsconfig.json.tmpl +27 -0
- package/dist/templates/sample/vitest.config.ts.tmpl +14 -0
- package/dist/terminal-input.d.ts +17 -0
- package/dist/terminal-input.d.ts.map +1 -0
- package/dist/terminal-input.js +88 -0
- package/dist/terminal-input.js.map +1 -0
- package/dist/test/defaults.d.ts +3 -0
- package/dist/test/defaults.d.ts.map +1 -0
- package/dist/test/defaults.js +104 -0
- package/dist/test/defaults.js.map +1 -0
- package/dist/test/runners.d.ts +60 -0
- package/dist/test/runners.d.ts.map +1 -0
- package/dist/test/runners.js +4 -0
- package/dist/test/runners.js.map +1 -0
- package/dist/version-info.d.ts +9 -0
- package/dist/version-info.d.ts.map +1 -0
- package/dist/version-info.js +27 -0
- package/dist/version-info.js.map +1 -0
- package/dist/write-fully.d.ts +13 -0
- package/dist/write-fully.d.ts.map +1 -0
- package/dist/write-fully.js +17 -0
- package/dist/write-fully.js.map +1 -0
- package/package.json +63 -4
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { BuildRunners, DockerBuildOptions, DockerBuildResult, EsbuildBundleOptions, EsbuildBundleResult, LocalIndexResult, PostBuildOptions, PostBuildResult, PullImageIndexOptions, PullImageIndexResult, PythonBuildRunners, RunLocalIndexerOptions, SignOptions, SignResult, StreamBuildLogsOptions, TarPackOptions, TarPackResult, TerminalPayload, WriteContainerfileOptions, WriteContextOptions } from './runners.js';
|
|
2
|
+
/**
|
|
3
|
+
* Index the build the way the image's indexer stage does: the bundled
|
|
4
|
+
* `kindgi-index.mjs`, in its own process, over the same bundles and
|
|
5
|
+
* config, writing `expected-index.json`. Run from the bundles' folder,
|
|
6
|
+
* it loads what the image loads (zod, for one, from the pack's own
|
|
7
|
+
* dependencies), so the two indexes compare like with like.
|
|
8
|
+
*/
|
|
9
|
+
export declare function runLocalIndexerReal(opts: RunLocalIndexerOptions): Promise<LocalIndexResult>;
|
|
10
|
+
/**
|
|
11
|
+
* Bundle a build, into `outputDir` (the image's `dist/`), every bundle
|
|
12
|
+
* `.mjs` with a linked sourcemap:
|
|
13
|
+
* - the pack's primitives and its `kindgi.config.*`: the pack's own
|
|
14
|
+
* code bundled, its installed dependencies left to the image's
|
|
15
|
+
* `node_modules` (imported by name);
|
|
16
|
+
* - the framework's process entries, `kindgi-index.mjs` and
|
|
17
|
+
* `kindgi-pack-service.mjs`: self-contained, from the CLI's own
|
|
18
|
+
* `@kindgi/handler-runtime` (the pack's install has none once
|
|
19
|
+
* pruned);
|
|
20
|
+
* - `bundle-map.json`: each primitive's source path → its bundle.
|
|
21
|
+
*/
|
|
22
|
+
export declare function esbuildBundleReal(opts: EsbuildBundleOptions): Promise<EsbuildBundleResult>;
|
|
23
|
+
export declare function writeContainerfileReal(opts: WriteContainerfileOptions): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Write the image's build context into `contextDir` (emptied first):
|
|
26
|
+
* host/ the files the install reads, at their paths under the install root
|
|
27
|
+
* ext/ the files the build extensions read, at their paths under the install root
|
|
28
|
+
* dist/ the bundles
|
|
29
|
+
* include/ `bundle.include` files, at their pack-relative paths
|
|
30
|
+
* Containerfile
|
|
31
|
+
* Nothing else of the app: never its source, never its `.env` or
|
|
32
|
+
* registry credentials.
|
|
33
|
+
*/
|
|
34
|
+
export declare function writeContextReal(opts: WriteContextOptions): Promise<void>;
|
|
35
|
+
/** Tar a written context (`writeContext`) for the build service. */
|
|
36
|
+
export declare function tarPackReal(opts: TarPackOptions): Promise<TarPackResult>;
|
|
37
|
+
/** A Python pack's build context: the listed pack files plus the Containerfile. */
|
|
38
|
+
export declare function tarContextReal(opts: {
|
|
39
|
+
readonly packDir: string;
|
|
40
|
+
readonly files: readonly string[];
|
|
41
|
+
readonly containerfilePath: string;
|
|
42
|
+
readonly outputPath: string;
|
|
43
|
+
}): Promise<TarPackResult>;
|
|
44
|
+
/** The Python pack's steps of `kindgi build`. */
|
|
45
|
+
export declare const PYTHON_BUILD_RUNNERS: PythonBuildRunners;
|
|
46
|
+
export declare function postBuildReal(opts: PostBuildOptions): Promise<PostBuildResult>;
|
|
47
|
+
export declare function streamBuildLogsReal(opts: StreamBuildLogsOptions): Promise<TerminalPayload>;
|
|
48
|
+
/**
|
|
49
|
+
* Mirror of `packages/build-server/src/docker-wrapper.ts:
|
|
50
|
+
* extractFileFromImage`. Uses `docker create/cp/rm` — the same
|
|
51
|
+
* dependency footprint the build server declares, so a machine that
|
|
52
|
+
* can run the build server also has this path available.
|
|
53
|
+
*/
|
|
54
|
+
export declare function pullImageIndexReal(opts: PullImageIndexOptions): Promise<PullImageIndexResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Build the image from a written context into the local Docker image
|
|
57
|
+
* store: `docker buildx build --load`, registry config passed as
|
|
58
|
+
* BuildKit secrets (never in a layer). Every output line goes to
|
|
59
|
+
* `onLog`.
|
|
60
|
+
*/
|
|
61
|
+
export declare function dockerBuildReal(opts: DockerBuildOptions): Promise<DockerBuildResult>;
|
|
62
|
+
export declare function signEnvelopeReal(opts: SignOptions): Promise<SignResult>;
|
|
63
|
+
export declare const REAL_BUILD_RUNNERS: BuildRunners;
|
|
64
|
+
export declare function defaultBuildWorkDir(): string;
|
|
65
|
+
export declare function sha256HexOf(bytes: Uint8Array): string;
|
|
66
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/build/defaults.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,eAAe,EACf,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,cAAc,CAAC;AAMtB;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CA4D3B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAgE9B;AAsBD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3F;AAMD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B/E;AAED,oEAAoE;AACpE,wBAAsB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAE9E;AAkBD,mFAAmF;AACnF,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC,aAAa,CAAC,CAYzB;AAED,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,EAAE,kBA2BlC,CAAC;AAMF,wBAAsB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8CpF;AAMD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,eAAe,CAAC,CA6C1B;AAMD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAkC/B;AAMD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqD1F;AA6ED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAuB7E;AAMD,eAAO,MAAM,kBAAkB,EAAE,YAYhC,CAAC;AAIF,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* Production wiring for `kindgi build`. Each `BuildRunners` slot is
|
|
5
|
+
* implemented against real infrastructure (esbuild, tar, fetch,
|
|
6
|
+
* @kindgi/handler-runtime.runIndexer, @kindgi/crypto.signEd25519,
|
|
7
|
+
* a docker CLI shell-out). Tests never touch this file — they inject
|
|
8
|
+
* fixtures via `runCli({ buildRunners })`.
|
|
9
|
+
*/
|
|
10
|
+
import { spawn } from 'node:child_process';
|
|
11
|
+
import { createHash, createPrivateKey, createPublicKey } from 'node:crypto';
|
|
12
|
+
import { cp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
13
|
+
import { tmpdir } from 'node:os';
|
|
14
|
+
import { dirname, join, resolve } from 'node:path';
|
|
15
|
+
import { fileURLToPath } from 'node:url';
|
|
16
|
+
import { parsePrivateKeyPem, serializePublicKeyPem, signEd25519 } from '@kindgi/crypto';
|
|
17
|
+
import { readSse } from '@kindgi/sdk/client';
|
|
18
|
+
import { runPythonIndexer } from '../dev/defaults.js';
|
|
19
|
+
import { REQUIRE_BANNER, collectPackEntries, nodeModulesExternalPlugin } from './bundle.js';
|
|
20
|
+
import { renderContainerfile } from './containerfile.js';
|
|
21
|
+
import { installCommands, withoutInstallScripts } from './host-install.js';
|
|
22
|
+
import { renderPythonContainerfile } from './python-image.js';
|
|
23
|
+
// ---------------------------------------------------------------------
|
|
24
|
+
// Local indexer — the integrity-gate baseline
|
|
25
|
+
// ---------------------------------------------------------------------
|
|
26
|
+
/**
|
|
27
|
+
* Index the build the way the image's indexer stage does: the bundled
|
|
28
|
+
* `kindgi-index.mjs`, in its own process, over the same bundles and
|
|
29
|
+
* config, writing `expected-index.json`. Run from the bundles' folder,
|
|
30
|
+
* it loads what the image loads (zod, for one, from the pack's own
|
|
31
|
+
* dependencies), so the two indexes compare like with like.
|
|
32
|
+
*/
|
|
33
|
+
export async function runLocalIndexerReal(opts) {
|
|
34
|
+
const dist = opts.bundleDir;
|
|
35
|
+
const args = [
|
|
36
|
+
'--enable-source-maps',
|
|
37
|
+
join(dist, 'kindgi-index.mjs'),
|
|
38
|
+
'--pack-dir',
|
|
39
|
+
opts.packDir,
|
|
40
|
+
'--config',
|
|
41
|
+
join(dist, 'kindgi.config.mjs'),
|
|
42
|
+
'--bundle-map',
|
|
43
|
+
join(dist, 'bundle-map.json'),
|
|
44
|
+
'--module-root',
|
|
45
|
+
dist,
|
|
46
|
+
'--artifact-version',
|
|
47
|
+
opts.artifactVersion,
|
|
48
|
+
'--published-at',
|
|
49
|
+
opts.publishedAt,
|
|
50
|
+
'--output',
|
|
51
|
+
opts.outputPath,
|
|
52
|
+
];
|
|
53
|
+
const run = await spawnOutcome(process.execPath, args, opts.packDir);
|
|
54
|
+
if (run.code !== 0) {
|
|
55
|
+
// `kindgi-index: <code>: <message>`
|
|
56
|
+
const line = run.stderr.trim().split('\n').pop() ?? '';
|
|
57
|
+
const match = /^kindgi-index: ([a-z-]+): (.*)$/s.exec(line);
|
|
58
|
+
return {
|
|
59
|
+
kind: 'err',
|
|
60
|
+
code: match?.[1] ?? 'index-failed',
|
|
61
|
+
message: match?.[2] ?? (run.stderr.trim() || `kindgi-index exited ${run.code}`),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
let report;
|
|
65
|
+
let index;
|
|
66
|
+
try {
|
|
67
|
+
report = JSON.parse(run.stdout);
|
|
68
|
+
index = JSON.parse(await readFile(opts.outputPath, 'utf8'));
|
|
69
|
+
}
|
|
70
|
+
catch (cause) {
|
|
71
|
+
return {
|
|
72
|
+
kind: 'err',
|
|
73
|
+
code: 'index-read-failed',
|
|
74
|
+
message: `The indexer finished, but its report or ${opts.outputPath} can't be read: ${cause.message}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
kind: 'ok',
|
|
79
|
+
packId: report.packId,
|
|
80
|
+
packVersion: report.packVersion,
|
|
81
|
+
counts: report.counts,
|
|
82
|
+
fileErrors: report.fileErrors.map((e) => ({
|
|
83
|
+
code: e.code,
|
|
84
|
+
message: e.message,
|
|
85
|
+
...(e.filePath !== undefined && { filePath: e.filePath }),
|
|
86
|
+
})),
|
|
87
|
+
index,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------
|
|
91
|
+
// esbuild bundle
|
|
92
|
+
// ---------------------------------------------------------------------
|
|
93
|
+
/**
|
|
94
|
+
* Bundle a build, into `outputDir` (the image's `dist/`), every bundle
|
|
95
|
+
* `.mjs` with a linked sourcemap:
|
|
96
|
+
* - the pack's primitives and its `kindgi.config.*`: the pack's own
|
|
97
|
+
* code bundled, its installed dependencies left to the image's
|
|
98
|
+
* `node_modules` (imported by name);
|
|
99
|
+
* - the framework's process entries, `kindgi-index.mjs` and
|
|
100
|
+
* `kindgi-pack-service.mjs`: self-contained, from the CLI's own
|
|
101
|
+
* `@kindgi/handler-runtime` (the pack's install has none once
|
|
102
|
+
* pruned);
|
|
103
|
+
* - `bundle-map.json`: each primitive's source path → its bundle.
|
|
104
|
+
*/
|
|
105
|
+
export async function esbuildBundleReal(opts) {
|
|
106
|
+
const esbuild = await import('esbuild');
|
|
107
|
+
await rm(opts.outputDir, { recursive: true, force: true });
|
|
108
|
+
await mkdir(opts.outputDir, { recursive: true });
|
|
109
|
+
const common = {
|
|
110
|
+
absWorkingDir: opts.packDir,
|
|
111
|
+
outdir: opts.outputDir,
|
|
112
|
+
outExtension: { '.js': '.mjs' },
|
|
113
|
+
bundle: true,
|
|
114
|
+
format: 'esm',
|
|
115
|
+
platform: 'node',
|
|
116
|
+
target: `node${opts.nodeMajor}`,
|
|
117
|
+
sourcemap: 'linked',
|
|
118
|
+
banner: { js: REQUIRE_BANNER },
|
|
119
|
+
metafile: true,
|
|
120
|
+
logLevel: 'silent',
|
|
121
|
+
// Readable stack traces in the image; no minification.
|
|
122
|
+
minify: false,
|
|
123
|
+
};
|
|
124
|
+
const packEntries = await collectPackEntries(opts.packDir, opts.discoveryPatterns);
|
|
125
|
+
const externalPackages = new Set();
|
|
126
|
+
const externals = nodeModulesExternalPlugin({
|
|
127
|
+
importBy: 'bare',
|
|
128
|
+
onExternal: (name) => externalPackages.add(name),
|
|
129
|
+
});
|
|
130
|
+
const pack = await esbuild.build({
|
|
131
|
+
...common,
|
|
132
|
+
entryPoints: [
|
|
133
|
+
...packEntries.map((e) => ({ in: e.abs, out: e.outRel })),
|
|
134
|
+
{ in: opts.configPath, out: 'kindgi.config' },
|
|
135
|
+
],
|
|
136
|
+
plugins: [externals],
|
|
137
|
+
});
|
|
138
|
+
// Resolved from the CLI's own package, whose dependency it is.
|
|
139
|
+
const cliRoot = await cliPackageRoot();
|
|
140
|
+
const framework = await esbuild.build({
|
|
141
|
+
...common,
|
|
142
|
+
absWorkingDir: cliRoot,
|
|
143
|
+
entryPoints: [
|
|
144
|
+
{ in: '@kindgi/handler-runtime/kindgi-index-main', out: 'kindgi-index' },
|
|
145
|
+
{ in: '@kindgi/handler-runtime/pack-service-main', out: 'kindgi-pack-service' },
|
|
146
|
+
],
|
|
147
|
+
});
|
|
148
|
+
const bundleMap = {};
|
|
149
|
+
for (const entry of packEntries)
|
|
150
|
+
bundleMap[entry.sourceRel] = `${entry.outRel}.mjs`;
|
|
151
|
+
await writeFile(join(opts.outputDir, 'bundle-map.json'), `${JSON.stringify(bundleMap, null, 2)}\n`, 'utf8');
|
|
152
|
+
// Metafile output keys are relative to each build's `absWorkingDir`.
|
|
153
|
+
const outputs = [
|
|
154
|
+
...Object.entries(pack.metafile?.outputs ?? {}).map(([p, o]) => [resolve(opts.packDir, p), o]),
|
|
155
|
+
...Object.entries(framework.metafile?.outputs ?? {}).map(([p, o]) => [resolve(cliRoot, p), o]),
|
|
156
|
+
];
|
|
157
|
+
return {
|
|
158
|
+
emitted: outputs.map(([p]) => p).sort(),
|
|
159
|
+
totalBytes: outputs.reduce((sum, [, o]) => sum + o.bytes, 0),
|
|
160
|
+
externals: [...externalPackages].sort(),
|
|
161
|
+
bundleMap,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/** The `@kindgi/cli` package folder (this file's nearest `package.json`). */
|
|
165
|
+
async function cliPackageRoot() {
|
|
166
|
+
let dir = dirname(fileURLToPath(import.meta.url));
|
|
167
|
+
for (;;) {
|
|
168
|
+
try {
|
|
169
|
+
const pkg = JSON.parse(await readFile(join(dir, 'package.json'), 'utf8'));
|
|
170
|
+
if (pkg.name === '@kindgi/cli')
|
|
171
|
+
return dir;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// not here
|
|
175
|
+
}
|
|
176
|
+
const parent = dirname(dir);
|
|
177
|
+
if (parent === dir)
|
|
178
|
+
throw new Error('kindgi build: cannot find the @kindgi/cli package folder');
|
|
179
|
+
dir = parent;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// ---------------------------------------------------------------------
|
|
183
|
+
// Containerfile
|
|
184
|
+
// ---------------------------------------------------------------------
|
|
185
|
+
export async function writeContainerfileReal(opts) {
|
|
186
|
+
const text = renderContainerfile({
|
|
187
|
+
baseImageRef: opts.baseImageRef,
|
|
188
|
+
artifactVersion: opts.artifactVersion,
|
|
189
|
+
publishedAt: opts.publishedAt,
|
|
190
|
+
buildTarget: opts.buildTarget,
|
|
191
|
+
install: opts.install,
|
|
192
|
+
commands: installCommands(opts.install),
|
|
193
|
+
image: opts.image,
|
|
194
|
+
hasIncludes: opts.hasIncludes,
|
|
195
|
+
});
|
|
196
|
+
await mkdir(join(opts.outputPath, '..'), { recursive: true });
|
|
197
|
+
await writeFile(opts.outputPath, text, 'utf8');
|
|
198
|
+
}
|
|
199
|
+
// ---------------------------------------------------------------------
|
|
200
|
+
// Build context + tarball
|
|
201
|
+
// ---------------------------------------------------------------------
|
|
202
|
+
/**
|
|
203
|
+
* Write the image's build context into `contextDir` (emptied first):
|
|
204
|
+
* host/ the files the install reads, at their paths under the install root
|
|
205
|
+
* ext/ the files the build extensions read, at their paths under the install root
|
|
206
|
+
* dist/ the bundles
|
|
207
|
+
* include/ `bundle.include` files, at their pack-relative paths
|
|
208
|
+
* Containerfile
|
|
209
|
+
* Nothing else of the app: never its source, never its `.env` or
|
|
210
|
+
* registry credentials.
|
|
211
|
+
*/
|
|
212
|
+
export async function writeContextReal(opts) {
|
|
213
|
+
await rm(opts.contextDir, { recursive: true, force: true });
|
|
214
|
+
await mkdir(opts.contextDir, { recursive: true });
|
|
215
|
+
const projectManifests = new Set(opts.install.projectManifests);
|
|
216
|
+
for (const rel of opts.install.files) {
|
|
217
|
+
const dest = join(opts.contextDir, 'host', rel);
|
|
218
|
+
await mkdir(dirname(dest), { recursive: true });
|
|
219
|
+
if (projectManifests.has(rel)) {
|
|
220
|
+
// The app's own install scripts never run in the image.
|
|
221
|
+
const text = await readFile(join(opts.install.root, rel), 'utf8');
|
|
222
|
+
await writeFile(dest, withoutInstallScripts(text), 'utf8');
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
await cp(join(opts.install.root, rel), dest);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
for (const rel of opts.extensionFiles) {
|
|
229
|
+
const dest = join(opts.contextDir, 'ext', opts.install.packRel, rel);
|
|
230
|
+
await mkdir(dirname(dest), { recursive: true });
|
|
231
|
+
await cp(join(opts.packDir, rel), dest);
|
|
232
|
+
}
|
|
233
|
+
await cp(opts.bundleDir, join(opts.contextDir, 'dist'), { recursive: true });
|
|
234
|
+
for (const rel of opts.includes) {
|
|
235
|
+
const dest = join(opts.contextDir, 'include', rel);
|
|
236
|
+
await mkdir(dirname(dest), { recursive: true });
|
|
237
|
+
await cp(join(opts.packDir, rel), dest);
|
|
238
|
+
}
|
|
239
|
+
await cp(opts.containerfilePath, join(opts.contextDir, 'Containerfile'));
|
|
240
|
+
}
|
|
241
|
+
/** Tar a written context (`writeContext`) for the build service. */
|
|
242
|
+
export async function tarPackReal(opts) {
|
|
243
|
+
return deterministicTar(opts.contextDir, opts.outputPath);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Gzip `contextDir` into `outputPath` with every mtime at the epoch, so the
|
|
247
|
+
* tarball's hash depends only on its content; the scratch context is
|
|
248
|
+
* removed afterwards.
|
|
249
|
+
*/
|
|
250
|
+
async function deterministicTar(contextDir, outputPath) {
|
|
251
|
+
const tar = await import('tar');
|
|
252
|
+
await tar.create({ gzip: true, cwd: contextDir, portable: true, file: outputPath, mtime: new Date(0) }, ['.']);
|
|
253
|
+
const bytes = await readFile(outputPath);
|
|
254
|
+
await rm(contextDir, { recursive: true, force: true });
|
|
255
|
+
return { path: outputPath, bytes: new Uint8Array(bytes), size: bytes.length };
|
|
256
|
+
}
|
|
257
|
+
/** A Python pack's build context: the listed pack files plus the Containerfile. */
|
|
258
|
+
export async function tarContextReal(opts) {
|
|
259
|
+
const { cp } = await import('node:fs/promises');
|
|
260
|
+
const contextDir = join(join(opts.outputPath, '..'), '.tar-context');
|
|
261
|
+
await rm(contextDir, { recursive: true, force: true });
|
|
262
|
+
await mkdir(contextDir, { recursive: true });
|
|
263
|
+
for (const rel of opts.files) {
|
|
264
|
+
const dest = join(contextDir, rel);
|
|
265
|
+
await mkdir(dirname(dest), { recursive: true });
|
|
266
|
+
await cp(join(opts.packDir, rel), dest);
|
|
267
|
+
}
|
|
268
|
+
await cp(opts.containerfilePath, join(contextDir, 'Containerfile'));
|
|
269
|
+
return deterministicTar(contextDir, opts.outputPath);
|
|
270
|
+
}
|
|
271
|
+
/** The Python pack's steps of `kindgi build`. */
|
|
272
|
+
export const PYTHON_BUILD_RUNNERS = {
|
|
273
|
+
runLocalIndexer: (opts) => runPythonIndexer({
|
|
274
|
+
packDir: opts.packDir,
|
|
275
|
+
outputPath: opts.outputPath,
|
|
276
|
+
python: opts.python,
|
|
277
|
+
env: opts.env,
|
|
278
|
+
artifactVersion: opts.artifactVersion,
|
|
279
|
+
publishedAt: opts.publishedAt,
|
|
280
|
+
}),
|
|
281
|
+
async writeContainerfile(opts) {
|
|
282
|
+
await mkdir(join(opts.outputPath, '..'), { recursive: true });
|
|
283
|
+
await writeFile(opts.outputPath, renderPythonContainerfile({
|
|
284
|
+
baseImageRef: opts.baseImageRef,
|
|
285
|
+
uvImageRef: opts.uvImageRef,
|
|
286
|
+
artifactVersion: opts.artifactVersion,
|
|
287
|
+
publishedAt: opts.publishedAt,
|
|
288
|
+
buildTarget: opts.buildTarget,
|
|
289
|
+
installer: opts.installer,
|
|
290
|
+
systemPackages: opts.systemPackages,
|
|
291
|
+
}), 'utf8');
|
|
292
|
+
},
|
|
293
|
+
tarContext: tarContextReal,
|
|
294
|
+
};
|
|
295
|
+
// ---------------------------------------------------------------------
|
|
296
|
+
// POST /v1/build
|
|
297
|
+
// ---------------------------------------------------------------------
|
|
298
|
+
export async function postBuildReal(opts) {
|
|
299
|
+
const form = new FormData();
|
|
300
|
+
const blob = new Blob([opts.tarballBytes], { type: 'application/gzip' });
|
|
301
|
+
form.append('pack.tgz', blob, 'pack.tgz');
|
|
302
|
+
form.append('buildTarget', opts.buildTarget);
|
|
303
|
+
if (opts.registryPushCredsRef !== undefined) {
|
|
304
|
+
form.append('registryPushCredsRef', opts.registryPushCredsRef);
|
|
305
|
+
}
|
|
306
|
+
const url = `${opts.endpoint.replace(/\/+$/, '')}/v1/build`;
|
|
307
|
+
const res = await opts.fetchImpl(url, {
|
|
308
|
+
method: 'POST',
|
|
309
|
+
headers: { 'X-Content-SHA256': opts.tarballSha256 },
|
|
310
|
+
body: form,
|
|
311
|
+
});
|
|
312
|
+
if (res.status !== 200 && res.status !== 202) {
|
|
313
|
+
const errBody = await res.text().catch(() => '');
|
|
314
|
+
throw new Error(`POST /v1/build failed with HTTP ${res.status}: ${errBody}`);
|
|
315
|
+
}
|
|
316
|
+
const payload = (await res.json());
|
|
317
|
+
const terminal = payload.status === 'completed' || payload.status === 'failed'
|
|
318
|
+
? {
|
|
319
|
+
status: payload.status,
|
|
320
|
+
...(payload.imageRef !== undefined && { imageRef: payload.imageRef }),
|
|
321
|
+
...(payload.imageDigest !== undefined && { imageDigest: payload.imageDigest }),
|
|
322
|
+
...(payload.indexJson !== undefined && { indexJson: payload.indexJson }),
|
|
323
|
+
...(payload.indexHash !== undefined && { indexHash: payload.indexHash }),
|
|
324
|
+
...(payload.buildLogsUrl !== undefined && { buildLogsUrl: payload.buildLogsUrl }),
|
|
325
|
+
...(payload.error !== undefined && { error: payload.error }),
|
|
326
|
+
}
|
|
327
|
+
: undefined;
|
|
328
|
+
return {
|
|
329
|
+
buildJobId: payload.buildJobId,
|
|
330
|
+
status: payload.status,
|
|
331
|
+
buildLogsUrl: payload.buildLogsUrl,
|
|
332
|
+
...(terminal !== undefined && { terminal }),
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
// ---------------------------------------------------------------------
|
|
336
|
+
// SSE stream of build logs
|
|
337
|
+
// ---------------------------------------------------------------------
|
|
338
|
+
export async function streamBuildLogsReal(opts) {
|
|
339
|
+
const url = `${opts.endpoint.replace(/\/+$/, '')}/v1/build/${opts.buildJobId}/stream`;
|
|
340
|
+
let terminal;
|
|
341
|
+
const iter = readSse({
|
|
342
|
+
url,
|
|
343
|
+
fetchImpl: opts.fetchImpl,
|
|
344
|
+
...(opts.signal !== undefined && { signal: opts.signal }),
|
|
345
|
+
// The build server's stream is single-shot; disable auto-retry.
|
|
346
|
+
shouldRetry: () => false,
|
|
347
|
+
});
|
|
348
|
+
for await (const event of iter) {
|
|
349
|
+
if (event.event === 'log') {
|
|
350
|
+
const data = event.data;
|
|
351
|
+
if (typeof data.line === 'string')
|
|
352
|
+
opts.onLog(data.line);
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
if (event.event === 'terminal') {
|
|
356
|
+
const data = event.data;
|
|
357
|
+
terminal = {
|
|
358
|
+
status: data.status,
|
|
359
|
+
...(data.imageRef !== undefined && { imageRef: data.imageRef }),
|
|
360
|
+
...(data.imageDigest !== undefined && { imageDigest: data.imageDigest }),
|
|
361
|
+
...(data.indexJson !== undefined && { indexJson: data.indexJson }),
|
|
362
|
+
...(data.indexHash !== undefined && { indexHash: data.indexHash }),
|
|
363
|
+
...(data.buildLogsUrl !== undefined && { buildLogsUrl: data.buildLogsUrl }),
|
|
364
|
+
...(data.error !== undefined && { error: data.error }),
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
if (terminal === undefined) {
|
|
369
|
+
throw new Error(`SSE stream closed without a terminal event for buildJobId ${opts.buildJobId}`);
|
|
370
|
+
}
|
|
371
|
+
return terminal;
|
|
372
|
+
}
|
|
373
|
+
// ---------------------------------------------------------------------
|
|
374
|
+
// docker pull + extract /app/index.json (for the byte-diff path)
|
|
375
|
+
// ---------------------------------------------------------------------
|
|
376
|
+
/**
|
|
377
|
+
* Mirror of `packages/build-server/src/docker-wrapper.ts:
|
|
378
|
+
* extractFileFromImage`. Uses `docker create/cp/rm` — the same
|
|
379
|
+
* dependency footprint the build server declares, so a machine that
|
|
380
|
+
* can run the build server also has this path available.
|
|
381
|
+
*/
|
|
382
|
+
export async function pullImageIndexReal(opts) {
|
|
383
|
+
await mkdir(opts.workDir, { recursive: true });
|
|
384
|
+
const onLog = opts.onLog ?? (() => { });
|
|
385
|
+
const platform = opts.platform !== undefined ? ['--platform', opts.platform] : [];
|
|
386
|
+
if (opts.pull !== false) {
|
|
387
|
+
onLog(`docker pull ${opts.imageRef}`);
|
|
388
|
+
await spawnCapture('docker', ['pull', ...platform, opts.imageRef], opts.signal);
|
|
389
|
+
}
|
|
390
|
+
const containerId = (await spawnCapture('docker', ['create', ...platform, opts.imageRef], opts.signal)).trim();
|
|
391
|
+
const localCopy = join(opts.workDir, 'server-index.json');
|
|
392
|
+
try {
|
|
393
|
+
onLog(`docker cp ${containerId}:/app/index.json ${localCopy}`);
|
|
394
|
+
await spawnCapture('docker', ['cp', `${containerId}:/app/index.json`, localCopy], opts.signal);
|
|
395
|
+
const bytes = await readFile(localCopy);
|
|
396
|
+
return { bytes };
|
|
397
|
+
}
|
|
398
|
+
finally {
|
|
399
|
+
try {
|
|
400
|
+
await spawnCapture('docker', ['rm', containerId], undefined);
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
// ignore — leaked containers are an operator concern, not a build
|
|
404
|
+
// failure.
|
|
405
|
+
}
|
|
406
|
+
try {
|
|
407
|
+
await rm(localCopy);
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
// ignore
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// ---------------------------------------------------------------------
|
|
415
|
+
// docker buildx build --load (`kindgi build --local`)
|
|
416
|
+
// ---------------------------------------------------------------------
|
|
417
|
+
/**
|
|
418
|
+
* Build the image from a written context into the local Docker image
|
|
419
|
+
* store: `docker buildx build --load`, registry config passed as
|
|
420
|
+
* BuildKit secrets (never in a layer). Every output line goes to
|
|
421
|
+
* `onLog`.
|
|
422
|
+
*/
|
|
423
|
+
export async function dockerBuildReal(opts) {
|
|
424
|
+
const metadataFile = join(opts.contextDir, '..', 'buildx-metadata.json');
|
|
425
|
+
const args = [
|
|
426
|
+
'buildx',
|
|
427
|
+
'build',
|
|
428
|
+
opts.push === true ? '--push' : '--load',
|
|
429
|
+
...(opts.platform !== undefined ? ['--platform', opts.platform] : []),
|
|
430
|
+
// A plain image manifest: its digest is the image's, nothing else's.
|
|
431
|
+
'--provenance=false',
|
|
432
|
+
'--metadata-file',
|
|
433
|
+
metadataFile,
|
|
434
|
+
'--progress',
|
|
435
|
+
'plain',
|
|
436
|
+
'--file',
|
|
437
|
+
join(opts.contextDir, 'Containerfile'),
|
|
438
|
+
'--tag',
|
|
439
|
+
opts.tag,
|
|
440
|
+
'--build-arg',
|
|
441
|
+
'SOURCE_DATE_EPOCH=0',
|
|
442
|
+
'--build-arg',
|
|
443
|
+
`KINDGI_BUILD_TARGET=${opts.buildTarget}`,
|
|
444
|
+
...opts.secrets.flatMap((s) => ['--secret', `id=${s.id},src=${s.src}`]),
|
|
445
|
+
opts.contextDir,
|
|
446
|
+
];
|
|
447
|
+
const tail = [];
|
|
448
|
+
const run = await spawnOutcome('docker', args, opts.contextDir, (line) => {
|
|
449
|
+
tail.push(line);
|
|
450
|
+
if (tail.length > 30)
|
|
451
|
+
tail.shift();
|
|
452
|
+
opts.onLog?.(line);
|
|
453
|
+
});
|
|
454
|
+
if (run.code !== 0) {
|
|
455
|
+
return { kind: 'err', message: `docker buildx build exited ${run.code}:\n${tail.join('\n')}` };
|
|
456
|
+
}
|
|
457
|
+
if (opts.push === true) {
|
|
458
|
+
// The registry's digest of what was pushed.
|
|
459
|
+
let digest;
|
|
460
|
+
try {
|
|
461
|
+
digest = JSON.parse(await readFile(metadataFile, 'utf8'))['containerimage.digest'];
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
digest = undefined;
|
|
465
|
+
}
|
|
466
|
+
if (typeof digest !== 'string' || !/^sha256:[0-9a-f]{64}$/.test(digest)) {
|
|
467
|
+
return { kind: 'err', message: `docker buildx pushed ${opts.tag} but reported no digest` };
|
|
468
|
+
}
|
|
469
|
+
return { kind: 'ok', imageId: digest, digest };
|
|
470
|
+
}
|
|
471
|
+
const inspected = await spawnOutcome('docker', ['image', 'inspect', '--format', '{{.Id}}', opts.tag], opts.contextDir);
|
|
472
|
+
if (inspected.code !== 0) {
|
|
473
|
+
return { kind: 'err', message: `docker image inspect ${opts.tag}: ${inspected.stderr.trim()}` };
|
|
474
|
+
}
|
|
475
|
+
return { kind: 'ok', imageId: inspected.stdout.trim() };
|
|
476
|
+
}
|
|
477
|
+
/** Run a command to the end: its exit code and output, each line also to `onLine`. */
|
|
478
|
+
function spawnOutcome(command, args, cwd, onLine) {
|
|
479
|
+
return new Promise((resolveRun) => {
|
|
480
|
+
const child = spawn(command, args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
481
|
+
let stdout = '';
|
|
482
|
+
let stderr = '';
|
|
483
|
+
const lines = (chunk, pending) => {
|
|
484
|
+
if (onLine === undefined)
|
|
485
|
+
return;
|
|
486
|
+
pending.text += chunk.toString('utf8');
|
|
487
|
+
const parts = pending.text.split('\n');
|
|
488
|
+
pending.text = parts.pop() ?? '';
|
|
489
|
+
for (const line of parts)
|
|
490
|
+
onLine(line);
|
|
491
|
+
};
|
|
492
|
+
const out = { text: '' };
|
|
493
|
+
const err = { text: '' };
|
|
494
|
+
child.stdout?.on('data', (c) => {
|
|
495
|
+
stdout += c.toString('utf8');
|
|
496
|
+
lines(c, out);
|
|
497
|
+
});
|
|
498
|
+
child.stderr?.on('data', (c) => {
|
|
499
|
+
stderr += c.toString('utf8');
|
|
500
|
+
lines(c, err);
|
|
501
|
+
});
|
|
502
|
+
child.on('error', (cause) => resolveRun({ code: 127, stdout, stderr: `${stderr}${cause.message}` }));
|
|
503
|
+
child.on('close', (code) => {
|
|
504
|
+
for (const rest of [out.text, err.text])
|
|
505
|
+
if (rest !== '')
|
|
506
|
+
onLine?.(rest);
|
|
507
|
+
resolveRun({ code: code ?? 1, stdout, stderr });
|
|
508
|
+
});
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
function spawnCapture(command, args, signal) {
|
|
512
|
+
return new Promise((resolve, reject) => {
|
|
513
|
+
const child = spawn(command, args, { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
514
|
+
let stdout = '';
|
|
515
|
+
let stderr = '';
|
|
516
|
+
child.stdout?.on('data', (c) => {
|
|
517
|
+
stdout += c.toString('utf8');
|
|
518
|
+
});
|
|
519
|
+
child.stderr?.on('data', (c) => {
|
|
520
|
+
stderr += c.toString('utf8');
|
|
521
|
+
});
|
|
522
|
+
const onAbort = () => {
|
|
523
|
+
try {
|
|
524
|
+
child.kill('SIGTERM');
|
|
525
|
+
}
|
|
526
|
+
catch {
|
|
527
|
+
// ignore
|
|
528
|
+
}
|
|
529
|
+
};
|
|
530
|
+
if (signal !== undefined) {
|
|
531
|
+
if (signal.aborted)
|
|
532
|
+
onAbort();
|
|
533
|
+
else
|
|
534
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
535
|
+
}
|
|
536
|
+
child.on('error', reject);
|
|
537
|
+
child.on('close', (code) => {
|
|
538
|
+
if (signal !== undefined)
|
|
539
|
+
signal.removeEventListener('abort', onAbort);
|
|
540
|
+
if (code === 0)
|
|
541
|
+
resolve(stdout);
|
|
542
|
+
else
|
|
543
|
+
reject(new Error(`${command} ${args.join(' ')} exited ${code}: ${stderr.trim()}`));
|
|
544
|
+
});
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
// ---------------------------------------------------------------------
|
|
548
|
+
// Ed25519 sign
|
|
549
|
+
// ---------------------------------------------------------------------
|
|
550
|
+
export async function signEnvelopeReal(opts) {
|
|
551
|
+
const parsed = parsePrivateKeyPem(opts.privateKeyPem);
|
|
552
|
+
if (parsed.kind === 'err') {
|
|
553
|
+
throw new Error(`Signing key rejected: ${parsed.error.code} — ${parsed.error.message}`);
|
|
554
|
+
}
|
|
555
|
+
const sig = signEd25519(parsed.value, opts.message);
|
|
556
|
+
if (sig.kind === 'err') {
|
|
557
|
+
throw new Error(`Ed25519 signing failed: ${sig.error.message}`);
|
|
558
|
+
}
|
|
559
|
+
// Derive the public key from the PEM with Node's crypto: @kindgi/crypto
|
|
560
|
+
// has no `derivePublicKey` helper.
|
|
561
|
+
const priv = createPrivateKey({ key: opts.privateKeyPem, format: 'pem' });
|
|
562
|
+
const pub = createPublicKey(priv);
|
|
563
|
+
const spki = pub.export({ format: 'der', type: 'spki' });
|
|
564
|
+
const raw = new Uint8Array(spki).subarray(-32); // Ed25519 SPKI trailer is the raw pub key.
|
|
565
|
+
const publicKeyPem = serializePublicKeyPem(raw);
|
|
566
|
+
return {
|
|
567
|
+
signatureBase64: Buffer.from(sig.value).toString('base64'),
|
|
568
|
+
publicKeyPem,
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
// ---------------------------------------------------------------------
|
|
572
|
+
// Wired seam
|
|
573
|
+
// ---------------------------------------------------------------------
|
|
574
|
+
export const REAL_BUILD_RUNNERS = {
|
|
575
|
+
runLocalIndexer: runLocalIndexerReal,
|
|
576
|
+
esbuildBundle: esbuildBundleReal,
|
|
577
|
+
writeContainerfile: writeContainerfileReal,
|
|
578
|
+
writeContext: writeContextReal,
|
|
579
|
+
tarPack: tarPackReal,
|
|
580
|
+
dockerBuild: dockerBuildReal,
|
|
581
|
+
postBuild: postBuildReal,
|
|
582
|
+
streamBuildLogs: streamBuildLogsReal,
|
|
583
|
+
pullImageIndex: pullImageIndexReal,
|
|
584
|
+
signEnvelope: signEnvelopeReal,
|
|
585
|
+
python: PYTHON_BUILD_RUNNERS,
|
|
586
|
+
};
|
|
587
|
+
// Re-export utility for callers that want a portable tmp workdir for
|
|
588
|
+
// the image-pull path.
|
|
589
|
+
export function defaultBuildWorkDir() {
|
|
590
|
+
return join(tmpdir(), 'kindgi-cli-build');
|
|
591
|
+
}
|
|
592
|
+
// Re-export the small primitive tests use to independently compute the
|
|
593
|
+
// tarball hash without the tar step.
|
|
594
|
+
export function sha256HexOf(bytes) {
|
|
595
|
+
return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;
|
|
596
|
+
}
|
|
597
|
+
//# sourceMappingURL=defaults.js.map
|