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.
22
.github/workflows/alpha-macos-aarch64.yml
vendored
@@ -65,8 +65,8 @@ jobs:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
~/.cargo/git
|
||||
packages/desktop/src-tauri/target
|
||||
key: macos-cargo-${{ hashFiles('packages/desktop/src-tauri/Cargo.lock') }}
|
||||
apps/desktop/src-tauri/target
|
||||
key: macos-cargo-${{ hashFiles('apps/desktop/src-tauri/Cargo.lock') }}
|
||||
restore-keys: |
|
||||
macos-cargo-
|
||||
|
||||
@@ -75,7 +75,7 @@ jobs:
|
||||
|
||||
- name: Create CI Tauri config (no updater artifacts)
|
||||
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
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
@@ -126,7 +126,7 @@ jobs:
|
||||
}
|
||||
|
||||
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();
|
||||
if (configuredRaw && configuredRaw.toLowerCase() !== 'latest') {
|
||||
const resolved = (configuredRaw.startsWith('v') ? configuredRaw.slice(1) : configuredRaw).trim();
|
||||
@@ -172,20 +172,20 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p packages/desktop/src-tauri/sidecars
|
||||
cp "$extract_dir/opencode" "packages/desktop/src-tauri/sidecars/opencode-aarch64-apple-darwin"
|
||||
chmod 755 "packages/desktop/src-tauri/sidecars/opencode-aarch64-apple-darwin"
|
||||
mkdir -p apps/desktop/src-tauri/sidecars
|
||||
cp "$extract_dir/opencode" "apps/desktop/src-tauri/sidecars/opencode-aarch64-apple-darwin"
|
||||
chmod 755 "apps/desktop/src-tauri/sidecars/opencode-aarch64-apple-darwin"
|
||||
|
||||
- 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
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: openwork-alpha-macos-aarch64-${{ github.sha }}
|
||||
path: |
|
||||
packages/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
|
||||
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/dmg/*.dmg
|
||||
apps/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.sig
|
||||
if-no-files-found: error
|
||||
retention-days: 14
|
||||
|
||||
16
.github/workflows/build-desktop.yml
vendored
@@ -64,7 +64,7 @@ jobs:
|
||||
|
||||
- name: Create CI Tauri config (no updater artifacts)
|
||||
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
|
||||
shell: bash
|
||||
@@ -79,7 +79,7 @@ jobs:
|
||||
version="${OPENCODE_VERSION:-}"
|
||||
|
||||
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
|
||||
|
||||
version="$(echo "$version" | tr -d '\r\n' | sed 's/^v//')"
|
||||
@@ -133,15 +133,15 @@ jobs:
|
||||
fi
|
||||
|
||||
target_name="opencode-x86_64-unknown-linux-gnu"
|
||||
mkdir -p packages/desktop/src-tauri/sidecars
|
||||
cp "$bin_path" "packages/desktop/src-tauri/sidecars/${target_name}"
|
||||
chmod 755 "packages/desktop/src-tauri/sidecars/${target_name}"
|
||||
mkdir -p apps/desktop/src-tauri/sidecars
|
||||
cp "$bin_path" "apps/desktop/src-tauri/sidecars/${target_name}"
|
||||
chmod 755 "apps/desktop/src-tauri/sidecars/${target_name}"
|
||||
|
||||
- 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)
|
||||
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
|
||||
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
|
||||
|
||||
4
.github/workflows/ci-tests.yml
vendored
@@ -47,7 +47,7 @@ jobs:
|
||||
version="${OPENCODE_VERSION:-}"
|
||||
|
||||
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
|
||||
|
||||
version="$(echo "$version" | tr -d '\r\n' | sed 's/^v//')"
|
||||
@@ -140,4 +140,4 @@ jobs:
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Run e2e tests
|
||||
run: pnpm --filter @different-ai/openwork-ui test:e2e
|
||||
run: pnpm --filter @openwork/app test:e2e
|
||||
|
||||
8
.github/workflows/ci.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build web
|
||||
run: pnpm --filter @different-ai/openwork-web build
|
||||
run: pnpm --filter @openwork-ee/den-web build
|
||||
|
||||
build-den:
|
||||
name: Build Den service
|
||||
@@ -58,7 +58,7 @@ jobs:
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build den service
|
||||
run: pnpm --filter @openwork/den build
|
||||
run: pnpm --filter @openwork-ee/den-controller build
|
||||
|
||||
build-orchestrator-binary:
|
||||
name: Build openwork orchestrator binary
|
||||
@@ -94,5 +94,5 @@ jobs:
|
||||
|
||||
- name: Validate compiled binary
|
||||
run: |
|
||||
./packages/orchestrator/dist/bin/openwork --version
|
||||
./packages/orchestrator/dist/bin/openwork --help >/dev/null
|
||||
./apps/orchestrator/dist/bin/openwork --version
|
||||
./apps/orchestrator/dist/bin/openwork --help >/dev/null
|
||||
|
||||
12
.github/workflows/prerelease.yml
vendored
@@ -216,7 +216,7 @@ jobs:
|
||||
}
|
||||
|
||||
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();
|
||||
if (configuredRaw && configuredRaw.toLowerCase() !== 'latest') {
|
||||
const normalized = configuredRaw.startsWith('v') ? configuredRaw.slice(1) : configuredRaw;
|
||||
@@ -305,9 +305,9 @@ jobs:
|
||||
target_name="${target_name}.exe"
|
||||
fi
|
||||
|
||||
mkdir -p packages/desktop/src-tauri/sidecars
|
||||
cp "$bin_path" "packages/desktop/src-tauri/sidecars/${target_name}"
|
||||
chmod 755 "packages/desktop/src-tauri/sidecars/${target_name}"
|
||||
mkdir -p apps/desktop/src-tauri/sidecars
|
||||
cp "$bin_path" "apps/desktop/src-tauri/sidecars/${target_name}"
|
||||
chmod 755 "apps/desktop/src-tauri/sidecars/${target_name}"
|
||||
|
||||
- name: Write notary API key
|
||||
if: matrix.os_type == 'macos' && env.MACOS_NOTARIZE == 'true'
|
||||
@@ -348,7 +348,7 @@ jobs:
|
||||
releaseBody: ${{ env.RELEASE_BODY }}
|
||||
prerelease: true
|
||||
releaseDraft: false
|
||||
projectPath: packages/desktop
|
||||
projectPath: apps/desktop
|
||||
tauriScript: pnpm exec tauri -vvv
|
||||
args: ${{ matrix.args }}
|
||||
retryAttempts: 3
|
||||
@@ -374,7 +374,7 @@ jobs:
|
||||
releaseBody: ${{ env.RELEASE_BODY }}
|
||||
prerelease: true
|
||||
releaseDraft: false
|
||||
projectPath: packages/desktop
|
||||
projectPath: apps/desktop
|
||||
tauriScript: pnpm exec tauri -vvv
|
||||
args: ${{ matrix.args }}
|
||||
retryAttempts: 3
|
||||
|
||||
30
.github/workflows/release-macos-aarch64.yml
vendored
@@ -324,8 +324,8 @@ jobs:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
~/.cargo/git
|
||||
packages/desktop/src-tauri/target
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('packages/desktop/src-tauri/Cargo.lock') }}
|
||||
apps/desktop/src-tauri/target
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('apps/desktop/src-tauri/Cargo.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cargo-
|
||||
|
||||
@@ -405,7 +405,7 @@ jobs:
|
||||
}
|
||||
|
||||
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();
|
||||
if (configuredRaw && configuredRaw.toLowerCase() !== 'latest') {
|
||||
const normalized = configuredRaw.startsWith('v') ? configuredRaw.slice(1) : configuredRaw;
|
||||
@@ -495,9 +495,9 @@ jobs:
|
||||
target_name="${target_name}.exe"
|
||||
fi
|
||||
|
||||
mkdir -p packages/desktop/src-tauri/sidecars
|
||||
cp "$bin_path" "packages/desktop/src-tauri/sidecars/${target_name}"
|
||||
chmod 755 "packages/desktop/src-tauri/sidecars/${target_name}"
|
||||
mkdir -p apps/desktop/src-tauri/sidecars
|
||||
cp "$bin_path" "apps/desktop/src-tauri/sidecars/${target_name}"
|
||||
chmod 755 "apps/desktop/src-tauri/sidecars/${target_name}"
|
||||
|
||||
- name: Write notary API key
|
||||
if: matrix.os_type == 'macos' && env.MACOS_NOTARIZE == 'true'
|
||||
@@ -538,7 +538,7 @@ jobs:
|
||||
releaseBody: ${{ env.RELEASE_BODY }}
|
||||
releaseDraft: ${{ env.RELEASE_DRAFT == 'true' }}
|
||||
prerelease: ${{ env.RELEASE_PRERELEASE == 'true' }}
|
||||
projectPath: packages/desktop
|
||||
projectPath: apps/desktop
|
||||
tauriScript: pnpm exec tauri -vvv
|
||||
args: ${{ matrix.args }}
|
||||
retryAttempts: 3
|
||||
@@ -567,7 +567,7 @@ jobs:
|
||||
releaseBody: ${{ env.RELEASE_BODY }}
|
||||
releaseDraft: ${{ env.RELEASE_DRAFT == 'true' }}
|
||||
prerelease: ${{ env.RELEASE_PRERELEASE == 'true' }}
|
||||
projectPath: packages/desktop
|
||||
projectPath: apps/desktop
|
||||
tauriScript: pnpm exec tauri -vvv
|
||||
args: ${{ matrix.args }}
|
||||
retryAttempts: 3
|
||||
@@ -612,7 +612,7 @@ jobs:
|
||||
|
||||
if [ ! -f "$manifest_path" ]; then
|
||||
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
|
||||
fi
|
||||
|
||||
@@ -701,7 +701,7 @@ jobs:
|
||||
id: sidecar-versions
|
||||
shell: bash
|
||||
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
|
||||
id: source-date
|
||||
@@ -753,7 +753,7 @@ jobs:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
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:
|
||||
name: Publish npm packages
|
||||
@@ -810,7 +810,7 @@ jobs:
|
||||
id: package-versions
|
||||
shell: bash
|
||||
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
|
||||
id: npm-versions
|
||||
@@ -824,7 +824,7 @@ jobs:
|
||||
# npm view exits non-zero for packages that don't exist yet (404).
|
||||
# Treat missing packages as "not published" so release can publish them.
|
||||
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)"
|
||||
|
||||
if [ "$orchestrator_current" = "$ORCHESTRATOR_VERSION" ]; then
|
||||
@@ -876,7 +876,7 @@ jobs:
|
||||
|
||||
- name: Publish openwork-server
|
||||
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
|
||||
if: steps.npm-auth.outputs.enabled == 'true' && steps.npm-versions.outputs.publish_opencodeRouter == 'true'
|
||||
@@ -895,7 +895,7 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
pnpm --filter openwork-orchestrator build:bin:all
|
||||
node packages/orchestrator/scripts/publish-npm.mjs
|
||||
node apps/orchestrator/scripts/publish-npm.mjs
|
||||
|
||||
aur-publish:
|
||||
name: Publish AUR
|
||||
|
||||
9
.gitignore
vendored
@@ -1,9 +1,15 @@
|
||||
node_modules/
|
||||
packages/*/node_modules/
|
||||
apps/*/node_modules/
|
||||
ee/apps/*/node_modules/
|
||||
ee/packages/*/node_modules/
|
||||
.next/
|
||||
out/
|
||||
dist/
|
||||
packages/*/dist/
|
||||
apps/*/dist/
|
||||
ee/apps/*/dist/
|
||||
ee/packages/*/dist/
|
||||
tmp/
|
||||
|
||||
# Local git worktrees
|
||||
@@ -12,6 +18,8 @@ _worktrees/
|
||||
# Tauri/Rust
|
||||
packages/desktop/src-tauri/target/
|
||||
packages/desktop/src-tauri/sidecars/
|
||||
apps/desktop/src-tauri/target/
|
||||
apps/desktop/src-tauri/sidecars/
|
||||
|
||||
# Env
|
||||
.env
|
||||
@@ -20,6 +28,7 @@ packages/desktop/src-tauri/sidecars/
|
||||
|
||||
# Bun build artifacts
|
||||
*.bun-build
|
||||
apps/server/cli
|
||||
|
||||
# pnpm store (created by Docker volume mounts)
|
||||
.pnpm-store/
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
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"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
set -e
|
||||
|
||||
CARGO_TOML="${1:-packages/desktop/src-tauri/Cargo.toml}"
|
||||
CARGO_TOML="${1:-apps/desktop/src-tauri/Cargo.toml}"
|
||||
WORKDIR=$(dirname "$CARGO_TOML")
|
||||
|
||||
echo "📦 Updating Cargo.lock in: $WORKDIR"
|
||||
|
||||
@@ -9,7 +9,7 @@ if [ -n "$(git status --porcelain)" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
version=$(node -p "require('./packages/orchestrator/package.json').version")
|
||||
version=$(node -p "require('./apps/orchestrator/package.json').version")
|
||||
echo "Publishing openwork-orchestrator@$version"
|
||||
|
||||
pnpm --filter openwork-orchestrator publish --access public
|
||||
|
||||
8
LICENSE
@@ -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
|
||||
|
||||
Copyright (c) 2026 Different AI
|
||||
|
||||
10
README.md
@@ -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.
|
||||
- install: `npm install -g openwork-orchestrator`
|
||||
- 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
|
||||
|
||||
@@ -110,7 +110,7 @@ pnpm install --frozen-lockfile
|
||||
|
||||
which bun
|
||||
bun --version
|
||||
pnpm --filter @different-ai/openwork exec tauri --version
|
||||
pnpm --filter @openwork/desktop exec tauri --version
|
||||
```
|
||||
|
||||
### Install
|
||||
@@ -119,7 +119,7 @@ pnpm --filter @different-ai/openwork exec tauri --version
|
||||
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)
|
||||
|
||||
@@ -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.
|
||||
Capability permissions are defined in:
|
||||
|
||||
- `packages/desktop/src-tauri/capabilities/default.json`
|
||||
- `apps/desktop/src-tauri/capabilities/default.json`
|
||||
|
||||
## 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.
|
||||
- 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.
|
||||
- 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:
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "@different-ai/openwork-ui",
|
||||
"name": "@openwork/app",
|
||||
"private": true,
|
||||
"version": "0.11.170",
|
||||
"type": "module",
|
||||
|
Before Width: | Height: | Size: 313 KiB After Width: | Height: | Size: 313 KiB |
|
Before Width: | Height: | Size: 339 KiB After Width: | Height: | Size: 339 KiB |
|
Before Width: | Height: | Size: 301 KiB After Width: | Height: | Size: 301 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 228 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 267 KiB After Width: | Height: | Size: 267 KiB |
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 245 KiB |
|
Before Width: | Height: | Size: 252 KiB After Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 257 KiB After Width: | Height: | Size: 257 KiB |
|
Before Width: | Height: | Size: 298 KiB After Width: | Height: | Size: 298 KiB |
|
Before Width: | Height: | Size: 341 KiB After Width: | Height: | Size: 341 KiB |
|
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 388 KiB After Width: | Height: | Size: 388 KiB |
|
Before Width: | Height: | Size: 407 KiB After Width: | Height: | Size: 407 KiB |
|
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 318 KiB After Width: | Height: | Size: 318 KiB |
|
Before Width: | Height: | Size: 378 KiB After Width: | Height: | Size: 378 KiB |
|
Before Width: | Height: | Size: 437 KiB After Width: | Height: | Size: 437 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 780 KiB After Width: | Height: | Size: 780 KiB |
|
Before Width: | Height: | Size: 356 KiB After Width: | Height: | Size: 356 KiB |
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 440 KiB After Width: | Height: | Size: 440 KiB |
|
Before Width: | Height: | Size: 447 KiB After Width: | Height: | Size: 447 KiB |
|
Before Width: | Height: | Size: 437 KiB After Width: | Height: | Size: 437 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 313 KiB After Width: | Height: | Size: 313 KiB |
|
Before Width: | Height: | Size: 264 KiB After Width: | Height: | Size: 264 KiB |
|
Before Width: | Height: | Size: 244 KiB After Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 748 B After Width: | Height: | Size: 748 B |