@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,172 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://flow-agents.dev/schemas/workflow-release.schema.json",
|
|
4
|
+
"title": "Flow Agents Workflow Release Readiness",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"schema_version",
|
|
9
|
+
"task_slug",
|
|
10
|
+
"decision",
|
|
11
|
+
"updated_at",
|
|
12
|
+
"scope",
|
|
13
|
+
"evidence_ref",
|
|
14
|
+
"gates",
|
|
15
|
+
"rollback_plan",
|
|
16
|
+
"observability_plan",
|
|
17
|
+
"post_deploy_checks",
|
|
18
|
+
"docs"
|
|
19
|
+
],
|
|
20
|
+
"properties": {
|
|
21
|
+
"schema_version": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"const": "1.0"
|
|
24
|
+
},
|
|
25
|
+
"task_slug": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1
|
|
28
|
+
},
|
|
29
|
+
"repo": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"minLength": 1
|
|
32
|
+
},
|
|
33
|
+
"decision": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"enum": ["merge", "release", "deploy", "hold", "rollback_required"]
|
|
36
|
+
},
|
|
37
|
+
"updated_at": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"format": "date-time"
|
|
40
|
+
},
|
|
41
|
+
"scope": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"minLength": 1
|
|
44
|
+
},
|
|
45
|
+
"evidence_ref": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"minLength": 1
|
|
48
|
+
},
|
|
49
|
+
"gates": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"minItems": 1,
|
|
52
|
+
"items": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"additionalProperties": false,
|
|
55
|
+
"required": ["name", "status", "summary"],
|
|
56
|
+
"properties": {
|
|
57
|
+
"name": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"enum": ["merge", "release", "deploy", "post_deploy", "docs"]
|
|
60
|
+
},
|
|
61
|
+
"status": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"enum": ["pass", "hold", "not_required", "not_verified"]
|
|
64
|
+
},
|
|
65
|
+
"summary": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"minLength": 1
|
|
68
|
+
},
|
|
69
|
+
"evidence_refs": {
|
|
70
|
+
"type": "array",
|
|
71
|
+
"items": {
|
|
72
|
+
"type": "string"
|
|
73
|
+
},
|
|
74
|
+
"uniqueItems": true
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"rollback_plan": {
|
|
80
|
+
"type": "object",
|
|
81
|
+
"additionalProperties": false,
|
|
82
|
+
"required": ["status", "summary", "owner"],
|
|
83
|
+
"properties": {
|
|
84
|
+
"status": {
|
|
85
|
+
"type": "string",
|
|
86
|
+
"enum": ["ready", "not_required", "missing"]
|
|
87
|
+
},
|
|
88
|
+
"summary": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"minLength": 1
|
|
91
|
+
},
|
|
92
|
+
"owner": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"minLength": 1
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"observability_plan": {
|
|
99
|
+
"type": "object",
|
|
100
|
+
"additionalProperties": false,
|
|
101
|
+
"required": ["status", "summary"],
|
|
102
|
+
"properties": {
|
|
103
|
+
"status": {
|
|
104
|
+
"type": "string",
|
|
105
|
+
"enum": ["ready", "not_required", "missing"]
|
|
106
|
+
},
|
|
107
|
+
"summary": {
|
|
108
|
+
"type": "string",
|
|
109
|
+
"minLength": 1
|
|
110
|
+
},
|
|
111
|
+
"signals": {
|
|
112
|
+
"type": "array",
|
|
113
|
+
"items": {
|
|
114
|
+
"type": "string"
|
|
115
|
+
},
|
|
116
|
+
"uniqueItems": true
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"post_deploy_checks": {
|
|
121
|
+
"type": "array",
|
|
122
|
+
"items": {
|
|
123
|
+
"type": "object",
|
|
124
|
+
"additionalProperties": false,
|
|
125
|
+
"required": ["id", "status", "summary"],
|
|
126
|
+
"properties": {
|
|
127
|
+
"id": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"minLength": 1
|
|
130
|
+
},
|
|
131
|
+
"status": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"enum": ["planned", "pass", "fail", "not_required", "not_verified"]
|
|
134
|
+
},
|
|
135
|
+
"summary": {
|
|
136
|
+
"type": "string",
|
|
137
|
+
"minLength": 1
|
|
138
|
+
},
|
|
139
|
+
"evidence_refs": {
|
|
140
|
+
"type": "array",
|
|
141
|
+
"items": {
|
|
142
|
+
"type": "string"
|
|
143
|
+
},
|
|
144
|
+
"uniqueItems": true
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"docs": {
|
|
150
|
+
"type": "object",
|
|
151
|
+
"additionalProperties": false,
|
|
152
|
+
"required": ["status", "summary"],
|
|
153
|
+
"properties": {
|
|
154
|
+
"status": {
|
|
155
|
+
"type": "string",
|
|
156
|
+
"enum": ["updated", "not_needed", "followup_required", "missing"]
|
|
157
|
+
},
|
|
158
|
+
"summary": {
|
|
159
|
+
"type": "string",
|
|
160
|
+
"minLength": 1
|
|
161
|
+
},
|
|
162
|
+
"refs": {
|
|
163
|
+
"type": "array",
|
|
164
|
+
"items": {
|
|
165
|
+
"type": "string"
|
|
166
|
+
},
|
|
167
|
+
"uniqueItems": true
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://flow-agents.dev/schemas/workflow-state.schema.json",
|
|
4
|
+
"title": "Flow Agents Workflow State",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"schema_version",
|
|
9
|
+
"task_slug",
|
|
10
|
+
"status",
|
|
11
|
+
"phase",
|
|
12
|
+
"updated_at",
|
|
13
|
+
"next_action"
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"schema_version": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"const": "1.0"
|
|
19
|
+
},
|
|
20
|
+
"task_slug": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"minLength": 1
|
|
23
|
+
},
|
|
24
|
+
"repo": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"minLength": 1
|
|
27
|
+
},
|
|
28
|
+
"status": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"enum": ["new", "planning", "planned", "in_progress", "blocked", "verifying", "verified", "needs_decision", "not_verified", "failed", "delivered", "accepted", "archived"]
|
|
31
|
+
},
|
|
32
|
+
"phase": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"enum": ["idea", "backlog", "pickup", "planning", "execution", "verification", "goal_fit", "evidence", "release", "learning", "done"]
|
|
35
|
+
},
|
|
36
|
+
"owner": {
|
|
37
|
+
"type": "string"
|
|
38
|
+
},
|
|
39
|
+
"created_at": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"format": "date-time"
|
|
42
|
+
},
|
|
43
|
+
"updated_at": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"format": "date-time"
|
|
46
|
+
},
|
|
47
|
+
"source_request": {
|
|
48
|
+
"type": "string"
|
|
49
|
+
},
|
|
50
|
+
"artifact_paths": {
|
|
51
|
+
"type": "array",
|
|
52
|
+
"items": {
|
|
53
|
+
"type": "string"
|
|
54
|
+
},
|
|
55
|
+
"uniqueItems": true
|
|
56
|
+
},
|
|
57
|
+
"next_action": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"additionalProperties": false,
|
|
60
|
+
"required": ["status", "summary"],
|
|
61
|
+
"properties": {
|
|
62
|
+
"status": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"enum": ["continue", "needs_user", "blocked", "done"]
|
|
65
|
+
},
|
|
66
|
+
"summary": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"minLength": 1
|
|
69
|
+
},
|
|
70
|
+
"target_phase": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"enum": ["idea", "backlog", "pickup", "planning", "execution", "verification", "goal_fit", "evidence", "release", "learning", "done"]
|
|
73
|
+
},
|
|
74
|
+
"target_artifact": {
|
|
75
|
+
"type": "string"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Scripts Directory
|
|
2
|
+
|
|
3
|
+
`scripts/` is the public compatibility and shell-runtime surface for Flow Agents. Keep command paths stable unless a migration includes wrappers, docs updates, and bundle/install validation.
|
|
4
|
+
|
|
5
|
+
## Public Wrappers
|
|
6
|
+
|
|
7
|
+
These files are stable launchers for TypeScript code compiled under `build/src/`:
|
|
8
|
+
|
|
9
|
+
| Wrapper | Compiled implementation |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| `build-universal-bundles.js` | `build/src/tools/build-universal-bundles.js` |
|
|
12
|
+
| `filter-installed-packs.js` | `build/src/tools/filter-installed-packs.js` |
|
|
13
|
+
| `generate-context-map.js` | `build/src/tools/generate-context-map.js` |
|
|
14
|
+
| `flow-kit.js` | `build/src/cli/flow-kit.js` |
|
|
15
|
+
| `pull-work-provider.js` | `build/src/cli/pull-work-provider.js` |
|
|
16
|
+
| `effective-backlog-settings.js` | `build/src/cli/effective-backlog-settings.js` |
|
|
17
|
+
| `publish-change-helper.js` | `build/src/cli/publish-change-helper.js` |
|
|
18
|
+
| `promote-workflow-artifact.js` | `build/src/cli/promote-workflow-artifact.js` |
|
|
19
|
+
| `usage-feedback.js` | `build/src/cli/usage-feedback.js` |
|
|
20
|
+
| `validate-hook-influence-cases.js` | `build/src/cli/validate-hook-influence.js` |
|
|
21
|
+
| `validate-source-tree.js` | `build/src/cli.js validate-source` through package command wiring |
|
|
22
|
+
|
|
23
|
+
If implementation moves, update these wrappers rather than breaking callers.
|
|
24
|
+
`npm run validate:source --` enforces this table: public wrappers must remain
|
|
25
|
+
thin launchers, and implementation logic belongs under `src/cli/` or
|
|
26
|
+
`src/tools/`.
|
|
27
|
+
|
|
28
|
+
## Package Command Surface
|
|
29
|
+
|
|
30
|
+
`package.json` exposes command names through npm scripts and package bins.
|
|
31
|
+
Commands that run `node build/src/cli.js <command>` must be registered in
|
|
32
|
+
`src/cli.ts`; bins that point at `build/src/cli.js` must have a matching
|
|
33
|
+
`flow-agents-*` alias in `src/cli.ts`. Direct bins may point at compiled
|
|
34
|
+
single-command entry points such as `build/src/cli/workflow-sidecar.js` when
|
|
35
|
+
callers need a stable executable name without the multiplexer.
|
|
36
|
+
|
|
37
|
+
`npm run validate:source --` checks this command surface and rejects stale
|
|
38
|
+
migration scaffolding such as pending command registries. Add a real command,
|
|
39
|
+
document a compatibility wrapper, or delete the stale surface.
|
|
40
|
+
|
|
41
|
+
## Runtime Hooks
|
|
42
|
+
|
|
43
|
+
`scripts/hooks/` contains runtime hook adapters and policies for Claude Code, Codex, Kiro-style hooks, and repo guardrails. Canonical hook behavior lives here and in TypeScript bundle generation, not in local `.codex/` or `.claude/` installs.
|
|
44
|
+
|
|
45
|
+
`npm run validate:source --` enforces this inventory. If a hook moves, is
|
|
46
|
+
renamed, or changes category, update the table and the validator together.
|
|
47
|
+
|
|
48
|
+
| Hook file | Category | Owning checks | Purpose |
|
|
49
|
+
| --- | --- | --- | --- |
|
|
50
|
+
| `claude-hook-adapter.js` | runtime adapter | `evals/integration/test_hook_category_behaviors.sh`, `evals/integration/test_runtime_adapter_activation.sh` | Translates Claude hook events into the shared hook runner contract. |
|
|
51
|
+
| `codex-hook-adapter.js` | runtime adapter | `evals/integration/test_hook_category_behaviors.sh`, `evals/integration/test_runtime_adapter_activation.sh` | Translates Codex hook events into the shared hook runner contract. |
|
|
52
|
+
| `claude-telemetry-hook.js` | telemetry shim | `evals/integration/test_hook_category_behaviors.sh`, `evals/integration/test_telemetry.sh` | Captures Claude hook telemetry and fails open. |
|
|
53
|
+
| `codex-telemetry-hook.js` | telemetry shim | `evals/integration/test_hook_category_behaviors.sh`, `evals/integration/test_telemetry.sh` | Captures Codex hook telemetry and fails open. |
|
|
54
|
+
| `run-hook.js` | hook runner | `evals/integration/test_hook_category_behaviors.sh`, `evals/integration/test_goal_fit_hook.sh`, `evals/integration/test_workflow_steering_hook.sh` | Applies profile/disable flags, traversal checks, and hook execution. |
|
|
55
|
+
| `config-protection.js` | policy hook | `evals/integration/test_hook_category_behaviors.sh` | Blocks unsafe runtime config edits. |
|
|
56
|
+
| `governance-audit.sh` | policy hook | `evals/integration/test_hook_category_behaviors.sh`, `evals/integration/test_telemetry.sh` | Emits governance/Veritas audit context when configured. |
|
|
57
|
+
| `post-edit-accumulator.js` | policy hook | `evals/integration/test_hook_category_behaviors.sh` | Tracks edited files across a turn for later quality hooks. |
|
|
58
|
+
| `quality-gate.js` | policy hook | `evals/integration/test_hook_category_behaviors.sh` | Runs configured quality checks as hook policy. |
|
|
59
|
+
| `report-only-guard.js` | policy hook | `evals/integration/test_hook_category_behaviors.sh` | Protects report-only specialist roles from production edits. |
|
|
60
|
+
| `stop-format-typecheck.js` | policy hook | `evals/integration/test_hook_category_behaviors.sh` | Runs stop-time format/typecheck feedback. |
|
|
61
|
+
| `stop-goal-fit.js` | policy hook | `evals/integration/test_goal_fit_hook.sh` | Warns when a workflow is about to stop short of Goal Fit. |
|
|
62
|
+
| `workflow-steering.js` | policy hook | `evals/integration/test_workflow_steering_hook.sh` | Provides workflow guidance from current artifact state. |
|
|
63
|
+
| `pre-commit-quality.js` | repo guardrail hook | `evals/integration/test_hook_category_behaviors.sh` | Supports repository Git hook checks, not installed runtime hooks. |
|
|
64
|
+
| `desktop-notify.sh` | local notification helper | `evals/integration/test_hook_category_behaviors.sh` | Optional local desktop notification helper. |
|
|
65
|
+
| `lib/audit-transport.sh` | shared hook library | `evals/integration/test_hook_category_behaviors.sh`, `evals/integration/test_telemetry.sh` | Shared audit event transport functions. |
|
|
66
|
+
| `lib/hook-flags.js` | shared hook library | `evals/integration/test_hook_category_behaviors.sh` | Shared profile/disable flag parsing. |
|
|
67
|
+
| `lib/patterns.sh` | shared hook library | `evals/integration/test_hook_category_behaviors.sh`, `evals/integration/test_telemetry.sh` | Shared shell pattern constants. |
|
|
68
|
+
| `lib/resolve-formatter.js` | shared hook library | `evals/integration/test_hook_category_behaviors.sh` | Shared formatter resolution helper. |
|
|
69
|
+
|
|
70
|
+
## Telemetry
|
|
71
|
+
|
|
72
|
+
`scripts/telemetry/` contains shell telemetry collection and redaction helpers. Runtime hook wrappers call these scripts; generated bundles copy them for installed runtime use.
|
|
73
|
+
|
|
74
|
+
Set `CONSOLE_TELEMETRY_URL` or `CONSOLE_URL` to mirror redacted runtime
|
|
75
|
+
telemetry to a Console API. The transport derives `/api/telemetry/records`
|
|
76
|
+
unless `CONSOLE_TELEMETRY_ENDPOINT_URL` is set explicitly. Hosted Console URLs
|
|
77
|
+
must use `https://`; `http://` is accepted only for `localhost` or `127.0.0.1`
|
|
78
|
+
local development. Use `CONSOLE_TELEMETRY_TOKEN` or `CONSOLE_AUTH_TOKEN` for
|
|
79
|
+
bearer auth, and `CONSOLE_TENANT_ID` for hosted tenant routing. Leaving the
|
|
80
|
+
Console URL unset keeps telemetry local-only.
|
|
81
|
+
|
|
82
|
+
Installers persist telemetry sink choices into the installed
|
|
83
|
+
`scripts/telemetry/telemetry.conf`. `local-files` is the default and requires no
|
|
84
|
+
Console. Add `--telemetry-sink local-kontour-console` for a separately running
|
|
85
|
+
local Console, `--telemetry-sink kontour-hosted-console` for Kontour's hosted
|
|
86
|
+
Console, or `--telemetry-sink user-hosted-console --console-url ...` for a
|
|
87
|
+
self-hosted Console. Legacy `kontour-cloud` and `hosted-kontour-console` names
|
|
88
|
+
remain accepted. `--console-token-file` and `--console-tenant` can be used with
|
|
89
|
+
any Console sink. Prefer `flow-agents init` for a prompted setup; use `--yes`
|
|
90
|
+
with the same flags for CI/headless installs.
|
|
91
|
+
|
|
92
|
+
Run `flow-agents telemetry-doctor --dest PATH --json --headless` to inspect an
|
|
93
|
+
installed telemetry configuration. It reports active sinks, local JSONL paths,
|
|
94
|
+
Console target settings, and bounded local Console reachability without
|
|
95
|
+
prompting. Add `--allow-network` to probe a non-local HTTPS Console endpoint.
|
|
96
|
+
|
|
97
|
+
## Install And Repo Utilities
|
|
98
|
+
|
|
99
|
+
- `install-codex-home.sh`: installs the isolated generated Codex home.
|
|
100
|
+
- `setup-repo-hooks.sh`: configures this clone's Git hook path.
|
|
101
|
+
- `check-content-boundary.cjs`, `detect-tools.sh`, `discover-agents.sh`, `git-status.sh`: repo-local helper commands.
|
|
102
|
+
- `context-budget/` and `statusline/`: specialized support tooling copied into bundles where needed.
|
|
103
|
+
|
|
104
|
+
## Bundle Policy
|
|
105
|
+
|
|
106
|
+
`scripts/` is copied into generated bundles intentionally. Do not remove scripts from bundle output only to reduce size unless the corresponding source, generated install behavior, docs, and evals are updated together.
|
|
107
|
+
|
|
108
|
+
`evals/static/test_universal_bundles.sh` rebuilds bundles and checks the output
|
|
109
|
+
shape. It also verifies reproducibility by building the same source into two
|
|
110
|
+
fresh output directories and diffing the results. A failure means generated
|
|
111
|
+
content is non-deterministic or a bundle build step is carrying stale state.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { execFileSync } = require("node:child_process");
|
|
4
|
+
const { readFileSync } = require("node:fs");
|
|
5
|
+
|
|
6
|
+
const SELF = "scripts/check-content-boundary.cjs";
|
|
7
|
+
|
|
8
|
+
const bannedTerms = [
|
|
9
|
+
{
|
|
10
|
+
label: "private vertical product name",
|
|
11
|
+
pattern: new RegExp(["c", "a", "m", "p", "f", "i", "t"].join(""), "i"),
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
label: "private regulated vertical repository name",
|
|
15
|
+
pattern: new RegExp("\\b" + ["t", "a", "x", "e", "s"].join("") + "\\b", "i"),
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
label: "private regulated vertical term",
|
|
19
|
+
pattern: new RegExp("\\b" + ["t", "a", "x"].join("") + "\\b", "i"),
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const ignoredPathPatterns = [
|
|
24
|
+
/^node_modules\//,
|
|
25
|
+
/^dist\//,
|
|
26
|
+
/^build\//,
|
|
27
|
+
/^\.git\//,
|
|
28
|
+
/^\.astro\//,
|
|
29
|
+
/^test-results\//,
|
|
30
|
+
/^\.omx\//,
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
function trackedFiles() {
|
|
34
|
+
const injected = process.env.FLOW_AGENTS_CONTENT_BOUNDARY_FILES;
|
|
35
|
+
if (injected) return injected.split(/\r?\n/).filter(Boolean);
|
|
36
|
+
const output = execFileSync("git", ["ls-files", "-z"], { encoding: "utf8" });
|
|
37
|
+
return output.split("\0").filter(Boolean);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function isIgnoredPath(filePath) {
|
|
41
|
+
return filePath === SELF || ignoredPathPatterns.some((pattern) => pattern.test(filePath));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function isWorkflowRuntimeArtifact(filePath) {
|
|
45
|
+
return filePath.startsWith(".flow-agents/");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function lineNumberFor(content, index) {
|
|
49
|
+
return content.slice(0, index).split("\n").length;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const findings = [];
|
|
53
|
+
|
|
54
|
+
for (const filePath of trackedFiles()) {
|
|
55
|
+
if (isWorkflowRuntimeArtifact(filePath)) {
|
|
56
|
+
findings.push({
|
|
57
|
+
filePath,
|
|
58
|
+
line: 1,
|
|
59
|
+
label: "Flow Agents runtime artifact must not be tracked in this repo",
|
|
60
|
+
});
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (isIgnoredPath(filePath)) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let content;
|
|
69
|
+
try {
|
|
70
|
+
content = readFileSync(filePath, "utf8");
|
|
71
|
+
} catch {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (content.includes("\0")) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
for (const term of bannedTerms) {
|
|
80
|
+
const match = term.pattern.exec(content);
|
|
81
|
+
if (match) {
|
|
82
|
+
findings.push({
|
|
83
|
+
filePath,
|
|
84
|
+
line: lineNumberFor(content, match.index),
|
|
85
|
+
label: term.label,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (findings.length > 0) {
|
|
92
|
+
console.error("Content boundary check failed:");
|
|
93
|
+
for (const finding of findings) {
|
|
94
|
+
console.error(`- ${finding.filePath}:${finding.line} ${finding.label}`);
|
|
95
|
+
}
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.log("Content boundary check passed.");
|
|
@@ -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
|