@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,265 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# kaseki-setup.sh — Interactive setup for kaseki-agent on a local host
|
|
4
|
+
#
|
|
5
|
+
# This script:
|
|
6
|
+
# 1. Validates Docker installation (or guides to install)
|
|
7
|
+
# 2. Prompts for OpenRouter API key securely
|
|
8
|
+
# 3. Stores the key in ~/.kaseki/secrets/openrouter_api_key
|
|
9
|
+
# 4. Runs final health checks
|
|
10
|
+
#
|
|
11
|
+
# Usage: ./scripts/kaseki-setup.sh
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
16
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
17
|
+
SECRETS_DIR="$HOME/.kaseki/secrets"
|
|
18
|
+
API_KEY_FILE="$SECRETS_DIR/openrouter_api_key"
|
|
19
|
+
|
|
20
|
+
# Colors for output
|
|
21
|
+
RED='\033[0;31m'
|
|
22
|
+
GREEN='\033[0;32m'
|
|
23
|
+
YELLOW='\033[1;33m'
|
|
24
|
+
BLUE='\033[0;34m'
|
|
25
|
+
NC='\033[0m' # No Color
|
|
26
|
+
|
|
27
|
+
# Helper functions
|
|
28
|
+
print_header() {
|
|
29
|
+
echo -e "${BLUE}=== $1 ===${NC}"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
print_success() {
|
|
33
|
+
echo -e "${GREEN}✓ $1${NC}"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
print_error() {
|
|
37
|
+
echo -e "${RED}✗ $1${NC}" >&2
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
print_warning() {
|
|
41
|
+
echo -e "${YELLOW}⚠ $1${NC}"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# Check Docker installation
|
|
45
|
+
check_docker() {
|
|
46
|
+
print_header "Checking Docker Installation"
|
|
47
|
+
|
|
48
|
+
if command -v docker >/dev/null 2>&1; then
|
|
49
|
+
print_success "Docker is installed"
|
|
50
|
+
|
|
51
|
+
# Check if daemon is running
|
|
52
|
+
if docker ps >/dev/null 2>&1; then
|
|
53
|
+
print_success "Docker daemon is running"
|
|
54
|
+
return 0
|
|
55
|
+
else
|
|
56
|
+
print_error "Docker daemon is not running"
|
|
57
|
+
print_warning "Start Docker and try again"
|
|
58
|
+
print_warning " Linux: sudo systemctl start docker"
|
|
59
|
+
print_warning " macOS: open -a Docker"
|
|
60
|
+
return 1
|
|
61
|
+
fi
|
|
62
|
+
else
|
|
63
|
+
print_error "Docker is not installed"
|
|
64
|
+
|
|
65
|
+
# Suggest installation
|
|
66
|
+
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
67
|
+
print_warning "Install Docker with one of these commands:"
|
|
68
|
+
print_warning ""
|
|
69
|
+
print_warning "Debian/Ubuntu:"
|
|
70
|
+
print_warning " sudo apt update && sudo apt install -y docker.io"
|
|
71
|
+
print_warning ""
|
|
72
|
+
print_warning "Fedora/RHEL/CentOS:"
|
|
73
|
+
print_warning " sudo dnf install -y docker"
|
|
74
|
+
print_warning ""
|
|
75
|
+
print_warning "Arch:"
|
|
76
|
+
print_warning " sudo pacman -S --needed docker"
|
|
77
|
+
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
|
78
|
+
print_warning "Install Docker Desktop for macOS:"
|
|
79
|
+
print_warning " https://docs.docker.com/desktop/install/mac-install/"
|
|
80
|
+
print_warning "Or via Homebrew:"
|
|
81
|
+
print_warning " brew install --cask docker"
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
return 1
|
|
85
|
+
fi
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
# Set up OpenRouter API key
|
|
89
|
+
setup_api_key() {
|
|
90
|
+
print_header "OpenRouter API Key Setup"
|
|
91
|
+
|
|
92
|
+
# Create secrets directory
|
|
93
|
+
mkdir -p "$SECRETS_DIR"
|
|
94
|
+
chmod 700 "$SECRETS_DIR"
|
|
95
|
+
|
|
96
|
+
# Check if key already exists
|
|
97
|
+
if [ -f "$API_KEY_FILE" ] && [ -s "$API_KEY_FILE" ]; then
|
|
98
|
+
print_warning "API key file already exists at $API_KEY_FILE"
|
|
99
|
+
read -p "Do you want to replace it? (y/n) " -n 1 -r
|
|
100
|
+
echo
|
|
101
|
+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
102
|
+
print_success "Using existing API key"
|
|
103
|
+
return 0
|
|
104
|
+
fi
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# Prompt for API key securely
|
|
108
|
+
echo "You can obtain an API key from: https://openrouter.ai/keys"
|
|
109
|
+
echo ""
|
|
110
|
+
read -rsp "Enter your OpenRouter API key (sk-or-v1-...): " API_KEY
|
|
111
|
+
echo
|
|
112
|
+
|
|
113
|
+
# Validate key format
|
|
114
|
+
if [[ ! "$API_KEY" =~ ^sk-or ]]; then
|
|
115
|
+
print_error "Invalid API key format. Must start with 'sk-or'"
|
|
116
|
+
return 1
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
# Store key securely
|
|
120
|
+
echo "$API_KEY" > "$API_KEY_FILE"
|
|
121
|
+
chmod 600 "$API_KEY_FILE"
|
|
122
|
+
print_success "API key stored in $API_KEY_FILE (mode 600)"
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
# Run preflight checks
|
|
126
|
+
run_preflight_checks() {
|
|
127
|
+
print_header "Running Preflight Checks"
|
|
128
|
+
|
|
129
|
+
# Use enhanced preflight script if available
|
|
130
|
+
if [ -x "$SCRIPT_DIR/kaseki-preflight.sh" ]; then
|
|
131
|
+
if "$SCRIPT_DIR/kaseki-preflight.sh" run; then
|
|
132
|
+
print_success "All preflight checks passed"
|
|
133
|
+
return 0
|
|
134
|
+
else
|
|
135
|
+
print_error "Some preflight checks failed"
|
|
136
|
+
return 1
|
|
137
|
+
fi
|
|
138
|
+
else
|
|
139
|
+
print_warning "kaseki-preflight.sh not found, skipping enhanced checks"
|
|
140
|
+
return 0
|
|
141
|
+
fi
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
# Run health check
|
|
145
|
+
run_health_check() {
|
|
146
|
+
print_header "Running Health Check"
|
|
147
|
+
|
|
148
|
+
cd "$PROJECT_ROOT"
|
|
149
|
+
|
|
150
|
+
if ./run-kaseki.sh --doctor 2>&1 | tail -20; then
|
|
151
|
+
print_success "Health check passed"
|
|
152
|
+
return 0
|
|
153
|
+
else
|
|
154
|
+
print_error "Health check failed"
|
|
155
|
+
return 1
|
|
156
|
+
fi
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# Optional: Add to shell profile
|
|
160
|
+
offer_shell_profile_update() {
|
|
161
|
+
print_header "Shell Profile Configuration (Optional)"
|
|
162
|
+
|
|
163
|
+
echo "Would you like to add the API key path to your shell profile?"
|
|
164
|
+
echo "This makes running kaseki-agent easier (no need to set OPENROUTER_API_KEY_FILE)."
|
|
165
|
+
echo ""
|
|
166
|
+
|
|
167
|
+
read -p "Add to shell profile? (y/n) " -n 1 -r
|
|
168
|
+
echo
|
|
169
|
+
|
|
170
|
+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
171
|
+
return 0
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
# Detect shell
|
|
175
|
+
if [ -f "$HOME/.bashrc" ]; then
|
|
176
|
+
PROFILE_FILE="$HOME/.bashrc"
|
|
177
|
+
elif [ -f "$HOME/.zshrc" ]; then
|
|
178
|
+
PROFILE_FILE="$HOME/.zshrc"
|
|
179
|
+
else
|
|
180
|
+
print_warning "Could not detect shell profile. Skipping."
|
|
181
|
+
return 0
|
|
182
|
+
fi
|
|
183
|
+
|
|
184
|
+
EXPORT_LINE="export OPENROUTER_API_KEY_FILE=$API_KEY_FILE"
|
|
185
|
+
|
|
186
|
+
# Check if already in profile
|
|
187
|
+
if grep -q "OPENROUTER_API_KEY_FILE" "$PROFILE_FILE"; then
|
|
188
|
+
print_warning "OPENROUTER_API_KEY_FILE already in $PROFILE_FILE"
|
|
189
|
+
return 0
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
# Add to profile
|
|
193
|
+
{
|
|
194
|
+
echo ""
|
|
195
|
+
echo "# Kaseki Agent API key (added by kaseki-setup.sh)"
|
|
196
|
+
echo "$EXPORT_LINE"
|
|
197
|
+
} >> "$PROFILE_FILE"
|
|
198
|
+
|
|
199
|
+
print_success "Added to $PROFILE_FILE"
|
|
200
|
+
echo ""
|
|
201
|
+
echo "Reload your shell with:"
|
|
202
|
+
echo " source $PROFILE_FILE"
|
|
203
|
+
echo "or restart your terminal"
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
# Main workflow
|
|
207
|
+
main() {
|
|
208
|
+
echo ""
|
|
209
|
+
echo "╔════════════════════════════════════════════════════════════╗"
|
|
210
|
+
echo "║ Kaseki Agent - Interactive Setup Wizard ║"
|
|
211
|
+
echo "╚════════════════════════════════════════════════════════════╝"
|
|
212
|
+
echo ""
|
|
213
|
+
|
|
214
|
+
# Step 1: Check Docker
|
|
215
|
+
if ! check_docker; then
|
|
216
|
+
print_error "Setup cannot continue without Docker. Please install Docker first."
|
|
217
|
+
exit 1
|
|
218
|
+
fi
|
|
219
|
+
echo ""
|
|
220
|
+
|
|
221
|
+
# Step 2: Set up API key
|
|
222
|
+
if ! setup_api_key; then
|
|
223
|
+
print_error "Failed to set up API key."
|
|
224
|
+
exit 1
|
|
225
|
+
fi
|
|
226
|
+
echo ""
|
|
227
|
+
|
|
228
|
+
# Step 3: Run preflight checks
|
|
229
|
+
if ! run_preflight_checks; then
|
|
230
|
+
print_warning "Some checks failed. Installation may have issues."
|
|
231
|
+
fi
|
|
232
|
+
echo ""
|
|
233
|
+
|
|
234
|
+
# Step 4: Run health check
|
|
235
|
+
if ! run_health_check; then
|
|
236
|
+
print_warning "Health check failed. Please review the output above."
|
|
237
|
+
fi
|
|
238
|
+
echo ""
|
|
239
|
+
|
|
240
|
+
# Step 5: Offer shell profile update
|
|
241
|
+
offer_shell_profile_update
|
|
242
|
+
echo ""
|
|
243
|
+
|
|
244
|
+
# Success message
|
|
245
|
+
echo "╔════════════════════════════════════════════════════════════╗"
|
|
246
|
+
echo -e "${GREEN}║ Setup Complete! ✓ ║${NC}"
|
|
247
|
+
echo "╚════════════════════════════════════════════════════════════╝"
|
|
248
|
+
echo ""
|
|
249
|
+
echo "Next steps:"
|
|
250
|
+
echo " 1. Reload your shell (or restart terminal):"
|
|
251
|
+
echo " source $HOME/.bashrc # or .zshrc"
|
|
252
|
+
echo ""
|
|
253
|
+
echo " 2. Run your first task:"
|
|
254
|
+
echo " cd $PROJECT_ROOT"
|
|
255
|
+
echo " ./run-kaseki.sh https://github.com/your-org/your-repo main"
|
|
256
|
+
echo ""
|
|
257
|
+
echo " 3. Learn more:"
|
|
258
|
+
echo " - Single host: docs/SETUP_GUIDE.md"
|
|
259
|
+
echo " - Multi-host: scripts/templates/MULTI_HOST_DISTRIBUTED.md"
|
|
260
|
+
echo " - REST API: scripts/templates/REST_API_SERVICE.md"
|
|
261
|
+
echo ""
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
# Run main
|
|
265
|
+
main "$@"
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# pi-setup-remote.sh — Remote setup for kaseki-agent via SSH
|
|
4
|
+
#
|
|
5
|
+
# This script bootstraps a remote Pi or host for kaseki-agent execution.
|
|
6
|
+
# It:
|
|
7
|
+
# 1. Validates SSH connectivity
|
|
8
|
+
# 2. Creates secrets directory on remote host
|
|
9
|
+
# 3. Securely transfers OpenRouter API key
|
|
10
|
+
# 4. Runs kaseki bootstrap (installs/deploys kaseki-agent)
|
|
11
|
+
# 5. Validates readiness with health check
|
|
12
|
+
#
|
|
13
|
+
# Usage:
|
|
14
|
+
# ./scripts/pi-setup-remote.sh pi@192.168.88.201 sk-or-v1-xxx
|
|
15
|
+
# ./scripts/pi-setup-remote.sh pi@192.168.88.201 ~/my-openrouter-key.txt
|
|
16
|
+
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
|
|
19
|
+
# Colors for output
|
|
20
|
+
RED='\033[0;31m'
|
|
21
|
+
GREEN='\033[0;32m'
|
|
22
|
+
YELLOW='\033[1;33m'
|
|
23
|
+
BLUE='\033[0;34m'
|
|
24
|
+
NC='\033[0m'
|
|
25
|
+
|
|
26
|
+
# Helper functions
|
|
27
|
+
print_header() {
|
|
28
|
+
echo -e "${BLUE}=== $1 ===${NC}"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
print_success() {
|
|
32
|
+
echo -e "${GREEN}✓ $1${NC}"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
print_error() {
|
|
36
|
+
echo -e "${RED}✗ $1${NC}" >&2
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
print_warning() {
|
|
40
|
+
echo -e "${YELLOW}⚠ $1${NC}"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# Validate arguments
|
|
44
|
+
if [ $# -lt 2 ]; then
|
|
45
|
+
echo "Usage: $0 <remote-host> <api-key-or-file>"
|
|
46
|
+
echo ""
|
|
47
|
+
echo "Examples:"
|
|
48
|
+
echo " $0 pi@192.168.88.201 sk-or-v1-your-key"
|
|
49
|
+
echo " $0 pi@192.168.88.201 ~/my-openrouter-key.txt"
|
|
50
|
+
echo ""
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
REMOTE_HOST="$1"
|
|
55
|
+
API_KEY_SOURCE="$2"
|
|
56
|
+
REMOTE_SECRETS_DIR="$HOME/.kaseki/secrets"
|
|
57
|
+
REMOTE_API_KEY_FILE="$REMOTE_SECRETS_DIR/openrouter_api_key"
|
|
58
|
+
REMOTE_KASEKI_TEMPLATE="/agents/kaseki-template"
|
|
59
|
+
REMOTE_KASEKI_INSTALL_SCRIPT="$REMOTE_KASEKI_TEMPLATE/scripts/kaseki-install.sh"
|
|
60
|
+
|
|
61
|
+
# Determine if API_KEY_SOURCE is a file or inline key
|
|
62
|
+
if [ -f "$API_KEY_SOURCE" ]; then
|
|
63
|
+
# It's a file, read it
|
|
64
|
+
if [ ! -r "$API_KEY_SOURCE" ]; then
|
|
65
|
+
print_error "Cannot read API key file: $API_KEY_SOURCE"
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
API_KEY=$(<"$API_KEY_SOURCE")
|
|
69
|
+
elif [[ "$API_KEY_SOURCE" =~ ^sk-or ]]; then
|
|
70
|
+
# It's an inline key
|
|
71
|
+
API_KEY="$API_KEY_SOURCE"
|
|
72
|
+
else
|
|
73
|
+
print_error "Invalid API key source. Must be either:"
|
|
74
|
+
print_error " - A file path"
|
|
75
|
+
print_error " - An inline key starting with 'sk-or'"
|
|
76
|
+
exit 1
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# Validate API key format
|
|
80
|
+
if [[ ! "$API_KEY" =~ ^sk-or ]]; then
|
|
81
|
+
print_error "Invalid API key format. Must start with 'sk-or'"
|
|
82
|
+
exit 1
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
main() {
|
|
86
|
+
echo ""
|
|
87
|
+
echo "╔════════════════════════════════════════════════════════════╗"
|
|
88
|
+
echo "║ Kaseki Agent - Remote Setup via SSH ║"
|
|
89
|
+
echo "╚════════════════════════════════════════════════════════════╝"
|
|
90
|
+
echo ""
|
|
91
|
+
|
|
92
|
+
print_header "Setup Configuration"
|
|
93
|
+
echo "Remote host: $REMOTE_HOST"
|
|
94
|
+
echo "Secrets dir: $REMOTE_SECRETS_DIR"
|
|
95
|
+
echo "API key file: $REMOTE_API_KEY_FILE"
|
|
96
|
+
echo "Kaseki template: $REMOTE_KASEKI_TEMPLATE"
|
|
97
|
+
echo ""
|
|
98
|
+
|
|
99
|
+
# Step 1: Test SSH connectivity
|
|
100
|
+
print_header "SSH Connectivity Check"
|
|
101
|
+
if ssh -o ConnectTimeout=5 "$REMOTE_HOST" "echo 'SSH OK'" >/dev/null 2>&1; then
|
|
102
|
+
print_success "SSH connectivity to $REMOTE_HOST"
|
|
103
|
+
else
|
|
104
|
+
print_error "Cannot connect to $REMOTE_HOST via SSH"
|
|
105
|
+
print_warning "Make sure:"
|
|
106
|
+
print_warning " 1. Host is reachable"
|
|
107
|
+
print_warning " 2. SSH keys are configured (or use -i flag)"
|
|
108
|
+
print_warning " 3. You have permission to connect"
|
|
109
|
+
exit 1
|
|
110
|
+
fi
|
|
111
|
+
echo ""
|
|
112
|
+
|
|
113
|
+
# Step 2: Create secrets directory
|
|
114
|
+
print_header "Creating Secrets Directory on Remote Host"
|
|
115
|
+
# shellcheck disable=SC2029
|
|
116
|
+
if ssh "$REMOTE_HOST" "
|
|
117
|
+
mkdir -p '$REMOTE_SECRETS_DIR'
|
|
118
|
+
chmod 700 '$REMOTE_SECRETS_DIR'
|
|
119
|
+
[ -d '$REMOTE_SECRETS_DIR' ] && echo 'Secrets directory created'
|
|
120
|
+
" >/dev/null 2>&1; then
|
|
121
|
+
print_success "Secrets directory created/verified"
|
|
122
|
+
else
|
|
123
|
+
print_error "Failed to create secrets directory on remote host"
|
|
124
|
+
exit 1
|
|
125
|
+
fi
|
|
126
|
+
echo ""
|
|
127
|
+
|
|
128
|
+
# Step 3: Transfer API key securely via SSH
|
|
129
|
+
print_header "Transferring OpenRouter API Key"
|
|
130
|
+
echo "API key:"
|
|
131
|
+
echo " Source: $([ -f "$API_KEY_SOURCE" ] && echo "$API_KEY_SOURCE" || echo 'inline')"
|
|
132
|
+
echo " Destination: $REMOTE_HOST:$REMOTE_API_KEY_FILE"
|
|
133
|
+
echo ""
|
|
134
|
+
|
|
135
|
+
# Use stdin to pipe key to remote host (avoids exposing in process list)
|
|
136
|
+
# shellcheck disable=SC2029
|
|
137
|
+
if echo "$API_KEY" | ssh "$REMOTE_HOST" "
|
|
138
|
+
cat > '$REMOTE_API_KEY_FILE'
|
|
139
|
+
chmod 600 '$REMOTE_API_KEY_FILE'
|
|
140
|
+
[ -f '$REMOTE_API_KEY_FILE' ] && echo 'API key transferred'
|
|
141
|
+
" >/dev/null 2>&1; then
|
|
142
|
+
print_success "API key transferred securely"
|
|
143
|
+
else
|
|
144
|
+
print_error "Failed to transfer API key"
|
|
145
|
+
exit 1
|
|
146
|
+
fi
|
|
147
|
+
echo ""
|
|
148
|
+
|
|
149
|
+
# Step 4: Bootstrap kaseki-agent on remote host
|
|
150
|
+
print_header "Bootstrapping Kaseki Agent"
|
|
151
|
+
echo "This may take a few minutes the first time (cloning repo, pulling image)..."
|
|
152
|
+
echo ""
|
|
153
|
+
|
|
154
|
+
# Bootstrap via remote kaseki-install.sh if it exists, else via curl
|
|
155
|
+
# shellcheck disable=SC2029
|
|
156
|
+
BOOTSTRAP_CMD='
|
|
157
|
+
if [ -f '"$REMOTE_KASEKI_INSTALL_SCRIPT"' ]; then
|
|
158
|
+
KASEKI_CONTROLLER_MODE=1 KASEKI_REPLACE_STALE=1 '"$REMOTE_KASEKI_INSTALL_SCRIPT"'
|
|
159
|
+
else
|
|
160
|
+
echo "Kaseki template not found. Installing via curl..." >&2
|
|
161
|
+
curl -fsSL https://raw.githubusercontent.com/CyanAutomation/kaseki-agent/main/scripts/kaseki-install.sh | \
|
|
162
|
+
KASEKI_CONTROLLER_MODE=1 KASEKI_REPLACE_STALE=1 sh
|
|
163
|
+
fi
|
|
164
|
+
'
|
|
165
|
+
|
|
166
|
+
# shellcheck disable=SC2029
|
|
167
|
+
if ssh "$REMOTE_HOST" "${BOOTSTRAP_CMD}" 2>&1 | tail -20; then
|
|
168
|
+
print_success "Bootstrap completed"
|
|
169
|
+
else
|
|
170
|
+
print_error "Bootstrap failed. Check the output above."
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
173
|
+
echo ""
|
|
174
|
+
|
|
175
|
+
# Step 5: Verify readiness with health check
|
|
176
|
+
print_header "Verifying Readiness (Running --doctor)"
|
|
177
|
+
# shellcheck disable=SC2029
|
|
178
|
+
HEALTH_CHECK_CMD="
|
|
179
|
+
export OPENROUTER_API_KEY_FILE=$REMOTE_API_KEY_FILE
|
|
180
|
+
$REMOTE_KASEKI_TEMPLATE/run-kaseki.sh --doctor
|
|
181
|
+
"
|
|
182
|
+
|
|
183
|
+
# shellcheck disable=SC2029
|
|
184
|
+
if ssh "$REMOTE_HOST" "${HEALTH_CHECK_CMD}" 2>&1 | tail -15; then
|
|
185
|
+
print_success "Health check passed"
|
|
186
|
+
else
|
|
187
|
+
print_warning "Health check reported issues. Review the output above."
|
|
188
|
+
fi
|
|
189
|
+
echo ""
|
|
190
|
+
|
|
191
|
+
# Success message
|
|
192
|
+
echo "╔════════════════════════════════════════════════════════════╗"
|
|
193
|
+
echo -e "${GREEN}║ Setup Complete for $REMOTE_HOST! ✓ ║${NC}"
|
|
194
|
+
echo "╚════════════════════════════════════════════════════════════╝"
|
|
195
|
+
echo ""
|
|
196
|
+
echo "Next steps:"
|
|
197
|
+
echo " 1. Test a remote run:"
|
|
198
|
+
echo " ssh $REMOTE_HOST '"
|
|
199
|
+
echo " OPENROUTER_API_KEY_FILE=$REMOTE_API_KEY_FILE \\"
|
|
200
|
+
echo " $REMOTE_KASEKI_TEMPLATE/run-kaseki.sh \\"
|
|
201
|
+
echo " https://github.com/your-org/your-repo main"
|
|
202
|
+
echo " '"
|
|
203
|
+
echo ""
|
|
204
|
+
echo " 2. Retrieve results:"
|
|
205
|
+
echo " scp -r $REMOTE_HOST:/agents/kaseki-results/kaseki-1 ~/results/"
|
|
206
|
+
echo ""
|
|
207
|
+
echo " 3. For multi-host setup, repeat for other hosts:"
|
|
208
|
+
echo " $0 pi@192.168.88.202 \$(cat ~/.kaseki/secrets/openrouter_api_key)"
|
|
209
|
+
echo ""
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
# Run main
|
|
213
|
+
main "$@"
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Configure GitHub labels for kaseki-agent
|
|
3
|
+
# This script uses GitHub CLI (gh) to create standard labels
|
|
4
|
+
|
|
5
|
+
# Requires: gh CLI with authentication
|
|
6
|
+
# Install: https://cli.github.com/
|
|
7
|
+
# Login: gh auth login
|
|
8
|
+
|
|
9
|
+
set -e
|
|
10
|
+
|
|
11
|
+
REPO="CyanAutomation/kaseki-agent"
|
|
12
|
+
|
|
13
|
+
echo "🏷️ Creating GitHub labels for $REPO..."
|
|
14
|
+
|
|
15
|
+
# Define labels: name, color, description
|
|
16
|
+
declare -A labels=(
|
|
17
|
+
["bug"]="d73a49|Something is broken"
|
|
18
|
+
["feature"]="0075ca|New capability or enhancement"
|
|
19
|
+
["security"]="ae2a23|Security vulnerability or hardening"
|
|
20
|
+
["documentation"]="0e8a16|Documentation, guides, or comments"
|
|
21
|
+
["infrastructure"]="8f1a9a|Docker, CI/CD, operations, or deployment"
|
|
22
|
+
["good first issue"]="7057ff|Good for newcomers or new contributors"
|
|
23
|
+
["help wanted"]="fbca04|Need community input or assistance"
|
|
24
|
+
["stale"]="cccccc|Inactive or abandoned issue"
|
|
25
|
+
["testing"]="e99695|Tests, test coverage, or test improvements"
|
|
26
|
+
["performance"]="fbcf3f|Performance optimization or benchmarking"
|
|
27
|
+
["dependencies"]="0366d6|Dependency updates or version management"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
for label in "${!labels[@]}"; do
|
|
31
|
+
IFS='|' read -r color description <<< "${labels[$label]}"
|
|
32
|
+
echo " Creating label: $label (color: $color)"
|
|
33
|
+
gh label create "$label" \
|
|
34
|
+
--repo "$REPO" \
|
|
35
|
+
--color "$color" \
|
|
36
|
+
--description "$description" \
|
|
37
|
+
--force 2>/dev/null || true
|
|
38
|
+
done
|
|
39
|
+
|
|
40
|
+
echo "✅ Labels created successfully!"
|
|
41
|
+
echo ""
|
|
42
|
+
echo "Verify labels at: https://github.com/$REPO/labels"
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# suggest-allowlist.sh - Suggest allowlist patterns based on a completed kaseki run
|
|
3
|
+
# Usage: ./scripts/suggest-allowlist.sh <results-dir>
|
|
4
|
+
# Example: ./scripts/suggest-allowlist.sh /agents/kaseki-results/kaseki-1
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
RESULTS_DIR="${1:-.}"
|
|
9
|
+
|
|
10
|
+
if [ ! -f "$RESULTS_DIR/changed-files.txt" ]; then
|
|
11
|
+
echo "❌ changed-files.txt not found in $RESULTS_DIR" >&2
|
|
12
|
+
exit 1
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
# Count files by directory pattern
|
|
16
|
+
declare -A dir_counts
|
|
17
|
+
|
|
18
|
+
while IFS= read -r file || [ -n "$file" ]; do
|
|
19
|
+
[ -z "$file" ] && continue
|
|
20
|
+
|
|
21
|
+
# Extract directory pattern (e.g., src/lib -> src/lib, src -> src)
|
|
22
|
+
dir=$(dirname "$file")
|
|
23
|
+
dir=${dir#./} # Remove leading ./
|
|
24
|
+
|
|
25
|
+
# Increment counter
|
|
26
|
+
dir_counts["$dir"]=$((${dir_counts["$dir"]:-0} + 1))
|
|
27
|
+
|
|
28
|
+
# Also track top-level directory
|
|
29
|
+
top_dir=$(echo "$dir" | cut -d'/' -f1)
|
|
30
|
+
dir_counts["$top_dir/**"]=$((${dir_counts["$top_dir/**"]:-0} + 1))
|
|
31
|
+
done < "$RESULTS_DIR/changed-files.txt"
|
|
32
|
+
|
|
33
|
+
# Sort by count (descending) and print suggestions
|
|
34
|
+
{
|
|
35
|
+
printf '# Suggested allowlist based on: %s\n\n' "$(basename "$RESULTS_DIR")"
|
|
36
|
+
printf '## Option 1: Specific directories (most restrictive)\n'
|
|
37
|
+
printf 'Use this to be more specific about which directories are allowed:\n\n'
|
|
38
|
+
printf '```bash\nKASEKI_CHANGED_FILES_ALLOWLIST="\n'
|
|
39
|
+
|
|
40
|
+
for dir in "${!dir_counts[@]}"; do
|
|
41
|
+
printf ' %s\n' "$dir"
|
|
42
|
+
done | sort | head -10
|
|
43
|
+
|
|
44
|
+
printf '"\n```\n\n'
|
|
45
|
+
|
|
46
|
+
printf '## Option 2: Top-level directories (less restrictive)\n'
|
|
47
|
+
printf 'Use this to allow entire directory trees:\n\n'
|
|
48
|
+
printf '```bash\nKASEKI_CHANGED_FILES_ALLOWLIST="\n'
|
|
49
|
+
|
|
50
|
+
for dir in "${!dir_counts[@]}"; do
|
|
51
|
+
if [[ "$dir" == *"/**" ]]; then
|
|
52
|
+
printf ' %s\n' "$dir"
|
|
53
|
+
fi
|
|
54
|
+
done | sort | uniq
|
|
55
|
+
|
|
56
|
+
printf '"\n```\n\n'
|
|
57
|
+
|
|
58
|
+
printf '## Statistics\n'
|
|
59
|
+
printf '- Total files changed: %s\n' "$(wc -l < "$RESULTS_DIR/changed-files.txt")"
|
|
60
|
+
printf '- Unique directories: %s\n' "${#dir_counts[@]}"
|
|
61
|
+
printf '\n## All changed files\n\n'
|
|
62
|
+
printf '```\n'
|
|
63
|
+
sort "$RESULTS_DIR/changed-files.txt"
|
|
64
|
+
printf '```\n'
|
|
65
|
+
} > "$RESULTS_DIR/allowlist-suggestions.md"
|
|
66
|
+
|
|
67
|
+
echo "✅ Suggestions written to: $RESULTS_DIR/allowlist-suggestions.md"
|
|
68
|
+
cat "$RESULTS_DIR/allowlist-suggestions.md"
|