diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 6a8194eb..bb101d52 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -1,7 +1,8 @@ {"id":"ge-1qd","title":"Track .beads/issues.jsonl in repo to enable bd sync","status":"closed","priority":1,"issue_type":"chore","created_at":"2026-01-03T00:38:09.856060926-08:00","created_by":"rgardler","updated_at":"2026-01-03T01:36:09.196632851-08:00","closed_at":"2026-01-03T01:36:09.196632851-08:00"} {"id":"ge-1x8","title":"Wrap-up: handoff notes and follow-ups (telemetry \u0026 CI)","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-07T01:23:49.255685142-08:00","created_by":"rgardler","updated_at":"2026-01-07T02:20:17.460720304-08:00","closed_at":"2026-01-07T02:20:17.460720304-08:00","close_reason":"Closed","dependencies":[{"issue_id":"ge-1x8","depends_on_id":"ge-hch.1.6","type":"discovered-from","created_at":"2026-01-07T01:23:49.267228872-08:00","created_by":"rgardler"}]} -{"id":"ge-2b0","title":"CI: limit Playwright E2E on main","description":"Playwright E2E currently runs on every push to main. Limit or block these runs on main pushes (e.g., move to PR-only, add path filters, or gate via label) to avoid redundant executions alongside the new GitHub Pages deploy. Capture the chosen policy and update the CI workflow accordingly.","status":"open","priority":2,"issue_type":"task","assignee":"Ship","created_at":"2026-01-08T01:03:53.611971564-08:00","created_by":"rgardler","updated_at":"2026-01-08T01:03:57.806632955-08:00","dependencies":[{"issue_id":"ge-2b0","depends_on_id":"ge-hch.3.3","type":"discovered-from","created_at":"2026-01-08T01:03:53.631932094-08:00","created_by":"rgardler"}],"comments":[{"id":32,"issue_id":"ge-2b0","author":"rgardler","text":"Linked from ge-hch.3.3: user request to prevent Playwright E2E runs on pushes to main. Capture policy (PR-only, paths filter, label gate) and adjust workflow.","created_at":"2026-01-08T09:04:03Z"}]} +{"id":"ge-2b0","title":"CI: limit Playwright E2E on main","description":"Policy decision: Run Playwright E2E on PRs only. Keep a scheduled main run (nightly) and an optional gated run tied to GitHub Pages deploys for post-deploy validation.\\n\\nRationale:\\n- Reduce redundant costly CI runs on push-to-main while keeping safety via PR checks and periodic validation on main.\\n\\nImplementation plan (Ship):\\n1) Update .github/workflows/playwright.yml:\\n - Remove or disable the 'push' trigger for main (or add a path filter) so it no longer runs on every push-to-main.\\n - Ensure it runs on 'pull_request' and 'workflow_dispatch'.\\n - Add a scheduled cron job entry (e.g., nightly) in the workflow or create a separate workflow that runs Playwright on main nightly.\\n - Preserve artifact upload behavior on failure (no change needed unless altered).\\n2) Optionally add a small gated workflow to run Playwright after GitHub Pages deploy (or as part of the gh-pages workflow) if you want post-deploy validation.\\n3) Update docs: add a short note to docs/InkJS_README.md or docs/CI_RUNBOOK.md describing the Playwright policy and how to manually trigger runs.\\n\\nAcceptance criteria (Definition of Done):\\n- Playwright workflow triggers on PRs and no longer triggers on ordinary pushes to main.\\n- Nightly scheduled Playwright run exists and completes (or is configured) for main.\\n- Artifact upload on failure still occurs in PRs and scheduled runs.\\n- A bd comment on this bead documents the branch name used, PR URL (if created), or workflow run IDs demonstrating the new behavior.\\n\\nConstraints / Notes:\\n- Do NOT force-push or rewrite history on main. Create a feature branch (suggested: ge-2b0/playwright-prs-only) and open a PR.\\n- If any unexpected CI gating or GitHub permission issues arise, report back in this bead before proceeding.\\n\\nAssignee: Ship (please implement).\\n,json:true","status":"in_progress","priority":1,"issue_type":"task","assignee":"Ship","created_at":"2026-01-08T01:03:53.611971564-08:00","created_by":"rgardler","updated_at":"2026-01-14T00:28:44.908355173-08:00","dependencies":[{"issue_id":"ge-2b0","depends_on_id":"ge-hch.3.3","type":"discovered-from","created_at":"2026-01-08T01:03:53.631932094-08:00","created_by":"rgardler"}],"comments":[{"id":32,"issue_id":"ge-2b0","author":"rgardler","text":"Linked from ge-hch.3.3: user request to prevent Playwright E2E runs on pushes to main. Capture policy (PR-only, paths filter, label gate) and adjust workflow.","created_at":"2026-01-08T09:04:03Z"},{"id":87,"issue_id":"ge-2b0","author":"rgardler","text":"Blocked: cannot create branch ge-2b0/playwright-prs-only from origin/main because local changes would be overwritten. Git status shows:\\n\\n M .beads/issues.jsonl\\n M AGENTS.md\\n\\nOptions for how to proceed (please choose):\\nA) Stash local changes, create branch from origin/main, implement CI edits, then pop stash (recommended if you want a clean branch from main).\\nB) Create the feature branch from the current branch (ge-rw4/commit-agent-docs) so the agent-doc edits are included; proceed with CI edits on that branch and open PR from it.\\nC) Commit the local changes to the current branch and then create the new branch from origin/main (requires committing or stashing first).\\n\\nPlease reply with A, B, or C (or provide alternate instruction). I will proceed once you confirm.","created_at":"2026-01-14T08:29:22Z"}]} {"id":"ge-2cw","title":"Implement: save/load single-slot","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-05T23:10:10.678709101-08:00","created_by":"rgardler","updated_at":"2026-01-07T02:16:09.173674006-08:00","closed_at":"2026-01-07T02:16:09.173674006-08:00","close_reason":"Closed","dependencies":[{"issue_id":"ge-2cw","depends_on_id":"ge-hch.1.2.2","type":"discovered-from","created_at":"2026-01-05T23:10:10.680548961-08:00","created_by":"rgardler"}],"comments":[{"id":21,"issue_id":"ge-2cw","author":"rgardler","text":"Wrap-up note: session ended; save/load single-slot work remains in_progress. Ensure tests for save/load are included in play-mode test plan (ge-hch.1.7).","created_at":"2026-01-07T09:23:49Z"}]} +{"id":"ge-2hh","title":"P0: Manual test — Save/Load single-slot (manual verification)","description":"## Summary\\nManual verification of single-slot save/load behavior in the InkJS demo (single-slot = one persistent save slot exposed via localStorage or downloadable file). This P0 task captures a manual test plan, acceptance criteria, and reporting instructions so QA (Probe) or the Producer can validate the feature across browsers and environments.\\n\\n## Acceptance criteria (Definition of Done)\\n- A tester can create a save at a non-terminal story point, refresh the page (or open in a new tab), and successfully load the save such that:\\n - The story resumes at the exact same position (same passage/node).\\n - UI state is restored (page text, available choices, and any visual flags e.g., smoke triggered).\\n - Telemetry events for save/load (if present) are emitted or recorded (optional; note in results).\\n - No fatal console errors or uncaught exceptions occur during save or load.\\n- Test recorded in the bead as a bd comment with: environment (browser + version), steps performed, pass/fail result, and any logs/screenshots/artifacts (attach via CI or reference file paths).\\n\\n## Test steps (manual)\\n1. Open the demo locally (recommended): \nadded 666 packages, and audited 667 packages in 7s\n\n168 packages are looking for funding\n run `npm fund` for details\n\nfound 0 vulnerabilities and open http://localhost:3000/demo (or the documented URL). Alternatively open web/demo/index.html served over HTTP.\\n2. Start the stable demo story (web/stories/demo.ink).\\n3. Play to a decision point (choice list visible) or other non-terminal position. Record the current page text and available choices.\\n4. Trigger a manual Save (UI save button or developer console hook) — record timestamp and save payload if available (localStorage key or saved file).\\n5. Refresh the page (hard reload) and select Load (UI or dev hook).\\n6. Verify story resumes at the same position (page text matches recorded text, choices present).\\n7. Verify smoke visual state (if smoke had been triggered before save) restores correctly (smoke running or completed as appropriate).\\n8. Repeat under these variants:\\n - Desktop Chromium (latest stable)\\n - Desktop Firefox (latest stable)\\n - Mobile emulation (Chromium)\\n - Incognito/private window (if localStorage unsupported, note failure mode)\\n - After clearing localStorage (verify save file download/load fallback if implemented)\\n9. Record results and any console errors. If a failure is observed, create a new bd bug bead with this P0 bead and include logs/artifacts.\\n\\n## Test artifacts / files referenced\\n- web/demo/js/inkrunner.js\\n- web/demo/js/smoke.js (smoke state save/load)\\n- web/stories/demo.ink\\n- docs/InkJS_README.md (run instructions)\\n- LocalStorage keys: (inspect window.localStorage for keys used by the runner)\\n- scripts/validate-story.js (optional helper to sanity-check story)\\n\\n## Reporting / Notes\\n- Add a bd comment to this bead with test results, attach any screenshots or logs, and mark status while testing and close this bead with reason when verification completes successfully. If failures exist, leave bead open and create linked bug beads describing reproduction steps.\\n\\n## Suggested assignee\\n- Probe (QA) — adjust if you prefer a different human assignee.\\n\\n,json:true","status":"open","priority":0,"issue_type":"task","assignee":"Probe","created_at":"2026-01-14T00:20:25.087480301-08:00","created_by":"rgardler","updated_at":"2026-01-14T00:20:25.087480301-08:00"} {"id":"ge-2l3","title":"Add root README.md","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T15:07:40.976724877-08:00","created_by":"rgardler","updated_at":"2026-01-06T15:10:16.026352254-08:00","closed_at":"2026-01-06T15:10:16.026352254-08:00","close_reason":"Done"} {"id":"ge-37f","title":"Unit tests: inkrunner core","description":"Jest unit tests for inkrunner core functions: appendText, renderChoices, handleTags, save/load.\\n\\nAcceptance criteria:\\n- Jest tests covering appendText, renderChoices, handleTags, save/load are added under tests/unit.\\n- Tests run locally with npm test and pass.\\n- CI runs these tests and they pass in PR.","status":"closed","priority":1,"issue_type":"task","assignee":"rgardler","created_at":"2026-01-06T23:08:51.310245756-08:00","created_by":"rgardler","updated_at":"2026-01-07T00:05:37.443487481-08:00","closed_at":"2026-01-07T00:05:37.443487481-08:00","close_reason":"Completed","comments":[{"id":4,"issue_id":"ge-37f","author":"rgardler","text":"Added unit tests (tests/unit/inkrunner.test.js), Jest config, Playwright E2E test (tests/demo.telemetry.spec.ts), and small demo runner changes. Local npm test passed (unit + demo). See files changed in commit.","created_at":"2026-01-07T07:30:57Z"},{"id":7,"issue_id":"ge-37f","author":"rgardler","text":"Telemetry flake resolved: smoke.js now emits smoke_state events; telemetry test accepts either running/remaining/duration or smoke events. Stress-run on chromium-touch repeat-each=3 passes. npm test (unit + demo) passing.","created_at":"2026-01-07T07:55:20Z"},{"id":8,"issue_id":"ge-37f","author":"rgardler","text":"Opened PR #96 (Add inkrunner unit tests and stabilize telemetry smoke). Contains jest/jsdom unit tests for inkrunner, smoke.js instrumentation emitting smoke_state events, and telemetry Playwright test stabilization. npm test passes (unit + demo).","created_at":"2026-01-07T07:56:54Z"},{"id":9,"issue_id":"ge-37f","author":"rgardler","text":"Unit tests for inkrunner core verified locally (npm test). Coverage: appendText, renderChoices (click/touch), handleTags (smoke trigger), saveState, loadState. Tests present at tests/unit/inkrunner.test.js; runtime demo e2e also ran (playwright). No code changes made in this session. Closing this bead as completed for the unit test acceptance criteria.","created_at":"2026-01-07T08:01:07Z"},{"id":10,"issue_id":"ge-37f","author":"rgardler","text":"PR #96 merged. All work landed on main. Follow-up bead ge-k3p covers CI for Playwright E2E.","created_at":"2026-01-07T08:04:32Z"}]} {"id":"ge-3tg","title":"Remove Unity artifacts and references","description":"Delete Unity_README and Unity Assets, then audit code/docs to remove lingering Unity references.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T15:15:28.232658132-08:00","created_by":"rgardler","updated_at":"2026-01-06T15:20:38.517179539-08:00","closed_at":"2026-01-06T15:20:38.517179539-08:00","close_reason":"Done"} @@ -112,6 +113,7 @@ {"id":"ge-ngf","title":"CI: Playwright E2E","description":"Add GitHub Actions workflow to run Playwright E2E tests.\\n\\nAcceptance criteria:\\n- Workflow file .github/workflows/playwright.yml runs on PRs and main.\\n- Workflow runs: npm ci, npx playwright install, npm test (demo e2e).\\n- On PR a job runs tests and reports status to PR.","status":"closed","priority":1,"issue_type":"task","assignee":"rgardler","created_at":"2026-01-06T23:08:53.428619454-08:00","created_by":"rgardler","updated_at":"2026-01-07T02:20:17.470750673-08:00","closed_at":"2026-01-07T02:20:17.470750673-08:00","close_reason":"Closed"} {"id":"ge-nzz","title":"Make root README InkJS-only","description":"Remove Unity references from the root README.md and focus it on InkJS/web demo usage and tests.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T15:12:16.621516991-08:00","created_by":"rgardler","updated_at":"2026-01-06T15:13:37.065401561-08:00","closed_at":"2026-01-06T15:13:37.065401561-08:00","close_reason":"Done"} {"id":"ge-osd","title":"Restore original demo story for smoke tests","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-06T22:09:37.056596959-08:00","created_by":"rgardler","updated_at":"2026-01-06T22:10:00.371743266-08:00","closed_at":"2026-01-06T22:10:00.371743266-08:00","close_reason":"Done","comments":[{"id":1,"issue_id":"ge-osd","author":"rgardler","text":"Fixed smoke tests broken by demo story changes by adding web/stories/test.ink (pre-903f044 demo story) and routing /stories/demo.ink to that file in Playwright.\n\nChanges:\n- web/stories/test.ink\n- tests/demo.smoke.spec.ts\n\nCommands:\n- npm test","created_at":"2026-01-07T06:09:54Z"}]} +{"id":"ge-rw4","title":"Commit: agent docs edits and AGENTS.md","description":"Summary:\\nCommit the current agent docs edits and AGENTS.md into a named branch and create a local commit with the provided message. Do NOT push.\\n\\nFiles to commit (from git status):\\n- .opencode/agent/beta.md (deleted)\\n- .opencode/agent/build.md\\n- .opencode/agent/forge.md\\n- .opencode/agent/muse.md\\n- .opencode/agent/patch.md\\n- .opencode/agent/pixel.md\\n- .opencode/agent/probe.md\\n- .opencode/agent/scribbler.md\\n- .opencode/agent/ship.md\\n- AGENTS.md\\n\\nCommit message (use exactly):\\nSimplify","notes":"Committed locally by Ship","status":"closed","priority":1,"issue_type":"task","assignee":"Ship","created_at":"2026-01-14T00:24:11.880651201-08:00","created_by":"rgardler","updated_at":"2026-01-14T00:24:47.769638633-08:00","closed_at":"2026-01-14T00:24:47.769692132-08:00","comments":[{"id":86,"issue_id":"ge-rw4","author":"rgardler","text":"git status --porcelain=1 --untracked-files=all\n\nbranch: ge-rw4/commit-agent-docs\n\nlast commit: 2d3cad9 Simplify agent definitions by moving common items to AGENTS.md. Better default permissions for build.md. Clearer delegation path.\n\nhead: 2d3cad98457e8f9b92b2056080e56c6a359fe6e0\n","created_at":"2026-01-14T08:24:43Z"}]} {"id":"ge-s2q","title":"Implement: web/demo skeleton (InkJS integration)","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-05T23:10:10.569697121-08:00","created_by":"rgardler","updated_at":"2026-01-06T02:46:13.725365368-08:00","closed_at":"2026-01-06T02:46:13.725374498-08:00","dependencies":[{"issue_id":"ge-s2q","depends_on_id":"ge-hch.1.2.2","type":"discovered-from","created_at":"2026-01-05T23:10:10.574207891-08:00","created_by":"rgardler"}]} {"id":"ge-urs","title":"Make all agents have wider default permissions, deny rather than allow","description":"Aborting the work to update agent delegation guidance; closing ge-urs per Producer request.\n\nActions taken:\n- Closed PR #130 and deleted branch ge-urs/complete-agent-perms.\n- Reverted local changes and ensured branch removed.\n\nIf you want to retry a narrower change in the future, create a new bead with explicit scope.\n","status":"closed","priority":0,"issue_type":"task","assignee":"forge","created_at":"2026-01-13T20:20:28.139994108-08:00","created_by":"rgardler","updated_at":"2026-01-13T22:48:07.307196907-08:00","closed_at":"2026-01-13T22:48:07.307204824-08:00","comments":[{"id":83,"issue_id":"ge-urs","author":"rgardler","text":"Rationale:\n- ge-urs was merged but some agent files (e.g., .opencode/agent/patch.md) still have permissive or missing deny-by-default entries. We need a consistent, conservative permission set across all .opencode/agent/*.md files.\n\nScope:\n- Inspect all files under .opencode/agent/*.md and ensure each has a permission block that follows the deny-by-default template (no blanket \"*\": allow for bash). Update patch.md and any other agents missing the template.\n\nAcceptance criteria (Definition of Done):\n1. All files under .opencode/agent/*.md include a permissive/deny-by-default permission section matching the standard template found in .opencode/agent/forge.md.\n2. No file contains a wildcard \"*\": allow for bash or equivalent permissive entries.\n3. Add or update .opencode/agent/PERMISSIONS.md describing the template and a short rationale.\n4. Create scripts/check-agent-permissions.sh that exits non-zero if any .opencode/agent/*.md contains a wildcard allow entry.\n5. Open a PR from branch feature/ge-urs-complete-agent-perms with changes, include bd comment linking the PR, and request review from @forge and @rgardler.\n\nConstraints \u0026 timebox:\n- Timebox: 48 hours. Priority: high.\n- Only edit .opencode/agent/*.md, .opencode/agent/PERMISSIONS.md, and scripts/check-agent-permissions.sh. Do not modify CI workflows or other code without Producer approval.\n\nDeliverables:\n- PR URL (in bd comment) with changes.\n- bd comment on ge-urs noting files changed, commands run, and verification steps.\n\nRelated issues:\n- ge-urs (this issue)\n\nActor: Build\n","created_at":"2026-01-14T06:16:19Z"},{"id":84,"issue_id":"ge-urs","author":"rgardler","text":"Rationale:\n- ge-urs was merged but some agent files (e.g., .opencode/agent/patch.md) still have permissive or missing deny-by-default entries. We need a consistent, conservative permission set across all .opencode/agent/*.md files.\n\nScope:\n- Inspect all files under .opencode/agent/*.md and ensure each has a permission block that follows the deny-by-default template (no blanket \"*\": allow for bash). Update patch.md and any other agents missing the template.\n\nAcceptance criteria (Definition of Done):\n1. All files under .opencode/agent/*.md include a permissive/deny-by-default permission section matching the standard template found in .opencode/agent/forge.md.\n2. No file contains a wildcard \"*\": allow for bash or equivalent permissive entries.\n3. Add or update .opencode/agent/PERMISSIONS.md describing the template and a short rationale.\n4. Create scripts/check-agent-permissions.sh that exits non-zero if any .opencode/agent/*.md contains a wildcard allow entry.\n5. Open a PR from branch feature/ge-urs-complete-agent-perms with changes, include bd comment linking the PR, and request review from @forge and @rgardler.\n\nConstraints \u0026 timebox:\n- Timebox: 48 hours. Priority: high.\n- Only edit .opencode/agent/*.md, .opencode/agent/PERMISSIONS.md, and scripts/check-agent-permissions.sh. Do not modify CI workflows or other code without Producer approval.\n\nDeliverables:\n- PR URL (in bd comment) with changes.\n- bd comment on ge-urs noting files changed, commands run, and verification steps.\n\nRelated issues:\n- ge-urs (this issue)\n\nActor: Build\n","created_at":"2026-01-14T06:16:22Z"},{"id":85,"issue_id":"ge-urs","author":"rgardler","text":"@patch — Please take ownership of completing ge-urs for the agent permission updates.\n\nScope (please implement):\n- Update .opencode/agent/patch.md so its permission block follows the deny-by-default template (see .opencode/agent/forge.md for canonical example).\n- If you find other agents missing the deny-by-default entry, you may update only .opencode/agent/patch.md OR notify Build in this thread if you prefer to update multiple agent files (we can reassign or coordinate).\n\nAcceptance criteria (Definition of Done):\n1. .opencode/agent/patch.md contains a permission block without a wildcard \"*\": allow and follows the template used in forge.md (dangerous commands set to ask, general actions denied unless explicit).\n2. Create or update .opencode/agent/PERMISSIONS.md with a one-paragraph rationale and the template (if it does not already exist).\n3. If you change any files, open a PR from a feature branch (e.g., feature/ge-urs-complete-patch) with the changes and add a bd comment linking the PR. Include files changed in the bd comment.\n4. Reply here with \"Accepted\" and an ETA, or state blockers if you cannot accept.\n\nConstraints \u0026 timebox:\n- Do not edit CI workflows or other unrelated files without Producer approval.\n- Timebox: 48 hours.\n\nActor: Build (requesting)\n","created_at":"2026-01-14T06:19:34Z"}]} {"id":"ge-wdm","title":"refactor(validate-demo): investigate skipped Playwright demo test","status":"open","priority":2,"issue_type":"task","assignee":"probe","created_at":"2026-01-12T00:34:02.866687423-08:00","created_by":"rgardler","updated_at":"2026-01-12T01:40:58.069109467-08:00","labels":["refactor"],"comments":[{"id":66,"issue_id":"ge-wdm","author":"rgardler","text":"Diagnostics (Probe): Playwright demo smoke suite currently fails locally because server is not started; page.goto http://127.0.0.1:4173/demo/ =\u003e ERR_CONNECTION_REFUSED for all tests. Command: npx playwright test tests/demo.smoke.spec.ts --reporter=list. Skip behavior: test 'choice can be selected via tap (touch)' includes test.skip when context lacks hasTouch; in this run hasTouch=true for chromium-touch project so it attempted and failed for same server reason, not skipped. Need to start dev server (e.g., npm run dev or npm run preview) with baseURL 4173 or use webServer in Playwright config. To repro skip, run chromium-desktop only or context with hasTouch=false; otherwise it runs. Next steps: add webServer to config or document pre-req; re-run with server active.","created_at":"2026-01-12T09:46:35Z"}]} diff --git a/.github/workflows/playwright-nightly.yml b/.github/workflows/playwright-nightly.yml new file mode 100644 index 00000000..d6297869 --- /dev/null +++ b/.github/workflows/playwright-nightly.yml @@ -0,0 +1,43 @@ +name: Playwright E2E — nightly + +on: + schedule: + - cron: '0 3 * * *' # daily at 03:00 UTC + workflow_dispatch: + +jobs: + nightly: + runs-on: ubuntu-latest + env: + CI: true + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Install Playwright browsers + run: npx playwright install --with-deps + + - name: Run unit tests + run: npm run test:unit + + - name: Run demo E2E tests + run: npm run test:demo + + - name: Upload Playwright artifacts + if: failure() + uses: actions/upload-artifact@v4 + with: + name: playwright-test-results + path: | + test-results/** + playwright-report/** + if-no-files-found: ignore diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 4f07cfab..1713827d 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -2,8 +2,6 @@ name: Playwright E2E on: workflow_dispatch: - push: - branches: [main] pull_request: jobs: @@ -42,7 +40,8 @@ jobs: if [ -z "$changed_files" ]; then run_tests=true else - non_md=$(printf "%s\n" "$changed_files" | grep -vE '\.md$' || true) + non_md=$(printf "%s +" "$changed_files" | grep -vE '\.md$' || true) if [ -z "$non_md" ]; then run_tests=false else