Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
2f21afa
Role-to-session affinity: named sessions, resume-by-role boot, tmux-r…
fujibee Jul 9, 2026
89980f9
fix(gemini): detect the real GEMINI_CLI env var, not GOOGLE_GEMINI_CL…
fujibee Jul 9, 2026
7b57d47
fix(codex): bind the bridge to the role's recorded thread, not "loade…
fujibee Jul 11, 2026
8113d38
Stop ancestor project resolution from over-reaching to $HOME / other …
fujibee Jul 11, 2026
af10ad0
fix(spawn): guard '/'-prefixed boot prompt against MSYS path conversi…
fujibee Jul 12, 2026
c1554b9
fix(spawn): wrap boot script with bash -l for psmux on Windows (#335)…
masa6161 Jul 12, 2026
baa064e
release: 1.1.7 (#376)
fujibee Jul 13, 2026
2202e59
fix(app-release): Authenticode-sign Windows binaries during tauri bui…
fujibee Jul 13, 2026
8cc69d4
feat(app): 0.1.5 UI polish — sidebar collapse, chat pane min/max, Tea…
fujibee Jul 13, 2026
96f0abf
chore(app): bump AGMSG_CORE_REF to v1.1.7 (#379)
fujibee Jul 13, 2026
8a2fe62
chore(app): bump version to 0.1.5 (#380)
fujibee Jul 13, 2026
04fea8f
feat(app): show agent and team status (#385)
fujibee Jul 14, 2026
edbb37a
feat(app): snap pane dividers to terminal cell units, herdr-style gap…
fujibee Jul 14, 2026
b821759
feat(app): persist UI settings across restarts (#391)
fujibee Jul 14, 2026
ba2cbcd
fix(bin): normalise Windows backslash paths before handing to bash/cu…
fujibee Jul 15, 2026
d3f0fad
feat(app): detect grok/grok-build agent status (#395)
fujibee Jul 15, 2026
2ee8c16
fix(app): display chat timestamps in local time, not raw UTC (#394)
fujibee Jul 15, 2026
dddf17d
fix(app): clean up the Settings font-size input (#401)
fujibee Jul 15, 2026
5d806fd
perf(app): batch pty-output writes to one term.write() per animation …
fujibee Jul 15, 2026
726f31f
feat(app): phase-lock agent-status and monitor pulse dots to wall clo…
fujibee Jul 15, 2026
e1ce735
fix(codex-shim): forward args on a flags-only monitored launch (#404)
fujibee Jul 15, 2026
072a7db
feat(app): green status-unknown default, roomier team-status-rail row…
fujibee Jul 15, 2026
403ff10
feat(app): sidebar per-section + buttons, replacing the New dropdown …
fujibee Jul 15, 2026
ca2263d
fix(antigravity): resolve Codex leftovers and delivery_modes mismatch…
fujibee Jul 15, 2026
e26e80e
fix(send): reject unregistered from/to agents (#409)
fujibee Jul 15, 2026
e1998b0
fix(app): filter non-numeric characters out of the font-size draft (#…
fujibee Jul 15, 2026
4b25697
release: 1.1.8 (#410)
fujibee Jul 15, 2026
b28ab54
Merge tag 'v1.1.8' into merge/upstream-v1.1.8
orangewk Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "agmsg",
"description": "Cross-agent messaging via SQLite. Send messages between CLI AI agents. No daemon, no network.",
"version": "1.1.6",
"version": "1.1.8",
"author": {
"name": "fujibee"
},
Expand Down
73 changes: 51 additions & 22 deletions .github/workflows/app-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@ name: app release
# (the signing identity itself is hardcoded in tauri.conf.json, not a
# secret — don't set APPLE_SIGNING_IDENTITY as a step env var unless it's
# actually populated, an empty override breaks codesign)
# Windows codesign (azure/artifact-signing-action, OIDC federated via
# azure/login — no client secret. Account: agmsg-artifact-signing, East US,
# endpoint https://eus.codesigning.azure.net/, certificate profile
# agmsg-app-signing (Public Trust, CN=Koichi Fujikawa). App registration:
# Windows codesign (Azure Trusted Signing via the TrustedSigning PowerShell
# module, wired into `tauri build` through bundle.windows.signCommand ->
# app/scripts/sign-windows.ps1 so signing happens BEFORE cab packing and
# updater .sig generation (#333). OIDC federated via azure/login — no
# client secret. Account: agmsg-artifact-signing, East US, endpoint
# https://eus.codesigning.azure.net/, certificate profile agmsg-app-signing
# (Public Trust, CN=Koichi Fujikawa). App registration:
# agmsg-github-actions, federated for the main branch):
# AZURE_CLIENT_ID / AZURE_TENANT_ID / AZURE_SUBSCRIPTION_ID
# Auto-updater artifact signing (keypair already generated locally, see
Expand Down Expand Up @@ -186,12 +189,13 @@ jobs:
working-directory: .
shell: bash

- name: Build
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: pnpm tauri build

# Login BEFORE the build: Authenticode signing now happens inside
# `tauri build` (bundle > windows > signCommand -> sign-windows.ps1), so
# the Azure CLI credential must already exist when the bundler runs.
# Signing binaries after the build (the old post-build signing step,
# since removed) mutated bytes the updater's minisign .sig had already been
# computed over — every 0.1.4 update failed signature verification, and
# the in-place pass also corrupted the MSI's embedded cabinet (#333).
- name: Azure login (OIDC)
if: ${{ env.HAS_AZURE_CREDS == 'true' }}
uses: azure/login@v3
Expand All @@ -200,19 +204,44 @@ jobs:
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

- name: Sign Windows binaries (Azure Trusted Signing)
- name: Install TrustedSigning PowerShell module
if: ${{ env.HAS_AZURE_CREDS == 'true' }}
uses: azure/artifact-signing-action@v2
with:
endpoint: https://eus.codesigning.azure.net/
signing-account-name: agmsg-artifact-signing
certificate-profile-name: agmsg-app-signing
files-folder: ${{ github.workspace }}/app/src-tauri/target/release/bundle
files-folder-filter: exe,msi
files-folder-recurse: true
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
shell: pwsh
run: Install-Module -Name TrustedSigning -Force -Scope CurrentUser -Repository PSGallery

- name: Build
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
shell: bash
run: |
# With Azure creds, sign each artifact during bundling: the app exe
# is signed before it is packed into the MSI cab / NSIS installer,
# and the updater .sig is generated over the final signed bytes.
# Feature branches build unsigned (federated identity trusts main
# only, so there is no credential to sign with).
if [ "$HAS_AZURE_CREDS" = "true" ]; then
sign_script="${GITHUB_WORKSPACE//\\//}/app/scripts/sign-windows.ps1"
config="$(jq -cn --arg cmd "pwsh -NoProfile -ExecutionPolicy Bypass -File $sign_script %1" '{bundle: {windows: {signCommand: $cmd}}}')"
pnpm tauri build --config "$config"
else
pnpm tauri build
fi

- name: Verify Authenticode signatures
if: ${{ env.HAS_AZURE_CREDS == 'true' }}
shell: pwsh
run: |
$shipped = Get-ChildItem -Path src-tauri/target/release/bundle/msi/*.msi, src-tauri/target/release/bundle/nsis/*.exe
if ($shipped.Count -eq 0) { Write-Error "no shipped artifacts found to verify"; exit 1 }
foreach ($f in $shipped) {
$sig = Get-AuthenticodeSignature -FilePath $f.FullName
if ($sig.Status -ne 'Valid') {
Write-Error "$($f.Name): Authenticode status $($sig.Status) — signCommand did not run or failed silently"
exit 1
}
Write-Output "OK: $($f.Name) signed by $($sig.SignerCertificate.Subject)"
}

- uses: actions/upload-artifact@v4
with:
Expand Down
46 changes: 46 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,49 @@ All notable changes to this project are documented here.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.1.8] - 2026-07-15

### Added
- Sidebar per-section + buttons, replacing the New dropdown (#407)
- Green status-unknown default, roomier team-status-rail rows (#406)
- Phase-lock agent-status and monitor pulse dots to wall clock (#403)
- Detect grok/grok-build agent status (#395)
- Persist UI settings across restarts (#391)
- Snap pane dividers to terminal cell units, herdr-style gaps (#390)
- Show agent and team status (#385)

### Fixed
- Filter non-numeric characters out of the font-size draft (#405)
- Reject unregistered from/to agents (#409)
- Resolve Codex leftovers and delivery_modes mismatch (#408)
- Forward args on a flags-only monitored launch (#404)
- Clean up the Settings font-size input (#401)
- Display chat timestamps in local time, not raw UTC (#394)
- Normalise Windows backslash paths before handing to bash/curl (#392)

### Performance
- Batch pty-output writes to one term.write() per animation frame (#402)

## [app-v0.1.5] - 2026-07-13

### Added
- 0.1.5 UI polish — sidebar collapse, chat pane min/max, Team Room toggle, About version, lucide icons (#377)

### Fixed
- Authenticode-sign Windows binaries during tauri build (#354)

## [1.1.7] - 2026-07-13

### Added
- Role-to-session affinity: named sessions, resume-by-role boot, tmux-resurrect (#339) (#344)

### Fixed
- Wrap boot script with bash -l for psmux on Windows (#335) (#363)
- Guard '/'-prefixed boot prompt against MSYS path conversion on Git Bash (#358)
- Stop ancestor project resolution from over-reaching to $HOME / other teams (#357) (#359)
- Bind the bridge to the role's recorded thread, not "loaded" (#350) (#353)
- Detect the real GEMINI_CLI env var, not GOOGLE_GEMINI_CLI (#351)

## [1.1.6] - 2026-07-05

### Added
Expand Down Expand Up @@ -233,6 +276,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Handle empty TaskList explicitly to stop fresh-session loop (#71)
- Storage driver pluginization design (epic #51) (#52)

[1.1.8]: https://github.com/fujibee/agmsg/compare/app-v0.1.5...v1.1.8
[app-v0.1.5]: https://github.com/fujibee/agmsg/compare/v1.1.7...app-v0.1.5
[1.1.7]: https://github.com/fujibee/agmsg/compare/app-v0.1.4...v1.1.7
[1.1.6]: https://github.com/fujibee/agmsg/compare/app-v0.1.3...v1.1.6
[app-v0.1.3]: https://github.com/fujibee/agmsg/compare/app-v0.1.2...app-v0.1.3
[app-v0.1.2]: https://github.com/fujibee/agmsg/compare/app-v0.1.1...app-v0.1.2
Expand Down
4 changes: 2 additions & 2 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ $agmsg
### シェル(任意のエージェント)

```bash
~/.agents/skills/<cmd>/scripts/send.sh <team> <from> <to> "<message>"
~/.agents/skills/<cmd>/scripts/send.sh <team> <from> <to> "<message>" [--force]
~/.agents/skills/<cmd>/scripts/inbox.sh <team> <agent_id>
~/.agents/skills/<cmd>/scripts/history.sh <team> [agent_id] [limit]
~/.agents/skills/<cmd>/scripts/team.sh <team>
Expand All @@ -327,7 +327,7 @@ $agmsg
~/.agents/skills/<cmd>/scripts/reset.sh <project_path> <type> [agent_id]
```

`send.sh` はちょうど4つの位置引数を取る: `<team> <from> <to> "<message>"`。シェルが1つの引数として認識するようメッセージはクォートすること — クォートされていないスペース入りメッセージは誤って分割される。
`send.sh` は4つの位置引数 `<team> <from> <to> "<message>"` に加えて、末尾に任意で `--force` を取る。シェルが1つの引数として認識するようメッセージはクォートすること — クォートされていないスペース入りメッセージは誤って分割される。`from`・`to` はどちらも `<team>` に事前登録済みである必要があり、未登録の名前は(登録済み一覧を添えて)エラーになる — 意図的な事前登録前送信をしたい場合のみ `--force` でこのチェックを迂回できる

## FAQ / 設計メモ

Expand Down
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,19 @@ By default `despawn <name>` is **graceful**: it sends a `ctrl:despawn` control m

Despawn only acts on the named member — the session running `despawn` is never torn down, and a broad-subscription watcher ignores a `ctrl:despawn` aimed at another role.

### Bring a role back with its context (session resume)

A role remembers the session that last embodied it: sessions are named
`<team>-<agent>`, and `spawn` **resumes a role's previous session by default** —
so re-spawning after a `despawn`, crash, or restart comes back in the prior
conversation, not blank (`--fresh` forces new). With
[tmux-resurrect](https://github.com/tmux-plugins/tmux-resurrect), one `~/.tmux.conf`
line re-seats every role pane into its session after a tmux-server restart.

See **[docs/session-resurrect.md](docs/session-resurrect.md)** for the tmux-resurrect
setup, how it resolves each pane, what does and doesn't come back automatically, and
the manual fallback.

## Delivery modes

How incoming messages reach your agent. Pick one at first join via the prompt, or change it later with `/agmsg mode <name>`.
Expand Down Expand Up @@ -318,7 +331,7 @@ See [docs/opencode.md](docs/opencode.md) for full setup instructions.
### Shell (any agent)

```bash
~/.agents/skills/<cmd>/scripts/send.sh <team> <from> <to> "<message>"
~/.agents/skills/<cmd>/scripts/send.sh <team> <from> <to> "<message>" [--force]
~/.agents/skills/<cmd>/scripts/inbox.sh <team> <agent_id>
~/.agents/skills/<cmd>/scripts/history.sh <team> [agent_id] [limit]
~/.agents/skills/<cmd>/scripts/team.sh <team>
Expand All @@ -328,7 +341,7 @@ See [docs/opencode.md](docs/opencode.md) for full setup instructions.
~/.agents/skills/<cmd>/scripts/reset.sh <project_path> <type> [agent_id]
```

`send.sh` takes exactly four positional arguments: `<team> <from> <to> "<message>"`. Quote the message so the shell sees it as one argument; an unquoted message with spaces will be misparsed.
`send.sh` takes four positional arguments`<team> <from> <to> "<message>"` — plus an optional trailing `--force`. Quote the message so the shell sees it as one argument; an unquoted message with spaces will be misparsed. Both `from` and `to` must already be registered in `<team>`; an unregistered name errors out (listing the currently registered names) instead of silently storing an undeliverable message. Pass `--force` to bypass this check for an intentional pre-registration send.

## FAQ / Design notes

Expand Down
6 changes: 4 additions & 2 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ description: Cross-agent messaging via SQLite. Send messages between Claude Code

**IMPORTANT: Always use the provided scripts. NEVER directly read or edit config files, DB, or team data. There is NO register.sh — use join.sh to join a team.**

**Shell requirement:** All agmsg scripts are Bash scripts. Always execute them via `bash`, never via PowerShell or cmd directly. If your default shell is not Bash (e.g. PowerShell on Windows), wrap every command with `bash -lc '...'`. Example: `bash -lc '~/.agents/skills/agmsg/scripts/send.sh myteam alice bob "hello"'`. Do NOT construct DB paths manually — the scripts handle path resolution internally. If you need to redirect storage, use `AGMSG_STORAGE_PATH` (the supported override).

## How to use

### Step 0: First-run bootstrap
Expand Down Expand Up @@ -56,8 +58,8 @@ Do NOT manually edit config files. Always use join.sh.
# Check inbox (marks messages as read) — DEFAULT action
~/.agents/skills/agmsg/scripts/inbox.sh <team> <agent_id>

# Send a message
~/.agents/skills/agmsg/scripts/send.sh <team> <from_agent> <to_agent> "<message>"
# Send a message (from/to must already be registered in <team>; add --force to bypass)
~/.agents/skills/agmsg/scripts/send.sh <team> <from_agent> <to_agent> "<message>" [--force]

# Message history
~/.agents/skills/agmsg/scripts/history.sh <team> [agent_id] [limit]
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.1.6
1.1.8
2 changes: 1 addition & 1 deletion app/AGMSG_CORE_REF
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v1.1.6
v1.1.7
3 changes: 2 additions & 1 deletion app/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "agmsg-app",
"private": true,
"version": "0.1.4",
"version": "0.1.5",
"type": "module",
"scripts": {
"dev": "vite",
Expand All @@ -21,6 +21,7 @@
"@xterm/xterm": "^6.0.0",
"i18next": "^26.3.4",
"i18next-browser-languagedetector": "^8.2.1",
"lucide-react": "^1.23.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-i18next": "^17.0.8"
Expand Down
12 changes: 12 additions & 0 deletions app/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added app/public/agmsg-mark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
30 changes: 30 additions & 0 deletions app/scripts/sign-windows.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Authenticode-signs one file with Azure Trusted Signing. Invoked by the Tauri
# bundler (bundle > windows > signCommand) once per artifact DURING the build:
# the bare app exe before it is packed into the MSI cab / NSIS installer, then
# the installers themselves. That ordering is the point — the updater's
# minisign .sig is generated after signing, over the bytes that actually ship
# (issue #333: post-build in-place signing invalidated the .sig and corrupted
# the MSI cabinet).
#
# Auth: DefaultAzureCredential. In CI, azure/login provides the Azure CLI
# credential via OIDC (federated for the main branch only — no client secret
# exists, which is why trusted-signing-cli is not usable here).
param(
[Parameter(Mandatory = $true)]
[string]$File
)

$ErrorActionPreference = "Stop"

if (-not (Get-Module -ListAvailable -Name TrustedSigning)) {
Install-Module -Name TrustedSigning -Force -Scope CurrentUser -Repository PSGallery
}

Invoke-TrustedSigning `
-Endpoint "https://eus.codesigning.azure.net/" `
-CodeSigningAccountName "agmsg-artifact-signing" `
-CertificateProfileName "agmsg-app-signing" `
-FileDigest SHA256 `
-TimestampRfc3161 "http://timestamp.acs.microsoft.com" `
-TimestampDigest SHA256 `
-Files $File
18 changes: 17 additions & 1 deletion app/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion app/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "agmsg-app"
version = "0.1.4"
version = "0.1.5"
description = "A Tauri App"
authors = ["you"]
edition = "2021"
Expand All @@ -24,6 +24,7 @@ tauri-plugin-dialog = "2"
tauri-plugin-updater = "2"
tauri-plugin-process = "2"
tauri-plugin-single-instance = "2"
tauri-plugin-window-state = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
# Terminal-embedded core: own agent PTYs (spawn + read + write + inject) and
Expand Down
Loading
Loading