@cleocode/core 2026.4.6 → 2026.4.7
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/package.json +7 -7
- package/dist/cant/approval.d.ts +0 -110
- package/dist/cant/approval.d.ts.map +0 -1
- package/dist/cant/context-builder.d.ts +0 -79
- package/dist/cant/context-builder.d.ts.map +0 -1
- package/dist/cant/discretion.d.ts +0 -95
- package/dist/cant/discretion.d.ts.map +0 -1
- package/dist/cant/index.d.ts +0 -25
- package/dist/cant/index.d.ts.map +0 -1
- package/dist/cant/parallel-runner.d.ts +0 -38
- package/dist/cant/parallel-runner.d.ts.map +0 -1
- package/dist/cant/types.d.ts +0 -127
- package/dist/cant/types.d.ts.map +0 -1
- package/dist/cant/workflow-executor.d.ts +0 -105
- package/dist/cant/workflow-executor.d.ts.map +0 -1
- package/src/__tests__/audit-prune.test.d.ts.map +0 -1
- package/src/__tests__/audit-prune.test.js +0 -162
- package/src/__tests__/audit-prune.test.js.map +0 -1
- package/src/__tests__/caamp-skill-install.test.d.ts.map +0 -1
- package/src/__tests__/caamp-skill-install.test.js +0 -147
- package/src/__tests__/caamp-skill-install.test.js.map +0 -1
- package/src/__tests__/cli-parity.test.d.ts.map +0 -1
- package/src/__tests__/cli-parity.test.js +0 -209
- package/src/__tests__/cli-parity.test.js.map +0 -1
- package/src/__tests__/config.test.d.ts.map +0 -1
- package/src/__tests__/config.test.js +0 -144
- package/src/__tests__/config.test.js.map +0 -1
- package/src/__tests__/core-parity.test.d.ts.map +0 -1
- package/src/__tests__/core-parity.test.js +0 -645
- package/src/__tests__/core-parity.test.js.map +0 -1
- package/src/__tests__/error-catalog.test.d.ts.map +0 -1
- package/src/__tests__/error-catalog.test.js +0 -127
- package/src/__tests__/error-catalog.test.js.map +0 -1
- package/src/__tests__/golden-parity.test.d.ts.map +0 -1
- package/src/__tests__/golden-parity.test.js +0 -212
- package/src/__tests__/golden-parity.test.js.map +0 -1
- package/src/__tests__/hooks.test.d.ts.map +0 -1
- package/src/__tests__/hooks.test.js +0 -201
- package/src/__tests__/hooks.test.js.map +0 -1
- package/src/__tests__/human-output.test.d.ts.map +0 -1
- package/src/__tests__/human-output.test.js +0 -158
- package/src/__tests__/human-output.test.js.map +0 -1
- package/src/__tests__/index-api-compat.test.d.ts.map +0 -1
- package/src/__tests__/index-api-compat.test.js +0 -16
- package/src/__tests__/index-api-compat.test.js.map +0 -1
- package/src/__tests__/init-e2e.test.d.ts.map +0 -1
- package/src/__tests__/init-e2e.test.js +0 -221
- package/src/__tests__/init-e2e.test.js.map +0 -1
- package/src/__tests__/injection-chain.test.d.ts.map +0 -1
- package/src/__tests__/injection-chain.test.js +0 -234
- package/src/__tests__/injection-chain.test.js.map +0 -1
- package/src/__tests__/injection-mvi-tiers.test.d.ts.map +0 -1
- package/src/__tests__/injection-mvi-tiers.test.js +0 -116
- package/src/__tests__/injection-mvi-tiers.test.js.map +0 -1
- package/src/__tests__/injection-shared.test.d.ts.map +0 -1
- package/src/__tests__/injection-shared.test.js +0 -194
- package/src/__tests__/injection-shared.test.js.map +0 -1
- package/src/__tests__/lafs-conformance.test.d.ts.map +0 -1
- package/src/__tests__/lafs-conformance.test.js +0 -786
- package/src/__tests__/lafs-conformance.test.js.map +0 -1
- package/src/__tests__/logger.test.d.ts.map +0 -1
- package/src/__tests__/logger.test.js +0 -75
- package/src/__tests__/logger.test.js.map +0 -1
- package/src/__tests__/paths.test.d.ts.map +0 -1
- package/src/__tests__/paths.test.js +0 -327
- package/src/__tests__/paths.test.js.map +0 -1
- package/src/__tests__/project-info.test.d.ts.map +0 -1
- package/src/__tests__/project-info.test.js +0 -156
- package/src/__tests__/project-info.test.js.map +0 -1
- package/src/__tests__/rcsd-pipeline-e2e.test.d.ts.map +0 -1
- package/src/__tests__/rcsd-pipeline-e2e.test.js +0 -263
- package/src/__tests__/rcsd-pipeline-e2e.test.js.map +0 -1
- package/src/__tests__/remote.test.d.ts.map +0 -1
- package/src/__tests__/remote.test.js +0 -149
- package/src/__tests__/remote.test.js.map +0 -1
- package/src/__tests__/scaffold.test.d.ts.map +0 -1
- package/src/__tests__/scaffold.test.js +0 -474
- package/src/__tests__/scaffold.test.js.map +0 -1
- package/src/__tests__/schema-management.test.d.ts.map +0 -1
- package/src/__tests__/schema-management.test.js +0 -287
- package/src/__tests__/schema-management.test.js.map +0 -1
- package/src/__tests__/schema.test.d.ts.map +0 -1
- package/src/__tests__/schema.test.js +0 -51
- package/src/__tests__/schema.test.js.map +0 -1
- package/src/__tests__/sharing.test.d.ts.map +0 -1
- package/src/__tests__/sharing.test.js +0 -160
- package/src/__tests__/sharing.test.js.map +0 -1
- package/src/__tests__/snapshot.test.d.ts.map +0 -1
- package/src/__tests__/snapshot.test.js +0 -72
- package/src/__tests__/snapshot.test.js.map +0 -1
- package/src/__tests__/upgrade.test.d.ts.map +0 -1
- package/src/__tests__/upgrade.test.js +0 -321
- package/src/__tests__/upgrade.test.js.map +0 -1
- package/src/adapters/__tests__/discovery.test.d.ts.map +0 -1
- package/src/adapters/__tests__/discovery.test.js +0 -56
- package/src/adapters/__tests__/discovery.test.js.map +0 -1
- package/src/adapters/__tests__/manager.test.d.ts.map +0 -1
- package/src/adapters/__tests__/manager.test.js +0 -260
- package/src/adapters/__tests__/manager.test.js.map +0 -1
- package/src/agents/__tests__/agent-registry.test.d.ts.map +0 -1
- package/src/agents/__tests__/agent-registry.test.js +0 -262
- package/src/agents/__tests__/agent-registry.test.js.map +0 -1
- package/src/agents/__tests__/capacity.test.d.ts.map +0 -1
- package/src/agents/__tests__/capacity.test.js +0 -173
- package/src/agents/__tests__/capacity.test.js.map +0 -1
- package/src/agents/__tests__/execution-learning.test.d.ts.map +0 -1
- package/src/agents/__tests__/execution-learning.test.js +0 -533
- package/src/agents/__tests__/execution-learning.test.js.map +0 -1
- package/src/agents/__tests__/health-monitor.test.d.ts.map +0 -1
- package/src/agents/__tests__/health-monitor.test.js +0 -259
- package/src/agents/__tests__/health-monitor.test.js.map +0 -1
- package/src/agents/__tests__/registry.test.d.ts.map +0 -1
- package/src/agents/__tests__/registry.test.js +0 -373
- package/src/agents/__tests__/registry.test.js.map +0 -1
- package/src/agents/__tests__/retry.test.d.ts.map +0 -1
- package/src/agents/__tests__/retry.test.js +0 -225
- package/src/agents/__tests__/retry.test.js.map +0 -1
- package/src/cant/__tests__/cant-agent-parse.test.d.ts.map +0 -1
- package/src/cant/__tests__/cant-agent-parse.test.js +0 -77
- package/src/cant/__tests__/cant-agent-parse.test.js.map +0 -1
- package/src/cant/__tests__/cant-agent-parse.test.ts +0 -94
- package/src/cant/approval.ts +0 -218
- package/src/cant/context-builder.ts +0 -135
- package/src/cant/discretion.ts +0 -149
- package/src/cant/index.ts +0 -58
- package/src/cant/parallel-runner.ts +0 -205
- package/src/cant/types.ts +0 -158
- package/src/cant/workflow-executor.ts +0 -618
- package/src/compliance/__tests__/sync.test.d.ts.map +0 -1
- package/src/compliance/__tests__/sync.test.js +0 -119
- package/src/compliance/__tests__/sync.test.js.map +0 -1
- package/src/conduit/__tests__/local-credential-flow.test.d.ts.map +0 -1
- package/src/conduit/__tests__/local-credential-flow.test.js +0 -185
- package/src/conduit/__tests__/local-credential-flow.test.js.map +0 -1
- package/src/conduit/__tests__/local-transport.test.d.ts.map +0 -1
- package/src/conduit/__tests__/local-transport.test.js +0 -404
- package/src/conduit/__tests__/local-transport.test.js.map +0 -1
- package/src/conduit/__tests__/sse-transport.test.d.ts.map +0 -1
- package/src/conduit/__tests__/sse-transport.test.js +0 -291
- package/src/conduit/__tests__/sse-transport.test.js.map +0 -1
- package/src/hooks/__tests__/provider-hooks.test.d.ts.map +0 -1
- package/src/hooks/__tests__/provider-hooks.test.js +0 -33
- package/src/hooks/__tests__/provider-hooks.test.js.map +0 -1
- package/src/hooks/__tests__/registry.test.d.ts.map +0 -1
- package/src/hooks/__tests__/registry.test.js +0 -37
- package/src/hooks/__tests__/registry.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/error-hooks.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/error-hooks.test.js +0 -90
- package/src/hooks/handlers/__tests__/error-hooks.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/file-hooks.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/file-hooks.test.js +0 -128
- package/src/hooks/handlers/__tests__/file-hooks.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js +0 -503
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/session-hooks.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/session-hooks.test.js +0 -54
- package/src/hooks/handlers/__tests__/session-hooks.test.js.map +0 -1
- package/src/hooks/handlers/__tests__/task-hooks.test.d.ts.map +0 -1
- package/src/hooks/handlers/__tests__/task-hooks.test.js +0 -77
- package/src/hooks/handlers/__tests__/task-hooks.test.js.map +0 -1
- package/src/intelligence/__tests__/adaptive-validation.test.d.ts.map +0 -1
- package/src/intelligence/__tests__/adaptive-validation.test.js +0 -517
- package/src/intelligence/__tests__/adaptive-validation.test.js.map +0 -1
- package/src/intelligence/__tests__/impact.test.d.ts.map +0 -1
- package/src/intelligence/__tests__/impact.test.js +0 -515
- package/src/intelligence/__tests__/impact.test.js.map +0 -1
- package/src/intelligence/__tests__/patterns.test.d.ts.map +0 -1
- package/src/intelligence/__tests__/patterns.test.js +0 -370
- package/src/intelligence/__tests__/patterns.test.js.map +0 -1
- package/src/intelligence/__tests__/prediction.test.d.ts.map +0 -1
- package/src/intelligence/__tests__/prediction.test.js +0 -314
- package/src/intelligence/__tests__/prediction.test.js.map +0 -1
- package/src/lib/__tests__/retry.test.d.ts.map +0 -1
- package/src/lib/__tests__/retry.test.js +0 -225
- package/src/lib/__tests__/retry.test.js.map +0 -1
- package/src/lifecycle/__tests__/chain-store.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/chain-store.test.js +0 -243
- package/src/lifecycle/__tests__/chain-store.test.js.map +0 -1
- package/src/lifecycle/__tests__/consolidate-rcasd.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/consolidate-rcasd.test.js +0 -210
- package/src/lifecycle/__tests__/consolidate-rcasd.test.js.map +0 -1
- package/src/lifecycle/__tests__/default-chain.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/default-chain.test.js +0 -74
- package/src/lifecycle/__tests__/default-chain.test.js.map +0 -1
- package/src/lifecycle/__tests__/frontmatter.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/frontmatter.test.js +0 -229
- package/src/lifecycle/__tests__/frontmatter.test.js.map +0 -1
- package/src/lifecycle/__tests__/lifecycle.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/lifecycle.test.js +0 -126
- package/src/lifecycle/__tests__/lifecycle.test.js.map +0 -1
- package/src/lifecycle/__tests__/pipeline.integration.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/pipeline.integration.test.js +0 -977
- package/src/lifecycle/__tests__/pipeline.integration.test.js.map +0 -1
- package/src/lifecycle/__tests__/rcasd-paths.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/rcasd-paths.test.js +0 -206
- package/src/lifecycle/__tests__/rcasd-paths.test.js.map +0 -1
- package/src/lifecycle/__tests__/resume-schema-contract.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/resume-schema-contract.test.js +0 -246
- package/src/lifecycle/__tests__/resume-schema-contract.test.js.map +0 -1
- package/src/lifecycle/__tests__/stage-record-provenance.integration.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/stage-record-provenance.integration.test.js +0 -95
- package/src/lifecycle/__tests__/stage-record-provenance.integration.test.js.map +0 -1
- package/src/lifecycle/__tests__/tessera-engine.test.d.ts.map +0 -1
- package/src/lifecycle/__tests__/tessera-engine.test.js +0 -392
- package/src/lifecycle/__tests__/tessera-engine.test.js.map +0 -1
- package/src/memory/__tests__/auto-extract.test.d.ts.map +0 -1
- package/src/memory/__tests__/auto-extract.test.js +0 -197
- package/src/memory/__tests__/auto-extract.test.js.map +0 -1
- package/src/memory/__tests__/brain-automation.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-automation.test.js +0 -730
- package/src/memory/__tests__/brain-automation.test.js.map +0 -1
- package/src/memory/__tests__/brain-embedding.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-embedding.test.js +0 -92
- package/src/memory/__tests__/brain-embedding.test.js.map +0 -1
- package/src/memory/__tests__/brain-links.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-links.test.js +0 -221
- package/src/memory/__tests__/brain-links.test.js.map +0 -1
- package/src/memory/__tests__/brain-migration.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-migration.test.js +0 -180
- package/src/memory/__tests__/brain-migration.test.js.map +0 -1
- package/src/memory/__tests__/brain-retrieval.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-retrieval.test.js +0 -701
- package/src/memory/__tests__/brain-retrieval.test.js.map +0 -1
- package/src/memory/__tests__/brain-search.test.d.ts.map +0 -1
- package/src/memory/__tests__/brain-search.test.js +0 -180
- package/src/memory/__tests__/brain-search.test.js.map +0 -1
- package/src/memory/__tests__/claude-mem-migration.test.d.ts.map +0 -1
- package/src/memory/__tests__/claude-mem-migration.test.js +0 -424
- package/src/memory/__tests__/claude-mem-migration.test.js.map +0 -1
- package/src/memory/__tests__/decisions.test.d.ts.map +0 -1
- package/src/memory/__tests__/decisions.test.js +0 -253
- package/src/memory/__tests__/decisions.test.js.map +0 -1
- package/src/memory/__tests__/engine-compat.test.d.ts.map +0 -1
- package/src/memory/__tests__/engine-compat.test.js +0 -331
- package/src/memory/__tests__/engine-compat.test.js.map +0 -1
- package/src/memory/__tests__/memory-bridge.test.d.ts.map +0 -1
- package/src/memory/__tests__/memory-bridge.test.js +0 -231
- package/src/memory/__tests__/memory-bridge.test.js.map +0 -1
- package/src/memory/__tests__/pipeline-manifest-sqlite.test.d.ts.map +0 -1
- package/src/memory/__tests__/pipeline-manifest-sqlite.test.js +0 -516
- package/src/memory/__tests__/pipeline-manifest-sqlite.test.js.map +0 -1
- package/src/memory/__tests__/session-memory.test.d.ts.map +0 -1
- package/src/memory/__tests__/session-memory.test.js +0 -387
- package/src/memory/__tests__/session-memory.test.js.map +0 -1
- package/src/metrics/__tests__/model-provider-registry.test.d.ts.map +0 -1
- package/src/metrics/__tests__/model-provider-registry.test.js +0 -45
- package/src/metrics/__tests__/model-provider-registry.test.js.map +0 -1
- package/src/metrics/__tests__/provider-detection.test.d.ts.map +0 -1
- package/src/metrics/__tests__/provider-detection.test.js +0 -123
- package/src/metrics/__tests__/provider-detection.test.js.map +0 -1
- package/src/migration/__tests__/checksum.test.d.ts.map +0 -1
- package/src/migration/__tests__/checksum.test.js +0 -216
- package/src/migration/__tests__/checksum.test.js.map +0 -1
- package/src/migration/__tests__/logger.test.d.ts.map +0 -1
- package/src/migration/__tests__/logger.test.js +0 -256
- package/src/migration/__tests__/logger.test.js.map +0 -1
- package/src/migration/__tests__/migration-failure.integration.test.d.ts.map +0 -1
- package/src/migration/__tests__/migration-failure.integration.test.js +0 -515
- package/src/migration/__tests__/migration-failure.integration.test.js.map +0 -1
- package/src/migration/__tests__/migration.test.d.ts.map +0 -1
- package/src/migration/__tests__/migration.test.js +0 -82
- package/src/migration/__tests__/migration.test.js.map +0 -1
- package/src/migration/__tests__/state.test.d.ts.map +0 -1
- package/src/migration/__tests__/state.test.js +0 -330
- package/src/migration/__tests__/state.test.js.map +0 -1
- package/src/migration/__tests__/validate.test.d.ts.map +0 -1
- package/src/migration/__tests__/validate.test.js +0 -258
- package/src/migration/__tests__/validate.test.js.map +0 -1
- package/src/nexus/__tests__/deps.test.d.ts.map +0 -1
- package/src/nexus/__tests__/deps.test.js +0 -283
- package/src/nexus/__tests__/deps.test.js.map +0 -1
- package/src/nexus/__tests__/nexus-e2e.test.d.ts.map +0 -1
- package/src/nexus/__tests__/nexus-e2e.test.js +0 -1220
- package/src/nexus/__tests__/nexus-e2e.test.js.map +0 -1
- package/src/nexus/__tests__/permissions.test.d.ts.map +0 -1
- package/src/nexus/__tests__/permissions.test.js +0 -119
- package/src/nexus/__tests__/permissions.test.js.map +0 -1
- package/src/nexus/__tests__/query.test.d.ts.map +0 -1
- package/src/nexus/__tests__/query.test.js +0 -168
- package/src/nexus/__tests__/query.test.js.map +0 -1
- package/src/nexus/__tests__/reconcile.test.d.ts.map +0 -1
- package/src/nexus/__tests__/reconcile.test.js +0 -135
- package/src/nexus/__tests__/reconcile.test.js.map +0 -1
- package/src/nexus/__tests__/registry.test.d.ts.map +0 -1
- package/src/nexus/__tests__/registry.test.js +0 -229
- package/src/nexus/__tests__/registry.test.js.map +0 -1
- package/src/nexus/__tests__/transfer.test.d.ts.map +0 -1
- package/src/nexus/__tests__/transfer.test.js +0 -372
- package/src/nexus/__tests__/transfer.test.js.map +0 -1
- package/src/observability/__tests__/index.test.d.ts.map +0 -1
- package/src/observability/__tests__/index.test.js +0 -288
- package/src/observability/__tests__/index.test.js.map +0 -1
- package/src/observability/__tests__/log-filter.test.d.ts.map +0 -1
- package/src/observability/__tests__/log-filter.test.js +0 -151
- package/src/observability/__tests__/log-filter.test.js.map +0 -1
- package/src/observability/__tests__/log-parser.test.d.ts.map +0 -1
- package/src/observability/__tests__/log-parser.test.js +0 -170
- package/src/observability/__tests__/log-parser.test.js.map +0 -1
- package/src/observability/__tests__/log-reader.test.d.ts.map +0 -1
- package/src/observability/__tests__/log-reader.test.js +0 -150
- package/src/observability/__tests__/log-reader.test.js.map +0 -1
- package/src/orchestration/__tests__/autonomous-spec.test.d.ts.map +0 -1
- package/src/orchestration/__tests__/autonomous-spec.test.js +0 -419
- package/src/orchestration/__tests__/autonomous-spec.test.js.map +0 -1
- package/src/orchestration/__tests__/orchestration.test.d.ts.map +0 -1
- package/src/orchestration/__tests__/orchestration.test.js +0 -205
- package/src/orchestration/__tests__/orchestration.test.js.map +0 -1
- package/src/orchestration/__tests__/protocol-validators.test.d.ts.map +0 -1
- package/src/orchestration/__tests__/protocol-validators.test.js +0 -602
- package/src/orchestration/__tests__/protocol-validators.test.js.map +0 -1
- package/src/phases/__tests__/deps.test.d.ts.map +0 -1
- package/src/phases/__tests__/deps.test.js +0 -210
- package/src/phases/__tests__/deps.test.js.map +0 -1
- package/src/phases/__tests__/phases.test.d.ts.map +0 -1
- package/src/phases/__tests__/phases.test.js +0 -215
- package/src/phases/__tests__/phases.test.js.map +0 -1
- package/src/release/__tests__/artifacts.test.d.ts.map +0 -1
- package/src/release/__tests__/artifacts.test.js +0 -65
- package/src/release/__tests__/artifacts.test.js.map +0 -1
- package/src/release/__tests__/cancel-release.test.d.ts.map +0 -1
- package/src/release/__tests__/cancel-release.test.js +0 -154
- package/src/release/__tests__/cancel-release.test.js.map +0 -1
- package/src/release/__tests__/changelog-writer.test.d.ts.map +0 -1
- package/src/release/__tests__/changelog-writer.test.js +0 -132
- package/src/release/__tests__/changelog-writer.test.js.map +0 -1
- package/src/release/__tests__/push-policy.test.d.ts.map +0 -1
- package/src/release/__tests__/push-policy.test.js +0 -142
- package/src/release/__tests__/push-policy.test.js.map +0 -1
- package/src/release/__tests__/release.test.d.ts.map +0 -1
- package/src/release/__tests__/release.test.js +0 -25
- package/src/release/__tests__/release.test.js.map +0 -1
- package/src/sequence/__tests__/allocate.test.d.ts.map +0 -1
- package/src/sequence/__tests__/allocate.test.js +0 -113
- package/src/sequence/__tests__/allocate.test.js.map +0 -1
- package/src/sessions/__tests__/briefing-blocked.test.d.ts.map +0 -1
- package/src/sessions/__tests__/briefing-blocked.test.js +0 -117
- package/src/sessions/__tests__/briefing-blocked.test.js.map +0 -1
- package/src/sessions/__tests__/briefing.test.d.ts.map +0 -1
- package/src/sessions/__tests__/briefing.test.js +0 -336
- package/src/sessions/__tests__/briefing.test.js.map +0 -1
- package/src/sessions/__tests__/handoff-integration.test.d.ts.map +0 -1
- package/src/sessions/__tests__/handoff-integration.test.js +0 -264
- package/src/sessions/__tests__/handoff-integration.test.js.map +0 -1
- package/src/sessions/__tests__/handoff.test.d.ts.map +0 -1
- package/src/sessions/__tests__/handoff.test.js +0 -435
- package/src/sessions/__tests__/handoff.test.js.map +0 -1
- package/src/sessions/__tests__/index.test.d.ts.map +0 -1
- package/src/sessions/__tests__/index.test.js +0 -82
- package/src/sessions/__tests__/index.test.js.map +0 -1
- package/src/sessions/__tests__/session-cleanup.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-cleanup.test.js +0 -201
- package/src/sessions/__tests__/session-cleanup.test.js.map +0 -1
- package/src/sessions/__tests__/session-edge-cases.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-edge-cases.test.js +0 -251
- package/src/sessions/__tests__/session-edge-cases.test.js.map +0 -1
- package/src/sessions/__tests__/session-find.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-find.test.js +0 -210
- package/src/sessions/__tests__/session-find.test.js.map +0 -1
- package/src/sessions/__tests__/session-grade.integration.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-grade.integration.test.js +0 -287
- package/src/sessions/__tests__/session-grade.integration.test.js.map +0 -1
- package/src/sessions/__tests__/session-grade.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-grade.test.js +0 -630
- package/src/sessions/__tests__/session-grade.test.js.map +0 -1
- package/src/sessions/__tests__/session-memory-bridge.test.d.ts.map +0 -1
- package/src/sessions/__tests__/session-memory-bridge.test.js +0 -52
- package/src/sessions/__tests__/session-memory-bridge.test.js.map +0 -1
- package/src/sessions/__tests__/sessions.test.d.ts.map +0 -1
- package/src/sessions/__tests__/sessions.test.js +0 -113
- package/src/sessions/__tests__/sessions.test.js.map +0 -1
- package/src/skills/__tests__/discovery.test.d.ts.map +0 -1
- package/src/skills/__tests__/discovery.test.js +0 -171
- package/src/skills/__tests__/discovery.test.js.map +0 -1
- package/src/skills/__tests__/dispatch.test.d.ts.map +0 -1
- package/src/skills/__tests__/dispatch.test.js +0 -99
- package/src/skills/__tests__/dispatch.test.js.map +0 -1
- package/src/skills/__tests__/dynamic-skill-generator.test.d.ts.map +0 -1
- package/src/skills/__tests__/dynamic-skill-generator.test.js +0 -77
- package/src/skills/__tests__/dynamic-skill-generator.test.js.map +0 -1
- package/src/skills/__tests__/manifests.test.d.ts.map +0 -1
- package/src/skills/__tests__/manifests.test.js +0 -121
- package/src/skills/__tests__/manifests.test.js.map +0 -1
- package/src/skills/__tests__/precedence.test.d.ts.map +0 -1
- package/src/skills/__tests__/precedence.test.js +0 -325
- package/src/skills/__tests__/precedence.test.js.map +0 -1
- package/src/skills/__tests__/routing-table.test.d.ts.map +0 -1
- package/src/skills/__tests__/routing-table.test.js +0 -91
- package/src/skills/__tests__/routing-table.test.js.map +0 -1
- package/src/skills/__tests__/skill-paths.test.d.ts.map +0 -1
- package/src/skills/__tests__/skill-paths.test.js +0 -71
- package/src/skills/__tests__/skill-paths.test.js.map +0 -1
- package/src/skills/__tests__/test-utility.test.d.ts.map +0 -1
- package/src/skills/__tests__/test-utility.test.js +0 -59
- package/src/skills/__tests__/test-utility.test.js.map +0 -1
- package/src/skills/__tests__/token.test.d.ts.map +0 -1
- package/src/skills/__tests__/token.test.js +0 -135
- package/src/skills/__tests__/token.test.js.map +0 -1
- package/src/skills/__tests__/validation.test.d.ts.map +0 -1
- package/src/skills/__tests__/validation.test.js +0 -108
- package/src/skills/__tests__/validation.test.js.map +0 -1
- package/src/skills/__tests__/version.test.d.ts.map +0 -1
- package/src/skills/__tests__/version.test.js +0 -71
- package/src/skills/__tests__/version.test.js.map +0 -1
- package/src/skills/injection/__tests__/subagent.test.d.ts.map +0 -1
- package/src/skills/injection/__tests__/subagent.test.js +0 -122
- package/src/skills/injection/__tests__/subagent.test.js.map +0 -1
- package/src/skills/orchestrator/__tests__/spawn-tier.test.d.ts.map +0 -1
- package/src/skills/orchestrator/__tests__/spawn-tier.test.js +0 -228
- package/src/skills/orchestrator/__tests__/spawn-tier.test.js.map +0 -1
- package/src/spawn/__tests__/adapter-registry.test.d.ts.map +0 -1
- package/src/spawn/__tests__/adapter-registry.test.js +0 -76
- package/src/spawn/__tests__/adapter-registry.test.js.map +0 -1
- package/src/stats/__tests__/stats.test.d.ts.map +0 -1
- package/src/stats/__tests__/stats.test.js +0 -374
- package/src/stats/__tests__/stats.test.js.map +0 -1
- package/src/sticky/__tests__/purge.test.d.ts.map +0 -1
- package/src/sticky/__tests__/purge.test.js +0 -64
- package/src/sticky/__tests__/purge.test.js.map +0 -1
- package/src/store/__tests__/atomic.test.d.ts.map +0 -1
- package/src/store/__tests__/atomic.test.js +0 -81
- package/src/store/__tests__/atomic.test.js.map +0 -1
- package/src/store/__tests__/backup.test.d.ts.map +0 -1
- package/src/store/__tests__/backup.test.js +0 -131
- package/src/store/__tests__/backup.test.js.map +0 -1
- package/src/store/__tests__/brain-accessor-pageindex.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-accessor-pageindex.test.js +0 -179
- package/src/store/__tests__/brain-accessor-pageindex.test.js.map +0 -1
- package/src/store/__tests__/brain-accessor.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-accessor.test.js +0 -398
- package/src/store/__tests__/brain-accessor.test.js.map +0 -1
- package/src/store/__tests__/brain-pageindex.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-pageindex.test.js +0 -137
- package/src/store/__tests__/brain-pageindex.test.js.map +0 -1
- package/src/store/__tests__/brain-schema.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-schema.test.js +0 -137
- package/src/store/__tests__/brain-schema.test.js.map +0 -1
- package/src/store/__tests__/brain-vec.test.d.ts.map +0 -1
- package/src/store/__tests__/brain-vec.test.js +0 -100
- package/src/store/__tests__/brain-vec.test.js.map +0 -1
- package/src/store/__tests__/collision-detection.test.d.ts.map +0 -1
- package/src/store/__tests__/collision-detection.test.js +0 -165
- package/src/store/__tests__/collision-detection.test.js.map +0 -1
- package/src/store/__tests__/data-safety-central.test.d.ts.map +0 -1
- package/src/store/__tests__/data-safety-central.test.js +0 -408
- package/src/store/__tests__/data-safety-central.test.js.map +0 -1
- package/src/store/__tests__/db-helpers.test.d.ts.map +0 -1
- package/src/store/__tests__/db-helpers.test.js +0 -101
- package/src/store/__tests__/db-helpers.test.js.map +0 -1
- package/src/store/__tests__/e2e-safety-integration.test.d.ts.map +0 -1
- package/src/store/__tests__/e2e-safety-integration.test.js +0 -402
- package/src/store/__tests__/e2e-safety-integration.test.js.map +0 -1
- package/src/store/__tests__/git-checkpoint.test.d.ts.map +0 -1
- package/src/store/__tests__/git-checkpoint.test.js +0 -133
- package/src/store/__tests__/git-checkpoint.test.js.map +0 -1
- package/src/store/__tests__/idempotent-migration.test.d.ts.map +0 -1
- package/src/store/__tests__/idempotent-migration.test.js +0 -172
- package/src/store/__tests__/idempotent-migration.test.js.map +0 -1
- package/src/store/__tests__/import-logging.test.d.ts.map +0 -1
- package/src/store/__tests__/import-logging.test.js +0 -92
- package/src/store/__tests__/import-logging.test.js.map +0 -1
- package/src/store/__tests__/import-sort.test.d.ts.map +0 -1
- package/src/store/__tests__/import-sort.test.js +0 -109
- package/src/store/__tests__/import-sort.test.js.map +0 -1
- package/src/store/__tests__/json.test.d.ts.map +0 -1
- package/src/store/__tests__/json.test.js +0 -98
- package/src/store/__tests__/json.test.js.map +0 -1
- package/src/store/__tests__/lifecycle-schema-parity.test.d.ts.map +0 -1
- package/src/store/__tests__/lifecycle-schema-parity.test.js +0 -90
- package/src/store/__tests__/lifecycle-schema-parity.test.js.map +0 -1
- package/src/store/__tests__/migration-integration.test.d.ts.map +0 -1
- package/src/store/__tests__/migration-integration.test.js +0 -238
- package/src/store/__tests__/migration-integration.test.js.map +0 -1
- package/src/store/__tests__/migration-retry.test.d.ts.map +0 -1
- package/src/store/__tests__/migration-retry.test.js +0 -178
- package/src/store/__tests__/migration-retry.test.js.map +0 -1
- package/src/store/__tests__/migration-safety.test.d.ts.map +0 -1
- package/src/store/__tests__/migration-safety.test.js +0 -756
- package/src/store/__tests__/migration-safety.test.js.map +0 -1
- package/src/store/__tests__/migration-sqlite.test.d.ts.map +0 -1
- package/src/store/__tests__/migration-sqlite.test.js +0 -544
- package/src/store/__tests__/migration-sqlite.test.js.map +0 -1
- package/src/store/__tests__/performance-safety.test.d.ts.map +0 -1
- package/src/store/__tests__/performance-safety.test.js +0 -157
- package/src/store/__tests__/performance-safety.test.js.map +0 -1
- package/src/store/__tests__/project-detect.test.d.ts.map +0 -1
- package/src/store/__tests__/project-detect.test.js +0 -609
- package/src/store/__tests__/project-detect.test.js.map +0 -1
- package/src/store/__tests__/project-registry.test.d.ts.map +0 -1
- package/src/store/__tests__/project-registry.test.js +0 -28
- package/src/store/__tests__/project-registry.test.js.map +0 -1
- package/src/store/__tests__/provider.test.d.ts.map +0 -1
- package/src/store/__tests__/provider.test.js +0 -15
- package/src/store/__tests__/provider.test.js.map +0 -1
- package/src/store/__tests__/relations.test.d.ts.map +0 -1
- package/src/store/__tests__/relations.test.js +0 -318
- package/src/store/__tests__/relations.test.js.map +0 -1
- package/src/store/__tests__/safety-accessor.test.d.ts.map +0 -1
- package/src/store/__tests__/safety-accessor.test.js +0 -219
- package/src/store/__tests__/safety-accessor.test.js.map +0 -1
- package/src/store/__tests__/sequence-validation.test.d.ts.map +0 -1
- package/src/store/__tests__/sequence-validation.test.js +0 -94
- package/src/store/__tests__/sequence-validation.test.js.map +0 -1
- package/src/store/__tests__/session-store.test.d.ts.map +0 -1
- package/src/store/__tests__/session-store.test.js +0 -463
- package/src/store/__tests__/session-store.test.js.map +0 -1
- package/src/store/__tests__/sqlite-backup.test.d.ts.map +0 -1
- package/src/store/__tests__/sqlite-backup.test.js +0 -72
- package/src/store/__tests__/sqlite-backup.test.js.map +0 -1
- package/src/store/__tests__/sqlite.test.d.ts.map +0 -1
- package/src/store/__tests__/sqlite.test.js +0 -256
- package/src/store/__tests__/sqlite.test.js.map +0 -1
- package/src/store/__tests__/task-store.test.d.ts.map +0 -1
- package/src/store/__tests__/task-store.test.js +0 -514
- package/src/store/__tests__/task-store.test.js.map +0 -1
- package/src/store/__tests__/test-db-helper.d.ts.map +0 -1
- package/src/store/__tests__/test-db-helper.js +0 -110
- package/src/store/__tests__/test-db-helper.js.map +0 -1
- package/src/store/__tests__/write-verification.test.d.ts.map +0 -1
- package/src/store/__tests__/write-verification.test.js +0 -185
- package/src/store/__tests__/write-verification.test.js.map +0 -1
- package/src/system/__tests__/cleanup.test.d.ts.map +0 -1
- package/src/system/__tests__/cleanup.test.js +0 -87
- package/src/system/__tests__/cleanup.test.js.map +0 -1
- package/src/system/__tests__/health.test.d.ts.map +0 -1
- package/src/system/__tests__/health.test.js +0 -55
- package/src/system/__tests__/health.test.js.map +0 -1
- package/src/task-work/__tests__/start-deps.test.d.ts.map +0 -1
- package/src/task-work/__tests__/start-deps.test.js +0 -152
- package/src/task-work/__tests__/start-deps.test.js.map +0 -1
- package/src/tasks/__tests__/add.test.d.ts.map +0 -1
- package/src/tasks/__tests__/add.test.js +0 -226
- package/src/tasks/__tests__/add.test.js.map +0 -1
- package/src/tasks/__tests__/archive.test.d.ts.map +0 -1
- package/src/tasks/__tests__/archive.test.js +0 -196
- package/src/tasks/__tests__/archive.test.js.map +0 -1
- package/src/tasks/__tests__/assignee.test.d.ts.map +0 -1
- package/src/tasks/__tests__/assignee.test.js +0 -125
- package/src/tasks/__tests__/assignee.test.js.map +0 -1
- package/src/tasks/__tests__/atomicity.test.d.ts.map +0 -1
- package/src/tasks/__tests__/atomicity.test.js +0 -192
- package/src/tasks/__tests__/atomicity.test.js.map +0 -1
- package/src/tasks/__tests__/cancel-ops.test.d.ts.map +0 -1
- package/src/tasks/__tests__/cancel-ops.test.js +0 -115
- package/src/tasks/__tests__/cancel-ops.test.js.map +0 -1
- package/src/tasks/__tests__/complete-unblocks.test.d.ts.map +0 -1
- package/src/tasks/__tests__/complete-unblocks.test.js +0 -151
- package/src/tasks/__tests__/complete-unblocks.test.js.map +0 -1
- package/src/tasks/__tests__/complete.test.d.ts.map +0 -1
- package/src/tasks/__tests__/complete.test.js +0 -230
- package/src/tasks/__tests__/complete.test.js.map +0 -1
- package/src/tasks/__tests__/delete.test.d.ts.map +0 -1
- package/src/tasks/__tests__/delete.test.js +0 -183
- package/src/tasks/__tests__/delete.test.js.map +0 -1
- package/src/tasks/__tests__/dependency-check.test.d.ts.map +0 -1
- package/src/tasks/__tests__/dependency-check.test.js +0 -293
- package/src/tasks/__tests__/dependency-check.test.js.map +0 -1
- package/src/tasks/__tests__/deps-ready.test.d.ts.map +0 -1
- package/src/tasks/__tests__/deps-ready.test.js +0 -68
- package/src/tasks/__tests__/deps-ready.test.js.map +0 -1
- package/src/tasks/__tests__/epic-enforcement.test.d.ts.map +0 -1
- package/src/tasks/__tests__/epic-enforcement.test.js +0 -669
- package/src/tasks/__tests__/epic-enforcement.test.js.map +0 -1
- package/src/tasks/__tests__/find.test.d.ts.map +0 -1
- package/src/tasks/__tests__/find.test.js +0 -163
- package/src/tasks/__tests__/find.test.js.map +0 -1
- package/src/tasks/__tests__/graph-ops.test.d.ts.map +0 -1
- package/src/tasks/__tests__/graph-ops.test.js +0 -174
- package/src/tasks/__tests__/graph-ops.test.js.map +0 -1
- package/src/tasks/__tests__/hierarchy-policy.test.d.ts.map +0 -1
- package/src/tasks/__tests__/hierarchy-policy.test.js +0 -399
- package/src/tasks/__tests__/hierarchy-policy.test.js.map +0 -1
- package/src/tasks/__tests__/hierarchy.test.d.ts.map +0 -1
- package/src/tasks/__tests__/hierarchy.test.js +0 -302
- package/src/tasks/__tests__/hierarchy.test.js.map +0 -1
- package/src/tasks/__tests__/id-generator.test.d.ts.map +0 -1
- package/src/tasks/__tests__/id-generator.test.js +0 -59
- package/src/tasks/__tests__/id-generator.test.js.map +0 -1
- package/src/tasks/__tests__/labels.test.d.ts.map +0 -1
- package/src/tasks/__tests__/labels.test.js +0 -173
- package/src/tasks/__tests__/labels.test.js.map +0 -1
- package/src/tasks/__tests__/list.test.d.ts.map +0 -1
- package/src/tasks/__tests__/list.test.js +0 -272
- package/src/tasks/__tests__/list.test.js.map +0 -1
- package/src/tasks/__tests__/minimal-test.test.d.ts.map +0 -1
- package/src/tasks/__tests__/minimal-test.test.js +0 -25
- package/src/tasks/__tests__/minimal-test.test.js.map +0 -1
- package/src/tasks/__tests__/phase-tracking.test.d.ts.map +0 -1
- package/src/tasks/__tests__/phase-tracking.test.js +0 -209
- package/src/tasks/__tests__/phase-tracking.test.js.map +0 -1
- package/src/tasks/__tests__/pipeline-stage.test.d.ts.map +0 -1
- package/src/tasks/__tests__/pipeline-stage.test.js +0 -277
- package/src/tasks/__tests__/pipeline-stage.test.js.map +0 -1
- package/src/tasks/__tests__/plan-priority.test.d.ts.map +0 -1
- package/src/tasks/__tests__/plan-priority.test.js +0 -133
- package/src/tasks/__tests__/plan-priority.test.js.map +0 -1
- package/src/tasks/__tests__/priority-normalization.test.d.ts.map +0 -1
- package/src/tasks/__tests__/priority-normalization.test.js +0 -117
- package/src/tasks/__tests__/priority-normalization.test.js.map +0 -1
- package/src/tasks/__tests__/relates.test.d.ts.map +0 -1
- package/src/tasks/__tests__/relates.test.js +0 -84
- package/src/tasks/__tests__/relates.test.js.map +0 -1
- package/src/tasks/__tests__/show-deps.test.d.ts.map +0 -1
- package/src/tasks/__tests__/show-deps.test.js +0 -182
- package/src/tasks/__tests__/show-deps.test.js.map +0 -1
- package/src/tasks/__tests__/show.test.d.ts.map +0 -1
- package/src/tasks/__tests__/show.test.js +0 -126
- package/src/tasks/__tests__/show.test.js.map +0 -1
- package/src/tasks/__tests__/staleness.test.d.ts.map +0 -1
- package/src/tasks/__tests__/staleness.test.js +0 -154
- package/src/tasks/__tests__/staleness.test.js.map +0 -1
- package/src/tasks/__tests__/task-ops-depends.test.d.ts.map +0 -1
- package/src/tasks/__tests__/task-ops-depends.test.js +0 -118
- package/src/tasks/__tests__/task-ops-depends.test.js.map +0 -1
- package/src/tasks/__tests__/update.test.d.ts.map +0 -1
- package/src/tasks/__tests__/update.test.js +0 -320
- package/src/tasks/__tests__/update.test.js.map +0 -1
- package/src/validation/__tests__/chain-validation.test.d.ts.map +0 -1
- package/src/validation/__tests__/chain-validation.test.js +0 -204
- package/src/validation/__tests__/chain-validation.test.js.map +0 -1
- package/src/validation/__tests__/compliance.test.d.ts.map +0 -1
- package/src/validation/__tests__/compliance.test.js +0 -83
- package/src/validation/__tests__/compliance.test.js.map +0 -1
- package/src/validation/__tests__/docs-sync.test.d.ts.map +0 -1
- package/src/validation/__tests__/docs-sync.test.js +0 -243
- package/src/validation/__tests__/docs-sync.test.js.map +0 -1
- package/src/validation/__tests__/doctor-gitignore.test.d.ts.map +0 -1
- package/src/validation/__tests__/doctor-gitignore.test.js +0 -154
- package/src/validation/__tests__/doctor-gitignore.test.js.map +0 -1
- package/src/validation/__tests__/doctor-injection.test.d.ts.map +0 -1
- package/src/validation/__tests__/doctor-injection.test.js +0 -230
- package/src/validation/__tests__/doctor-injection.test.js.map +0 -1
- package/src/validation/__tests__/doctor.test.d.ts.map +0 -1
- package/src/validation/__tests__/doctor.test.js +0 -202
- package/src/validation/__tests__/doctor.test.js.map +0 -1
- package/src/validation/__tests__/engine.test.d.ts.map +0 -1
- package/src/validation/__tests__/engine.test.js +0 -346
- package/src/validation/__tests__/engine.test.js.map +0 -1
- package/src/validation/__tests__/manifest.test.d.ts.map +0 -1
- package/src/validation/__tests__/manifest.test.js +0 -244
- package/src/validation/__tests__/manifest.test.js.map +0 -1
- package/src/validation/__tests__/protocol-common.test.d.ts.map +0 -1
- package/src/validation/__tests__/protocol-common.test.js +0 -112
- package/src/validation/__tests__/protocol-common.test.js.map +0 -1
- package/src/validation/__tests__/verification.test.d.ts.map +0 -1
- package/src/validation/__tests__/verification.test.js +0 -277
- package/src/validation/__tests__/verification.test.js.map +0 -1
|
@@ -1,977 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RCASD-IVTR+C Pipeline Integration Test
|
|
3
|
-
*
|
|
4
|
-
* End-to-end test exercising the full RCASD-IVTR+C lifecycle through all 9 stages.
|
|
5
|
-
* This is the final validation test for epic T4798.
|
|
6
|
-
*
|
|
7
|
-
* Test Coverage:
|
|
8
|
-
* 1. Full pipeline flow through all 9 stages
|
|
9
|
-
* 2. Gate enforcement (blocking and allowing transitions)
|
|
10
|
-
* 3. Evidence recording across stages
|
|
11
|
-
* 4. Cross-session resume capability
|
|
12
|
-
* 5. Pipeline completion verification
|
|
13
|
-
*
|
|
14
|
-
* @task T4806
|
|
15
|
-
* @epic T4798
|
|
16
|
-
* @audit T4799 - Validates unified pipeline implementation
|
|
17
|
-
*/
|
|
18
|
-
import { mkdir, mkdtemp, rm } from 'node:fs/promises';
|
|
19
|
-
import { tmpdir } from 'node:os';
|
|
20
|
-
import { join } from 'node:path';
|
|
21
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
22
|
-
// Legacy lifecycle (for cross-session resume testing)
|
|
23
|
-
import { failGate, getLifecycleHistory, getLifecycleStatus, passGate, recordStageProgress, } from '../index.js';
|
|
24
|
-
// Pipeline (stub implementations - validates expected behavior)
|
|
25
|
-
import { advanceStage, cancelPipeline, completePipeline, getCurrentStage, getPipeline, initializePipeline, } from '../pipeline.js';
|
|
26
|
-
// Stage definitions
|
|
27
|
-
import { checkTransition as checkTransitionRaw, getPrerequisites as getPrerequisitesRaw, PIPELINE_STAGES, STAGE_DEFINITIONS as STAGE_DEFINITIONS_RAW, STAGE_ORDER as STAGE_ORDER_RAW, } from '../stages.js';
|
|
28
|
-
// State machine (fully implemented)
|
|
29
|
-
import { checkPrerequisites as checkPrerequisitesRaw, createInitialContext, executeTransition as executeTransitionRaw, getCurrentStageState, getValidNextStages, isBlocked, isTerminalState, setStageStatus as setStageStatusRaw, skipStage as skipStageRaw, validateTransition as validateTransitionRaw, } from '../state-machine.js';
|
|
30
|
-
let testDir;
|
|
31
|
-
let cleoDir;
|
|
32
|
-
async function ensureTaskExists(taskId) {
|
|
33
|
-
const { getDb, getNativeDb } = await import('../../store/sqlite.js');
|
|
34
|
-
await getDb();
|
|
35
|
-
getNativeDb()
|
|
36
|
-
.prepare(`INSERT OR IGNORE INTO tasks (id, title, status, priority, created_at) VALUES (?, ?, 'pending', 'medium', datetime('now'))`)
|
|
37
|
-
.run(taskId, `Task ${taskId}`);
|
|
38
|
-
}
|
|
39
|
-
const LEGACY_TO_CANONICAL = {
|
|
40
|
-
adr: 'architecture_decision',
|
|
41
|
-
spec: 'specification',
|
|
42
|
-
decompose: 'decomposition',
|
|
43
|
-
implement: 'implementation',
|
|
44
|
-
verify: 'validation',
|
|
45
|
-
test: 'testing',
|
|
46
|
-
};
|
|
47
|
-
const CANONICAL_TO_LEGACY = {
|
|
48
|
-
architecture_decision: 'adr',
|
|
49
|
-
specification: 'spec',
|
|
50
|
-
decomposition: 'decompose',
|
|
51
|
-
implementation: 'implement',
|
|
52
|
-
validation: 'verify',
|
|
53
|
-
testing: 'test',
|
|
54
|
-
};
|
|
55
|
-
function toCanonical(stage) {
|
|
56
|
-
return (LEGACY_TO_CANONICAL[stage] ?? stage);
|
|
57
|
-
}
|
|
58
|
-
function toLegacy(stage) {
|
|
59
|
-
return CANONICAL_TO_LEGACY[stage] ?? stage;
|
|
60
|
-
}
|
|
61
|
-
function addLegacyAliases(context) {
|
|
62
|
-
const stages = context.stages;
|
|
63
|
-
for (const [legacy, canonical] of Object.entries(LEGACY_TO_CANONICAL)) {
|
|
64
|
-
stages[legacy] = stages[canonical];
|
|
65
|
-
}
|
|
66
|
-
return {
|
|
67
|
-
...context,
|
|
68
|
-
stages: stages,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
function executeTransition(transition, context) {
|
|
72
|
-
return executeTransitionRaw({
|
|
73
|
-
...transition,
|
|
74
|
-
from: toCanonical(transition.from),
|
|
75
|
-
to: toCanonical(transition.to),
|
|
76
|
-
}, context).then((result) => ({
|
|
77
|
-
...result,
|
|
78
|
-
context: addLegacyAliases(result.context),
|
|
79
|
-
}));
|
|
80
|
-
}
|
|
81
|
-
function validateTransition(transition, context) {
|
|
82
|
-
return validateTransitionRaw({
|
|
83
|
-
...transition,
|
|
84
|
-
from: toCanonical(transition.from),
|
|
85
|
-
to: toCanonical(transition.to),
|
|
86
|
-
}, context);
|
|
87
|
-
}
|
|
88
|
-
function checkPrerequisites(stage, stages) {
|
|
89
|
-
return checkPrerequisitesRaw(toCanonical(stage), stages);
|
|
90
|
-
}
|
|
91
|
-
function setStageStatus(stage, status, context) {
|
|
92
|
-
const canonical = toCanonical(stage);
|
|
93
|
-
const next = setStageStatusRaw(canonical, status, context);
|
|
94
|
-
context.stages[canonical] = next;
|
|
95
|
-
context.stages[stage] = next;
|
|
96
|
-
return next;
|
|
97
|
-
}
|
|
98
|
-
function skipStage(stage, reason, context) {
|
|
99
|
-
return skipStageRaw(toCanonical(stage), reason, context);
|
|
100
|
-
}
|
|
101
|
-
const STAGE_ORDER = new Proxy(STAGE_ORDER_RAW, {
|
|
102
|
-
get(target, prop) {
|
|
103
|
-
return target[toCanonical(prop)];
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
const STAGE_DEFINITIONS = new Proxy(STAGE_DEFINITIONS_RAW, {
|
|
107
|
-
get(target, prop) {
|
|
108
|
-
return target[toCanonical(prop)];
|
|
109
|
-
},
|
|
110
|
-
});
|
|
111
|
-
function getPrerequisites(stage) {
|
|
112
|
-
return getPrerequisitesRaw(toCanonical(stage));
|
|
113
|
-
}
|
|
114
|
-
function checkTransition(from, to, force) {
|
|
115
|
-
return checkTransitionRaw(toCanonical(from), toCanonical(to), force);
|
|
116
|
-
}
|
|
117
|
-
describe('RCASD-IVTR+C Pipeline Integration', () => {
|
|
118
|
-
beforeEach(async () => {
|
|
119
|
-
testDir = await mkdtemp(join(tmpdir(), 'cleo-pipeline-test-'));
|
|
120
|
-
cleoDir = join(testDir, '.cleo');
|
|
121
|
-
await mkdir(cleoDir, { recursive: true });
|
|
122
|
-
await mkdir(join(cleoDir, 'rcasd'), { recursive: true });
|
|
123
|
-
await mkdir(join(cleoDir, 'backups', 'operational'), { recursive: true });
|
|
124
|
-
process.env['CLEO_DIR'] = cleoDir;
|
|
125
|
-
process.env['LIFECYCLE_ENFORCEMENT_MODE'] = 'off';
|
|
126
|
-
});
|
|
127
|
-
afterEach(async () => {
|
|
128
|
-
// Close ALL SQLite connections before cleanup — Windows locks open files
|
|
129
|
-
try {
|
|
130
|
-
const { closeAllDatabases } = await import('../../store/sqlite.js');
|
|
131
|
-
await closeAllDatabases();
|
|
132
|
-
}
|
|
133
|
-
catch {
|
|
134
|
-
/* module may not be loaded */
|
|
135
|
-
}
|
|
136
|
-
delete process.env['CLEO_DIR'];
|
|
137
|
-
delete process.env['LIFECYCLE_ENFORCEMENT_MODE'];
|
|
138
|
-
await rm(testDir, { recursive: true, force: true });
|
|
139
|
-
vi.restoreAllMocks();
|
|
140
|
-
});
|
|
141
|
-
// =============================================================================
|
|
142
|
-
// FULL PIPELINE FLOW TEST
|
|
143
|
-
// =============================================================================
|
|
144
|
-
describe('full pipeline flow through all 9 stages', () => {
|
|
145
|
-
it('should complete all 9 stages with state machine transitions', async () => {
|
|
146
|
-
const pipelineId = 'T4806';
|
|
147
|
-
let context = createInitialContext(pipelineId, 'test-agent');
|
|
148
|
-
// Stage 1: Research
|
|
149
|
-
expect(context.currentStage).toBe('research');
|
|
150
|
-
expect(context.stages['research'].status).toBe('in_progress');
|
|
151
|
-
// Mark research as completed before transitioning
|
|
152
|
-
context.stages['research'] = setStageStatus('research', 'completed', context);
|
|
153
|
-
// Complete research and transition to consensus
|
|
154
|
-
const researchTransition = {
|
|
155
|
-
from: 'research',
|
|
156
|
-
to: 'consensus',
|
|
157
|
-
initiatedBy: 'test-agent',
|
|
158
|
-
};
|
|
159
|
-
let result = await executeTransition(researchTransition, context);
|
|
160
|
-
expect(result.success).toBe(true);
|
|
161
|
-
context = result.context;
|
|
162
|
-
expect(context.currentStage).toBe('consensus');
|
|
163
|
-
expect(context.stages['research'].status).toBe('completed');
|
|
164
|
-
// Stage 2: Consensus - mark as completed and transition to architecture_decision
|
|
165
|
-
context.stages['consensus'] = setStageStatus('consensus', 'completed', context);
|
|
166
|
-
const consensusTransition = {
|
|
167
|
-
from: 'consensus',
|
|
168
|
-
to: 'architecture_decision',
|
|
169
|
-
initiatedBy: 'test-agent',
|
|
170
|
-
};
|
|
171
|
-
result = await executeTransition(consensusTransition, context);
|
|
172
|
-
expect(result.success).toBe(true);
|
|
173
|
-
context = result.context;
|
|
174
|
-
expect(context.currentStage).toBe('architecture_decision');
|
|
175
|
-
// Stage 3: ADR - mark as completed and transition to specification
|
|
176
|
-
context.stages['architecture_decision'] = setStageStatus('architecture_decision', 'completed', context);
|
|
177
|
-
const adrTransition = {
|
|
178
|
-
from: 'architecture_decision',
|
|
179
|
-
to: 'specification',
|
|
180
|
-
initiatedBy: 'test-agent',
|
|
181
|
-
};
|
|
182
|
-
result = await executeTransition(adrTransition, context);
|
|
183
|
-
expect(result.success).toBe(true);
|
|
184
|
-
context = result.context;
|
|
185
|
-
expect(context.currentStage).toBe('specification');
|
|
186
|
-
// Stage 4: Spec - mark as completed and transition to decomposition
|
|
187
|
-
context.stages['specification'] = setStageStatus('specification', 'completed', context);
|
|
188
|
-
const specTransition = {
|
|
189
|
-
from: 'specification',
|
|
190
|
-
to: 'decomposition',
|
|
191
|
-
initiatedBy: 'test-agent',
|
|
192
|
-
};
|
|
193
|
-
result = await executeTransition(specTransition, context);
|
|
194
|
-
expect(result.success).toBe(true);
|
|
195
|
-
context = result.context;
|
|
196
|
-
expect(context.currentStage).toBe('decomposition');
|
|
197
|
-
// Stage 5: Decompose - mark as completed and transition to implementation
|
|
198
|
-
context.stages['decomposition'] = setStageStatus('decomposition', 'completed', context);
|
|
199
|
-
const decomposeTransition = {
|
|
200
|
-
from: 'decomposition',
|
|
201
|
-
to: 'implementation',
|
|
202
|
-
initiatedBy: 'test-agent',
|
|
203
|
-
};
|
|
204
|
-
result = await executeTransition(decomposeTransition, context);
|
|
205
|
-
expect(result.success).toBe(true);
|
|
206
|
-
context = result.context;
|
|
207
|
-
expect(context.currentStage).toBe('implementation');
|
|
208
|
-
// Stage 6: Implement - mark as completed and transition to validation
|
|
209
|
-
context.stages['implementation'] = setStageStatus('implementation', 'completed', context);
|
|
210
|
-
const implementTransition = {
|
|
211
|
-
from: 'implementation',
|
|
212
|
-
to: 'validation',
|
|
213
|
-
initiatedBy: 'test-agent',
|
|
214
|
-
};
|
|
215
|
-
result = await executeTransition(implementTransition, context);
|
|
216
|
-
expect(result.success).toBe(true);
|
|
217
|
-
context = result.context;
|
|
218
|
-
expect(context.currentStage).toBe('validation');
|
|
219
|
-
// Stage 7: Verify - mark as completed and transition to testing
|
|
220
|
-
context.stages['validation'] = setStageStatus('validation', 'completed', context);
|
|
221
|
-
const verifyTransition = {
|
|
222
|
-
from: 'validation',
|
|
223
|
-
to: 'testing',
|
|
224
|
-
initiatedBy: 'test-agent',
|
|
225
|
-
};
|
|
226
|
-
result = await executeTransition(verifyTransition, context);
|
|
227
|
-
expect(result.success).toBe(true);
|
|
228
|
-
context = result.context;
|
|
229
|
-
expect(context.currentStage).toBe('testing');
|
|
230
|
-
// Stage 8: Test - mark as completed and transition to release
|
|
231
|
-
context.stages['testing'] = setStageStatus('testing', 'completed', context);
|
|
232
|
-
const testTransition = {
|
|
233
|
-
from: 'testing',
|
|
234
|
-
to: 'release',
|
|
235
|
-
initiatedBy: 'test-agent',
|
|
236
|
-
};
|
|
237
|
-
result = await executeTransition(testTransition, context);
|
|
238
|
-
expect(result.success).toBe(true);
|
|
239
|
-
context = result.context;
|
|
240
|
-
expect(context.currentStage).toBe('release');
|
|
241
|
-
// Stage 9: Release - complete it
|
|
242
|
-
const releaseState = setStageStatus('release', 'completed', context);
|
|
243
|
-
context.stages['release'] = releaseState;
|
|
244
|
-
// Verify all stages completed
|
|
245
|
-
expect(context.stages['research'].status).toBe('completed');
|
|
246
|
-
expect(context.stages['consensus'].status).toBe('completed');
|
|
247
|
-
expect(context.stages['architecture_decision'].status).toBe('completed');
|
|
248
|
-
expect(context.stages['specification'].status).toBe('completed');
|
|
249
|
-
expect(context.stages['decomposition'].status).toBe('completed');
|
|
250
|
-
expect(context.stages['implementation'].status).toBe('completed');
|
|
251
|
-
expect(context.stages['validation'].status).toBe('completed');
|
|
252
|
-
expect(context.stages['testing'].status).toBe('completed');
|
|
253
|
-
expect(context.stages['release'].status).toBe('completed');
|
|
254
|
-
// Verify terminal state
|
|
255
|
-
expect(isTerminalState(context)).toBe(true);
|
|
256
|
-
expect(context.transitionCount).toBe(8);
|
|
257
|
-
});
|
|
258
|
-
it('should track stage order correctly', () => {
|
|
259
|
-
expect(STAGE_ORDER['research']).toBe(1);
|
|
260
|
-
expect(STAGE_ORDER['consensus']).toBe(2);
|
|
261
|
-
expect(STAGE_ORDER['adr']).toBe(3);
|
|
262
|
-
expect(STAGE_ORDER['spec']).toBe(4);
|
|
263
|
-
expect(STAGE_ORDER['decompose']).toBe(5);
|
|
264
|
-
expect(STAGE_ORDER['implement']).toBe(6);
|
|
265
|
-
expect(STAGE_ORDER['verify']).toBe(7);
|
|
266
|
-
expect(STAGE_ORDER['test']).toBe(8);
|
|
267
|
-
expect(STAGE_ORDER['release']).toBe(9);
|
|
268
|
-
});
|
|
269
|
-
it('should have correct stage definitions for all 9 stages', () => {
|
|
270
|
-
expect(STAGE_DEFINITIONS['research'].order).toBe(1);
|
|
271
|
-
expect(STAGE_DEFINITIONS['consensus'].order).toBe(2);
|
|
272
|
-
expect(STAGE_DEFINITIONS['adr'].order).toBe(3);
|
|
273
|
-
expect(STAGE_DEFINITIONS['spec'].order).toBe(4);
|
|
274
|
-
expect(STAGE_DEFINITIONS['decompose'].order).toBe(5);
|
|
275
|
-
expect(STAGE_DEFINITIONS['implement'].order).toBe(6);
|
|
276
|
-
expect(STAGE_DEFINITIONS['verify'].order).toBe(7);
|
|
277
|
-
expect(STAGE_DEFINITIONS['test'].order).toBe(8);
|
|
278
|
-
expect(STAGE_DEFINITIONS['release'].order).toBe(9);
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
// =============================================================================
|
|
282
|
-
// GATE ENFORCEMENT TESTS
|
|
283
|
-
// =============================================================================
|
|
284
|
-
describe('gate enforcement blocks invalid transitions', () => {
|
|
285
|
-
it('should block transition when prerequisites are not met', async () => {
|
|
286
|
-
const pipelineId = 'T4806';
|
|
287
|
-
const context = createInitialContext(pipelineId, 'test-agent');
|
|
288
|
-
// Try to skip ahead to implementation without completing decomposition
|
|
289
|
-
const invalidTransition = {
|
|
290
|
-
from: 'research',
|
|
291
|
-
to: 'implementation',
|
|
292
|
-
initiatedBy: 'test-agent',
|
|
293
|
-
};
|
|
294
|
-
const validation = await validateTransition(invalidTransition, context);
|
|
295
|
-
expect(validation.valid).toBe(false);
|
|
296
|
-
expect(validation.errors.length).toBeGreaterThan(0);
|
|
297
|
-
expect(validation.prerequisitesMet).toBe(false);
|
|
298
|
-
});
|
|
299
|
-
it('should block backward transitions without force flag', async () => {
|
|
300
|
-
const pipelineId = 'T4806';
|
|
301
|
-
let context = createInitialContext(pipelineId, 'test-agent');
|
|
302
|
-
// Mark research as completed before transitioning
|
|
303
|
-
context.stages['research'] = setStageStatus('research', 'completed', context);
|
|
304
|
-
// Move to consensus
|
|
305
|
-
const transition = {
|
|
306
|
-
from: 'research',
|
|
307
|
-
to: 'consensus',
|
|
308
|
-
initiatedBy: 'test-agent',
|
|
309
|
-
};
|
|
310
|
-
const result = await executeTransition(transition, context);
|
|
311
|
-
expect(result.success).toBe(true);
|
|
312
|
-
context = result.context;
|
|
313
|
-
// Try to go back to research without force
|
|
314
|
-
const backwardTransition = {
|
|
315
|
-
from: 'consensus',
|
|
316
|
-
to: 'research',
|
|
317
|
-
initiatedBy: 'test-agent',
|
|
318
|
-
};
|
|
319
|
-
const validation = await validateTransition(backwardTransition, context);
|
|
320
|
-
expect(validation.valid).toBe(false);
|
|
321
|
-
expect(validation.requiresForce).toBe(true);
|
|
322
|
-
});
|
|
323
|
-
it('should require force to skip non-skippable stages', async () => {
|
|
324
|
-
const check = checkTransition('research', 'spec', false);
|
|
325
|
-
// spec requires force because it would skip consensus and adr
|
|
326
|
-
expect(check.requiresForce).toBe(true);
|
|
327
|
-
});
|
|
328
|
-
it('should detect blocked state correctly', async () => {
|
|
329
|
-
const pipelineId = 'T4806';
|
|
330
|
-
const context = createInitialContext(pipelineId, 'test-agent');
|
|
331
|
-
expect(isBlocked(context)).toBe(false);
|
|
332
|
-
// Set research as blocked
|
|
333
|
-
context.stages['research'].status = 'blocked';
|
|
334
|
-
expect(isBlocked(context)).toBe(true);
|
|
335
|
-
});
|
|
336
|
-
it('should validate prerequisite requirements per stage', () => {
|
|
337
|
-
// Research has no prerequisites
|
|
338
|
-
expect(getPrerequisites('research')).toEqual([]);
|
|
339
|
-
// Consensus requires research
|
|
340
|
-
expect(getPrerequisites('consensus')).toContain('research');
|
|
341
|
-
// Spec requires research, consensus, adr
|
|
342
|
-
const specPrereqs = getPrerequisites('spec');
|
|
343
|
-
expect(specPrereqs).toContain('research');
|
|
344
|
-
expect(specPrereqs).toContain('consensus');
|
|
345
|
-
expect(specPrereqs).toContain('architecture_decision');
|
|
346
|
-
// Implement requires research, spec, decompose
|
|
347
|
-
const implementPrereqs = getPrerequisites('implement');
|
|
348
|
-
expect(implementPrereqs).toContain('research');
|
|
349
|
-
expect(implementPrereqs).toContain('specification');
|
|
350
|
-
expect(implementPrereqs).toContain('decomposition');
|
|
351
|
-
});
|
|
352
|
-
});
|
|
353
|
-
describe('gate enforcement allows valid transitions', () => {
|
|
354
|
-
it('should allow sequential progression with prerequisites met', async () => {
|
|
355
|
-
const pipelineId = 'T4806';
|
|
356
|
-
const context = createInitialContext(pipelineId, 'test-agent');
|
|
357
|
-
// Mark research as completed
|
|
358
|
-
context.stages['research'] = setStageStatus('research', 'completed', context);
|
|
359
|
-
// Complete research
|
|
360
|
-
const transition = {
|
|
361
|
-
from: 'research',
|
|
362
|
-
to: 'consensus',
|
|
363
|
-
initiatedBy: 'test-agent',
|
|
364
|
-
};
|
|
365
|
-
const validation = await validateTransition(transition, context);
|
|
366
|
-
expect(validation.valid).toBe(true);
|
|
367
|
-
expect(validation.ruleAllowed).toBe(true);
|
|
368
|
-
expect(validation.prerequisitesMet).toBe(true);
|
|
369
|
-
});
|
|
370
|
-
it('should allow skipping optional stages', async () => {
|
|
371
|
-
const pipelineId = 'T4806';
|
|
372
|
-
const context = createInitialContext(pipelineId, 'test-agent');
|
|
373
|
-
// Mark consensus as skipped (it's skippable)
|
|
374
|
-
context.stages['consensus'] = skipStage('consensus', 'Not needed', context);
|
|
375
|
-
context.stages['consensus'].status = 'skipped';
|
|
376
|
-
// Now try to transition to adr (prerequisite is research, which is in_progress)
|
|
377
|
-
// First complete research
|
|
378
|
-
context.stages['research'].status = 'completed';
|
|
379
|
-
context.stages['research'].completedAt = new Date();
|
|
380
|
-
const transition = {
|
|
381
|
-
from: 'research',
|
|
382
|
-
to: 'architecture_decision',
|
|
383
|
-
initiatedBy: 'test-agent',
|
|
384
|
-
};
|
|
385
|
-
const validation = await validateTransition(transition, context);
|
|
386
|
-
// architecture_decision requires research and consensus - consensus is skipped which is acceptable
|
|
387
|
-
expect(validation.prerequisitesMet).toBe(true);
|
|
388
|
-
});
|
|
389
|
-
it('should allow backward transition with force flag', async () => {
|
|
390
|
-
const pipelineId = 'T4806';
|
|
391
|
-
let context = createInitialContext(pipelineId, 'test-agent');
|
|
392
|
-
// Mark research as completed before transitioning
|
|
393
|
-
context.stages['research'] = setStageStatus('research', 'completed', context);
|
|
394
|
-
// Move forward
|
|
395
|
-
const forwardTransition = {
|
|
396
|
-
from: 'research',
|
|
397
|
-
to: 'consensus',
|
|
398
|
-
initiatedBy: 'test-agent',
|
|
399
|
-
};
|
|
400
|
-
let result = await executeTransition(forwardTransition, context);
|
|
401
|
-
expect(result.success).toBe(true);
|
|
402
|
-
context = result.context;
|
|
403
|
-
// Mark consensus as completed before going back
|
|
404
|
-
context.stages['consensus'] = setStageStatus('consensus', 'completed', context);
|
|
405
|
-
// Go back with force
|
|
406
|
-
const backwardTransition = {
|
|
407
|
-
from: 'consensus',
|
|
408
|
-
to: 'research',
|
|
409
|
-
initiatedBy: 'test-agent',
|
|
410
|
-
force: true,
|
|
411
|
-
};
|
|
412
|
-
result = await executeTransition(backwardTransition, context);
|
|
413
|
-
expect(result.success).toBe(true);
|
|
414
|
-
expect(result.context.currentStage).toBe('research');
|
|
415
|
-
});
|
|
416
|
-
it('should identify valid next stages', () => {
|
|
417
|
-
const pipelineId = 'T4806';
|
|
418
|
-
const context = createInitialContext(pipelineId, 'test-agent');
|
|
419
|
-
const validNext = getValidNextStages(context, false);
|
|
420
|
-
expect(validNext).toContain('consensus');
|
|
421
|
-
});
|
|
422
|
-
});
|
|
423
|
-
// =============================================================================
|
|
424
|
-
// EVIDENCE RECORDING TESTS
|
|
425
|
-
// =============================================================================
|
|
426
|
-
describe('evidence recording works across stages', () => {
|
|
427
|
-
it('should record stage completion timestamps', async () => {
|
|
428
|
-
const pipelineId = 'T4806';
|
|
429
|
-
let context = createInitialContext(pipelineId, 'test-agent');
|
|
430
|
-
const beforeTime = new Date();
|
|
431
|
-
// Mark research as completed before transitioning
|
|
432
|
-
context.stages['research'] = setStageStatus('research', 'completed', context);
|
|
433
|
-
const transition = {
|
|
434
|
-
from: 'research',
|
|
435
|
-
to: 'consensus',
|
|
436
|
-
initiatedBy: 'test-agent',
|
|
437
|
-
};
|
|
438
|
-
const result = await executeTransition(transition, context);
|
|
439
|
-
context = result.context;
|
|
440
|
-
const researchCompletedAt = context.stages['research'].completedAt;
|
|
441
|
-
expect(researchCompletedAt).toBeDefined();
|
|
442
|
-
expect(researchCompletedAt.getTime()).toBeGreaterThanOrEqual(beforeTime.getTime());
|
|
443
|
-
});
|
|
444
|
-
it('should record gate results with timestamp [T4801 SQLite-native]', async () => {
|
|
445
|
-
// T4801: Now uses SQLite-native gate tracking
|
|
446
|
-
const epicId = 'T4806';
|
|
447
|
-
const gateResult = await passGate(epicId, 'research-prerequisites-met', 'test-agent', 'All prerequisites verified', testDir);
|
|
448
|
-
expect(gateResult.epicId).toBe(epicId);
|
|
449
|
-
expect(gateResult.gateName).toBe('research-prerequisites-met');
|
|
450
|
-
expect(gateResult.timestamp).toBeDefined();
|
|
451
|
-
});
|
|
452
|
-
it('should record failed gate with reason [T4801 SQLite-native]', async () => {
|
|
453
|
-
// T4801: Now uses SQLite-native gate tracking
|
|
454
|
-
const epicId = 'T4806';
|
|
455
|
-
const gateResult = await failGate(epicId, 'specification-incomplete', 'Missing acceptance criteria', testDir);
|
|
456
|
-
expect(gateResult.epicId).toBe(epicId);
|
|
457
|
-
expect(gateResult.gateName).toBe('specification-incomplete');
|
|
458
|
-
expect(gateResult.reason).toBe('Missing acceptance criteria');
|
|
459
|
-
});
|
|
460
|
-
it('should maintain stage state metadata', () => {
|
|
461
|
-
const pipelineId = 'T4806';
|
|
462
|
-
const context = createInitialContext(pipelineId, 'test-agent');
|
|
463
|
-
expect(context.stages['research'].assignedAgent).toBe('test-agent');
|
|
464
|
-
expect(context.stages['research'].status).toBe('in_progress');
|
|
465
|
-
expect(context.stages['research'].startedAt).toBeDefined();
|
|
466
|
-
});
|
|
467
|
-
it('should track transition count', async () => {
|
|
468
|
-
const pipelineId = 'T4806';
|
|
469
|
-
let context = createInitialContext(pipelineId, 'test-agent');
|
|
470
|
-
expect(context.transitionCount).toBe(0);
|
|
471
|
-
expect(context.version).toBe(1);
|
|
472
|
-
// Mark research as completed before transitioning
|
|
473
|
-
context.stages['research'] = setStageStatus('research', 'completed', context);
|
|
474
|
-
const transition = {
|
|
475
|
-
from: 'research',
|
|
476
|
-
to: 'consensus',
|
|
477
|
-
initiatedBy: 'test-agent',
|
|
478
|
-
};
|
|
479
|
-
const result = await executeTransition(transition, context);
|
|
480
|
-
context = result.context;
|
|
481
|
-
expect(context.transitionCount).toBe(1);
|
|
482
|
-
});
|
|
483
|
-
});
|
|
484
|
-
// =============================================================================
|
|
485
|
-
// CROSS-SESSION RESUME TESTS
|
|
486
|
-
// =============================================================================
|
|
487
|
-
describe('cross-session resume preserves context', () => {
|
|
488
|
-
it('should restore pipeline state from SQLite [T4801]', async () => {
|
|
489
|
-
// T4801: Now uses SQLite-native storage
|
|
490
|
-
const epicId = 'T4806';
|
|
491
|
-
// Simulate session A: progress through some stages
|
|
492
|
-
await recordStageProgress(epicId, 'research', 'completed', 'Initial research done', testDir);
|
|
493
|
-
await recordStageProgress(epicId, 'consensus', 'completed', 'Consensus reached', testDir);
|
|
494
|
-
await recordStageProgress(epicId, 'architecture_decision', 'skipped', 'Simple change, no ADR needed', testDir);
|
|
495
|
-
await recordStageProgress(epicId, 'specification', 'completed', 'Spec written', testDir);
|
|
496
|
-
// Simulate session B: read state and continue
|
|
497
|
-
const status = await getLifecycleStatus(epicId, testDir);
|
|
498
|
-
expect(status.initialized).toBe(true);
|
|
499
|
-
expect(status.currentStage).toBe('specification');
|
|
500
|
-
// Continue in session B
|
|
501
|
-
await recordStageProgress(epicId, 'decomposition', 'completed', 'Task breakdown complete', testDir);
|
|
502
|
-
const updatedStatus = await getLifecycleStatus(epicId, testDir);
|
|
503
|
-
expect(updatedStatus.currentStage).toBe('decomposition');
|
|
504
|
-
});
|
|
505
|
-
it('should preserve gate results across sessions [T4801]', async () => {
|
|
506
|
-
// T4801: Now uses SQLite-native storage
|
|
507
|
-
const epicId = 'T4806';
|
|
508
|
-
// Session A: record gate passes
|
|
509
|
-
await passGate(epicId, 'research-complete', 'agent-a', 'Research verified', testDir);
|
|
510
|
-
await passGate(epicId, 'specification-reviewed', 'agent-a', 'Spec approved', testDir);
|
|
511
|
-
// Session B: verify gates are still recorded
|
|
512
|
-
const history = await getLifecycleHistory(epicId, testDir);
|
|
513
|
-
const gateEvents = history.history.filter((h) => h.action.startsWith('gate.'));
|
|
514
|
-
expect(gateEvents.length).toBe(2);
|
|
515
|
-
});
|
|
516
|
-
it('should maintain stage timestamps across sessions [T4801]', async () => {
|
|
517
|
-
// T4801: Now uses SQLite-native storage
|
|
518
|
-
const epicId = 'T4806';
|
|
519
|
-
const beforeTime = new Date().toISOString();
|
|
520
|
-
// Record progress
|
|
521
|
-
await recordStageProgress(epicId, 'research', 'completed', undefined, testDir);
|
|
522
|
-
// Verify timestamp is recorded
|
|
523
|
-
const status = await getLifecycleStatus(epicId, testDir);
|
|
524
|
-
const researchStage = status.stages.find((s) => s.stage === 'research');
|
|
525
|
-
expect(researchStage?.completedAt).toBeDefined();
|
|
526
|
-
expect(Date.parse(researchStage?.completedAt ?? '')).toBeGreaterThanOrEqual(Date.parse(beforeTime));
|
|
527
|
-
});
|
|
528
|
-
it('should track full history across sessions [T4801]', async () => {
|
|
529
|
-
// T4801: Now uses SQLite-native storage
|
|
530
|
-
const epicId = 'T4806';
|
|
531
|
-
// Complete several stages
|
|
532
|
-
await recordStageProgress(epicId, 'research', 'completed', undefined, testDir);
|
|
533
|
-
await recordStageProgress(epicId, 'consensus', 'skipped', 'Single agent', testDir);
|
|
534
|
-
await recordStageProgress(epicId, 'specification', 'completed', undefined, testDir);
|
|
535
|
-
const history = await getLifecycleHistory(epicId, testDir);
|
|
536
|
-
const completedActions = history.history.filter((h) => h.action === 'completed');
|
|
537
|
-
expect(completedActions.length).toBe(2); // research and specification
|
|
538
|
-
expect(history.history.some((h) => h.action === 'skipped')).toBe(true);
|
|
539
|
-
});
|
|
540
|
-
});
|
|
541
|
-
// =============================================================================
|
|
542
|
-
// PIPELINE COMPLETION TESTS
|
|
543
|
-
// =============================================================================
|
|
544
|
-
describe('pipeline completion marks all stages correctly', () => {
|
|
545
|
-
it('should mark all stages as completed when pipeline completes', async () => {
|
|
546
|
-
const pipelineId = 'T4806';
|
|
547
|
-
let context = createInitialContext(pipelineId, 'test-agent');
|
|
548
|
-
// Progress through all stages
|
|
549
|
-
const stages = [
|
|
550
|
-
'research',
|
|
551
|
-
'consensus',
|
|
552
|
-
'architecture_decision',
|
|
553
|
-
'specification',
|
|
554
|
-
'decomposition',
|
|
555
|
-
'implementation',
|
|
556
|
-
'validation',
|
|
557
|
-
'testing',
|
|
558
|
-
];
|
|
559
|
-
for (let i = 0; i < stages.length - 1; i++) {
|
|
560
|
-
const from = stages[i];
|
|
561
|
-
const to = stages[i + 1];
|
|
562
|
-
// Mark source stage as in-progress then completed before transitioning
|
|
563
|
-
context.stages[from] = setStageStatus(from, 'in_progress', context);
|
|
564
|
-
context.stages[from] = setStageStatus(from, 'completed', context);
|
|
565
|
-
const transition = {
|
|
566
|
-
from,
|
|
567
|
-
to,
|
|
568
|
-
initiatedBy: 'test-agent',
|
|
569
|
-
};
|
|
570
|
-
const result = await executeTransition(transition, context);
|
|
571
|
-
if (!result.success) {
|
|
572
|
-
throw new Error(`Transition from ${from} to ${to} failed: ${result.errors?.join(', ')}`);
|
|
573
|
-
}
|
|
574
|
-
context = result.context;
|
|
575
|
-
}
|
|
576
|
-
// Mark testing stage as completed and transition to release
|
|
577
|
-
const now = new Date();
|
|
578
|
-
context.stages['testing'] = setStageStatus('testing', 'in_progress', context);
|
|
579
|
-
context.stages['testing'] = setStageStatus('testing', 'completed', context);
|
|
580
|
-
const finalTransition = {
|
|
581
|
-
from: 'testing',
|
|
582
|
-
to: 'release',
|
|
583
|
-
initiatedBy: 'test-agent',
|
|
584
|
-
};
|
|
585
|
-
const finalResult = await executeTransition(finalTransition, context);
|
|
586
|
-
if (!finalResult.success) {
|
|
587
|
-
throw new Error(`Final transition from test to release failed: ${finalResult.errors?.join(', ')}`);
|
|
588
|
-
}
|
|
589
|
-
context = finalResult.context;
|
|
590
|
-
// Stage 9: Release - complete it (bypass transition validation)
|
|
591
|
-
context.stages['release'] = setStageStatus('release', 'completed', context);
|
|
592
|
-
// Verify all stages completed
|
|
593
|
-
expect(context.stages['research'].status).toBe('completed');
|
|
594
|
-
expect(context.stages['consensus'].status).toBe('completed');
|
|
595
|
-
expect(context.stages['architecture_decision'].status).toBe('completed');
|
|
596
|
-
expect(context.stages['specification'].status).toBe('completed');
|
|
597
|
-
expect(context.stages['decomposition'].status).toBe('completed');
|
|
598
|
-
expect(context.stages['implementation'].status).toBe('completed');
|
|
599
|
-
expect(context.stages['validation'].status).toBe('completed');
|
|
600
|
-
expect(context.stages['testing'].status).toBe('completed');
|
|
601
|
-
expect(context.stages['release'].status).toBe('completed');
|
|
602
|
-
// Verify terminal state
|
|
603
|
-
expect(isTerminalState(context)).toBe(true);
|
|
604
|
-
expect(context.transitionCount).toBe(8);
|
|
605
|
-
});
|
|
606
|
-
it('should calculate terminal state correctly', async () => {
|
|
607
|
-
const pipelineId = 'T4806';
|
|
608
|
-
let context = createInitialContext(pipelineId, 'test-agent');
|
|
609
|
-
expect(isTerminalState(context)).toBe(false);
|
|
610
|
-
// Progress through all stages
|
|
611
|
-
const stages = [
|
|
612
|
-
'research',
|
|
613
|
-
'consensus',
|
|
614
|
-
'architecture_decision',
|
|
615
|
-
'specification',
|
|
616
|
-
'decomposition',
|
|
617
|
-
'implementation',
|
|
618
|
-
'validation',
|
|
619
|
-
'testing',
|
|
620
|
-
'release',
|
|
621
|
-
];
|
|
622
|
-
for (let i = 0; i < stages.length - 1; i++) {
|
|
623
|
-
const from = stages[i];
|
|
624
|
-
const to = stages[i + 1];
|
|
625
|
-
// Mark from stage as in-progress then completed before transitioning
|
|
626
|
-
context.stages[from] = setStageStatus(from, 'in_progress', context);
|
|
627
|
-
context.stages[from] = setStageStatus(from, 'completed', context);
|
|
628
|
-
const transition = {
|
|
629
|
-
from,
|
|
630
|
-
to,
|
|
631
|
-
initiatedBy: 'test-agent',
|
|
632
|
-
};
|
|
633
|
-
const result = await executeTransition(transition, context);
|
|
634
|
-
context = result.context;
|
|
635
|
-
}
|
|
636
|
-
// Complete release
|
|
637
|
-
context.stages['release'] = setStageStatus('release', 'completed', context);
|
|
638
|
-
expect(isTerminalState(context)).toBe(true);
|
|
639
|
-
});
|
|
640
|
-
it('should update transition count correctly', async () => {
|
|
641
|
-
const pipelineId = 'T4806';
|
|
642
|
-
let context = createInitialContext(pipelineId, 'test-agent');
|
|
643
|
-
expect(context.transitionCount).toBe(0);
|
|
644
|
-
expect(context.version).toBe(1);
|
|
645
|
-
// Make 3 transitions
|
|
646
|
-
const transitions = [
|
|
647
|
-
['research', 'consensus'],
|
|
648
|
-
['consensus', 'architecture_decision'],
|
|
649
|
-
['architecture_decision', 'specification'],
|
|
650
|
-
];
|
|
651
|
-
for (const [from, to] of transitions) {
|
|
652
|
-
// Mark from stage as in-progress then completed before transitioning
|
|
653
|
-
context.stages[from] = setStageStatus(from, 'in_progress', context);
|
|
654
|
-
context.stages[from] = setStageStatus(from, 'completed', context);
|
|
655
|
-
const transition = {
|
|
656
|
-
from,
|
|
657
|
-
to,
|
|
658
|
-
initiatedBy: 'test-agent',
|
|
659
|
-
};
|
|
660
|
-
const result = await executeTransition(transition, context);
|
|
661
|
-
context = result.context;
|
|
662
|
-
}
|
|
663
|
-
expect(context.transitionCount).toBe(3);
|
|
664
|
-
expect(context.version).toBe(4);
|
|
665
|
-
});
|
|
666
|
-
it('should provide correct final context state', async () => {
|
|
667
|
-
const pipelineId = 'T4806';
|
|
668
|
-
let context = createInitialContext(pipelineId, 'test-agent');
|
|
669
|
-
// Progress through all stages
|
|
670
|
-
const stages = [
|
|
671
|
-
'research',
|
|
672
|
-
'consensus',
|
|
673
|
-
'architecture_decision',
|
|
674
|
-
'specification',
|
|
675
|
-
'decomposition',
|
|
676
|
-
'implementation',
|
|
677
|
-
'validation',
|
|
678
|
-
'testing',
|
|
679
|
-
'release',
|
|
680
|
-
];
|
|
681
|
-
for (let i = 0; i < stages.length - 1; i++) {
|
|
682
|
-
const from = stages[i];
|
|
683
|
-
const to = stages[i + 1];
|
|
684
|
-
// Mark from stage as in-progress then completed before transitioning
|
|
685
|
-
context.stages[from] = setStageStatus(from, 'in_progress', context);
|
|
686
|
-
context.stages[from] = setStageStatus(from, 'completed', context);
|
|
687
|
-
const transition = {
|
|
688
|
-
from,
|
|
689
|
-
to,
|
|
690
|
-
initiatedBy: 'test-agent',
|
|
691
|
-
};
|
|
692
|
-
const result = await executeTransition(transition, context);
|
|
693
|
-
context = result.context;
|
|
694
|
-
}
|
|
695
|
-
context.stages['release'] = setStageStatus('release', 'completed', context);
|
|
696
|
-
// Verify final state
|
|
697
|
-
expect(context.pipelineId).toBe(pipelineId);
|
|
698
|
-
expect(context.currentStage).toBe('release');
|
|
699
|
-
expect(context.transitionCount).toBe(8);
|
|
700
|
-
expect(isTerminalState(context)).toBe(true);
|
|
701
|
-
// Verify stage states
|
|
702
|
-
const currentStageState = getCurrentStageState(context);
|
|
703
|
-
expect(currentStageState.stage).toBe('release');
|
|
704
|
-
expect(currentStageState.status).toBe('completed');
|
|
705
|
-
});
|
|
706
|
-
});
|
|
707
|
-
// =============================================================================
|
|
708
|
-
// PIPELINE STUB VALIDATION TESTS (T4800)
|
|
709
|
-
// =============================================================================
|
|
710
|
-
describe('pipeline stub implementations (T4800)', () => {
|
|
711
|
-
it('initializePipeline should return valid pipeline structure', async () => {
|
|
712
|
-
await ensureTaskExists('T4806');
|
|
713
|
-
const pipeline = await initializePipeline('T4806', {
|
|
714
|
-
startStage: 'research',
|
|
715
|
-
assignedAgent: 'test-agent',
|
|
716
|
-
});
|
|
717
|
-
expect(pipeline.id).toBe('T4806');
|
|
718
|
-
expect(pipeline.currentStage).toBe('research');
|
|
719
|
-
expect(pipeline.status).toBe('active');
|
|
720
|
-
expect(pipeline.isActive).toBe(true);
|
|
721
|
-
expect(pipeline.version).toBe(1);
|
|
722
|
-
expect(pipeline.transitionCount).toBe(0);
|
|
723
|
-
});
|
|
724
|
-
it('initializePipeline should accept custom start stage', async () => {
|
|
725
|
-
await ensureTaskExists('T4806');
|
|
726
|
-
const pipeline = await initializePipeline('T4806', {
|
|
727
|
-
startStage: 'specification',
|
|
728
|
-
});
|
|
729
|
-
expect(pipeline.currentStage).toBe('specification');
|
|
730
|
-
});
|
|
731
|
-
it('getPipeline should return null for non-existent pipeline (stub)', async () => {
|
|
732
|
-
const pipeline = await getPipeline('T99999');
|
|
733
|
-
expect(pipeline).toBeNull();
|
|
734
|
-
});
|
|
735
|
-
it('advanceStage should validate required parameters', async () => {
|
|
736
|
-
// Missing toStage
|
|
737
|
-
await expect(advanceStage('T4806', { initiatedBy: 'test-agent' })).rejects.toThrow('target stage');
|
|
738
|
-
// Missing initiatedBy
|
|
739
|
-
await expect(advanceStage('T4806', { toStage: 'consensus' })).rejects.toThrow('initiatedBy');
|
|
740
|
-
});
|
|
741
|
-
it('getCurrentStage should throw when pipeline not found (stub)', async () => {
|
|
742
|
-
// The stub getPipeline returns null, so getCurrentStage throws NOT_FOUND
|
|
743
|
-
await expect(getCurrentStage('T4806')).rejects.toThrow('No pipeline found');
|
|
744
|
-
});
|
|
745
|
-
it('completePipeline should validate input (stub)', async () => {
|
|
746
|
-
await expect(completePipeline('T4806', 'All stages completed')).rejects.toThrow('No pipeline found');
|
|
747
|
-
});
|
|
748
|
-
it('cancelPipeline should validate input (stub)', async () => {
|
|
749
|
-
await expect(cancelPipeline('T4806', 'Cancelled for testing')).rejects.toThrow('No pipeline found');
|
|
750
|
-
});
|
|
751
|
-
});
|
|
752
|
-
// =============================================================================
|
|
753
|
-
// STAGE DEFINITION VALIDATION TESTS
|
|
754
|
-
// =============================================================================
|
|
755
|
-
describe('stage definition validation', () => {
|
|
756
|
-
it('should have 9 pipeline stages', () => {
|
|
757
|
-
expect(PIPELINE_STAGES.length).toBe(9);
|
|
758
|
-
});
|
|
759
|
-
it('should have correct stage categories', () => {
|
|
760
|
-
expect(STAGE_DEFINITIONS['research'].category).toBe('planning');
|
|
761
|
-
expect(STAGE_DEFINITIONS['consensus'].category).toBe('decision');
|
|
762
|
-
expect(STAGE_DEFINITIONS['adr'].category).toBe('decision');
|
|
763
|
-
expect(STAGE_DEFINITIONS['spec'].category).toBe('planning');
|
|
764
|
-
expect(STAGE_DEFINITIONS['decompose'].category).toBe('planning');
|
|
765
|
-
expect(STAGE_DEFINITIONS['implement'].category).toBe('execution');
|
|
766
|
-
expect(STAGE_DEFINITIONS['verify'].category).toBe('validation');
|
|
767
|
-
expect(STAGE_DEFINITIONS['test'].category).toBe('validation');
|
|
768
|
-
expect(STAGE_DEFINITIONS['release'].category).toBe('delivery');
|
|
769
|
-
});
|
|
770
|
-
it('should have correct skippable flags', () => {
|
|
771
|
-
expect(STAGE_DEFINITIONS['research'].skippable).toBe(false);
|
|
772
|
-
expect(STAGE_DEFINITIONS['consensus'].skippable).toBe(true);
|
|
773
|
-
expect(STAGE_DEFINITIONS['adr'].skippable).toBe(true);
|
|
774
|
-
expect(STAGE_DEFINITIONS['spec'].skippable).toBe(false);
|
|
775
|
-
expect(STAGE_DEFINITIONS['decompose'].skippable).toBe(false);
|
|
776
|
-
expect(STAGE_DEFINITIONS['implement'].skippable).toBe(false);
|
|
777
|
-
expect(STAGE_DEFINITIONS['verify'].skippable).toBe(false);
|
|
778
|
-
expect(STAGE_DEFINITIONS['test'].skippable).toBe(false);
|
|
779
|
-
expect(STAGE_DEFINITIONS['release'].skippable).toBe(true);
|
|
780
|
-
});
|
|
781
|
-
it('should have expected artifacts defined for each stage', () => {
|
|
782
|
-
expect(STAGE_DEFINITIONS['research'].expectedArtifacts).toContain('research-report');
|
|
783
|
-
expect(STAGE_DEFINITIONS['spec'].expectedArtifacts).toContain('spec-document');
|
|
784
|
-
expect(STAGE_DEFINITIONS['implement'].expectedArtifacts).toContain('source-code');
|
|
785
|
-
expect(STAGE_DEFINITIONS['test'].expectedArtifacts).toContain('test-results');
|
|
786
|
-
expect(STAGE_DEFINITIONS['release'].expectedArtifacts).toContain('release-notes');
|
|
787
|
-
});
|
|
788
|
-
it('should have required gates defined for each stage', () => {
|
|
789
|
-
expect(STAGE_DEFINITIONS['research'].requiredGates).toContain('prerequisites-met');
|
|
790
|
-
expect(STAGE_DEFINITIONS['consensus'].requiredGates).toContain('research-complete');
|
|
791
|
-
expect(STAGE_DEFINITIONS['implement'].requiredGates).toContain('code-complete');
|
|
792
|
-
expect(STAGE_DEFINITIONS['test'].requiredGates).toContain('tests-pass');
|
|
793
|
-
});
|
|
794
|
-
});
|
|
795
|
-
// =============================================================================
|
|
796
|
-
// TRANSITION RULE VALIDATION TESTS
|
|
797
|
-
// =============================================================================
|
|
798
|
-
describe('transition rule validation', () => {
|
|
799
|
-
it('should allow all forward sequential transitions', () => {
|
|
800
|
-
const stages = [
|
|
801
|
-
'research',
|
|
802
|
-
'consensus',
|
|
803
|
-
'architecture_decision',
|
|
804
|
-
'specification',
|
|
805
|
-
'decomposition',
|
|
806
|
-
'implementation',
|
|
807
|
-
'validation',
|
|
808
|
-
'testing',
|
|
809
|
-
'release',
|
|
810
|
-
];
|
|
811
|
-
for (let i = 0; i < stages.length - 1; i++) {
|
|
812
|
-
const from = stages[i];
|
|
813
|
-
const to = stages[i + 1];
|
|
814
|
-
const check = checkTransition(from, to, false);
|
|
815
|
-
expect(check.allowed).toBe(true);
|
|
816
|
-
}
|
|
817
|
-
});
|
|
818
|
-
it('should block release to any stage', () => {
|
|
819
|
-
const stages = [
|
|
820
|
-
'research',
|
|
821
|
-
'consensus',
|
|
822
|
-
'architecture_decision',
|
|
823
|
-
'specification',
|
|
824
|
-
'decomposition',
|
|
825
|
-
'implementation',
|
|
826
|
-
'validation',
|
|
827
|
-
'testing',
|
|
828
|
-
];
|
|
829
|
-
for (const stage of stages) {
|
|
830
|
-
const check = checkTransition('release', stage, false);
|
|
831
|
-
expect(check.allowed).toBe(false);
|
|
832
|
-
}
|
|
833
|
-
});
|
|
834
|
-
it('should allow skipping with force', () => {
|
|
835
|
-
const check = checkTransition('research', 'spec', true);
|
|
836
|
-
expect(check.allowed).toBe(true);
|
|
837
|
-
});
|
|
838
|
-
it('should require force for backward transitions', () => {
|
|
839
|
-
const checkNoForce = checkTransition('implement', 'spec', false);
|
|
840
|
-
expect(checkNoForce.allowed).toBe(false);
|
|
841
|
-
expect(checkNoForce.requiresForce).toBe(true);
|
|
842
|
-
const checkWithForce = checkTransition('implement', 'spec', true);
|
|
843
|
-
expect(checkWithForce.allowed).toBe(true);
|
|
844
|
-
});
|
|
845
|
-
});
|
|
846
|
-
// =============================================================================
|
|
847
|
-
// INTEGRITY AND CONSISTENCY TESTS
|
|
848
|
-
// =============================================================================
|
|
849
|
-
describe('data integrity and consistency', () => {
|
|
850
|
-
it('should maintain immutable state during transitions', async () => {
|
|
851
|
-
const pipelineId = 'T4806';
|
|
852
|
-
const originalContext = createInitialContext(pipelineId, 'test-agent');
|
|
853
|
-
// Mark research as completed before transitioning
|
|
854
|
-
originalContext.stages['research'] = setStageStatus('research', 'completed', originalContext);
|
|
855
|
-
const transition = {
|
|
856
|
-
from: 'research',
|
|
857
|
-
to: 'consensus',
|
|
858
|
-
initiatedBy: 'test-agent',
|
|
859
|
-
};
|
|
860
|
-
const result = await executeTransition(transition, originalContext);
|
|
861
|
-
// Original context should be unchanged
|
|
862
|
-
expect(originalContext.currentStage).toBe('research');
|
|
863
|
-
expect(originalContext.stages['research'].status).toBe('completed');
|
|
864
|
-
// New context should reflect the transition
|
|
865
|
-
expect(result.context.currentStage).toBe('consensus');
|
|
866
|
-
expect(result.context.stages['research'].status).toBe('completed');
|
|
867
|
-
});
|
|
868
|
-
it('should handle concurrent transition attempts gracefully', async () => {
|
|
869
|
-
const pipelineId = 'T4806';
|
|
870
|
-
const context = createInitialContext(pipelineId, 'test-agent');
|
|
871
|
-
// Mark research as completed before transitioning
|
|
872
|
-
context.stages['research'] = setStageStatus('research', 'completed', context);
|
|
873
|
-
const transition = {
|
|
874
|
-
from: 'research',
|
|
875
|
-
to: 'consensus',
|
|
876
|
-
initiatedBy: 'test-agent',
|
|
877
|
-
};
|
|
878
|
-
// Execute same transition twice
|
|
879
|
-
const result1 = await executeTransition(transition, context);
|
|
880
|
-
const result2 = await executeTransition(transition, context);
|
|
881
|
-
// Both should succeed with fresh contexts
|
|
882
|
-
expect(result1.success).toBe(true);
|
|
883
|
-
expect(result2.success).toBe(true);
|
|
884
|
-
// But they should be independent
|
|
885
|
-
expect(result1.context).not.toBe(result2.context);
|
|
886
|
-
});
|
|
887
|
-
it('should validate all stage names are defined', () => {
|
|
888
|
-
for (const stage of PIPELINE_STAGES) {
|
|
889
|
-
expect(STAGE_DEFINITIONS[stage]).toBeDefined();
|
|
890
|
-
expect(STAGE_DEFINITIONS[stage].stage).toBe(stage);
|
|
891
|
-
}
|
|
892
|
-
});
|
|
893
|
-
it('should have consistent order between STAGE_ORDER and definitions', () => {
|
|
894
|
-
for (const stage of PIPELINE_STAGES) {
|
|
895
|
-
expect(STAGE_ORDER[stage]).toBe(STAGE_DEFINITIONS[stage].order);
|
|
896
|
-
}
|
|
897
|
-
});
|
|
898
|
-
it('should have complete prerequisite mappings', () => {
|
|
899
|
-
for (const stage of PIPELINE_STAGES) {
|
|
900
|
-
const prereqs = getPrerequisites(stage);
|
|
901
|
-
expect(Array.isArray(prereqs)).toBe(true);
|
|
902
|
-
// All prerequisites should be valid stages
|
|
903
|
-
for (const prereq of prereqs) {
|
|
904
|
-
expect(PIPELINE_STAGES).toContain(prereq);
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
});
|
|
908
|
-
});
|
|
909
|
-
});
|
|
910
|
-
// =============================================================================
|
|
911
|
-
// EPIC COMPLETION TEST
|
|
912
|
-
// =============================================================================
|
|
913
|
-
describe('T4798 Epic Completion Validation', () => {
|
|
914
|
-
beforeEach(async () => {
|
|
915
|
-
testDir = await mkdtemp(join(tmpdir(), 'cleo-epic-completion-'));
|
|
916
|
-
cleoDir = join(testDir, '.cleo');
|
|
917
|
-
await mkdir(cleoDir, { recursive: true });
|
|
918
|
-
await mkdir(join(cleoDir, 'rcasd'), { recursive: true });
|
|
919
|
-
process.env['CLEO_DIR'] = cleoDir;
|
|
920
|
-
process.env['LIFECYCLE_ENFORCEMENT_MODE'] = 'off';
|
|
921
|
-
});
|
|
922
|
-
afterEach(async () => {
|
|
923
|
-
try {
|
|
924
|
-
const { closeAllDatabases } = await import('../../store/sqlite.js');
|
|
925
|
-
await closeAllDatabases();
|
|
926
|
-
}
|
|
927
|
-
catch {
|
|
928
|
-
/* ignore */
|
|
929
|
-
}
|
|
930
|
-
delete process.env['CLEO_DIR'];
|
|
931
|
-
delete process.env['LIFECYCLE_ENFORCEMENT_MODE'];
|
|
932
|
-
await rm(testDir, { recursive: true, force: true });
|
|
933
|
-
});
|
|
934
|
-
it('validates all T4798 dependencies are functional [T4801]', async () => {
|
|
935
|
-
// T4801: All dependencies now use SQLite-native storage
|
|
936
|
-
// T4800: Pipeline State Machine
|
|
937
|
-
const pipelineId = 'T4806';
|
|
938
|
-
const context = createInitialContext(pipelineId, 'test-agent');
|
|
939
|
-
expect(context).toBeDefined();
|
|
940
|
-
expect(context.currentStage).toBe('research');
|
|
941
|
-
// T4801: SQLite Schema (verified via stage definitions)
|
|
942
|
-
expect(PIPELINE_STAGES.length).toBe(9);
|
|
943
|
-
expect(STAGE_DEFINITIONS['research'].order).toBe(1);
|
|
944
|
-
// T4804: Gate/Evidence Recording (via passGate/failGate)
|
|
945
|
-
const gateResult = await passGate('T4806', 'research-test-gate', 'agent', 'Test', testDir);
|
|
946
|
-
expect(gateResult.timestamp).toBeDefined();
|
|
947
|
-
// T4805: Cross-session resume (via recordStageProgress)
|
|
948
|
-
await recordStageProgress('T4806', 'research', 'completed', undefined, testDir);
|
|
949
|
-
const status = await getLifecycleStatus('T4806', testDir);
|
|
950
|
-
expect(status.initialized).toBe(true);
|
|
951
|
-
});
|
|
952
|
-
it('confirms pipeline integration is complete', () => {
|
|
953
|
-
// Verify all 9 stages are present
|
|
954
|
-
const expectedStages = [
|
|
955
|
-
'research',
|
|
956
|
-
'consensus',
|
|
957
|
-
'architecture_decision',
|
|
958
|
-
'specification',
|
|
959
|
-
'decomposition',
|
|
960
|
-
'implementation',
|
|
961
|
-
'validation',
|
|
962
|
-
'testing',
|
|
963
|
-
'release',
|
|
964
|
-
];
|
|
965
|
-
expect(PIPELINE_STAGES).toEqual(expectedStages);
|
|
966
|
-
// Verify state machine is functional
|
|
967
|
-
const context = createInitialContext('T4806', 'test-agent');
|
|
968
|
-
expect(isTerminalState(context)).toBe(false);
|
|
969
|
-
// Verify gate enforcement is configured
|
|
970
|
-
expect(STAGE_DEFINITIONS['research'].requiredGates.length).toBeGreaterThan(0);
|
|
971
|
-
expect(STAGE_DEFINITIONS['implement'].requiredGates.length).toBeGreaterThan(0);
|
|
972
|
-
// Verify evidence recording is available
|
|
973
|
-
expect(typeof passGate).toBe('function');
|
|
974
|
-
expect(typeof failGate).toBe('function');
|
|
975
|
-
});
|
|
976
|
-
});
|
|
977
|
-
//# sourceMappingURL=pipeline.integration.test.js.map
|