Skip to content

Commit 3f93309

Browse files
authored
Release v0.16.0 - Web previews with direct page feedback, repository cloning, chat search and more (#443)
## Thanks for contributions - [@pascalandr](https://github.com/pascalandr): [#394](#394), [#397](#397), [#405](#405), [#410](#410), [#411](#411), [#423](#423), [#424](#424), [#425](#425), [#426](#426), [#428](#428), [#436](#436) - [@jollyxenon](https://github.com/jollyxenon): [#381](#381), [#409](#409) - [@OfflinePing](https://github.com/OfflinePing): [#415](#415) ## Highlights - **Web previews create a much tighter fix loop**: Open a live preview from a session, highlight the exact part of the page that needs work, and tell the model what to change right from the webpage. CodeNomad sends that page and element context back into chat so the LLM can act on specific visual feedback instead of vague descriptions. - **Bringing repositories into CodeNomad is much easier**: You can now clone a Git repository directly from the workspace picker, making it faster to start work on a fresh project without leaving the app. - **Searching inside long conversations is finally practical**: Session history search can now find matches across messages, tool output, and related content, helping you jump straight to the part of a conversation you need. - **Sessions are easier to manage at a glance**: Parent sessions now show aggregated token and cost totals across subagents, the message timeline can be hidden when you want more room, and tabs can be reordered. - **Mobile views and narrow screens feel much better**: Prompt controls, message actions, timeline behavior, and other session UI pieces adapt more cleanly when space gets tight. ## What’s Improved - **Smoother workspace startup**: The home screen, empty states, and startup flow are clearer, and returning between active projects and the home view feels more natural. - **More useful browsing and previewing**: Markdown now supports math rendering, web previews are integrated into the session flow, and unrestricted browsing respects the selected workspace root more reliably. - **Cleaner model and agent selection**: Models are grouped by provider, and primary agent selection now follows OpenCode’s visibility rules more closely. - **Better prompt and attachment handling**: File attachment picking is more consistent with drag-and-drop behavior, and prompt controls are laid out more clearly in compact layouts. - **More self-contained packaging**: Desktop builds do a better job bundling the runtime, shipping the CodeNomad OpenCode plugin, and producing more consistent release artifacts. ## Fixes - **Permission flows are more reliable**: Stale permission events are ignored after a reply, permission metadata is preserved more safely, and attachment context survives more consistently. - **Idle/session indicators behave more predictably**: Idle badges now stay visible until they are actually seen, and session status behavior is easier to understand across parent and child sessions. - **Desktop and packaged builds are more dependable**: Bundled resources refresh more reliably, packaged session storage is isolated correctly, remote window titles are preserved, and Windows resource preparation avoids a brittle shell path. - **Compact layouts are less frustrating**: Message actions, tool-call controls, timeline spacing, and prompt controls behave better in narrow center panes and smaller screens. - **Release/update navigation is clearer**: Update links stay visible more reliably, making it easier to see and open release information when an update is available. ### Contributors - [@pascalandr](https://github.com/pascalandr) - [@jollyxenon](https://github.com/jollyxenon) - [@OfflinePing](https://github.com/OfflinePing) ## Merged Pull Requests ### @shantur - PR [#397](#397) “Add clone repository workspace flow” - PR [#399](#399) “feat(ui): allow tab reordering” - PR [#400](#400) “feat(ui): add chat history search” - PR [#430](#430) “Add session web preview mode” - PR [#432](#432) “fix(ui): align prompt attachment picker with drop behavior” - PR [#433](#433) “Package CodeNomad OpenCode plugin” - PR [#434](#434) “Refactor workspace startup and empty session states” - PR [#437](#437) “Improve prompt layout for narrow session panes” - PR [#438](#438) “Improve messages layouts on narrow screens” ### @pascalandr - PR [#394](#394) “fix(tauri): refresh bundled resources on rebuild” - PR [#405](#405) “fix(tauri): prefer bundled server entry in release” - PR [#410](#410) “fix(ui): keep update release link visible” - PR [#411](#411) “fix(ui): return to active projects from home” - PR [#423](#423) “fix(ui): follow up idle badge behavior” - PR [#424](#424) “fix(ui): drain yolo permissions outside shell render” - PR [#425](#425) “fix(ui): ignore stale permission events after reply” - PR [#426](#426) “fix(ui): reconcile permission tool attachments” - PR [#428](#428) “feat(ui): make message timeline hideable” - PR [#436](#436) “fix(electron): avoid shell for resource prep” ### @OfflinePing - PR [#415](#415) “feat(ui): show aggregated total tokens and cost for parent sessions including subagents” ### @jollyxenon - PR [#381](#381) “Fix(ui): Support Markdown Math Rendering” - PR [#409](#409) “fix(ui): align primary agent selection with OpenCode”
2 parents 89d144d + d3950df commit 3f93309

187 files changed

Lines changed: 7811 additions & 3075 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build-and-upload.yml

Lines changed: 34 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ jobs:
101101
- name: Build macOS binaries (Electron)
102102
run: npm run build:mac --workspace @neuralnomads/codenomad-electron-app
103103

104+
- name: Verify bundled Node resource (Electron macOS)
105+
run: node scripts/verify-bundled-node.cjs packages/electron-app/release/mac/CodeNomad.app/Contents/Resources@darwin-x64 packages/electron-app/release/mac-arm64/CodeNomad.app/Contents/Resources@darwin-arm64
106+
104107
- name: Ad-hoc sign Electron macOS app bundles (seal resources)
105108
shell: bash
106109
run: |
@@ -162,7 +165,7 @@ jobs:
162165
arch="arm64"
163166
fi
164167
165-
out_zip="$release_root/CodeNomad-${VERSION_TO_USE}-mac-${arch}.zip"
168+
out_zip="$release_root/CodeNomad-Electron-macos-${arch}-${VERSION_TO_USE}.zip"
166169
rm -f "$out_zip"
167170
echo "ditto -ck: $app -> $out_zip"
168171
ditto -ck --sequesterRsrc --keepParent "$app" "$out_zip"
@@ -177,7 +180,7 @@ jobs:
177180
tmp_dir=$(mktemp -d)
178181
trap 'rm -rf "$tmp_dir"' EXIT
179182
180-
zips=(packages/electron-app/release/CodeNomad-*-mac-*.zip)
183+
zips=(packages/electron-app/release/CodeNomad-Electron-macos-*.zip)
181184
if [ "${#zips[@]}" -eq 0 ]; then
182185
echo "No Electron macOS zip artifacts found to validate" >&2
183186
exit 1
@@ -259,6 +262,9 @@ jobs:
259262
- name: Build Windows binaries (Electron)
260263
run: npm run build:win --workspace @neuralnomads/codenomad-electron-app
261264

265+
- name: Verify bundled Node resource (Electron Windows)
266+
run: node scripts/verify-bundled-node.cjs packages/electron-app/electron/resources@win32-x64
267+
262268
- name: Upload release assets
263269
if: ${{ inputs.upload && inputs.tag != '' }}
264270
shell: pwsh
@@ -308,6 +314,9 @@ jobs:
308314
- name: Build Linux binaries (Electron)
309315
run: npm run build:linux --workspace @neuralnomads/codenomad-electron-app
310316

317+
- name: Verify bundled Node resource (Electron Linux)
318+
run: node scripts/verify-bundled-node.cjs packages/electron-app/electron/resources@linux-x64
319+
311320
- name: Upload release assets
312321
if: ${{ inputs.upload && inputs.tag != '' }}
313322
run: |
@@ -364,6 +373,9 @@ jobs:
364373
- name: Prebuild (Tauri)
365374
run: npm run prebuild --workspace @codenomad/tauri-app
366375

376+
- name: Verify bundled Node resource (Tauri macOS x64)
377+
run: node scripts/verify-bundled-node.cjs packages/tauri-app/src-tauri/resources@darwin-x64
378+
367379
- name: Ensure tauri native binary
368380
working-directory: packages/tauri-app
369381
run: |
@@ -391,7 +403,7 @@ jobs:
391403
rm -rf "$ARTIFACT_DIR"
392404
mkdir -p "$ARTIFACT_DIR"
393405
if [ -d "$BUNDLE_ROOT/macos/CodeNomad.app" ]; then
394-
ditto -ck --sequesterRsrc --keepParent "$BUNDLE_ROOT/macos/CodeNomad.app" "$ARTIFACT_DIR/CodeNomad-Tauri-${VERSION}-macos-x64.zip"
406+
ditto -ck --sequesterRsrc --keepParent "$BUNDLE_ROOT/macos/CodeNomad.app" "$ARTIFACT_DIR/CodeNomad-Tauri-macos-x64-${VERSION}.zip"
395407
fi
396408
397409
- name: Upload Actions artifacts (Tauri macOS)
@@ -448,6 +460,9 @@ jobs:
448460
- name: Prebuild (Tauri)
449461
run: npm run prebuild --workspace @codenomad/tauri-app
450462

463+
- name: Verify bundled Node resource (Tauri macOS arm64)
464+
run: node scripts/verify-bundled-node.cjs packages/tauri-app/src-tauri/resources@darwin-arm64
465+
451466
- name: Ensure tauri native binary
452467
working-directory: packages/tauri-app
453468
run: |
@@ -475,7 +490,7 @@ jobs:
475490
rm -rf "$ARTIFACT_DIR"
476491
mkdir -p "$ARTIFACT_DIR"
477492
if [ -d "$BUNDLE_ROOT/macos/CodeNomad.app" ]; then
478-
ditto -ck --sequesterRsrc --keepParent "$BUNDLE_ROOT/macos/CodeNomad.app" "$ARTIFACT_DIR/CodeNomad-Tauri-${VERSION}-macos-arm64.zip"
493+
ditto -ck --sequesterRsrc --keepParent "$BUNDLE_ROOT/macos/CodeNomad.app" "$ARTIFACT_DIR/CodeNomad-Tauri-macos-arm64-${VERSION}.zip"
479494
fi
480495
481496
- name: Upload Actions artifacts (Tauri macOS arm64)
@@ -533,6 +548,9 @@ jobs:
533548
- name: Prebuild (Tauri)
534549
run: npm run prebuild --workspace @codenomad/tauri-app
535550

551+
- name: Verify bundled Node resource (Tauri Windows)
552+
run: node scripts/verify-bundled-node.cjs packages/tauri-app/src-tauri/resources@win32-x64
553+
536554
- name: Ensure tauri native binary
537555
shell: bash
538556
working-directory: packages/tauri-app
@@ -563,7 +581,7 @@ jobs:
563581
New-Item -ItemType Directory -Path $artifactDir | Out-Null
564582
$exe = Get-ChildItem -Path $bundleRoot -Recurse -File -Filter *.exe | Select-Object -First 1
565583
if ($null -ne $exe) {
566-
$dest = Join-Path $artifactDir ("CodeNomad-Tauri-$env:VERSION-windows-x64.zip")
584+
$dest = Join-Path $artifactDir ("CodeNomad-Tauri-windows-x64-$env:VERSION.zip")
567585
Compress-Archive -Path $exe.Directory.FullName -DestinationPath $dest -Force
568586
}
569587
@@ -634,6 +652,9 @@ jobs:
634652
- name: Prebuild (Tauri)
635653
run: npm run prebuild --workspace @codenomad/tauri-app
636654

655+
- name: Verify bundled Node resource (Tauri Linux)
656+
run: node scripts/verify-bundled-node.cjs packages/tauri-app/src-tauri/resources@linux-x64
657+
637658
- name: Ensure tauri native binary
638659
working-directory: packages/tauri-app
639660
run: |
@@ -667,17 +688,15 @@ jobs:
667688
}
668689
669690
appimage=$(find_one "*.AppImage")
670-
deb=$(find_one "*.deb")
671-
rpm=$(find_one "*.rpm")
691+
fallback_bin="$SEARCH_ROOT/release/codenomad-tauri"
672692
673-
if [ -z "$appimage" ] || [ -z "$deb" ] || [ -z "$rpm" ]; then
674-
echo "Missing bundle(s): appimage=${appimage:-none} deb=${deb:-none} rpm=${rpm:-none}" >&2
693+
if [ -z "$appimage" ] || [ ! -f "$fallback_bin" ]; then
694+
echo "Missing bundle(s): appimage=${appimage:-none} binary=$fallback_bin" >&2
675695
exit 1
676696
fi
677697
678-
cp "$appimage" "$ARTIFACT_DIR/CodeNomad-Tauri-${VERSION}-linux-x64.AppImage"
679-
cp "$deb" "$ARTIFACT_DIR/CodeNomad-Tauri-${VERSION}-linux-x64.deb"
680-
cp "$rpm" "$ARTIFACT_DIR/CodeNomad-Tauri-${VERSION}-linux-x64.rpm"
698+
cp "$appimage" "$ARTIFACT_DIR/CodeNomad-Tauri-linux-x64-${VERSION}.AppImage"
699+
zip -j "$ARTIFACT_DIR/CodeNomad-Tauri-linux-x64-${VERSION}.zip" "$fallback_bin"
681700
682701
- name: Upload Actions artifacts (Tauri Linux)
683702
if: ${{ inputs.upload_actions_artifacts }}
@@ -776,12 +795,12 @@ jobs:
776795
rm -rf "$ARTIFACT_DIR"
777796
mkdir -p "$ARTIFACT_DIR"
778797
shopt -s nullglob globstar
779-
first_artifact=$(find "$SEARCH_ROOT" -type f \( -name "*.AppImage" -o -name "*.deb" -o -name "*.rpm" -o -name "*.tar.gz" \) | head -n1)
798+
first_artifact=$(find "$SEARCH_ROOT" -type f \( -name "*.AppImage" -o -name "*.tar.gz" \) | head -n1)
780799
fallback_bin="$SEARCH_ROOT/release/codenomad-tauri"
781800
if [ -n "$first_artifact" ]; then
782-
zip -j "$ARTIFACT_DIR/CodeNomad-Tauri-${VERSION}-linux-x64.zip" "$first_artifact"
801+
zip -j "$ARTIFACT_DIR/CodeNomad-Tauri-linux-arm64-${VERSION}.zip" "$first_artifact"
783802
elif [ -f "$fallback_bin" ]; then
784-
zip -j "$ARTIFACT_DIR/CodeNomad-Tauri-${VERSION}-linux-x64.zip" "$fallback_bin"
803+
zip -j "$ARTIFACT_DIR/CodeNomad-Tauri-linux-arm64-${VERSION}.zip" "$fallback_bin"
785804
else
786805
echo "No bundled artifact found under $SEARCH_ROOT and no binary at $fallback_bin" >&2
787806
exit 1
@@ -797,61 +816,3 @@ jobs:
797816
echo "Uploading $file"
798817
gh release upload "$TAG" "$file" --clobber
799818
done
800-
801-
802-
build-linux-rpm:
803-
runs-on: ubuntu-24.04
804-
env:
805-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
806-
VERSION: ${{ inputs.version }}
807-
TAG: ${{ inputs.tag }}
808-
steps:
809-
- name: Checkout
810-
uses: actions/checkout@v4
811-
with:
812-
ref: ${{ inputs.ref || github.ref }}
813-
814-
- name: Setup Node
815-
uses: actions/setup-node@v4
816-
with:
817-
node-version: ${{ env.NODE_VERSION }}
818-
cache: npm
819-
820-
- name: Install rpm packaging dependencies
821-
run: |
822-
sudo apt-get update
823-
sudo apt-get install -y rpm ruby ruby-dev build-essential
824-
sudo gem install --no-document fpm
825-
826-
- name: Set workspace versions
827-
if: ${{ inputs.set_versions && inputs.version != '' }}
828-
run: npm version ${VERSION} --workspaces --include-workspace-root --no-git-tag-version --allow-same-version
829-
830-
- name: Install project dependencies
831-
run: npm ci --workspaces --include=optional
832-
833-
- name: Ensure rollup native binary
834-
run: npm install @rollup/rollup-linux-x64-gnu --no-save
835-
836-
- name: Build Linux RPM binaries
837-
run: npm run build:linux-rpm --workspace @neuralnomads/codenomad-electron-app
838-
839-
- name: Upload RPM release assets
840-
if: ${{ inputs.upload && inputs.tag != '' }}
841-
run: |
842-
set -euo pipefail
843-
shopt -s nullglob
844-
for file in packages/electron-app/release/*.rpm; do
845-
[ -f "$file" ] || continue
846-
echo "Uploading $file"
847-
gh release upload "$TAG" "$file" --clobber
848-
done
849-
850-
- name: Upload Actions artifacts (Electron Linux RPM)
851-
if: ${{ inputs.upload_actions_artifacts }}
852-
uses: actions/upload-artifact@v4
853-
with:
854-
name: ${{ inputs.actions_artifacts_name_prefix }}electron-linux-rpm
855-
path: packages/electron-app/release/*.rpm
856-
retention-days: ${{ inputs.actions_artifacts_retention_days }}
857-
if-no-files-found: error

.nomadworks/nomadworks.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# NomadWorks repository configuration
2-
enabled: true
2+
enabled: false
33
team_mode: full
44

55
defaults:

.opencode/commands/release-notes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ description: Creates release notes
33
agent: build
44
---
55

6-
Check how I do prepare release notes here - https://github.com/NeuralNomadsAI/CodeNomad/releases/tag/v0.7.0
6+
Check how I do prepare release notes here - https://github.com/NeuralNomadsAI/CodeNomad/releases/tag/v0.15.0
77
Use the same format to create release notes from users perspective for new release by looking at changes from last tagged release to tip of branch

.opencode/opencode.jsonc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://opencode.ai/config.json",
33
"plugin": [
4-
"@neuralnomads/nomadworks@0.1.0-rc.10"
4+
// "@neuralnomads/nomadworks@0.1.0-rc.10"
55
]
66
}

AGENTS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,7 @@ Behavior for agents:
4747
## Tooling Preferences
4848
- Use the `edit` tool for modifying existing files; prefer it over other editing methods.
4949
- Use the `write` tool only when creating new files from scratch.
50+
51+
## Commit Message Guidelines
52+
- When creating commits, use detailed commit messages: a concise conventional-style subject followed by body paragraphs that explain the user-visible behavior change, the implementation approach, important edge cases or platform considerations, and the validation or test coverage added.
53+
- Prefer messages that explain why the change exists and how regressions are prevented, not just a list of touched files.

0 commit comments

Comments
 (0)