@cleocode/core 2026.3.57 → 2026.3.58
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/dist/adapters/adapter-registry.js +64 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/discovery.js +83 -0
- package/dist/adapters/discovery.js.map +1 -0
- package/dist/adapters/index.js +9 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/manager.js +260 -0
- package/dist/adapters/manager.js.map +1 -0
- package/dist/admin/export-tasks.js +171 -0
- package/dist/admin/export-tasks.js.map +1 -0
- package/dist/admin/export.js +103 -0
- package/dist/admin/export.js.map +1 -0
- package/dist/admin/help.js +106 -0
- package/dist/admin/help.js.map +1 -0
- package/dist/admin/import-tasks.js +182 -0
- package/dist/admin/import-tasks.js.map +1 -0
- package/dist/admin/import.js +129 -0
- package/dist/admin/import.js.map +1 -0
- package/dist/admin/index.js +13 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/adrs/find.js +134 -0
- package/dist/adrs/find.js.map +1 -0
- package/dist/adrs/index.js +15 -0
- package/dist/adrs/index.js.map +1 -0
- package/dist/adrs/link-pipeline.js +160 -0
- package/dist/adrs/link-pipeline.js.map +1 -0
- package/dist/adrs/list.js +43 -0
- package/dist/adrs/list.js.map +1 -0
- package/dist/adrs/parse.js +51 -0
- package/dist/adrs/parse.js.map +1 -0
- package/dist/adrs/show.js +22 -0
- package/dist/adrs/show.js.map +1 -0
- package/dist/adrs/sync.js +188 -0
- package/dist/adrs/sync.js.map +1 -0
- package/dist/adrs/types.js +9 -0
- package/dist/adrs/types.js.map +1 -0
- package/dist/adrs/validate.js +57 -0
- package/dist/adrs/validate.js.map +1 -0
- package/dist/agents/agent-schema.d.ts.map +1 -1
- package/dist/agents/agent-schema.js +80 -0
- package/dist/agents/agent-schema.js.map +1 -0
- package/dist/agents/capacity.js +116 -0
- package/dist/agents/capacity.js.map +1 -0
- package/dist/agents/execution-learning.d.ts +223 -0
- package/dist/agents/execution-learning.d.ts.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +21 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/registry.js +314 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/retry.js +176 -0
- package/dist/agents/retry.js.map +1 -0
- package/dist/audit-prune.js +94 -0
- package/dist/audit-prune.js.map +1 -0
- package/dist/audit.js +68 -0
- package/dist/audit.js.map +1 -0
- package/dist/backfill/index.d.ts +56 -0
- package/dist/backfill/index.d.ts.map +1 -0
- package/dist/bootstrap.d.ts +1 -1
- package/dist/bootstrap.js +260 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/caamp/adapter.js +434 -0
- package/dist/caamp/adapter.js.map +1 -0
- package/dist/caamp/capability-check.js +38 -0
- package/dist/caamp/capability-check.js.map +1 -0
- package/dist/caamp/index.js +23 -0
- package/dist/caamp/index.js.map +1 -0
- package/dist/caamp-init.js +16 -0
- package/dist/caamp-init.js.map +1 -0
- package/dist/cleo.js +267 -0
- package/dist/cleo.js.map +1 -0
- package/dist/codebase-map/analyzers/architecture.js +130 -0
- package/dist/codebase-map/analyzers/architecture.js.map +1 -0
- package/dist/codebase-map/analyzers/concerns.js +122 -0
- package/dist/codebase-map/analyzers/concerns.js.map +1 -0
- package/dist/codebase-map/analyzers/conventions.js +149 -0
- package/dist/codebase-map/analyzers/conventions.js.map +1 -0
- package/dist/codebase-map/analyzers/integrations.js +108 -0
- package/dist/codebase-map/analyzers/integrations.js.map +1 -0
- package/dist/codebase-map/analyzers/stack.js +117 -0
- package/dist/codebase-map/analyzers/stack.js.map +1 -0
- package/dist/codebase-map/analyzers/structure.js +137 -0
- package/dist/codebase-map/analyzers/structure.js.map +1 -0
- package/dist/codebase-map/analyzers/testing.js +118 -0
- package/dist/codebase-map/analyzers/testing.js.map +1 -0
- package/dist/codebase-map/index.js +57 -0
- package/dist/codebase-map/index.js.map +1 -0
- package/dist/codebase-map/store.js +122 -0
- package/dist/codebase-map/store.js.map +1 -0
- package/dist/codebase-map/summary.js +152 -0
- package/dist/codebase-map/summary.js.map +1 -0
- package/dist/compliance/index.js +288 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/protocol-enforcement.js +332 -0
- package/dist/compliance/protocol-enforcement.js.map +1 -0
- package/dist/compliance/protocol-rules.js +786 -0
- package/dist/compliance/protocol-rules.js.map +1 -0
- package/dist/compliance/protocol-types.js +80 -0
- package/dist/compliance/protocol-types.js.map +1 -0
- package/dist/compliance/store.js +53 -0
- package/dist/compliance/store.js.map +1 -0
- package/dist/config/build-config.js +29 -0
- package/dist/config/build-config.js.map +1 -0
- package/dist/config.d.ts +47 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +287 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -0
- package/dist/context/index.js +137 -0
- package/dist/context/index.js.map +1 -0
- package/dist/engine-result.js +12 -0
- package/dist/engine-result.js.map +1 -0
- package/dist/error-catalog.js +404 -0
- package/dist/error-catalog.js.map +1 -0
- package/dist/error-registry.js +393 -0
- package/dist/error-registry.js.map +1 -0
- package/dist/errors.js +167 -0
- package/dist/errors.js.map +1 -0
- package/dist/hooks/handlers/error-hooks.js +43 -0
- package/dist/hooks/handlers/error-hooks.js.map +1 -0
- package/dist/hooks/handlers/file-hooks.js +80 -0
- package/dist/hooks/handlers/file-hooks.js.map +1 -0
- package/dist/hooks/handlers/index.js +19 -0
- package/dist/hooks/handlers/index.js.map +1 -0
- package/dist/hooks/handlers/mcp-hooks.js +80 -0
- package/dist/hooks/handlers/mcp-hooks.js.map +1 -0
- package/dist/hooks/handlers/session-hooks.js +73 -0
- package/dist/hooks/handlers/session-hooks.js.map +1 -0
- package/dist/hooks/handlers/task-hooks.js +63 -0
- package/dist/hooks/handlers/task-hooks.js.map +1 -0
- package/dist/hooks/index.js +13 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/payload-schemas.js +163 -0
- package/dist/hooks/payload-schemas.js.map +1 -0
- package/dist/hooks/provider-hooks.js +34 -0
- package/dist/hooks/provider-hooks.js.map +1 -0
- package/dist/hooks/registry.js +176 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/types.js +62 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/hooks.js +136 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6567 -5024
- package/dist/index.js.map +4 -4
- package/dist/init.js +711 -0
- package/dist/init.js.map +1 -0
- package/dist/inject/index.js +82 -0
- package/dist/inject/index.js.map +1 -0
- package/dist/injection.js +343 -0
- package/dist/injection.js.map +1 -0
- package/dist/intelligence/adaptive-validation.d.ts +151 -0
- package/dist/intelligence/adaptive-validation.d.ts.map +1 -0
- package/dist/intelligence/impact.js +499 -0
- package/dist/intelligence/impact.js.map +1 -0
- package/dist/intelligence/index.d.ts +5 -0
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/index.js +17 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/intelligence/patterns.js +492 -0
- package/dist/intelligence/patterns.js.map +1 -0
- package/dist/intelligence/prediction.js +499 -0
- package/dist/intelligence/prediction.js.map +1 -0
- package/dist/intelligence/types.js +13 -0
- package/dist/intelligence/types.js.map +1 -0
- package/dist/internal.d.ts +5 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +258 -0
- package/dist/internal.js.map +1 -0
- package/dist/issue/create.js +121 -0
- package/dist/issue/create.js.map +1 -0
- package/dist/issue/diagnostics.js +59 -0
- package/dist/issue/diagnostics.js.map +1 -0
- package/dist/issue/index.js +10 -0
- package/dist/issue/index.js.map +1 -0
- package/dist/issue/template-parser.js +267 -0
- package/dist/issue/template-parser.js.map +1 -0
- package/dist/json-schema-validator.js +76 -0
- package/dist/json-schema-validator.js.map +1 -0
- package/dist/lifecycle/chain-composition.js +152 -0
- package/dist/lifecycle/chain-composition.js.map +1 -0
- package/dist/lifecycle/chain-store.js +246 -0
- package/dist/lifecycle/chain-store.js.map +1 -0
- package/dist/lifecycle/consolidate-rcasd.js +352 -0
- package/dist/lifecycle/consolidate-rcasd.js.map +1 -0
- package/dist/lifecycle/default-chain.js +167 -0
- package/dist/lifecycle/default-chain.js.map +1 -0
- package/dist/lifecycle/evidence.js +180 -0
- package/dist/lifecycle/evidence.js.map +1 -0
- package/dist/lifecycle/frontmatter.js +363 -0
- package/dist/lifecycle/frontmatter.js.map +1 -0
- package/dist/lifecycle/index.js +753 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lifecycle/pipeline.js +656 -0
- package/dist/lifecycle/pipeline.js.map +1 -0
- package/dist/lifecycle/rcasd-index.js +326 -0
- package/dist/lifecycle/rcasd-index.js.map +1 -0
- package/dist/lifecycle/rcasd-paths.js +220 -0
- package/dist/lifecycle/rcasd-paths.js.map +1 -0
- package/dist/lifecycle/resume.js +864 -0
- package/dist/lifecycle/resume.js.map +1 -0
- package/dist/lifecycle/stage-artifacts.js +94 -0
- package/dist/lifecycle/stage-artifacts.js.map +1 -0
- package/dist/lifecycle/stages.js +534 -0
- package/dist/lifecycle/stages.js.map +1 -0
- package/dist/lifecycle/state-machine.js +516 -0
- package/dist/lifecycle/state-machine.js.map +1 -0
- package/dist/lifecycle/tessera-engine.js +249 -0
- package/dist/lifecycle/tessera-engine.js.map +1 -0
- package/dist/logger.js +140 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/index.js +146 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/memory/auto-extract.js +143 -0
- package/dist/memory/auto-extract.js.map +1 -0
- package/dist/memory/brain-embedding.js +49 -0
- package/dist/memory/brain-embedding.js.map +1 -0
- package/dist/memory/brain-lifecycle.js +298 -0
- package/dist/memory/brain-lifecycle.js.map +1 -0
- package/dist/memory/brain-links.js +148 -0
- package/dist/memory/brain-links.js.map +1 -0
- package/dist/memory/brain-migration.js +149 -0
- package/dist/memory/brain-migration.js.map +1 -0
- package/dist/memory/brain-reasoning.js +215 -0
- package/dist/memory/brain-reasoning.js.map +1 -0
- package/dist/memory/brain-retrieval.js +474 -0
- package/dist/memory/brain-retrieval.js.map +1 -0
- package/dist/memory/brain-row-types.js +10 -0
- package/dist/memory/brain-row-types.js.map +1 -0
- package/dist/memory/brain-search.js +519 -0
- package/dist/memory/brain-search.js.map +1 -0
- package/dist/memory/brain-similarity.js +145 -0
- package/dist/memory/brain-similarity.js.map +1 -0
- package/dist/memory/claude-mem-migration.js +277 -0
- package/dist/memory/claude-mem-migration.js.map +1 -0
- package/dist/memory/decisions.js +148 -0
- package/dist/memory/decisions.js.map +1 -0
- package/dist/memory/engine-compat.js +1030 -0
- package/dist/memory/engine-compat.js.map +1 -0
- package/dist/memory/index.js +773 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/learnings.js +121 -0
- package/dist/memory/learnings.js.map +1 -0
- package/dist/memory/memory-bridge.js +289 -0
- package/dist/memory/memory-bridge.js.map +1 -0
- package/dist/memory/patterns.js +122 -0
- package/dist/memory/patterns.js.map +1 -0
- package/dist/memory/pipeline-manifest-sqlite.js +975 -0
- package/dist/memory/pipeline-manifest-sqlite.js.map +1 -0
- package/dist/memory/session-memory.js +226 -0
- package/dist/memory/session-memory.js.map +1 -0
- package/dist/metrics/ab-test.js +260 -0
- package/dist/metrics/ab-test.js.map +1 -0
- package/dist/metrics/aggregation.js +363 -0
- package/dist/metrics/aggregation.js.map +1 -0
- package/dist/metrics/common.js +64 -0
- package/dist/metrics/common.js.map +1 -0
- package/dist/metrics/enums.js +78 -0
- package/dist/metrics/enums.js.map +1 -0
- package/dist/metrics/index.js +19 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/model-provider-registry.js +88 -0
- package/dist/metrics/model-provider-registry.js.map +1 -0
- package/dist/metrics/otel-integration.js +263 -0
- package/dist/metrics/otel-integration.js.map +1 -0
- package/dist/metrics/provider-detection.js +103 -0
- package/dist/metrics/provider-detection.js.map +1 -0
- package/dist/metrics/token-estimation.js +253 -0
- package/dist/metrics/token-estimation.js.map +1 -0
- package/dist/metrics/token-service.js +450 -0
- package/dist/metrics/token-service.js.map +1 -0
- package/dist/migration/agent-outputs.js +316 -0
- package/dist/migration/agent-outputs.js.map +1 -0
- package/dist/migration/checksum.js +92 -0
- package/dist/migration/checksum.js.map +1 -0
- package/dist/migration/index.js +282 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/logger.js +360 -0
- package/dist/migration/logger.js.map +1 -0
- package/dist/migration/preflight.js +9 -0
- package/dist/migration/preflight.js.map +1 -0
- package/dist/migration/state.js +421 -0
- package/dist/migration/state.js.map +1 -0
- package/dist/migration/validate.js +241 -0
- package/dist/migration/validate.js.map +1 -0
- package/dist/nexus/deps.js +375 -0
- package/dist/nexus/deps.js.map +1 -0
- package/dist/nexus/discover.js +288 -0
- package/dist/nexus/discover.js.map +1 -0
- package/dist/nexus/hash.js +10 -0
- package/dist/nexus/hash.js.map +1 -0
- package/dist/nexus/index.js +38 -0
- package/dist/nexus/index.js.map +1 -0
- package/dist/nexus/migrate-json-to-sqlite.js +115 -0
- package/dist/nexus/migrate-json-to-sqlite.js.map +1 -0
- package/dist/nexus/permissions.js +105 -0
- package/dist/nexus/permissions.js.map +1 -0
- package/dist/nexus/query.js +175 -0
- package/dist/nexus/query.js.map +1 -0
- package/dist/nexus/registry.js +584 -0
- package/dist/nexus/registry.js.map +1 -0
- package/dist/nexus/sharing/index.js +179 -0
- package/dist/nexus/sharing/index.js.map +1 -0
- package/dist/nexus/transfer-types.js +8 -0
- package/dist/nexus/transfer-types.js.map +1 -0
- package/dist/nexus/transfer.js +263 -0
- package/dist/nexus/transfer.js.map +1 -0
- package/dist/observability/index.js +103 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/log-filter.js +63 -0
- package/dist/observability/log-filter.js.map +1 -0
- package/dist/observability/log-parser.js +99 -0
- package/dist/observability/log-parser.js.map +1 -0
- package/dist/observability/log-reader.js +139 -0
- package/dist/observability/log-reader.js.map +1 -0
- package/dist/observability/types.js +19 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/orchestration/analyze.js +107 -0
- package/dist/orchestration/analyze.js.map +1 -0
- package/dist/orchestration/bootstrap.js +132 -0
- package/dist/orchestration/bootstrap.js.map +1 -0
- package/dist/orchestration/context.js +56 -0
- package/dist/orchestration/context.js.map +1 -0
- package/dist/orchestration/critical-path.js +100 -0
- package/dist/orchestration/critical-path.js.map +1 -0
- package/dist/orchestration/index.js +286 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/parallel.js +89 -0
- package/dist/orchestration/parallel.js.map +1 -0
- package/dist/orchestration/protocol-validators.js +524 -0
- package/dist/orchestration/protocol-validators.js.map +1 -0
- package/dist/orchestration/skill-ops.js +98 -0
- package/dist/orchestration/skill-ops.js.map +1 -0
- package/dist/orchestration/status.js +107 -0
- package/dist/orchestration/status.js.map +1 -0
- package/dist/orchestration/unblock.js +103 -0
- package/dist/orchestration/unblock.js.map +1 -0
- package/dist/orchestration/validate-spawn.js +67 -0
- package/dist/orchestration/validate-spawn.js.map +1 -0
- package/dist/orchestration/waves.js +86 -0
- package/dist/orchestration/waves.js.map +1 -0
- package/dist/otel/index.js +163 -0
- package/dist/otel/index.js.map +1 -0
- package/dist/output.js +132 -0
- package/dist/output.js.map +1 -0
- package/dist/pagination.js +61 -0
- package/dist/pagination.js.map +1 -0
- package/dist/paths.js +337 -0
- package/dist/paths.js.map +1 -0
- package/dist/phases/deps.js +369 -0
- package/dist/phases/deps.js.map +1 -0
- package/dist/phases/index.js +349 -0
- package/dist/phases/index.js.map +1 -0
- package/dist/pipeline/index.js +10 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/phase.js +45 -0
- package/dist/pipeline/phase.js.map +1 -0
- package/dist/platform.js +211 -0
- package/dist/platform.js.map +1 -0
- package/dist/project-info.js +84 -0
- package/dist/project-info.js.map +1 -0
- package/dist/reconciliation/index.js +10 -0
- package/dist/reconciliation/index.js.map +1 -0
- package/dist/reconciliation/link-store.js +129 -0
- package/dist/reconciliation/link-store.js.map +1 -0
- package/dist/reconciliation/reconciliation-engine.js +298 -0
- package/dist/reconciliation/reconciliation-engine.js.map +1 -0
- package/dist/release/artifacts.js +427 -0
- package/dist/release/artifacts.js.map +1 -0
- package/dist/release/changelog-writer.js +151 -0
- package/dist/release/changelog-writer.js.map +1 -0
- package/dist/release/channel.js +144 -0
- package/dist/release/channel.js.map +1 -0
- package/dist/release/ci.js +166 -0
- package/dist/release/ci.js.map +1 -0
- package/dist/release/github-pr.js +225 -0
- package/dist/release/github-pr.js.map +1 -0
- package/dist/release/guards.js +116 -0
- package/dist/release/guards.js.map +1 -0
- package/dist/release/index.js +22 -0
- package/dist/release/index.js.map +1 -0
- package/dist/release/release-config.js +158 -0
- package/dist/release/release-config.js.map +1 -0
- package/dist/release/release-manifest.js +1019 -0
- package/dist/release/release-manifest.js.map +1 -0
- package/dist/release/version-bump.js +255 -0
- package/dist/release/version-bump.js.map +1 -0
- package/dist/remote/index.js +257 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/repair.js +89 -0
- package/dist/repair.js.map +1 -0
- package/dist/research/index.js +2 -0
- package/dist/research/index.js.map +1 -0
- package/dist/roadmap/index.js +59 -0
- package/dist/roadmap/index.js.map +1 -0
- package/dist/routing/capability-matrix.js +1550 -0
- package/dist/routing/capability-matrix.js.map +1 -0
- package/dist/routing/index.js +9 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/scaffold.js +1158 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/schema-management.js +295 -0
- package/dist/schema-management.js.map +1 -0
- package/dist/security/index.js +9 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/input-sanitization.js +321 -0
- package/dist/security/input-sanitization.js.map +1 -0
- package/dist/sequence/index.js +295 -0
- package/dist/sequence/index.js.map +1 -0
- package/dist/sessions/assumptions.js +54 -0
- package/dist/sessions/assumptions.js.map +1 -0
- package/dist/sessions/briefing.js +377 -0
- package/dist/sessions/briefing.js.map +1 -0
- package/dist/sessions/context-alert.js +222 -0
- package/dist/sessions/context-alert.js.map +1 -0
- package/dist/sessions/context-inject.js +61 -0
- package/dist/sessions/context-inject.js.map +1 -0
- package/dist/sessions/context-monitor.js +98 -0
- package/dist/sessions/context-monitor.js.map +1 -0
- package/dist/sessions/decisions.js +65 -0
- package/dist/sessions/decisions.js.map +1 -0
- package/dist/sessions/find.js +63 -0
- package/dist/sessions/find.js.map +1 -0
- package/dist/sessions/handoff.js +328 -0
- package/dist/sessions/handoff.js.map +1 -0
- package/dist/sessions/hitl-warnings.js +254 -0
- package/dist/sessions/hitl-warnings.js.map +1 -0
- package/dist/sessions/index.js +318 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/session-archive.js +40 -0
- package/dist/sessions/session-archive.js.map +1 -0
- package/dist/sessions/session-cleanup.js +59 -0
- package/dist/sessions/session-cleanup.js.map +1 -0
- package/dist/sessions/session-drift.js +134 -0
- package/dist/sessions/session-drift.js.map +1 -0
- package/dist/sessions/session-enforcement.d.ts.map +1 -1
- package/dist/sessions/session-enforcement.js +140 -0
- package/dist/sessions/session-enforcement.js.map +1 -0
- package/dist/sessions/session-grade.js +253 -0
- package/dist/sessions/session-grade.js.map +1 -0
- package/dist/sessions/session-history.js +42 -0
- package/dist/sessions/session-history.js.map +1 -0
- package/dist/sessions/session-id.js +81 -0
- package/dist/sessions/session-id.js.map +1 -0
- package/dist/sessions/session-memory-bridge.js +52 -0
- package/dist/sessions/session-memory-bridge.js.map +1 -0
- package/dist/sessions/session-show.js +24 -0
- package/dist/sessions/session-show.js.map +1 -0
- package/dist/sessions/session-stats.js +69 -0
- package/dist/sessions/session-stats.js.map +1 -0
- package/dist/sessions/session-suspend.js +39 -0
- package/dist/sessions/session-suspend.js.map +1 -0
- package/dist/sessions/session-switch.js +51 -0
- package/dist/sessions/session-switch.js.map +1 -0
- package/dist/sessions/session-view.js +76 -0
- package/dist/sessions/session-view.js.map +1 -0
- package/dist/sessions/statusline-setup.js +85 -0
- package/dist/sessions/statusline-setup.js.map +1 -0
- package/dist/sessions/types.js +8 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/signaldock/claude-code-transport.js +107 -0
- package/dist/signaldock/claude-code-transport.js.map +1 -0
- package/dist/signaldock/factory.js +25 -0
- package/dist/signaldock/factory.js.map +1 -0
- package/dist/signaldock/index.js +9 -0
- package/dist/signaldock/index.js.map +1 -0
- package/dist/signaldock/signaldock-transport.js +122 -0
- package/dist/signaldock/signaldock-transport.js.map +1 -0
- package/dist/signaldock/transport.js +11 -0
- package/dist/signaldock/transport.js.map +1 -0
- package/dist/signaldock/types.js +11 -0
- package/dist/signaldock/types.js.map +1 -0
- package/dist/skills/agents/config.js +94 -0
- package/dist/skills/agents/config.js.map +1 -0
- package/dist/skills/agents/install.js +116 -0
- package/dist/skills/agents/install.js.map +1 -0
- package/dist/skills/agents/registry.js +161 -0
- package/dist/skills/agents/registry.js.map +1 -0
- package/dist/skills/discovery.js +333 -0
- package/dist/skills/discovery.js.map +1 -0
- package/dist/skills/dispatch.js +347 -0
- package/dist/skills/dispatch.js.map +1 -0
- package/dist/skills/dynamic-skill-generator.js +100 -0
- package/dist/skills/dynamic-skill-generator.js.map +1 -0
- package/dist/skills/index.js +44 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/injection/subagent.js +195 -0
- package/dist/skills/injection/subagent.js.map +1 -0
- package/dist/skills/injection/token.js +260 -0
- package/dist/skills/injection/token.js.map +1 -0
- package/dist/skills/install.js +40 -0
- package/dist/skills/install.js.map +1 -0
- package/dist/skills/manifests/contribution.js +175 -0
- package/dist/skills/manifests/contribution.js.map +1 -0
- package/dist/skills/manifests/research.js +281 -0
- package/dist/skills/manifests/research.js.map +1 -0
- package/dist/skills/manifests/resolver.js +146 -0
- package/dist/skills/manifests/resolver.js.map +1 -0
- package/dist/skills/marketplace.js +90 -0
- package/dist/skills/marketplace.js.map +1 -0
- package/dist/skills/orchestrator/spawn.js +178 -0
- package/dist/skills/orchestrator/spawn.js.map +1 -0
- package/dist/skills/orchestrator/startup.js +451 -0
- package/dist/skills/orchestrator/startup.js.map +1 -0
- package/dist/skills/orchestrator/validator.js +301 -0
- package/dist/skills/orchestrator/validator.js.map +1 -0
- package/dist/skills/precedence-integration.js +73 -0
- package/dist/skills/precedence-integration.js.map +1 -0
- package/dist/skills/precedence-types.js +16 -0
- package/dist/skills/precedence-types.js.map +1 -0
- package/dist/skills/routing-table.js +63 -0
- package/dist/skills/routing-table.js.map +1 -0
- package/dist/skills/skill-paths.js +220 -0
- package/dist/skills/skill-paths.js.map +1 -0
- package/dist/skills/test-utility.js +55 -0
- package/dist/skills/test-utility.js.map +1 -0
- package/dist/skills/types.js +118 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validation.js +183 -0
- package/dist/skills/validation.js.map +1 -0
- package/dist/skills/version.js +57 -0
- package/dist/skills/version.js.map +1 -0
- package/dist/snapshot/index.js +188 -0
- package/dist/snapshot/index.js.map +1 -0
- package/dist/spawn/adapter-registry.js +246 -0
- package/dist/spawn/adapter-registry.js.map +1 -0
- package/dist/spawn/index.js +10 -0
- package/dist/spawn/index.js.map +1 -0
- package/dist/stats/index.d.ts +1 -0
- package/dist/stats/index.d.ts.map +1 -1
- package/dist/stats/index.js +339 -0
- package/dist/stats/index.js.map +1 -0
- package/dist/stats/workflow-telemetry.d.ts +74 -0
- package/dist/stats/workflow-telemetry.d.ts.map +1 -0
- package/dist/sticky/archive.js +47 -0
- package/dist/sticky/archive.js.map +1 -0
- package/dist/sticky/convert.js +235 -0
- package/dist/sticky/convert.js.map +1 -0
- package/dist/sticky/create.js +48 -0
- package/dist/sticky/create.js.map +1 -0
- package/dist/sticky/id.js +35 -0
- package/dist/sticky/id.js.map +1 -0
- package/dist/sticky/index.js +16 -0
- package/dist/sticky/index.js.map +1 -0
- package/dist/sticky/list.js +44 -0
- package/dist/sticky/list.js.map +1 -0
- package/dist/sticky/purge.js +45 -0
- package/dist/sticky/purge.js.map +1 -0
- package/dist/sticky/show.js +42 -0
- package/dist/sticky/show.js.map +1 -0
- package/dist/sticky/types.js +10 -0
- package/dist/sticky/types.js.map +1 -0
- package/dist/store/atomic.js +167 -0
- package/dist/store/atomic.js.map +1 -0
- package/dist/store/backup.js +94 -0
- package/dist/store/backup.js.map +1 -0
- package/dist/store/brain-accessor.js +397 -0
- package/dist/store/brain-accessor.js.map +1 -0
- package/dist/store/brain-schema.d.ts.map +1 -1
- package/dist/store/brain-schema.js +212 -0
- package/dist/store/brain-schema.js.map +1 -0
- package/dist/store/brain-sqlite.js +271 -0
- package/dist/store/brain-sqlite.js.map +1 -0
- package/dist/store/cache.js +168 -0
- package/dist/store/cache.js.map +1 -0
- package/dist/store/chain-schema.js +51 -0
- package/dist/store/chain-schema.js.map +1 -0
- package/dist/store/converters.d.ts.map +1 -1
- package/dist/store/converters.js +120 -0
- package/dist/store/converters.js.map +1 -0
- package/dist/store/cross-db-cleanup.d.ts +58 -0
- package/dist/store/cross-db-cleanup.d.ts.map +1 -0
- package/dist/store/data-accessor.js +26 -0
- package/dist/store/data-accessor.js.map +1 -0
- package/dist/store/data-safety-central.js +269 -0
- package/dist/store/data-safety-central.js.map +1 -0
- package/dist/store/data-safety.js +274 -0
- package/dist/store/data-safety.js.map +1 -0
- package/dist/store/db-helpers.d.ts.map +1 -1
- package/dist/store/db-helpers.js +221 -0
- package/dist/store/db-helpers.js.map +1 -0
- package/dist/store/export.js +155 -0
- package/dist/store/export.js.map +1 -0
- package/dist/store/file-utils.js +270 -0
- package/dist/store/file-utils.js.map +1 -0
- package/dist/store/git-checkpoint.js +365 -0
- package/dist/store/git-checkpoint.js.map +1 -0
- package/dist/store/import-logging.js +139 -0
- package/dist/store/import-logging.js.map +1 -0
- package/dist/store/import-remap.js +145 -0
- package/dist/store/import-remap.js.map +1 -0
- package/dist/store/import-sort.js +121 -0
- package/dist/store/import-sort.js.map +1 -0
- package/dist/store/index.js +28 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/json.js +208 -0
- package/dist/store/json.js.map +1 -0
- package/dist/store/lifecycle-store.js +249 -0
- package/dist/store/lifecycle-store.js.map +1 -0
- package/dist/store/lock.js +70 -0
- package/dist/store/lock.js.map +1 -0
- package/dist/store/migration-sqlite.d.ts.map +1 -1
- package/dist/store/migration-sqlite.js +671 -0
- package/dist/store/migration-sqlite.js.map +1 -0
- package/dist/store/nexus-schema.js +62 -0
- package/dist/store/nexus-schema.js.map +1 -0
- package/dist/store/nexus-sqlite.js +217 -0
- package/dist/store/nexus-sqlite.js.map +1 -0
- package/dist/store/nexus-validation-schemas.js +40 -0
- package/dist/store/nexus-validation-schemas.js.map +1 -0
- package/dist/store/parsers.js +37 -0
- package/dist/store/parsers.js.map +1 -0
- package/dist/store/project-detect.js +457 -0
- package/dist/store/project-detect.js.map +1 -0
- package/dist/store/provider.js +101 -0
- package/dist/store/provider.js.map +1 -0
- package/dist/store/safety-data-accessor.js +243 -0
- package/dist/store/safety-data-accessor.js.map +1 -0
- package/dist/store/schema.js +7 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/session-store.js +219 -0
- package/dist/store/session-store.js.map +1 -0
- package/dist/store/sqlite-backup.js +105 -0
- package/dist/store/sqlite-backup.js.map +1 -0
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.js +742 -0
- package/dist/store/sqlite-data-accessor.js.map +1 -0
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +489 -0
- package/dist/store/sqlite.js.map +1 -0
- package/dist/store/status-registry.js +8 -0
- package/dist/store/status-registry.js.map +1 -0
- package/dist/store/task-store.d.ts.map +1 -1
- package/dist/store/task-store.js +344 -0
- package/dist/store/task-store.js.map +1 -0
- package/dist/store/tasks-schema.d.ts +18 -3
- package/dist/store/tasks-schema.d.ts.map +1 -1
- package/dist/store/tasks-schema.js +574 -0
- package/dist/store/tasks-schema.js.map +1 -0
- package/dist/store/typed-query.js +15 -0
- package/dist/store/typed-query.js.map +1 -0
- package/dist/store/validation-schemas.d.ts +32 -0
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/store/validation-schemas.js +278 -0
- package/dist/store/validation-schemas.js.map +1 -0
- package/dist/system/archive-analytics.js +277 -0
- package/dist/system/archive-analytics.js.map +1 -0
- package/dist/system/archive-stats.js +64 -0
- package/dist/system/archive-stats.js.map +1 -0
- package/dist/system/audit.js +145 -0
- package/dist/system/audit.js.map +1 -0
- package/dist/system/backup.js +99 -0
- package/dist/system/backup.js.map +1 -0
- package/dist/system/cleanup.js +134 -0
- package/dist/system/cleanup.js.map +1 -0
- package/dist/system/health.js +1054 -0
- package/dist/system/health.js.map +1 -0
- package/dist/system/index.js +18 -0
- package/dist/system/index.js.map +1 -0
- package/dist/system/inject-generate.js +122 -0
- package/dist/system/inject-generate.js.map +1 -0
- package/dist/system/labels.js +38 -0
- package/dist/system/labels.js.map +1 -0
- package/dist/system/metrics.js +61 -0
- package/dist/system/metrics.js.map +1 -0
- package/dist/system/migrate.js +43 -0
- package/dist/system/migrate.js.map +1 -0
- package/dist/system/platform-paths.js +80 -0
- package/dist/system/platform-paths.js.map +1 -0
- package/dist/system/runtime.js +161 -0
- package/dist/system/runtime.js.map +1 -0
- package/dist/system/safestop.js +99 -0
- package/dist/system/safestop.js.map +1 -0
- package/dist/system/storage-preflight.js +123 -0
- package/dist/system/storage-preflight.js.map +1 -0
- package/dist/task-work/index.js +155 -0
- package/dist/task-work/index.js.map +1 -0
- package/dist/tasks/add.d.ts +10 -1
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/add.js +510 -0
- package/dist/tasks/add.js.map +1 -0
- package/dist/tasks/analyze.js +85 -0
- package/dist/tasks/analyze.js.map +1 -0
- package/dist/tasks/archive.js +90 -0
- package/dist/tasks/archive.js.map +1 -0
- package/dist/tasks/atomicity.js +83 -0
- package/dist/tasks/atomicity.js.map +1 -0
- package/dist/tasks/cancel-ops.js +83 -0
- package/dist/tasks/cancel-ops.js.map +1 -0
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +224 -0
- package/dist/tasks/complete.js.map +1 -0
- package/dist/tasks/crossref-extract.js +73 -0
- package/dist/tasks/crossref-extract.js.map +1 -0
- package/dist/tasks/delete-preview.js +192 -0
- package/dist/tasks/delete-preview.js.map +1 -0
- package/dist/tasks/delete.js +120 -0
- package/dist/tasks/delete.js.map +1 -0
- package/dist/tasks/deletion-strategy.js +200 -0
- package/dist/tasks/deletion-strategy.js.map +1 -0
- package/dist/tasks/dependency-check.js +278 -0
- package/dist/tasks/dependency-check.js.map +1 -0
- package/dist/tasks/deps-ready.js +32 -0
- package/dist/tasks/deps-ready.js.map +1 -0
- package/dist/tasks/enforcement.d.ts +22 -0
- package/dist/tasks/enforcement.d.ts.map +1 -0
- package/dist/tasks/enforcement.js +82 -0
- package/dist/tasks/enforcement.js.map +1 -0
- package/dist/tasks/epic-enforcement.d.ts +138 -0
- package/dist/tasks/epic-enforcement.d.ts.map +1 -0
- package/dist/tasks/find.js +148 -0
- package/dist/tasks/find.js.map +1 -0
- package/dist/tasks/graph-cache.js +127 -0
- package/dist/tasks/graph-cache.js.map +1 -0
- package/dist/tasks/graph-ops.js +171 -0
- package/dist/tasks/graph-ops.js.map +1 -0
- package/dist/tasks/graph-rag.js +328 -0
- package/dist/tasks/graph-rag.js.map +1 -0
- package/dist/tasks/hierarchy-policy.js +149 -0
- package/dist/tasks/hierarchy-policy.js.map +1 -0
- package/dist/tasks/hierarchy.js +185 -0
- package/dist/tasks/hierarchy.js.map +1 -0
- package/dist/tasks/id-generator.js +65 -0
- package/dist/tasks/id-generator.js.map +1 -0
- package/dist/tasks/index.d.ts +1 -1
- package/dist/tasks/index.d.ts.map +1 -1
- package/dist/tasks/index.js +14 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/labels.js +52 -0
- package/dist/tasks/labels.js.map +1 -0
- package/dist/tasks/list.js +68 -0
- package/dist/tasks/list.js.map +1 -0
- package/dist/tasks/phase-tracking.js +133 -0
- package/dist/tasks/phase-tracking.js.map +1 -0
- package/dist/tasks/pipeline-stage.d.ts +112 -0
- package/dist/tasks/pipeline-stage.d.ts.map +1 -0
- package/dist/tasks/plan.js +268 -0
- package/dist/tasks/plan.js.map +1 -0
- package/dist/tasks/relates.js +89 -0
- package/dist/tasks/relates.js.map +1 -0
- package/dist/tasks/reparent.d.ts +38 -0
- package/dist/tasks/reparent.d.ts.map +1 -0
- package/dist/tasks/show.js +78 -0
- package/dist/tasks/show.js.map +1 -0
- package/dist/tasks/size-weighting.js +86 -0
- package/dist/tasks/size-weighting.js.map +1 -0
- package/dist/tasks/staleness.js +86 -0
- package/dist/tasks/staleness.js.map +1 -0
- package/dist/tasks/task-ops.js +1340 -0
- package/dist/tasks/task-ops.js.map +1 -0
- package/dist/tasks/update.d.ts +2 -0
- package/dist/tasks/update.d.ts.map +1 -1
- package/dist/tasks/update.js +243 -0
- package/dist/tasks/update.js.map +1 -0
- package/dist/templates/index.js +10 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/parser.js +254 -0
- package/dist/templates/parser.js.map +1 -0
- package/dist/ui/aliases.js +153 -0
- package/dist/ui/aliases.js.map +1 -0
- package/dist/ui/changelog.js +184 -0
- package/dist/ui/changelog.js.map +1 -0
- package/dist/ui/command-registry.js +168 -0
- package/dist/ui/command-registry.js.map +1 -0
- package/dist/ui/flags.js +94 -0
- package/dist/ui/flags.js.map +1 -0
- package/dist/ui/index.js +24 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/injection-legacy.d.ts +26 -0
- package/dist/ui/injection-legacy.d.ts.map +1 -0
- package/dist/ui/injection-legacy.js +42 -0
- package/dist/ui/injection-legacy.js.map +1 -0
- package/dist/upgrade.js +901 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/validation/chain-validation.js +146 -0
- package/dist/validation/chain-validation.js.map +1 -0
- package/dist/validation/compliance.js +155 -0
- package/dist/validation/compliance.js.map +1 -0
- package/dist/validation/docs-sync.js +212 -0
- package/dist/validation/docs-sync.js.map +1 -0
- package/dist/validation/doctor/checks.js +1069 -0
- package/dist/validation/doctor/checks.js.map +1 -0
- package/dist/validation/doctor/index.js +9 -0
- package/dist/validation/doctor/index.js.map +1 -0
- package/dist/validation/doctor/project-cache.js +160 -0
- package/dist/validation/doctor/project-cache.js.map +1 -0
- package/dist/validation/doctor/utils.js +155 -0
- package/dist/validation/doctor/utils.js.map +1 -0
- package/dist/validation/engine.js +902 -0
- package/dist/validation/engine.js.map +1 -0
- package/dist/validation/gap-check.js +175 -0
- package/dist/validation/gap-check.js.map +1 -0
- package/dist/validation/index.js +40 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/manifest.js +237 -0
- package/dist/validation/manifest.js.map +1 -0
- package/dist/validation/operation-gate-validators.js +724 -0
- package/dist/validation/operation-gate-validators.js.map +1 -0
- package/dist/validation/operation-verification-gates.js +532 -0
- package/dist/validation/operation-verification-gates.js.map +1 -0
- package/dist/validation/param-utils.js +139 -0
- package/dist/validation/param-utils.js.map +1 -0
- package/dist/validation/protocol-common.js +300 -0
- package/dist/validation/protocol-common.js.map +1 -0
- package/dist/validation/protocols/consensus.js +71 -0
- package/dist/validation/protocols/consensus.js.map +1 -0
- package/dist/validation/protocols/contribution.js +59 -0
- package/dist/validation/protocols/contribution.js.map +1 -0
- package/dist/validation/protocols/decomposition.js +59 -0
- package/dist/validation/protocols/decomposition.js.map +1 -0
- package/dist/validation/protocols/implementation.js +59 -0
- package/dist/validation/protocols/implementation.js.map +1 -0
- package/dist/validation/protocols/release-protocol.js +60 -0
- package/dist/validation/protocols/release-protocol.js.map +1 -0
- package/dist/validation/protocols/research.js +77 -0
- package/dist/validation/protocols/research.js.map +1 -0
- package/dist/validation/protocols/specification.js +84 -0
- package/dist/validation/protocols/specification.js.map +1 -0
- package/dist/validation/protocols/testing-protocol.js +70 -0
- package/dist/validation/protocols/testing-protocol.js.map +1 -0
- package/dist/validation/protocols/validation-protocol.js +70 -0
- package/dist/validation/protocols/validation-protocol.js.map +1 -0
- package/dist/validation/schema-integrity.js +170 -0
- package/dist/validation/schema-integrity.js.map +1 -0
- package/dist/validation/schema-validator.js +176 -0
- package/dist/validation/schema-validator.js.map +1 -0
- package/dist/validation/validate-ops.js +937 -0
- package/dist/validation/validate-ops.js.map +1 -0
- package/dist/validation/validation-rules.js +226 -0
- package/dist/validation/validation-rules.js.map +1 -0
- package/dist/validation/verification.js +321 -0
- package/dist/validation/verification.js.map +1 -0
- package/migrations/drizzle-brain/20260321000001_t033-brain-indexes/migration.sql +12 -0
- package/migrations/drizzle-brain/20260321000001_t033-brain-indexes/snapshot.json +1232 -0
- package/migrations/drizzle-tasks/20260321000000_t033-connection-health/migration.sql +518 -0
- package/migrations/drizzle-tasks/20260321000000_t033-connection-health/snapshot.json +4312 -0
- package/migrations/drizzle-tasks/20260321000002_t060-pipeline-stage-binding/migration.sql +82 -0
- package/migrations/drizzle-tasks/20260321000002_t060-pipeline-stage-binding/snapshot.json +9 -0
- package/package.json +5 -5
- package/src/agents/__tests__/execution-learning.test.ts +684 -0
- package/src/agents/__tests__/registry.test.ts +30 -2
- package/src/agents/agent-schema.ts +5 -0
- package/src/agents/execution-learning.ts +675 -0
- package/src/agents/index.ts +13 -0
- package/src/backfill/index.ts +282 -0
- package/src/bootstrap.ts +1 -1
- package/src/config.ts +126 -0
- package/src/index.ts +7 -1
- package/src/intelligence/__tests__/adaptive-validation.test.ts +694 -0
- package/src/intelligence/adaptive-validation.ts +764 -0
- package/src/intelligence/index.ts +16 -0
- package/src/internal.ts +19 -0
- package/src/lifecycle/__tests__/chain-store.test.ts +7 -0
- package/src/lifecycle/__tests__/tessera-engine.test.ts +52 -0
- package/src/sessions/__tests__/session-edge-cases.test.ts +24 -1
- package/src/sessions/session-enforcement.ts +13 -2
- package/src/stats/index.ts +7 -0
- package/src/stats/workflow-telemetry.ts +487 -0
- package/src/store/__tests__/migration-safety.test.ts +3 -0
- package/src/store/__tests__/session-store.test.ts +96 -1
- package/src/store/__tests__/task-store.test.ts +22 -1
- package/src/store/__tests__/test-db-helper.ts +25 -2
- package/src/store/brain-schema.ts +4 -1
- package/src/store/converters.ts +2 -0
- package/src/store/cross-db-cleanup.ts +157 -0
- package/src/store/db-helpers.ts +2 -0
- package/src/store/migration-sqlite.ts +6 -0
- package/src/store/sqlite-data-accessor.ts +20 -28
- package/src/store/sqlite.ts +14 -2
- package/src/store/task-store.ts +6 -0
- package/src/store/tasks-schema.ts +59 -20
- package/src/tasks/__tests__/add.test.ts +16 -0
- package/src/tasks/__tests__/complete-unblocks.test.ts +10 -1
- package/src/tasks/__tests__/complete.test.ts +11 -2
- package/src/tasks/__tests__/epic-enforcement.test.ts +904 -0
- package/src/tasks/__tests__/minimal-test.test.ts +28 -0
- package/src/tasks/__tests__/pipeline-stage.test.ts +403 -0
- package/src/tasks/__tests__/update.test.ts +40 -6
- package/src/tasks/add.ts +128 -2
- package/src/tasks/complete.ts +24 -17
- package/src/tasks/enforcement.ts +124 -0
- package/src/tasks/epic-enforcement.ts +303 -0
- package/src/tasks/index.ts +1 -0
- package/src/tasks/pipeline-stage.ts +224 -0
- package/src/tasks/update.ts +62 -0
- package/templates/config.template.json +34 -0
- package/templates/global-config.template.json +26 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Epic lifecycle pipeline enforcement (RCASD-IVTR+C).
|
|
3
|
+
*
|
|
4
|
+
* Enforces three constraints specific to tasks of type "epic":
|
|
5
|
+
*
|
|
6
|
+
* 1. **Creation requirements** (strict mode only):
|
|
7
|
+
* - Minimum 5 acceptance criteria (vs. 3 for regular tasks).
|
|
8
|
+
* - Completion criteria must be defined (non-empty description field).
|
|
9
|
+
* - Initial pipeline stage defaults to "research" (inherited from
|
|
10
|
+
* pipeline-stage.ts, not re-asserted here).
|
|
11
|
+
*
|
|
12
|
+
* 2. **Child stage ceiling**: A child task's pipeline stage cannot advance
|
|
13
|
+
* past the epic's current pipeline stage. This is checked on child task
|
|
14
|
+
* update (pipelineStage change) and on child task creation.
|
|
15
|
+
*
|
|
16
|
+
* 3. **Epic stage advancement gate**: An epic cannot advance its pipeline
|
|
17
|
+
* stage while it has children whose status is not "done" AND whose
|
|
18
|
+
* pipeline stage equals the epic's current stage. In other words, all
|
|
19
|
+
* in-flight children at the current stage must be completed before the
|
|
20
|
+
* epic may move forward.
|
|
21
|
+
*
|
|
22
|
+
* Enforcement is conditional on `lifecycle.mode`:
|
|
23
|
+
* - "strict" → block (throw CleoError on violation)
|
|
24
|
+
* - "advisory" → warn (return error string but do not throw)
|
|
25
|
+
* - "off" → skip (all checks are no-ops)
|
|
26
|
+
*
|
|
27
|
+
* @task T062
|
|
28
|
+
* @epic T056
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import type { DataAccessor, Task } from '@cleocode/contracts';
|
|
32
|
+
import { ExitCode } from '@cleocode/contracts';
|
|
33
|
+
import { loadConfig } from '../config.js';
|
|
34
|
+
import { CleoError } from '../errors.js';
|
|
35
|
+
import { getPipelineStageOrder, isValidPipelineStage } from './pipeline-stage.js';
|
|
36
|
+
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// CONSTANTS
|
|
39
|
+
// =============================================================================
|
|
40
|
+
|
|
41
|
+
/** Minimum acceptance criteria count required for epic creation in strict mode. */
|
|
42
|
+
export const EPIC_MIN_AC = 5;
|
|
43
|
+
|
|
44
|
+
/** Minimum acceptance criteria count for regular tasks. */
|
|
45
|
+
export const TASK_MIN_AC = 3;
|
|
46
|
+
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// TYPES
|
|
49
|
+
// =============================================================================
|
|
50
|
+
|
|
51
|
+
/** The resolved enforcement mode (from lifecycle.mode config key). */
|
|
52
|
+
export type LifecycleMode = 'strict' | 'advisory' | 'off';
|
|
53
|
+
|
|
54
|
+
/** Result of an enforcement check. `warning` is populated in advisory mode. */
|
|
55
|
+
export interface EpicEnforcementResult {
|
|
56
|
+
/** True unless a hard block was raised. */
|
|
57
|
+
valid: boolean;
|
|
58
|
+
/** Advisory message (non-blocking) or error message (blocked). */
|
|
59
|
+
warning?: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// =============================================================================
|
|
63
|
+
// HELPERS
|
|
64
|
+
// =============================================================================
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Read `lifecycle.mode` from config. Falls back to "strict" when unset
|
|
68
|
+
* (matches the DEFAULTS in config.ts).
|
|
69
|
+
*
|
|
70
|
+
* @task T062
|
|
71
|
+
*/
|
|
72
|
+
export async function getLifecycleMode(cwd?: string): Promise<LifecycleMode> {
|
|
73
|
+
if (process.env.VITEST) return 'off';
|
|
74
|
+
const config = await loadConfig(cwd);
|
|
75
|
+
return config.lifecycle?.mode ?? 'strict';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// =============================================================================
|
|
79
|
+
// 1. EPIC CREATION REQUIREMENTS
|
|
80
|
+
// =============================================================================
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Validate that a new epic satisfies creation requirements.
|
|
84
|
+
*
|
|
85
|
+
* In **strict** mode:
|
|
86
|
+
* - At least {@link EPIC_MIN_AC} acceptance criteria must be provided.
|
|
87
|
+
* - `description` must be non-empty (treated as completion criteria).
|
|
88
|
+
*
|
|
89
|
+
* In **advisory** mode the same checks are run but violations do not block —
|
|
90
|
+
* they are returned as `warning` text for the caller to surface.
|
|
91
|
+
*
|
|
92
|
+
* In **off** mode this function is a no-op.
|
|
93
|
+
*
|
|
94
|
+
* @param options.acceptance - Acceptance criteria array supplied by the caller.
|
|
95
|
+
* @param options.description - Task description (used as completion criteria proxy).
|
|
96
|
+
* @param cwd - Working directory for config resolution.
|
|
97
|
+
* @returns EpicEnforcementResult — `valid: false` only in strict mode on error.
|
|
98
|
+
* @throws CleoError(VALIDATION_ERROR) in strict mode when constraints are violated.
|
|
99
|
+
*
|
|
100
|
+
* @task T062
|
|
101
|
+
*/
|
|
102
|
+
export async function validateEpicCreation(
|
|
103
|
+
options: {
|
|
104
|
+
acceptance?: string[];
|
|
105
|
+
description?: string;
|
|
106
|
+
},
|
|
107
|
+
cwd?: string,
|
|
108
|
+
): Promise<EpicEnforcementResult> {
|
|
109
|
+
const mode = await getLifecycleMode(cwd);
|
|
110
|
+
if (mode === 'off') return { valid: true };
|
|
111
|
+
|
|
112
|
+
const ac = options.acceptance ?? [];
|
|
113
|
+
const desc = (options.description ?? '').trim();
|
|
114
|
+
|
|
115
|
+
const violations: string[] = [];
|
|
116
|
+
|
|
117
|
+
if (ac.length < EPIC_MIN_AC) {
|
|
118
|
+
violations.push(
|
|
119
|
+
`Epic requires at least ${EPIC_MIN_AC} acceptance criteria (${ac.length} provided). Regular tasks need ${TASK_MIN_AC}.`,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (!desc) {
|
|
124
|
+
violations.push('Epic must have a non-empty description (used as completion criteria).');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (violations.length === 0) return { valid: true };
|
|
128
|
+
|
|
129
|
+
const message = violations.join(' | ');
|
|
130
|
+
const fix = `Add --acceptance "..." flags (need ${EPIC_MIN_AC}) and a --description "completion criteria"`;
|
|
131
|
+
|
|
132
|
+
if (mode === 'strict') {
|
|
133
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, message, { fix });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// advisory: warn but allow
|
|
137
|
+
return { valid: true, warning: message };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// =============================================================================
|
|
141
|
+
// 2. CHILD STAGE CEILING
|
|
142
|
+
// =============================================================================
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Validate that a child task's pipeline stage does not exceed its epic's stage.
|
|
146
|
+
*
|
|
147
|
+
* Call this when:
|
|
148
|
+
* - A child task is **created** under an epic parent.
|
|
149
|
+
* - A child task's `pipelineStage` is **updated** and it has an epic ancestor.
|
|
150
|
+
*
|
|
151
|
+
* The check walks the task's ancestor chain to find the nearest epic ancestor.
|
|
152
|
+
* If none exists, the check is skipped.
|
|
153
|
+
*
|
|
154
|
+
* @param options.childStage - The proposed pipeline stage for the child.
|
|
155
|
+
* @param options.epicId - ID of the epic ancestor to check against.
|
|
156
|
+
* @param accessor - DataAccessor for task lookups.
|
|
157
|
+
* @param cwd - Working directory for config resolution.
|
|
158
|
+
* @returns EpicEnforcementResult
|
|
159
|
+
* @throws CleoError(VALIDATION_ERROR) in strict mode when the child stage exceeds the epic.
|
|
160
|
+
*
|
|
161
|
+
* @task T062
|
|
162
|
+
*/
|
|
163
|
+
export async function validateChildStageCeiling(
|
|
164
|
+
options: {
|
|
165
|
+
childStage: string;
|
|
166
|
+
epicId: string;
|
|
167
|
+
},
|
|
168
|
+
accessor: DataAccessor,
|
|
169
|
+
cwd?: string,
|
|
170
|
+
): Promise<EpicEnforcementResult> {
|
|
171
|
+
const mode = await getLifecycleMode(cwd);
|
|
172
|
+
if (mode === 'off') return { valid: true };
|
|
173
|
+
|
|
174
|
+
const epic = await accessor.loadSingleTask(options.epicId);
|
|
175
|
+
if (!epic || epic.type !== 'epic') return { valid: true };
|
|
176
|
+
|
|
177
|
+
const epicStage = epic.pipelineStage;
|
|
178
|
+
if (!epicStage || !isValidPipelineStage(epicStage)) return { valid: true };
|
|
179
|
+
|
|
180
|
+
const childStage = options.childStage;
|
|
181
|
+
if (!isValidPipelineStage(childStage)) return { valid: true }; // stage validation handled elsewhere
|
|
182
|
+
|
|
183
|
+
const epicOrder = getPipelineStageOrder(epicStage);
|
|
184
|
+
const childOrder = getPipelineStageOrder(childStage);
|
|
185
|
+
|
|
186
|
+
if (childOrder <= epicOrder) return { valid: true };
|
|
187
|
+
|
|
188
|
+
const message =
|
|
189
|
+
`Child task cannot be at pipeline stage "${childStage}" (order ${childOrder}) ` +
|
|
190
|
+
`because its parent epic ${options.epicId} is only at stage "${epicStage}" (order ${epicOrder}). ` +
|
|
191
|
+
`Children cannot exceed their epic's current stage.`;
|
|
192
|
+
const fix = `Use a stage at or before "${epicStage}". Advance the epic first if needed.`;
|
|
193
|
+
|
|
194
|
+
if (mode === 'strict') {
|
|
195
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, message, { fix });
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return { valid: true, warning: message };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Find the nearest epic ancestor for a given task.
|
|
203
|
+
*
|
|
204
|
+
* Walks the ancestor chain (root-first) and returns the first task whose
|
|
205
|
+
* type is "epic", or null if no epic ancestor exists.
|
|
206
|
+
*
|
|
207
|
+
* @param taskId - ID of the task whose ancestors to inspect.
|
|
208
|
+
* @param accessor - DataAccessor for the ancestor chain query.
|
|
209
|
+
* @returns The nearest epic ancestor, or null.
|
|
210
|
+
*
|
|
211
|
+
* @task T062
|
|
212
|
+
*/
|
|
213
|
+
export async function findEpicAncestor(
|
|
214
|
+
taskId: string,
|
|
215
|
+
accessor: DataAccessor,
|
|
216
|
+
): Promise<Task | null> {
|
|
217
|
+
const ancestors = await accessor.getAncestorChain(taskId);
|
|
218
|
+
// ancestors is root-first; the last entry is the immediate parent
|
|
219
|
+
// We want the nearest epic, so scan from the end (closest ancestor first)
|
|
220
|
+
for (let i = ancestors.length - 1; i >= 0; i--) {
|
|
221
|
+
const ancestor = ancestors[i];
|
|
222
|
+
if (ancestor && ancestor.type === 'epic') return ancestor;
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// =============================================================================
|
|
228
|
+
// 3. EPIC STAGE ADVANCEMENT GATE
|
|
229
|
+
// =============================================================================
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Validate that an epic can advance its pipeline stage.
|
|
233
|
+
*
|
|
234
|
+
* An epic is **blocked** from advancing to a later stage when it has at least
|
|
235
|
+
* one child that:
|
|
236
|
+
* - Has a pipeline stage **equal to the epic's current stage**, AND
|
|
237
|
+
* - Has a status that is **not** "done" (i.e., is still in-flight).
|
|
238
|
+
*
|
|
239
|
+
* Rationale: the epic stage represents the stage the team is actively working
|
|
240
|
+
* in. Moving the epic forward while children are unfinished at the current
|
|
241
|
+
* stage violates the pipeline discipline.
|
|
242
|
+
*
|
|
243
|
+
* @param options.epicId - ID of the epic being advanced.
|
|
244
|
+
* @param options.currentStage - Epic's current pipeline stage (before the update).
|
|
245
|
+
* @param options.newStage - Proposed new pipeline stage.
|
|
246
|
+
* @param accessor - DataAccessor for children lookup.
|
|
247
|
+
* @param cwd - Working directory for config resolution.
|
|
248
|
+
* @returns EpicEnforcementResult
|
|
249
|
+
* @throws CleoError(VALIDATION_ERROR) in strict mode when incomplete children exist.
|
|
250
|
+
*
|
|
251
|
+
* @task T062
|
|
252
|
+
*/
|
|
253
|
+
export async function validateEpicStageAdvancement(
|
|
254
|
+
options: {
|
|
255
|
+
epicId: string;
|
|
256
|
+
currentStage: string;
|
|
257
|
+
newStage: string;
|
|
258
|
+
},
|
|
259
|
+
accessor: DataAccessor,
|
|
260
|
+
cwd?: string,
|
|
261
|
+
): Promise<EpicEnforcementResult> {
|
|
262
|
+
const mode = await getLifecycleMode(cwd);
|
|
263
|
+
if (mode === 'off') return { valid: true };
|
|
264
|
+
|
|
265
|
+
const { epicId, currentStage, newStage } = options;
|
|
266
|
+
|
|
267
|
+
// Only enforce if actually advancing (not a same-stage no-op)
|
|
268
|
+
if (!isValidPipelineStage(currentStage) || !isValidPipelineStage(newStage)) {
|
|
269
|
+
return { valid: true };
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const currentOrder = getPipelineStageOrder(currentStage);
|
|
273
|
+
const newOrder = getPipelineStageOrder(newStage);
|
|
274
|
+
|
|
275
|
+
if (newOrder <= currentOrder) {
|
|
276
|
+
// Same stage or backward — backward is caught by validatePipelineTransition
|
|
277
|
+
return { valid: true };
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Find all children whose stage equals the current epic stage and are not done
|
|
281
|
+
const children = await accessor.getChildren(epicId);
|
|
282
|
+
const blockers = children.filter((child) => {
|
|
283
|
+
if (child.status === 'done' || child.status === 'cancelled' || child.status === 'archived') {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
return child.pipelineStage === currentStage;
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
if (blockers.length === 0) return { valid: true };
|
|
290
|
+
|
|
291
|
+
const blockerIds = blockers.map((t) => t.id).join(', ');
|
|
292
|
+
const message =
|
|
293
|
+
`Epic ${epicId} cannot advance from "${currentStage}" to "${newStage}" — ` +
|
|
294
|
+
`${blockers.length} child task(s) are still in-flight at stage "${currentStage}": ${blockerIds}. ` +
|
|
295
|
+
`Complete all children at the current stage before advancing the epic.`;
|
|
296
|
+
const fix = `Complete tasks ${blockerIds} first, then advance the epic stage.`;
|
|
297
|
+
|
|
298
|
+
if (mode === 'strict') {
|
|
299
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, message, { fix });
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return { valid: true, warning: message };
|
|
303
|
+
}
|
package/src/tasks/index.ts
CHANGED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeline stage binding for tasks (RCASD-IVTR+C).
|
|
3
|
+
*
|
|
4
|
+
* Implements auto-assignment of pipeline stages on task creation and
|
|
5
|
+
* forward-only stage transition validation on task update.
|
|
6
|
+
*
|
|
7
|
+
* Stages (in order):
|
|
8
|
+
* 1. research
|
|
9
|
+
* 2. consensus
|
|
10
|
+
* 3. architecture_decision
|
|
11
|
+
* 4. specification
|
|
12
|
+
* 5. decomposition
|
|
13
|
+
* 6. implementation
|
|
14
|
+
* 7. validation
|
|
15
|
+
* 8. testing
|
|
16
|
+
* 9. release
|
|
17
|
+
* 10. contribution (cross-cutting, treated as terminal)
|
|
18
|
+
*
|
|
19
|
+
* @task T060
|
|
20
|
+
* @epic T056
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import type { TaskType } from '@cleocode/contracts';
|
|
24
|
+
import { ExitCode } from '@cleocode/contracts';
|
|
25
|
+
import { CleoError } from '../errors.js';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Minimal parent task shape needed for pipeline stage resolution.
|
|
29
|
+
* @task T060
|
|
30
|
+
*/
|
|
31
|
+
export interface ResolvedParent {
|
|
32
|
+
pipelineStage?: string | null;
|
|
33
|
+
type?: TaskType | null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// CONSTANTS
|
|
38
|
+
// =============================================================================
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Ordered pipeline stages (RCASD-IVTR+C).
|
|
42
|
+
* This matches lifecycle/stages.ts PIPELINE_STAGES but is kept local to avoid
|
|
43
|
+
* a circular dependency — tasks/ must not import from lifecycle/.
|
|
44
|
+
*
|
|
45
|
+
* @task T060
|
|
46
|
+
*/
|
|
47
|
+
export const TASK_PIPELINE_STAGES = [
|
|
48
|
+
'research',
|
|
49
|
+
'consensus',
|
|
50
|
+
'architecture_decision',
|
|
51
|
+
'specification',
|
|
52
|
+
'decomposition',
|
|
53
|
+
'implementation',
|
|
54
|
+
'validation',
|
|
55
|
+
'testing',
|
|
56
|
+
'release',
|
|
57
|
+
'contribution',
|
|
58
|
+
] as const;
|
|
59
|
+
|
|
60
|
+
/** Union type of all valid pipeline stage names. */
|
|
61
|
+
export type TaskPipelineStage = (typeof TASK_PIPELINE_STAGES)[number];
|
|
62
|
+
|
|
63
|
+
/** Order map for fast index lookups (1-based). */
|
|
64
|
+
const STAGE_ORDER: Record<TaskPipelineStage, number> = {
|
|
65
|
+
research: 1,
|
|
66
|
+
consensus: 2,
|
|
67
|
+
architecture_decision: 3,
|
|
68
|
+
specification: 4,
|
|
69
|
+
decomposition: 5,
|
|
70
|
+
implementation: 6,
|
|
71
|
+
validation: 7,
|
|
72
|
+
testing: 8,
|
|
73
|
+
release: 9,
|
|
74
|
+
contribution: 10,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// =============================================================================
|
|
78
|
+
// VALIDATION
|
|
79
|
+
// =============================================================================
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Check whether a string is a valid pipeline stage name.
|
|
83
|
+
*
|
|
84
|
+
* @param stage - Raw string to test
|
|
85
|
+
* @returns True if it is a valid stage name
|
|
86
|
+
*
|
|
87
|
+
* @task T060
|
|
88
|
+
*/
|
|
89
|
+
export function isValidPipelineStage(stage: string): stage is TaskPipelineStage {
|
|
90
|
+
return TASK_PIPELINE_STAGES.includes(stage as TaskPipelineStage);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Validate a pipeline stage name and throw a CleoError on failure.
|
|
95
|
+
*
|
|
96
|
+
* @param stage - Stage name to validate
|
|
97
|
+
* @throws CleoError(VALIDATION_ERROR) if invalid
|
|
98
|
+
*
|
|
99
|
+
* @task T060
|
|
100
|
+
*/
|
|
101
|
+
export function validatePipelineStage(stage: string): asserts stage is TaskPipelineStage {
|
|
102
|
+
if (!isValidPipelineStage(stage)) {
|
|
103
|
+
throw new CleoError(
|
|
104
|
+
ExitCode.VALIDATION_ERROR,
|
|
105
|
+
`Invalid pipeline stage: "${stage}". Valid stages: ${TASK_PIPELINE_STAGES.join(', ')}`,
|
|
106
|
+
{ fix: `Use one of: ${TASK_PIPELINE_STAGES.join(', ')}` },
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// =============================================================================
|
|
112
|
+
// AUTO-ASSIGNMENT
|
|
113
|
+
// =============================================================================
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Determine the default pipeline stage for a new task.
|
|
117
|
+
*
|
|
118
|
+
* Rules (in priority order):
|
|
119
|
+
* 1. If an explicit stage is provided and valid, use it.
|
|
120
|
+
* 2. If the task has a parent, inherit the parent's pipelineStage.
|
|
121
|
+
* 3. If the task type is 'epic', default to 'research'.
|
|
122
|
+
* 4. Otherwise default to 'implementation'.
|
|
123
|
+
*
|
|
124
|
+
* @param options.explicitStage - Stage explicitly provided by the caller
|
|
125
|
+
* @param options.taskType - Type of the task being created
|
|
126
|
+
* @param options.parentTask - Parent task (if any), for inheritance
|
|
127
|
+
* @returns The resolved pipeline stage name
|
|
128
|
+
*
|
|
129
|
+
* @task T060
|
|
130
|
+
*/
|
|
131
|
+
export function resolveDefaultPipelineStage(options: {
|
|
132
|
+
explicitStage?: string | null;
|
|
133
|
+
taskType?: TaskType | null;
|
|
134
|
+
parentTask?: ResolvedParent | null;
|
|
135
|
+
}): TaskPipelineStage {
|
|
136
|
+
const { explicitStage, taskType, parentTask } = options;
|
|
137
|
+
|
|
138
|
+
// 1. Caller-supplied explicit stage (validated upstream)
|
|
139
|
+
if (explicitStage && isValidPipelineStage(explicitStage)) {
|
|
140
|
+
return explicitStage;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// 2. Inherit from parent
|
|
144
|
+
if (parentTask?.pipelineStage && isValidPipelineStage(parentTask.pipelineStage)) {
|
|
145
|
+
return parentTask.pipelineStage;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// 3. Epic → research
|
|
149
|
+
if (taskType === 'epic') {
|
|
150
|
+
return 'research';
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// 4. Default
|
|
154
|
+
return 'implementation';
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// =============================================================================
|
|
158
|
+
// TRANSITION VALIDATION
|
|
159
|
+
// =============================================================================
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Get the numeric order of a pipeline stage (1-based).
|
|
163
|
+
*
|
|
164
|
+
* @param stage - Stage name (must be valid)
|
|
165
|
+
* @returns Numeric order, or -1 if not found
|
|
166
|
+
*
|
|
167
|
+
* @task T060
|
|
168
|
+
*/
|
|
169
|
+
export function getPipelineStageOrder(stage: string): number {
|
|
170
|
+
return isValidPipelineStage(stage) ? STAGE_ORDER[stage] : -1;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Check whether transitioning from `currentStage` to `newStage` is forward-only.
|
|
175
|
+
*
|
|
176
|
+
* "Forward" means the new stage's order is greater than or equal to the current
|
|
177
|
+
* stage's order (same stage is a no-op and is considered valid).
|
|
178
|
+
*
|
|
179
|
+
* @param currentStage - The task's current pipeline stage
|
|
180
|
+
* @param newStage - The requested new pipeline stage
|
|
181
|
+
* @returns True if the transition is allowed (forward or same)
|
|
182
|
+
*
|
|
183
|
+
* @task T060
|
|
184
|
+
*/
|
|
185
|
+
export function isPipelineTransitionForward(currentStage: string, newStage: string): boolean {
|
|
186
|
+
const currentOrder = getPipelineStageOrder(currentStage);
|
|
187
|
+
const newOrder = getPipelineStageOrder(newStage);
|
|
188
|
+
if (currentOrder === -1 || newOrder === -1) return true; // unknown stages: allow
|
|
189
|
+
return newOrder >= currentOrder;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Validate a pipeline stage transition and throw if it would move backward.
|
|
194
|
+
*
|
|
195
|
+
* @param currentStage - The task's current pipeline stage (may be null/undefined)
|
|
196
|
+
* @param newStage - The new stage being requested
|
|
197
|
+
* @throws CleoError(VALIDATION_ERROR) if the transition is backward
|
|
198
|
+
*
|
|
199
|
+
* @task T060
|
|
200
|
+
*/
|
|
201
|
+
export function validatePipelineTransition(
|
|
202
|
+
currentStage: string | null | undefined,
|
|
203
|
+
newStage: string,
|
|
204
|
+
): void {
|
|
205
|
+
// Validate the new stage name first
|
|
206
|
+
validatePipelineStage(newStage);
|
|
207
|
+
|
|
208
|
+
if (!currentStage) {
|
|
209
|
+
// No current stage — any valid stage is allowed
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (!isPipelineTransitionForward(currentStage, newStage)) {
|
|
214
|
+
const currentOrder = getPipelineStageOrder(currentStage);
|
|
215
|
+
const newOrder = getPipelineStageOrder(newStage);
|
|
216
|
+
throw new CleoError(
|
|
217
|
+
ExitCode.VALIDATION_ERROR,
|
|
218
|
+
`Pipeline stage transition rejected: cannot move backward from "${currentStage}" (order ${currentOrder}) to "${newStage}" (order ${newOrder}). Tasks can only move forward through pipeline stages.`,
|
|
219
|
+
{
|
|
220
|
+
fix: `Specify a stage at or after "${currentStage}". Valid forward stages: ${TASK_PIPELINE_STAGES.filter((s) => STAGE_ORDER[s] >= currentOrder).join(', ')}`,
|
|
221
|
+
},
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
}
|
package/src/tasks/update.ts
CHANGED
|
@@ -9,6 +9,7 @@ import type { Task, TaskPriority, TaskSize, TaskStatus, TaskType } from '@cleoco
|
|
|
9
9
|
import { ExitCode } from '@cleocode/contracts';
|
|
10
10
|
import { loadConfig } from '../config.js';
|
|
11
11
|
import { CleoError } from '../errors.js';
|
|
12
|
+
import { requireActiveSession } from '../sessions/session-enforcement.js';
|
|
12
13
|
import type { DataAccessor } from '../store/data-accessor.js';
|
|
13
14
|
import { getAccessor } from '../store/data-accessor.js';
|
|
14
15
|
import {
|
|
@@ -20,7 +21,14 @@ import {
|
|
|
20
21
|
validateTitle,
|
|
21
22
|
} from './add.js';
|
|
22
23
|
import { completeTask } from './complete.js';
|
|
24
|
+
import { createAcceptanceEnforcement } from './enforcement.js';
|
|
25
|
+
import {
|
|
26
|
+
findEpicAncestor,
|
|
27
|
+
validateChildStageCeiling,
|
|
28
|
+
validateEpicStageAdvancement,
|
|
29
|
+
} from './epic-enforcement.js';
|
|
23
30
|
import { resolveHierarchyPolicy } from './hierarchy-policy.js';
|
|
31
|
+
import { validatePipelineTransition } from './pipeline-stage.js';
|
|
24
32
|
|
|
25
33
|
const NON_STATUS_DONE_FIELDS: Array<keyof Omit<UpdateTaskOptions, 'taskId' | 'status'>> = [
|
|
26
34
|
'title',
|
|
@@ -41,6 +49,7 @@ const NON_STATUS_DONE_FIELDS: Array<keyof Omit<UpdateTaskOptions, 'taskId' | 'st
|
|
|
41
49
|
'blockedBy',
|
|
42
50
|
'parentId',
|
|
43
51
|
'noAutoComplete',
|
|
52
|
+
'pipelineStage',
|
|
44
53
|
];
|
|
45
54
|
|
|
46
55
|
function hasNonStatusDoneFields(options: UpdateTaskOptions): boolean {
|
|
@@ -69,6 +78,8 @@ export interface UpdateTaskOptions {
|
|
|
69
78
|
blockedBy?: string;
|
|
70
79
|
parentId?: string | null;
|
|
71
80
|
noAutoComplete?: boolean;
|
|
81
|
+
/** RCASD-IVTR+C pipeline stage transition target. Must be >= current stage. @task T060 */
|
|
82
|
+
pipelineStage?: string;
|
|
72
83
|
}
|
|
73
84
|
|
|
74
85
|
/** Result of updating a task. */
|
|
@@ -93,6 +104,9 @@ export async function updateTask(
|
|
|
93
104
|
fix: `Use 'cleo find "${options.taskId}"' to search`,
|
|
94
105
|
});
|
|
95
106
|
}
|
|
107
|
+
|
|
108
|
+
await requireActiveSession('tasks.update', cwd);
|
|
109
|
+
|
|
96
110
|
const changes: string[] = [];
|
|
97
111
|
const now = new Date().toISOString();
|
|
98
112
|
|
|
@@ -114,6 +128,17 @@ export async function updateTask(
|
|
|
114
128
|
);
|
|
115
129
|
}
|
|
116
130
|
|
|
131
|
+
// Enforce Acceptance Criteria on Update
|
|
132
|
+
const enforcement = await createAcceptanceEnforcement(cwd);
|
|
133
|
+
const updateValidation = enforcement.validateUpdate(task, { acceptance: options.acceptance });
|
|
134
|
+
if (!updateValidation.valid) {
|
|
135
|
+
throw new CleoError(
|
|
136
|
+
updateValidation.exitCode ?? ExitCode.VALIDATION_ERROR,
|
|
137
|
+
updateValidation.error!,
|
|
138
|
+
{ fix: updateValidation.fix },
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
117
142
|
// Update fields
|
|
118
143
|
if (options.title !== undefined) {
|
|
119
144
|
validateTitle(options.title);
|
|
@@ -230,6 +255,43 @@ export async function updateTask(
|
|
|
230
255
|
changes.push('noAutoComplete');
|
|
231
256
|
}
|
|
232
257
|
|
|
258
|
+
// Pipeline stage transition — forward-only (T060)
|
|
259
|
+
if (options.pipelineStage !== undefined) {
|
|
260
|
+
validatePipelineTransition(task.pipelineStage, options.pipelineStage);
|
|
261
|
+
|
|
262
|
+
// Epic stage advancement gate (T062): block advancement if children are in-flight
|
|
263
|
+
// at the current stage.
|
|
264
|
+
if (task.type === 'epic' && task.pipelineStage) {
|
|
265
|
+
await validateEpicStageAdvancement(
|
|
266
|
+
{
|
|
267
|
+
epicId: task.id,
|
|
268
|
+
currentStage: task.pipelineStage,
|
|
269
|
+
newStage: options.pipelineStage,
|
|
270
|
+
},
|
|
271
|
+
acc,
|
|
272
|
+
cwd,
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Child stage ceiling (T062): non-epic tasks cannot advance past their epic ancestor.
|
|
277
|
+
if (task.type !== 'epic') {
|
|
278
|
+
const epicAncestor = task.parentId ? await findEpicAncestor(task.parentId, acc) : null;
|
|
279
|
+
// Also check if the direct parent is an epic
|
|
280
|
+
const directParent = task.parentId ? await acc.loadSingleTask(task.parentId) : null;
|
|
281
|
+
const epicToCheck = directParent?.type === 'epic' ? directParent : epicAncestor;
|
|
282
|
+
if (epicToCheck) {
|
|
283
|
+
await validateChildStageCeiling(
|
|
284
|
+
{ childStage: options.pipelineStage, epicId: epicToCheck.id },
|
|
285
|
+
acc,
|
|
286
|
+
cwd,
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
task.pipelineStage = options.pipelineStage;
|
|
292
|
+
changes.push('pipelineStage');
|
|
293
|
+
}
|
|
294
|
+
|
|
233
295
|
// Handle parentId change (reparent) using targeted queries
|
|
234
296
|
// Supports: parentId="T001" to set parent, parentId=null or parentId="" to promote to root
|
|
235
297
|
if (options.parentId !== undefined) {
|
|
@@ -23,6 +23,40 @@
|
|
|
23
23
|
"logSessionEvents": true
|
|
24
24
|
},
|
|
25
25
|
|
|
26
|
+
"enforcement": {
|
|
27
|
+
"acceptance": {
|
|
28
|
+
"mode": "block",
|
|
29
|
+
"requiredForPriorities": ["critical", "high", "medium", "low"],
|
|
30
|
+
"minimumCriteria": 3
|
|
31
|
+
},
|
|
32
|
+
"session": {
|
|
33
|
+
"requiredForMutate": true
|
|
34
|
+
},
|
|
35
|
+
"pipeline": {
|
|
36
|
+
"bindTasksToStage": true
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
"verification": {
|
|
41
|
+
"enabled": true,
|
|
42
|
+
"requiredForTypes": ["epic", "task", "subtask"],
|
|
43
|
+
"autoInitialize": true,
|
|
44
|
+
"maxRounds": 5,
|
|
45
|
+
"requiredGates": ["implemented", "testsPassed", "qaPassed"],
|
|
46
|
+
"autoSetImplementedOnComplete": true,
|
|
47
|
+
"requireForParentAutoComplete": true,
|
|
48
|
+
"allowManualOverride": true
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
"lifecycle": {
|
|
52
|
+
"mode": "strict"
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
"hierarchy": {
|
|
56
|
+
"maxDepth": 3,
|
|
57
|
+
"maxSiblings": 0
|
|
58
|
+
},
|
|
59
|
+
|
|
26
60
|
"validation": {
|
|
27
61
|
"strictMode": false,
|
|
28
62
|
"checksumEnabled": true,
|