refactor: repo folder structure (#1038)

* refactor(repo): move OpenWork apps into apps and ee layout

Rebase the monorepo layout migration onto the latest dev changes so the moved app, desktop, share, and cloud surfaces keep working from their new paths. Carry the latest deeplink, token persistence, build, Vercel, and docs updates forward to avoid stale references and broken deploy tooling.

* chore(repo): drop generated desktop artifacts

Ignore the moved Tauri target and sidecar paths so local cargo checks do not pollute the branch. Remove the accidentally committed outputs from the repo while keeping the layout migration intact.

* fix(release): drop built server cli artifact

Stop tracking the locally built apps/server/cli binary so generated server outputs do not leak into commits. Also update the release workflow to check the published scoped package name for @openwork/server before deciding whether npm publish is needed.

* fix(workspace): add stable CLI bin wrappers

Point the server and router package bins at committed wrapper scripts so workspace installs can create shims before dist outputs exist. Keep the wrappers compatible with built binaries and source checkouts to avoid Vercel install warnings without changing runtime behavior.
This commit is contained in:
Omar McAdam
2026-03-19 11:41:38 -07:00
committed by GitHub
parent 3738ae47a1
commit 2b91b4d777
638 changed files with 662 additions and 475 deletions

View File

@@ -65,8 +65,8 @@ jobs:
path: | path: |
~/.cargo/registry ~/.cargo/registry
~/.cargo/git ~/.cargo/git
packages/desktop/src-tauri/target apps/desktop/src-tauri/target
key: macos-cargo-${{ hashFiles('packages/desktop/src-tauri/Cargo.lock') }} key: macos-cargo-${{ hashFiles('apps/desktop/src-tauri/Cargo.lock') }}
restore-keys: | restore-keys: |
macos-cargo- macos-cargo-
@@ -75,7 +75,7 @@ jobs:
- name: Create CI Tauri config (no updater artifacts) - name: Create CI Tauri config (no updater artifacts)
run: | run: |
node -e "const fs=require('fs'); const configPath='packages/desktop/src-tauri/tauri.conf.json'; const ciPath='packages/desktop/src-tauri/tauri.conf.alpha.json'; const config=JSON.parse(fs.readFileSync(configPath,'utf8')); config.bundle={...config.bundle, createUpdaterArtifacts:false}; fs.writeFileSync(ciPath, JSON.stringify(config, null, 2));" node -e "const fs=require('fs'); const configPath='apps/desktop/src-tauri/tauri.conf.json'; const ciPath='apps/desktop/src-tauri/tauri.conf.alpha.json'; const config=JSON.parse(fs.readFileSync(configPath,'utf8')); config.bundle={...config.bundle, createUpdaterArtifacts:false}; fs.writeFileSync(ciPath, JSON.stringify(config, null, 2));"
- name: Setup Rust - name: Setup Rust
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@stable
@@ -126,7 +126,7 @@ jobs:
} }
async function main() { async function main() {
const pkg = JSON.parse(fs.readFileSync('./packages/desktop/package.json', 'utf8')); const pkg = JSON.parse(fs.readFileSync('./apps/desktop/package.json', 'utf8'));
const configuredRaw = (process.env.OPENCODE_VERSION || pkg.opencodeVersion || '').toString().trim(); const configuredRaw = (process.env.OPENCODE_VERSION || pkg.opencodeVersion || '').toString().trim();
if (configuredRaw && configuredRaw.toLowerCase() !== 'latest') { if (configuredRaw && configuredRaw.toLowerCase() !== 'latest') {
const resolved = (configuredRaw.startsWith('v') ? configuredRaw.slice(1) : configuredRaw).trim(); const resolved = (configuredRaw.startsWith('v') ? configuredRaw.slice(1) : configuredRaw).trim();
@@ -172,20 +172,20 @@ jobs:
exit 1 exit 1
fi fi
mkdir -p packages/desktop/src-tauri/sidecars mkdir -p apps/desktop/src-tauri/sidecars
cp "$extract_dir/opencode" "packages/desktop/src-tauri/sidecars/opencode-aarch64-apple-darwin" cp "$extract_dir/opencode" "apps/desktop/src-tauri/sidecars/opencode-aarch64-apple-darwin"
chmod 755 "packages/desktop/src-tauri/sidecars/opencode-aarch64-apple-darwin" chmod 755 "apps/desktop/src-tauri/sidecars/opencode-aarch64-apple-darwin"
- name: Build alpha desktop app - name: Build alpha desktop app
run: pnpm --filter @different-ai/openwork exec tauri build --config src-tauri/tauri.conf.alpha.json --target aarch64-apple-darwin --bundles dmg,app run: pnpm --filter @openwork/desktop exec tauri build --config src-tauri/tauri.conf.alpha.json --target aarch64-apple-darwin --bundles dmg,app
- name: Upload alpha artifact bundle - name: Upload alpha artifact bundle
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: openwork-alpha-macos-aarch64-${{ github.sha }} name: openwork-alpha-macos-aarch64-${{ github.sha }}
path: | path: |
packages/desktop/src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/*.dmg apps/desktop/src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/*.dmg
packages/desktop/src-tauri/target/aarch64-apple-darwin/release/bundle/macos/*.app.tar.gz apps/desktop/src-tauri/target/aarch64-apple-darwin/release/bundle/macos/*.app.tar.gz
packages/desktop/src-tauri/target/aarch64-apple-darwin/release/bundle/macos/*.app.tar.gz.sig apps/desktop/src-tauri/target/aarch64-apple-darwin/release/bundle/macos/*.app.tar.gz.sig
if-no-files-found: error if-no-files-found: error
retention-days: 14 retention-days: 14

View File

@@ -64,7 +64,7 @@ jobs:
- name: Create CI Tauri config (no updater artifacts) - name: Create CI Tauri config (no updater artifacts)
run: | run: |
node -e "const fs=require('fs'); const configPath='packages/desktop/src-tauri/tauri.conf.json'; const ciPath='packages/desktop/src-tauri/tauri.conf.ci.json'; const config=JSON.parse(fs.readFileSync(configPath,'utf8')); config.bundle={...config.bundle, createUpdaterArtifacts:false}; fs.writeFileSync(ciPath, JSON.stringify(config, null, 2));" node -e "const fs=require('fs'); const configPath='apps/desktop/src-tauri/tauri.conf.json'; const ciPath='apps/desktop/src-tauri/tauri.conf.ci.json'; const config=JSON.parse(fs.readFileSync(configPath,'utf8')); config.bundle={...config.bundle, createUpdaterArtifacts:false}; fs.writeFileSync(ciPath, JSON.stringify(config, null, 2));"
- name: Download OpenCode sidecar - name: Download OpenCode sidecar
shell: bash shell: bash
@@ -79,7 +79,7 @@ jobs:
version="${OPENCODE_VERSION:-}" version="${OPENCODE_VERSION:-}"
if [ -z "$version" ]; then if [ -z "$version" ]; then
version="$(node -p "require('./packages/desktop/package.json').opencodeVersion || ''" 2>/dev/null || true)" version="$(node -p "require('./apps/desktop/package.json').opencodeVersion || ''" 2>/dev/null || true)"
fi fi
version="$(echo "$version" | tr -d '\r\n' | sed 's/^v//')" version="$(echo "$version" | tr -d '\r\n' | sed 's/^v//')"
@@ -133,15 +133,15 @@ jobs:
fi fi
target_name="opencode-x86_64-unknown-linux-gnu" target_name="opencode-x86_64-unknown-linux-gnu"
mkdir -p packages/desktop/src-tauri/sidecars mkdir -p apps/desktop/src-tauri/sidecars
cp "$bin_path" "packages/desktop/src-tauri/sidecars/${target_name}" cp "$bin_path" "apps/desktop/src-tauri/sidecars/${target_name}"
chmod 755 "packages/desktop/src-tauri/sidecars/${target_name}" chmod 755 "apps/desktop/src-tauri/sidecars/${target_name}"
- name: Prepare desktop sidecars - name: Prepare desktop sidecars
run: pnpm -C packages/desktop prepare:sidecar run: pnpm -C apps/desktop prepare:sidecar
- name: Run Rust tests (engine + sidecar resolution) - name: Run Rust tests (engine + sidecar resolution)
run: cargo test --manifest-path packages/desktop/src-tauri/Cargo.toml --locked run: cargo test --manifest-path apps/desktop/src-tauri/Cargo.toml --locked
- name: Build desktop app - name: Build desktop app
run: pnpm --filter @different-ai/openwork exec tauri build --config src-tauri/tauri.conf.ci.json --target x86_64-unknown-linux-gnu --bundles deb run: pnpm --filter @openwork/desktop exec tauri build --config src-tauri/tauri.conf.ci.json --target x86_64-unknown-linux-gnu --bundles deb

View File

@@ -47,7 +47,7 @@ jobs:
version="${OPENCODE_VERSION:-}" version="${OPENCODE_VERSION:-}"
if [ -z "$version" ]; then if [ -z "$version" ]; then
version="$(node -p "require('./packages/desktop/package.json').opencodeVersion || ''" 2>/dev/null || true)" version="$(node -p "require('./apps/desktop/package.json').opencodeVersion || ''" 2>/dev/null || true)"
fi fi
version="$(echo "$version" | tr -d '\r\n' | sed 's/^v//')" version="$(echo "$version" | tr -d '\r\n' | sed 's/^v//')"
@@ -140,4 +140,4 @@ jobs:
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
- name: Run e2e tests - name: Run e2e tests
run: pnpm --filter @different-ai/openwork-ui test:e2e run: pnpm --filter @openwork/app test:e2e

View File

@@ -34,7 +34,7 @@ jobs:
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
- name: Build web - name: Build web
run: pnpm --filter @different-ai/openwork-web build run: pnpm --filter @openwork-ee/den-web build
build-den: build-den:
name: Build Den service name: Build Den service
@@ -58,7 +58,7 @@ jobs:
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
- name: Build den service - name: Build den service
run: pnpm --filter @openwork/den build run: pnpm --filter @openwork-ee/den-controller build
build-orchestrator-binary: build-orchestrator-binary:
name: Build openwork orchestrator binary name: Build openwork orchestrator binary
@@ -94,5 +94,5 @@ jobs:
- name: Validate compiled binary - name: Validate compiled binary
run: | run: |
./packages/orchestrator/dist/bin/openwork --version ./apps/orchestrator/dist/bin/openwork --version
./packages/orchestrator/dist/bin/openwork --help >/dev/null ./apps/orchestrator/dist/bin/openwork --help >/dev/null

View File

@@ -216,7 +216,7 @@ jobs:
} }
async function main() { async function main() {
const pkg = JSON.parse(fs.readFileSync('./packages/desktop/package.json', 'utf8')); const pkg = JSON.parse(fs.readFileSync('./apps/desktop/package.json', 'utf8'));
const configuredRaw = (process.env.OPENCODE_VERSION || pkg.opencodeVersion || '').toString().trim(); const configuredRaw = (process.env.OPENCODE_VERSION || pkg.opencodeVersion || '').toString().trim();
if (configuredRaw && configuredRaw.toLowerCase() !== 'latest') { if (configuredRaw && configuredRaw.toLowerCase() !== 'latest') {
const normalized = configuredRaw.startsWith('v') ? configuredRaw.slice(1) : configuredRaw; const normalized = configuredRaw.startsWith('v') ? configuredRaw.slice(1) : configuredRaw;
@@ -305,9 +305,9 @@ jobs:
target_name="${target_name}.exe" target_name="${target_name}.exe"
fi fi
mkdir -p packages/desktop/src-tauri/sidecars mkdir -p apps/desktop/src-tauri/sidecars
cp "$bin_path" "packages/desktop/src-tauri/sidecars/${target_name}" cp "$bin_path" "apps/desktop/src-tauri/sidecars/${target_name}"
chmod 755 "packages/desktop/src-tauri/sidecars/${target_name}" chmod 755 "apps/desktop/src-tauri/sidecars/${target_name}"
- name: Write notary API key - name: Write notary API key
if: matrix.os_type == 'macos' && env.MACOS_NOTARIZE == 'true' if: matrix.os_type == 'macos' && env.MACOS_NOTARIZE == 'true'
@@ -348,7 +348,7 @@ jobs:
releaseBody: ${{ env.RELEASE_BODY }} releaseBody: ${{ env.RELEASE_BODY }}
prerelease: true prerelease: true
releaseDraft: false releaseDraft: false
projectPath: packages/desktop projectPath: apps/desktop
tauriScript: pnpm exec tauri -vvv tauriScript: pnpm exec tauri -vvv
args: ${{ matrix.args }} args: ${{ matrix.args }}
retryAttempts: 3 retryAttempts: 3
@@ -374,7 +374,7 @@ jobs:
releaseBody: ${{ env.RELEASE_BODY }} releaseBody: ${{ env.RELEASE_BODY }}
prerelease: true prerelease: true
releaseDraft: false releaseDraft: false
projectPath: packages/desktop projectPath: apps/desktop
tauriScript: pnpm exec tauri -vvv tauriScript: pnpm exec tauri -vvv
args: ${{ matrix.args }} args: ${{ matrix.args }}
retryAttempts: 3 retryAttempts: 3

View File

@@ -324,8 +324,8 @@ jobs:
path: | path: |
~/.cargo/registry ~/.cargo/registry
~/.cargo/git ~/.cargo/git
packages/desktop/src-tauri/target apps/desktop/src-tauri/target
key: ${{ runner.os }}-cargo-${{ hashFiles('packages/desktop/src-tauri/Cargo.lock') }} key: ${{ runner.os }}-cargo-${{ hashFiles('apps/desktop/src-tauri/Cargo.lock') }}
restore-keys: | restore-keys: |
${{ runner.os }}-cargo- ${{ runner.os }}-cargo-
@@ -405,7 +405,7 @@ jobs:
} }
async function main() { async function main() {
const pkg = JSON.parse(fs.readFileSync('./packages/desktop/package.json', 'utf8')); const pkg = JSON.parse(fs.readFileSync('./apps/desktop/package.json', 'utf8'));
const configuredRaw = (process.env.OPENCODE_VERSION || pkg.opencodeVersion || '').toString().trim(); const configuredRaw = (process.env.OPENCODE_VERSION || pkg.opencodeVersion || '').toString().trim();
if (configuredRaw && configuredRaw.toLowerCase() !== 'latest') { if (configuredRaw && configuredRaw.toLowerCase() !== 'latest') {
const normalized = configuredRaw.startsWith('v') ? configuredRaw.slice(1) : configuredRaw; const normalized = configuredRaw.startsWith('v') ? configuredRaw.slice(1) : configuredRaw;
@@ -495,9 +495,9 @@ jobs:
target_name="${target_name}.exe" target_name="${target_name}.exe"
fi fi
mkdir -p packages/desktop/src-tauri/sidecars mkdir -p apps/desktop/src-tauri/sidecars
cp "$bin_path" "packages/desktop/src-tauri/sidecars/${target_name}" cp "$bin_path" "apps/desktop/src-tauri/sidecars/${target_name}"
chmod 755 "packages/desktop/src-tauri/sidecars/${target_name}" chmod 755 "apps/desktop/src-tauri/sidecars/${target_name}"
- name: Write notary API key - name: Write notary API key
if: matrix.os_type == 'macos' && env.MACOS_NOTARIZE == 'true' if: matrix.os_type == 'macos' && env.MACOS_NOTARIZE == 'true'
@@ -538,7 +538,7 @@ jobs:
releaseBody: ${{ env.RELEASE_BODY }} releaseBody: ${{ env.RELEASE_BODY }}
releaseDraft: ${{ env.RELEASE_DRAFT == 'true' }} releaseDraft: ${{ env.RELEASE_DRAFT == 'true' }}
prerelease: ${{ env.RELEASE_PRERELEASE == 'true' }} prerelease: ${{ env.RELEASE_PRERELEASE == 'true' }}
projectPath: packages/desktop projectPath: apps/desktop
tauriScript: pnpm exec tauri -vvv tauriScript: pnpm exec tauri -vvv
args: ${{ matrix.args }} args: ${{ matrix.args }}
retryAttempts: 3 retryAttempts: 3
@@ -567,7 +567,7 @@ jobs:
releaseBody: ${{ env.RELEASE_BODY }} releaseBody: ${{ env.RELEASE_BODY }}
releaseDraft: ${{ env.RELEASE_DRAFT == 'true' }} releaseDraft: ${{ env.RELEASE_DRAFT == 'true' }}
prerelease: ${{ env.RELEASE_PRERELEASE == 'true' }} prerelease: ${{ env.RELEASE_PRERELEASE == 'true' }}
projectPath: packages/desktop projectPath: apps/desktop
tauriScript: pnpm exec tauri -vvv tauriScript: pnpm exec tauri -vvv
args: ${{ matrix.args }} args: ${{ matrix.args }}
retryAttempts: 3 retryAttempts: 3
@@ -612,7 +612,7 @@ jobs:
if [ ! -f "$manifest_path" ]; then if [ ! -f "$manifest_path" ]; then
echo "ERROR: versions.json missing from app bundle: $manifest_path" >&2 echo "ERROR: versions.json missing from app bundle: $manifest_path" >&2
echo "Hint: ensure packages/desktop/src-tauri/tauri.conf.json bundles sidecars/versions.json" >&2 echo "Hint: ensure apps/desktop/src-tauri/tauri.conf.json bundles sidecars/versions.json" >&2
exit 1 exit 1
fi fi
@@ -701,7 +701,7 @@ jobs:
id: sidecar-versions id: sidecar-versions
shell: bash shell: bash
run: | run: |
node -e "const fs=require('fs'); const orchestrator=JSON.parse(fs.readFileSync('packages/orchestrator/package.json','utf8')); const server=JSON.parse(fs.readFileSync('packages/server/package.json','utf8')); const opencodeRouter=JSON.parse(fs.readFileSync('packages/opencode-router/package.json','utf8')); console.log('orchestrator=' + orchestrator.version); console.log('server=' + server.version); console.log('opencodeRouter=' + opencodeRouter.version);" >> "$GITHUB_OUTPUT" node -e "const fs=require('fs'); const orchestrator=JSON.parse(fs.readFileSync('apps/orchestrator/package.json','utf8')); const server=JSON.parse(fs.readFileSync('apps/server/package.json','utf8')); const opencodeRouter=JSON.parse(fs.readFileSync('apps/opencode-router/package.json','utf8')); console.log('orchestrator=' + orchestrator.version); console.log('server=' + server.version); console.log('opencodeRouter=' + opencodeRouter.version);" >> "$GITHUB_OUTPUT"
- name: Resolve SOURCE_DATE_EPOCH - name: Resolve SOURCE_DATE_EPOCH
id: source-date id: source-date
@@ -753,7 +753,7 @@ jobs:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}
run: | run: |
tag="openwork-orchestrator-v${{ steps.sidecar-versions.outputs.orchestrator }}" tag="openwork-orchestrator-v${{ steps.sidecar-versions.outputs.orchestrator }}"
gh release upload "$tag" packages/orchestrator/dist/sidecars/* --repo "$GITHUB_REPOSITORY" --clobber gh release upload "$tag" apps/orchestrator/dist/sidecars/* --repo "$GITHUB_REPOSITORY" --clobber
publish-npm: publish-npm:
name: Publish npm packages name: Publish npm packages
@@ -810,7 +810,7 @@ jobs:
id: package-versions id: package-versions
shell: bash shell: bash
run: | run: |
node -e "const fs=require('fs'); const orchestrator=JSON.parse(fs.readFileSync('packages/orchestrator/package.json','utf8')); const server=JSON.parse(fs.readFileSync('packages/server/package.json','utf8')); const opencodeRouter=JSON.parse(fs.readFileSync('packages/opencode-router/package.json','utf8')); console.log('orchestrator=' + orchestrator.version); console.log('server=' + server.version); console.log('opencodeRouter=' + opencodeRouter.version);" >> "$GITHUB_OUTPUT" node -e "const fs=require('fs'); const orchestrator=JSON.parse(fs.readFileSync('apps/orchestrator/package.json','utf8')); const server=JSON.parse(fs.readFileSync('apps/server/package.json','utf8')); const opencodeRouter=JSON.parse(fs.readFileSync('apps/opencode-router/package.json','utf8')); console.log('orchestrator=' + orchestrator.version); console.log('server=' + server.version); console.log('opencodeRouter=' + opencodeRouter.version);" >> "$GITHUB_OUTPUT"
- name: Check npm versions - name: Check npm versions
id: npm-versions id: npm-versions
@@ -824,7 +824,7 @@ jobs:
# npm view exits non-zero for packages that don't exist yet (404). # npm view exits non-zero for packages that don't exist yet (404).
# Treat missing packages as "not published" so release can publish them. # Treat missing packages as "not published" so release can publish them.
orchestrator_current="$(npm view openwork-orchestrator version 2>/dev/null || true)" orchestrator_current="$(npm view openwork-orchestrator version 2>/dev/null || true)"
server_current="$(npm view openwork-server version 2>/dev/null || true)" server_current="$(npm view @openwork/server version 2>/dev/null || true)"
opencodeRouter_current="$(npm view opencode-router version 2>/dev/null || true)" opencodeRouter_current="$(npm view opencode-router version 2>/dev/null || true)"
if [ "$orchestrator_current" = "$ORCHESTRATOR_VERSION" ]; then if [ "$orchestrator_current" = "$ORCHESTRATOR_VERSION" ]; then
@@ -876,7 +876,7 @@ jobs:
- name: Publish openwork-server - name: Publish openwork-server
if: steps.npm-auth.outputs.enabled == 'true' && steps.npm-versions.outputs.publish_server == 'true' if: steps.npm-auth.outputs.enabled == 'true' && steps.npm-versions.outputs.publish_server == 'true'
run: pnpm --filter openwork-server publish --access public --no-git-checks run: pnpm --filter @openwork/server publish --access public --no-git-checks
- name: Publish opencode-router - name: Publish opencode-router
if: steps.npm-auth.outputs.enabled == 'true' && steps.npm-versions.outputs.publish_opencodeRouter == 'true' if: steps.npm-auth.outputs.enabled == 'true' && steps.npm-versions.outputs.publish_opencodeRouter == 'true'
@@ -895,7 +895,7 @@ jobs:
exit 1 exit 1
fi fi
pnpm --filter openwork-orchestrator build:bin:all pnpm --filter openwork-orchestrator build:bin:all
node packages/orchestrator/scripts/publish-npm.mjs node apps/orchestrator/scripts/publish-npm.mjs
aur-publish: aur-publish:
name: Publish AUR name: Publish AUR

9
.gitignore vendored
View File

@@ -1,9 +1,15 @@
node_modules/ node_modules/
packages/*/node_modules/ packages/*/node_modules/
apps/*/node_modules/
ee/apps/*/node_modules/
ee/packages/*/node_modules/
.next/ .next/
out/ out/
dist/ dist/
packages/*/dist/ packages/*/dist/
apps/*/dist/
ee/apps/*/dist/
ee/packages/*/dist/
tmp/ tmp/
# Local git worktrees # Local git worktrees
@@ -12,6 +18,8 @@ _worktrees/
# Tauri/Rust # Tauri/Rust
packages/desktop/src-tauri/target/ packages/desktop/src-tauri/target/
packages/desktop/src-tauri/sidecars/ packages/desktop/src-tauri/sidecars/
apps/desktop/src-tauri/target/
apps/desktop/src-tauri/sidecars/
# Env # Env
.env .env
@@ -20,6 +28,7 @@ packages/desktop/src-tauri/sidecars/
# Bun build artifacts # Bun build artifacts
*.bun-build *.bun-build
apps/server/cli
# pnpm store (created by Docker volume mounts) # pnpm store (created by Docker volume mounts)
.pnpm-store/ .pnpm-store/

View File

@@ -4,7 +4,7 @@
set -e set -e
CARGO_TOML="${1:-packages/desktop/src-tauri/Cargo.toml}" CARGO_TOML="${1:-apps/desktop/src-tauri/Cargo.toml}"
echo "🔍 Checking Cargo.lock status for: $CARGO_TOML" echo "🔍 Checking Cargo.lock status for: $CARGO_TOML"

View File

@@ -3,7 +3,7 @@
set -e set -e
CARGO_TOML="${1:-packages/desktop/src-tauri/Cargo.toml}" CARGO_TOML="${1:-apps/desktop/src-tauri/Cargo.toml}"
WORKDIR=$(dirname "$CARGO_TOML") WORKDIR=$(dirname "$CARGO_TOML")
echo "📦 Updating Cargo.lock in: $WORKDIR" echo "📦 Updating Cargo.lock in: $WORKDIR"

View File

@@ -9,7 +9,7 @@ if [ -n "$(git status --porcelain)" ]; then
exit 1 exit 1
fi fi
version=$(node -p "require('./packages/orchestrator/package.json').version") version=$(node -p "require('./apps/orchestrator/package.json').version")
echo "Publishing openwork-orchestrator@$version" echo "Publishing openwork-orchestrator@$version"
pnpm --filter openwork-orchestrator publish --access public pnpm --filter openwork-orchestrator publish --access public

View File

@@ -1,3 +1,11 @@
Copyright (c) 2026-present Different AI, Inc.
Portions of this software are licensed as follows:
* All content that resides under the /ee directory of this repository (Fair Source License) is licensed under the license defined in "ee/LICENSE".
* All third party components incorporated into the OpenWork Software are licensed under the original license provided by the owner of the applicable component.
* Content outside of the above mentioned directories or restrictions above is available under the "MIT" license as defined below.
MIT License MIT License
Copyright (c) 2026 Different AI Copyright (c) 2026 Different AI

View File

@@ -41,7 +41,7 @@ OpenWork is designed around the idea that you can easily ship your agentic workf
- **OpenWork Orchestrator (CLI host)**: run OpenCode + OpenWork server without the desktop UI. - **OpenWork Orchestrator (CLI host)**: run OpenCode + OpenWork server without the desktop UI.
- install: `npm install -g openwork-orchestrator` - install: `npm install -g openwork-orchestrator`
- run: `openwork start --workspace /path/to/workspace --approval auto` - run: `openwork start --workspace /path/to/workspace --approval auto`
- docs: [packages/orchestrator/README.md](./packages/orchestrator/README.md) - docs: [apps/orchestrator/README.md](./apps/orchestrator/README.md)
## Quick start ## Quick start
@@ -110,7 +110,7 @@ pnpm install --frozen-lockfile
which bun which bun
bun --version bun --version
pnpm --filter @different-ai/openwork exec tauri --version pnpm --filter @openwork/desktop exec tauri --version
``` ```
### Install ### Install
@@ -119,7 +119,7 @@ pnpm --filter @different-ai/openwork exec tauri --version
pnpm install pnpm install
``` ```
OpenWork now lives in `packages/app` (UI) and `packages/desktop` (desktop shell). OpenWork now lives in `apps/app` (UI) and `apps/desktop` (desktop shell).
### Run (Desktop) ### Run (Desktop)
@@ -165,7 +165,7 @@ This lets you run agentic workflows, send prompts, and see progress entirely on
The folder picker uses the Tauri dialog plugin. The folder picker uses the Tauri dialog plugin.
Capability permissions are defined in: Capability permissions are defined in:
- `packages/desktop/src-tauri/capabilities/default.json` - `apps/desktop/src-tauri/capabilities/default.json`
## OpenPackage Notes ## OpenPackage Notes
@@ -229,7 +229,7 @@ WEBKIT_DISABLE_COMPOSITING_MODE=1 openwork
- Run `pnpm install` once per checkout, then verify your change with `pnpm typecheck` plus `pnpm test:e2e` (or the targeted subset of scripts) before opening a PR. - Run `pnpm install` once per checkout, then verify your change with `pnpm typecheck` plus `pnpm test:e2e` (or the targeted subset of scripts) before opening a PR.
- Use `.github/pull_request_template.md` when opening PRs and include exact commands, outcomes, manual verification steps, and evidence. - Use `.github/pull_request_template.md` when opening PRs and include exact commands, outcomes, manual verification steps, and evidence.
- If CI fails, classify failures in the PR body as either code-related regressions or external/environment/auth blockers. - If CI fails, classify failures in the PR body as either code-related regressions or external/environment/auth blockers.
- Add new PRDs to `packages/app/pr/<name>.md` following the `.opencode/skills/prd-conventions/SKILL.md` conventions described in `AGENTS.md`. - Add new PRDs to `apps/app/pr/<name>.md` following the `.opencode/skills/prd-conventions/SKILL.md` conventions described in `AGENTS.md`.
Community docs: Community docs:

View File

@@ -1,5 +1,5 @@
{ {
"name": "@different-ai/openwork-ui", "name": "@openwork/app",
"private": true, "private": true,
"version": "0.11.170", "version": "0.11.170",
"type": "module", "type": "module",

View File

Before

Width:  |  Height:  |  Size: 313 KiB

After

Width:  |  Height:  |  Size: 313 KiB

View File

Before

Width:  |  Height:  |  Size: 339 KiB

After

Width:  |  Height:  |  Size: 339 KiB

View File

Before

Width:  |  Height:  |  Size: 301 KiB

After

Width:  |  Height:  |  Size: 301 KiB

View File

Before

Width:  |  Height:  |  Size: 228 KiB

After

Width:  |  Height:  |  Size: 228 KiB

View File

Before

Width:  |  Height:  |  Size: 155 KiB

After

Width:  |  Height:  |  Size: 155 KiB

View File

Before

Width:  |  Height:  |  Size: 267 KiB

After

Width:  |  Height:  |  Size: 267 KiB

View File

Before

Width:  |  Height:  |  Size: 245 KiB

After

Width:  |  Height:  |  Size: 245 KiB

View File

Before

Width:  |  Height:  |  Size: 252 KiB

After

Width:  |  Height:  |  Size: 252 KiB

View File

Before

Width:  |  Height:  |  Size: 257 KiB

After

Width:  |  Height:  |  Size: 257 KiB

View File

Before

Width:  |  Height:  |  Size: 298 KiB

After

Width:  |  Height:  |  Size: 298 KiB

View File

Before

Width:  |  Height:  |  Size: 341 KiB

After

Width:  |  Height:  |  Size: 341 KiB

View File

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 218 KiB

View File

Before

Width:  |  Height:  |  Size: 388 KiB

After

Width:  |  Height:  |  Size: 388 KiB

View File

Before

Width:  |  Height:  |  Size: 407 KiB

After

Width:  |  Height:  |  Size: 407 KiB

View File

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 218 KiB

View File

Before

Width:  |  Height:  |  Size: 318 KiB

After

Width:  |  Height:  |  Size: 318 KiB

View File

Before

Width:  |  Height:  |  Size: 437 KiB

After

Width:  |  Height:  |  Size: 437 KiB

View File

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 168 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 93 KiB

View File

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View File

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View File

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

View File

Before

Width:  |  Height:  |  Size: 167 KiB

After

Width:  |  Height:  |  Size: 167 KiB

View File

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 192 KiB

View File

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View File

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 188 KiB

View File

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 147 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 748 B

After

Width:  |  Height:  |  Size: 748 B

Some files were not shown because too many files have changed in this diff Show More