codebyplan 1.13.52 → 1.13.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +3226 -897
- package/package.json +1 -1
- package/templates/agents/cbp-database-agent.md +1 -1
- package/templates/agents/cbp-e2e-maestro.md +1 -1
- package/templates/agents/cbp-e2e-playwright.md +24 -16
- package/templates/agents/cbp-e2e-tauri.md +1 -1
- package/templates/agents/cbp-e2e-vscode.md +1 -1
- package/templates/agents/cbp-e2e-xcuitest.md +1 -1
- package/templates/agents/cbp-improve-claude.md +2 -2
- package/templates/agents/{cbp-round-executor.md → cbp-round-builder.md} +23 -23
- package/templates/agents/{cbp-task-planner.md → cbp-round-planner.md} +26 -25
- package/templates/agents/cbp-security-agent.md +10 -2
- package/templates/agents/cbp-stripe-agent.md +2 -2
- package/templates/agents/cbp-testing-qa-agent.md +34 -20
- package/templates/agents/cbp-verify-reviewer.md +236 -0
- package/templates/context/architecture-map.md +4 -4
- package/templates/context/mcp-docs.md +57 -11
- package/templates/context/testing/e2e.md +9 -9
- package/templates/github-workflows/ci.yml +104 -0
- package/templates/github-workflows/publish.yml +8 -27
- package/templates/github-workflows/release-desktop.yml +215 -0
- package/templates/hooks/cbp-skill-context-guard.sh +1 -1
- package/templates/hooks/cbp-test-hooks.sh +9 -9
- package/templates/hooks/validate-structure-lengths.sh +1 -1
- package/templates/hooks/validate-structure-patterns.sh +1 -1
- package/templates/rules/README.md +1 -2
- package/templates/rules/agent-claim-verification.md +1 -1
- package/templates/rules/context-file-loading.md +10 -10
- package/templates/rules/development-workflow.md +73 -0
- package/templates/rules/e2e-mandatory.md +8 -8
- package/templates/rules/execution-proof.md +70 -0
- package/templates/rules/model-invocation-convention.md +2 -2
- package/templates/rules/parallel-waves.md +11 -11
- package/templates/rules/spawn-failure-is-gate-failure.md +76 -0
- package/templates/rules/task-routing-recommendation.md +1 -1
- package/templates/rules/todo-backend.md +3 -3
- package/templates/rules/two-tier-ci.md +63 -0
- package/templates/settings.project.base.json +15 -11
- package/templates/skills/cbp-build-cc-mode/SKILL.md +1 -1
- package/templates/skills/cbp-build-cc-settings/reference/cbp-permission-policy.md +7 -7
- package/templates/skills/cbp-build-cc-skill/SKILL.md +1 -1
- package/templates/skills/cbp-build-cc-skill/reference/cbp-quality.md +2 -2
- package/templates/skills/cbp-build-cc-skill/reference/fork-eligibility.md +11 -14
- package/templates/skills/cbp-checkpoint-check/SKILL.md +11 -3
- package/templates/skills/cbp-checkpoint-create/SKILL.md +16 -1
- package/templates/skills/cbp-checkpoint-end/SKILL.md +5 -1
- package/templates/skills/cbp-checkpoint-update/SKILL.md +3 -3
- package/templates/skills/cbp-clear-continue/SKILL.md +2 -2
- package/templates/skills/cbp-clear-prep/SKILL.md +3 -3
- package/templates/skills/{cbp-task-complete → cbp-finalize}/SKILL.md +25 -29
- package/templates/skills/{cbp-task-complete → cbp-finalize}/reference/checkpoint-done-branching.md +1 -1
- package/templates/skills/{cbp-task-complete → cbp-finalize}/reference/next-step-heuristic.md +1 -1
- package/templates/skills/cbp-frontend-design/SKILL.md +1 -1
- package/templates/skills/cbp-frontend-ui/SKILL.md +7 -7
- package/templates/skills/cbp-git-commit/SKILL.md +3 -3
- package/templates/skills/cbp-merge-main/SKILL.md +4 -4
- package/templates/skills/{cbp-round-execute → cbp-round-build}/SKILL.md +93 -75
- package/templates/skills/cbp-round-complete/SKILL.md +15 -14
- package/templates/skills/cbp-round-plan/SKILL.md +344 -0
- package/templates/skills/cbp-session-end/SKILL.md +1 -1
- package/templates/skills/cbp-setup-cd/SKILL.md +291 -0
- package/templates/skills/cbp-setup-cd/reference/github-actions-cd.md +231 -0
- package/templates/skills/cbp-setup-ci/SKILL.md +175 -0
- package/templates/skills/cbp-setup-ci/reference/github-actions.md +100 -0
- package/templates/skills/cbp-ship/SKILL.md +21 -0
- package/templates/skills/cbp-ship-main/SKILL.md +3 -2
- package/templates/skills/cbp-standalone-task-check/SKILL.md +10 -9
- package/templates/skills/cbp-standalone-task-complete/SKILL.md +12 -13
- package/templates/skills/cbp-standalone-task-create/SKILL.md +16 -9
- package/templates/skills/cbp-standalone-task-start/SKILL.md +9 -5
- package/templates/skills/cbp-standalone-task-testing/SKILL.md +16 -7
- package/templates/skills/cbp-task-create/SKILL.md +6 -7
- package/templates/skills/cbp-task-start/SKILL.md +8 -8
- package/templates/skills/cbp-todo/SKILL.md +6 -8
- package/templates/skills/cbp-verify/SKILL.md +146 -0
- package/templates/skills/cbp-verify/reference/deterministic-gates.md +114 -0
- package/templates/skills/{cbp-round-end → cbp-verify}/reference/findings-presentation.md +16 -12
- package/templates/skills/cbp-verify/reference/round-scope.md +62 -0
- package/templates/skills/cbp-verify/reference/task-scope.md +71 -0
- package/templates/agents/cbp-improve-round.md +0 -283
- package/templates/agents/cbp-task-check.md +0 -217
- package/templates/skills/cbp-round-check/SKILL.md +0 -132
- package/templates/skills/cbp-round-end/SKILL.md +0 -173
- package/templates/skills/cbp-round-end/reference/inline-fallback.md +0 -35
- package/templates/skills/cbp-round-execute/reference/inline-fallback.md +0 -55
- package/templates/skills/cbp-round-input/SKILL.md +0 -197
- package/templates/skills/cbp-round-start/SKILL.md +0 -261
- package/templates/skills/cbp-round-update/SKILL.md +0 -120
- package/templates/skills/cbp-ship/templates/workflow-eas-submit.yml +0 -53
- package/templates/skills/cbp-ship/templates/workflow-vsce-publish.yml +0 -31
- package/templates/skills/cbp-task-check/SKILL.md +0 -172
- package/templates/skills/cbp-task-testing/SKILL.md +0 -277
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Generated by: codebyplan ci scaffold-workflow
|
|
2
|
+
#
|
|
3
|
+
# This workflow runs lint, typecheck, tests, and build on every pull request.
|
|
4
|
+
# It is intentionally generic and works as-is for any pnpm + Turborepo project.
|
|
5
|
+
#
|
|
6
|
+
# By design this gates on FULL-REPO GREEN: `pnpm turbo <task>` runs the task
|
|
7
|
+
# across every package with no `--filter`, so a shallow checkout (fetch-depth:1)
|
|
8
|
+
# is fine — git history is not needed for affected-package detection. Per-package
|
|
9
|
+
# / changed-path scoping (`scope: per_app_changed` in .codebyplan/ci.json) is
|
|
10
|
+
# applied by the local CodeByPlan round/testing skills, NOT by this workflow.
|
|
11
|
+
# Do not add turbo `--filter=[HEAD^]` here without also setting fetch-depth: 0.
|
|
12
|
+
#
|
|
13
|
+
# Two values you can adjust via `codebyplan ci scaffold-workflow`:
|
|
14
|
+
# --pnpm-version <v> pnpm version (current: {{PNPM_VERSION}})
|
|
15
|
+
# --node-version <v> Node.js version (current: {{NODE_VERSION}})
|
|
16
|
+
#
|
|
17
|
+
# Two jobs:
|
|
18
|
+
# ci SOFT tier (authoritative required check) — the baseline-tolerant
|
|
19
|
+
# inner loop: lint, typecheck, test, build across the repo.
|
|
20
|
+
# ci-strict HARDCORE tier (report-only) — whole-repo ABSOLUTE GREEN via
|
|
21
|
+
# `codebyplan check --scope merged --no-baseline`. Non-blocking for
|
|
22
|
+
# now; flip to a required check once the repo is absolute-green.
|
|
23
|
+
|
|
24
|
+
name: CI
|
|
25
|
+
|
|
26
|
+
on:
|
|
27
|
+
pull_request:
|
|
28
|
+
|
|
29
|
+
# Cancel an in-progress run when a newer commit is pushed to the same PR/ref,
|
|
30
|
+
# so superseded full-repo runs don't queue up and waste runner minutes.
|
|
31
|
+
concurrency:
|
|
32
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
33
|
+
cancel-in-progress: true
|
|
34
|
+
|
|
35
|
+
permissions:
|
|
36
|
+
contents: read
|
|
37
|
+
|
|
38
|
+
jobs:
|
|
39
|
+
ci:
|
|
40
|
+
name: Lint + typecheck + test + build
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
steps:
|
|
43
|
+
- name: Checkout
|
|
44
|
+
uses: actions/checkout@v4
|
|
45
|
+
|
|
46
|
+
- name: Setup pnpm
|
|
47
|
+
uses: pnpm/action-setup@v4
|
|
48
|
+
with:
|
|
49
|
+
version: "{{PNPM_VERSION}}"
|
|
50
|
+
|
|
51
|
+
- name: Setup Node
|
|
52
|
+
uses: actions/setup-node@v4
|
|
53
|
+
with:
|
|
54
|
+
node-version: "{{NODE_VERSION}}"
|
|
55
|
+
cache: pnpm
|
|
56
|
+
|
|
57
|
+
- name: Install dependencies
|
|
58
|
+
run: pnpm install --frozen-lockfile
|
|
59
|
+
|
|
60
|
+
- name: Lint
|
|
61
|
+
run: pnpm turbo lint
|
|
62
|
+
|
|
63
|
+
- name: Typecheck
|
|
64
|
+
run: pnpm turbo typecheck
|
|
65
|
+
|
|
66
|
+
- name: Test
|
|
67
|
+
run: pnpm turbo test
|
|
68
|
+
|
|
69
|
+
- name: Build
|
|
70
|
+
run: pnpm turbo build
|
|
71
|
+
|
|
72
|
+
# ── HARDCORE strict tier (report-only) ──────────────────────────────────────
|
|
73
|
+
# Whole-repo ABSOLUTE GREEN: `codebyplan check --scope merged --no-baseline`
|
|
74
|
+
# ignores .check-baseline.json entirely, so ANY failing package (lint,
|
|
75
|
+
# typecheck, test) fails this job. This is the future checkpoint→main gate.
|
|
76
|
+
#
|
|
77
|
+
# report-only until apps/web baseline is burned down; flip to required after.
|
|
78
|
+
# `continue-on-error: true` keeps it non-blocking — the `ci` job above stays
|
|
79
|
+
# the authoritative required check. Do NOT wire this job as a branch-protection
|
|
80
|
+
# required check until the whole repo is absolute-green.
|
|
81
|
+
ci-strict:
|
|
82
|
+
name: Strict whole-repo green (report-only)
|
|
83
|
+
runs-on: ubuntu-latest
|
|
84
|
+
continue-on-error: true
|
|
85
|
+
steps:
|
|
86
|
+
- name: Checkout
|
|
87
|
+
uses: actions/checkout@v4
|
|
88
|
+
|
|
89
|
+
- name: Setup pnpm
|
|
90
|
+
uses: pnpm/action-setup@v4
|
|
91
|
+
with:
|
|
92
|
+
version: "{{PNPM_VERSION}}"
|
|
93
|
+
|
|
94
|
+
- name: Setup Node
|
|
95
|
+
uses: actions/setup-node@v4
|
|
96
|
+
with:
|
|
97
|
+
node-version: "{{NODE_VERSION}}"
|
|
98
|
+
cache: pnpm
|
|
99
|
+
|
|
100
|
+
- name: Install dependencies
|
|
101
|
+
run: pnpm install --frozen-lockfile
|
|
102
|
+
|
|
103
|
+
- name: Strict check (no baseline)
|
|
104
|
+
run: pnpm exec codebyplan check --scope merged --no-baseline
|
|
@@ -1,34 +1,16 @@
|
|
|
1
|
-
# Generated by: codebyplan scaffold-publish-workflow
|
|
2
|
-
#
|
|
3
|
-
# This workflow publishes the codebyplan npm package on every merge to main
|
|
4
|
-
# where the committed package.json version exceeds the version currently on npm.
|
|
5
|
-
# It also auto-publishes prerelease versions (e.g. 1.14.0-beta.1) from feat/**
|
|
6
|
-
# branches to a scoped dist-tag (e.g. --tag beta) — see the beta channel docs
|
|
7
|
-
# for the full workflow. No release PR, no conventional-commit parsing — the
|
|
8
|
-
# version committed in the feat branch is the version that ships.
|
|
9
|
-
#
|
|
10
|
-
# Two values a consuming repo must adjust:
|
|
11
|
-
# 1. paths: — set to the package directory whose package.json drives versioning
|
|
12
|
-
# (current value: 'packages/codebyplan-package/**')
|
|
13
|
-
# 2. npm view <package-name> — replace `codebyplan` with the actual package name
|
|
14
|
-
# in the "Check version vs published" and exact-version check steps
|
|
15
|
-
#
|
|
16
|
-
# Everything else (OIDC auth, pnpm 10.12.4, Node 20, build:npm → publish) is
|
|
17
|
-
# intentionally generic and works as-is for any single-package npm publish.
|
|
18
|
-
|
|
19
1
|
name: Publish codebyplan to npm
|
|
20
2
|
|
|
21
3
|
on:
|
|
22
4
|
push:
|
|
23
5
|
branches:
|
|
24
6
|
- main
|
|
25
|
-
-
|
|
7
|
+
- 'feat/**'
|
|
26
8
|
paths:
|
|
27
|
-
-
|
|
9
|
+
- 'packages/codebyplan-package/**'
|
|
28
10
|
workflow_dispatch:
|
|
29
11
|
inputs:
|
|
30
12
|
dry_run:
|
|
31
|
-
description:
|
|
13
|
+
description: 'Print what would be published without actually publishing'
|
|
32
14
|
type: boolean
|
|
33
15
|
default: false
|
|
34
16
|
|
|
@@ -182,7 +164,7 @@ jobs:
|
|
|
182
164
|
- name: Setup Node
|
|
183
165
|
uses: actions/setup-node@v4
|
|
184
166
|
with:
|
|
185
|
-
node-version:
|
|
167
|
+
node-version: 22
|
|
186
168
|
cache: pnpm
|
|
187
169
|
|
|
188
170
|
- name: Install dependencies
|
|
@@ -210,11 +192,10 @@ jobs:
|
|
|
210
192
|
# short-lived publish token. Requires a Trusted Publisher configured for
|
|
211
193
|
# this repo + workflow on npmjs.com.
|
|
212
194
|
#
|
|
213
|
-
# NO --provenance
|
|
214
|
-
#
|
|
215
|
-
#
|
|
216
|
-
#
|
|
217
|
-
# supply-chain attestation, add `--provenance` to the command below.
|
|
195
|
+
# NO --provenance: npm provenance attestation only supports PUBLIC source
|
|
196
|
+
# repositories (registry returns E422 "Unsupported source repository
|
|
197
|
+
# visibility: private" otherwise). This repo is private, so provenance is
|
|
198
|
+
# omitted. Re-add `--provenance` only if the source repo becomes public.
|
|
218
199
|
#
|
|
219
200
|
# --tag: routes stable publishes to "latest" and prerelease publishes to
|
|
220
201
|
# the prerelease id (e.g. "beta", "rc"). C1 guarantee: betas never land on
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
name: Release Desktop App
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
paths:
|
|
8
|
+
- "apps/desktop/**"
|
|
9
|
+
workflow_dispatch: {}
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: write
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
check-version:
|
|
16
|
+
name: Check if release needed
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
outputs:
|
|
19
|
+
should_release: ${{ steps.check.outputs.should_release }}
|
|
20
|
+
version: ${{ steps.check.outputs.version }}
|
|
21
|
+
steps:
|
|
22
|
+
- name: Checkout
|
|
23
|
+
uses: actions/checkout@v4
|
|
24
|
+
|
|
25
|
+
- name: Check version tag
|
|
26
|
+
id: check
|
|
27
|
+
run: |
|
|
28
|
+
VERSION=$(jq -r '.version' apps/desktop/src-tauri/tauri.conf.json)
|
|
29
|
+
TAG="desktop-v${VERSION}"
|
|
30
|
+
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
|
31
|
+
|
|
32
|
+
if git ls-remote --tags origin "refs/tags/${TAG}" | grep -q "${TAG}"; then
|
|
33
|
+
echo "Tag ${TAG} already exists - skipping release"
|
|
34
|
+
echo "should_release=false" >> "$GITHUB_OUTPUT"
|
|
35
|
+
else
|
|
36
|
+
echo "Tag ${TAG} does not exist - will release"
|
|
37
|
+
echo "should_release=true" >> "$GITHUB_OUTPUT"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
build:
|
|
41
|
+
needs: check-version
|
|
42
|
+
if: needs.check-version.outputs.should_release == 'true'
|
|
43
|
+
# `secrets` is not allowed in `if:` expressions — map presence to a job-level
|
|
44
|
+
# env (where `secrets` IS permitted) and test that in the step condition.
|
|
45
|
+
env:
|
|
46
|
+
HAS_WINDOWS_CERT: ${{ secrets.WINDOWS_CERTIFICATE != '' }}
|
|
47
|
+
strategy:
|
|
48
|
+
fail-fast: false
|
|
49
|
+
matrix:
|
|
50
|
+
include:
|
|
51
|
+
- platform: macos-latest
|
|
52
|
+
target: aarch64-apple-darwin
|
|
53
|
+
label: macOS (Apple Silicon)
|
|
54
|
+
- platform: macos-latest
|
|
55
|
+
target: x86_64-apple-darwin
|
|
56
|
+
label: macOS (Intel)
|
|
57
|
+
- platform: windows-latest
|
|
58
|
+
target: x86_64-pc-windows-msvc
|
|
59
|
+
label: Windows (x86_64)
|
|
60
|
+
|
|
61
|
+
name: Build ${{ matrix.label }}
|
|
62
|
+
runs-on: ${{ matrix.platform }}
|
|
63
|
+
|
|
64
|
+
steps:
|
|
65
|
+
- name: Checkout
|
|
66
|
+
uses: actions/checkout@v4
|
|
67
|
+
|
|
68
|
+
- name: Install Rust stable
|
|
69
|
+
uses: dtolnay/rust-toolchain@stable
|
|
70
|
+
with:
|
|
71
|
+
targets: ${{ matrix.target }}
|
|
72
|
+
|
|
73
|
+
- name: Install pnpm
|
|
74
|
+
uses: pnpm/action-setup@v4
|
|
75
|
+
|
|
76
|
+
- name: Setup Node.js
|
|
77
|
+
uses: actions/setup-node@v4
|
|
78
|
+
with:
|
|
79
|
+
node-version: 22
|
|
80
|
+
cache: pnpm
|
|
81
|
+
|
|
82
|
+
- name: Install dependencies
|
|
83
|
+
run: pnpm install --frozen-lockfile
|
|
84
|
+
|
|
85
|
+
- name: Write Apple API key to file
|
|
86
|
+
if: runner.os == 'macOS'
|
|
87
|
+
run: |
|
|
88
|
+
mkdir -p ~/private_keys
|
|
89
|
+
printf '%s' "$APPLE_API_KEY_CONTENT" > ~/private_keys/AuthKey.p8
|
|
90
|
+
env:
|
|
91
|
+
APPLE_API_KEY_CONTENT: ${{ secrets.APPLE_API_KEY_CONTENT }}
|
|
92
|
+
|
|
93
|
+
- name: Build desktop app
|
|
94
|
+
# Pinned for supply-chain safety. Review before bumping:
|
|
95
|
+
# https://github.com/tauri-apps/tauri-action/releases
|
|
96
|
+
#
|
|
97
|
+
# Windows leg skipped when WINDOWS_CERTIFICATE secret is absent — lets
|
|
98
|
+
# macOS-only notarized releases ship while the Windows EV cert is being
|
|
99
|
+
# procured. When the secret is present but the build fails for any other
|
|
100
|
+
# reason (network, tauri-action bug, etc.), the step still fails loudly.
|
|
101
|
+
if: ${{ runner.os != 'Windows' || env.HAS_WINDOWS_CERT == 'true' }}
|
|
102
|
+
uses: tauri-apps/tauri-action@84b9d35b5fc46c1e45415bdb6144030364f7ebc5 # action-v0.6.2
|
|
103
|
+
env:
|
|
104
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
105
|
+
# Tauri updater artifact signing (required for latest.json signatures on all platforms)
|
|
106
|
+
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
|
107
|
+
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
|
108
|
+
# Apple Developer signing (macOS only — empty on Windows, tauri-action ignores)
|
|
109
|
+
APPLE_CERTIFICATE: ${{ runner.os == 'macOS' && secrets.APPLE_CERTIFICATE || '' }}
|
|
110
|
+
APPLE_CERTIFICATE_PASSWORD: ${{ runner.os == 'macOS' && secrets.APPLE_CERTIFICATE_PASSWORD || '' }}
|
|
111
|
+
APPLE_SIGNING_IDENTITY: ${{ runner.os == 'macOS' && secrets.APPLE_SIGNING_IDENTITY || '' }}
|
|
112
|
+
APPLE_API_ISSUER: ${{ runner.os == 'macOS' && secrets.APPLE_API_ISSUER || '' }}
|
|
113
|
+
APPLE_API_KEY: ${{ runner.os == 'macOS' && secrets.APPLE_API_KEY || '' }}
|
|
114
|
+
APPLE_API_KEY_PATH: ${{ runner.os == 'macOS' && '~/private_keys/AuthKey.p8' || '' }}
|
|
115
|
+
# Windows code signing (Windows only — empty on macOS, tauri-action ignores)
|
|
116
|
+
WINDOWS_CERTIFICATE: ${{ runner.os == 'Windows' && secrets.WINDOWS_CERTIFICATE || '' }}
|
|
117
|
+
WINDOWS_CERTIFICATE_PASSWORD: ${{ runner.os == 'Windows' && secrets.WINDOWS_CERTIFICATE_PASSWORD || '' }}
|
|
118
|
+
with:
|
|
119
|
+
projectPath: apps/desktop
|
|
120
|
+
tauriScript: pnpm tauri
|
|
121
|
+
args: --target ${{ matrix.target }}
|
|
122
|
+
tagName: desktop-v${{ needs.check-version.outputs.version }}
|
|
123
|
+
releaseName: "CodeByPlan Desktop v${{ needs.check-version.outputs.version }}"
|
|
124
|
+
releaseBody: |
|
|
125
|
+
## CodeByPlan Desktop v${{ needs.check-version.outputs.version }}
|
|
126
|
+
|
|
127
|
+
Download the appropriate installer for your platform:
|
|
128
|
+
- **macOS Apple Silicon** (.dmg) - For M1/M2/M3/M4 Macs
|
|
129
|
+
- **macOS Intel** (.dmg) - For older Intel-based Macs
|
|
130
|
+
- **Windows** (.msi) - For Windows 10/11 x64
|
|
131
|
+
|
|
132
|
+
### Installation
|
|
133
|
+
|
|
134
|
+
**macOS:**
|
|
135
|
+
1. Download the `.dmg` file for your Mac
|
|
136
|
+
2. Open the `.dmg` and drag CodeByPlan to Applications
|
|
137
|
+
3. Launch CodeByPlan from Applications
|
|
138
|
+
|
|
139
|
+
**Windows:**
|
|
140
|
+
1. Download the `.msi` file
|
|
141
|
+
2. Run the installer and follow the prompts
|
|
142
|
+
3. Launch CodeByPlan from the Start Menu
|
|
143
|
+
releaseDraft: false
|
|
144
|
+
prerelease: false
|
|
145
|
+
includeUpdaterJson: true
|
|
146
|
+
|
|
147
|
+
notify:
|
|
148
|
+
needs: [check-version, build]
|
|
149
|
+
if: needs.check-version.outputs.should_release == 'true' && needs.build.result == 'success'
|
|
150
|
+
runs-on: ubuntu-latest
|
|
151
|
+
name: Register Release
|
|
152
|
+
steps:
|
|
153
|
+
- name: Checkout
|
|
154
|
+
uses: actions/checkout@v4
|
|
155
|
+
|
|
156
|
+
- name: Download latest.json from GitHub Release
|
|
157
|
+
env:
|
|
158
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
159
|
+
VERSION: ${{ needs.check-version.outputs.version }}
|
|
160
|
+
run: |
|
|
161
|
+
TAG="desktop-v${VERSION}"
|
|
162
|
+
gh release download "${TAG}" --pattern "latest.json" --dir .
|
|
163
|
+
|
|
164
|
+
- name: Post release metadata to API
|
|
165
|
+
env:
|
|
166
|
+
CBP_API_KEY: ${{ secrets.CODEBYPLAN_API_KEY }}
|
|
167
|
+
VERSION: ${{ needs.check-version.outputs.version }}
|
|
168
|
+
run: |
|
|
169
|
+
TAG="desktop-v${VERSION}"
|
|
170
|
+
REPO="${{ github.repository }}"
|
|
171
|
+
BASE_URL="https://github.com/${REPO}/releases/download/${TAG}"
|
|
172
|
+
|
|
173
|
+
# Read the latest.json generated by tauri-action
|
|
174
|
+
MANIFEST=$(cat latest.json)
|
|
175
|
+
echo "Manifest: ${MANIFEST}"
|
|
176
|
+
|
|
177
|
+
# Build download URLs (for website download page)
|
|
178
|
+
AARCH64_DMG_URL="${BASE_URL}/CodeByPlan_${VERSION}_aarch64.dmg"
|
|
179
|
+
X86_64_DMG_URL="${BASE_URL}/CodeByPlan_${VERSION}_x64.dmg"
|
|
180
|
+
WINDOWS_X86_64_MSI_URL="${BASE_URL}/CodeByPlan_${VERSION}_x64_en-US.msi"
|
|
181
|
+
|
|
182
|
+
# Extract updater data from latest.json and merge with installer URLs
|
|
183
|
+
PLATFORMS=$(echo "${MANIFEST}" | jq \
|
|
184
|
+
--arg aarch64_dmg "${AARCH64_DMG_URL}" \
|
|
185
|
+
--arg x86_64_dmg "${X86_64_DMG_URL}" \
|
|
186
|
+
--arg windows_x86_64_msi "${WINDOWS_X86_64_MSI_URL}" '
|
|
187
|
+
.platforms | to_entries | map(
|
|
188
|
+
.value += (
|
|
189
|
+
if .key == "darwin-aarch64" then { "dmg_url": $aarch64_dmg }
|
|
190
|
+
elif .key == "darwin-x86_64" then { "dmg_url": $x86_64_dmg }
|
|
191
|
+
elif .key == "windows-x86_64" then { "msi_url": $windows_x86_64_msi }
|
|
192
|
+
else {}
|
|
193
|
+
end
|
|
194
|
+
)
|
|
195
|
+
) | from_entries
|
|
196
|
+
')
|
|
197
|
+
|
|
198
|
+
NOTES=$(echo "${MANIFEST}" | jq -r '.notes // "CodeByPlan Desktop v'"${VERSION}"'"')
|
|
199
|
+
PUB_DATE=$(echo "${MANIFEST}" | jq -r '.pub_date // empty')
|
|
200
|
+
if [ -z "${PUB_DATE}" ]; then
|
|
201
|
+
PUB_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
202
|
+
fi
|
|
203
|
+
|
|
204
|
+
# POST to our API
|
|
205
|
+
curl -fL -X POST \
|
|
206
|
+
"https://www.codebyplan.com/api/desktop/releases" \
|
|
207
|
+
-H "Content-Type: application/json" \
|
|
208
|
+
-H "x-api-key: ${CBP_API_KEY}" \
|
|
209
|
+
-d "$(jq -n \
|
|
210
|
+
--arg version "${VERSION}" \
|
|
211
|
+
--arg notes "${NOTES}" \
|
|
212
|
+
--arg pub_date "${PUB_DATE}" \
|
|
213
|
+
--argjson platforms "${PLATFORMS}" \
|
|
214
|
+
'{version: $version, notes: $notes, pub_date: $pub_date, platforms: $platforms}'
|
|
215
|
+
)"
|
|
@@ -21,7 +21,7 @@ THRESHOLD="${CBP_CONTEXT_WARN_TOKENS:-200000}"
|
|
|
21
21
|
|
|
22
22
|
# Heavy close-out allowlist (cbp-clear-prep + cbp-clear-continue deliberately excluded so
|
|
23
23
|
# they always run even when context > threshold).
|
|
24
|
-
HEAVY_SKILLS="cbp-round-
|
|
24
|
+
HEAVY_SKILLS="cbp-round-build cbp-verify cbp-standalone-task-testing cbp-checkpoint-check cbp-checkpoint-end"
|
|
25
25
|
|
|
26
26
|
# Cheap allowlist check before summing tokens
|
|
27
27
|
IS_HEAVY=false
|
|
@@ -537,18 +537,18 @@ if [ ! -f "$GUARD_HOOK" ]; then
|
|
|
537
537
|
test_result "cbp-skill-context-guard.sh present" "passed" "missing"
|
|
538
538
|
else
|
|
539
539
|
|
|
540
|
-
# Case 1: over-threshold + cbp-round-
|
|
540
|
+
# Case 1: over-threshold + cbp-round-build (heavy) → permissionDecision=deny
|
|
541
541
|
STDIN=$(jq -n \
|
|
542
542
|
--arg t "$FIXTURES_GUARD/over-threshold.jsonl" \
|
|
543
|
-
--arg s "cbp-round-
|
|
543
|
+
--arg s "cbp-round-build" \
|
|
544
544
|
'{transcript_path:$t,tool_input:{skill:$s}}')
|
|
545
545
|
OUTPUT=$(echo "$STDIN" | CBP_CONTEXT_WARN_TOKENS=200000 bash "$GUARD_HOOK" 2>/dev/null)
|
|
546
546
|
EXIT_CODE=$?
|
|
547
547
|
if [ "$EXIT_CODE" = "0" ] \
|
|
548
548
|
&& echo "$OUTPUT" | jq -e '.hookSpecificOutput.permissionDecision == "deny"' >/dev/null 2>&1; then
|
|
549
|
-
test_result "cbp-skill-context-guard.sh over-threshold + cbp-round-
|
|
549
|
+
test_result "cbp-skill-context-guard.sh over-threshold + cbp-round-build → deny" "passed" "passed"
|
|
550
550
|
else
|
|
551
|
-
test_result "cbp-skill-context-guard.sh over-threshold + cbp-round-
|
|
551
|
+
test_result "cbp-skill-context-guard.sh over-threshold + cbp-round-build → deny" "passed" "failed (exit=$EXIT_CODE output=$(echo "$OUTPUT" | head -c 80))"
|
|
552
552
|
fi
|
|
553
553
|
|
|
554
554
|
# Case 2: over-threshold + cbp-clear-prep (exempt) → empty stdout, exit 0
|
|
@@ -577,17 +577,17 @@ else
|
|
|
577
577
|
test_result "cbp-skill-context-guard.sh over-threshold + cbp-clear-continue (exempt) → empty stdout" "passed" "failed (exit=$EXIT_CODE)"
|
|
578
578
|
fi
|
|
579
579
|
|
|
580
|
-
# Case 4: under-threshold + cbp-round-
|
|
580
|
+
# Case 4: under-threshold + cbp-round-build → empty stdout, exit 0
|
|
581
581
|
STDIN=$(jq -n \
|
|
582
582
|
--arg t "$FIXTURES_GUARD/under-threshold.jsonl" \
|
|
583
|
-
--arg s "cbp-round-
|
|
583
|
+
--arg s "cbp-round-build" \
|
|
584
584
|
'{transcript_path:$t,tool_input:{skill:$s}}')
|
|
585
585
|
OUTPUT=$(echo "$STDIN" | CBP_CONTEXT_WARN_TOKENS=200000 bash "$GUARD_HOOK" 2>/dev/null)
|
|
586
586
|
EXIT_CODE=$?
|
|
587
587
|
if [ "$EXIT_CODE" = "0" ] && [ -z "$OUTPUT" ]; then
|
|
588
|
-
test_result "cbp-skill-context-guard.sh under-threshold + cbp-round-
|
|
588
|
+
test_result "cbp-skill-context-guard.sh under-threshold + cbp-round-build → empty stdout" "passed" "passed"
|
|
589
589
|
else
|
|
590
|
-
test_result "cbp-skill-context-guard.sh under-threshold + cbp-round-
|
|
590
|
+
test_result "cbp-skill-context-guard.sh under-threshold + cbp-round-build → empty stdout" "passed" "failed (exit=$EXIT_CODE)"
|
|
591
591
|
fi
|
|
592
592
|
|
|
593
593
|
# Case 5: empty skill_name → empty stdout, exit 0
|
|
@@ -603,7 +603,7 @@ else
|
|
|
603
603
|
fi
|
|
604
604
|
|
|
605
605
|
# Case 6: missing transcript_path → empty stdout, exit 0 (fast-path)
|
|
606
|
-
STDIN=$(jq -n --arg s "cbp-round-
|
|
606
|
+
STDIN=$(jq -n --arg s "cbp-round-build" '{tool_input:{skill:$s}}')
|
|
607
607
|
OUTPUT=$(echo "$STDIN" | CBP_CONTEXT_WARN_TOKENS=200000 bash "$GUARD_HOOK" 2>/dev/null)
|
|
608
608
|
EXIT_CODE=$?
|
|
609
609
|
if [ "$EXIT_CODE" = "0" ] && [ -z "$OUTPUT" ]; then
|
|
@@ -12,7 +12,7 @@ _get_limit() {
|
|
|
12
12
|
# Documented exceptions — higher budget
|
|
13
13
|
/docs/templates/*/task.md) echo "450 900"; return;;
|
|
14
14
|
/.claude/docs/architecture/development.md) echo "1200 2000"; return;;
|
|
15
|
-
/.claude/skills/cbp-round-
|
|
15
|
+
/.claude/skills/cbp-round-plan/SKILL.md) echo "600 1000"; return;;
|
|
16
16
|
/.claude/rules/development-workflow.md) echo "250 400"; return;;
|
|
17
17
|
# Unlimited files
|
|
18
18
|
/CHANGELOG.md|*/CHANGELOG.md|*/user-input.md|/.claude/docs/research/*) echo ""; return;;
|
|
@@ -39,7 +39,7 @@ if match_path '^/\.claude/docs/stack/' \
|
|
|
39
39
|
fi
|
|
40
40
|
|
|
41
41
|
# Notation consistency (warn-only): flag bare-colon command notation in .claude/ markdown
|
|
42
|
-
# See: cbp-round-
|
|
42
|
+
# See: cbp-round-plan Step 0 "CHK / TASK / ROUND Identifier Notation Vocabulary" — all command refs must use /cbp-* form
|
|
43
43
|
if match_path '^/\.claude/(rules|skills|agents)/' && match_path '\.md$'; then
|
|
44
44
|
CONTENT=$(read_input_content)
|
|
45
45
|
[ -z "$CONTENT" ] && [ -f "$FILE_PATH" ] && CONTENT=$(cat "$FILE_PATH" 2>/dev/null || true)
|
|
@@ -34,7 +34,7 @@ The `install`/`update`/`uninstall` flow handles these files identically to how i
|
|
|
34
34
|
|
|
35
35
|
## Current status
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
Eight rules are shipped:
|
|
38
38
|
|
|
39
39
|
| Rule file | Scope | Summary |
|
|
40
40
|
|---|---|---|
|
|
@@ -45,7 +45,6 @@ Nine rules are shipped:
|
|
|
45
45
|
| `agent-claim-verification.md` | `org-shared` | Verify an agent's claimed outcomes against ground truth (git, filesystem, tool results) before trusting them |
|
|
46
46
|
| `e2e-mandatory.md` | `org-shared` | E2E is opt-out: an eligible framework whose source changed in a round must run its specialist or record a valid skip |
|
|
47
47
|
| `parallel-waves.md` | `org-shared` | Wave-dispatch contract for parallel round execution — topological ordering and per-wave testing |
|
|
48
|
-
| `task-routing-recommendation.md` | `repo-only:codebyplan` | Two-family command surface (checkpoint-bound vs standalone) and identifier-format routing — installed only in codebyplan-family repos |
|
|
49
48
|
| `cbp-operating-gotchas.md` | `org-shared` | Cross-repo CBP-tooling traps (ship/timeout/MCP-replace/worktree/lint-baseline/approval-reconcile) + behavioral prefs, inherited once by all consumers |
|
|
50
49
|
|
|
51
50
|
## Contributing a rule
|
|
@@ -10,7 +10,7 @@ paths:
|
|
|
10
10
|
<!-- Delivery: subagents receive this rule via the [[agent-claim-verification]] pointer in each
|
|
11
11
|
agent's .md file. The `paths:` frontmatter surfaces it when an agent file is being *edited*,
|
|
12
12
|
not when the agent is *running* — both mechanisms are intentional, so don't drop the pointer.
|
|
13
|
-
Scope is agents-only by design (cbp-round-
|
|
13
|
+
Scope is agents-only by design (cbp-round-builder, cbp-research); skill files are out of
|
|
14
14
|
scope this round. -->
|
|
15
15
|
|
|
16
16
|
Subagents routinely emit tool calls and explanatory text that depend on a named thing *existing* — a JSON config key, a schema field, an environment-variable name, an external API's request/response shape. When that name is recalled from memory instead of read from the source, it is often subtly wrong: a renamed field, a key that moved to a different file, an API shape from an older version. Those hallucinated names cost correction rounds.
|
|
@@ -12,20 +12,20 @@ paths:
|
|
|
12
12
|
|
|
13
13
|
| Context File | Loaded By | Phase | Purpose |
|
|
14
14
|
|--------------|-----------|-------|---------|
|
|
15
|
-
| `context/testing/unit.md` | `cbp-round-
|
|
15
|
+
| `context/testing/unit.md` | `cbp-round-builder` | Step 3.6 | Unit test patterns per framework |
|
|
16
16
|
| `context/testing/e2e.md` | `cbp-e2e-playwright`, `cbp-e2e-maestro`, `cbp-e2e-tauri`, `cbp-e2e-vscode`, `cbp-e2e-xcuitest` | Entry | Shared contract: Input/Output, preflight, failure classification, dispatch routing |
|
|
17
17
|
| `context/testing/e2e.md` | `cbp-testing-qa-agent` | Preflight | Env var list per framework |
|
|
18
18
|
| `context/testing/e2e.md` | `cbp-checkpoint-plan` | Step 4 | Discovery probe dispatch contract |
|
|
19
|
-
| `context/testing/e2e.md` | `cbp-round-
|
|
19
|
+
| `context/testing/e2e.md` | `cbp-round-build` | Step 5 | E2E specialist dispatch routing |
|
|
20
20
|
| `context/testing/e2e.md` | `cbp-checkpoint-check` | Step 5b | Whole-checkpoint e2e dispatch |
|
|
21
|
-
| `context/testing/eslint.md` | `cbp-
|
|
22
|
-
| `context/testing/eslint.md` | `cbp-
|
|
23
|
-
| `context/mcp-docs.md` | `cbp-
|
|
24
|
-
| `context/mcp-docs.md` | `cbp-round-
|
|
21
|
+
| `context/testing/eslint.md` | `cbp-round-planner` | Phase 1.5 | ESLint Compliance Checklist |
|
|
22
|
+
| `context/testing/eslint.md` | `cbp-verify-reviewer` | Config-File Mode | Config-file compliance audit |
|
|
23
|
+
| `context/mcp-docs.md` | `cbp-round-planner` | Phase 2.6 | MCP library doc lookup contract — per-dependency consultation via DocsByPlan MCP tools (resolve_library_id → search_chunks/lookup_symbol → get_chunk) |
|
|
24
|
+
| `context/mcp-docs.md` | `cbp-round-builder` | Step 3.4 | Library-specific reference — pre-write API verification via DocsByPlan MCP tools |
|
|
25
25
|
| `context/architecture/arch-map-spec.md` | `cbp-map-architecture` | Entry | Canonical architecture-map artifact format — per-module frontmatter + sections, INDEX.md row format, dependency-graph format |
|
|
26
|
-
| `context/architecture-map.md` | `cbp-
|
|
27
|
-
| `context/architecture-map.md` | `cbp-round-
|
|
28
|
-
| `rules/parallel-waves.md` | `cbp-
|
|
26
|
+
| `context/architecture-map.md` | `cbp-round-planner` | Phase 3 | Architecture map consultation contract — when + how to read per-module maps before finalizing scope |
|
|
27
|
+
| `context/architecture-map.md` | `cbp-round-builder` | Step 2.4 | Architecture map consultation contract — when + how to read per-module maps before editing files |
|
|
28
|
+
| `rules/parallel-waves.md` | `cbp-round-planner` | Phase 5.6 | Wave schema, invariants (3..15 file-count), and the proximity-split algorithm (a `rules/` file, not `context/**`; listed here for consumer discoverability) |
|
|
29
29
|
|
|
30
30
|
New context files MUST be added here in the same change that introduces the consumer — or the file is orphan infrastructure.
|
|
31
31
|
|
|
@@ -37,7 +37,7 @@ New context files MUST be added here in the same change that introduces the cons
|
|
|
37
37
|
|
|
38
38
|
## Why Fail Loudly
|
|
39
39
|
|
|
40
|
-
Silent fallback hides drift. A rename or deletion of `context/testing/unit.md` would let `cbp-round-
|
|
40
|
+
Silent fallback hides drift. A rename or deletion of `context/testing/unit.md` would let `cbp-round-builder` keep writing tests from memory, drifting from the canonical recipe. A failed agent surfaces the drift on the first invocation; silent fallback lets it compound.
|
|
41
41
|
|
|
42
42
|
## Path Convention
|
|
43
43
|
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: The full CodeByPlan development loop — session, planning, the round build/verify cycle, and checkpoint ship — as a concise skill map.
|
|
3
|
+
paths:
|
|
4
|
+
- ".claude/skills/cbp-session-start/**"
|
|
5
|
+
- ".claude/skills/cbp-todo/**"
|
|
6
|
+
- ".claude/skills/cbp-round-plan/**"
|
|
7
|
+
- ".claude/skills/cbp-verify/**"
|
|
8
|
+
- ".claude/skills/cbp-finalize/**"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Development Workflow
|
|
12
|
+
|
|
13
|
+
The full pipeline, as a map (not a tutorial). Each arrow is an auto-trigger or a single `Next:`
|
|
14
|
+
directive — never an A/B/C menu (`feedback-close-out-routing.md`). Skill names below are the
|
|
15
|
+
canonical post-redesign names.
|
|
16
|
+
|
|
17
|
+
## Session Frame
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
/cbp-session-start → ... work ... → /cbp-session-end
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`/cbp-todo` answers "what do I work on next" inside a session.
|
|
24
|
+
|
|
25
|
+
## Planning a Unit of Work
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
checkpoint-bound: /cbp-checkpoint-create → /cbp-checkpoint-plan → /cbp-checkpoint-start
|
|
29
|
+
standalone: /cbp-standalone-task-create → /cbp-standalone-task-start
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`cbp-checkpoint-create` is mechanical (checkpoint row + feat branch, zero tasks);
|
|
33
|
+
`cbp-checkpoint-plan` does the deep planning (tasks as vertical slices); `cbp-checkpoint-start`
|
|
34
|
+
activates + claims. Standalone work skips checkpoint shipment entirely.
|
|
35
|
+
|
|
36
|
+
## The Round Cycle (per task)
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
/cbp-round-plan → /cbp-round-build → /cbp-verify (scope=round) → /cbp-round-complete
|
|
40
|
+
↑ │
|
|
41
|
+
└──────────────── more work wanted on the task ───────────────────────┘
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- **`/cbp-round-plan`** — round planning entry (round-1 planning + the folded-in round-input
|
|
45
|
+
deep-analysis role). Spawns `cbp-round-planner`.
|
|
46
|
+
- **`/cbp-round-build`** — owns the plan-approval gate + per-wave execution. Spawns
|
|
47
|
+
`cbp-round-builder`; auto-triggers `/cbp-verify`.
|
|
48
|
+
- **`/cbp-verify` (round scope)** — unified verify stage: deterministic gates +
|
|
49
|
+
real-execution proof + fresh-context review (`cbp-verify-reviewer`). Any fail → `/cbp-round-plan`
|
|
50
|
+
fix round.
|
|
51
|
+
- **`/cbp-round-complete`** — the separate `ask`-tier, `disable-model-invocation` human git-add
|
|
52
|
+
finalizer. The user stages approved files; it reconciles + completes the round.
|
|
53
|
+
|
|
54
|
+
## Closing the Task → Checkpoint
|
|
55
|
+
|
|
56
|
+
On the **last clean round** of a task, verify escalates to task scope and finalizes:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
/cbp-verify (scope=task) → /cbp-finalize → /cbp-checkpoint-check → /cbp-checkpoint-end
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- **`/cbp-verify` (scope=task)** — whole-repo `codebyplan check --scope task`, holistic reviewer,
|
|
63
|
+
one batched human walkthrough, writes `task.context.verify_verdict={verdict:'READY'}`.
|
|
64
|
+
- **`/cbp-finalize`** — task-level ship finalizer.
|
|
65
|
+
- **`/cbp-checkpoint-check`** then **`/cbp-checkpoint-end`** — checkpoint re-evaluation +
|
|
66
|
+
shipment (hardcore CI tier, `rules/two-tier-ci.md`).
|
|
67
|
+
|
|
68
|
+
## Cross-References
|
|
69
|
+
|
|
70
|
+
- `rules/two-tier-ci.md` — soft (round/task) vs hardcore (checkpoint) gate strictness.
|
|
71
|
+
- `rules/execution-proof.md` — the committed-artifact obligation at every verify.
|
|
72
|
+
- `rules/spawn-failure-is-gate-failure.md` — agent spawn failure is a STOP, not a self-grade.
|
|
73
|
+
- `rules/task-routing-recommendation.md` — checkpoint-bound vs standalone command families.
|
|
@@ -14,7 +14,7 @@ A framework is **eligible** in a round when ALL hold:
|
|
|
14
14
|
- The framework's `app` source path intersects the round's `files_changed` (repo root for
|
|
15
15
|
single-app repos).
|
|
16
16
|
|
|
17
|
-
When eligible, `/cbp-round-
|
|
17
|
+
When eligible, `/cbp-round-build` Step 5 spawns the matching specialist in parallel with
|
|
18
18
|
`cbp-testing-qa-agent`; `/cbp-checkpoint-check` Step 5b does the same against the aggregated
|
|
19
19
|
file union with `whole_checkpoint_mode: true`.
|
|
20
20
|
|
|
@@ -28,8 +28,8 @@ no hard-fail fires.
|
|
|
28
28
|
## `e2e_eligible_skipped` Hard-Fail
|
|
29
29
|
|
|
30
30
|
If a framework was eligible this round but no specialist ran AND no valid skip reason is
|
|
31
|
-
recorded, the round **hard-fails** and `/cbp-round-
|
|
32
|
-
`/cbp-round-
|
|
31
|
+
recorded, the round **hard-fails** and `/cbp-round-build` Step 6 auto-triggers
|
|
32
|
+
`/cbp-round-plan`. Silent skips are bugs, not conveniences — this is the enforcement behind
|
|
33
33
|
the opt-out contract.
|
|
34
34
|
|
|
35
35
|
**Valid skip reasons** (must be recorded in `round.context.e2e_outputs[framework]` or the
|
|
@@ -54,8 +54,8 @@ check. Pre-flight (`context/testing/e2e.md` Step 6.5.1) is the only mechanism fo
|
|
|
54
54
|
env-conditional skipping.
|
|
55
55
|
|
|
56
56
|
A spec that ran with `passed === 0 && skipped > 0` for any path touching `files_changed` is a
|
|
57
|
-
**hard fail**, not a pass — `cbp-
|
|
58
|
-
verdict on a zero-assertion e2e run and routes to a fix round per this rule.
|
|
57
|
+
**hard fail**, not a pass — `cbp-verify-reviewer` (`agents/cbp-verify-reviewer.md`) refuses a
|
|
58
|
+
READY verdict on a zero-assertion e2e run and routes to a fix round per this rule.
|
|
59
59
|
|
|
60
60
|
## Committed-Screenshot Enforcement
|
|
61
61
|
|
|
@@ -64,7 +64,7 @@ path it touched is a defect — not a valid pass. Every framework must write at
|
|
|
64
64
|
PNG to its committed dir (per the table in `context/testing/e2e.md` § Committed-Screenshot
|
|
65
65
|
Mandate) and `git add` it before reporting `status: 'completed'`.
|
|
66
66
|
|
|
67
|
-
`cbp-
|
|
67
|
+
`cbp-verify-reviewer` refuses a READY verdict when `e2e_gallery[]` is empty AND the round
|
|
68
68
|
touched UI source paths for an eligible framework — sole exception: `vscode-test`-only
|
|
69
69
|
rounds (SD-3, behavior-only extensions; see below). The fix path is the same as for a
|
|
70
70
|
zero-assertion run: open a fix round that captures the missing committed screenshots.
|
|
@@ -77,7 +77,7 @@ has no visual output (behavior-only tests). Agents must still define the dir and
|
|
|
77
77
|
|
|
78
78
|
- `context/testing/e2e.md` — Input/Output contract, pre-flight loop, failure classification,
|
|
79
79
|
committed-screenshot mandate, auto-new/gated-changed model, and dispatch routing table.
|
|
80
|
-
- `agents/cbp-
|
|
80
|
+
- `agents/cbp-verify-reviewer.md` — enforces the zero-assertion hard-fail and the empty
|
|
81
81
|
`e2e_gallery[]` hard-fail at verdict time.
|
|
82
|
-
- `skills/cbp-round-
|
|
82
|
+
- `skills/cbp-round-build/SKILL.md` Step 5/6, `skills/cbp-checkpoint-check/SKILL.md` Step 5b
|
|
83
83
|
— the config-driven dispatch and `e2e_eligible_skipped` gate implementations.
|