@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
package/docs/CLI.md
ADDED
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
# Kaseki CLI - Live Agent Monitoring
|
|
2
|
+
|
|
3
|
+
The **Kaseki CLI** is a command-line tool that allows external AI agents to query running and completed kaseki instances in real-time. It provides structured JSON output for easy integration into monitoring scripts and agent workflows.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
- **Query running instances**: Get current stage, elapsed time, timeout risk
|
|
8
|
+
- **Detect errors**: Identify failures in stderr, validation, quality gates, and secret scans
|
|
9
|
+
- **Anomaly detection**: Flag timeout risk as the Pi agent approaches timeout
|
|
10
|
+
- **Log streaming**: Follow logs in real-time as they're written
|
|
11
|
+
- **Progress streaming**: Read sanitized stage and Pi tool progress without model text
|
|
12
|
+
- **Post-run analysis**: Comprehensive summary of changes, validation results, and Pi metrics
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
The CLI is implemented as Node.js scripts and included in the kaseki-agent repository:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Make scripts executable
|
|
20
|
+
chmod +x kaseki-cli.js kaseki-cli-lib.js
|
|
21
|
+
|
|
22
|
+
# Add to PATH (optional)
|
|
23
|
+
export PATH="/workspaces/kaseki-agent:$PATH"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
On Pi hosts that do not have Node.js installed, use the `kaseki` wrapper
|
|
27
|
+
deployed with the template. It runs the CLI inside the configured Kaseki Docker
|
|
28
|
+
image. Prefer this wrapper in Pi runbooks:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
/agents/kaseki-template/kaseki list
|
|
32
|
+
/agents/kaseki-template/kaseki status kaseki-1
|
|
33
|
+
/agents/kaseki-template/kaseki analysis kaseki-1
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Core Library (`kaseki-cli-lib.js`)
|
|
37
|
+
|
|
38
|
+
The library provides direct programmatic access. Use this for custom integration:
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
const kasekiCli = require('./kaseki-cli-lib.js');
|
|
42
|
+
|
|
43
|
+
// List all instances
|
|
44
|
+
const instances = kasekiCli.listInstances();
|
|
45
|
+
|
|
46
|
+
// Get status of a running instance
|
|
47
|
+
const status = kasekiCli.getInstanceStatus('kaseki-1');
|
|
48
|
+
|
|
49
|
+
// Detect errors
|
|
50
|
+
const errors = kasekiCli.detectErrors('kaseki-1');
|
|
51
|
+
|
|
52
|
+
// Get anomalies (timeout risk, etc.)
|
|
53
|
+
const anomalies = kasekiCli.detectAnomalies('kaseki-1');
|
|
54
|
+
|
|
55
|
+
// Post-run analysis
|
|
56
|
+
const analysis = kasekiCli.getAnalysis('kaseki-1');
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## CLI Commands
|
|
60
|
+
|
|
61
|
+
### `list`
|
|
62
|
+
|
|
63
|
+
List all kaseki instances (running and completed).
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
./kaseki-cli.js list
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Output**:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
Instance Status Stage Elapsed (s) Exit Code Model
|
|
73
|
+
kaseki-2 running Running Pi agent 1050 — openrouter/claude-...
|
|
74
|
+
kaseki-1 completed Collecting artifacts 300 0 openrouter/claude-...
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### `status <instance>`
|
|
78
|
+
|
|
79
|
+
Get detailed status of a specific instance (JSON format).
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
./kaseki-cli.js status kaseki-1
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Output**:
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"instance": "kaseki-1",
|
|
90
|
+
"running": false,
|
|
91
|
+
"stage": "Collecting artifacts",
|
|
92
|
+
"elapsedSeconds": 300,
|
|
93
|
+
"totalDurationSeconds": 300,
|
|
94
|
+
"agentElapsedSeconds": 120,
|
|
95
|
+
"timeoutSeconds": 1200,
|
|
96
|
+
"timeoutRiskPercent": 10.0,
|
|
97
|
+
"timeoutImminent": false,
|
|
98
|
+
"timedOut": false,
|
|
99
|
+
"exitCode": 0,
|
|
100
|
+
"failureClass": "none",
|
|
101
|
+
"repo": "CyanAutomation/crudmapper",
|
|
102
|
+
"ref": "main",
|
|
103
|
+
"model": "openrouter/claude-3.5-sonnet"
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`repo` prefers `host-start.json.repo_url` (fallback: `repo`), and `ref` prefers `host-start.json.git_ref` (fallback: `ref`).
|
|
108
|
+
`failureClass` is `none` for successful runs and a stable controller-facing
|
|
109
|
+
category such as `validation`, `timeout`, `empty-diff`, `quality`,
|
|
110
|
+
`secret-scan`, `github`, or `credentials` for failures.
|
|
111
|
+
|
|
112
|
+
For read-only controller tasks, launch with `KASEKI_TASK_MODE=inspect` or
|
|
113
|
+
`KASEKI_ALLOW_EMPTY_DIFF=1` so an empty git diff is treated as success.
|
|
114
|
+
Set `KASEKI_VALIDATION_COMMANDS=none` when validation should be skipped.
|
|
115
|
+
|
|
116
|
+
### `logs <instance> [options]`
|
|
117
|
+
|
|
118
|
+
Display recent log lines (tail).
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Show last 50 lines of stdout
|
|
122
|
+
./kaseki-cli.js logs kaseki-1
|
|
123
|
+
|
|
124
|
+
# Show last 100 lines
|
|
125
|
+
./kaseki-cli.js logs kaseki-1 --tail=100
|
|
126
|
+
|
|
127
|
+
# Show last 20 lines of validation.log
|
|
128
|
+
./kaseki-cli.js logs kaseki-1 --file=validation.log --tail=20
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### `progress <instance> [options]`
|
|
132
|
+
|
|
133
|
+
Display sanitized progress events from `progress.jsonl`.
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
./kaseki-cli.js progress kaseki-1
|
|
137
|
+
./kaseki-cli.js progress kaseki-1 --tail=25
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Progress events include stage starts/finishes, Pi event counts, and tool
|
|
141
|
+
start/end counts. They intentionally do not include assistant text, thinking
|
|
142
|
+
content, environment values, or secrets.
|
|
143
|
+
|
|
144
|
+
### `errors <instance>`
|
|
145
|
+
|
|
146
|
+
Detect and list errors (JSON format).
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
./kaseki-cli.js errors kaseki-1
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Output**:
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"instance": "kaseki-1",
|
|
157
|
+
"errorCount": 2,
|
|
158
|
+
"errors": [
|
|
159
|
+
{
|
|
160
|
+
"severity": "error",
|
|
161
|
+
"source": "stderr",
|
|
162
|
+
"message": "Error: Build failed",
|
|
163
|
+
"line": 42
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"severity": "critical",
|
|
167
|
+
"source": "quality-gate",
|
|
168
|
+
"message": "Diff exceeds maximum size"
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Error sources**:
|
|
175
|
+
|
|
176
|
+
- `stderr` — errors from stderr.log
|
|
177
|
+
- `validation` — validation command failures
|
|
178
|
+
- `quality-gate` — quality gate violations (diff size, allowlist, format)
|
|
179
|
+
- `secret-scan` — credential leaks detected
|
|
180
|
+
- `timeout` — agent timeout (exit code 124)
|
|
181
|
+
|
|
182
|
+
### `analysis <instance>`
|
|
183
|
+
|
|
184
|
+
Get comprehensive post-run analysis (JSON format).
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
./kaseki-cli.js analysis kaseki-1
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Output**:
|
|
191
|
+
|
|
192
|
+
```json
|
|
193
|
+
{
|
|
194
|
+
"instance": "kaseki-1",
|
|
195
|
+
"duration": 300,
|
|
196
|
+
"exitCode": 0,
|
|
197
|
+
"model": "openrouter/claude-3.5-sonnet",
|
|
198
|
+
"repo": "CyanAutomation/crudmapper",
|
|
199
|
+
"ref": "main",
|
|
200
|
+
"changedFiles": [
|
|
201
|
+
"src/lib/parser.ts",
|
|
202
|
+
"tests/parser.test.ts"
|
|
203
|
+
],
|
|
204
|
+
"changedFileCount": 2,
|
|
205
|
+
"diffSizeBytes": 2150,
|
|
206
|
+
"diffSizeKb": 2,
|
|
207
|
+
"validationCommands": [
|
|
208
|
+
{
|
|
209
|
+
"command": "npm run check",
|
|
210
|
+
"exitCode": 0,
|
|
211
|
+
"durationSeconds": 10,
|
|
212
|
+
"passed": true
|
|
213
|
+
}
|
|
214
|
+
],
|
|
215
|
+
"stageTimings": [
|
|
216
|
+
{
|
|
217
|
+
"stage": "prepare node dependencies",
|
|
218
|
+
"exitCode": 0,
|
|
219
|
+
"durationSeconds": 47,
|
|
220
|
+
"detail": "workspace-cache-hit"
|
|
221
|
+
}
|
|
222
|
+
],
|
|
223
|
+
"piMetrics": {
|
|
224
|
+
"toolStartCount": 8,
|
|
225
|
+
"toolEndCount": 8,
|
|
226
|
+
"eventCount": 65
|
|
227
|
+
},
|
|
228
|
+
"errors": [],
|
|
229
|
+
"errorCount": 0,
|
|
230
|
+
"criticalErrors": 0
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
`repo` prefers `host-start.json.repo_url` (fallback: `repo`), and `ref` prefers `host-start.json.git_ref` (fallback: `ref`).
|
|
235
|
+
|
|
236
|
+
### `watch <instance> [options]`
|
|
237
|
+
|
|
238
|
+
Live monitor an instance with periodic status updates and anomaly alerts.
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
# Poll every 5 seconds (default)
|
|
242
|
+
./kaseki-cli.js watch kaseki-1
|
|
243
|
+
|
|
244
|
+
# Poll every 2 seconds
|
|
245
|
+
./kaseki-cli.js watch kaseki-1 --interval=2
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Output** (updates every interval):
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
Watching kaseki-1 (updating every 5s, Ctrl+C to stop)...
|
|
252
|
+
|
|
253
|
+
[2026-04-25T14:23:45.123Z] Stage: Running Pi agent
|
|
254
|
+
Elapsed: 1050s / 1200s
|
|
255
|
+
Timeout: 87.5%
|
|
256
|
+
Status: RUNNING
|
|
257
|
+
⚠ [WARNING] Timeout approaching: 1050s / 1200s (87.5%)
|
|
258
|
+
|
|
259
|
+
[2026-04-25T14:23:50.456Z] Stage: Running validation
|
|
260
|
+
Elapsed: 1055s / 1200s
|
|
261
|
+
Status: RUNNING
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### `follow <instance> [options]`
|
|
265
|
+
|
|
266
|
+
Stream logs in real-time as they're written.
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
# Follow stdout.log
|
|
270
|
+
./kaseki-cli.js follow kaseki-1
|
|
271
|
+
|
|
272
|
+
# Follow validation.log
|
|
273
|
+
./kaseki-cli.js follow kaseki-1 --tail=validation.log
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## External AI Agent Integration
|
|
279
|
+
|
|
280
|
+
### Pattern 1: Polling Status
|
|
281
|
+
|
|
282
|
+
An external agent can poll kaseki status at regular intervals:
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
#!/bin/bash
|
|
286
|
+
# monitor-kaseki.sh - Monitor kaseki instance from external agent
|
|
287
|
+
|
|
288
|
+
INSTANCE=$1
|
|
289
|
+
POLL_INTERVAL=${2:-5} # Default 5 seconds
|
|
290
|
+
MAX_ATTEMPTS=${3:-240} # Default 2 hours (240 * 5s)
|
|
291
|
+
|
|
292
|
+
ATTEMPT=0
|
|
293
|
+
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
|
294
|
+
STATUS=$(./kaseki-cli.js status $INSTANCE)
|
|
295
|
+
|
|
296
|
+
# Parse JSON
|
|
297
|
+
RUNNING=$(echo $STATUS | jq -r '.running')
|
|
298
|
+
STAGE=$(echo $STATUS | jq -r '.stage')
|
|
299
|
+
TIMEOUT_RISK=$(echo $STATUS | jq -r '.timeoutRiskPercent')
|
|
300
|
+
EXIT_CODE=$(echo $STATUS | jq -r '.exitCode')
|
|
301
|
+
FAILURE_CLASS=$(echo $STATUS | jq -r '.failureClass')
|
|
302
|
+
|
|
303
|
+
echo "[$INSTANCE] Stage: $STAGE | Timeout Risk: ${TIMEOUT_RISK}% | Failure: $FAILURE_CLASS"
|
|
304
|
+
|
|
305
|
+
# Detect timeout imminent
|
|
306
|
+
if (( $(echo "$TIMEOUT_RISK >= 85" | bc -l) )); then
|
|
307
|
+
echo "⚠ ALERT: Timeout approaching ($TIMEOUT_RISK%)"
|
|
308
|
+
# Take action: notify, scale resources, etc.
|
|
309
|
+
fi
|
|
310
|
+
|
|
311
|
+
# Check if completed
|
|
312
|
+
if [ "$RUNNING" = "false" ]; then
|
|
313
|
+
echo "✓ Instance completed with exit code: $EXIT_CODE"
|
|
314
|
+
break
|
|
315
|
+
fi
|
|
316
|
+
|
|
317
|
+
sleep $POLL_INTERVAL
|
|
318
|
+
((ATTEMPT++))
|
|
319
|
+
done
|
|
320
|
+
|
|
321
|
+
# Post-run analysis
|
|
322
|
+
ANALYSIS=$(./kaseki-cli.js analysis $INSTANCE)
|
|
323
|
+
ERRORS=$(echo $ANALYSIS | jq -r '.errorCount')
|
|
324
|
+
echo "Final analysis: $ERRORS errors detected"
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Pattern 2: Error Detection and Reaction
|
|
328
|
+
|
|
329
|
+
React to detected errors:
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
#!/bin/bash
|
|
333
|
+
# react-to-errors.sh
|
|
334
|
+
|
|
335
|
+
INSTANCE=$1
|
|
336
|
+
|
|
337
|
+
ERRORS=$(./kaseki-cli.js errors $INSTANCE)
|
|
338
|
+
ERROR_COUNT=$(echo $ERRORS | jq -r '.errorCount')
|
|
339
|
+
|
|
340
|
+
if [ "$ERROR_COUNT" -gt 0 ]; then
|
|
341
|
+
CRITICAL=$(echo $ERRORS | jq '[.errors[] | select(.severity == "critical")] | length')
|
|
342
|
+
|
|
343
|
+
if [ "$CRITICAL" -gt 0 ]; then
|
|
344
|
+
echo "❌ Critical errors detected: $CRITICAL"
|
|
345
|
+
# Escalate, rollback, notify team, etc.
|
|
346
|
+
else
|
|
347
|
+
echo "⚠ Non-critical errors detected: $(($ERROR_COUNT - $CRITICAL))"
|
|
348
|
+
fi
|
|
349
|
+
fi
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Pattern 3: Library Import in Node.js Agent
|
|
353
|
+
|
|
354
|
+
Use the library directly in a Node.js agent:
|
|
355
|
+
|
|
356
|
+
```javascript
|
|
357
|
+
const kasekiCli = require('./kaseki-cli-lib.js');
|
|
358
|
+
|
|
359
|
+
async function monitorKaseki(instanceName) {
|
|
360
|
+
const pollInterval = 5000; // 5 seconds
|
|
361
|
+
|
|
362
|
+
while (true) {
|
|
363
|
+
const status = kasekiCli.getInstanceStatus(instanceName);
|
|
364
|
+
|
|
365
|
+
if (status.error) {
|
|
366
|
+
console.error(`Error: ${status.error}`);
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
console.log(`[${instanceName}] Stage: ${status.stage} | Timeout: ${status.timeoutRiskPercent.toFixed(1)}%`);
|
|
371
|
+
|
|
372
|
+
// Check for timeout risk
|
|
373
|
+
if (status.timeoutImminent) {
|
|
374
|
+
console.warn(`⚠ ALERT: Timeout imminent (${status.elapsedSeconds}s / ${status.timeoutSeconds}s)`);
|
|
375
|
+
// Handle timeout risk
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Check for errors
|
|
379
|
+
const errors = kasekiCli.detectErrors(instanceName);
|
|
380
|
+
if (errors.length > 0) {
|
|
381
|
+
console.warn(`✗ ${errors.length} error(s) detected`);
|
|
382
|
+
errors.forEach((e) => console.warn(` - [${e.severity}] ${e.source}: ${e.message}`));
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Exit when complete
|
|
386
|
+
if (!status.running) {
|
|
387
|
+
const analysis = kasekiCli.getAnalysis(instanceName);
|
|
388
|
+
console.log(`✓ Completed: ${analysis.changedFileCount} files changed, ${analysis.errorCount} errors`);
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
monitorKaseki('kaseki-1');
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## Output Formats
|
|
402
|
+
|
|
403
|
+
### Status Object
|
|
404
|
+
|
|
405
|
+
```json
|
|
406
|
+
{
|
|
407
|
+
"instance": "kaseki-1",
|
|
408
|
+
"running": boolean,
|
|
409
|
+
"stage": "string",
|
|
410
|
+
"elapsedSeconds": number,
|
|
411
|
+
"totalDurationSeconds": number,
|
|
412
|
+
"agentElapsedSeconds": number | null,
|
|
413
|
+
"timeoutSeconds": number,
|
|
414
|
+
"timeoutRiskPercent": number (0-100),
|
|
415
|
+
"timeoutImminent": boolean,
|
|
416
|
+
"timedOut": boolean,
|
|
417
|
+
"exitCode": number | null,
|
|
418
|
+
"repo": "string",
|
|
419
|
+
"ref": "string",
|
|
420
|
+
"model": "string"
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
Field source note: `repo` is read from `host-start.json.repo_url` with fallback to `host-start.json.repo`; `ref` is read from `host-start.json.git_ref` with fallback to `host-start.json.ref`.
|
|
425
|
+
|
|
426
|
+
### Error Object
|
|
427
|
+
|
|
428
|
+
```json
|
|
429
|
+
{
|
|
430
|
+
"severity": "critical" | "error" | "warning",
|
|
431
|
+
"source": "stderr" | "validation" | "quality-gate" | "secret-scan" | "timeout",
|
|
432
|
+
"message": "string",
|
|
433
|
+
"line": number | null
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### Anomaly Object
|
|
438
|
+
|
|
439
|
+
```json
|
|
440
|
+
{
|
|
441
|
+
"type": "timeout-risk" | "timeout",
|
|
442
|
+
"severity": "warning" | "critical",
|
|
443
|
+
"message": "string"
|
|
444
|
+
}
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
Timeout anomalies use Pi agent elapsed time rather than total run time. When a
|
|
448
|
+
completed run timed out after slow setup or artifact collection, the message also
|
|
449
|
+
includes total run duration separately.
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## Configuration
|
|
454
|
+
|
|
455
|
+
### Directory Structure
|
|
456
|
+
|
|
457
|
+
The CLI looks for instances in:
|
|
458
|
+
|
|
459
|
+
- Results: `/agents/kaseki-results/kaseki-N/`
|
|
460
|
+
- Workspace: `/agents/kaseki-runs/kaseki-N/` (optional, for running instances)
|
|
461
|
+
|
|
462
|
+
### Testing Mode
|
|
463
|
+
|
|
464
|
+
To test with custom directories:
|
|
465
|
+
|
|
466
|
+
```javascript
|
|
467
|
+
const kasekiCli = require('./kaseki-cli-lib.js');
|
|
468
|
+
|
|
469
|
+
// Override config for testing
|
|
470
|
+
kasekiCli.config.KASEKI_RESULTS_DIR = '/custom/path/kaseki-results';
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
## Examples
|
|
476
|
+
|
|
477
|
+
### Example 1: Monitor and Alert
|
|
478
|
+
|
|
479
|
+
```bash
|
|
480
|
+
#!/bin/bash
|
|
481
|
+
while true; do
|
|
482
|
+
STATUS=$(./kaseki-cli.js status kaseki-1 | jq -r '.timeoutRiskPercent')
|
|
483
|
+
if (( $(echo "$STATUS > 85" | bc -l) )); then
|
|
484
|
+
echo "🚨 Timeout risk: $STATUS%" | mail -s "Kaseki Alert" ops@team.com
|
|
485
|
+
fi
|
|
486
|
+
sleep 10
|
|
487
|
+
done
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Example 2: Parse Changes from Completed Run
|
|
491
|
+
|
|
492
|
+
```bash
|
|
493
|
+
ANALYSIS=$(./kaseki-cli.js analysis kaseki-1)
|
|
494
|
+
echo "Changed files:"
|
|
495
|
+
echo $ANALYSIS | jq -r '.changedFiles[]'
|
|
496
|
+
echo "Diff size: $(echo $ANALYSIS | jq '.diffSizeKb') KB"
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### Example 3: Combine Status + Errors
|
|
500
|
+
|
|
501
|
+
```bash
|
|
502
|
+
./kaseki-cli.js status kaseki-1 > /tmp/status.json
|
|
503
|
+
./kaseki-cli.js errors kaseki-1 > /tmp/errors.json
|
|
504
|
+
./kaseki-cli.js analysis kaseki-1 > /tmp/analysis.json
|
|
505
|
+
|
|
506
|
+
# Process combined data
|
|
507
|
+
jq -s '. as $data | {status: $data[0], errors: $data[1], analysis: $data[2]}' \
|
|
508
|
+
/tmp/status.json /tmp/errors.json /tmp/analysis.json
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
## Troubleshooting
|
|
514
|
+
|
|
515
|
+
### "Instance not found"
|
|
516
|
+
|
|
517
|
+
- Verify instance name matches format `kaseki-N` where N is digits
|
|
518
|
+
- Check that `/agents/kaseki-results/kaseki-N/` directory exists
|
|
519
|
+
|
|
520
|
+
### Empty results for running instances
|
|
521
|
+
|
|
522
|
+
- Stage extraction requires `==>` markers in stdout.log
|
|
523
|
+
- Elapsed time estimation requires `metadata.json` with `start_time`
|
|
524
|
+
|
|
525
|
+
### Docker ps errors
|
|
526
|
+
|
|
527
|
+
- Docker may not be available (safe to ignore in test environments)
|
|
528
|
+
- Running check falls back to checking workspace directory existence
|
|
529
|
+
|
|
530
|
+
---
|
|
531
|
+
|
|
532
|
+
## Architecture
|
|
533
|
+
|
|
534
|
+
The CLI is split into two parts:
|
|
535
|
+
|
|
536
|
+
1. **`kaseki-cli-lib.js`** — Core query library
|
|
537
|
+
- 600+ lines of reusable functions
|
|
538
|
+
- No side effects, all I/O is read-only
|
|
539
|
+
- Suitable for programmatic use and testing
|
|
540
|
+
|
|
541
|
+
2. **`kaseki-cli.js`** — CLI executable
|
|
542
|
+
- Command-line interface using library
|
|
543
|
+
- Formats output (JSON, tables, streaming)
|
|
544
|
+
- Handles user options and arguments
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## Performance Notes
|
|
549
|
+
|
|
550
|
+
- **listInstances()**: Scans `/agents/kaseki-results/` directory; O(n) where n = number of instances
|
|
551
|
+
- **readLiveLog()**: Tail only; avoids re-reading entire logs
|
|
552
|
+
- **getInstanceStatus()**: Lightweight; reads small JSON files and parses stage from logs
|
|
553
|
+
- **detectErrors()**: Scans stderr and error files; proportional to log size
|
|
554
|
+
- **getAnalysis()**: Collects data from multiple artifacts; good for post-run analysis
|
|
555
|
+
|
|
556
|
+
Suitable for:
|
|
557
|
+
|
|
558
|
+
- Polling every 5-10 seconds during runs
|
|
559
|
+
- Real-time log streaming
|
|
560
|
+
- Post-run batch analysis
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
## Future Enhancements
|
|
565
|
+
|
|
566
|
+
- **Baseline timing data**: Store per-stage historical medians for anomaly detection
|
|
567
|
+
- **Webhook integration**: Callback external services on status changes
|
|
568
|
+
- **Metrics export**: Prometheus-compatible metrics for monitoring stacks
|
|
569
|
+
- **Sub-task progress**: Real-time visibility into Pi agent tool invocations (requires enhanced logging)
|