@kindgi/cli 0.0.0-bootstrap.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +690 -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 +45 -0
- package/dist/build/bundle.d.ts.map +1 -0
- package/dist/build/bundle.js +121 -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 +196 -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 +586 -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 +48 -0
- package/dist/build/host-install.d.ts.map +1 -0
- package/dist/build/host-install.js +375 -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 +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +88 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/build.d.ts +39 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +872 -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 +44 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +1032 -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 +37 -0
- package/dist/commands/helpers.d.ts.map +1 -0
- package/dist/commands/helpers.js +93 -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 +455 -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 +202 -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 +221 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/commands/secrets.d.ts +21 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +750 -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 +153 -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 +17 -0
- package/dist/commands/unwired.d.ts.map +1 -0
- package/dist/commands/unwired.js +41 -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 +153 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +44 -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 +8 -0
- package/dist/dev/bundler.d.ts.map +1 -0
- package/dist/dev/bundler.js +154 -0
- package/dist/dev/bundler.js.map +1 -0
- package/dist/dev/defaults.d.ts +138 -0
- package/dist/dev/defaults.d.ts.map +1 -0
- package/dist/dev/defaults.js +691 -0
- package/dist/dev/defaults.js.map +1 -0
- package/dist/dev/docker-compose.dev.yml +56 -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 +32 -0
- package/dist/dev/pack-service.d.ts.map +1 -0
- package/dist/dev/pack-service.js +188 -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/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 +287 -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 +62 -0
- package/dist/dev/runtime-container.d.ts.map +1 -0
- package/dist/dev/runtime-container.js +164 -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 +13 -0
- package/dist/dev/runtime-image.d.ts.map +1 -0
- package/dist/dev/runtime-image.js +15 -0
- package/dist/dev/runtime-image.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 +107 -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 +74 -0
- package/dist/init/augment-scaffolder.d.ts.map +1 -0
- package/dist/init/augment-scaffolder.js +459 -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/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 +16 -0
- package/dist/init/template-files.d.ts.map +1 -0
- package/dist/init/template-files.js +38 -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 +106 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +198 -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 +82 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +99 -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 +253 -0
- package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +299 -0
- package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +291 -0
- package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +289 -0
- package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +704 -0
- package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +288 -0
- package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +211 -0
- package/dist/sdk-skills/kindgi-getting-started/SKILL.md +181 -0
- package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +205 -0
- package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +322 -0
- package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +173 -0
- package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +299 -0
- package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +240 -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/.gitignore +8 -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/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 +6 -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/.gitignore +9 -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/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/.gitignore +8 -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/guardrails/response-not-empty/index.ts.tmpl +50 -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 +6 -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/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,16 @@
|
|
|
1
|
+
export type AptPackages = {
|
|
2
|
+
readonly kind: 'ok';
|
|
3
|
+
readonly packages: readonly string[];
|
|
4
|
+
} | {
|
|
5
|
+
readonly kind: 'err';
|
|
6
|
+
readonly message: string;
|
|
7
|
+
};
|
|
8
|
+
/** The declared packages, checked — `where` names the setting in messages. */
|
|
9
|
+
export declare function checkAptPackages(value: unknown, where: string): AptPackages;
|
|
10
|
+
/**
|
|
11
|
+
* The Containerfile `RUN` step installing `packages` (checked by
|
|
12
|
+
* `checkAptPackages`): one layer, no recommended extras, the package
|
|
13
|
+
* lists removed after. Empty → no step.
|
|
14
|
+
*/
|
|
15
|
+
export declare function renderAptGetStep(packages: readonly string[]): string;
|
|
16
|
+
//# sourceMappingURL=apt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apt.d.ts","sourceRoot":"","sources":["../../src/build/apt.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAa3E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAOpE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* Debian packages in a pack image — the one place that renders the
|
|
5
|
+
* `apt-get` step, so every pack image installs them the same way.
|
|
6
|
+
*
|
|
7
|
+
* A pack declares them when its code needs programs or libraries outside
|
|
8
|
+
* its language's packages (OCR, PDF tools, `libmagic`, …):
|
|
9
|
+
* - a Python pack: `[tool.kindgi.image] system-packages = [...]` in
|
|
10
|
+
* `pyproject.toml` — the Python spelling of the `aptGet` image
|
|
11
|
+
* extension (plan decision K8) a TypeScript pack configures under
|
|
12
|
+
* `image:` in `kindgi.config`;
|
|
13
|
+
* - the Node pack image renders the same step for `aptGet` (R3).
|
|
14
|
+
*
|
|
15
|
+
* Names are checked against Debian's package-name rules, with an optional
|
|
16
|
+
* `=version` pin, so nothing else can reach the `RUN` line.
|
|
17
|
+
*/
|
|
18
|
+
/** `name` or `name=version`, as Debian policy allows them. */
|
|
19
|
+
const APT_PACKAGE = /^[a-z0-9][a-z0-9+.-]+(=[A-Za-z0-9.+~:-]+)?$/;
|
|
20
|
+
/** The declared packages, checked — `where` names the setting in messages. */
|
|
21
|
+
export function checkAptPackages(value, where) {
|
|
22
|
+
if (value === undefined)
|
|
23
|
+
return { kind: 'ok', packages: [] };
|
|
24
|
+
if (!Array.isArray(value) || !value.every((p) => typeof p === 'string')) {
|
|
25
|
+
return { kind: 'err', message: `${where} must be a list of Debian package names` };
|
|
26
|
+
}
|
|
27
|
+
const bad = value.filter((p) => !APT_PACKAGE.test(p));
|
|
28
|
+
if (bad.length > 0) {
|
|
29
|
+
return {
|
|
30
|
+
kind: 'err',
|
|
31
|
+
message: `${where}: not a Debian package name: ${bad.map((p) => JSON.stringify(p)).join(', ')}`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return { kind: 'ok', packages: [...new Set(value)].sort() };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The Containerfile `RUN` step installing `packages` (checked by
|
|
38
|
+
* `checkAptPackages`): one layer, no recommended extras, the package
|
|
39
|
+
* lists removed after. Empty → no step.
|
|
40
|
+
*/
|
|
41
|
+
export function renderAptGetStep(packages) {
|
|
42
|
+
if (packages.length === 0)
|
|
43
|
+
return '';
|
|
44
|
+
return [
|
|
45
|
+
'RUN apt-get update \\',
|
|
46
|
+
` && apt-get install -y --no-install-recommends ${packages.join(' ')} \\`,
|
|
47
|
+
' && rm -rf /var/lib/apt/lists/*',
|
|
48
|
+
].join('\n');
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=apt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apt.js","sourceRoot":"","sources":["../../src/build/apt.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC;;;;;;;;;;;;;;GAcG;AAEH,8DAA8D;AAC9D,MAAM,WAAW,GAAG,6CAA6C,CAAC;AAMlE,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,KAAa;IAC5D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QACrF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,yCAAyC,EAAE,CAAC;IACrF,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,GAAG,KAAK,gCAAgC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAChG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAA2B;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO;QACL,uBAAuB;QACvB,kDAAkD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK;QACzE,iCAAiC;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Plugin } from 'esbuild';
|
|
2
|
+
export interface PackEntry {
|
|
3
|
+
/** Absolute path of the primitive's source file. */
|
|
4
|
+
readonly abs: string;
|
|
5
|
+
/** The source path relative to the pack root — what the index records as `modulePath`. */
|
|
6
|
+
readonly sourceRel: string;
|
|
7
|
+
/** The bundle's path under the output directory, without extension. */
|
|
8
|
+
readonly outRel: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Bundle entrypoints: every file the pack's discovery patterns match
|
|
12
|
+
* (test files excluded), walked from each pattern's static prefix —
|
|
13
|
+
* the same set the indexer discovers, at any depth.
|
|
14
|
+
*/
|
|
15
|
+
export declare function collectPackEntries(packDir: string, patterns: readonly string[]): Promise<readonly PackEntry[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Local files esbuild read (metafile keys are relative to
|
|
18
|
+
* absWorkingDir): real files outside `node_modules`; plugin namespaces
|
|
19
|
+
* (`ns:…`) are not paths.
|
|
20
|
+
*/
|
|
21
|
+
export declare function localSourceInputs(root: string, inputs: Readonly<Record<string, unknown>>): Promise<string[]>;
|
|
22
|
+
/** An ESM bundle that inlines CommonJS code needs `require`. */
|
|
23
|
+
export declare const REQUIRE_BANNER = "import { createRequire as __kindgiCreateRequire } from 'node:module'; const require = __kindgiCreateRequire(import.meta.url);";
|
|
24
|
+
/**
|
|
25
|
+
* Externals: whatever resolves into a `node_modules` directory stays
|
|
26
|
+
* external — loaded from the pack's own installed dependencies at
|
|
27
|
+
* runtime, native modules and generated clients (Prisma) included.
|
|
28
|
+
* Everything else, the pack's own code, what tsconfig `paths` point at,
|
|
29
|
+
* and a package linked from outside `node_modules` (its real path isn't
|
|
30
|
+
* in one), is bundled.
|
|
31
|
+
*
|
|
32
|
+
* How an external is imported:
|
|
33
|
+
* - `resolved` (dev): by the absolute path esbuild resolved, so it
|
|
34
|
+
* loads the same file no matter where the bundle sits;
|
|
35
|
+
* - `bare` (a pack image): by its specifier, which Node resolves from
|
|
36
|
+
* the bundle's folder upward into the image's own `node_modules` —
|
|
37
|
+
* the host's absolute paths don't exist there.
|
|
38
|
+
*
|
|
39
|
+
* `externalPackages` (optional) collects the external packages' names.
|
|
40
|
+
*/
|
|
41
|
+
export declare function nodeModulesExternalPlugin(options?: {
|
|
42
|
+
readonly importBy?: 'resolved' | 'bare';
|
|
43
|
+
readonly externalPackages?: Set<string>;
|
|
44
|
+
}): Plugin;
|
|
45
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/build/bundle.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAyB/B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnB;AAUD,gEAAgE;AAChE,eAAO,MAAM,cAAc,kIACsG,CAAC;AAIlI;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE;IACP,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACpC,GACL,MAAM,CAuBR"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* What `kindgi build` and `kindgi dev` share about bundling a pack: the
|
|
5
|
+
* entry points (every file the discovery patterns match), the local
|
|
6
|
+
* source files a build read, and — for dev — the externals rule.
|
|
7
|
+
*/
|
|
8
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
9
|
+
import { join, resolve } from 'node:path';
|
|
10
|
+
import { createGlobMatcher, discoveryRoots } from '@kindgi/handler-runtime';
|
|
11
|
+
/**
|
|
12
|
+
* Bundle entrypoints: every file the pack's discovery patterns match
|
|
13
|
+
* (test files excluded), walked from each pattern's static prefix —
|
|
14
|
+
* the same set the indexer discovers, at any depth.
|
|
15
|
+
*/
|
|
16
|
+
export async function collectPackEntries(packDir, patterns) {
|
|
17
|
+
const matches = createGlobMatcher(patterns);
|
|
18
|
+
const out = [];
|
|
19
|
+
const walk = async (rel) => {
|
|
20
|
+
let entries;
|
|
21
|
+
try {
|
|
22
|
+
entries = await readdir(rel === '' ? packDir : join(packDir, rel), { withFileTypes: true });
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
for (const entry of entries) {
|
|
28
|
+
if (entry.name === 'node_modules' || entry.name.startsWith('.'))
|
|
29
|
+
continue;
|
|
30
|
+
const child = rel === '' ? entry.name : `${rel}/${entry.name}`;
|
|
31
|
+
if (entry.isDirectory())
|
|
32
|
+
await walk(child);
|
|
33
|
+
else if (entry.isFile() && matches(child)) {
|
|
34
|
+
out.push({
|
|
35
|
+
abs: join(packDir, child),
|
|
36
|
+
sourceRel: child,
|
|
37
|
+
outRel: child.replace(/\.(ts|mts|mjs|js)$/, ''),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
for (const root of discoveryRoots(patterns))
|
|
43
|
+
await walk(root);
|
|
44
|
+
return out.sort((a, b) => a.outRel.localeCompare(b.outRel));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Local files esbuild read (metafile keys are relative to
|
|
48
|
+
* absWorkingDir): real files outside `node_modules`; plugin namespaces
|
|
49
|
+
* (`ns:…`) are not paths.
|
|
50
|
+
*/
|
|
51
|
+
export async function localSourceInputs(root, inputs) {
|
|
52
|
+
const out = [];
|
|
53
|
+
for (const key of Object.keys(inputs)) {
|
|
54
|
+
if (key.includes('node_modules/') || /^[a-z-]+:/.test(key))
|
|
55
|
+
continue;
|
|
56
|
+
const abs = resolve(root, key);
|
|
57
|
+
if (await isRegularFile(abs))
|
|
58
|
+
out.push(abs);
|
|
59
|
+
}
|
|
60
|
+
return out.sort();
|
|
61
|
+
}
|
|
62
|
+
async function isRegularFile(path) {
|
|
63
|
+
try {
|
|
64
|
+
return (await stat(path)).isFile();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** An ESM bundle that inlines CommonJS code needs `require`. */
|
|
71
|
+
export const REQUIRE_BANNER = "import { createRequire as __kindgiCreateRequire } from 'node:module'; const require = __kindgiCreateRequire(import.meta.url);";
|
|
72
|
+
const SKIP = Symbol('kindgi-externals-resolving');
|
|
73
|
+
/**
|
|
74
|
+
* Externals: whatever resolves into a `node_modules` directory stays
|
|
75
|
+
* external — loaded from the pack's own installed dependencies at
|
|
76
|
+
* runtime, native modules and generated clients (Prisma) included.
|
|
77
|
+
* Everything else, the pack's own code, what tsconfig `paths` point at,
|
|
78
|
+
* and a package linked from outside `node_modules` (its real path isn't
|
|
79
|
+
* in one), is bundled.
|
|
80
|
+
*
|
|
81
|
+
* How an external is imported:
|
|
82
|
+
* - `resolved` (dev): by the absolute path esbuild resolved, so it
|
|
83
|
+
* loads the same file no matter where the bundle sits;
|
|
84
|
+
* - `bare` (a pack image): by its specifier, which Node resolves from
|
|
85
|
+
* the bundle's folder upward into the image's own `node_modules` —
|
|
86
|
+
* the host's absolute paths don't exist there.
|
|
87
|
+
*
|
|
88
|
+
* `externalPackages` (optional) collects the external packages' names.
|
|
89
|
+
*/
|
|
90
|
+
export function nodeModulesExternalPlugin(options = {}) {
|
|
91
|
+
const importBy = options.importBy ?? 'resolved';
|
|
92
|
+
const names = options.externalPackages;
|
|
93
|
+
return {
|
|
94
|
+
name: 'kindgi-node-modules-external',
|
|
95
|
+
setup(build) {
|
|
96
|
+
build.onResolve({ filter: /^[^./]/ }, async (args) => {
|
|
97
|
+
if (args.pluginData === SKIP)
|
|
98
|
+
return undefined;
|
|
99
|
+
const resolved = await build.resolve(args.path, {
|
|
100
|
+
kind: args.kind,
|
|
101
|
+
importer: args.importer,
|
|
102
|
+
resolveDir: args.resolveDir,
|
|
103
|
+
pluginData: SKIP,
|
|
104
|
+
});
|
|
105
|
+
if (resolved.errors.length > 0 || resolved.external)
|
|
106
|
+
return undefined;
|
|
107
|
+
if (/[\\/]node_modules[\\/]/.test(resolved.path)) {
|
|
108
|
+
names?.add(packageName(args.path));
|
|
109
|
+
return { path: importBy === 'bare' ? args.path : resolved.path, external: true };
|
|
110
|
+
}
|
|
111
|
+
return undefined;
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/** `@scope/name/sub` → `@scope/name`; `name/sub` → `name`. */
|
|
117
|
+
function packageName(specifier) {
|
|
118
|
+
const parts = specifier.split('/');
|
|
119
|
+
return specifier.startsWith('@') ? parts.slice(0, 2).join('/') : (parts[0] ?? specifier);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/build/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { HostInstall, InstallCommands } from './host-install.js';
|
|
2
|
+
import type { ResolvedImage } from './image-config.js';
|
|
3
|
+
export interface RenderContainerfileInputs {
|
|
4
|
+
readonly baseImageRef: string;
|
|
5
|
+
readonly artifactVersion: string;
|
|
6
|
+
readonly publishedAt: string;
|
|
7
|
+
readonly buildTarget: string;
|
|
8
|
+
readonly install: Pick<HostInstall, 'manager' | 'managerSpec' | 'packRel' | 'secrets' | 'yarnBerry'>;
|
|
9
|
+
readonly commands: InstallCommands;
|
|
10
|
+
/** What `image` in `kindgi.config` adds (`image-config.ts`). */
|
|
11
|
+
readonly image: ResolvedImage;
|
|
12
|
+
/** Whether the context has `include/` (files `bundle.include` lists). */
|
|
13
|
+
readonly hasIncludes: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* pnpm's store in the install stage: the cache mount's own folder, set
|
|
17
|
+
* explicitly (`pnpm_config_store_dir` for pnpm 11, `npm_config_store_dir`
|
|
18
|
+
* before it), under ~/.cache, which the stage gives `node`.
|
|
19
|
+
*/
|
|
20
|
+
export declare const PNPM_STORE_DIR = "/home/node/.cache/pnpm-store";
|
|
21
|
+
/** Where the pack sits in the image. */
|
|
22
|
+
export declare function imagePackDir(packRel: string): string;
|
|
23
|
+
/** The pack service's command in the image (after tini). */
|
|
24
|
+
export declare const PACK_SERVICE_COMMAND: readonly string[];
|
|
25
|
+
/** Render the Containerfile. Pure; the caller writes it. */
|
|
26
|
+
export declare function renderContainerfile(inputs: RenderContainerfileInputs): string;
|
|
27
|
+
//# sourceMappingURL=containerfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerfile.d.ts","sourceRoot":"","sources":["../../src/build/containerfile.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC;IACrG,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,iCAAiC,CAAC;AAE7D,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAUjD,CAAC;AAEF,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,CAgH7E"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* The `Containerfile` of a TypeScript pack image, which runs the pack
|
|
5
|
+
* service over the pack's bundles. Stages:
|
|
6
|
+
*
|
|
7
|
+
* system the Node base image, tini, CA certificates, the system
|
|
8
|
+
* packages `image` asks for (corepack on)
|
|
9
|
+
* deps the app's dependencies, with its own package manager from
|
|
10
|
+
* its own lockfile, frozen and scripts off; then the build
|
|
11
|
+
* scripts it allows; then the extensions' steps (`prisma
|
|
12
|
+
* generate`); then pruned to production
|
|
13
|
+
* code the bundles (`dist/`): the pack's, the framework's, the
|
|
14
|
+
* config, the bundle map
|
|
15
|
+
* indexer `index.json`, indexed from the bundles
|
|
16
|
+
* final deps + code + index.json, as the `node` user
|
|
17
|
+
*
|
|
18
|
+
* Image layout: the install root at `/app`, the pack at
|
|
19
|
+
* `/app/<packRel>` (the working directory) with its bundles in `dist/`,
|
|
20
|
+
* and the index at `/app/index.json`.
|
|
21
|
+
*
|
|
22
|
+
* Build context (`kindgi build` writes it):
|
|
23
|
+
* host/ what the install reads (manifests, lockfile, workspace file, patches)
|
|
24
|
+
* ext/ what the extensions' steps read (a Prisma schema), at the install root's paths
|
|
25
|
+
* dist/ the bundles
|
|
26
|
+
* include/ `bundle.include` files, at their pack-relative paths
|
|
27
|
+
* Containerfile
|
|
28
|
+
* Registry config that can hold credentials (`.npmrc`, `.yarnrc*`) is
|
|
29
|
+
* never in the context: the install reads it as a BuildKit secret.
|
|
30
|
+
*
|
|
31
|
+
* ## Reproducibility
|
|
32
|
+
*
|
|
33
|
+
* The build service passes `SOURCE_DATE_EPOCH=0` + `KINDGI_BUILD_TARGET`
|
|
34
|
+
* as build args. `KINDGI_PUBLISHED_AT` and `KINDGI_ARTIFACT_VERSION` are
|
|
35
|
+
* `ARG` defaults here, so the CLI's local index and the image's agree
|
|
36
|
+
* without extending the build-server contract.
|
|
37
|
+
*
|
|
38
|
+
* Attribution: the multi-stage layout follows Trigger.dev's (Apache-2.0)
|
|
39
|
+
* `packages/cli-v3/src/deploy/buildImage.ts`.
|
|
40
|
+
*/
|
|
41
|
+
import { binCommand } from '../package-manager.js';
|
|
42
|
+
import { renderAptGetStep } from './apt.js';
|
|
43
|
+
/**
|
|
44
|
+
* pnpm's store in the install stage: the cache mount's own folder, set
|
|
45
|
+
* explicitly (`pnpm_config_store_dir` for pnpm 11, `npm_config_store_dir`
|
|
46
|
+
* before it), under ~/.cache, which the stage gives `node`.
|
|
47
|
+
*/
|
|
48
|
+
export const PNPM_STORE_DIR = '/home/node/.cache/pnpm-store';
|
|
49
|
+
/** Where the pack sits in the image. */
|
|
50
|
+
export function imagePackDir(packRel) {
|
|
51
|
+
return packRel === '' ? '/app' : `/app/${packRel}`;
|
|
52
|
+
}
|
|
53
|
+
/** The pack service's command in the image (after tini). */
|
|
54
|
+
export const PACK_SERVICE_COMMAND = [
|
|
55
|
+
'node',
|
|
56
|
+
'--enable-source-maps',
|
|
57
|
+
'./dist/kindgi-pack-service.mjs',
|
|
58
|
+
'--index',
|
|
59
|
+
'/app/index.json',
|
|
60
|
+
'--module-root',
|
|
61
|
+
'./dist',
|
|
62
|
+
'--bundle-map',
|
|
63
|
+
'./dist/bundle-map.json',
|
|
64
|
+
];
|
|
65
|
+
/** Render the Containerfile. Pure; the caller writes it. */
|
|
66
|
+
export function renderContainerfile(inputs) {
|
|
67
|
+
const { baseImageRef, artifactVersion, publishedAt, buildTarget, install, commands } = inputs;
|
|
68
|
+
const packDir = imagePackDir(install.packRel);
|
|
69
|
+
const corepack = install.manager !== 'npm';
|
|
70
|
+
const mounts = installMounts(install);
|
|
71
|
+
const run = (command) => mounts.length === 0 ? `RUN ${command}` : `RUN ${mounts.join(' \\\n ')} \\\n ${command}`;
|
|
72
|
+
const entrypoint = JSON.stringify(['/usr/bin/tini', '--', ...PACK_SERVICE_COMMAND]);
|
|
73
|
+
const healthcheck = JSON.stringify([
|
|
74
|
+
'node',
|
|
75
|
+
'-e',
|
|
76
|
+
"fetch('http://127.0.0.1:'+(process.env.PORT||8080)+'/healthz').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))",
|
|
77
|
+
]);
|
|
78
|
+
const system = renderAptGetStep(['ca-certificates', 'tini', ...inputs.image.systemPackages].sort());
|
|
79
|
+
const env = Object.entries(inputs.image.buildEnv)
|
|
80
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
81
|
+
.map(([name, value]) => `ENV ${name}=${dockerfileString(value)}`);
|
|
82
|
+
const steps = inputs.image.steps.map((step) => {
|
|
83
|
+
const { command, args } = binCommand(install.manager, step.bin, step.args ?? []);
|
|
84
|
+
return `# ${step.extension}\n${run(`cd ${packDir} && ${[command, ...args].map(shellWord).join(' ')}`)}`;
|
|
85
|
+
});
|
|
86
|
+
return `# syntax=docker/dockerfile:1.7
|
|
87
|
+
# A Kindgi pack image: the pack service over the pack's bundles.
|
|
88
|
+
# Reproducible: SOURCE_DATE_EPOCH=0 and KINDGI_BUILD_TARGET come in as
|
|
89
|
+
# --build-arg from the build service; KINDGI_PUBLISHED_AT and
|
|
90
|
+
# KINDGI_ARTIFACT_VERSION are pinned here, so the CLI and the image
|
|
91
|
+
# agree on index.json.
|
|
92
|
+
#
|
|
93
|
+
# Written by \`kindgi build\` (@kindgi/cli). Don't edit it by hand:
|
|
94
|
+
# change kindgi.config.ts and run \`kindgi build\` again.
|
|
95
|
+
|
|
96
|
+
# --- stage: system ---
|
|
97
|
+
FROM ${baseImageRef} AS system
|
|
98
|
+
${system}${corepack
|
|
99
|
+
? `
|
|
100
|
+
RUN corepack enable
|
|
101
|
+
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0`
|
|
102
|
+
: ''}
|
|
103
|
+
|
|
104
|
+
# --- stage: deps (${describeManager(install)}, from the lockfile) ---
|
|
105
|
+
FROM system AS deps
|
|
106
|
+
WORKDIR /app
|
|
107
|
+
# The install runs as node, in folders it owns: /app, and its caches
|
|
108
|
+
# (a cache mount would otherwise create ~/.cache as root).
|
|
109
|
+
RUN chown node:node /app && mkdir -p /home/node/.cache && chown node:node /home/node/.cache${install.manager === 'pnpm'
|
|
110
|
+
? `
|
|
111
|
+
# pnpm's store, where the cache mount is: by default pnpm picks it from
|
|
112
|
+
# ~/.local/share, which a mount's parents (created as root) make it skip.
|
|
113
|
+
ENV pnpm_config_store_dir=${PNPM_STORE_DIR}
|
|
114
|
+
ENV npm_config_store_dir=${PNPM_STORE_DIR}`
|
|
115
|
+
: ''}
|
|
116
|
+
USER node
|
|
117
|
+
COPY --chown=node:node host/ ./${env.length > 0 ? `\n# Build env: the build steps and the indexer stage only, never the final image.\n${env.join('\n')}` : ''}
|
|
118
|
+
${run(commands.install)}${inputs.image.contextFiles.length > 0 ? '\nCOPY --chown=node:node ext/ ./' : ''}${steps.length > 0 ? `\n${steps.join('\n')}` : ''}
|
|
119
|
+
${run(commands.prune)}
|
|
120
|
+
|
|
121
|
+
# --- stage: code ---
|
|
122
|
+
FROM scratch AS code
|
|
123
|
+
COPY dist/ /dist/
|
|
124
|
+
|
|
125
|
+
# --- stage: indexer ---
|
|
126
|
+
FROM deps AS indexer
|
|
127
|
+
ARG SOURCE_DATE_EPOCH=0
|
|
128
|
+
ARG KINDGI_BUILD_TARGET=${buildTarget}
|
|
129
|
+
ARG KINDGI_ARTIFACT_VERSION=${artifactVersion}
|
|
130
|
+
ARG KINDGI_PUBLISHED_AT=${publishedAt}
|
|
131
|
+
ENV SOURCE_DATE_EPOCH=\${SOURCE_DATE_EPOCH}
|
|
132
|
+
ENV KINDGI_BUILD_TARGET=\${KINDGI_BUILD_TARGET}
|
|
133
|
+
ENV KINDGI_ARTIFACT_VERSION=\${KINDGI_ARTIFACT_VERSION}
|
|
134
|
+
ENV KINDGI_PUBLISHED_AT=\${KINDGI_PUBLISHED_AT}
|
|
135
|
+
COPY --from=code --chown=node:node /dist ${packDir}/dist
|
|
136
|
+
WORKDIR ${packDir}
|
|
137
|
+
RUN node --enable-source-maps ./dist/kindgi-index.mjs \\
|
|
138
|
+
--pack-dir . \\
|
|
139
|
+
--config ./dist/kindgi.config.mjs \\
|
|
140
|
+
--bundle-map ./dist/bundle-map.json \\
|
|
141
|
+
--module-root ./dist \\
|
|
142
|
+
--artifact-version "\${KINDGI_ARTIFACT_VERSION}" \\
|
|
143
|
+
--published-at "\${KINDGI_PUBLISHED_AT}" \\
|
|
144
|
+
--output /app/index.json
|
|
145
|
+
|
|
146
|
+
# --- stage: final ---
|
|
147
|
+
FROM system AS final
|
|
148
|
+
ARG KINDGI_ARTIFACT_VERSION=${artifactVersion}
|
|
149
|
+
ARG KINDGI_PUBLISHED_AT=${publishedAt}
|
|
150
|
+
ENV KINDGI_ARTIFACT_VERSION=\${KINDGI_ARTIFACT_VERSION}
|
|
151
|
+
ENV KINDGI_PUBLISHED_AT=\${KINDGI_PUBLISHED_AT}
|
|
152
|
+
ENV NODE_ENV=production
|
|
153
|
+
ENV PORT=8080
|
|
154
|
+
USER node
|
|
155
|
+
WORKDIR ${packDir}
|
|
156
|
+
COPY --from=deps --chown=node:node /app /app
|
|
157
|
+
COPY --from=code --chown=node:node /dist ./dist${inputs.hasIncludes
|
|
158
|
+
? `
|
|
159
|
+
COPY --chown=node:node include/ ./`
|
|
160
|
+
: ''}
|
|
161
|
+
COPY --from=indexer --chown=node:node /app/index.json /app/index.json
|
|
162
|
+
EXPOSE 8080
|
|
163
|
+
HEALTHCHECK --interval=30s --timeout=3s CMD ${healthcheck}
|
|
164
|
+
# The pack service: serves /app/index.json's tools and checks on $PORT
|
|
165
|
+
# to a server holding KINDGI_PACK_SERVICE_TOKEN.
|
|
166
|
+
ENTRYPOINT ${entrypoint}
|
|
167
|
+
CMD []
|
|
168
|
+
`;
|
|
169
|
+
}
|
|
170
|
+
/** The secret mounts for registry config, and the package manager's download cache. */
|
|
171
|
+
function installMounts(install) {
|
|
172
|
+
const owner = 'uid=1000,gid=1000';
|
|
173
|
+
const mounts = install.secrets.map((s) => `--mount=type=secret,id=${s.id},target=/app/${s.file},${owner},required=false`);
|
|
174
|
+
if (install.manager === 'pnpm') {
|
|
175
|
+
mounts.push(`--mount=type=cache,id=kindgi-pnpm-store,target=${PNPM_STORE_DIR},${owner}`,
|
|
176
|
+
// Package metadata, so a rebuild needn't fetch it all again.
|
|
177
|
+
`--mount=type=cache,id=kindgi-pnpm-cache,target=/home/node/.cache/pnpm,${owner}`);
|
|
178
|
+
}
|
|
179
|
+
else if (install.manager === 'npm') {
|
|
180
|
+
mounts.push(`--mount=type=cache,id=kindgi-npm-cache,target=/home/node/.npm,${owner}`);
|
|
181
|
+
}
|
|
182
|
+
return mounts;
|
|
183
|
+
}
|
|
184
|
+
function describeManager(install) {
|
|
185
|
+
const name = install.manager === 'yarn' ? (install.yarnBerry ? 'yarn berry' : 'yarn classic') : install.manager;
|
|
186
|
+
return install.managerSpec !== undefined ? `${name}: ${install.managerSpec}` : name;
|
|
187
|
+
}
|
|
188
|
+
/** A Dockerfile `ENV` value: double-quoted, with `$` not expanded. */
|
|
189
|
+
function dockerfileString(value) {
|
|
190
|
+
return `"${value.replace(/[\\"$]/g, (c) => `\\${c}`)}"`;
|
|
191
|
+
}
|
|
192
|
+
/** A word for `sh`: as is when it's plain, else single-quoted. */
|
|
193
|
+
function shellWord(word) {
|
|
194
|
+
return /^[A-Za-z0-9@%+=:,./_-]+$/.test(word) ? word : `'${word.replace(/'/g, `'\\''`)}'`;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=containerfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerfile.js","sourceRoot":"","sources":["../../src/build/containerfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Why a relative path must never enter the image, or `undefined`. */
|
|
2
|
+
export declare function forbiddenReason(relPath: string): string | undefined;
|
|
3
|
+
export interface BundleConfig {
|
|
4
|
+
/** Extra files for the image, as discovery-style globs relative to the pack root. */
|
|
5
|
+
readonly include: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
/** `bundle` from `kindgi.config.*` — validated; `include` defaults to none. */
|
|
8
|
+
export declare function readBundleConfig(config: Readonly<Record<string, unknown>>): {
|
|
9
|
+
readonly kind: 'ok';
|
|
10
|
+
readonly bundle: BundleConfig;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: 'invalid';
|
|
13
|
+
readonly message: string;
|
|
14
|
+
};
|
|
15
|
+
export type IncludeFilesResult = {
|
|
16
|
+
readonly kind: 'ok';
|
|
17
|
+
readonly files: readonly string[];
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: 'error';
|
|
20
|
+
readonly message: string;
|
|
21
|
+
};
|
|
22
|
+
/** The files `include` (`bundle.include`) matches, relative to `packDir` (`/`-separated, sorted). */
|
|
23
|
+
export declare function collectIncludeFiles(packDir: string, include: readonly string[]): Promise<IncludeFilesResult>;
|
|
24
|
+
//# sourceMappingURL=context-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-files.d.ts","sourceRoot":"","sources":["../../src/build/context-files.ts"],"names":[],"mappings":"AAoCA,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMnE;AAED,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAgBjH;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,qGAAqG;AACrG,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAY7B"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* The pack's own files in the image — an explicit allowlist, never
|
|
5
|
+
* "the pack directory minus a few folders". A pack embedded in an app
|
|
6
|
+
* has the app's whole tree (and its `.env`) in its directory; copying
|
|
7
|
+
* that put the app's source and secrets into the image.
|
|
8
|
+
*
|
|
9
|
+
* The image runs the pack's bundles, so its source never ships. Of the
|
|
10
|
+
* pack's files, the image holds exactly what `bundle.include` in
|
|
11
|
+
* `kindgi.config.*` lists: files a tool reads at runtime rather than
|
|
12
|
+
* imports. (The install's files are `host-install.ts`'s; the bundles,
|
|
13
|
+
* the Containerfile and the index are the build's own.)
|
|
14
|
+
*
|
|
15
|
+
* Secret-shaped files are refused even when listed: env files,
|
|
16
|
+
* `.kindgirc.json`, `.npmrc`, `.yarnrc.yml`, private keys, and anything
|
|
17
|
+
* under `.git/`, `.kindgi/` or `node_modules/`. A build that would ship
|
|
18
|
+
* one fails, naming it — never a silently different image.
|
|
19
|
+
*/
|
|
20
|
+
import { readdir } from 'node:fs/promises';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { createGlobMatcher, discoveryRoots } from '@kindgi/handler-runtime';
|
|
23
|
+
const SECRET_BASENAMES = [
|
|
24
|
+
/^\.env(\..*)?$/,
|
|
25
|
+
/^\.kindgirc\.json$/,
|
|
26
|
+
/^\.npmrc$/,
|
|
27
|
+
/^\.yarnrc\.yml$/,
|
|
28
|
+
/\.(pem|key|p12|pfx)$/,
|
|
29
|
+
/^id_(rsa|ed25519|ecdsa)(\.pub)?$/,
|
|
30
|
+
];
|
|
31
|
+
const FORBIDDEN_SEGMENTS = new Set(['.git', '.kindgi', 'node_modules']);
|
|
32
|
+
/** Why a relative path must never enter the image, or `undefined`. */
|
|
33
|
+
export function forbiddenReason(relPath) {
|
|
34
|
+
const segments = relPath.split('/');
|
|
35
|
+
const segment = segments.find((s) => FORBIDDEN_SEGMENTS.has(s));
|
|
36
|
+
if (segment !== undefined)
|
|
37
|
+
return `inside ${segment}/`;
|
|
38
|
+
const base = segments[segments.length - 1] ?? '';
|
|
39
|
+
return SECRET_BASENAMES.some((r) => r.test(base)) ? 'secret-shaped file' : undefined;
|
|
40
|
+
}
|
|
41
|
+
/** `bundle` from `kindgi.config.*` — validated; `include` defaults to none. */
|
|
42
|
+
export function readBundleConfig(config) {
|
|
43
|
+
const bundle = config.bundle;
|
|
44
|
+
if (bundle === undefined)
|
|
45
|
+
return { kind: 'ok', bundle: { include: [] } };
|
|
46
|
+
const include = bundle?.include;
|
|
47
|
+
if (typeof bundle !== 'object' ||
|
|
48
|
+
bundle === null ||
|
|
49
|
+
(include !== undefined &&
|
|
50
|
+
(!Array.isArray(include) || !include.every((g) => typeof g === 'string' && g !== '')))) {
|
|
51
|
+
return {
|
|
52
|
+
kind: 'invalid',
|
|
53
|
+
message: '`bundle.include` in kindgi.config.ts must be a list of file globs relative to the pack root.',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return { kind: 'ok', bundle: { include: include ?? [] } };
|
|
57
|
+
}
|
|
58
|
+
/** The files `include` (`bundle.include`) matches, relative to `packDir` (`/`-separated, sorted). */
|
|
59
|
+
export async function collectIncludeFiles(packDir, include) {
|
|
60
|
+
const files = await globFiles(packDir, include);
|
|
61
|
+
const refused = files
|
|
62
|
+
.map((rel) => ({ rel, reason: forbiddenReason(rel) }))
|
|
63
|
+
.filter((f) => f.reason !== undefined);
|
|
64
|
+
if (refused.length > 0) {
|
|
65
|
+
return {
|
|
66
|
+
kind: 'error',
|
|
67
|
+
message: `Refusing to put these files in the image: ${refused.map((f) => `${f.rel} (${f.reason})`).join(', ')}. Remove the \`bundle.include\` entry.`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return { kind: 'ok', files: files.sort() };
|
|
71
|
+
}
|
|
72
|
+
async function globFiles(packDir, patterns) {
|
|
73
|
+
if (patterns.length === 0)
|
|
74
|
+
return [];
|
|
75
|
+
const matches = createGlobMatcher(patterns);
|
|
76
|
+
const out = [];
|
|
77
|
+
for (const root of discoveryRoots(patterns))
|
|
78
|
+
await walk(packDir, root, matches, out);
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
async function walk(packDir, rel, matches, out) {
|
|
82
|
+
let entries;
|
|
83
|
+
try {
|
|
84
|
+
entries = await readdir(rel === '' ? packDir : join(packDir, rel), { withFileTypes: true });
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
for (const entry of entries) {
|
|
90
|
+
if (FORBIDDEN_SEGMENTS.has(entry.name))
|
|
91
|
+
continue;
|
|
92
|
+
const child = rel === '' ? entry.name : `${rel}/${entry.name}`;
|
|
93
|
+
if (entry.isDirectory())
|
|
94
|
+
await walk(packDir, child, matches, out);
|
|
95
|
+
else if (entry.isFile() && matches(child))
|
|
96
|
+
out.push(child);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=context-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-files.js","sourceRoot":"","sources":["../../src/build/context-files.ts"],"names":[],"mappings":"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"}
|