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: |
|
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
|
||||||
|
|||||||
16
.github/workflows/build-desktop.yml
vendored
@@ -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
|
||||||
|
|||||||
4
.github/workflows/ci-tests.yml
vendored
@@ -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
|
||||||
|
|||||||
8
.github/workflows/ci.yml
vendored
@@ -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
|
||||||
|
|||||||
12
.github/workflows/prerelease.yml
vendored
@@ -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
|
||||||
|
|||||||
30
.github/workflows/release-macos-aarch64.yml
vendored
@@ -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
@@ -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/
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
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
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2026 Different AI
|
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.
|
- **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:
|
||||||
|
|
||||||
|
|||||||
@@ -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",
|
||||||
|
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 |