codebyplan 1.13.65 → 1.13.67
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/README.md +118 -75
- package/dist/__tests__/helpers.d.ts +22 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/ci-public.d.ts +20 -0
- package/dist/ci-public.d.ts.map +1 -0
- package/dist/ci.js +11 -2
- package/dist/cli/arch-map.d.ts +33 -0
- package/dist/cli/arch-map.d.ts.map +1 -0
- package/dist/cli/branch.d.ts +10 -0
- package/dist/cli/branch.d.ts.map +1 -0
- package/dist/cli/bump.d.ts +12 -0
- package/dist/cli/bump.d.ts.map +1 -0
- package/dist/cli/cd.d.ts +20 -0
- package/dist/cli/cd.d.ts.map +1 -0
- package/dist/cli/check.d.ts +30 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/checkpoint.d.ts +17 -0
- package/dist/cli/checkpoint.d.ts.map +1 -0
- package/dist/cli/ci.d.ts +31 -0
- package/dist/cli/ci.d.ts.map +1 -0
- package/dist/cli/claude/__test-helpers__/expect-manifest.d.ts +7 -0
- package/dist/cli/claude/__test-helpers__/expect-manifest.d.ts.map +1 -0
- package/dist/cli/claude/__test-helpers__/tmp-fixture.d.ts +64 -0
- package/dist/cli/claude/__test-helpers__/tmp-fixture.d.ts.map +1 -0
- package/dist/cli/claude/audit-mode.d.ts +16 -0
- package/dist/cli/claude/audit-mode.d.ts.map +1 -0
- package/dist/cli/claude/generate.d.ts +23 -0
- package/dist/cli/claude/generate.d.ts.map +1 -0
- package/dist/cli/claude/install.d.ts +55 -0
- package/dist/cli/claude/install.d.ts.map +1 -0
- package/dist/cli/claude/migrate-memory.d.ts +117 -0
- package/dist/cli/claude/migrate-memory.d.ts.map +1 -0
- package/dist/cli/claude/readme.d.ts +28 -0
- package/dist/cli/claude/readme.d.ts.map +1 -0
- package/dist/cli/claude/status.d.ts +41 -0
- package/dist/cli/claude/status.d.ts.map +1 -0
- package/dist/cli/claude/uninstall.d.ts +21 -0
- package/dist/cli/claude/uninstall.d.ts.map +1 -0
- package/dist/cli/claude/update.d.ts +25 -0
- package/dist/cli/claude/update.d.ts.map +1 -0
- package/dist/cli/claude/verify-parity.d.ts +25 -0
- package/dist/cli/claude/verify-parity.d.ts.map +1 -0
- package/dist/cli/cleanup-plan-folders.d.ts +21 -0
- package/dist/cli/cleanup-plan-folders.d.ts.map +1 -0
- package/dist/cli/commit.d.ts +25 -0
- package/dist/cli/commit.d.ts.map +1 -0
- package/dist/cli/config.d.ts +50 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/confirm.d.ts +9 -0
- package/dist/cli/confirm.d.ts.map +1 -0
- package/dist/cli/create-org.d.ts +9 -0
- package/dist/cli/create-org.d.ts.map +1 -0
- package/dist/cli/create-project.d.ts +10 -0
- package/dist/cli/create-project.d.ts.map +1 -0
- package/dist/cli/create-repo.d.ts +14 -0
- package/dist/cli/create-repo.d.ts.map +1 -0
- package/dist/cli/docs.d.ts +41 -0
- package/dist/cli/docs.d.ts.map +1 -0
- package/dist/cli/doctor.d.ts +17 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/e2e/verify-round.d.ts +46 -0
- package/dist/cli/e2e/verify-round.d.ts.map +1 -0
- package/dist/cli/e2e.d.ts +11 -0
- package/dist/cli/e2e.d.ts.map +1 -0
- package/dist/cli/eslint.d.ts +20 -0
- package/dist/cli/eslint.d.ts.map +1 -0
- package/dist/cli/export-writer.d.ts +99 -0
- package/dist/cli/export-writer.d.ts.map +1 -0
- package/dist/cli/handoff.d.ts +13 -0
- package/dist/cli/handoff.d.ts.map +1 -0
- package/dist/cli/login.d.ts +10 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/logout.d.ts +2 -0
- package/dist/cli/logout.d.ts.map +1 -0
- package/dist/cli/lsp.d.ts +16 -0
- package/dist/cli/lsp.d.ts.map +1 -0
- package/dist/cli/migration-collisions.d.ts +10 -0
- package/dist/cli/migration-collisions.d.ts.map +1 -0
- package/dist/cli/ports.d.ts +29 -0
- package/dist/cli/ports.d.ts.map +1 -0
- package/dist/cli/process-exit-signal.d.ts +24 -0
- package/dist/cli/process-exit-signal.d.ts.map +1 -0
- package/dist/cli/round.d.ts +79 -0
- package/dist/cli/round.d.ts.map +1 -0
- package/dist/cli/scaffold-publish-workflow.d.ts +16 -0
- package/dist/cli/scaffold-publish-workflow.d.ts.map +1 -0
- package/dist/cli/session/freshness-gate.d.ts +21 -0
- package/dist/cli/session/freshness-gate.d.ts.map +1 -0
- package/dist/cli/session/home-ff.d.ts +16 -0
- package/dist/cli/session/home-ff.d.ts.map +1 -0
- package/dist/cli/session/infra-files.d.ts +21 -0
- package/dist/cli/session/infra-files.d.ts.map +1 -0
- package/dist/cli/session/start.d.ts +70 -0
- package/dist/cli/session/start.d.ts.map +1 -0
- package/dist/cli/session.d.ts +17 -0
- package/dist/cli/session.d.ts.map +1 -0
- package/dist/cli/setup.d.ts +2 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/ship.d.ts +16 -0
- package/dist/cli/ship.d.ts.map +1 -0
- package/dist/cli/slug.d.ts +10 -0
- package/dist/cli/slug.d.ts.map +1 -0
- package/dist/cli/standalone-task.d.ts +31 -0
- package/dist/cli/standalone-task.d.ts.map +1 -0
- package/dist/cli/statusline.d.ts +10 -0
- package/dist/cli/statusline.d.ts.map +1 -0
- package/dist/cli/supabase/new-migration.d.ts +24 -0
- package/dist/cli/supabase/new-migration.d.ts.map +1 -0
- package/dist/cli/supabase/preview-check.d.ts +30 -0
- package/dist/cli/supabase/preview-check.d.ts.map +1 -0
- package/dist/cli/supabase/resolve-preview.d.ts +19 -0
- package/dist/cli/supabase/resolve-preview.d.ts.map +1 -0
- package/dist/cli/supabase/teardown-preview.d.ts +22 -0
- package/dist/cli/supabase/teardown-preview.d.ts.map +1 -0
- package/dist/cli/sync.d.ts +13 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/task.d.ts +17 -0
- package/dist/cli/task.d.ts.map +1 -0
- package/dist/cli/tech-stack.d.ts +11 -0
- package/dist/cli/tech-stack.d.ts.map +1 -0
- package/dist/cli/upgrade-auth.d.ts +2 -0
- package/dist/cli/upgrade-auth.d.ts.map +1 -0
- package/dist/cli/upload-e2e-images.d.ts +18 -0
- package/dist/cli/upload-e2e-images.d.ts.map +1 -0
- package/dist/cli/validate-waves.d.ts +22 -0
- package/dist/cli/validate-waves.d.ts.map +1 -0
- package/dist/cli/version-status.d.ts +42 -0
- package/dist/cli/version-status.d.ts.map +1 -0
- package/dist/cli/watch.d.ts +18 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/whoami.d.ts +5 -0
- package/dist/cli/whoami.d.ts.map +1 -0
- package/dist/cli/worktree/add.d.ts +81 -0
- package/dist/cli/worktree/add.d.ts.map +1 -0
- package/dist/cli/worktree/create.d.ts +46 -0
- package/dist/cli/worktree/create.d.ts.map +1 -0
- package/dist/cli/worktree/path.d.ts +19 -0
- package/dist/cli/worktree/path.d.ts.map +1 -0
- package/dist/cli/worktree/remove.d.ts +92 -0
- package/dist/cli/worktree/remove.d.ts.map +1 -0
- package/dist/cli/worktree.d.ts +15 -0
- package/dist/cli/worktree.d.ts.map +1 -0
- package/dist/cli.js +5697 -5322
- package/dist/dispatch.d.ts +64 -0
- package/dist/dispatch.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/lib/agents-generator.d.ts +42 -0
- package/dist/lib/agents-generator.d.ts.map +1 -0
- package/dist/lib/api.d.ts +54 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/atomic-write.d.ts +27 -0
- package/dist/lib/atomic-write.d.ts.map +1 -0
- package/dist/lib/branch-checkout.d.ts +47 -0
- package/dist/lib/branch-checkout.d.ts.map +1 -0
- package/dist/lib/branch-port-resolver.d.ts +58 -0
- package/dist/lib/branch-port-resolver.d.ts.map +1 -0
- package/dist/lib/bump.d.ts +97 -0
- package/dist/lib/bump.d.ts.map +1 -0
- package/dist/lib/cd-init.d.ts +86 -0
- package/dist/lib/cd-init.d.ts.map +1 -0
- package/dist/lib/check-baseline.d.ts +91 -0
- package/dist/lib/check-baseline.d.ts.map +1 -0
- package/dist/lib/check.d.ts +178 -0
- package/dist/lib/check.d.ts.map +1 -0
- package/dist/lib/ci-init.d.ts +106 -0
- package/dist/lib/ci-init.d.ts.map +1 -0
- package/dist/lib/ci-resolve.d.ts +60 -0
- package/dist/lib/ci-resolve.d.ts.map +1 -0
- package/dist/lib/claude-mode-audit.d.ts +41 -0
- package/dist/lib/claude-mode-audit.d.ts.map +1 -0
- package/dist/lib/claude-plan.d.ts +34 -0
- package/dist/lib/claude-plan.d.ts.map +1 -0
- package/dist/lib/commit-scope.d.ts +21 -0
- package/dist/lib/commit-scope.d.ts.map +1 -0
- package/dist/lib/e2e.d.ts +157 -0
- package/dist/lib/e2e.d.ts.map +1 -0
- package/dist/lib/eslint-generator.d.ts +86 -0
- package/dist/lib/eslint-generator.d.ts.map +1 -0
- package/dist/lib/file-lock.d.ts +44 -0
- package/dist/lib/file-lock.d.ts.map +1 -0
- package/dist/lib/flags.d.ts +115 -0
- package/dist/lib/flags.d.ts.map +1 -0
- package/dist/lib/gh-required-checks.d.ts +76 -0
- package/dist/lib/gh-required-checks.d.ts.map +1 -0
- package/dist/lib/git-utils.d.ts +46 -0
- package/dist/lib/git-utils.d.ts.map +1 -0
- package/dist/lib/gitignore-block.d.ts +32 -0
- package/dist/lib/gitignore-block.d.ts.map +1 -0
- package/dist/lib/gitignore-detect.d.ts +117 -0
- package/dist/lib/gitignore-detect.d.ts.map +1 -0
- package/dist/lib/handoff-file.d.ts +63 -0
- package/dist/lib/handoff-file.d.ts.map +1 -0
- package/dist/lib/hash.d.ts +9 -0
- package/dist/lib/hash.d.ts.map +1 -0
- package/dist/lib/lsp-detect.d.ts +42 -0
- package/dist/lib/lsp-detect.d.ts.map +1 -0
- package/dist/lib/manifest.d.ts +88 -0
- package/dist/lib/manifest.d.ts.map +1 -0
- package/dist/lib/mcp-client.d.ts +39 -0
- package/dist/lib/mcp-client.d.ts.map +1 -0
- package/dist/lib/migrate-branch-model.d.ts +34 -0
- package/dist/lib/migrate-branch-model.d.ts.map +1 -0
- package/dist/lib/migrate-local-config.d.ts +39 -0
- package/dist/lib/migrate-local-config.d.ts.map +1 -0
- package/dist/lib/migration-collisions.d.ts +61 -0
- package/dist/lib/migration-collisions.d.ts.map +1 -0
- package/dist/lib/port-verify.d.ts +73 -0
- package/dist/lib/port-verify.d.ts.map +1 -0
- package/dist/lib/prompt.d.ts +41 -0
- package/dist/lib/prompt.d.ts.map +1 -0
- package/dist/lib/readme-generator.d.ts +108 -0
- package/dist/lib/readme-generator.d.ts.map +1 -0
- package/dist/lib/repo-reader.d.ts +59 -0
- package/dist/lib/repo-reader.d.ts.map +1 -0
- package/dist/lib/scaffold-cd-workflow.d.ts +48 -0
- package/dist/lib/scaffold-cd-workflow.d.ts.map +1 -0
- package/dist/lib/scaffold-ci-workflow.d.ts +83 -0
- package/dist/lib/scaffold-ci-workflow.d.ts.map +1 -0
- package/dist/lib/scaffold-publish-workflow.d.ts +48 -0
- package/dist/lib/scaffold-publish-workflow.d.ts.map +1 -0
- package/dist/lib/server-detect.d.ts +20 -0
- package/dist/lib/server-detect.d.ts.map +1 -0
- package/dist/lib/session.d.ts +371 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/settings-merge.d.ts +268 -0
- package/dist/lib/settings-merge.d.ts.map +1 -0
- package/dist/lib/ship.d.ts +84 -0
- package/dist/lib/ship.d.ts.map +1 -0
- package/dist/lib/slug.d.ts +26 -0
- package/dist/lib/slug.d.ts.map +1 -0
- package/dist/lib/spawn.d.ts +12 -0
- package/dist/lib/spawn.d.ts.map +1 -0
- package/dist/lib/state-client.d.ts +54 -0
- package/dist/lib/state-client.d.ts.map +1 -0
- package/dist/lib/state-store.d.ts +153 -0
- package/dist/lib/state-store.d.ts.map +1 -0
- package/dist/lib/state-sync.d.ts +101 -0
- package/dist/lib/state-sync.d.ts.map +1 -0
- package/dist/lib/statusline-config.d.ts +55 -0
- package/dist/lib/statusline-config.d.ts.map +1 -0
- package/dist/lib/structure-generator.d.ts +63 -0
- package/dist/lib/structure-generator.d.ts.map +1 -0
- package/dist/lib/supabase.d.ts +87 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/sync-approvals.d.ts +108 -0
- package/dist/lib/sync-approvals.d.ts.map +1 -0
- package/dist/lib/tech-detect.d.ts +77 -0
- package/dist/lib/tech-detect.d.ts.map +1 -0
- package/dist/lib/template-walker.d.ts +26 -0
- package/dist/lib/template-walker.d.ts.map +1 -0
- package/dist/lib/templates-dir.d.ts +25 -0
- package/dist/lib/templates-dir.d.ts.map +1 -0
- package/dist/lib/types.d.ts +843 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/validate-waves.d.ts +38 -0
- package/dist/lib/validate-waves.d.ts.map +1 -0
- package/dist/lib/verify-parity.d.ts +154 -0
- package/dist/lib/verify-parity.d.ts.map +1 -0
- package/dist/lib/version.d.ts +3 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/watch-daemon.d.ts +114 -0
- package/dist/lib/watch-daemon.d.ts.map +1 -0
- package/dist/lib/worktree.d.ts +56 -0
- package/dist/lib/worktree.d.ts.map +1 -0
- package/dist/oauth/browser.d.ts +8 -0
- package/dist/oauth/browser.d.ts.map +1 -0
- package/dist/oauth/client-registration.d.ts +16 -0
- package/dist/oauth/client-registration.d.ts.map +1 -0
- package/dist/oauth/device-flow.d.ts +40 -0
- package/dist/oauth/device-flow.d.ts.map +1 -0
- package/dist/oauth/jwt-decode.d.ts +10 -0
- package/dist/oauth/jwt-decode.d.ts.map +1 -0
- package/dist/oauth/keychain.d.ts +17 -0
- package/dist/oauth/keychain.d.ts.map +1 -0
- package/dist/oauth/token-refresh.d.ts +7 -0
- package/dist/oauth/token-refresh.d.ts.map +1 -0
- package/dist/oauth/types.d.ts +28 -0
- package/dist/oauth/types.d.ts.map +1 -0
- package/dist/oauth/urls.d.ts +16 -0
- package/dist/oauth/urls.d.ts.map +1 -0
- package/package.json +5 -6
- package/templates/agents/cbp-security-agent.md +0 -1
- package/templates/agents/cbp-stripe-agent.md +0 -1
- package/templates/agents/cbp-testing-qa-agent.md +0 -1
- package/templates/hooks/cbp-skill-context-guard.sh +0 -1
- package/templates/hooks/cbp-test-hooks.sh +0 -81
- package/templates/hooks/validate-structure-lib.sh +36 -9
- package/templates/rules/cbp-operating-gotchas.md +8 -10
- package/templates/rules/todo-backend.md +4 -2
- package/templates/skills/cbp-build-cc-settings/reference/cbp-permission-policy.md +3 -3
- package/templates/skills/cbp-checkpoint-check/SKILL.md +0 -1
- package/templates/skills/cbp-checkpoint-end/SKILL.md +11 -5
- package/templates/skills/cbp-clear-continue/SKILL.md +0 -1
- package/templates/skills/cbp-clear-prep/SKILL.md +0 -1
- package/templates/skills/cbp-finalize/SKILL.md +2 -2
- package/templates/skills/cbp-setup-cd/SKILL.md +0 -1
- package/templates/skills/cbp-setup-ci/SKILL.md +0 -1
- package/templates/skills/cbp-standalone-task-complete/SKILL.md +40 -0
- package/templates/skills/cbp-stripe/SKILL.md +0 -1
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared check runner — `codebyplan check`.
|
|
3
|
+
*
|
|
4
|
+
* Converges the divergent check matrices (round + task scope via cbp-verify,
|
|
5
|
+
* cbp-merge-main) into ONE whole-repo + baseline runner. The CORE matrix is
|
|
6
|
+
* identical across scopes so a "round" check can never pass where a "task"
|
|
7
|
+
* check fails.
|
|
8
|
+
*
|
|
9
|
+
* Commands (turbo-native, whole-repo):
|
|
10
|
+
* gate6 → `node scripts/check-sibling-identity.mjs`
|
|
11
|
+
* ALWAYS hard-fail on non-zero exit; never baselined.
|
|
12
|
+
* lint → `turbo run lint` whole-repo per-package; diff vs baseline
|
|
13
|
+
* typecheck → `turbo run typecheck` whole-repo per-package; diff vs baseline
|
|
14
|
+
* tests → `turbo run test` whole-repo per-package; diff vs baseline
|
|
15
|
+
* audit → `pnpm audit --json` task scope only; diff vs baseline GHSA ids
|
|
16
|
+
*
|
|
17
|
+
* Per-package pass/fail is derived from the turbo --summarize JSON:
|
|
18
|
+
* turbo run <task> --summarize writes a run summary to .turbo/runs/<hash>.json
|
|
19
|
+
* The last line of turbo output matching /^Summary:\s+(.+\.json)$/ gives the path.
|
|
20
|
+
* Each task entry carries execution.exitCode; non-zero → package failed.
|
|
21
|
+
*
|
|
22
|
+
* Baseline file: .check-baseline.json at project root.
|
|
23
|
+
* A check FAILS (hard-fail) only when a package fails that is NOT in that
|
|
24
|
+
* check's known_failing[] (a NEW failure), or a GHSA id appears that is NOT
|
|
25
|
+
* in audit.ghsa_ids[]. gate6 is never in the baseline.
|
|
26
|
+
*
|
|
27
|
+
* Strict / absolute-green mode (noBaseline):
|
|
28
|
+
* When opts.noBaseline is true the baseline is IGNORED for the verdict — this
|
|
29
|
+
* is the WHOLE-REPO ABSOLUTE GREEN tier (zero baseline forgiveness). For
|
|
30
|
+
* lint/typecheck/tests the ENTIRE failing set counts as new_failures (not the
|
|
31
|
+
* diff-vs-baseline), so ANY red package fails the check; for audit ALL GHSA
|
|
32
|
+
* ids count, not just unallowlisted ones. gate6 is unchanged (always hard).
|
|
33
|
+
* noBaseline and updateBaseline are mutually exclusive: strict mode is a
|
|
34
|
+
* read-only verdict and never writes the baseline — if both are set,
|
|
35
|
+
* updateBaseline is ignored with a stderr warning.
|
|
36
|
+
*/
|
|
37
|
+
import { type BaselineFile } from "./check-baseline.js";
|
|
38
|
+
/**
|
|
39
|
+
* Returned in new_failures[] when the turbo summary file cannot be read or
|
|
40
|
+
* parsed, OR when turbo exited non-zero but printed no Summary: path.
|
|
41
|
+
*
|
|
42
|
+
* The presence of this sentinel makes the check status = 'fail' so the runner
|
|
43
|
+
* NEVER silently passes when it cannot determine per-package results.
|
|
44
|
+
*/
|
|
45
|
+
export declare const SUMMARY_UNREADABLE = "__summary_unreadable__";
|
|
46
|
+
/**
|
|
47
|
+
* Returned in new_failures[] when the turbo process was killed by a signal
|
|
48
|
+
* (spawnResult.status === null) and no summary path was captured.
|
|
49
|
+
*
|
|
50
|
+
* Distinct from SUMMARY_UNREADABLE so callers can distinguish OOM/SIGKILL
|
|
51
|
+
* ("something killed the process") from parse failures ("process ran but
|
|
52
|
+
* output was unreadable").
|
|
53
|
+
*/
|
|
54
|
+
export declare const SPAWN_KILLED = "__spawn_killed__";
|
|
55
|
+
export type CheckScope = "round" | "task" | "merged";
|
|
56
|
+
export type CheckStatus = "pass" | "fail" | "skipped";
|
|
57
|
+
export interface CheckResult {
|
|
58
|
+
check: "gate6" | "lint" | "typecheck" | "tests" | "audit";
|
|
59
|
+
status: CheckStatus;
|
|
60
|
+
exit_code: number | null;
|
|
61
|
+
command: string;
|
|
62
|
+
stdout: string;
|
|
63
|
+
stderr: string;
|
|
64
|
+
executed: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* NEW failing packages or GHSA IDs vs the baseline.
|
|
67
|
+
* Empty array → either all failures are baselined, or the check passed/skipped.
|
|
68
|
+
* undefined → check is not subject to baseline diffing (gate6, audit-skipped).
|
|
69
|
+
*/
|
|
70
|
+
new_failures?: string[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Injectable spawn function for tests.
|
|
74
|
+
* Default wraps child_process.spawnSync with shell: true.
|
|
75
|
+
*/
|
|
76
|
+
export type SpawnFn = (command: string, opts: {
|
|
77
|
+
cwd: string;
|
|
78
|
+
}) => {
|
|
79
|
+
status: number | null;
|
|
80
|
+
stdout: string;
|
|
81
|
+
stderr: string;
|
|
82
|
+
};
|
|
83
|
+
export interface RunCheckOpts {
|
|
84
|
+
scope: CheckScope;
|
|
85
|
+
/** Defaults to process.cwd(). */
|
|
86
|
+
projectRoot?: string;
|
|
87
|
+
/**
|
|
88
|
+
* When provided, --files was passed on the CLI.
|
|
89
|
+
* In whole-repo mode this is a NO-OP: a deprecation notice is emitted to
|
|
90
|
+
* stderr and the value is ignored (turbo always runs whole-repo).
|
|
91
|
+
* Kept in the API for backwards compatibility.
|
|
92
|
+
*/
|
|
93
|
+
changedFiles?: string[];
|
|
94
|
+
/** Defaults to a wrapper around child_process.spawnSync. */
|
|
95
|
+
spawnFn?: SpawnFn;
|
|
96
|
+
/**
|
|
97
|
+
* When true, run checks and WRITE the discovered failing set +
|
|
98
|
+
* current GHSA ids into .check-baseline.json instead of diffing.
|
|
99
|
+
* This is how the committed seed is produced.
|
|
100
|
+
*/
|
|
101
|
+
updateBaseline?: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* When true, IGNORE the baseline for the verdict — whole-repo ABSOLUTE GREEN.
|
|
104
|
+
* Every failing package (lint/typecheck/tests) and every GHSA id (audit)
|
|
105
|
+
* counts as a failure, so any red fails the check. gate6 is unchanged.
|
|
106
|
+
* Mutually exclusive with updateBaseline (strict mode never writes the
|
|
107
|
+
* baseline): if both are set, updateBaseline is ignored with a stderr warning.
|
|
108
|
+
*/
|
|
109
|
+
noBaseline?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Caps turbo's task parallelism (`turbo run <task> --concurrency=<n>`). The
|
|
112
|
+
* whole-repo (`--scope merged`) matrix runs every package's test suite at once
|
|
113
|
+
* and, at full concurrency, CPU-starves timing-sensitive suites into flaky
|
|
114
|
+
* timeouts — so the strict CI gate passes `1` to serialize and stay
|
|
115
|
+
* deterministic. Omitted (the dev-loop default) → turbo's own default.
|
|
116
|
+
*/
|
|
117
|
+
concurrency?: number;
|
|
118
|
+
/**
|
|
119
|
+
* Injectable baseline loader for tests.
|
|
120
|
+
* Defaults to the real loadBaseline from check-baseline.ts.
|
|
121
|
+
*/
|
|
122
|
+
loadBaselineFn?: (projectRoot: string) => BaselineFile;
|
|
123
|
+
/**
|
|
124
|
+
* Injectable baseline saver for tests.
|
|
125
|
+
* Defaults to the real saveBaseline from check-baseline.ts.
|
|
126
|
+
*/
|
|
127
|
+
saveBaselineFn?: (projectRoot: string, baseline: BaselineFile) => void;
|
|
128
|
+
}
|
|
129
|
+
export interface RunCheckResult {
|
|
130
|
+
results: CheckResult[];
|
|
131
|
+
/** True when any hard-fail check has status === 'fail'. */
|
|
132
|
+
any_failed: boolean;
|
|
133
|
+
/** Names of checks that failed (post-baseline-diff verdict). */
|
|
134
|
+
hard_fail_checks: string[];
|
|
135
|
+
/**
|
|
136
|
+
* True when the run used strict / absolute-green mode (--no-baseline): the
|
|
137
|
+
* baseline was ignored and EVERY failing package / GHSA id counts as a
|
|
138
|
+
* failure. Lets JSON consumers tell a strict verdict from a baseline-tolerant
|
|
139
|
+
* one. Omitted (falsy) for normal baseline-diffed runs.
|
|
140
|
+
*/
|
|
141
|
+
no_baseline?: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* When updateBaseline was true but the write was skipped, reports why.
|
|
144
|
+
* 'gate6_failed' — gate6 check failed; indeterminate tree must not be baselined.
|
|
145
|
+
* 'indeterminate' — one or more sentinel values in currentFailing; results unreliable.
|
|
146
|
+
*/
|
|
147
|
+
baseline_skipped?: "gate6_failed" | "indeterminate";
|
|
148
|
+
/** When updateBaseline was true, reports what was written. */
|
|
149
|
+
baseline_written?: {
|
|
150
|
+
lint_known_failing: string[];
|
|
151
|
+
typecheck_known_failing: string[];
|
|
152
|
+
tests_known_failing: string[];
|
|
153
|
+
audit_ghsa_ids: string[];
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Resolve the turbo binary path.
|
|
158
|
+
*
|
|
159
|
+
* Search order:
|
|
160
|
+
* 1. projectRoot/node_modules/.bin/turbo (package-local install)
|
|
161
|
+
* 2. projectRoot/../../node_modules/.bin/turbo (monorepo workspace root)
|
|
162
|
+
*
|
|
163
|
+
* If turbo is found nowhere, returns a non-executable sentinel string so the
|
|
164
|
+
* caller's try/catch captures the spawn failure and surfaces an actionable
|
|
165
|
+
* error ("turbo not found — run pnpm install") rather than silently falling
|
|
166
|
+
* back to `npx turbo` which may download a possibly-wrong version.
|
|
167
|
+
*
|
|
168
|
+
* NOTE: bare "turbo" is intentionally NOT used — it is absent from the
|
|
169
|
+
* minimal shell PATH when Node spawns child processes (spawnSync shell:true
|
|
170
|
+
* uses /bin/sh which only has standard system paths).
|
|
171
|
+
*/
|
|
172
|
+
export declare function resolveTurboBin(projectRoot: string): string;
|
|
173
|
+
/**
|
|
174
|
+
* Run the unified check matrix for a given scope.
|
|
175
|
+
* Never throws on subprocess failure — all errors are captured and reported.
|
|
176
|
+
*/
|
|
177
|
+
export declare function runCheck(opts: RunCheckOpts): RunCheckResult;
|
|
178
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/lib/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAKH,OAAO,EAOL,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAC;AAM7B;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAE3D;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,qBAAqB,CAAC;AA6C/C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACrD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;IAC1D,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,CACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,KAClB;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,YAAY,CAAC;IACvD;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;CACxE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;IACpD,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE;QACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;CACH;AA+GD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkB3D;AAqED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAmW3D"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library for `codebyplan ci init`.
|
|
3
|
+
*
|
|
4
|
+
* Detects CI platforms from project file signals, builds a default CiConfig,
|
|
5
|
+
* and writes it to `.codebyplan/ci.json`. Idempotent — deep-merges newly
|
|
6
|
+
* detected platforms into an existing config, never overwriting existing platform
|
|
7
|
+
* keys unless --force is set.
|
|
8
|
+
*
|
|
9
|
+
* Platform detection follows the same signals as the testing-matrix reference
|
|
10
|
+
* (.claude/docs/architecture/testing-matrix.md):
|
|
11
|
+
* - next.config.{ts,js,mjs} → next_js
|
|
12
|
+
* - @nestjs/core in package.json → nestjs
|
|
13
|
+
* - tauri.conf.json or src-tauri/ → tauri
|
|
14
|
+
* - @types/vscode in devDependencies → vscode
|
|
15
|
+
* - expo in dependencies → expo
|
|
16
|
+
* - packages/ subdirectory exists → package
|
|
17
|
+
* - (fallback — none of above) → package
|
|
18
|
+
*
|
|
19
|
+
* Note: Tauri detection is implemented here directly; do NOT call detectTechStack
|
|
20
|
+
* for platform resolution (tech-detect.ts does not cover Tauri).
|
|
21
|
+
*
|
|
22
|
+
* The detection path is reader-driven (RepoReader interface) so tests can inject
|
|
23
|
+
* an InMemoryRepoReader. Write operations (mkdir, writeJsonAtomic) stay fs-direct.
|
|
24
|
+
*/
|
|
25
|
+
import type { CiConfig, CiPlatformChecks } from "./types.js";
|
|
26
|
+
import { type RepoReader } from "./repo-reader.js";
|
|
27
|
+
/**
|
|
28
|
+
* Default CI check configurations per platform.
|
|
29
|
+
*
|
|
30
|
+
* Commands use generic `pnpm turbo` invocations without `--filter` as defaults.
|
|
31
|
+
* Callers (ci init, skills) should narrow scope by adjusting the `command` after
|
|
32
|
+
* writing the config for their specific project layout.
|
|
33
|
+
*
|
|
34
|
+
* Lint and e2e always delegate to their sibling config files and carry no
|
|
35
|
+
* inline `command`.
|
|
36
|
+
*/
|
|
37
|
+
export declare const PLATFORM_COMMAND_MAP: Record<string, CiPlatformChecks>;
|
|
38
|
+
/**
|
|
39
|
+
* Detect CI platforms using the provided reader.
|
|
40
|
+
*
|
|
41
|
+
* `reader` provides async access to project content; it encapsulates its own
|
|
42
|
+
* project root, so all paths here are repo-root-relative (e.g. `apps`,
|
|
43
|
+
* `package.json`) and the reader resolves them. This keeps the function source
|
|
44
|
+
* agnostic (a LocalFsReader or a future GitHub-App-backed reader both work).
|
|
45
|
+
*
|
|
46
|
+
* Scans the project root and all direct children of `apps/` (monorepo pattern).
|
|
47
|
+
* Returns an array of unique platform slugs. The `package` platform is added
|
|
48
|
+
* when a `packages/` directory with at least one child is found. Falls back to
|
|
49
|
+
* `["package"]` when no other signals are detected.
|
|
50
|
+
*
|
|
51
|
+
* Per the approved design, list(dir) returns the immediate child DIRECTORY
|
|
52
|
+
* names under dir (loose files are excluded), matching the pre-refactor
|
|
53
|
+
* readdir({withFileTypes}).filter(isDirectory) behaviour. So scanning apps/*
|
|
54
|
+
* yields only sub-app directories, and a non-empty packages/ listing means at
|
|
55
|
+
* least one real sub-package directory exists.
|
|
56
|
+
*/
|
|
57
|
+
export declare function detectPlatforms(reader: RepoReader): Promise<string[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Build a default CiConfig from a list of detected platform slugs.
|
|
60
|
+
*
|
|
61
|
+
* Commands are sourced from PLATFORM_COMMAND_MAP. Unknown platform slugs fall
|
|
62
|
+
* back to the `package` defaults so all platforms are represented.
|
|
63
|
+
*/
|
|
64
|
+
export declare function buildDefaultCiConfig(platforms: string[]): CiConfig;
|
|
65
|
+
export interface CiInitOptions {
|
|
66
|
+
/** If true, compute the operation but do NOT write any files. */
|
|
67
|
+
dryRun?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* If true, overwrite existing platform keys rather than deep-merging.
|
|
70
|
+
* Without --force, only NEW platforms (not already in the config) are added.
|
|
71
|
+
*/
|
|
72
|
+
force?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Override the project root directory (default: process.cwd()).
|
|
75
|
+
*/
|
|
76
|
+
projectDir?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Optional reader for project-content reads. When omitted, a LocalFsReader
|
|
79
|
+
* constructed with `projectDir` is used. Inject an InMemoryRepoReader in
|
|
80
|
+
* tests to avoid disk I/O.
|
|
81
|
+
*/
|
|
82
|
+
reader?: RepoReader;
|
|
83
|
+
}
|
|
84
|
+
export interface CiInitResult {
|
|
85
|
+
/** `written` — file was created or updated. `skipped` — all platforms already present.
|
|
86
|
+
* `dry_run` — computed what would change but wrote nothing. */
|
|
87
|
+
status: "written" | "skipped" | "dry_run";
|
|
88
|
+
/** Absolute path to `.codebyplan/ci.json`. */
|
|
89
|
+
path: string;
|
|
90
|
+
/**
|
|
91
|
+
* For `written`/`dry_run` — the detected or newly-added platform slugs.
|
|
92
|
+
* For `skipped` — the already-present platform slugs (no-op).
|
|
93
|
+
*/
|
|
94
|
+
platforms: string[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Detect platforms in `projectDir` and write (or update) `.codebyplan/ci.json`.
|
|
98
|
+
*
|
|
99
|
+
* Idempotent deep-merge: newly detected platforms are added to the existing
|
|
100
|
+
* config; existing platform keys are left unchanged unless `force` is set.
|
|
101
|
+
*
|
|
102
|
+
* Detection reads are reader-driven (see RepoReader). Write operations remain
|
|
103
|
+
* fs-direct so that the reader interface stays read-only.
|
|
104
|
+
*/
|
|
105
|
+
export declare function runCiInit(opts?: CiInitOptions): Promise<CiInitResult>;
|
|
106
|
+
//# sourceMappingURL=ci-init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-init.d.ts","sourceRoot":"","sources":["../../src/lib/ci-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,kBAAkB,CAAC;AAMlE;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAiMjE,CAAC;AA+BF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6D3E;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,QAAQ,CAsBlE;AAMD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B;oEACgE;IAChE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAMD;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAqF3E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library for `codebyplan ci resolve`.
|
|
3
|
+
*
|
|
4
|
+
* Resolves the shell command (or delegation pointer) for a CI check category
|
|
5
|
+
* by reading `.codebyplan/ci.json`. Falls back to PLATFORM_COMMAND_MAP defaults
|
|
6
|
+
* when ci.json is absent, empty, OR present-but-missing the requested category
|
|
7
|
+
* for the resolved platform — so a partial / older ci.json still resolves from
|
|
8
|
+
* the central default map rather than dropping the caller to a hardcoded literal
|
|
9
|
+
* (which is the duplication this CLI exists to eliminate).
|
|
10
|
+
*
|
|
11
|
+
* Resolution order (first usable check wins):
|
|
12
|
+
* 1. ci.json — config.platforms[slug][category]
|
|
13
|
+
* 2. PLATFORM_COMMAND_MAP[slug][category] — fallback (slug = the resolved platform)
|
|
14
|
+
* 3. PLATFORM_COMMAND_MAP["package"][category] — ultimate fallback (unknown slug)
|
|
15
|
+
*
|
|
16
|
+
* Where `slug` = opts.platform ?? first ci.json platform key ?? "package".
|
|
17
|
+
* `not_found` is returned only when no source carries the category — for the
|
|
18
|
+
* valid CiCategory values this never happens (the package defaults cover all),
|
|
19
|
+
* so it is a defensive terminal state.
|
|
20
|
+
*/
|
|
21
|
+
import type { CiCategory, CiScope } from "./types.js";
|
|
22
|
+
export type CiResolveStatus = "resolved" | "delegates" | "fallback" | "not_found";
|
|
23
|
+
export interface CiResolveOptions {
|
|
24
|
+
/** The CI check category to resolve. */
|
|
25
|
+
category: CiCategory;
|
|
26
|
+
/** Platform slug to look up (e.g. "next_js", "nestjs"). Optional. */
|
|
27
|
+
platform?: string;
|
|
28
|
+
/** Project root directory. Defaults to process.cwd(). */
|
|
29
|
+
projectDir?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface CiResolveResult {
|
|
32
|
+
/** How the resolution completed. */
|
|
33
|
+
status: CiResolveStatus;
|
|
34
|
+
/** The category that was resolved. */
|
|
35
|
+
category: CiCategory;
|
|
36
|
+
/**
|
|
37
|
+
* The platform slug that was used for resolution.
|
|
38
|
+
* Null when the platform could not be determined (e.g. unknown platform
|
|
39
|
+
* with absent ci.json and no PLATFORM_COMMAND_MAP entry).
|
|
40
|
+
*/
|
|
41
|
+
platform: string | null;
|
|
42
|
+
/** Shell command to run. Present when status is "resolved" or "fallback". */
|
|
43
|
+
command?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Path to the config file that owns this check category.
|
|
46
|
+
* Present when status is "delegates".
|
|
47
|
+
*/
|
|
48
|
+
delegates_to?: string;
|
|
49
|
+
/** Scope of the check (per_app_changed or full_repo). */
|
|
50
|
+
scope?: CiScope;
|
|
51
|
+
/** Whether a failure blocks the PR/merge. */
|
|
52
|
+
hard_fail?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* True when ci.json was absent or had no platforms — PLATFORM_COMMAND_MAP
|
|
55
|
+
* defaults were used instead.
|
|
56
|
+
*/
|
|
57
|
+
fallback_used: boolean;
|
|
58
|
+
}
|
|
59
|
+
export declare function resolveCiCommand(opts: CiResolveOptions): CiResolveResult;
|
|
60
|
+
//# sourceMappingURL=ci-resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-resolve.d.ts","sourceRoot":"","sources":["../../src/lib/ci-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAQtD,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,CAAC;AAEhB,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,QAAQ,EAAE,UAAU,CAAC;IACrB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,MAAM,EAAE,eAAe,CAAC;IACxB,sCAAsC;IACtC,QAAQ,EAAE,UAAU,CAAC;IACrB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB;AAwDD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAwCxE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library for auditing the model/effort convention across authoring templates.
|
|
3
|
+
*
|
|
4
|
+
* Convention (from templates/skills/cbp-build-cc-mode/SKILL.md):
|
|
5
|
+
* Skills: model: inherit + effort: — both expected. `inherit` signals
|
|
6
|
+
* session-model inheritance explicitly. Absent model or a non-inherit
|
|
7
|
+
* model value is a gap.
|
|
8
|
+
* Agents: model: <pin> + effort: — both must be pinned. `inherit` is NOT
|
|
9
|
+
* permitted for agents.
|
|
10
|
+
*
|
|
11
|
+
* Agent default: model: sonnet, effort: xhigh.
|
|
12
|
+
* Exceptions: cbp-mechanical-edits → model: haiku, effort: low.
|
|
13
|
+
* cbp-map-architecture → model: sonnet, effort: high.
|
|
14
|
+
* cbp-e2e-* (5 agents) → model: sonnet, effort: high.
|
|
15
|
+
*
|
|
16
|
+
* Valid effort values: low | medium | high | xhigh | max.
|
|
17
|
+
*/
|
|
18
|
+
export interface AuditEntry {
|
|
19
|
+
path: string;
|
|
20
|
+
surface: "agent" | "skill";
|
|
21
|
+
/** Parsed model value, or null if the frontmatter key is absent. */
|
|
22
|
+
model: string | null;
|
|
23
|
+
/** Parsed effort value, or null if the frontmatter key is absent. */
|
|
24
|
+
effort: string | null;
|
|
25
|
+
/** Human-readable expected value (e.g. "model:sonnet/effort:xhigh"). */
|
|
26
|
+
expected: string;
|
|
27
|
+
status: "ok" | "gap";
|
|
28
|
+
gap_reason?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Scan `templatesDir/agents/*.md` and `templatesDir/skills/* /SKILL.md`,
|
|
32
|
+
* apply the model/effort convention, and return one AuditEntry per file.
|
|
33
|
+
*
|
|
34
|
+
* Vendored skills (a skill dir with a sibling `PROVENANCE.md`, installed via
|
|
35
|
+
* `npx skills add …`) are skipped — they follow their upstream author's
|
|
36
|
+
* frontmatter convention, not CBP's model/effort matrix.
|
|
37
|
+
*
|
|
38
|
+
* Read-only — never mutates any file.
|
|
39
|
+
*/
|
|
40
|
+
export declare function auditMode(templatesDir: string): AuditEntry[];
|
|
41
|
+
//# sourceMappingURL=claude-mode-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-mode-audit.d.ts","sourceRoot":"","sources":["../../src/lib/claude-mode-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,oEAAoE;IACpE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,qEAAqE;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,KAAK,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0ID;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,EAAE,CAsC5D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type ManifestEntry } from "./manifest.js";
|
|
2
|
+
export interface DriftPlan {
|
|
3
|
+
unchanged: ManifestEntry[];
|
|
4
|
+
overwriteSafe: Array<{
|
|
5
|
+
packaged: ManifestEntry;
|
|
6
|
+
absSrc: string;
|
|
7
|
+
}>;
|
|
8
|
+
overwriteHandEdited: Array<{
|
|
9
|
+
packaged: ManifestEntry;
|
|
10
|
+
absSrc: string;
|
|
11
|
+
onDiskContent: Buffer;
|
|
12
|
+
}>;
|
|
13
|
+
newOptIn: Array<{
|
|
14
|
+
packaged: ManifestEntry;
|
|
15
|
+
absSrc: string;
|
|
16
|
+
}>;
|
|
17
|
+
removedFromPackage: ManifestEntry[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Classify every file managed by the manifest into one of five buckets:
|
|
21
|
+
* - unchanged: on-disk and templates both match the manifest hash
|
|
22
|
+
* - overwriteSafe: templates changed, on-disk still matches manifest (safe overwrite)
|
|
23
|
+
* - overwriteHandEdited: on-disk differs from manifest (user hand-edit)
|
|
24
|
+
* - newOptIn: in templates but NOT in manifest (newly shipped)
|
|
25
|
+
* - removedFromPackage: in manifest but NOT in templates (removed from package)
|
|
26
|
+
*
|
|
27
|
+
* Pure read-only — never writes to disk.
|
|
28
|
+
* Extracted from update.ts `buildPlan` so both `runUpdate` and `runStatus` can
|
|
29
|
+
* share the same classification logic without duplicating code.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildDriftPlan(projectDir: string, templatesDir: string, manifest: {
|
|
32
|
+
files: ManifestEntry[];
|
|
33
|
+
}): DriftPlan;
|
|
34
|
+
//# sourceMappingURL=claude-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-plan.d.ts","sourceRoot":"","sources":["../../src/lib/claude-plan.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,aAAa,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,mBAAmB,EAAE,KAAK,CAAC;QACzB,QAAQ,EAAE,aAAa,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,kBAAkB,EAAE,aAAa,EAAE,CAAC;CACrC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE;IAAE,KAAK,EAAE,aAAa,EAAE,CAAA;CAAE,GACnC,SAAS,CA6DX"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit scope helper — computes the set intersection between staged files
|
|
3
|
+
* and the active task's known files.
|
|
4
|
+
*
|
|
5
|
+
* Pure function — no I/O. Takes pre-fetched file lists as parameters.
|
|
6
|
+
* No top-level side effects.
|
|
7
|
+
*/
|
|
8
|
+
export interface ComputeScopeTaskFilesInput {
|
|
9
|
+
/** Paths from the active task's files_changed (resolved by the caller via MCP). */
|
|
10
|
+
taskPaths: string[];
|
|
11
|
+
/** Paths currently staged in the git index (from `git diff --cached --name-only`). */
|
|
12
|
+
stagedPaths: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Returns the sorted set intersection of taskPaths and stagedPaths.
|
|
16
|
+
*
|
|
17
|
+
* Both inputs are treated as sets — duplicates within each list are deduplicated
|
|
18
|
+
* before intersection so the output contains each path at most once.
|
|
19
|
+
*/
|
|
20
|
+
export declare function computeScopeTaskFiles(input: ComputeScopeTaskFilesInput): string[];
|
|
21
|
+
//# sourceMappingURL=commit-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-scope.d.ts","sourceRoot":"","sources":["../../src/lib/commit-scope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,0BAA0B;IACzC,mFAAmF;IACnF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sFAAsF;IACtF,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAMD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,MAAM,EAAE,CAaV"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure lib for E2E deterministic gate verification.
|
|
3
|
+
*
|
|
4
|
+
* Codifies the three hard-fails from rules/e2e-mandatory.md and the
|
|
5
|
+
* context/testing/e2e.md dispatch/eligibility contract.
|
|
6
|
+
*
|
|
7
|
+
* No MCP imports, no filesystem side effects at module level.
|
|
8
|
+
* e2e.json content is passed in as an already-parsed object (or null).
|
|
9
|
+
* All public functions accept injectable deps so tests never hit real I/O.
|
|
10
|
+
*/
|
|
11
|
+
export interface E2eFrameworkConfig {
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
auto_run: boolean;
|
|
14
|
+
/** App source path (e.g. "apps/web"). Repo root is "" or "." for single-app. */
|
|
15
|
+
app: string;
|
|
16
|
+
/** e.g. ["web"] | ["ios","android"] | ["desktop"] */
|
|
17
|
+
platforms?: string[];
|
|
18
|
+
credential_vars?: {
|
|
19
|
+
email?: string | null;
|
|
20
|
+
password?: string | null;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface E2eConfig {
|
|
24
|
+
frameworks?: Record<string, E2eFrameworkConfig>;
|
|
25
|
+
}
|
|
26
|
+
export interface E2eTestResults {
|
|
27
|
+
passed: number;
|
|
28
|
+
failed: number;
|
|
29
|
+
skipped: number;
|
|
30
|
+
}
|
|
31
|
+
export interface E2eCriticalIssue {
|
|
32
|
+
type: string;
|
|
33
|
+
spec_path?: string | null;
|
|
34
|
+
reason: string;
|
|
35
|
+
}
|
|
36
|
+
/** Console/page error captured by the Playwright quality fixture. */
|
|
37
|
+
export interface E2eConsoleError {
|
|
38
|
+
test_name?: string;
|
|
39
|
+
type?: "console" | "pageerror" | "requestfailed";
|
|
40
|
+
text: string;
|
|
41
|
+
}
|
|
42
|
+
/** Aggregated axe accessibility scan summary (Playwright). */
|
|
43
|
+
export interface E2eA11ySummary {
|
|
44
|
+
scanned_pages?: string[];
|
|
45
|
+
violations?: Array<{
|
|
46
|
+
rule?: string;
|
|
47
|
+
impact?: string;
|
|
48
|
+
page?: string;
|
|
49
|
+
}>;
|
|
50
|
+
}
|
|
51
|
+
/** Shape of each entry in round.context.e2e_outputs[framework] */
|
|
52
|
+
export interface E2eOutputEntry {
|
|
53
|
+
status: "completed" | "failed";
|
|
54
|
+
tests_run?: boolean;
|
|
55
|
+
test_results?: E2eTestResults;
|
|
56
|
+
e2e_gallery?: E2eGalleryEntry[] | null;
|
|
57
|
+
preflight?: {
|
|
58
|
+
dev_server?: {
|
|
59
|
+
ok: boolean;
|
|
60
|
+
required?: boolean;
|
|
61
|
+
port?: number | null;
|
|
62
|
+
notes?: string;
|
|
63
|
+
};
|
|
64
|
+
simulator?: {
|
|
65
|
+
ok: boolean;
|
|
66
|
+
required?: boolean;
|
|
67
|
+
device?: string | null;
|
|
68
|
+
notes?: string;
|
|
69
|
+
};
|
|
70
|
+
built_binary?: {
|
|
71
|
+
ok: boolean;
|
|
72
|
+
required?: boolean;
|
|
73
|
+
path?: string | null;
|
|
74
|
+
notes?: string;
|
|
75
|
+
};
|
|
76
|
+
/** Full shape from context/testing/e2e.md: { required: string[], missing: string[], ok: bool } */
|
|
77
|
+
env_vars?: {
|
|
78
|
+
ok: boolean;
|
|
79
|
+
required?: string[];
|
|
80
|
+
missing?: string[];
|
|
81
|
+
};
|
|
82
|
+
auth_probe?: {
|
|
83
|
+
ok: boolean;
|
|
84
|
+
ran?: boolean;
|
|
85
|
+
probe_path?: string | null;
|
|
86
|
+
error?: string | null;
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
critical_issues?: E2eCriticalIssue[];
|
|
90
|
+
/** Quality-capture fields (rules/e2e-mandatory.md § Quality-Capture Mandates).
|
|
91
|
+
* Absent on legacy outputs — absence never fails verification. */
|
|
92
|
+
console_errors?: E2eConsoleError[] | null;
|
|
93
|
+
a11y?: E2eA11ySummary | null;
|
|
94
|
+
}
|
|
95
|
+
export interface E2eGalleryEntry {
|
|
96
|
+
test_name: string;
|
|
97
|
+
page_or_screen: string;
|
|
98
|
+
framework: string;
|
|
99
|
+
committed_path: string;
|
|
100
|
+
is_new: boolean;
|
|
101
|
+
baseline_diff_pct: number | null;
|
|
102
|
+
}
|
|
103
|
+
export interface VerifyRoundContext {
|
|
104
|
+
/** List of eligible framework names (from dispatcher's eligibility calc). */
|
|
105
|
+
e2e_eligible?: string[];
|
|
106
|
+
/** Map of framework → specialist output. */
|
|
107
|
+
e2e_outputs?: Record<string, E2eOutputEntry>;
|
|
108
|
+
/** Round type — "survey" rounds short-circuit to pass. */
|
|
109
|
+
round_type?: string;
|
|
110
|
+
}
|
|
111
|
+
export interface VerifyRoundInput {
|
|
112
|
+
round_context: VerifyRoundContext;
|
|
113
|
+
/** Paths of files changed in this round. */
|
|
114
|
+
files_changed: string[];
|
|
115
|
+
/** Parsed .codebyplan/e2e.json content, or null if absent. */
|
|
116
|
+
e2e_config: E2eConfig | null;
|
|
117
|
+
}
|
|
118
|
+
export interface FailedCheck {
|
|
119
|
+
check: "e2e_eligible_skipped" | "zero_assertion_run" | "empty_gallery" | "console_errors_reported" | "a11y_violations_reported";
|
|
120
|
+
framework: string;
|
|
121
|
+
detail: string;
|
|
122
|
+
}
|
|
123
|
+
export interface ValidSkip {
|
|
124
|
+
framework: string;
|
|
125
|
+
reason: string;
|
|
126
|
+
}
|
|
127
|
+
export interface VerifyRoundResult {
|
|
128
|
+
pass: boolean;
|
|
129
|
+
failed_checks: FailedCheck[];
|
|
130
|
+
skipped_validly: ValidSkip[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Verify the three E2E hard-fails for a completed round.
|
|
134
|
+
*
|
|
135
|
+
* Hard-fails (per rules/e2e-mandatory.md):
|
|
136
|
+
*
|
|
137
|
+
* 1. e2e_eligible_skipped — a framework listed in e2e_eligible[] has no entry
|
|
138
|
+
* in e2e_outputs AND no valid skip reason recorded.
|
|
139
|
+
*
|
|
140
|
+
* 2. zero_assertion_run — a framework's e2e_outputs[f].test_results has
|
|
141
|
+
* passed === 0 && skipped > 0 for touched paths.
|
|
142
|
+
*
|
|
143
|
+
* 3. empty_gallery — eligible framework that ran with status "completed" reports
|
|
144
|
+
* empty / missing e2e_gallery[] (exception: vscode-test may have empty gallery
|
|
145
|
+
* when the extension has no visual surface — but the field MUST be present).
|
|
146
|
+
*
|
|
147
|
+
* 4. console_errors_reported — status "completed" but console_errors[] is
|
|
148
|
+
* non-empty (quality-capture inconsistency; a completed run must be
|
|
149
|
+
* console-clean). Absent/null field never fails (legacy outputs).
|
|
150
|
+
*
|
|
151
|
+
* 5. a11y_violations_reported — status "completed" but a11y.violations[] is
|
|
152
|
+
* non-empty. Absent/null field never fails (legacy outputs).
|
|
153
|
+
*
|
|
154
|
+
* Survey rounds and empty e2e_eligible short-circuit to pass.
|
|
155
|
+
*/
|
|
156
|
+
export declare function verifyRound(input: VerifyRoundInput): VerifyRoundResult;
|
|
157
|
+
//# sourceMappingURL=e2e.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.d.ts","sourceRoot":"","sources":["../../src/lib/e2e.ts"],"names":[],"mappings":"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"}
|