@cyanautomation/kaseki-agent 1.4.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/.dockerignore +54 -0
- package/.eslintignore +11 -0
- package/.eslintrc.json +95 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +53 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +53 -0
- package/.github/ISSUE_TEMPLATE/security.md +51 -0
- package/.github/PULL_REQUEST_TEMPLATE/default.md +71 -0
- package/.github/dependabot.yml +38 -0
- package/.github/skills/dependency-cache-optimization/SKILL.md +526 -0
- package/.github/skills/docker-image-management/SKILL.md +532 -0
- package/.github/skills/frontend-design/SKILL.md +782 -0
- package/.github/skills/prompt-engineering/SKILL.md +360 -0
- package/.github/skills/quality-gate-config/SKILL.md +591 -0
- package/.github/skills/result-report-analysis/SKILL.md +576 -0
- package/.github/skills/test-automation/SKILL.md +593 -0
- package/.github/skills/workflow-diagnosis/SKILL.md +468 -0
- package/.github/workflows/build-docker-image.yml +453 -0
- package/.github/workflows/release.yml +68 -0
- package/.releaserc.json +135 -0
- package/CHANGELOG.md +117 -0
- package/CLAUDE.md +336 -0
- package/CONTRIBUTING.md +339 -0
- package/Dockerfile +217 -0
- package/README.md +1527 -0
- package/STYLE.md +521 -0
- package/add-js-extensions.d.ts +9 -0
- package/add-js-extensions.d.ts.map +1 -0
- package/add-js-extensions.js.map +1 -0
- package/dist/add-js-extensions.d.ts +9 -0
- package/dist/add-js-extensions.d.ts.map +1 -0
- package/dist/add-js-extensions.js +52 -0
- package/dist/add-js-extensions.js.map +1 -0
- package/dist/ansi-colors.d.ts +26 -0
- package/dist/ansi-colors.d.ts.map +1 -0
- package/dist/ansi-colors.js +51 -0
- package/dist/ansi-colors.js.map +1 -0
- package/dist/cli/BaseCommand.d.ts +18 -0
- package/dist/cli/BaseCommand.d.ts.map +1 -0
- package/dist/cli/BaseCommand.js +31 -0
- package/dist/cli/BaseCommand.js.map +1 -0
- package/dist/cli/KasekiCLI.d.ts +30 -0
- package/dist/cli/KasekiCLI.d.ts.map +1 -0
- package/dist/cli/KasekiCLI.js +134 -0
- package/dist/cli/KasekiCLI.js.map +1 -0
- package/dist/cli/commands/ConfigCommand.d.ts +13 -0
- package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
- package/dist/cli/commands/ConfigCommand.js +131 -0
- package/dist/cli/commands/ConfigCommand.js.map +1 -0
- package/dist/cli/commands/DoctorCommand.d.ts +45 -0
- package/dist/cli/commands/DoctorCommand.d.ts.map +1 -0
- package/dist/cli/commands/DoctorCommand.js +309 -0
- package/dist/cli/commands/DoctorCommand.js.map +1 -0
- package/dist/cli/commands/ListCommand.d.ts +9 -0
- package/dist/cli/commands/ListCommand.d.ts.map +1 -0
- package/dist/cli/commands/ListCommand.js +81 -0
- package/dist/cli/commands/ListCommand.js.map +1 -0
- package/dist/cli/commands/ReportCommand.d.ts +9 -0
- package/dist/cli/commands/ReportCommand.d.ts.map +1 -0
- package/dist/cli/commands/ReportCommand.js +98 -0
- package/dist/cli/commands/ReportCommand.js.map +1 -0
- package/dist/cli/commands/RunCommand.d.ts +13 -0
- package/dist/cli/commands/RunCommand.d.ts.map +1 -0
- package/dist/cli/commands/RunCommand.js +191 -0
- package/dist/cli/commands/RunCommand.js.map +1 -0
- package/dist/cli/commands/SecretsCommand.d.ts +9 -0
- package/dist/cli/commands/SecretsCommand.d.ts.map +1 -0
- package/dist/cli/commands/SecretsCommand.js +109 -0
- package/dist/cli/commands/SecretsCommand.js.map +1 -0
- package/dist/cli/commands/ServeCommand.d.ts +9 -0
- package/dist/cli/commands/ServeCommand.d.ts.map +1 -0
- package/dist/cli/commands/ServeCommand.js +50 -0
- package/dist/cli/commands/ServeCommand.js.map +1 -0
- package/dist/cli/commands/SetupCommand.d.ts +42 -0
- package/dist/cli/commands/SetupCommand.d.ts.map +1 -0
- package/dist/cli/commands/SetupCommand.js +249 -0
- package/dist/cli/commands/SetupCommand.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +130 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +395 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +446 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/docker/DockerManager.d.ts +69 -0
- package/dist/docker/DockerManager.d.ts.map +1 -0
- package/dist/docker/DockerManager.js +266 -0
- package/dist/docker/DockerManager.js.map +1 -0
- package/dist/event-aggregator.d.ts +71 -0
- package/dist/event-aggregator.d.ts.map +1 -0
- package/dist/event-aggregator.js +95 -0
- package/dist/event-aggregator.js.map +1 -0
- package/dist/github-app-token.d.ts +16 -0
- package/dist/github-app-token.d.ts.map +1 -0
- package/dist/github-app-token.js +148 -0
- package/dist/github-app-token.js.map +1 -0
- package/dist/idempotency-store.d.ts +61 -0
- package/dist/idempotency-store.d.ts.map +1 -0
- package/dist/idempotency-store.js +321 -0
- package/dist/idempotency-store.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/instance/InstanceManager.d.ts +81 -0
- package/dist/instance/InstanceManager.d.ts.map +1 -0
- package/dist/instance/InstanceManager.js +220 -0
- package/dist/instance/InstanceManager.js.map +1 -0
- package/dist/instance-metadata-reader.d.ts +48 -0
- package/dist/instance-metadata-reader.d.ts.map +1 -0
- package/dist/instance-metadata-reader.js +94 -0
- package/dist/instance-metadata-reader.js.map +1 -0
- package/dist/instance-state-derivation.d.ts +42 -0
- package/dist/instance-state-derivation.d.ts.map +1 -0
- package/dist/instance-state-derivation.js +133 -0
- package/dist/instance-state-derivation.js.map +1 -0
- package/dist/job-scheduler.d.ts +124 -0
- package/dist/job-scheduler.d.ts.map +1 -0
- package/dist/job-scheduler.js +992 -0
- package/dist/job-scheduler.js.map +1 -0
- package/dist/kaseki-api-client.d.ts +89 -0
- package/dist/kaseki-api-client.d.ts.map +1 -0
- package/dist/kaseki-api-client.js +405 -0
- package/dist/kaseki-api-client.js.map +1 -0
- package/dist/kaseki-api-config.d.ts +34 -0
- package/dist/kaseki-api-config.d.ts.map +1 -0
- package/dist/kaseki-api-config.js +113 -0
- package/dist/kaseki-api-config.js.map +1 -0
- package/dist/kaseki-api-routes.d.ts +13 -0
- package/dist/kaseki-api-routes.d.ts.map +1 -0
- package/dist/kaseki-api-routes.js +559 -0
- package/dist/kaseki-api-routes.js.map +1 -0
- package/dist/kaseki-api-service-wrapper.d.ts +43 -0
- package/dist/kaseki-api-service-wrapper.d.ts.map +1 -0
- package/dist/kaseki-api-service-wrapper.js +150 -0
- package/dist/kaseki-api-service-wrapper.js.map +1 -0
- package/dist/kaseki-api-service.d.ts +16 -0
- package/dist/kaseki-api-service.d.ts.map +1 -0
- package/dist/kaseki-api-service.js +143 -0
- package/dist/kaseki-api-service.js.map +1 -0
- package/dist/kaseki-api-types.d.ts +440 -0
- package/dist/kaseki-api-types.d.ts.map +1 -0
- package/dist/kaseki-api-types.js +64 -0
- package/dist/kaseki-api-types.js.map +1 -0
- package/dist/kaseki-cli-lib.d.ts +219 -0
- package/dist/kaseki-cli-lib.d.ts.map +1 -0
- package/dist/kaseki-cli-lib.js +523 -0
- package/dist/kaseki-cli-lib.js.map +1 -0
- package/dist/kaseki-cli.d.ts +38 -0
- package/dist/kaseki-cli.d.ts.map +1 -0
- package/dist/kaseki-cli.js +559 -0
- package/dist/kaseki-cli.js.map +1 -0
- package/dist/kaseki-report.d.ts +3 -0
- package/dist/kaseki-report.d.ts.map +1 -0
- package/dist/kaseki-report.js +140 -0
- package/dist/kaseki-report.js.map +1 -0
- package/dist/lib/subprocess-helpers.d.ts +98 -0
- package/dist/lib/subprocess-helpers.d.ts.map +1 -0
- package/dist/lib/subprocess-helpers.js +136 -0
- package/dist/lib/subprocess-helpers.js.map +1 -0
- package/dist/logger.d.ts +39 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +79 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.d.ts +19 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +59 -0
- package/dist/metrics.js.map +1 -0
- package/dist/middleware/job-lookup.d.ts +27 -0
- package/dist/middleware/job-lookup.d.ts.map +1 -0
- package/dist/middleware/job-lookup.js +28 -0
- package/dist/middleware/job-lookup.js.map +1 -0
- package/dist/pi-event-filter.d.ts +3 -0
- package/dist/pi-event-filter.d.ts.map +1 -0
- package/dist/pi-event-filter.js +126 -0
- package/dist/pi-event-filter.js.map +1 -0
- package/dist/pi-progress-stream.d.ts +3 -0
- package/dist/pi-progress-stream.d.ts.map +1 -0
- package/dist/pi-progress-stream.js +205 -0
- package/dist/pi-progress-stream.js.map +1 -0
- package/dist/pi-progress-summarizer.d.ts +61 -0
- package/dist/pi-progress-summarizer.d.ts.map +1 -0
- package/dist/pi-progress-summarizer.js +246 -0
- package/dist/pi-progress-summarizer.js.map +1 -0
- package/dist/pre-flight-validator.d.ts +72 -0
- package/dist/pre-flight-validator.d.ts.map +1 -0
- package/dist/pre-flight-validator.js +513 -0
- package/dist/pre-flight-validator.js.map +1 -0
- package/dist/progress-stream-utils.d.ts +3 -0
- package/dist/progress-stream-utils.d.ts.map +1 -0
- package/dist/progress-stream-utils.js +15 -0
- package/dist/progress-stream-utils.js.map +1 -0
- package/dist/result-cache.d.ts +52 -0
- package/dist/result-cache.d.ts.map +1 -0
- package/dist/result-cache.js +134 -0
- package/dist/result-cache.js.map +1 -0
- package/dist/routes/artifact-routes.d.ts +10 -0
- package/dist/routes/artifact-routes.d.ts.map +1 -0
- package/dist/routes/artifact-routes.js +126 -0
- package/dist/routes/artifact-routes.js.map +1 -0
- package/dist/routes/log-routes.d.ts +8 -0
- package/dist/routes/log-routes.d.ts.map +1 -0
- package/dist/routes/log-routes.js +345 -0
- package/dist/routes/log-routes.js.map +1 -0
- package/dist/routes/status-routes.d.ts +8 -0
- package/dist/routes/status-routes.d.ts.map +1 -0
- package/dist/routes/status-routes.js +82 -0
- package/dist/routes/status-routes.js.map +1 -0
- package/dist/routes/webhook-routes.d.ts +6 -0
- package/dist/routes/webhook-routes.d.ts.map +1 -0
- package/dist/routes/webhook-routes.js +86 -0
- package/dist/routes/webhook-routes.js.map +1 -0
- package/dist/run-artifact-metadata-cache.d.ts +42 -0
- package/dist/run-artifact-metadata-cache.d.ts.map +1 -0
- package/dist/run-artifact-metadata-cache.js +139 -0
- package/dist/run-artifact-metadata-cache.js.map +1 -0
- package/dist/secret-value-cache.d.ts +13 -0
- package/dist/secret-value-cache.d.ts.map +1 -0
- package/dist/secret-value-cache.js +44 -0
- package/dist/secret-value-cache.js.map +1 -0
- package/dist/secrets/SecretsManager.d.ts +80 -0
- package/dist/secrets/SecretsManager.d.ts.map +1 -0
- package/dist/secrets/SecretsManager.js +306 -0
- package/dist/secrets/SecretsManager.js.map +1 -0
- package/dist/test-utils.d.ts +55 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +48 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/timestamp-tracker.d.ts +75 -0
- package/dist/timestamp-tracker.d.ts.map +1 -0
- package/dist/timestamp-tracker.js +121 -0
- package/dist/timestamp-tracker.js.map +1 -0
- package/dist/utils/failure-artifact-writer.d.ts +29 -0
- package/dist/utils/failure-artifact-writer.d.ts.map +1 -0
- package/dist/utils/failure-artifact-writer.js +157 -0
- package/dist/utils/failure-artifact-writer.js.map +1 -0
- package/dist/utils/file-helpers.d.ts +41 -0
- package/dist/utils/file-helpers.d.ts.map +1 -0
- package/dist/utils/file-helpers.js +143 -0
- package/dist/utils/file-helpers.js.map +1 -0
- package/dist/utils/http-client-factory.d.ts +46 -0
- package/dist/utils/http-client-factory.d.ts.map +1 -0
- package/dist/utils/http-client-factory.js +114 -0
- package/dist/utils/http-client-factory.js.map +1 -0
- package/dist/utils/progress-normalizer.d.ts +13 -0
- package/dist/utils/progress-normalizer.d.ts.map +1 -0
- package/dist/utils/progress-normalizer.js +57 -0
- package/dist/utils/progress-normalizer.js.map +1 -0
- package/dist/utils/response-helpers.d.ts +34 -0
- package/dist/utils/response-helpers.d.ts.map +1 -0
- package/dist/utils/response-helpers.js +78 -0
- package/dist/utils/response-helpers.js.map +1 -0
- package/dist/utils/route-helpers.d.ts +17 -0
- package/dist/utils/route-helpers.d.ts.map +1 -0
- package/dist/utils/route-helpers.js +22 -0
- package/dist/utils/route-helpers.js.map +1 -0
- package/dist/utils/status-response-builder.d.ts +23 -0
- package/dist/utils/status-response-builder.d.ts.map +1 -0
- package/dist/utils/status-response-builder.js +144 -0
- package/dist/utils/status-response-builder.js.map +1 -0
- package/dist/utils/type-guards.d.ts +37 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +45 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/utils/utf8-helpers.d.ts +32 -0
- package/dist/utils/utf8-helpers.d.ts.map +1 -0
- package/dist/utils/utf8-helpers.js +97 -0
- package/dist/utils/utf8-helpers.js.map +1 -0
- package/dist/utils/webhook-event-builder.d.ts +26 -0
- package/dist/utils/webhook-event-builder.d.ts.map +1 -0
- package/dist/utils/webhook-event-builder.js +77 -0
- package/dist/utils/webhook-event-builder.js.map +1 -0
- package/dist/webhook-manager.d.ts +56 -0
- package/dist/webhook-manager.d.ts.map +1 -0
- package/dist/webhook-manager.js +359 -0
- package/dist/webhook-manager.js.map +1 -0
- package/docker/workspace-cache/package-lock.json +13 -0
- package/docker/workspace-cache/package.json +7 -0
- package/docker-compose.yml +53 -0
- package/docs/API.md +708 -0
- package/docs/BACKLOG.md +19 -0
- package/docs/BUILD_STRATEGY.md +404 -0
- package/docs/CLI.md +569 -0
- package/docs/DEPLOYMENT.md +521 -0
- package/docs/DEVELOPMENT.md +459 -0
- package/docs/DOCKER_SETUP.md +522 -0
- package/docs/ENHANCED_PROGRESS_LOGS.md +264 -0
- package/docs/IMPLEMENTATION_SUMMARY.md +549 -0
- package/docs/INTEGRATION_EXAMPLE.md +217 -0
- package/docs/NPM_SETUP.md +468 -0
- package/docs/PHASE1-4_IMPLEMENTATION.md +302 -0
- package/docs/PHASE1_COMPLETION.md +192 -0
- package/docs/PHASE2_COMPLETION.md +134 -0
- package/docs/PHASE6_MIGRATION.md +392 -0
- package/docs/PRINTF_SAFETY_FIX.md +282 -0
- package/docs/QUALITY_GATES.md +369 -0
- package/docs/SETUP_GUIDE.md +482 -0
- package/docs/TASK_PROMPT_TEMPLATES.md +533 -0
- package/docs/VALIDATION_FIX.md +139 -0
- package/docs/VERIFICATION_CHECKLIST.md +335 -0
- package/docs/repo-maturity.md +760 -0
- package/fix-tests.d.ts +9 -0
- package/fix-tests.d.ts.map +1 -0
- package/fix-tests.js.map +1 -0
- package/fix-tests.ts +53 -0
- package/jest.config.ts +31 -0
- package/kaseki +183 -0
- package/kaseki-agent.sh +1961 -0
- package/ops/logrotate/kaseki +10 -0
- package/package.json +83 -0
- package/perf/README.md +54 -0
- package/perf/pi-event-filter.benchmark.test.ts +98 -0
- package/run-kaseki-json.test.sh +106 -0
- package/run-kaseki.sh +990 -0
- package/scripts/allowlist-helper.sh +56 -0
- package/scripts/cleanup-kaseki.sh +168 -0
- package/scripts/deploy-pi-template.sh +293 -0
- package/scripts/docker-entrypoint.sh +71 -0
- package/scripts/dry-run-allowlist.sh +161 -0
- package/scripts/kaseki-activate.sh +396 -0
- package/scripts/kaseki-api.service +62 -0
- package/scripts/kaseki-container-entrypoint-wrapper.sh +119 -0
- package/scripts/kaseki-container-setup-remote.sh +172 -0
- package/scripts/kaseki-container-setup.sh +193 -0
- package/scripts/kaseki-healthcheck.sh +95 -0
- package/scripts/kaseki-install.sh +50 -0
- package/scripts/kaseki-maturity-score.sh +291 -0
- package/scripts/kaseki-performance-metrics.sh +122 -0
- package/scripts/kaseki-preflight.sh +270 -0
- package/scripts/kaseki-setup.sh +265 -0
- package/scripts/pi-setup-remote.sh +213 -0
- package/scripts/setup-github-labels.sh +42 -0
- package/scripts/suggest-allowlist.sh +68 -0
- package/scripts/templates/MULTI_HOST_DISTRIBUTED.md +337 -0
- package/scripts/templates/REST_API_SERVICE.md +490 -0
- package/scripts/templates/SINGLE_HOST_CLI.md +194 -0
- package/scripts/test-github-app.sh +248 -0
- package/src/add-js-extensions.ts +61 -0
- package/src/ansi-colors.test.ts +62 -0
- package/src/ansi-colors.ts +67 -0
- package/src/cli/BaseCommand.ts +40 -0
- package/src/cli/KasekiCLI.ts +154 -0
- package/src/cli/commands/ConfigCommand.ts +145 -0
- package/src/cli/commands/DoctorCommand.ts +329 -0
- package/src/cli/commands/ListCommand.ts +105 -0
- package/src/cli/commands/ReportCommand.ts +110 -0
- package/src/cli/commands/RunCommand.ts +218 -0
- package/src/cli/commands/SecretsCommand.ts +120 -0
- package/src/cli/commands/ServeCommand.ts +62 -0
- package/src/cli/commands/SetupCommand.ts +301 -0
- package/src/cli.ts +138 -0
- package/src/config/ConfigManager.ts +476 -0
- package/src/docker/DockerManager.ts +319 -0
- package/src/docker-entrypoint-packaging.test.ts +33 -0
- package/src/event-aggregator.test.ts +117 -0
- package/src/event-aggregator.ts +126 -0
- package/src/github-app-token.ts +215 -0
- package/src/idempotency-store.test.ts +117 -0
- package/src/idempotency-store.ts +385 -0
- package/src/index.ts +89 -0
- package/src/instance/InstanceManager.ts +285 -0
- package/src/instance-metadata-reader.test.ts +190 -0
- package/src/instance-metadata-reader.ts +129 -0
- package/src/instance-state-derivation.test.ts +263 -0
- package/src/instance-state-derivation.ts +148 -0
- package/src/job-scheduler.test.ts +1236 -0
- package/src/job-scheduler.ts +1117 -0
- package/src/kaseki-api-client.ts +488 -0
- package/src/kaseki-api-config.test.ts +315 -0
- package/src/kaseki-api-config.ts +175 -0
- package/src/kaseki-api-routes.test.ts +1615 -0
- package/src/kaseki-api-routes.ts +643 -0
- package/src/kaseki-api-service-wrapper.ts +188 -0
- package/src/kaseki-api-service.test.ts +418 -0
- package/src/kaseki-api-service.ts +192 -0
- package/src/kaseki-api-types.ts +320 -0
- package/src/kaseki-cli-lib.test.ts +552 -0
- package/src/kaseki-cli-lib.ts +760 -0
- package/src/kaseki-cli.ts +682 -0
- package/src/kaseki-report.test.ts +118 -0
- package/src/kaseki-report.ts +192 -0
- package/src/lib/subprocess-helpers.ts +177 -0
- package/src/logger.ts +114 -0
- package/src/metrics.ts +66 -0
- package/src/middleware/job-lookup.test.ts +113 -0
- package/src/middleware/job-lookup.ts +45 -0
- package/src/pi-event-filter.test.ts +183 -0
- package/src/pi-event-filter.ts +183 -0
- package/src/pi-progress-stream.ts +287 -0
- package/src/pi-progress-summarizer.test.ts +302 -0
- package/src/pi-progress-summarizer.ts +287 -0
- package/src/pre-flight-validator.test.ts +512 -0
- package/src/pre-flight-validator.ts +618 -0
- package/src/progress-stream-utils.test.ts +35 -0
- package/src/progress-stream-utils.ts +14 -0
- package/src/result-cache.test.ts +195 -0
- package/src/result-cache.ts +181 -0
- package/src/routes/artifact-routes.ts +169 -0
- package/src/routes/log-routes.ts +391 -0
- package/src/routes/status-routes.ts +92 -0
- package/src/routes/webhook-routes.ts +97 -0
- package/src/run-artifact-metadata-cache.test.ts +80 -0
- package/src/run-artifact-metadata-cache.ts +184 -0
- package/src/secret-value-cache.test.ts +66 -0
- package/src/secret-value-cache.ts +55 -0
- package/src/secrets/SecretsManager.ts +343 -0
- package/src/test-utils.ts +81 -0
- package/src/timestamp-tracker.test.ts +134 -0
- package/src/timestamp-tracker.ts +132 -0
- package/src/utils/failure-artifact-writer.ts +187 -0
- package/src/utils/file-helpers.test.ts +235 -0
- package/src/utils/file-helpers.ts +150 -0
- package/src/utils/http-client-factory.test.ts +245 -0
- package/src/utils/http-client-factory.ts +157 -0
- package/src/utils/progress-normalizer.test.ts +442 -0
- package/src/utils/progress-normalizer.ts +68 -0
- package/src/utils/response-helpers.test.ts +122 -0
- package/src/utils/response-helpers.ts +101 -0
- package/src/utils/route-helpers.ts +30 -0
- package/src/utils/status-response-builder.ts +159 -0
- package/src/utils/type-guards.ts +52 -0
- package/src/utils/utf8-helpers.ts +102 -0
- package/src/utils/webhook-event-builder.test.ts +143 -0
- package/src/utils/webhook-event-builder.ts +87 -0
- package/src/webhook-manager.test.ts +152 -0
- package/src/webhook-manager.ts +445 -0
- package/templates/allowlist-api-route.txt +7 -0
- package/templates/allowlist-comprehensive.txt +8 -0
- package/templates/allowlist-parser-fix.txt +6 -0
- package/templates/allowlist-ui-component.txt +9 -0
- package/templates/allowlist-utility.txt +9 -0
- package/test/actual-model-metadata.test.sh +102 -0
- package/test/dry-run.test.sh +131 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-0.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-1.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-invalid.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-0.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-1.json +1 -0
- package/test/kaseki-api.integration.test.sh +165 -0
- package/test/pi-event-filter-failure.test.sh +83 -0
- package/test/printf-safety-focused.test.sh +99 -0
- package/test/printf-safety-results/results/restoration.jsonl +10 -0
- package/test/printf-safety-results/results/test.jsonl +0 -0
- package/test/printf-safety.test.sh +297 -0
- package/test/validation-fix.test.sh +79 -0
- package/test/validation-integration.test.sh +109 -0
- package/tests/allowlist-glob.test.sh +61 -0
- package/tests/dependency-cache-key.test.sh +48 -0
- package/tests/dependency-restore-mode.test.sh +48 -0
- package/tests/doctor-template-parity.test.sh +95 -0
- package/tests/github-operations.test.sh +142 -0
- package/tests/npm-install-flags.test.sh +58 -0
- package/tests/quality-gates.test.sh +178 -0
- package/tests/repo-memory.test.sh +103 -0
- package/tests/restore-disallowed-changes.test.sh +80 -0
- package/tests/validation-missing-npm-scripts.test.sh +93 -0
- package/tests/validation-strict-mode.test.sh +118 -0
- package/tsconfig.changed.json +7 -0
- package/tsconfig.json +39 -0
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: docker-image-management
|
|
3
|
+
description: Managing base images, Pi CLI versions, and multi-arch builds
|
|
4
|
+
tags: [kaseki, docker, devops, image-management, ci-cd]
|
|
5
|
+
relatedSkills: [test-automation, dependency-cache-optimization]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Docker Image Management for Kaseki Agent
|
|
9
|
+
|
|
10
|
+
This skill guides maintaining the kaseki-agent Docker image, including base image updates, Pi CLI versioning, and multi-architecture builds.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
**When to Use**:
|
|
15
|
+
- Updating Node.js base image (security patches, new versions)
|
|
16
|
+
- Upgrading Pi CLI to a new version
|
|
17
|
+
- Investigating multi-arch (amd64 + arm64) build failures
|
|
18
|
+
- Troubleshooting image caching or layer issues
|
|
19
|
+
- Publishing a new image version
|
|
20
|
+
|
|
21
|
+
**Key Concepts**:
|
|
22
|
+
- Base image: Node 22.22.2 (monthly security updates)
|
|
23
|
+
- Pi CLI: Pre-installed version 0.70.2 (compatibility matrix)
|
|
24
|
+
- Multi-arch: Build for both amd64 + arm64 using QEMU
|
|
25
|
+
- Registry: Published to `docker.io/cyanautomation/kaseki-agent`
|
|
26
|
+
- Versioning: Semantic versioning + latest tag
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Base Image (Node)
|
|
31
|
+
|
|
32
|
+
### Current Version
|
|
33
|
+
```
|
|
34
|
+
Base: node:22.22.2-alpine
|
|
35
|
+
Architecture: linux/amd64, linux/arm64
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Monitoring for Updates
|
|
39
|
+
|
|
40
|
+
**Monthly Security Checks**:
|
|
41
|
+
1. Check Node.js security advisories: https://nodejs.org/en/security
|
|
42
|
+
2. Review Alpine Linux security bulletins (base of node:*-alpine)
|
|
43
|
+
3. Scan current image for vulnerabilities:
|
|
44
|
+
```bash
|
|
45
|
+
docker build -t kaseki-template:test .
|
|
46
|
+
docker run --rm aquasec/trivy image kaseki-template:test
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Updating the Base Image
|
|
50
|
+
|
|
51
|
+
**Step 1**: Update Dockerfile
|
|
52
|
+
```dockerfile
|
|
53
|
+
# Before
|
|
54
|
+
FROM node:22.22.2-alpine AS builder
|
|
55
|
+
|
|
56
|
+
# After
|
|
57
|
+
FROM node:22.23.0-alpine AS builder
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Step 2**: Test the change locally
|
|
61
|
+
```bash
|
|
62
|
+
# Build locally
|
|
63
|
+
docker build -t kaseki-template:test .
|
|
64
|
+
|
|
65
|
+
# Verify Node version
|
|
66
|
+
docker run --rm kaseki-template:test node --version
|
|
67
|
+
# Output: v22.23.0
|
|
68
|
+
|
|
69
|
+
# Run sanity checks
|
|
70
|
+
docker run --rm kaseki-template:test pi --version
|
|
71
|
+
docker run --rm kaseki-template:test npm --version
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Step 3**: Update Pi CLI if needed (see section below)
|
|
75
|
+
|
|
76
|
+
**Step 4**: Run full integration tests
|
|
77
|
+
```bash
|
|
78
|
+
bash tests/docker-image.test.sh
|
|
79
|
+
bash tests/smoke.test.sh
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Step 5**: Update CLAUDE.md and version tracking
|
|
83
|
+
```markdown
|
|
84
|
+
# In CLAUDE.md
|
|
85
|
+
**Node Version**: 22.23.0
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Breaking Changes in Node Versions
|
|
89
|
+
|
|
90
|
+
**Node 20 → 22**: Check for deprecated features
|
|
91
|
+
- V8 breaking changes (inspect [Node release notes](https://nodejs.org/en/blog))
|
|
92
|
+
- npm behavior differences
|
|
93
|
+
- ESM vs CommonJS compatibility
|
|
94
|
+
|
|
95
|
+
**How to Test**:
|
|
96
|
+
```bash
|
|
97
|
+
# Test against actual repo that uses Node 22
|
|
98
|
+
REPO_URL=https://github.com/cyanautomation/crudmapper \
|
|
99
|
+
GIT_REF=main \
|
|
100
|
+
./run-kaseki.sh --doctor
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Pi CLI Version Management
|
|
106
|
+
|
|
107
|
+
### Current Version
|
|
108
|
+
```
|
|
109
|
+
Pi CLI: 0.70.2 (as of April 2026)
|
|
110
|
+
Installation: npm install -g @anthropic-ai/cli@0.70.2 (in Dockerfile)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Version Compatibility Matrix
|
|
114
|
+
|
|
115
|
+
| Pi CLI Version | Node LTS | Notable Changes |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| 0.70.2 | 20, 22 | Current; stable |
|
|
118
|
+
| 0.71.0 | 20, 22 | (hypothetical) Added new features |
|
|
119
|
+
| 0.60.x | 18, 20 | Legacy; not recommended |
|
|
120
|
+
|
|
121
|
+
### Checking for Updates
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Check npm registry for latest Pi CLI
|
|
125
|
+
npm view @anthropic-ai/cli versions --json | tail -5
|
|
126
|
+
|
|
127
|
+
# Check release notes
|
|
128
|
+
# https://github.com/anthropics/anthropic-sdk-python/releases
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Updating Pi CLI
|
|
132
|
+
|
|
133
|
+
**Step 1**: Update Dockerfile
|
|
134
|
+
```dockerfile
|
|
135
|
+
# Before
|
|
136
|
+
RUN npm install -g @anthropic-ai/cli@0.70.2
|
|
137
|
+
|
|
138
|
+
# After
|
|
139
|
+
RUN npm install -g @anthropic-ai/cli@0.71.0
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Step 2**: Test Pi CLI availability
|
|
143
|
+
```bash
|
|
144
|
+
docker build -t kaseki-template:test .
|
|
145
|
+
docker run --rm kaseki-template:test pi --version
|
|
146
|
+
# Output: @anthropic-ai/cli/0.71.0
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Step 3**: Test with a real kaseki run (optional, if API key available)
|
|
150
|
+
```bash
|
|
151
|
+
OPENROUTER_API_KEY=sk-or-... \
|
|
152
|
+
./run-kaseki.sh kaseki-test-1
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Step 4**: Check compatibility
|
|
156
|
+
- Run validation commands
|
|
157
|
+
- Verify Pi event JSON structure (pi-events.jsonl format)
|
|
158
|
+
- Check for new error messages or behavior changes
|
|
159
|
+
|
|
160
|
+
**Step 5**: Update documentation
|
|
161
|
+
```markdown
|
|
162
|
+
# In CLAUDE.md
|
|
163
|
+
**Pi CLI Version**: 0.71.0
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Handling Breaking Changes in Pi CLI
|
|
167
|
+
|
|
168
|
+
If a new Pi CLI version has breaking changes:
|
|
169
|
+
|
|
170
|
+
1. **Update kaseki scripts** (pi-event-filter.js, pi-summary.json parsing)
|
|
171
|
+
2. **Test event structure**:
|
|
172
|
+
```javascript
|
|
173
|
+
// Verify new event format still parses correctly
|
|
174
|
+
const events = JSON.parse(piEventJson);
|
|
175
|
+
expect(events[0]).toHaveProperty('type');
|
|
176
|
+
```
|
|
177
|
+
3. **Update tests** to expect new behavior
|
|
178
|
+
4. **Document in CHANGELOG** if user-facing changes
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Multi-Architecture Builds
|
|
183
|
+
|
|
184
|
+
### Setup: Docker Buildx
|
|
185
|
+
|
|
186
|
+
**Buildx** enables building images for multiple architectures (amd64, arm64, etc.).
|
|
187
|
+
|
|
188
|
+
**Check if buildx is available**:
|
|
189
|
+
```bash
|
|
190
|
+
docker buildx version
|
|
191
|
+
# Output: github.com/docker/buildx v0.10.4
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**If Not Installed**:
|
|
195
|
+
```bash
|
|
196
|
+
# Install via Docker Desktop (included) or:
|
|
197
|
+
docker run --privileged --rm tonistiigi/binfmt --install all
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Building Multi-Arch Images
|
|
201
|
+
|
|
202
|
+
**Build and Load to Local Docker** (for testing):
|
|
203
|
+
```bash
|
|
204
|
+
# Build amd64 only (for local testing)
|
|
205
|
+
docker buildx build \
|
|
206
|
+
--platform linux/amd64 \
|
|
207
|
+
-t kaseki-template:latest \
|
|
208
|
+
--load \
|
|
209
|
+
.
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Build All Architectures** (for publishing):
|
|
213
|
+
```bash
|
|
214
|
+
# Build amd64 + arm64 (outputs to registry)
|
|
215
|
+
docker buildx build \
|
|
216
|
+
--platform linux/amd64,linux/arm64 \
|
|
217
|
+
-t docker.io/cyanautomation/kaseki-agent:0.1.0 \
|
|
218
|
+
-t docker.io/cyanautomation/kaseki-agent:latest \
|
|
219
|
+
--push \
|
|
220
|
+
.
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Multi-Arch Troubleshooting
|
|
224
|
+
|
|
225
|
+
**Issue**: Build fails for arm64
|
|
226
|
+
|
|
227
|
+
**Diagnosis**:
|
|
228
|
+
```bash
|
|
229
|
+
# Check QEMU support
|
|
230
|
+
docker run --rm --privileged tonistiigi/binfmt --status
|
|
231
|
+
# Output: qemu-aarch64-static: SUPPORTED
|
|
232
|
+
|
|
233
|
+
# Rebuild with verbose output
|
|
234
|
+
docker buildx build \
|
|
235
|
+
--platform linux/arm64 \
|
|
236
|
+
-t kaseki-template:test \
|
|
237
|
+
--progress=plain \
|
|
238
|
+
.
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**Common Causes**:
|
|
242
|
+
1. **Invalid base image digest** → Use multi-arch base (node:*-alpine is multi-arch)
|
|
243
|
+
2. **Architecture-specific dependencies** → Check npm packages for native bindings
|
|
244
|
+
3. **QEMU timeout** → Increase builder timeout or simplify build steps
|
|
245
|
+
|
|
246
|
+
**Solution Steps**:
|
|
247
|
+
1. Verify base image supports arm64: `docker pull --platform linux/arm64 node:22.22.2-alpine`
|
|
248
|
+
2. Check package.json for native modules: `npm ls | grep gyp`
|
|
249
|
+
3. Rebuild with increased timeout: `--build-arg BUILDKIT_PROGRESS=plain`
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Dockerfile Structure
|
|
254
|
+
|
|
255
|
+
### Multi-Stage Build
|
|
256
|
+
|
|
257
|
+
```dockerfile
|
|
258
|
+
# Stage 1: Builder (installs Pi CLI, dependencies)
|
|
259
|
+
FROM node:22.22.2-alpine AS builder
|
|
260
|
+
|
|
261
|
+
WORKDIR /build
|
|
262
|
+
RUN npm install -g @anthropic-ai/cli@0.70.2
|
|
263
|
+
|
|
264
|
+
# Stage 2: Runtime (minimal, copies Pi CLI from builder)
|
|
265
|
+
FROM node:22.22.2-alpine
|
|
266
|
+
|
|
267
|
+
RUN addgroup -g 10001 kaseki && \
|
|
268
|
+
adduser -D -u 10001 -G kaseki kaseki
|
|
269
|
+
|
|
270
|
+
WORKDIR /app
|
|
271
|
+
|
|
272
|
+
# Copy Pi CLI from builder
|
|
273
|
+
COPY --from=builder /usr/local/lib/node_modules /usr/local/lib/node_modules
|
|
274
|
+
COPY --from=builder /usr/local/bin/pi /usr/local/bin/pi
|
|
275
|
+
|
|
276
|
+
# Copy scripts
|
|
277
|
+
COPY kaseki-agent.sh /app/
|
|
278
|
+
COPY pi-event-filter.js /app/
|
|
279
|
+
COPY kaseki-report.js /app/
|
|
280
|
+
|
|
281
|
+
RUN chmod +x /app/kaseki-agent.sh
|
|
282
|
+
|
|
283
|
+
USER kaseki:kaseki
|
|
284
|
+
|
|
285
|
+
ENTRYPOINT ["/app/kaseki-agent.sh"]
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Why Multi-Stage?**
|
|
289
|
+
- **Smaller final image**: Builder dependencies (git, build tools) aren't in runtime layer
|
|
290
|
+
- **Faster rebuilds**: Only rebuild what changed (cache layers)
|
|
291
|
+
- **Security**: Runtime doesn't include build tools
|
|
292
|
+
|
|
293
|
+
### Cache Layers
|
|
294
|
+
|
|
295
|
+
Dockerfile layers are cached independently. Order matters:
|
|
296
|
+
|
|
297
|
+
```dockerfile
|
|
298
|
+
# Good: Stable layers first, mutable layers last
|
|
299
|
+
FROM node:22.22.2-alpine # Cache hit (stable)
|
|
300
|
+
RUN npm install -g @anthropic-ai/cli # Cache hit (stable)
|
|
301
|
+
COPY kaseki-agent.sh /app/ # Cache miss (depends on file content)
|
|
302
|
+
COPY pi-event-filter.js /app/ # Cache miss
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**Cache Busting**:
|
|
306
|
+
If you need to force a rebuild (e.g., security patch in base image), add a label:
|
|
307
|
+
|
|
308
|
+
```dockerfile
|
|
309
|
+
LABEL version="1" rebuild_date="2026-04-25"
|
|
310
|
+
# Increment 'version' or update date to bust cache
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Smoke Tests in Dockerfile
|
|
314
|
+
|
|
315
|
+
You can add smoke tests to the build to catch issues early:
|
|
316
|
+
|
|
317
|
+
```dockerfile
|
|
318
|
+
# Add after installing Pi CLI
|
|
319
|
+
RUN pi --version || exit 1
|
|
320
|
+
RUN npm --version || exit 1
|
|
321
|
+
|
|
322
|
+
# Verify non-root user
|
|
323
|
+
RUN test "$(id -u)" = "10001" || exit 1
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Publishing Images
|
|
329
|
+
|
|
330
|
+
### Version Tagging Strategy
|
|
331
|
+
|
|
332
|
+
| Tag | Purpose | When |
|
|
333
|
+
|---|---|---|
|
|
334
|
+
| `0.1.0` | Semantic version | Release with version bump |
|
|
335
|
+
| `0.1` | Minor version | Latest 0.1.x release |
|
|
336
|
+
| `latest` | Current stable | Every release |
|
|
337
|
+
| `edge` (optional) | Development | On main branch push |
|
|
338
|
+
|
|
339
|
+
### GitHub Actions Workflow
|
|
340
|
+
|
|
341
|
+
```yaml
|
|
342
|
+
name: Publish Docker Image
|
|
343
|
+
|
|
344
|
+
on:
|
|
345
|
+
push:
|
|
346
|
+
tags:
|
|
347
|
+
- 'v*' # v0.1.0, v0.2.0, etc.
|
|
348
|
+
|
|
349
|
+
jobs:
|
|
350
|
+
publish:
|
|
351
|
+
runs-on: ubuntu-latest
|
|
352
|
+
steps:
|
|
353
|
+
- uses: actions/checkout@v3
|
|
354
|
+
|
|
355
|
+
- uses: docker/setup-buildx-action@v2
|
|
356
|
+
|
|
357
|
+
- uses: docker/login-action@v2
|
|
358
|
+
with:
|
|
359
|
+
username: ${{ secrets.DOCKER_USERNAME }}
|
|
360
|
+
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
361
|
+
|
|
362
|
+
- uses: docker/build-push-action@v4
|
|
363
|
+
with:
|
|
364
|
+
context: .
|
|
365
|
+
push: true
|
|
366
|
+
tags: |
|
|
367
|
+
docker.io/cyanautomation/kaseki-agent:${{ github.ref_name }}
|
|
368
|
+
docker.io/cyanautomation/kaseki-agent:latest
|
|
369
|
+
platforms: linux/amd64,linux/arm64
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Manual Publishing
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
# Build and push
|
|
376
|
+
docker buildx build \
|
|
377
|
+
--platform linux/amd64,linux/arm64 \
|
|
378
|
+
-t docker.io/cyanautomation/kaseki-agent:0.1.1 \
|
|
379
|
+
-t docker.io/cyanautomation/kaseki-agent:latest \
|
|
380
|
+
--push \
|
|
381
|
+
.
|
|
382
|
+
|
|
383
|
+
# Verify on registry
|
|
384
|
+
docker pull docker.io/cyanautomation/kaseki-agent:0.1.1
|
|
385
|
+
docker inspect docker.io/cyanautomation/kaseki-agent:0.1.1 | jq '.[0].Architecture'
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## Smoke Tests
|
|
391
|
+
|
|
392
|
+
### Image Validation Tests
|
|
393
|
+
|
|
394
|
+
**Test: Pi CLI is available**
|
|
395
|
+
```bash
|
|
396
|
+
docker run --rm kaseki-template:latest pi --version
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**Test: Metadata structure is correct**
|
|
400
|
+
```bash
|
|
401
|
+
docker run --rm kaseki-template:latest bash -c '
|
|
402
|
+
[[ -f /opt/kaseki/workspace-cache/package.json ]] || exit 1
|
|
403
|
+
'
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
**Test: Non-root user**
|
|
407
|
+
```bash
|
|
408
|
+
docker run --rm kaseki-template:latest id -u | grep -q 10001
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
**Test: Read-only root filesystem**
|
|
412
|
+
```bash
|
|
413
|
+
docker run --rm --read-only kaseki-template:latest touch /test.txt 2>&1 | grep -q "Read-only"
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### Running All Smoke Tests
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
#!/bin/bash
|
|
420
|
+
# tests/smoke.test.sh
|
|
421
|
+
|
|
422
|
+
set -e
|
|
423
|
+
|
|
424
|
+
IMAGE="kaseki-template:latest"
|
|
425
|
+
|
|
426
|
+
echo "Building image..."
|
|
427
|
+
docker build -t $IMAGE .
|
|
428
|
+
|
|
429
|
+
echo "Running smoke tests..."
|
|
430
|
+
|
|
431
|
+
echo "✓ Pi CLI available"
|
|
432
|
+
docker run --rm $IMAGE pi --version
|
|
433
|
+
|
|
434
|
+
echo "✓ Non-root user (UID 10001)"
|
|
435
|
+
docker run --rm $IMAGE id -u | grep -q 10001
|
|
436
|
+
|
|
437
|
+
echo "✓ npm available"
|
|
438
|
+
docker run --rm $IMAGE npm --version
|
|
439
|
+
|
|
440
|
+
echo "✓ Node version correct"
|
|
441
|
+
docker run --rm $IMAGE node --version | grep -q "v22"
|
|
442
|
+
|
|
443
|
+
echo "✓ All smoke tests passed"
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
## Dependency Caching Strategy
|
|
449
|
+
|
|
450
|
+
The Dockerfile includes an image seed cache for npm dependencies:
|
|
451
|
+
|
|
452
|
+
```dockerfile
|
|
453
|
+
# Pre-populate cache for faster builds
|
|
454
|
+
COPY docker/workspace-cache/package.json /opt/kaseki/workspace-cache/
|
|
455
|
+
RUN cd /opt/kaseki/workspace-cache && npm ci
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
This cache is restored during `kaseki-agent.sh` execution if lock hashes match:
|
|
459
|
+
|
|
460
|
+
```bash
|
|
461
|
+
# In kaseki-agent.sh
|
|
462
|
+
if [[ -d /opt/kaseki/workspace-cache ]]; then
|
|
463
|
+
cp -r /opt/kaseki/workspace-cache "$WORKSPACE_CACHE_PATH"
|
|
464
|
+
fi
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
**Update the Seed Cache**:
|
|
468
|
+
When dependencies change frequently, update the seed:
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
# Refresh docker/workspace-cache/package-lock.json
|
|
472
|
+
cd docker/workspace-cache
|
|
473
|
+
npm update # Or point to specific repos
|
|
474
|
+
npm ci
|
|
475
|
+
cd ../..
|
|
476
|
+
|
|
477
|
+
# Rebuild image
|
|
478
|
+
docker build -t kaseki-template:latest .
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
See [Dependency Cache Optimization](dependency-cache-optimization.md) for detailed strategy.
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## Performance Optimization
|
|
486
|
+
|
|
487
|
+
### Layer Caching
|
|
488
|
+
|
|
489
|
+
To speed up builds, order Dockerfile commands by change frequency:
|
|
490
|
+
|
|
491
|
+
```dockerfile
|
|
492
|
+
# Lowest change frequency (stable, cache-friendly)
|
|
493
|
+
FROM node:22.22.2-alpine
|
|
494
|
+
RUN apk add --no-cache git openssh-client # System deps
|
|
495
|
+
RUN npm install -g @anthropic-ai/cli@0.70.2 # Global tools
|
|
496
|
+
|
|
497
|
+
# Medium change frequency
|
|
498
|
+
COPY docker/workspace-cache/ /opt/kaseki/workspace-cache/
|
|
499
|
+
RUN cd /opt/kaseki/workspace-cache && npm ci
|
|
500
|
+
|
|
501
|
+
# Highest change frequency (changes on every push, less cacheable)
|
|
502
|
+
COPY kaseki-agent.sh /app/
|
|
503
|
+
COPY pi-event-filter.js /app/
|
|
504
|
+
COPY kaseki-report.js /app/
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### Build Size Optimization
|
|
508
|
+
|
|
509
|
+
Keep final image small:
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
# Check image size
|
|
513
|
+
docker image inspect kaseki-template:latest | jq '.[] | .Size'
|
|
514
|
+
# Output: 543210000 (≈500 MB is reasonable)
|
|
515
|
+
|
|
516
|
+
# Identify large layers
|
|
517
|
+
docker history kaseki-template:latest
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**Common Optimizations**:
|
|
521
|
+
1. Use alpine base image (≈150 MB vs. debian ≈1 GB)
|
|
522
|
+
2. Remove build tools from final stage (multi-stage build)
|
|
523
|
+
3. Combine RUN commands to reduce layers: `RUN apk add X && npm install Y`
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
## Related Skills & Docs
|
|
528
|
+
|
|
529
|
+
- [Test Automation](test-automation.md) — Integration tests for image validation
|
|
530
|
+
- [Dependency Cache Optimization](dependency-cache-optimization.md) — Image seed cache strategy
|
|
531
|
+
- [Dockerfile](../../Dockerfile) — Current Dockerfile source
|
|
532
|
+
- [CLAUDE.md](../../CLAUDE.md) — Architecture and version reference
|