-
Notifications
You must be signed in to change notification settings - Fork 0
chore(codex): bootstrap tests and docs defaults #10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
ab61757
a74d788
9d0d986
5b324da
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| { | ||
| "contract": "tests-docs-bootstrap-v1", | ||
| "adapter": "node-ts", | ||
| "branch": "codex/bootstrap-tests-docs-v1", | ||
| "generated_at": "2026-02-17T05:41:48.224Z", | ||
| "generated_by": "/Users/d/.codex/scripts/bootstrap/global_tests_docs_bootstrap.mjs", | ||
| "changed_files": [] | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| You are a QA Test Critic reviewing only changed files and related tests. | ||
|
|
||
| Review criteria: | ||
| 1. Tests assert behavior outcomes, not implementation details. | ||
| 2. Each changed behavior includes edge/error/boundary coverage. | ||
| 3. Mocks are used only at external boundaries. | ||
| 4. UI tests cover loading/empty/error/success and disabled/focus-visible states. | ||
| 5. Assertions would fail under realistic regressions. | ||
| 6. Flag brittle selectors, snapshot spam, and tautological assertions. | ||
| 7. Flag missing docs updates for API/command or architecture changes. | ||
|
|
||
| Output: | ||
| - Emit ReviewFindingV1 findings only. | ||
| - Priority order: critical, high, medium, low. |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,21 @@ | ||||||
| #!/usr/bin/env bash | ||||||
| set -euo pipefail | ||||||
|
|
||||||
| VERIFY_FILE="${1:-.codex/verify.commands}" | ||||||
| if [[ ! -f "$VERIFY_FILE" ]]; then | ||||||
| echo "missing verify commands file: $VERIFY_FILE" >&2 | ||||||
| exit 1 | ||||||
| fi | ||||||
|
|
||||||
| failed=0 | ||||||
| while IFS= read -r cmd || [[ -n "$cmd" ]]; do | ||||||
| [[ -z "$cmd" ]] && continue | ||||||
| [[ "$cmd" =~ ^# ]] && continue | ||||||
| echo ">>> $cmd" | ||||||
| if ! bash -lc "$cmd"; then | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This line introduces a critical command injection vulnerability. The
Suggested change
|
||||||
| failed=1 | ||||||
| break | ||||||
| fi | ||||||
| done < "$VERIFY_FILE" | ||||||
|
|
||||||
| exit "$failed" | ||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| pnpm lint | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The verification runner executes Useful? React with 👍 / 👎. |
||
| pnpm typecheck | ||
| pnpm test:coverage | ||
| pnpm test:integration | ||
| pnpm test:e2e:smoke | ||
| pnpm docs:generate | ||
| pnpm docs:check | ||
| Original file line number | Diff line number | Diff line change | |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,46 @@ | |||||||||||||||||||||||||||||
| name: quality-gates | |||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| on: | |||||||||||||||||||||||||||||
| pull_request: | |||||||||||||||||||||||||||||
| push: | |||||||||||||||||||||||||||||
| branches: [main, master] | |||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| jobs: | |||||||||||||||||||||||||||||
| quality: | |||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | |||||||||||||||||||||||||||||
| steps: | |||||||||||||||||||||||||||||
| - uses: actions/checkout@v5 | |||||||||||||||||||||||||||||
| with: | |||||||||||||||||||||||||||||
| fetch-depth: 0 | |||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| - uses: actions/setup-node@v5 | |||||||||||||||||||||||||||||
| with: | |||||||||||||||||||||||||||||
| node-version: 22 | |||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| - uses: pnpm/action-setup@v4 | |||||||||||||||||||||||||||||
|
Check warning on line 20 in .github/workflows/quality-gates.yml
|
|||||||||||||||||||||||||||||
| with: | |||||||||||||||||||||||||||||
| version: 9 | |||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| - name: Install dependencies | |||||||||||||||||||||||||||||
| run: pnpm install --frozen-lockfile | |||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This job installs dependencies with Useful? React with 👍 / 👎. |
|||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| - name: Policy checks | |||||||||||||||||||||||||||||
| run: node scripts/ci/require-tests-and-docs.mjs | |||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| - name: Verify commands | |||||||||||||||||||||||||||||
| run: bash .codex/scripts/run_verify_commands.sh | |||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| - name: Diff coverage | |||||||||||||||||||||||||||||
| run: | | |||||||||||||||||||||||||||||
| python -m pip install --upgrade pip diff-cover | |||||||||||||||||||||||||||||
| diff-cover coverage/lcov.info --compare-branch=origin/main --fail-under=90 | |||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| - name: Upload test artifacts on failure | |||||||||||||||||||||||||||||
| if: failure() | |||||||||||||||||||||||||||||
| uses: actions/upload-artifact@v4 | |||||||||||||||||||||||||||||
| with: | |||||||||||||||||||||||||||||
| name: test-artifacts | |||||||||||||||||||||||||||||
| path: | | |||||||||||||||||||||||||||||
| playwright-report/ | |||||||||||||||||||||||||||||
| test-results/ | |||||||||||||||||||||||||||||
| coverage/ | |||||||||||||||||||||||||||||
|
Comment on lines
+10
to
+46
Check warningCode scanning / CodeQL Workflow does not contain permissions Medium
Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
Copilot AutofixAI about 1 month ago In general, to fix this class of problem you explicitly define a For this workflow, the simplest and best fix without changing existing functionality is to add a job-level permissions:
contents: readNo additional imports, methods, or definitions are needed since this is a YAML workflow configuration change only.
Suggested changeset
1
.github/workflows/quality-gates.yml
Copilot is powered by AI and may make mistakes. Always verify output.
Refresh and try again.
|
|||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| ## Definition of Done: Tests + Docs (Blocking) | ||
|
|
||
| - Any production code change must include meaningful test updates in the same PR. | ||
| - Meaningful tests must include at least: | ||
| - one primary behavior assertion | ||
| - two non-happy-path assertions (edge, boundary, invalid input, or failure mode) | ||
| - Trivial assertions are forbidden (`expect(true).toBe(true)`, snapshot-only without semantic assertions, render-only smoke tests without behavior checks). | ||
| - Mock only external boundaries (network, clock, randomness, third-party SDKs). Do not mock the unit under test. | ||
| - UI changes must cover state matrix: loading, empty, error, success, disabled, focus-visible. | ||
| - API/command surface changes must update generated contract artifacts and request/response examples. | ||
| - Architecture-impacting changes must include an ADR in `/docs/adr/`. | ||
| - Required checks are blocking when `fail` or `not-run`: lint, typecheck, tests, coverage, diff coverage, docs check. | ||
| - Reviewer -> fixer -> reviewer loop is required before merge. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| # 0000. Title | ||
|
|
||
| ## Status | ||
| Proposed | Accepted | Superseded | ||
|
|
||
| ## Context | ||
| What problem or constraint forced this decision? | ||
|
|
||
| ## Decision | ||
| What was chosen? | ||
|
|
||
| ## Consequences | ||
| What improves, what tradeoffs are accepted, what risks remain? | ||
|
|
||
| ## Alternatives Considered | ||
| Option A, Option B, and why they were rejected. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| { | ||
| "openapi": "3.1.0", | ||
| "info": { | ||
| "title": "API Contract", | ||
| "version": "1.0.0" | ||
| }, | ||
| "paths": {}, | ||
| "components": {} | ||
| } |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,41 @@ | ||||||
| import { execSync } from 'node:child_process'; | ||||||
|
Check warning on line 1 in scripts/ci/require-tests-and-docs.mjs
|
||||||
|
|
||||||
| const defaultBaseRef = (() => { | ||||||
|
Check warning on line 3 in scripts/ci/require-tests-and-docs.mjs
|
||||||
| try { | ||||||
| return execSync('git symbolic-ref refs/remotes/origin/HEAD', { encoding: 'utf8' }).trim().replace('refs/remotes/', ''); | ||||||
| } catch { | ||||||
| return 'origin/main'; | ||||||
| } | ||||||
| })(); | ||||||
|
|
||||||
| const baseRef = process.env.GITHUB_BASE_REF ? `origin/${process.env.GITHUB_BASE_REF}` : defaultBaseRef; | ||||||
|
Check warning on line 11 in scripts/ci/require-tests-and-docs.mjs
|
||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Codacy has a fix for the issue: ES2015 template literals are forbidden.
Suggested change
|
||||||
| const diff = execSync(`git diff --name-only ${baseRef}...HEAD`, { encoding: 'utf8' }) | ||||||
|
Check warning on line 12 in scripts/ci/require-tests-and-docs.mjs
|
||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The To remediate this, ensure that
Suggested change
|
||||||
| .split('\n') | ||||||
| .map((line) => line.trim()) | ||||||
|
Check warning on line 14 in scripts/ci/require-tests-and-docs.mjs
|
||||||
| .filter(Boolean); | ||||||
|
|
||||||
| const isProdCode = (file) => /^(src|app|server|api)\//.test(file) && !/\.(test|spec)\.[cm]?[jt]sx?$/.test(file); | ||||||
|
Check warning on line 17 in scripts/ci/require-tests-and-docs.mjs
|
||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Codacy has a fix for the issue: ES2015 arrow function expressions are forbidden.
Suggested change
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||||||
| const isTest = (file) => /^tests\//.test(file) || /\.(test|spec)\.[cm]?[jt]sx?$/.test(file); | ||||||
|
Check warning on line 18 in scripts/ci/require-tests-and-docs.mjs
|
||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Codacy has a fix for the issue: ES2015 arrow function expressions are forbidden.
Suggested change
|
||||||
| const isDoc = (file) => /^docs\//.test(file) || /^openapi\//.test(file) || file === 'README.md'; | ||||||
|
Check warning on line 19 in scripts/ci/require-tests-and-docs.mjs
|
||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Codacy has a fix for the issue: ES2015 arrow function expressions are forbidden.
Suggested change
|
||||||
| const isApiSurface = (file) => /^(src|app|server|api)\/.*(route|controller|handler|webhook|api|command)/.test(file); | ||||||
|
Check warning on line 20 in scripts/ci/require-tests-and-docs.mjs
|
||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Codacy has a fix for the issue: ES2015 arrow function expressions are forbidden.
Suggested change
|
||||||
| const isArchChange = (file) => /^src\/(auth|db|infra|queue|events|architecture)\//.test(file) || /^infra\//.test(file); | ||||||
|
Check warning on line 21 in scripts/ci/require-tests-and-docs.mjs
|
||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Codacy has a fix for the issue: ES2015 arrow function expressions are forbidden.
Suggested change
|
||||||
| const isAdr = (file) => /^docs\/adr\/\d{4}-.*\.md$/.test(file); | ||||||
|
Check warning on line 22 in scripts/ci/require-tests-and-docs.mjs
|
||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Codacy has a fix for the issue: ES2015 arrow function expressions are forbidden.
Suggested change
|
||||||
|
|
||||||
| const prodChanged = diff.some(isProdCode); | ||||||
| const testsChanged = diff.some(isTest); | ||||||
| const apiChanged = diff.some(isApiSurface); | ||||||
| const docsChanged = diff.some(isDoc); | ||||||
| const archChanged = diff.some(isArchChange); | ||||||
| const adrChanged = diff.some(isAdr); | ||||||
|
|
||||||
| const failures = []; | ||||||
| if (prodChanged && !testsChanged) failures.push('Policy failure: production code changed without test updates.'); | ||||||
| if (apiChanged && !docsChanged) failures.push('Policy failure: API/command changes without docs/OpenAPI updates.'); | ||||||
| if (archChanged && !adrChanged) failures.push('Policy failure: architecture-impacting change without ADR.'); | ||||||
|
|
||||||
| if (failures.length > 0) { | ||||||
| for (const failure of failures) console.error(failure); | ||||||
|
Check warning on line 37 in scripts/ci/require-tests-and-docs.mjs
|
||||||
| process.exit(1); | ||||||
| } | ||||||
|
|
||||||
| console.log('Policy checks passed.'); | ||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| #!/usr/bin/env bash | ||
| set -euo pipefail | ||
|
|
||
| ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" | ||
|
|
||
| "$ROOT_DIR/scripts/clean-heavy.sh" | ||
|
|
||
| ALL_TARGETS=( | ||
| "$ROOT_DIR/node_modules" | ||
| ) | ||
|
|
||
| for target in "${ALL_TARGETS[@]}"; do | ||
| if [ -e "$target" ]; then | ||
| rm -rf "$target" | ||
| echo "Removed $target" | ||
| else | ||
| echo "Skipped $target (not present)" | ||
| fi | ||
| done |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| #!/usr/bin/env bash | ||
| set -euo pipefail | ||
|
|
||
| ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" | ||
|
|
||
| TARGETS=( | ||
| "$ROOT_DIR/dist" | ||
| "$ROOT_DIR/artifacts" | ||
| "$ROOT_DIR/src-tauri/target" | ||
| "$ROOT_DIR/node_modules/.vite" | ||
| ) | ||
|
|
||
| for target in "${TARGETS[@]}"; do | ||
| if [ -e "$target" ]; then | ||
| rm -rf "$target" | ||
| echo "Removed $target" | ||
| else | ||
| echo "Skipped $target (not present)" | ||
| fi | ||
| done |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,53 @@ | ||
| #!/usr/bin/env bash | ||
| set -euo pipefail | ||
|
|
||
| ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" | ||
| LEAN_CACHE_ROOT="$(mktemp -d "${TMPDIR:-/tmp}/desktop-pet-lean.XXXXXX")" | ||
|
|
||
| export CARGO_TARGET_DIR="$LEAN_CACHE_ROOT/cargo-target" | ||
| export DESKTOPPET_VITE_CACHE_DIR="$LEAN_CACHE_ROOT/vite-cache" | ||
| mkdir -p "$CARGO_TARGET_DIR" "$DESKTOPPET_VITE_CACHE_DIR" | ||
|
|
||
| print_size_report() { | ||
| local label="$1" | ||
| echo | ||
| echo "[$label] Disk usage snapshot" | ||
| for path in \ | ||
| "$ROOT_DIR/node_modules" \ | ||
| "$ROOT_DIR/node_modules/.vite" \ | ||
| "$ROOT_DIR/src-tauri/target" \ | ||
| "$ROOT_DIR/dist" \ | ||
| "$ROOT_DIR/artifacts" \ | ||
| "$CARGO_TARGET_DIR" \ | ||
| "$DESKTOPPET_VITE_CACHE_DIR"; do | ||
| if [ -e "$path" ]; then | ||
| du -sh "$path" | ||
| else | ||
| echo "0B $path (missing)" | ||
| fi | ||
| done | ||
| } | ||
|
|
||
| cleanup() { | ||
| local exit_code=$? | ||
| echo | ||
| echo "lean-dev: cleaning temporary caches" | ||
| rm -rf "$LEAN_CACHE_ROOT" | ||
|
|
||
| if "$ROOT_DIR/scripts/clean-heavy.sh"; then | ||
| true | ||
| else | ||
| echo "lean-dev: warning - heavy cleanup encountered an issue" >&2 | ||
| fi | ||
|
|
||
| print_size_report "After cleanup" | ||
| exit "$exit_code" | ||
| } | ||
| trap cleanup EXIT INT TERM | ||
|
|
||
| print_size_report "Before start" | ||
| echo | ||
|
|
||
| echo "lean-dev: using temporary cache root $LEAN_CACHE_ROOT" | ||
| cd "$ROOT_DIR" | ||
| npm run tauri dev |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The
generated_byfield contains a hardcoded absolute path to a user's local directory. This is not portable and exposes details about the local machine setup. It's better to use just the script name to improve portability and avoid leaking local machine details.