@kontourai/flow-agents 0.1.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/.githooks/pre-push +11 -0
- package/.github/workflows/ci.yml +210 -0
- package/.github/workflows/docs-pages.yml +52 -0
- package/.github/workflows/publish-npm.yml +104 -0
- package/AGENTS.md +26 -0
- package/CHANGELOG.md +66 -0
- package/CODE_OF_CONDUCT.md +25 -0
- package/CONTEXT.md +300 -0
- package/CONTRIBUTING.md +44 -0
- package/LICENSE +201 -0
- package/README.md +129 -0
- package/SECURITY.md +33 -0
- package/agent-cards/dev.json +19 -0
- package/agents/dev.json +127 -0
- package/agents/tool-code-reviewer.json +61 -0
- package/agents/tool-dependencies-updater.json +118 -0
- package/agents/tool-explore-config.json +92 -0
- package/agents/tool-explore-deps.json +92 -0
- package/agents/tool-explore-entry.json +92 -0
- package/agents/tool-explore-patterns.json +92 -0
- package/agents/tool-explore-structure.json +92 -0
- package/agents/tool-explore-tests.json +92 -0
- package/agents/tool-planner.json +57 -0
- package/agents/tool-playwright.json +145 -0
- package/agents/tool-security-reviewer.json +56 -0
- package/agents/tool-verifier.json +61 -0
- package/agents/tool-worker.json +58 -0
- package/build/src/cli/console-learning-projection.js +123 -0
- package/build/src/cli/docs-preview.js +39 -0
- package/build/src/cli/effective-backlog-settings.js +102 -0
- package/build/src/cli/export-bookmarks.js +38 -0
- package/build/src/cli/fixture-retirement-audit.js +140 -0
- package/build/src/cli/flow-kit.js +138 -0
- package/build/src/cli/import-bookmarks.js +50 -0
- package/build/src/cli/init.js +239 -0
- package/build/src/cli/instinct-cli.js +93 -0
- package/build/src/cli/promote-workflow-artifact.js +63 -0
- package/build/src/cli/publish-change-helper.js +154 -0
- package/build/src/cli/pull-work-provider.js +469 -0
- package/build/src/cli/runtime-adapter.js +23 -0
- package/build/src/cli/telemetry-doctor.js +221 -0
- package/build/src/cli/usage-feedback.js +443 -0
- package/build/src/cli/validate-hook-influence.js +152 -0
- package/build/src/cli/validate-source-tree.js +31 -0
- package/build/src/cli/validate-workflow-artifacts.js +486 -0
- package/build/src/cli/veritas-governance.js +262 -0
- package/build/src/cli/workflow-artifact-cleanup-audit.js +272 -0
- package/build/src/cli/workflow-sidecar.js +816 -0
- package/build/src/cli.js +89 -0
- package/build/src/flow-kit/validate.js +75 -0
- package/build/src/lib/args.js +45 -0
- package/build/src/lib/fs.js +62 -0
- package/build/src/lib/workflow-learning-projection.js +334 -0
- package/build/src/runtime-adapters.js +146 -0
- package/build/src/tools/build-universal-bundles.js +397 -0
- package/build/src/tools/common.js +56 -0
- package/build/src/tools/filter-installed-packs.js +132 -0
- package/build/src/tools/generate-context-map.js +198 -0
- package/build/src/tools/validate-package.js +64 -0
- package/build/src/tools/validate-source-tree.js +622 -0
- package/console.telemetry.json +176 -0
- package/context/base-rules.md +17 -0
- package/context/code-review-standards.md +62 -0
- package/context/coding-standards.md +42 -0
- package/context/common/orchestrators.md +12 -0
- package/context/common/subagents.md +28 -0
- package/context/contracts/artifact-contract.md +182 -0
- package/context/contracts/builder-kit-workflow-state-contract.md +319 -0
- package/context/contracts/delivery-contract.md +69 -0
- package/context/contracts/execution-contract.md +53 -0
- package/context/contracts/governance-adapter-contract.md +67 -0
- package/context/contracts/planning-contract.md +85 -0
- package/context/contracts/review-contract.md +104 -0
- package/context/contracts/sandbox-policy.md +52 -0
- package/context/contracts/verification-contract.md +134 -0
- package/context/contracts/work-item-contract.md +215 -0
- package/context/deferred/demo-mode.md +33 -0
- package/context/deferred/languages/go.md +31 -0
- package/context/deferred/languages/python.md +31 -0
- package/context/deferred/languages/typescript.md +34 -0
- package/context/deferred/parallelization.md +35 -0
- package/context/deferred/worktree-isolation.md +24 -0
- package/context/development-workflow.md +50 -0
- package/context/scripts/context-budget/budget-scan.sh +166 -0
- package/context/scripts/detect-tools.sh +3 -0
- package/context/scripts/discover-agents.sh +28 -0
- package/context/scripts/git-status.sh +49 -0
- package/context/scripts/hooks/config-protection.js +79 -0
- package/context/scripts/hooks/desktop-notify.sh +39 -0
- package/context/scripts/hooks/governance-audit.sh +135 -0
- package/context/scripts/hooks/lib/audit-transport.sh +40 -0
- package/context/scripts/hooks/lib/hook-flags.js +49 -0
- package/context/scripts/hooks/lib/patterns.sh +57 -0
- package/context/scripts/hooks/lib/resolve-formatter.js +80 -0
- package/context/scripts/hooks/post-edit-accumulator.js +66 -0
- package/context/scripts/hooks/pre-commit-quality.js +194 -0
- package/context/scripts/hooks/quality-gate.js +93 -0
- package/context/scripts/hooks/report-only-guard.js +21 -0
- package/context/scripts/hooks/run-hook.js +136 -0
- package/context/scripts/hooks/stop-format-typecheck.js +141 -0
- package/context/scripts/hooks/stop-goal-fit.js +337 -0
- package/context/scripts/hooks/workflow-steering.js +250 -0
- package/context/scripts/telemetry/console-presets.sh +14 -0
- package/context/scripts/telemetry/install-console-config.sh +214 -0
- package/context/scripts/telemetry/lib/config.sh +85 -0
- package/context/scripts/telemetry/lib/enrich.sh +115 -0
- package/context/scripts/telemetry/lib/redact.sh +22 -0
- package/context/scripts/telemetry/lib/session.sh +63 -0
- package/context/scripts/telemetry/lib/transport.sh +183 -0
- package/context/scripts/telemetry/lib/usage.sh +29 -0
- package/context/scripts/telemetry/sync-agents.sh +173 -0
- package/context/scripts/telemetry/telemetry.conf +23 -0
- package/context/scripts/telemetry/telemetry.sh +387 -0
- package/context/scripts/validate-package.sh +89 -0
- package/context/settings/backlog-provider-settings.json +54 -0
- package/context/templates/core/identity.md +26 -0
- package/context/templates/core/user.md +15 -0
- package/docs/_config.yml +15 -0
- package/docs/_layouts/default.html +87 -0
- package/docs/adr/0001-flow-agents-consumes-flow.md +77 -0
- package/docs/adr/0002-flow-kits-as-extension-unit.md +13 -0
- package/docs/adr/0003-flow-agents-coordinates-kits-and-adapters.md +13 -0
- package/docs/adr/0004-gates-expect-surface-claims.md +15 -0
- package/docs/adr/0005-kubernetes-inspired-resource-contracts.md +48 -0
- package/docs/adr/0006-typescript-first-source-policy.md +98 -0
- package/docs/agent-system-guidebook.md +391 -0
- package/docs/agent-usage-feedback-loop.md +351 -0
- package/docs/assets/favicon.svg +13 -0
- package/docs/assets/og-image.png +0 -0
- package/docs/assets/site.css +774 -0
- package/docs/assets/site.js +139 -0
- package/docs/configurable-workflow-routing.md +174 -0
- package/docs/context-map.md +145 -0
- package/docs/developer-architecture.md +145 -0
- package/docs/developer-hook-setup.md +61 -0
- package/docs/fixture-ownership.md +44 -0
- package/docs/flow-kit-repository-contract.md +180 -0
- package/docs/index.md +129 -0
- package/docs/kontour-resource-contract.md +358 -0
- package/docs/migrations.md +64 -0
- package/docs/north-star.md +322 -0
- package/docs/operating-layers.md +110 -0
- package/docs/repository-structure.md +132 -0
- package/docs/sandbox-policy.md +56 -0
- package/docs/skills-map.md +203 -0
- package/docs/standards-register.md +96 -0
- package/docs/veritas-integration.md +165 -0
- package/docs/work-item-adapters.md +72 -0
- package/docs/workflow-artifact-lifecycle.md +141 -0
- package/docs/workflow-eval-strategy.md +295 -0
- package/docs/workflow-shared-contracts.md +51 -0
- package/docs/workflow-usage-guide.md +443 -0
- package/evals/ARCHITECTURE.md +143 -0
- package/evals/CONVENTIONS.md +58 -0
- package/evals/README.md +128 -0
- package/evals/acceptance/run.sh +29 -0
- package/evals/acceptance/test_claude_harness.sh +242 -0
- package/evals/acceptance/test_codex_harness.sh +108 -0
- package/evals/acceptance/test_kiro_harness.sh +128 -0
- package/evals/cases/dev/404.html +97 -0
- package/evals/cases/dev/code-review.yaml +44 -0
- package/evals/cases/dev/dashboard.html +300 -0
- package/evals/cases/dev/deliver.yaml +66 -0
- package/evals/cases/dev/dependency-update.yaml +16 -0
- package/evals/cases/dev/explore.yaml +20 -0
- package/evals/cases/dev/index.html +370 -0
- package/evals/cases/dev/package-lock.json +28 -0
- package/evals/cases/dev/package.json +16 -0
- package/evals/cases/dev/plan-work.yaml +20 -0
- package/evals/cases/dev/promptfooconfig.yaml +666 -0
- package/evals/cases/dev/search-first.yaml +20 -0
- package/evals/cases/dev/tdd-workflow.yaml +48 -0
- package/evals/cases/dev/verify-work.yaml +44 -0
- package/evals/cases/dev/workflow.yaml +34 -0
- package/evals/ci/run-baseline.sh +283 -0
- package/evals/fixtures/backlog-provider-settings/global-default.json +44 -0
- package/evals/fixtures/backlog-provider-settings/project-override.json +53 -0
- package/evals/fixtures/builder-kit-workflow-state/baseline-freshness-resolution-hint.json +139 -0
- package/evals/fixtures/builder-kit-workflow-state/direct-primitive-stop.json +59 -0
- package/evals/fixtures/builder-kit-workflow-state/empty-board-route-shape.json +55 -0
- package/evals/fixtures/builder-kit-workflow-state/happy-path.json +71 -0
- package/evals/fixtures/builder-kit-workflow-state/mid-work-resume.json +80 -0
- package/evals/fixtures/builder-kit-workflow-state/missing-prestep-recovery.json +65 -0
- package/evals/fixtures/builder-kit-workflow-state/product-build-chaining.json +60 -0
- package/evals/fixtures/builder-kit-workflow-state/stale-continuation-requires-new-probe.json +57 -0
- package/evals/fixtures/console-learning-projection/artifacts/console-learning-correction/learning.json +50 -0
- package/evals/fixtures/console-learning-projection/artifacts/console-learning-open-route/learning.json +41 -0
- package/evals/fixtures/flow-kit-repository/invalid-absolute-path/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-asset-section/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-asset-section/kit.json +11 -0
- package/evals/fixtures/flow-kit-repository/invalid-duplicate-flow/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-duplicate-flow/kit.json +9 -0
- package/evals/fixtures/flow-kit-repository/invalid-id/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-id/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-malformed-json/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-flow/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-id/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-id/kit.json +7 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-schema-version/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-schema-version/kit.json +7 -0
- package/evals/fixtures/flow-kit-repository/invalid-name/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-name/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-schema-version/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-schema-version/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-traversal/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/adapters/example.json +3 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/assets/example.txt +1 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/docs/README.md +3 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/flows/runtime.flow.json +26 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit-evals/example.json +3 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit-skills/mixed/SKILL.md +3 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit.json +44 -0
- package/evals/fixtures/flow-kit-repository/valid-local-kit/docs/README.md +3 -0
- package/evals/fixtures/flow-kit-repository/valid-local-kit/flows/review.flow.json +26 -0
- package/evals/fixtures/flow-kit-repository/valid-local-kit/kit.json +20 -0
- package/evals/fixtures/hook-influence/cases.json +336 -0
- package/evals/fixtures/pull-work-provider/github-issues.json +170 -0
- package/evals/fixtures/pull-work-wip-shepherding/global-wip-informs.json +43 -0
- package/evals/fixtures/pull-work-wip-shepherding/personal-wip-blocks.json +42 -0
- package/evals/fixtures/surface-trust/accepted-claim-trust-report.json +31 -0
- package/evals/fixtures/surface-trust/artifact-absent.json +19 -0
- package/evals/fixtures/surface-trust/integrity-mismatch-trust-report.json +32 -0
- package/evals/fixtures/surface-trust/missing-authority-trust-report.json +27 -0
- package/evals/fixtures/surface-trust/provider-absent.json +19 -0
- package/evals/fixtures/surface-trust/rejected-claim-trust-report.json +30 -0
- package/evals/fixtures/surface-trust/stale-claim-trust-snapshot.json +31 -0
- package/evals/fixtures/usage-feedback/sample-full.jsonl +11 -0
- package/evals/fixtures/usage-feedback/sample-outcomes.jsonl +1 -0
- package/evals/fixtures/veritas-governance-adapter/fake-veritas-pass.sh +18 -0
- package/evals/fixtures/veritas-governance-adapter/fake-veritas-secret-fail.sh +10 -0
- package/evals/fixtures/veritas-governance-adapter/fake-veritas-unconfigured.sh +4 -0
- package/evals/integration/test_bundle_install.sh +541 -0
- package/evals/integration/test_console_learning_projection.sh +192 -0
- package/evals/integration/test_context_map.sh +65 -0
- package/evals/integration/test_effective_backlog_settings.sh +58 -0
- package/evals/integration/test_fixture_retirement_audit.sh +58 -0
- package/evals/integration/test_flow_agents_statusline.sh +93 -0
- package/evals/integration/test_flow_kit_repository.sh +90 -0
- package/evals/integration/test_goal_fit_hook.sh +482 -0
- package/evals/integration/test_hook_category_behaviors.sh +190 -0
- package/evals/integration/test_hook_influence_cases.sh +69 -0
- package/evals/integration/test_local_flow_kit_install.sh +145 -0
- package/evals/integration/test_publish_change_helper.sh +176 -0
- package/evals/integration/test_pull_work_provider.sh +140 -0
- package/evals/integration/test_runtime_adapter_activation.sh +106 -0
- package/evals/integration/test_telemetry.sh +485 -0
- package/evals/integration/test_telemetry_doctor.sh +193 -0
- package/evals/integration/test_usage_feedback_dashboard.sh +169 -0
- package/evals/integration/test_usage_feedback_global.sh +117 -0
- package/evals/integration/test_usage_feedback_import.sh +227 -0
- package/evals/integration/test_usage_feedback_outcomes.sh +165 -0
- package/evals/integration/test_usage_feedback_report.sh +263 -0
- package/evals/integration/test_veritas_governance_adapter.sh +235 -0
- package/evals/integration/test_workflow_artifact_cleanup_audit.sh +287 -0
- package/evals/integration/test_workflow_artifacts.sh +1247 -0
- package/evals/integration/test_workflow_sidecar_writer.sh +2112 -0
- package/evals/integration/test_workflow_steering_hook.sh +337 -0
- package/evals/lib/assertions/delegated-to.js +40 -0
- package/evals/lib/assertions/max-tool-calls.js +15 -0
- package/evals/lib/assertions/no-write-tools.js +27 -0
- package/evals/lib/assertions/pass-at-k.js +39 -0
- package/evals/lib/assertions/telemetry-utils.js +105 -0
- package/evals/lib/assertions/tool-called.js +39 -0
- package/evals/lib/assertions/verify-after-fix.js +61 -0
- package/evals/lib/claude-judge.sh +40 -0
- package/evals/lib/claude-provider.sh +74 -0
- package/evals/lib/codex-judge.sh +39 -0
- package/evals/lib/codex-provider.sh +81 -0
- package/evals/lib/eval-dev.sh +5 -0
- package/evals/lib/eval-judge.sh +22 -0
- package/evals/lib/eval-provider.sh +26 -0
- package/evals/lib/eval-report.sh +73 -0
- package/evals/lib/kiro-dev.sh +4 -0
- package/evals/lib/kiro-judge.sh +17 -0
- package/evals/lib/kiro-provider.sh +62 -0
- package/evals/lib/node.sh +111 -0
- package/evals/promptfooconfig.yaml +70 -0
- package/evals/run.sh +309 -0
- package/evals/static/test_evidence_refs.sh +141 -0
- package/evals/static/test_package.sh +407 -0
- package/evals/static/test_repo_hooks.sh +68 -0
- package/evals/static/test_universal_bundles.sh +274 -0
- package/evals/static/test_workflow_skills.sh +1207 -0
- package/install.sh +64 -0
- package/integrations/veritas/flow-agents.adapter.json +138 -0
- package/integrations/veritas/flow-agents.authority-settings.json +26 -0
- package/integrations/veritas/flow-agents.repo-standards.json +82 -0
- package/kits/builder/flows/build.flow.json +218 -0
- package/kits/builder/flows/shape.flow.json +127 -0
- package/kits/builder/kit.json +19 -0
- package/kits/catalog.json +11 -0
- package/package.json +130 -0
- package/packaging/README.md +60 -0
- package/packaging/manifest.json +173 -0
- package/packaging/packs.json +69 -0
- package/powers/dependency-checker/POWER.md +20 -0
- package/powers/dependency-checker/mcp.json +20 -0
- package/powers/playwright/POWER.md +25 -0
- package/powers/playwright/mcp.json +12 -0
- package/prompts/code-audit.md +123 -0
- package/prompts/kcommit.md +88 -0
- package/schemas/backlog-provider-settings.schema.json +138 -0
- package/schemas/workflow-acceptance.schema.json +216 -0
- package/schemas/workflow-critique.schema.json +113 -0
- package/schemas/workflow-evidence.schema.json +357 -0
- package/schemas/workflow-handoff.schema.json +52 -0
- package/schemas/workflow-learning.schema.json +223 -0
- package/schemas/workflow-release.schema.json +172 -0
- package/schemas/workflow-state.schema.json +80 -0
- package/scripts/README.md +111 -0
- package/scripts/build-universal-bundles.js +3 -0
- package/scripts/check-content-boundary.cjs +99 -0
- package/scripts/context-budget/budget-scan.sh +166 -0
- package/scripts/detect-tools.sh +3 -0
- package/scripts/discover-agents.sh +28 -0
- package/scripts/effective-backlog-settings.js +2 -0
- package/scripts/filter-installed-packs.js +2 -0
- package/scripts/flow-kit.js +2 -0
- package/scripts/generate-context-map.js +2 -0
- package/scripts/git-status.sh +49 -0
- package/scripts/hooks/claude-hook-adapter.js +174 -0
- package/scripts/hooks/claude-telemetry-hook.js +115 -0
- package/scripts/hooks/codex-hook-adapter.js +176 -0
- package/scripts/hooks/codex-telemetry-hook.js +95 -0
- package/scripts/hooks/config-protection.js +79 -0
- package/scripts/hooks/desktop-notify.sh +39 -0
- package/scripts/hooks/governance-audit.sh +135 -0
- package/scripts/hooks/lib/audit-transport.sh +40 -0
- package/scripts/hooks/lib/hook-flags.js +49 -0
- package/scripts/hooks/lib/patterns.sh +57 -0
- package/scripts/hooks/lib/resolve-formatter.js +80 -0
- package/scripts/hooks/post-edit-accumulator.js +66 -0
- package/scripts/hooks/pre-commit-quality.js +194 -0
- package/scripts/hooks/quality-gate.js +93 -0
- package/scripts/hooks/report-only-guard.js +21 -0
- package/scripts/hooks/run-hook.js +136 -0
- package/scripts/hooks/stop-format-typecheck.js +141 -0
- package/scripts/hooks/stop-goal-fit.js +337 -0
- package/scripts/hooks/workflow-steering.js +250 -0
- package/scripts/install-codex-home.sh +106 -0
- package/scripts/package.json +3 -0
- package/scripts/promote-workflow-artifact.js +2 -0
- package/scripts/publish-change-helper.js +2 -0
- package/scripts/pull-work-provider.js +2 -0
- package/scripts/setup-repo-hooks.sh +8 -0
- package/scripts/statusline/flow-agents-statusline.js +157 -0
- package/scripts/telemetry/console-presets.sh +14 -0
- package/scripts/telemetry/install-console-config.sh +214 -0
- package/scripts/telemetry/lib/config.sh +85 -0
- package/scripts/telemetry/lib/enrich.sh +115 -0
- package/scripts/telemetry/lib/redact.sh +22 -0
- package/scripts/telemetry/lib/session.sh +63 -0
- package/scripts/telemetry/lib/transport.sh +183 -0
- package/scripts/telemetry/lib/usage.sh +29 -0
- package/scripts/telemetry/sync-agents.sh +173 -0
- package/scripts/telemetry/telemetry.conf +23 -0
- package/scripts/telemetry/telemetry.sh +387 -0
- package/scripts/usage-feedback.js +2 -0
- package/scripts/validate-hook-influence-cases.js +2 -0
- package/scripts/validate-package.sh +89 -0
- package/scripts/validate-source-tree.js +9 -0
- package/skills/agentic-engineering/SKILL.md +62 -0
- package/skills/browser-test/SKILL.md +51 -0
- package/skills/builder-shape/SKILL.md +76 -0
- package/skills/context-budget/SKILL.md +40 -0
- package/skills/deliver/SKILL.md +241 -0
- package/skills/dependency-update/SKILL.md +68 -0
- package/skills/design-probe/SKILL.md +107 -0
- package/skills/eval-rebuild/SKILL.md +39 -0
- package/skills/evidence-gate/SKILL.md +186 -0
- package/skills/execute-plan/SKILL.md +110 -0
- package/skills/explore/SKILL.md +137 -0
- package/skills/feedback-loop/SKILL.md +87 -0
- package/skills/fix-bug/SKILL.md +133 -0
- package/skills/frontend-design/SKILL.md +80 -0
- package/skills/github-cli/SKILL.md +63 -0
- package/skills/idea-to-backlog/SKILL.md +267 -0
- package/skills/knowledge-capture/SKILL.md +55 -0
- package/skills/learning-review/SKILL.md +115 -0
- package/skills/pickup-probe/SKILL.md +114 -0
- package/skills/plan-work/SKILL.md +176 -0
- package/skills/pull-work/SKILL.md +309 -0
- package/skills/release-readiness/SKILL.md +121 -0
- package/skills/review-work/SKILL.md +161 -0
- package/skills/search-first/SKILL.md +66 -0
- package/skills/tdd-workflow/SKILL.md +140 -0
- package/skills/verify-work/SKILL.md +109 -0
- package/src/cli/console-learning-projection.ts +140 -0
- package/src/cli/effective-backlog-settings.ts +99 -0
- package/src/cli/fixture-retirement-audit.ts +154 -0
- package/src/cli/flow-kit.ts +139 -0
- package/src/cli/init.ts +248 -0
- package/src/cli/promote-workflow-artifact.ts +64 -0
- package/src/cli/publish-change-helper.ts +143 -0
- package/src/cli/pull-work-provider.ts +481 -0
- package/src/cli/runtime-adapter.ts +24 -0
- package/src/cli/telemetry-doctor.ts +243 -0
- package/src/cli/usage-feedback.ts +418 -0
- package/src/cli/validate-hook-influence.ts +119 -0
- package/src/cli/validate-source-tree.ts +30 -0
- package/src/cli/validate-workflow-artifacts.ts +411 -0
- package/src/cli/veritas-governance.ts +322 -0
- package/src/cli/workflow-artifact-cleanup-audit.ts +281 -0
- package/src/cli/workflow-sidecar.ts +676 -0
- package/src/cli.ts +95 -0
- package/src/flow-kit/validate.ts +74 -0
- package/src/lib/args.ts +43 -0
- package/src/lib/fs.ts +62 -0
- package/src/lib/workflow-learning-projection.ts +491 -0
- package/src/runtime-adapters.ts +154 -0
- package/src/tools/build-universal-bundles.ts +366 -0
- package/src/tools/common.ts +61 -0
- package/src/tools/filter-installed-packs.ts +129 -0
- package/src/tools/generate-context-map.ts +199 -0
- package/src/tools/validate-package.ts +57 -0
- package/src/tools/validate-source-tree.ts +488 -0
- package/tsconfig.json +19 -0
- package/veritas.claims.json +6 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Parallelization with tool-worker
|
|
2
|
+
|
|
3
|
+
You have access to `tool-worker` — an autonomous coding subagent with full `@builtin` tool access (read, write, shell, code, grep, glob). Use it to parallelize implementation work.
|
|
4
|
+
|
|
5
|
+
## When to Delegate to tool-worker
|
|
6
|
+
|
|
7
|
+
- **Independent file changes** — multiple files that don't depend on each other can be written in parallel
|
|
8
|
+
- **Long-running tasks** — implementation that would take many turns can run in the background while you handle other work
|
|
9
|
+
- **Code Generation phase** (aidlc) — fan out unit implementations to parallel tool-worker instances
|
|
10
|
+
- **Test writing** — delegate test creation while you continue with implementation
|
|
11
|
+
- **Repetitive changes** — applying the same pattern across multiple files/modules
|
|
12
|
+
|
|
13
|
+
## When NOT to Delegate
|
|
14
|
+
|
|
15
|
+
- Tasks requiring user interaction or clarification
|
|
16
|
+
- Changes with tight dependencies on each other (file A must exist before file B)
|
|
17
|
+
- Exploratory work where the approach isn't clear yet
|
|
18
|
+
|
|
19
|
+
## How to Delegate
|
|
20
|
+
|
|
21
|
+
Provide tool-worker with a self-contained prompt including:
|
|
22
|
+
|
|
23
|
+
Every worker delegation must target the exact `tool-worker` role. Omitting the role creates a generic unnamed worker that cannot load the Flow Agents worker contract.
|
|
24
|
+
1. **Clear scope** — exactly which files to create/modify
|
|
25
|
+
2. **Acceptance criteria** — what "done" looks like
|
|
26
|
+
3. **Context** — relevant code patterns, conventions, types/interfaces it needs to follow
|
|
27
|
+
4. **Working directory** — if different from current
|
|
28
|
+
|
|
29
|
+
tool-worker manages its own TODO files in `.flow-agents/<slug>/` and tracks `modified_files` to detect conflicts with other parallel workers. It will end its turn immediately if instructions are insufficient rather than guessing.
|
|
30
|
+
|
|
31
|
+
## Conflict Avoidance
|
|
32
|
+
|
|
33
|
+
- tool-worker checks `.flow-agents/` for in-progress work from other instances
|
|
34
|
+
- If file overlap is detected, it flags the conflict and may use `git worktree` isolation
|
|
35
|
+
- When spawning multiple tool-worker instances, ensure their file scopes don't overlap
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Git Worktree Isolation
|
|
2
|
+
|
|
3
|
+
When working on tasks that overlap with in-progress work from other sessions, use git worktrees to avoid conflicts.
|
|
4
|
+
|
|
5
|
+
## When to Use Worktrees
|
|
6
|
+
|
|
7
|
+
- Check existing TODO lists for incomplete work
|
|
8
|
+
- Compare your target files against `modified_files` in active TODOs
|
|
9
|
+
- If files overlap with another TODO's active changes, create a worktree
|
|
10
|
+
- If no overlap exists, work directly in the main tree
|
|
11
|
+
|
|
12
|
+
## Worktree Workflow
|
|
13
|
+
|
|
14
|
+
1. Create: `git worktree add ../worktree/kiro-<todo-id>-<feature> -b feat/<feature>`
|
|
15
|
+
2. Do all implementation work in the worktree path
|
|
16
|
+
3. On completion, attempt `git merge` back to the working branch
|
|
17
|
+
4. If merge conflicts arise, surface them to the user for resolution
|
|
18
|
+
5. Only clean up the worktree after a successful merge
|
|
19
|
+
|
|
20
|
+
## TODO Awareness
|
|
21
|
+
|
|
22
|
+
- Incomplete TODOs = active work — expect broken builds or partial implementations in those areas
|
|
23
|
+
- Always check for overlap before starting work
|
|
24
|
+
- If your task relates to an existing TODO, ask the user whether to continue it or start fresh
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Development Workflow
|
|
2
|
+
|
|
3
|
+
Standard workflow for all dev agent tasks. Steps are sequential — do not skip.
|
|
4
|
+
|
|
5
|
+
## 0. Research & Reuse (mandatory)
|
|
6
|
+
|
|
7
|
+
Before writing new code, search for existing solutions:
|
|
8
|
+
- Codebase: grep/code search for similar logic already implemented
|
|
9
|
+
- Package registries: npm, PyPI, crates.io for proven libraries
|
|
10
|
+
- GitHub: public repos, code search for patterns and approaches
|
|
11
|
+
|
|
12
|
+
Prefer adopting proven solutions over writing net-new. Use the `search-first` skill for structured research when the decision isn't obvious.
|
|
13
|
+
|
|
14
|
+
## 1. Plan
|
|
15
|
+
|
|
16
|
+
Use `plan-work` skill or `tool-planner` agent. Produce a plan artifact that covers:
|
|
17
|
+
- Files to create/modify with specific changes
|
|
18
|
+
- Dependencies and risks
|
|
19
|
+
- Phased execution (waves for parallelization)
|
|
20
|
+
|
|
21
|
+
## 2. TDD
|
|
22
|
+
|
|
23
|
+
Write tests first, then implement, then refactor:
|
|
24
|
+
- **RED** — write failing tests that define expected behavior
|
|
25
|
+
- **GREEN** — write minimum code to pass
|
|
26
|
+
- **IMPROVE** — refactor without changing behavior
|
|
27
|
+
|
|
28
|
+
Target 80%+ coverage. Use `tdd-workflow` skill for structured TDD.
|
|
29
|
+
|
|
30
|
+
## 3. Code Review
|
|
31
|
+
|
|
32
|
+
Use `review-work` for automated critique. It delegates to `tool-code-reviewer` for quality, standards, and architecture fit, and to `tool-security-reviewer` when security triggers are present.
|
|
33
|
+
- Address all CRITICAL and HIGH severity issues before proceeding
|
|
34
|
+
- LOW/INFO items are advisory — fix if trivial, otherwise note and move on
|
|
35
|
+
|
|
36
|
+
## 4. Verify
|
|
37
|
+
|
|
38
|
+
Use `verify-work` skill for functional verification and evidence:
|
|
39
|
+
- Build succeeds
|
|
40
|
+
- Type checking passes
|
|
41
|
+
- Linter clean
|
|
42
|
+
- All tests pass
|
|
43
|
+
- No security vulnerabilities introduced
|
|
44
|
+
|
|
45
|
+
## 5. Commit
|
|
46
|
+
|
|
47
|
+
Follow Conventional Commits per AGENTS.md:
|
|
48
|
+
- Format: `<type>(<scope>): <description>`
|
|
49
|
+
- Lowercase, imperative, no period, under 72 chars
|
|
50
|
+
- Append `!` for breaking changes
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# budget-scan.sh — Scan Flow Agents bundles for token overhead estimation
|
|
3
|
+
# Usage: bash budget-scan.sh [--verbose]
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
BUNDLE_DIR="${FLOW_AGENTS_BUNDLE_DIR:-${HOME}/.flow-agents}"
|
|
7
|
+
VERBOSE=false
|
|
8
|
+
[[ "${1:-}" == "--verbose" ]] && VERBOSE=true
|
|
9
|
+
|
|
10
|
+
# Handle missing bundle dir gracefully
|
|
11
|
+
if [[ ! -d "$BUNDLE_DIR" ]]; then
|
|
12
|
+
echo '{"packages":[],"issues":[],"totals":{"context":0,"skills":0,"agents":0,"total":0}}'
|
|
13
|
+
exit 0
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
# Collect all bundle directories (top-level + local/)
|
|
17
|
+
_pkg_dirs=()
|
|
18
|
+
for d in "${BUNDLE_DIR}"/*/; do
|
|
19
|
+
[[ ! -d "$d" ]] && continue
|
|
20
|
+
base=$(basename "$d")
|
|
21
|
+
if [[ "$base" == "local" ]]; then
|
|
22
|
+
for ld in "${d}"*/; do
|
|
23
|
+
[[ -d "$ld" ]] && _pkg_dirs+=("$ld")
|
|
24
|
+
done
|
|
25
|
+
else
|
|
26
|
+
_pkg_dirs+=("$d")
|
|
27
|
+
fi
|
|
28
|
+
done
|
|
29
|
+
|
|
30
|
+
estimate_tokens() {
|
|
31
|
+
local file="$1"
|
|
32
|
+
[[ ! -f "$file" ]] && echo 0 && return
|
|
33
|
+
local words chars
|
|
34
|
+
words=$(wc -w < "$file" 2>/dev/null | tr -d ' ')
|
|
35
|
+
chars=$(wc -c < "$file" 2>/dev/null | tr -d ' ')
|
|
36
|
+
case "$file" in
|
|
37
|
+
*.sh|*.json) echo $(( chars / 4 )) ;;
|
|
38
|
+
*) echo $(( (words * 13 + 9) / 10 )) ;;
|
|
39
|
+
esac
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
count_lines() {
|
|
43
|
+
local file="$1"
|
|
44
|
+
[[ ! -f "$file" ]] && echo 0 && return
|
|
45
|
+
wc -l < "$file" 2>/dev/null | tr -d ' '
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
skill_desc_words() {
|
|
49
|
+
local file="$1"
|
|
50
|
+
[[ ! -f "$file" ]] && echo 0 && return
|
|
51
|
+
sed -n '/^---$/,/^---$/p' "$file" | grep -i 'description' | head -1 | wc -w | tr -d ' '
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
count_mcp_servers() {
|
|
55
|
+
local file="$1"
|
|
56
|
+
jq '[.mcpServers // {} | keys | length] | add // 0' "$file" 2>/dev/null || echo 0
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
count_tools() {
|
|
60
|
+
local file="$1"
|
|
61
|
+
jq '[.tools // [] | length] | add // 0' "$file" 2>/dev/null || echo 0
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
prompt_lines() {
|
|
65
|
+
local file="$1"
|
|
66
|
+
case "$file" in
|
|
67
|
+
*.json)
|
|
68
|
+
jq -r '.systemPrompt // .prompt // .developer_instructions // ""' "$file" 2>/dev/null | wc -l | tr -d ' '
|
|
69
|
+
;;
|
|
70
|
+
*.toml)
|
|
71
|
+
# Codex agent TOML stores instructions as escaped newlines in one string.
|
|
72
|
+
awk -F' = ' '/^(developer_instructions|instructions|prompt) = / {print $2}' "$file" \
|
|
73
|
+
| sed 's/^"//; s/"$//' \
|
|
74
|
+
| perl -pe 's/\\n/\n/g' \
|
|
75
|
+
| wc -l | tr -d ' '
|
|
76
|
+
;;
|
|
77
|
+
*)
|
|
78
|
+
echo 0
|
|
79
|
+
;;
|
|
80
|
+
esac
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
packages_json='[]'
|
|
84
|
+
issues_json='[]'
|
|
85
|
+
|
|
86
|
+
for pkg_dir in "${_pkg_dirs[@]}"; do
|
|
87
|
+
[[ ! -d "$pkg_dir" ]] && continue
|
|
88
|
+
pkg_name=$(basename "$pkg_dir")
|
|
89
|
+
|
|
90
|
+
context_tokens=0
|
|
91
|
+
skill_tokens=0
|
|
92
|
+
agent_tokens=0
|
|
93
|
+
files_json='[]'
|
|
94
|
+
|
|
95
|
+
# Scan context files
|
|
96
|
+
while IFS= read -r -d '' f; do
|
|
97
|
+
tokens=$(estimate_tokens "$f")
|
|
98
|
+
lines=$(count_lines "$f")
|
|
99
|
+
context_tokens=$((context_tokens + tokens))
|
|
100
|
+
rel="${f#"$pkg_dir"}"
|
|
101
|
+
if $VERBOSE; then
|
|
102
|
+
files_json=$(echo "$files_json" | jq -c --arg p "$rel" --argjson t "$tokens" --argjson l "$lines" '. + [{path:$p,tokens:$t,lines:$l,type:"context"}]')
|
|
103
|
+
fi
|
|
104
|
+
if [[ "$lines" -gt 100 ]]; then
|
|
105
|
+
issues_json=$(echo "$issues_json" | jq -c --arg p "${pkg_name}/${rel}" --argjson l "$lines" '. + [{type:"context_bloat",path:$p,lines:$l,suggestion:"Consider moving to context/deferred/ or splitting"}]')
|
|
106
|
+
fi
|
|
107
|
+
done < <(find "${pkg_dir}context" -name '*.md' -print0 2>/dev/null || true)
|
|
108
|
+
|
|
109
|
+
# Scan skills
|
|
110
|
+
while IFS= read -r -d '' f; do
|
|
111
|
+
tokens=$(estimate_tokens "$f")
|
|
112
|
+
desc_words=$(skill_desc_words "$f")
|
|
113
|
+
skill_tokens=$((skill_tokens + tokens))
|
|
114
|
+
rel="${f#"$pkg_dir"}"
|
|
115
|
+
if $VERBOSE; then
|
|
116
|
+
files_json=$(echo "$files_json" | jq -c --arg p "$rel" --argjson t "$tokens" --argjson dw "$desc_words" '. + [{path:$p,tokens:$t,desc_words:$dw,type:"skill"}]')
|
|
117
|
+
fi
|
|
118
|
+
if [[ "$desc_words" -gt 30 ]]; then
|
|
119
|
+
issues_json=$(echo "$issues_json" | jq -c --arg p "${pkg_name}/${rel}" --argjson w "$desc_words" '. + [{type:"bloated_skill_desc",path:$p,words:$w,suggestion:"Trim description to under 30 words"}]')
|
|
120
|
+
fi
|
|
121
|
+
done < <(find "${pkg_dir}skills" -name 'SKILL.md' -print0 2>/dev/null || true)
|
|
122
|
+
|
|
123
|
+
# Scan agent specs
|
|
124
|
+
while IFS= read -r -d '' f; do
|
|
125
|
+
tokens=$(estimate_tokens "$f")
|
|
126
|
+
pl=$(prompt_lines "$f")
|
|
127
|
+
mcp=$(count_mcp_servers "$f")
|
|
128
|
+
tools=$(count_tools "$f")
|
|
129
|
+
agent_tokens=$((agent_tokens + tokens))
|
|
130
|
+
rel="${f#"$pkg_dir"}"
|
|
131
|
+
if $VERBOSE; then
|
|
132
|
+
files_json=$(echo "$files_json" | jq -c --arg p "$rel" --argjson t "$tokens" --argjson pl "$pl" --argjson mcp "$mcp" --argjson tools "$tools" '. + [{path:$p,tokens:$t,prompt_lines:$pl,mcp_servers:$mcp,tools:$tools,type:"agent"}]')
|
|
133
|
+
fi
|
|
134
|
+
if [[ "$pl" -gt 200 ]]; then
|
|
135
|
+
issues_json=$(echo "$issues_json" | jq -c --arg p "${pkg_name}/${rel}" --argjson l "$pl" '. + [{type:"heavy_agent_spec",path:$p,prompt_lines:$l,suggestion:"Reduce systemPrompt or move to context file"}]')
|
|
136
|
+
fi
|
|
137
|
+
if [[ "$mcp" -gt 10 ]] || [[ "$tools" -gt 50 ]]; then
|
|
138
|
+
issues_json=$(echo "$issues_json" | jq -c --arg p "${pkg_name}/${rel}" --argjson m "$mcp" --argjson t "$tools" '. + [{type:"mcp_oversubscription",path:$p,mcp_servers:$m,tools:$t,suggestion:"Reduce MCP servers or tools per agent"}]')
|
|
139
|
+
fi
|
|
140
|
+
done < <(find "${pkg_dir}agents" \( -name '*agent-spec.json' -o -name '*.json' -o -name '*.toml' \) -print0 2>/dev/null || true)
|
|
141
|
+
|
|
142
|
+
total=$((context_tokens + skill_tokens + agent_tokens))
|
|
143
|
+
pkg_entry=$(jq -nc \
|
|
144
|
+
--arg name "$pkg_name" \
|
|
145
|
+
--argjson context "$context_tokens" \
|
|
146
|
+
--argjson skills "$skill_tokens" \
|
|
147
|
+
--argjson agents "$agent_tokens" \
|
|
148
|
+
--argjson total "$total" \
|
|
149
|
+
--argjson files "$files_json" \
|
|
150
|
+
'{name:$name,tokens:{context:$context,skills:$skills,agents:$agents,total:$total},files:$files}')
|
|
151
|
+
packages_json=$(echo "$packages_json" | jq -c --argjson p "$pkg_entry" '. + [$p]')
|
|
152
|
+
done
|
|
153
|
+
|
|
154
|
+
total_context=$(echo "$packages_json" | jq '[.[].tokens.context] | add // 0')
|
|
155
|
+
total_skills=$(echo "$packages_json" | jq '[.[].tokens.skills] | add // 0')
|
|
156
|
+
total_agents=$(echo "$packages_json" | jq '[.[].tokens.agents] | add // 0')
|
|
157
|
+
total_all=$(echo "$packages_json" | jq '[.[].tokens.total] | add // 0')
|
|
158
|
+
|
|
159
|
+
jq -nc \
|
|
160
|
+
--argjson packages "$packages_json" \
|
|
161
|
+
--argjson issues "$issues_json" \
|
|
162
|
+
--argjson tc "$total_context" \
|
|
163
|
+
--argjson ts "$total_skills" \
|
|
164
|
+
--argjson ta "$total_agents" \
|
|
165
|
+
--argjson tt "$total_all" \
|
|
166
|
+
'{packages:$packages,issues:$issues,totals:{context:$tc,skills:$ts,agents:$ta,total:$tt}}'
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Spawn hook: discover agent cards from the repo, installed bundle, or legacy root file.
|
|
3
|
+
echo "=== Agent Card Discovery ==="
|
|
4
|
+
FOUND=0
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
7
|
+
shopt -s nullglob
|
|
8
|
+
cards=(
|
|
9
|
+
"$ROOT_DIR"/agent-cards/*.json
|
|
10
|
+
"$HOME"/.flow-agents/agent-cards/*.json
|
|
11
|
+
"$HOME"/.flow-agents/agent-card.json
|
|
12
|
+
)
|
|
13
|
+
for card in "${cards[@]}"; do
|
|
14
|
+
[ -f "$card" ] || continue
|
|
15
|
+
FOUND=$((FOUND + 1))
|
|
16
|
+
name=$(node -e "const d=require(process.argv[1]); process.stdout.write(d.name||'?')" "$card" 2>/dev/null)
|
|
17
|
+
agent=$(node -e "const d=require(process.argv[1]); process.stdout.write(d.agent||'?')" "$card" 2>/dev/null)
|
|
18
|
+
desc=$(node -e "const d=require(process.argv[1]); process.stdout.write(d.description||'')" "$card" 2>/dev/null)
|
|
19
|
+
echo ""
|
|
20
|
+
echo "📋 $name (agent: $agent)"
|
|
21
|
+
echo " $desc"
|
|
22
|
+
done
|
|
23
|
+
if [ "$FOUND" -eq 0 ]; then
|
|
24
|
+
echo "No agent cards found."
|
|
25
|
+
else
|
|
26
|
+
echo ""
|
|
27
|
+
echo "Discovered $FOUND orchestrator(s)."
|
|
28
|
+
fi
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Spawn hook: git status + worktree context for parallel safety
|
|
3
|
+
|
|
4
|
+
if ! git rev-parse --is-inside-work-tree &>/dev/null; then
|
|
5
|
+
echo "📁 Not a git repository — skipping git context"
|
|
6
|
+
exit 0
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
# Basic status
|
|
10
|
+
echo "=== Git Status ==="
|
|
11
|
+
git status --short
|
|
12
|
+
|
|
13
|
+
# Branch/worktree context
|
|
14
|
+
echo ""
|
|
15
|
+
echo "=== Branch ==="
|
|
16
|
+
git branch --show-current
|
|
17
|
+
|
|
18
|
+
# Detect if we're in a worktree (not the main working tree)
|
|
19
|
+
TOPLEVEL=$(git rev-parse --show-toplevel)
|
|
20
|
+
COMMON=$(git rev-parse --git-common-dir)
|
|
21
|
+
GIT_DIR=$(git rev-parse --git-dir)
|
|
22
|
+
|
|
23
|
+
if [ "$GIT_DIR" != "$COMMON" ]; then
|
|
24
|
+
echo "⚠️ Running inside a git worktree: $TOPLEVEL"
|
|
25
|
+
echo " Main repo: $(cd "$COMMON/.." && pwd)"
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# List active worktrees for conflict awareness
|
|
29
|
+
WORKTREE_COUNT=$(git worktree list | wc -l | tr -d ' ')
|
|
30
|
+
if [ "$WORKTREE_COUNT" -gt 1 ]; then
|
|
31
|
+
echo ""
|
|
32
|
+
echo "=== Active Worktrees ($WORKTREE_COUNT) ==="
|
|
33
|
+
git worktree list
|
|
34
|
+
echo ""
|
|
35
|
+
echo "⚠️ Multiple worktrees active — check .flow-agents/ for in-progress tasks before modifying shared files"
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# List existing TODOs for awareness
|
|
39
|
+
TODO_DIR=".flow-agents"
|
|
40
|
+
if [ -d "$TODO_DIR" ]; then
|
|
41
|
+
TODO_COUNT=$(find "$TODO_DIR" -name "*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
42
|
+
if [ "$TODO_COUNT" -gt 0 ]; then
|
|
43
|
+
echo ""
|
|
44
|
+
echo "=== Active TODOs ($TODO_COUNT) ==="
|
|
45
|
+
while IFS= read -r f; do
|
|
46
|
+
[ -f "$f" ] && echo " - $(basename "$f" .md): $(head -1 "$f")"
|
|
47
|
+
done < <(find "$TODO_DIR" -mindepth 2 -maxdepth 2 -name "*.md" 2>/dev/null | sort)
|
|
48
|
+
fi
|
|
49
|
+
fi
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Config Protection Hook
|
|
4
|
+
*
|
|
5
|
+
* Blocks modifications to linter/formatter config files.
|
|
6
|
+
* Steers the agent to fix source code instead of weakening configs.
|
|
7
|
+
*
|
|
8
|
+
* Exit codes: 0 = allow, 2 = block
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
const MAX_STDIN = 1024 * 1024;
|
|
16
|
+
|
|
17
|
+
const PROTECTED_FILES = new Set([
|
|
18
|
+
'.eslintrc', '.eslintrc.js', '.eslintrc.cjs', '.eslintrc.json', '.eslintrc.yml', '.eslintrc.yaml',
|
|
19
|
+
'eslint.config.js', 'eslint.config.mjs', 'eslint.config.cjs', 'eslint.config.ts', 'eslint.config.mts', 'eslint.config.cts',
|
|
20
|
+
'.prettierrc', '.prettierrc.js', '.prettierrc.cjs', '.prettierrc.json', '.prettierrc.yml', '.prettierrc.yaml',
|
|
21
|
+
'prettier.config.js', 'prettier.config.cjs', 'prettier.config.mjs',
|
|
22
|
+
'biome.json', 'biome.jsonc',
|
|
23
|
+
'.ruff.toml', 'ruff.toml',
|
|
24
|
+
'.shellcheckrc', '.stylelintrc', '.stylelintrc.json', '.stylelintrc.yml',
|
|
25
|
+
'.markdownlint.json', '.markdownlint.yaml', '.markdownlintrc',
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
function run(inputOrRaw, options = {}) {
|
|
29
|
+
if (options.truncated) {
|
|
30
|
+
return {
|
|
31
|
+
exitCode: 2,
|
|
32
|
+
stderr: `BLOCKED: Hook input exceeded ${options.maxStdin || MAX_STDIN} bytes. ` +
|
|
33
|
+
'Refusing to bypass config-protection on a truncated payload.',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let input;
|
|
38
|
+
try {
|
|
39
|
+
input = typeof inputOrRaw === 'string' ? JSON.parse(inputOrRaw) : inputOrRaw;
|
|
40
|
+
} catch { return { exitCode: 0 }; }
|
|
41
|
+
|
|
42
|
+
const filePath = input?.tool_input?.path || input?.tool_input?.file_path || '';
|
|
43
|
+
if (!filePath) return { exitCode: 0 };
|
|
44
|
+
|
|
45
|
+
const basename = path.basename(filePath);
|
|
46
|
+
if (PROTECTED_FILES.has(basename)) {
|
|
47
|
+
return {
|
|
48
|
+
exitCode: 2,
|
|
49
|
+
stderr: `BLOCKED: Modifying ${basename} is not allowed. ` +
|
|
50
|
+
'Fix the source code to satisfy linter/formatter rules instead of ' +
|
|
51
|
+
'weakening the config. If this is a legitimate config change, ' +
|
|
52
|
+
'disable the config-protection hook temporarily.',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return { exitCode: 0 };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
module.exports = { run };
|
|
60
|
+
|
|
61
|
+
// Stdin fallback for spawnSync execution
|
|
62
|
+
if (require.main === module) {
|
|
63
|
+
let raw = '';
|
|
64
|
+
let truncated = /^(1|true|yes)$/i.test(String(process.env.SA_HOOK_INPUT_TRUNCATED || ''));
|
|
65
|
+
process.stdin.setEncoding('utf8');
|
|
66
|
+
process.stdin.on('data', chunk => {
|
|
67
|
+
if (raw.length < MAX_STDIN) {
|
|
68
|
+
const remaining = MAX_STDIN - raw.length;
|
|
69
|
+
raw += chunk.substring(0, remaining);
|
|
70
|
+
if (chunk.length > remaining) truncated = true;
|
|
71
|
+
} else { truncated = true; }
|
|
72
|
+
});
|
|
73
|
+
process.stdin.on('end', () => {
|
|
74
|
+
const result = run(raw, { truncated, maxStdin: Number(process.env.SA_HOOK_INPUT_MAX_BYTES) || MAX_STDIN });
|
|
75
|
+
if (result.stderr) process.stderr.write(result.stderr + '\n');
|
|
76
|
+
if (result.exitCode === 2) process.exit(2);
|
|
77
|
+
process.stdout.write(raw);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# desktop-notify.sh — macOS desktop notification on agent session stop
|
|
3
|
+
# Usage: echo '<hook_event_json>' | bash desktop-notify.sh stop <agent_name>
|
|
4
|
+
# Non-blocking: wraps osascript in background subshell
|
|
5
|
+
|
|
6
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
TELEMETRY_DIR="$(cd "${SCRIPT_DIR}/../telemetry" && pwd)"
|
|
8
|
+
source "${TELEMETRY_DIR}/lib/config.sh"
|
|
9
|
+
|
|
10
|
+
main() {
|
|
11
|
+
# Feature gate
|
|
12
|
+
[[ "$TELEMETRY_NOTIFICATIONS" != "true" ]] && return 0
|
|
13
|
+
|
|
14
|
+
# Profile gate
|
|
15
|
+
case "$TELEMETRY_NOTIFICATION_PROFILE" in
|
|
16
|
+
standard|strict) ;;
|
|
17
|
+
*) return 0 ;;
|
|
18
|
+
esac
|
|
19
|
+
|
|
20
|
+
local hook_type="${1:-stop}" agent_name="${2:-agent}"
|
|
21
|
+
local stdin_json="$3"
|
|
22
|
+
|
|
23
|
+
# Extract summary from last_assistant_message
|
|
24
|
+
local summary
|
|
25
|
+
summary=$(echo "$stdin_json" | jq -r '.last_assistant_message // ""' 2>/dev/null)
|
|
26
|
+
# Take first non-empty line
|
|
27
|
+
summary=$(echo "$summary" | grep -m1 '.' || echo "Session complete")
|
|
28
|
+
# Truncate to 100 chars
|
|
29
|
+
[[ ${#summary} -gt 100 ]] && summary="${summary:0:100}..."
|
|
30
|
+
|
|
31
|
+
# Send notification (async, non-blocking)
|
|
32
|
+
osascript -e "display notification \"${summary//\"/\\\"}\" with title \"Kiro — ${agent_name}\"" &>/dev/null &
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
_stdin=$(cat)
|
|
36
|
+
echo "$_stdin"
|
|
37
|
+
(main "$@" "$_stdin") </dev/null &>/dev/null &
|
|
38
|
+
disown 2>/dev/null
|
|
39
|
+
exit 0
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# governance-audit.sh — Governance detection hook for preToolUse/postToolUse
|
|
3
|
+
# Usage: echo '<hook_event_json>' | bash governance-audit.sh <hookType> <agentName>
|
|
4
|
+
set -o pipefail
|
|
5
|
+
|
|
6
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
TELEMETRY_DIR="$(cd "${SCRIPT_DIR}/../telemetry" && pwd)"
|
|
8
|
+
|
|
9
|
+
source "${TELEMETRY_DIR}/lib/config.sh"
|
|
10
|
+
source "${SCRIPT_DIR}/lib/patterns.sh"
|
|
11
|
+
source "${SCRIPT_DIR}/lib/audit-transport.sh"
|
|
12
|
+
|
|
13
|
+
# Max input size to inspect (bytes) — truncate beyond this
|
|
14
|
+
MAX_INSPECT_SIZE=50000
|
|
15
|
+
|
|
16
|
+
_build_event() {
|
|
17
|
+
local finding_type="$1" severity="$2" tool_name="$3" hook_phase="$4" details="$5"
|
|
18
|
+
local session_id agent_name="$6"
|
|
19
|
+
session_id=$(ls -t "${TELEMETRY_SESSION_DIR}"/*.session 2>/dev/null | head -n1 | xargs -I{} jq -r '.session_id' {} 2>/dev/null || echo "no-session")
|
|
20
|
+
local event_id timestamp_ms
|
|
21
|
+
event_id="gov-$(date +%s)-$(head -c4 /dev/urandom 2>/dev/null | od -An -tx1 | tr -d ' \n' || echo $$)"
|
|
22
|
+
timestamp_ms=$(date +%s)000
|
|
23
|
+
|
|
24
|
+
jq -nc \
|
|
25
|
+
--arg sv "0.3.0" \
|
|
26
|
+
--arg ts "$timestamp_ms" \
|
|
27
|
+
--arg sid "$session_id" \
|
|
28
|
+
--arg eid "$event_id" \
|
|
29
|
+
--arg et "governance.${finding_type}" \
|
|
30
|
+
--arg an "$agent_name" \
|
|
31
|
+
--arg ft "$finding_type" \
|
|
32
|
+
--arg sev "$severity" \
|
|
33
|
+
--arg tn "$tool_name" \
|
|
34
|
+
--arg hp "$hook_phase" \
|
|
35
|
+
--argjson det "$details" \
|
|
36
|
+
'{
|
|
37
|
+
schema_version: $sv,
|
|
38
|
+
timestamp: $ts,
|
|
39
|
+
session_id: $sid,
|
|
40
|
+
event_id: $eid,
|
|
41
|
+
event_type: $et,
|
|
42
|
+
agent: {name: $an, runtime: "kiro-cli"},
|
|
43
|
+
governance: {finding_type: $ft, severity: $sev, tool_name: $tn, hook_phase: $hp, details: $det}
|
|
44
|
+
}'
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
main() {
|
|
48
|
+
[[ "$TELEMETRY_GOVERNANCE" != "true" ]] && return 0
|
|
49
|
+
|
|
50
|
+
local hook_type="${1:-preToolUse}" agent_name="${2:-unknown}"
|
|
51
|
+
local stdin_json="$3"
|
|
52
|
+
local hook_phase
|
|
53
|
+
case "$hook_type" in
|
|
54
|
+
preToolUse) hook_phase="pre" ;;
|
|
55
|
+
postToolUse) hook_phase="post" ;;
|
|
56
|
+
*) return 0 ;;
|
|
57
|
+
esac
|
|
58
|
+
|
|
59
|
+
local tool_name text
|
|
60
|
+
tool_name=$(echo "$stdin_json" | jq -r '.tool_name // ""' 2>/dev/null)
|
|
61
|
+
|
|
62
|
+
# Combine tool_input and tool_response for scanning
|
|
63
|
+
local tool_input tool_response
|
|
64
|
+
tool_input=$(echo "$stdin_json" | jq -r '.tool_input // "" | if type == "object" then tostring else . end' 2>/dev/null)
|
|
65
|
+
tool_response=$(echo "$stdin_json" | jq -r '.tool_response // "" | if type == "object" then tostring else . end' 2>/dev/null)
|
|
66
|
+
text="${tool_input}${tool_response}"
|
|
67
|
+
|
|
68
|
+
# Truncation check
|
|
69
|
+
if [[ ${#text} -gt $MAX_INSPECT_SIZE ]]; then
|
|
70
|
+
local trunc_event
|
|
71
|
+
trunc_event=$(_build_event "audit_input_truncated" "warning" "$tool_name" "$hook_phase" \
|
|
72
|
+
"{\"original_size\":${#text},\"max_size\":${MAX_INSPECT_SIZE}}" "$agent_name")
|
|
73
|
+
audit_emit "$trunc_event"
|
|
74
|
+
text="${text:0:$MAX_INSPECT_SIZE}"
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
# Secret detection
|
|
78
|
+
local secrets
|
|
79
|
+
secrets=$(_detect_secrets "$text")
|
|
80
|
+
if [[ -n "$secrets" ]]; then
|
|
81
|
+
local types_json location
|
|
82
|
+
types_json=$(echo "$secrets" | jq -Rsc 'split("\n") | map(select(. != ""))')
|
|
83
|
+
[[ "$hook_phase" == "pre" ]] && location="input" || location="output"
|
|
84
|
+
local evt
|
|
85
|
+
evt=$(_build_event "secret_detected" "critical" "$tool_name" "$hook_phase" \
|
|
86
|
+
"{\"secret_types\":${types_json},\"location\":\"${location}\"}" "$agent_name")
|
|
87
|
+
audit_emit "$evt"
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# AWS policy violations
|
|
91
|
+
local violations
|
|
92
|
+
violations=$(_detect_aws_violations "$text")
|
|
93
|
+
if [[ -n "$violations" ]]; then
|
|
94
|
+
local vtypes_json
|
|
95
|
+
vtypes_json=$(echo "$violations" | jq -Rsc 'split("\n") | map(select(. != ""))')
|
|
96
|
+
local evt
|
|
97
|
+
evt=$(_build_event "aws_policy_violation" "critical" "$tool_name" "$hook_phase" \
|
|
98
|
+
"{\"violation_types\":${vtypes_json}}" "$agent_name")
|
|
99
|
+
audit_emit "$evt"
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# Destructive operations (primarily preToolUse on bash commands)
|
|
103
|
+
if _detect_destructive_ops "$text"; then
|
|
104
|
+
local evt
|
|
105
|
+
evt=$(_build_event "destructive_operation" "high" "$tool_name" "$hook_phase" \
|
|
106
|
+
'{"location":"command"}' "$agent_name")
|
|
107
|
+
audit_emit "$evt"
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
# Sensitive file access (preToolUse on file writes)
|
|
111
|
+
local file_path
|
|
112
|
+
file_path=$(echo "$stdin_json" | jq -r '.tool_input.path // .tool_input.file_path // ""' 2>/dev/null)
|
|
113
|
+
if [[ -n "$file_path" ]] && _detect_sensitive_paths "$file_path"; then
|
|
114
|
+
local evt
|
|
115
|
+
evt=$(_build_event "sensitive_file_access" "warning" "$tool_name" "$hook_phase" \
|
|
116
|
+
"{\"path\":\"${file_path}\"}" "$agent_name")
|
|
117
|
+
audit_emit "$evt"
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
# Elevated privilege
|
|
121
|
+
if _detect_elevated_privilege "$text"; then
|
|
122
|
+
local evt
|
|
123
|
+
evt=$(_build_event "elevated_privilege" "medium" "$tool_name" "$hook_phase" \
|
|
124
|
+
'{"location":"command"}' "$agent_name")
|
|
125
|
+
audit_emit "$evt"
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
audit_maybe_rotate
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
_stdin=$(cat)
|
|
132
|
+
echo "$_stdin"
|
|
133
|
+
(main "$@" "$_stdin") </dev/null &>/dev/null &
|
|
134
|
+
disown 2>/dev/null
|
|
135
|
+
exit 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# audit-transport.sh — Audit-specific JSONL transport (separate from telemetry channels)
|
|
3
|
+
|
|
4
|
+
audit_emit() {
|
|
5
|
+
local event_json="$1"
|
|
6
|
+
[[ -z "$event_json" ]] && return
|
|
7
|
+
local audit_file="${TELEMETRY_DATA_DIR}/audit.jsonl"
|
|
8
|
+
echo "$event_json" >> "$audit_file" 2>/dev/null
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
audit_maybe_rotate() {
|
|
12
|
+
local audit_file="${TELEMETRY_DATA_DIR}/audit.jsonl"
|
|
13
|
+
[[ ! -f "$audit_file" ]] && return
|
|
14
|
+
|
|
15
|
+
local file_size_bytes=0
|
|
16
|
+
if stat -c %s "$audit_file" >/dev/null 2>&1; then
|
|
17
|
+
file_size_bytes=$(stat -c %s "$audit_file")
|
|
18
|
+
else
|
|
19
|
+
file_size_bytes=$(stat -f %z "$audit_file" 2>/dev/null || echo "0")
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
local max_bytes=$(( TELEMETRY_GOVERNANCE_AUDIT_MAX_SIZE_MB * 1024 * 1024 ))
|
|
23
|
+
[[ "$file_size_bytes" -lt "$max_bytes" ]] && return
|
|
24
|
+
|
|
25
|
+
local base="${audit_file%.*}"
|
|
26
|
+
local ext="${audit_file##*.}"
|
|
27
|
+
|
|
28
|
+
# Remove oldest
|
|
29
|
+
local oldest="${base}.$((TELEMETRY_GOVERNANCE_AUDIT_MAX_FILES - 1)).${ext}"
|
|
30
|
+
[[ -f "$oldest" ]] && rm -f "$oldest"
|
|
31
|
+
|
|
32
|
+
# Shift existing
|
|
33
|
+
for ((i = TELEMETRY_GOVERNANCE_AUDIT_MAX_FILES - 2; i >= 1; i--)); do
|
|
34
|
+
local cur="${base}.${i}.${ext}"
|
|
35
|
+
local nxt="${base}.$((i + 1)).${ext}"
|
|
36
|
+
[[ -f "$cur" ]] && mv "$cur" "$nxt"
|
|
37
|
+
done
|
|
38
|
+
|
|
39
|
+
mv "$audit_file" "${base}.1.${ext}"
|
|
40
|
+
}
|