@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,459 @@
|
|
|
1
|
+
# Kaseki API Service - Development Guide
|
|
2
|
+
|
|
3
|
+
## Architecture Overview
|
|
4
|
+
|
|
5
|
+
The Kaseki API Service provides HTTP REST endpoints for remote control of kaseki-agent runs. It wraps existing kaseki-agent infrastructure and adds HTTP layer, job queue management, and result caching.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌──────────────────────────┐
|
|
9
|
+
│ External Client (e.g. OpenClaw) │
|
|
10
|
+
└────────────────┬─────────────────────┘
|
|
11
|
+
│ HTTP REST + Bearer Auth
|
|
12
|
+
┌───────────▼──────────────────┐
|
|
13
|
+
│ Express HTTP Server │
|
|
14
|
+
│ (kaseki-api-service.ts) │
|
|
15
|
+
└────────────┬─────────────────┘
|
|
16
|
+
│
|
|
17
|
+
┌─────────┴──────────┐
|
|
18
|
+
│ │
|
|
19
|
+
┌───▼────────┐ ┌──────▼──────────┐
|
|
20
|
+
│ Job Queue │ │ Result Cache │
|
|
21
|
+
│ Scheduler │ │ (resultcache.ts)│
|
|
22
|
+
│ (job- │ └─────────────────┘
|
|
23
|
+
│ scheduler) │
|
|
24
|
+
└───┬────────┘
|
|
25
|
+
│
|
|
26
|
+
┌───▼──────────────────────────┐
|
|
27
|
+
│ kaseki-activate.sh │
|
|
28
|
+
│ (spawn child process) │
|
|
29
|
+
└───┬──────────────────────────┘
|
|
30
|
+
│
|
|
31
|
+
┌───▼──────────────────────────┐
|
|
32
|
+
│ Docker Container │
|
|
33
|
+
│ (kaseki-agent.sh runs) │
|
|
34
|
+
└──────────────────────────────┘
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Key Components
|
|
38
|
+
|
|
39
|
+
### 1. Types & Validation (`src/kaseki-api-types.ts`, ~150 lines)
|
|
40
|
+
|
|
41
|
+
Defines TypeScript interfaces and Zod validation schemas:
|
|
42
|
+
|
|
43
|
+
- `RunRequest` — Request to trigger a job
|
|
44
|
+
- `StatusResponse` — Job status with progress
|
|
45
|
+
- `AnalysisResponse` — Comprehensive result summary
|
|
46
|
+
- `Job` — Internal job state representation
|
|
47
|
+
|
|
48
|
+
Uses Zod for runtime validation of incoming requests.
|
|
49
|
+
|
|
50
|
+
### 2. Configuration (`src/kaseki-api-config.ts`, ~128 lines)
|
|
51
|
+
|
|
52
|
+
Loads and validates environment variables:
|
|
53
|
+
|
|
54
|
+
- API keys (from env or file)
|
|
55
|
+
- Port, concurrency limits, timeouts
|
|
56
|
+
- Directory paths
|
|
57
|
+
- Log level
|
|
58
|
+
|
|
59
|
+
Provides `loadConfig()` and `validateApiKey()` functions.
|
|
60
|
+
|
|
61
|
+
### 3. Job Scheduler (`src/job-scheduler.ts`, ~195 lines)
|
|
62
|
+
|
|
63
|
+
Manages in-memory FIFO queue with concurrency control:
|
|
64
|
+
|
|
65
|
+
- `submitJob()` — Add to queue
|
|
66
|
+
- `getJob()` / `listJobs()` — Query state
|
|
67
|
+
- Spawns `kaseki-activate.sh` when job runs
|
|
68
|
+
- Handles timeouts, failure parsing
|
|
69
|
+
- Graceful shutdown via `shutdown()`
|
|
70
|
+
|
|
71
|
+
Key features:
|
|
72
|
+
|
|
73
|
+
- Auto-generates unique instance IDs (kaseki-1, kaseki-2, ...)
|
|
74
|
+
- Respects max concurrent limit
|
|
75
|
+
- Traps exit codes and categorizes failures
|
|
76
|
+
|
|
77
|
+
### 4. Result Cache (`src/result-cache.ts`, ~65 lines)
|
|
78
|
+
|
|
79
|
+
Lazy-loads and caches artifacts to reduce filesystem reads:
|
|
80
|
+
|
|
81
|
+
- `getOrLoad(filePath)` — Load file or return cached
|
|
82
|
+
- TTL-based expiration (default: 5 min)
|
|
83
|
+
- Memory limit and LRU eviction
|
|
84
|
+
- Per-job cleanup
|
|
85
|
+
|
|
86
|
+
Configured: max 20 entries, 10 MB per file.
|
|
87
|
+
|
|
88
|
+
### 5. API Routes (`src/kaseki-api-routes.ts`, ~370 lines)
|
|
89
|
+
|
|
90
|
+
Express route handlers grouped by feature:
|
|
91
|
+
|
|
92
|
+
**Core Endpoints:**
|
|
93
|
+
|
|
94
|
+
- `POST /api/runs` — Submit job (202 Accepted)
|
|
95
|
+
- `GET /api/runs` — List all recent runs
|
|
96
|
+
- `GET /api/runs/:id/status` — Poll status + progress
|
|
97
|
+
- `GET /api/runs/:id/analysis` — Comprehensive summary
|
|
98
|
+
|
|
99
|
+
**Artifact Access:**
|
|
100
|
+
|
|
101
|
+
- `GET /api/results/:id/:file` — Download diffs, metadata
|
|
102
|
+
- `GET /api/runs/:id/logs/:logtype` — Access logs
|
|
103
|
+
|
|
104
|
+
**Health:**
|
|
105
|
+
|
|
106
|
+
- `GET /health` — No-auth health check
|
|
107
|
+
|
|
108
|
+
**Middleware:**
|
|
109
|
+
|
|
110
|
+
- Bearer token validation (skip for `/health`)
|
|
111
|
+
- RFC 7807 error responses
|
|
112
|
+
- Request validation via Zod
|
|
113
|
+
|
|
114
|
+
### 6. Express Service (`src/kaseki-api-service.ts`, ~67 lines)
|
|
115
|
+
|
|
116
|
+
Main entry point:
|
|
117
|
+
|
|
118
|
+
- Loads config and validates
|
|
119
|
+
- Creates Express app with JSON middleware
|
|
120
|
+
- Initializes job scheduler and routes
|
|
121
|
+
- Graceful shutdown on SIGTERM/SIGINT
|
|
122
|
+
- Unhandled error trapping
|
|
123
|
+
|
|
124
|
+
### 7. TypeScript Client (`src/kaseki-api-client.ts`, ~200 lines)
|
|
125
|
+
|
|
126
|
+
High-level client library for integration:
|
|
127
|
+
|
|
128
|
+
- `submit(request)` — Trigger job
|
|
129
|
+
- `getStatus(runId)` — Poll status
|
|
130
|
+
- `getAnalysis(runId)` — Full summary
|
|
131
|
+
- `getLog(runId, type)` — Retrieve logs
|
|
132
|
+
- `getArtifact(runId, file)` — Download artifacts
|
|
133
|
+
- `waitForCompletion(runId)` — Poll until done
|
|
134
|
+
- `createKasekiClient()` — Factory helper
|
|
135
|
+
|
|
136
|
+
## Development Workflow
|
|
137
|
+
|
|
138
|
+
### Build
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
npm install
|
|
142
|
+
npm run build # TypeScript → dist/
|
|
143
|
+
npm run type-check # TypeScript validation
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Test
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npm run test:unit -- src/result-cache.test.ts # Run a single Jest test file
|
|
150
|
+
npm run test:unit -- -t "caches successful result" # Run tests matching a name pattern
|
|
151
|
+
npm run test:ci # Full CI-style validation (build + type-check + jest + bash tests)
|
|
152
|
+
npm run test:watch # Jest watch mode
|
|
153
|
+
npm run test:coverage # Coverage report
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Lint
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
npm run lint # Run all linters
|
|
160
|
+
npm run lint:js # ESLint only
|
|
161
|
+
npm run lint:fix # Auto-fix issues
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Local Development
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Terminal 1: Start API
|
|
168
|
+
KASEKI_API_KEYS=sk-dev npm run kaseki-api
|
|
169
|
+
|
|
170
|
+
# Terminal 2: Test endpoints
|
|
171
|
+
curl -H "Authorization: Bearer sk-dev" http://localhost:8080/api/health
|
|
172
|
+
|
|
173
|
+
# Terminal 3: Submit a run (requires actual kaseki-agent setup)
|
|
174
|
+
curl -X POST http://localhost:8080/api/runs \
|
|
175
|
+
-H "Authorization: Bearer sk-dev" \
|
|
176
|
+
-H "Content-Type: application/json" \
|
|
177
|
+
-d '{"repoUrl":"https://github.com/you/repo"}'
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Testing Strategy
|
|
181
|
+
|
|
182
|
+
### Unit Tests (`src/*.test.ts`)
|
|
183
|
+
|
|
184
|
+
- **Kaseki API Configuration:** Config loading, validation, API key parsing
|
|
185
|
+
- **Request Validation:** Zod schema validation, error cases
|
|
186
|
+
- **Job Scheduler:** Queue operations, job submission, timeout handling
|
|
187
|
+
- **Result Cache:** Caching, TTL, eviction, cleanup
|
|
188
|
+
|
|
189
|
+
### Integration Tests (`test/kaseki-api.integration.test.sh`)
|
|
190
|
+
|
|
191
|
+
Currently placeholder (requires Docker + kaseki-agent setup).
|
|
192
|
+
|
|
193
|
+
Example test flow:
|
|
194
|
+
|
|
195
|
+
1. Start API service
|
|
196
|
+
2. Verify health check
|
|
197
|
+
3. Submit a real run
|
|
198
|
+
4. Poll until completion
|
|
199
|
+
5. Verify artifacts exist
|
|
200
|
+
|
|
201
|
+
### End-to-End Tests
|
|
202
|
+
|
|
203
|
+
Manual testing via TypeScript client:
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
const client = new KasekiApiClient('http://localhost:8080', 'sk-dev');
|
|
207
|
+
const run = await client.submit({ repoUrl: '...' });
|
|
208
|
+
const final = await client.waitForCompletion(run.id);
|
|
209
|
+
console.log(final.status === 'completed' ? 'SUCCESS' : 'FAILED');
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Security Considerations
|
|
213
|
+
|
|
214
|
+
1. **API Key Management**
|
|
215
|
+
- Keys stored in env (dev) or secure file (prod)
|
|
216
|
+
- Never logged or included in responses
|
|
217
|
+
- Bearer token validation on all protected endpoints
|
|
218
|
+
- Validateable against list of approved keys
|
|
219
|
+
|
|
220
|
+
2. **Input Validation**
|
|
221
|
+
- All external inputs validated via Zod schemas
|
|
222
|
+
- URL format validation
|
|
223
|
+
- File path sanitization
|
|
224
|
+
- Enum validation for task modes
|
|
225
|
+
|
|
226
|
+
3. **Output Sanitization**
|
|
227
|
+
- RFC 7807 error format (no internal details)
|
|
228
|
+
- Log files truncated if >100 KB
|
|
229
|
+
- Artifact size limits enforced
|
|
230
|
+
|
|
231
|
+
4. **Concurrency Safety**
|
|
232
|
+
- In-memory queue (single process)
|
|
233
|
+
- No race conditions on job state
|
|
234
|
+
- Atomic timeout handling
|
|
235
|
+
|
|
236
|
+
## Performance Tuning
|
|
237
|
+
|
|
238
|
+
### Job Queue
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
// In src/kaseki-api-config.ts
|
|
242
|
+
KASEKI_API_MAX_CONCURRENT_RUNS = 3; // Increase for more parallelism
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Monitor via:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
curl -H "Authorization: Bearer ..." http://localhost:8080/api/runs
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Result Cache
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
// In src/kaseki-api-routes.ts
|
|
255
|
+
const cache = new ResultCache(20, 5 * 60 * 1000); // 20 entries, 5 min TTL
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Check stats:
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
const stats = cache.getStats();
|
|
262
|
+
console.log(`${stats.entries} cached, ${stats.bytes} bytes`);
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Database (Future)
|
|
266
|
+
|
|
267
|
+
Current in-memory design sufficient for <100 recent runs. For persistence across restarts, add:
|
|
268
|
+
|
|
269
|
+
- SQLite or JSON file-based run log
|
|
270
|
+
- Cleanup job for old artifacts
|
|
271
|
+
- Run history API endpoint
|
|
272
|
+
|
|
273
|
+
## Common Development Tasks
|
|
274
|
+
|
|
275
|
+
### Add a New Endpoint
|
|
276
|
+
|
|
277
|
+
1. Define request/response types in `src/kaseki-api-types.ts`
|
|
278
|
+
2. Add validation schema (if request body expected)
|
|
279
|
+
3. Implement handler in `src/kaseki-api-routes.ts`
|
|
280
|
+
4. Add tests to `src/kaseki-api-service.test.ts`
|
|
281
|
+
5. Document in `docs/API.md`
|
|
282
|
+
|
|
283
|
+
Example:
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
// 1. Types
|
|
287
|
+
export interface MyResponse {
|
|
288
|
+
data: string;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// 2. Route
|
|
292
|
+
router.get('/my-endpoint', (req, res) => {
|
|
293
|
+
const response: MyResponse = { data: '...' };
|
|
294
|
+
res.json(response);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// 3. Test
|
|
298
|
+
test('my-endpoint returns data', () => {
|
|
299
|
+
// ...
|
|
300
|
+
});
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Add Configuration Option
|
|
304
|
+
|
|
305
|
+
1. Update `KasekiApiConfig` interface in `src/kaseki-api-config.ts`
|
|
306
|
+
2. Add env var parsing in `loadConfig()`
|
|
307
|
+
3. Add validation and defaults
|
|
308
|
+
4. Update `docs/DEPLOYMENT.md`
|
|
309
|
+
5. Add test case
|
|
310
|
+
|
|
311
|
+
### Improve Error Handling
|
|
312
|
+
|
|
313
|
+
Current pattern using `sendErrorResponse(res, status, title, detail)` follows RFC 7807.
|
|
314
|
+
|
|
315
|
+
To add new error type:
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
// In route handler
|
|
319
|
+
if (someCondition) {
|
|
320
|
+
return sendErrorResponse(res, 422, 'Unprocessable Entity',
|
|
321
|
+
'Helpful error message here');
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## Debugging
|
|
326
|
+
|
|
327
|
+
### Enable Debug Logging
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
KASEKI_API_LOG_LEVEL=debug npm run kaseki-api
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Inspect Job State
|
|
334
|
+
|
|
335
|
+
Connect to running service and query:
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
curl -H "Authorization: Bearer sk-key" http://localhost:8080/api/runs | jq .
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Test Job Spawning
|
|
342
|
+
|
|
343
|
+
Add test repo and try to trigger a run:
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
# (Requires actual kaseki-agent, docker, OpenRouter API key setup)
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Memory Leaks
|
|
350
|
+
|
|
351
|
+
Monitor long-running service:
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
# In another terminal
|
|
355
|
+
watch -n1 'ps aux | grep node'
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
Check cache stats periodically:
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
// In application
|
|
362
|
+
setInterval(() => {
|
|
363
|
+
const stats = cache.getStats();
|
|
364
|
+
console.log('Cache:', stats);
|
|
365
|
+
}, 60000);
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## Roadmap
|
|
369
|
+
|
|
370
|
+
### Current (v1)
|
|
371
|
+
|
|
372
|
+
- [x] HTTP REST API with Bearer auth
|
|
373
|
+
- [x] Job queue with concurrency control
|
|
374
|
+
- [x] Result caching
|
|
375
|
+
- [x] TypeScript client library
|
|
376
|
+
- [x] Comprehensive tests
|
|
377
|
+
- [x] Docker & systemd deployment
|
|
378
|
+
|
|
379
|
+
### Future (v2+)
|
|
380
|
+
|
|
381
|
+
- [ ] WebSocket for real-time progress updates
|
|
382
|
+
- [ ] Persistent run history (SQLite)
|
|
383
|
+
- [ ] Prometheus metrics endpoint
|
|
384
|
+
- [ ] Rate limiting per API key
|
|
385
|
+
- [ ] Multi-host load balancing
|
|
386
|
+
- [ ] Run cancellation API
|
|
387
|
+
- [ ] Webhook callbacks on completion
|
|
388
|
+
- [ ] OpenAPI 3.0 spec auto-generation
|
|
389
|
+
|
|
390
|
+
## Releases and Versioning
|
|
391
|
+
|
|
392
|
+
Kaseki Agent uses **semantic-release** to automate versioning, changelog generation, and GitHub Release creation. Releases are triggered manually by running `npm run release`.
|
|
393
|
+
|
|
394
|
+
### Version Strategy
|
|
395
|
+
|
|
396
|
+
This project follows [Semantic Versioning](https://semver.org/):
|
|
397
|
+
|
|
398
|
+
- **Major** (X.0.0): Breaking API changes, incompatible behavior
|
|
399
|
+
- **Minor** (0.Y.0): New features, backward compatible
|
|
400
|
+
- **Patch** (0.0.Z): Bug fixes, backward compatible
|
|
401
|
+
|
|
402
|
+
### Automated Version Bumping
|
|
403
|
+
|
|
404
|
+
Version bumps are determined from commit messages using the [conventional commits](../CONTRIBUTING.md#6-release-process-and-conventional-commits) standard:
|
|
405
|
+
|
|
406
|
+
- `feat:` → **Minor** version bump
|
|
407
|
+
- `fix:`, `perf:`, `revert:` → **Patch** version bump
|
|
408
|
+
- `chore:`, `docs:`, `style:`, `refactor:`, `test:` → **No version bump** (included in changelog only)
|
|
409
|
+
|
|
410
|
+
### Making a Release
|
|
411
|
+
|
|
412
|
+
**Via GitHub Actions (Recommended):**
|
|
413
|
+
|
|
414
|
+
1. Go to [Actions](https://github.com/CyanAutomation/kaseki-agent/actions) → **Release** workflow
|
|
415
|
+
2. Click **Run workflow** (top right)
|
|
416
|
+
3. Choose options:
|
|
417
|
+
- **Dry-run** (optional): Set to `true` to preview release without creating tags
|
|
418
|
+
- Leave blank to create actual release
|
|
419
|
+
4. Click **Run workflow**
|
|
420
|
+
5. The workflow will:
|
|
421
|
+
- Analyze commits since last release tag
|
|
422
|
+
- Automatically determine version (major/minor/patch)
|
|
423
|
+
- Update `package.json` with new version
|
|
424
|
+
- Update `CHANGELOG.md` with formatted release notes
|
|
425
|
+
- Create git tag (e.g., `v1.0.0`)
|
|
426
|
+
- Push tag and commits to GitHub
|
|
427
|
+
- Create GitHub Release with release notes
|
|
428
|
+
- Automatically trigger Docker build workflow for multi-arch image builds
|
|
429
|
+
6. Monitor progress in Actions tab
|
|
430
|
+
7. Verify in [Releases](https://github.com/CyanAutomation/kaseki-agent/releases)
|
|
431
|
+
|
|
432
|
+
**Via Local Command (Alternative):**
|
|
433
|
+
|
|
434
|
+
```bash
|
|
435
|
+
npm run release:dry # Preview release locally
|
|
436
|
+
npm run release # Create release (requires GITHUB_TOKEN)
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
**Note:** The workflow approach is recommended for team visibility and consistency. Local commands are useful for testing or emergency releases when GitHub Actions is unavailable.
|
|
440
|
+
|
|
441
|
+
### Changelog Format
|
|
442
|
+
|
|
443
|
+
The `CHANGELOG.md` is automatically updated with entries grouped by type:
|
|
444
|
+
|
|
445
|
+
- **Features** — From `feat:` commits
|
|
446
|
+
- **Bug Fixes** — From `fix:` commits
|
|
447
|
+
- **Performance Improvements** — From `perf:` commits
|
|
448
|
+
- **Documentation** — From `docs:` commits (hidden by default)
|
|
449
|
+
|
|
450
|
+
Each entry includes the commit hash and links to the commit in GitHub.
|
|
451
|
+
|
|
452
|
+
For manual additions or corrections, edit `CHANGELOG.md` directly before committing to main.
|
|
453
|
+
|
|
454
|
+
## Useful Resources
|
|
455
|
+
|
|
456
|
+
- Express.js docs: <https://expressjs.com/>
|
|
457
|
+
- Zod validation: <https://zod.dev/>
|
|
458
|
+
- TypeScript handbook: <https://www.typescriptlang.org/docs/>
|
|
459
|
+
- RFC 7807 (Problem Details): <https://tools.ietf.org/html/rfc7807>
|