Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
159 commits
Select commit Hold shift + click to select a range
5f71940
docs(06-cli-parity): refresh phase plans with acceptance criteria
rubenlr May 31, 2026
2d4d35a
docs(06-cli-parity): revision — VALIDATION, golden vectors, CLI-03 bo…
rubenlr May 31, 2026
81e81ae
feat(06-01): add repo_priority module with section_sort and flat_tray…
rubenlr May 31, 2026
69c4388
test(06-01): add repo_priority_test.rs — port sort.test.ts golden tie…
rubenlr May 31, 2026
c3f830a
docs(06-01): complete repo_priority plan — section_sort + 11 golden-v…
rubenlr May 31, 2026
602426a
chore: merge executor worktree (worktree-agent-a57f5b293d2c3dcaf)
rubenlr May 31, 2026
4fa85bf
feat(06-02): add repo_fuzzy module — direct port of fuzzy.ts
rubenlr May 31, 2026
ac3845a
test(06-02): add repo_fuzzy_test.rs — golden vectors from fuzzy.test.ts
rubenlr May 31, 2026
e7a7aa1
docs(06-02): complete repo_fuzzy plan — fuzzy.ts ported, golden vecto…
rubenlr May 31, 2026
30012ef
docs(phase-06): update tracking after wave 1
rubenlr May 31, 2026
7811278
feat(06-03): add list_display module with priority formatter
rubenlr May 31, 2026
bd19038
feat(06-03): add workpot list top-level command (CLI-01)
rubenlr May 31, 2026
770d1f8
docs(06-03): complete workpot list plan — SUMMARY.md
rubenlr May 31, 2026
d798b6a
Merge branch 'worktree-agent-ac2e29f83bced1cb1' into feat/06-cli-parity
rubenlr May 31, 2026
32ec3c3
feat(06-05): move launch logic to workpot-core shared service
rubenlr May 31, 2026
7ebac32
feat(06-05): add workpot open command using shared core launch
rubenlr May 31, 2026
ebb140d
docs(06-05): complete open command plan — SUMMARY.md
rubenlr May 31, 2026
419ee39
docs(06-05): add self-check result to SUMMARY.md
rubenlr May 31, 2026
48b857d
docs(phase-06): update tracking after wave 2
rubenlr May 31, 2026
5d8ea54
feat(06-04): add workpot search command with fuzzy filter + priority …
rubenlr May 31, 2026
e633a9f
test(06-04): add cli_smoke search integration tests
rubenlr May 31, 2026
5c878e5
docs(06-04): complete search command plan — SUMMARY.md
rubenlr May 31, 2026
8983d75
docs(phase-06): update tracking after wave 3
rubenlr May 31, 2026
e990fb4
docs(06): add code review report
rubenlr May 31, 2026
47182a0
docs(phase-06): complete phase execution
rubenlr May 31, 2026
7bc4cdb
docs(phase-06): evolve PROJECT.md after phase completion
rubenlr May 31, 2026
a545803
fix(06): count fuzzy query length in Unicode scalars
rubenlr May 31, 2026
c468863
fix(06): delegate CLI list ordering to repo_priority
rubenlr May 31, 2026
b1ddbf4
fix(06): simplify cursor resolve and reap launch child
rubenlr May 31, 2026
67d5888
fix(06): route launch failures through main exit code 2
rubenlr May 31, 2026
5360418
docs(06): code review fix report and post-fix re-review
rubenlr May 31, 2026
bc0c8c7
fix(06): delegate tag validation to core normalize_tag
rubenlr May 31, 2026
32ee864
docs(06): clean code review after info-level fixes
rubenlr May 31, 2026
1613165
test(06): complete UAT - 5 passed, 0 issues
rubenlr May 31, 2026
642a0c1
docs(06): mark phase complete in roadmap
rubenlr May 31, 2026
5e2f758
docs(phase-06): add security threat verification
rubenlr May 31, 2026
bd6fde8
docs(phase-06): mark Nyquist validation compliant
rubenlr May 31, 2026
2c40271
docs: defer phase 7 (Recipes) to backlog 999.1
rubenlr May 31, 2026
6b1fc70
docs(06.2): research tray ux polish
rubenlr May 31, 2026
3b34738
docs(phase-06.2): add validation strategy
rubenlr May 31, 2026
5e168f6
docs(06.1): capture phase context
rubenlr May 31, 2026
c80c7c4
docs(state): record phase 06.1 context session
rubenlr May 31, 2026
7d39911
feat(06.1-01): enforce aarch64 release artifact contract
rubenlr May 31, 2026
c66477b
feat(06.1-01): add signing-aware DMG release policy
rubenlr May 31, 2026
16b0035
feat(06.1-01): align smoke checks with release artifact contract
rubenlr May 31, 2026
79916f1
fix(06.1-01): whitelist smoke artifacts by exact filename
rubenlr May 31, 2026
6940421
docs(06.1-01): complete release artifact contract plan
rubenlr May 31, 2026
558bc5b
feat(06.1-03): add latest-release install script
rubenlr May 31, 2026
9736e66
test(06.1-02): add failing updater contract smoke tests
rubenlr May 31, 2026
b6004ca
feat(06.1-02): implement update command with exit taxonomy
rubenlr May 31, 2026
718e93f
refactor(06.1-02): split updater into staged internals
rubenlr May 31, 2026
0acded3
docs(06.1-02): complete workpot update tdd plan
rubenlr May 31, 2026
aed09de
test(06.1-03): add installer smoke coverage
rubenlr May 31, 2026
5a0288b
docs(06.1-03): add end-user install guide
rubenlr May 31, 2026
542a929
docs(06.1-03): complete installer and docs plan
rubenlr May 31, 2026
4ee72e9
test(phase-06.1): add unit and E2E tests from add-tests command
rubenlr May 31, 2026
d38a762
docs(phase-6.1): add security threat verification
rubenlr May 31, 2026
503785f
docs(phase-06.1): mark Nyquist validation compliant
rubenlr May 31, 2026
a778491
docs(06.2): create phase plan — 8 plans across 3 waves for tray UX po…
rubenlr May 31, 2026
b9f6c47
docs(phase-06.2): revise plans to fix checker blockers and warnings
rubenlr May 31, 2026
40efab0
fix(06.2): correct wave numbering to prevent parallel TypeScript comp…
rubenlr May 31, 2026
1125a9e
docs(06.2): create phase plan
rubenlr May 31, 2026
5767d80
test(06.2-01): add failing tests for alias migration 007
rubenlr May 31, 2026
a64345a
feat(06.2-01): migration 007 and RepoRecord.alias in catalog
rubenlr May 31, 2026
49ff05f
test(06.2-01): add failing set_alias and tray DTO tests
rubenlr May 31, 2026
61bf197
feat(06.2-01): set_alias IPC and alias fields on DTOs
rubenlr May 31, 2026
5907820
docs(06.2-01): complete alias schema and DTO pipeline plan
rubenlr May 31, 2026
9252f6d
test(06.2-02): add failing tests for stale-dirty detection
rubenlr May 31, 2026
d27d3b4
test(06.2-03): add failing alias fuzzy match tests
rubenlr May 31, 2026
dff06c0
feat(06.2-03): add alias dual-field scoring to fuzzy_score
rubenlr May 31, 2026
6e1aefc
feat(06.2-02): implement has_stale_dirty stale-dirty policy
rubenlr May 31, 2026
1532cec
docs(06.2-02): complete stale-dirty detection TDD plan
rubenlr May 31, 2026
16ca243
docs(06.2-03): complete alias fuzzy dual-field plan
rubenlr May 31, 2026
90a6d88
docs(06.2-02): note plan metadata commit in SUMMARY
rubenlr May 31, 2026
9b1b945
docs(06.2-03): fix SUMMARY verification note
rubenlr May 31, 2026
61a3858
feat(06.2-05): alias-first list rows, omit bare branch
rubenlr May 31, 2026
85607f1
feat(06.2-05): CLI repo list alias display and open-by-alias
rubenlr May 31, 2026
c5ab406
docs(06.2-05): complete CLI alias display parity plan
rubenlr May 31, 2026
5c5dcca
docs(06.2-05): add plan metadata hash to SUMMARY self-check
rubenlr May 31, 2026
9082057
feat(06.2-04): tray row click model and alias display
rubenlr May 31, 2026
da98d25
feat(06.2-04): tri-state tray icon and stale-dirty policy
rubenlr May 31, 2026
90a73fa
docs(06.2-04): complete tray interaction and icon plan
rubenlr May 31, 2026
7825793
docs(06.2-04): update STATE session notes for plan 04
rubenlr May 31, 2026
dfb10cf
feat(06.2-06): panel-shell borderless curved bottom
rubenlr May 31, 2026
2f5b526
feat(06.2-06): detail header pin toggle and input hardening
rubenlr May 31, 2026
c052c2d
test(06.2-08): add failing RepoListRow interaction stubs
rubenlr May 31, 2026
378809a
docs(06.2-08): complete RepoListRow interaction RED gate plan
rubenlr May 31, 2026
2bdd77b
docs(06.2-06): complete visual polish and input hardening plan
rubenlr May 31, 2026
18637a1
docs(06.2-06): fix SUMMARY metadata hash
rubenlr May 31, 2026
183b2a1
feat(06.2-07): bootstrap Storybook and extract RepoListRow
rubenlr May 31, 2026
1c54e21
feat(06.2-07): add RepoListRow and DetailPane Storybook stories
rubenlr May 31, 2026
73838c5
docs(06.2-07): complete Storybook and RepoListRow plan
rubenlr May 31, 2026
14cf721
test(06.2-09): CLI alias/bare smoke and stale_dirty_dto bridge
rubenlr May 31, 2026
5ae864a
chore(06.2-09): RepoListRow Vitest cleanup between cases
rubenlr May 31, 2026
586d57c
docs(06.2-09): complete automated test coverage plan
rubenlr May 31, 2026
212cc51
docs(06.2-09): note plan metadata commit in SUMMARY
rubenlr May 31, 2026
6cfc6a5
fix(06.2): close verification gaps after phase execution
rubenlr May 31, 2026
c788a89
test(06.2): harden fuzzy search smoke against temp path subsequence
rubenlr May 31, 2026
b5fb8c2
docs(06.2): verification, review, and phase completion tracking
rubenlr May 31, 2026
5307eab
fix(06.2): use config stale_dirty_days on tray refresh fallbacks
rubenlr May 31, 2026
71cbd61
docs(06.2): add code review fix report and mark review clean
rubenlr May 31, 2026
587efcc
test(06.2): complete auto UAT — 11/11 pass, verification 8/8
rubenlr May 31, 2026
2b9524a
test(06.2): complete auto UAT — 11/11 pass, verification 8/8
rubenlr May 31, 2026
10f88cd
Merge branch 'feat/06-cli-parity' of github.com:rubenlr/workpot into …
rubenlr May 31, 2026
8cdbf7c
feat(branch-status): implement branch status features with tests and …
rubenlr Jun 2, 2026
140ebe0
feat(tray): enhance observability and UI components
rubenlr Jun 2, 2026
66bd7c5
docs(07): capture phase context
rubenlr Jun 3, 2026
5a35d07
docs(state): record phase 7 context session
rubenlr Jun 3, 2026
5a2c31d
docs(07): research phase 07 homebrew tap distribution
rubenlr Jun 3, 2026
76074b1
docs(07): create phase plan — Homebrew tap + cask distribution
rubenlr Jun 3, 2026
fee7b1e
docs(07): create phase plan
rubenlr Jun 3, 2026
ff36f5e
chore(07-01): remove update subcommand from CLI (D-12)
rubenlr Jun 3, 2026
388cb2d
feat(07-02): replace binary+dmg jobs with bundle job and add tap-update
rubenlr Jun 3, 2026
95b126b
chore(07-01): remove update-only deps and DMG bundle target (D-12, D-14)
rubenlr Jun 3, 2026
25480d0
feat(07-02): update release-smoke.yml to assert new .tar.gz artifact …
rubenlr Jun 3, 2026
1768808
docs(07-01): complete plan 01 summary — remove update cmd and DMG target
rubenlr Jun 3, 2026
1d6a22c
docs(07-02): complete plan 02 — CI bundle/tap-update/smoke-contract
rubenlr Jun 3, 2026
baf7a21
docs(phase-07): update tracking after wave 1
rubenlr Jun 3, 2026
3e5e096
feat(07-03): delete install scripts, rewrite INSTALL.md to Homebrew-o…
rubenlr Jun 3, 2026
d8b4e19
docs(07-03): update releasing.md to Homebrew pipeline, create distrib…
rubenlr Jun 3, 2026
fa9bd6d
docs(07-03): complete plan 03 summary — install scripts deleted, INST…
rubenlr Jun 3, 2026
8d0b4d4
docs(phase-07): update tracking after wave 2
rubenlr Jun 3, 2026
39b6328
feat(07-04): draft Homebrew cask and tap README
rubenlr Jun 4, 2026
0a381ed
docs(07-04): complete plan summary — tap live, brew tap verified
rubenlr Jun 4, 2026
26fd6f3
docs(phase-07): update tracking after wave 3
rubenlr Jun 4, 2026
4fae926
docs(07): add code review report
rubenlr Jun 4, 2026
e730c2c
docs(07): add phase verification report
rubenlr Jun 4, 2026
46bcc31
docs(phase-07): complete phase execution
rubenlr Jun 4, 2026
57abf7d
fix(07): harden release workflow and bundle identifier
rubenlr Jun 4, 2026
2916365
docs(07): add code review and fix reports
rubenlr Jun 4, 2026
d1b3522
docs(phase-07): add security threat verification
rubenlr Jun 4, 2026
52a2ee8
test(phase-7): add unit and E2E tests from add-tests command
rubenlr Jun 4, 2026
b445926
docs(07): ship phase 07 — PR #7
rubenlr Jun 4, 2026
3e1770d
format
rubenlr Jun 4, 2026
04b0af3
format+
rubenlr Jun 4, 2026
4996738
chore: update CONTRIBUTING.md and justfile for improved CI instructio…
rubenlr Jun 9, 2026
9a09ec0
address sonar issues
rubenlr Jun 9, 2026
5253f53
Co-authored-by: Cursor <cursoragent@cursor.com>
rubenlr Jun 9, 2026
d9386bc
Co-authored-by: Cursor <cursoragent@cursor.com>
rubenlr Jun 9, 2026
59c1c5d
Co-authored-by: Cursor <cursoragent@cursor.com>
rubenlr Jun 9, 2026
3b04bd8
Co-authored-by: Cursor <cursoragent@cursor.com>
rubenlr Jun 9, 2026
7496a24
fmt
rubenlr Jun 9, 2026
e2a857f
Co-authored-by: Cursor <cursoragent@cursor.com>
rubenlr Jun 9, 2026
328bced
feat: add hk project configuration with pre-commit and pre-push hooks
rubenlr Jun 9, 2026
7944d57
style: reformat test files to conform to prettier standards
rubenlr Jun 9, 2026
b7a255e
feat: integrate eslint-plugin-unused-imports for better linting and c…
rubenlr Jun 9, 2026
08eec93
refactor: update release workflow and enhance CLI tests
rubenlr Jun 9, 2026
b7a0787
docs: add rr-test project testing context and philosophy to CLAUDE.md…
rubenlr Jun 9, 2026
f9a8860
chore: update SonarCloud action to use the latest version
rubenlr Jun 9, 2026
9b47a28
chore: enhance coverage exclusion configuration
rubenlr Jun 9, 2026
414c876
test: enhance CLI and Git functionality tests
rubenlr Jun 9, 2026
736456f
test: add comprehensive tests for AppContext functionality
rubenlr Jun 9, 2026
f95b802
feat: enhance justfile and discovery tests
rubenlr Jun 9, 2026
b1fa3d8
test: expand tray keyboard navigation tests
rubenlr Jun 9, 2026
5b994b1
chore: migrate from package-lock.json to pnpm-lock.yaml
rubenlr Jun 9, 2026
2d7e516
chore: update npm CI action to use pnpm
rubenlr Jun 9, 2026
74beea3
chore: transition to pnpm for package management
rubenlr Jun 9, 2026
5f0315b
chore: transition to pnpm for package management
rubenlr Jun 9, 2026
0196360
Merge branch 'feat/06-cli-parity' of github.com:rubenlr/workpot into …
rubenlr Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 0 additions & 15 deletions .github/actions/npm-ci/action.yml

This file was deleted.

16 changes: 16 additions & 0 deletions .github/actions/pnpm-install/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: pnpm install
description: Node toolchain + pnpm cache restore + clean install
inputs:
node-version:
required: true
runs:
using: composite
steps:
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
cache: pnpm
cache-dependency-path: pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
shell: bash
5 changes: 4 additions & 1 deletion .github/ci-assist/sonar-project.properties
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ sonar.sources=crates,src-tauri/src,src
sonar.tests=crates,src-tauri,src
sonar.test.inclusions=**/tests/**,**/*.test.ts,**/*_test.rs

sonar.exclusions=**/target/**,**/node_modules/**,**/.svelte-kit/**,**/build/**,**/src-tauri/gen/**,**/src-tauri/icons/**,**/*.rs.bk,**/src/app.html
sonar.exclusions=**/target/**,**/node_modules/**,**/.svelte-kit/**,**/build/**,**/src-tauri/gen/**,**/src-tauri/icons/**,**/*.rs.bk,**/src/app.html,**/*.stories.svelte,**/src/lib/storybook/**,**/src/lib/components/repoStoryFixtures.ts,**/src/lib/tray/trayPanelStoryFixtures.ts

# Non-testable frontend (types, constants, fixtures, route shells) — sync with scripts/coverage-exclusions.mjs
sonar.coverage.exclusions=**/src/lib/types.ts,**/src/lib/tray/constants.ts,**/src/lib/components/repoStoryFixtures.ts,**/src/lib/tray/trayPanelStoryFixtures.ts,**/src/lib/storybook/**,**/*.stories.svelte,**/src/lib/tray/trayTrace.ts,**/src/routes/+page.svelte,**/src/routes/+layout.svelte,**/src/routes/+layout.ts

sonar.rust.lcov.reportPaths=lcov-rust.info
sonar.javascript.lcov.reportPaths=lcov-js.info
Expand Down
1 change: 0 additions & 1 deletion .github/rulesets/ci.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
{
"type": "pull_request",
"parameters": {
"required_approving_review_count": 1,
"dismiss_stale_reviews_on_push": true,
"require_code_owner_review": true,
"require_last_push_approval": false,
Expand Down
23 changes: 11 additions & 12 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,21 +96,21 @@ jobs:
key: macos-latest
- name: Fetch dependencies (macOS D-12)
run: cargo fetch
- name: Install npm dependencies
uses: ./.github/actions/npm-ci
- name: Install pnpm dependencies
uses: ./.github/actions/pnpm-install
with:
node-version: ${{ env.NODE_VERSION }}
- name: Test
run: cargo test -p workpot-core -p workpot-cli -p workpot-tray --all-targets
- name: Frontend check and test coverage
run: |
npm run format:check
npm run lint:check
npm run check
npm run test:coverage
pnpm run format:check
pnpm run lint:check
pnpm run check
pnpm run test:coverage
cp coverage/lcov.info lcov-js.info
- name: Tauri bundle smoke
run: npm run tauri:build
run: pnpm run tauri:build
env:
CI: true
- name: Upload JS coverage
Expand Down Expand Up @@ -186,17 +186,16 @@ jobs:
lcov -a lcov-core-cli.info -a lcov-tray.info -o lcov-rust.info --ignore-errors empty
test -f lcov-js.info

- name: Install npm dependencies
uses: ./.github/actions/npm-ci
- name: Install pnpm dependencies
uses: ./.github/actions/pnpm-install
with:
node-version: ${{ env.NODE_VERSION }}

- run: npx svelte-kit sync
- run: pnpm exec svelte-kit sync

- name: SonarCloud Scan
uses: SonarSource/sonarcloud-github-action@v5
uses: SonarSource/sonarqube-scan-action@v8
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
with:
args: >
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release-artifacts.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: release-artifacts

# Runs when release-publish (or a maintainer) publishes a GitHub Release — builds
# macOS tarballs and uploads them to that release.
# the macOS aarch64 combined app+CLI tarball and uploads it to that release.

on:
release:
Expand All @@ -12,7 +12,7 @@ permissions:

jobs:
upload:
name: upload release binaries
name: upload release artifacts
permissions:
contents: write
uses: ./.github/workflows/release.yml
Expand Down
33 changes: 32 additions & 1 deletion .github/workflows/release-smoke.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: release-smoke

# PR smoke: full macOS release matrix without creating tags or uploading to GitHub Releases.
# PR smoke: validate the release artifact contract without creating tags or
# uploading to GitHub Releases.

on:
pull_request:
Expand Down Expand Up @@ -28,3 +29,33 @@ jobs:
with:
tag: v0.0.0-smoke
dry_run: true

verify-contract:
name: verify release contract
needs: smoke
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
path: artifacts
pattern: smoke-*
merge-multiple: true

- name: Validate aarch64-only artifact contract
run: |
set -euo pipefail
test -f artifacts/Workpot-0.0.0-smoke-aarch64.tar.gz
test -f artifacts/Workpot-0.0.0-smoke-aarch64.tar.gz.sha256

for artifact in artifacts/*; do
file="$(basename "$artifact")"
case "$file" in
Workpot-0.0.0-smoke-aarch64.tar.gz|\
Workpot-0.0.0-smoke-aarch64.tar.gz.sha256)
;;
*)
echo "unexpected artifact in smoke output: $file" >&2
exit 1
;;
esac
done
120 changes: 91 additions & 29 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: release

# Builds macOS tarballs and uploads them to an existing GitHub Release.
# Builds macOS aarch64 combined Workpot.app+CLI tarball + checksum,
# then uploads to an existing GitHub Release and updates the Homebrew tap.
# Invoked by release-artifacts.yml on release: published, release-smoke (dry_run),
# or manually via workflow_dispatch.
# release-publish.yml creates the GitHub Release and tag on master when version increases.
Expand Down Expand Up @@ -110,21 +111,15 @@ jobs:
fi
echo "version=${tag_version}" >> "$GITHUB_OUTPUT"

binary:
name: macos ${{ matrix.arch }} binary
bundle:
name: macos aarch64 app bundle
needs: [prepare, validate-version]
if: always() && (needs.prepare.outputs.dry_run == 'true' || needs.validate-version.result == 'success')
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- arch: aarch64
artifact: workpot-macos-aarch64
runner: macos-latest
- arch: x86_64
artifact: workpot-macos-x86_64
runner: macos-15-intel
runs-on: macos-latest
env:
# Workspace Cargo target dir is repo-root `target/` (src-tauri is a workspace member).
MACOS_TARGET: aarch64-apple-darwin
BUNDLE_MACOS_DIR: target/aarch64-apple-darwin/release/bundle/macos
steps:
- uses: actions/checkout@v5
with:
Expand All @@ -134,37 +129,58 @@ jobs:
- uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.96
targets: aarch64-apple-darwin

- uses: ./.github/actions/rust-cache
with:
shared-key: release
key: ${{ matrix.arch }}
shared-key: release-bundle
key: aarch64

- name: Build release binary
run: cargo build --release -p workpot-cli
- uses: ./.github/actions/pnpm-install
with:
node-version: 24

- name: Build release CLI binary
run: cargo build --release -p workpot-cli --target "${MACOS_TARGET}"

- name: Build release app bundle
run: |
pnpm run build
pnpm exec tauri build --bundles app --config src-tauri/tauri.ci-build.json --target "${MACOS_TARGET}"

- name: Verify app bundle path
run: test -d "${BUNDLE_MACOS_DIR}/Workpot.app"

- name: Inject CLI binary into app bundle
run: cp "target/${MACOS_TARGET}/release/workpot" "${BUNDLE_MACOS_DIR}/Workpot.app/Contents/MacOS/workpot"

- name: Verify both binaries present
run: |
test -f "${BUNDLE_MACOS_DIR}/Workpot.app/Contents/MacOS/workpot-tray"
test -f "${BUNDLE_MACOS_DIR}/Workpot.app/Contents/MacOS/workpot"

- name: Create release tarball
env:
RELEASE_ARTIFACT: ${{ matrix.artifact }}
RELEASE_TAG: ${{ env.RELEASE_TAG }}
run: |
artifact="$RELEASE_ARTIFACT"
mkdir -p "dist/$artifact"
cp target/release/workpot "dist/$artifact/workpot"
cp README.md LICENSE "dist/$artifact/"
tar -C "dist/$artifact" -czf "$artifact.tar.gz" .
shasum -a 256 "$artifact.tar.gz" > "$artifact.tar.gz.sha256"
set -euo pipefail
version="${RELEASE_TAG#v}"
archive="Workpot-${version}-aarch64.tar.gz"
checksum="${archive}.sha256"
tar -C "${BUNDLE_MACOS_DIR}" -czf "$archive" Workpot.app
shasum -a 256 "$archive" > "$checksum"

- uses: actions/upload-artifact@v4
with:
name: ${{ needs.prepare.outputs.dry_run == 'true' && format('smoke-{0}', matrix.artifact) || matrix.artifact }}
name: ${{ needs.prepare.outputs.dry_run == 'true' && 'smoke-workpot-bundle-aarch64' || 'workpot-bundle-aarch64' }}
path: |
${{ matrix.artifact }}.tar.gz
${{ matrix.artifact }}.tar.gz.sha256
Workpot-*-aarch64.tar.gz
Workpot-*-aarch64.tar.gz.sha256
retention-days: ${{ needs.prepare.outputs.dry_run == 'true' && 7 || 90 }}

github-release:
name: github release
needs: [prepare, binary, validate-version]
needs: [prepare, bundle, validate-version]
if: needs.prepare.outputs.dry_run != 'true'
runs-on: ubuntu-latest
permissions:
Expand All @@ -173,6 +189,7 @@ jobs:
- uses: actions/download-artifact@v4
with:
path: artifacts
pattern: workpot-bundle-*
merge-multiple: true

- name: Upload macOS artifacts to GitHub Release
Expand All @@ -183,3 +200,48 @@ jobs:
set -euo pipefail
gh release upload "$RELEASE_TAG" artifacts/* --clobber
echo "Uploaded artifacts to release ${RELEASE_TAG}"

tap-update:
name: update homebrew tap
needs: [prepare, github-release, validate-version]
if: needs.prepare.outputs.dry_run != 'true'
runs-on: ubuntu-latest
steps:
- name: Compute artifact SHA256 from published release
env:
RELEASE_TAG: ${{ env.RELEASE_TAG }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
version="${RELEASE_TAG#v}"
archive="Workpot-${version}-aarch64.tar.gz"
gh release download "${RELEASE_TAG}" --pattern "${archive}.sha256" --repo rubenlr/workpot
sha256="$(awk '{print $1}' "${archive}.sha256")"
echo "SHA256=${sha256}" >> "$GITHUB_ENV"
echo "VERSION=${version}" >> "$GITHUB_ENV"

- uses: actions/checkout@v5
with:
repository: rubenlr/homebrew-workpot
token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
path: homebrew-workpot

- name: Patch cask version and sha256
working-directory: homebrew-workpot
run: |
set -euo pipefail
sed -i "s/version \".*\"/version \"${VERSION}\"/" Casks/workpot.rb
sed -i "s/sha256 \".*\"/sha256 \"${SHA256}\"/" Casks/workpot.rb
grep -q "version \"${VERSION}\"" Casks/workpot.rb
grep -q "sha256 \"${SHA256}\"" Casks/workpot.rb

- name: Commit and push tap update
working-directory: homebrew-workpot
run: |
set -euo pipefail
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git pull --rebase origin HEAD
git add Casks/workpot.rb
git commit -m "chore: bump workpot to v${VERSION}"
git push
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@
# Tauri CLI generated (regenerated on build; $schema in capabilities/ is IDE-only)
src-tauri/gen/
coverage/
lcov*.info
lcov*.info
*storybook.log
storybook-static
4 changes: 2 additions & 2 deletions .planning/PROJECT.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ You always know which repo you need and can open it in Cursor in seconds, with g

### Validated

- CLI parity: `workpot list`, `workpot search`, `workpot open` with shared core (Phase 6, 2026-05-31)
- Tag, pin, notes, and four-tier tray ordering (Phase 5, 2026-05-31)
- Tray finder MVP with Cursor launch (Phase 4)
- Git state refresh and display (Phase 3)
Expand All @@ -22,7 +23,6 @@ You always know which repo you need and can open it in Cursor in seconds, with g

### Active

- [ ] CLI for power users (search, open, index refresh, recipe trigger)
- [ ] Recipes: reusable action bundles (shell commands, Cursor launch, multi-step workflows)

### Out of Scope
Expand Down Expand Up @@ -81,4 +81,4 @@ This document evolves at phase transitions and milestone boundaries.
4. Update Context with current state

---
*Last updated: 2026-05-31 after Phase 5 completion*
*Last updated: 2026-05-31 after Phase 6 completion*
9 changes: 5 additions & 4 deletions .planning/REQUIREMENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@

### CLI (CLI)

- [ ] **CLI-01**: User can list indexed repositories from the terminal
- [ ] **CLI-02**: User can search and open repositories from the terminal
- [ ] **CLI-03**: CLI and tray show consistent repository data and ordering
- [x] **CLI-01**: User can list indexed repositories from the terminal
- [x] **CLI-02**: User can search and open repositories from the terminal
- [x] **CLI-03**: CLI and tray show consistent repository data and ordering

### Data & Privacy (DATA)

Expand Down Expand Up @@ -98,11 +98,12 @@
| ORG-01..04 | Phase 5 | Pending |
| UI-01..04 | Phase 4 | Pending |
| LAUNCH-01 | Phase 4 | Pending |
| LAUNCH-02..06 | Phase 7 | Pending |
| LAUNCH-02..06 | Backlog 999.1 (Recipes) | Deferred |
| CLI-01..03 | Phase 6 | Pending |
| DATA-01..02 | Phase 1 | Pending |

**Coverage:**

- v1 requirements: 28 total
- Mapped to phases: 28
- Unmapped: 0
Expand Down
Loading
Loading