Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
73ae42b
docs: integrate development on beta and gate stable promotion
tbiyss Sep 8, 2026
809b6b0
release: use 0.5.1 for the next draft release
tbiyss Sep 8, 2026
845e15d
Merge PR #53: use 0.5.1 for the next draft release
tbiyss Sep 8, 2026
98b2875
fix: clarify Slack skill sources and configuration guidance
tbiyss Sep 8, 2026
23ba94e
Merge clearer Slack skill category guidance
tbiyss Sep 8, 2026
cc41da1
fix: persist instruction approvals until a decision
tbiyss Sep 8, 2026
19d8ee7
Merge PR #55: durable instruction approvals
tbiyss Sep 8, 2026
e2b9aeb
feat: clarify conversation and template skill assignment
tbiyss Sep 8, 2026
10d6a7e
Merge PR #56: improve skill assignment pages
tbiyss Sep 8, 2026
9fb7b3e
fix: make managed updates durable and Enterprise-only
tbiyss Sep 8, 2026
71ebf05
Merge PR #57: make managed updates durable and Enterprise-only
tbiyss Sep 8, 2026
e8e3145
fix: isolate update regression tests from live runtime paths
tbiyss Sep 8, 2026
aaa4db3
test: pin nested regression output to TAP across Node versions
tbiyss Sep 8, 2026
b3b62d8
Merge PR #58: isolate updater regression tests
tbiyss Sep 8, 2026
efd42bc
fix: expose channel credential names on every agent turn
tbiyss Sep 8, 2026
3317426
fix: compact skill rows and align assignment panels
tbiyss Sep 8, 2026
139d7c8
Merge PR #60: compact skill assignment rows
tbiyss Sep 8, 2026
501c562
Offer wait or force for daemon restarts
tbiyss Sep 8, 2026
ecc4ac8
docs: clarify Teams CLI onboarding procedure
tbiyss Sep 8, 2026
b0dbdc2
Merge restart wait and force choices into beta
tbiyss Sep 8, 2026
6e62827
Merge branch 'beta' into codex/teams-cli-procedure
tbiyss Sep 8, 2026
ebcde5c
Merge PR #62: clarify Teams CLI onboarding procedure
tbiyss Sep 8, 2026
280eb33
fix: reject incomplete turns and restore visible recovery ordering
tbiyss Sep 8, 2026
32d8ebb
Merge remote-tracking branch 'origin/beta' into codex/fix-incomplete-…
tbiyss Sep 8, 2026
4f05b35
fix: avoid replaying attempted recovery on connection flaps
tbiyss Sep 8, 2026
55649ac
Merge branch 'codex/fix-incomplete-turn-recovery' into beta
tbiyss Sep 8, 2026
73d8d39
fix: provide stable run identities for flat chats
tbiyss Sep 8, 2026
f2a45d0
feat: resume group chat sessions from quoted messages
tbiyss Sep 8, 2026
49d6e53
test: exercise partial delivery across message chunks
tbiyss Sep 8, 2026
ad7c344
Merge PR #64: group chat quote sessions and complete run identities
tbiyss Sep 8, 2026
de615fe
fix: distinguish Composio routing from account ownership
tbiyss Sep 8, 2026
136eec9
Merge PR #65: accurate Composio account ownership guidance
tbiyss Sep 8, 2026
d832ade
docs: clarify partial skill update inputs
tbiyss Sep 8, 2026
046a599
Merge PR #66: clarify partial skill update inputs
tbiyss Sep 8, 2026
95789a2
fix: allow first cross-site file tool navigation
tbiyss Sep 8, 2026
02973f3
test: qualify browser document in file-session regression
tbiyss Sep 8, 2026
1e1f043
Merge PR #67: repair cross-site file tool session entry
tbiyss Sep 8, 2026
db3fafb
fix: release native file form stack levels
tbiyss Sep 8, 2026
814c88c
Merge PR #68: release native file form stack levels
tbiyss Sep 8, 2026
ecccf3e
fix(slack): keep inherited files off command paths
tbiyss Sep 8, 2026
27ec932
Merge PR #69: preserve commands after thread file sharing
tbiyss Sep 8, 2026
f211fc5
fix(skills): describe actual creation approval scope
tbiyss Sep 8, 2026
7a0e99b
docs(skills): distinguish catalog placement from visibility
tbiyss Sep 8, 2026
e2ea17f
Merge PR #70: describe actual skill creation approval scope
tbiyss Sep 8, 2026
c3cf52c
fix: keep turns working after personal skill deletion
tbiyss Sep 8, 2026
d24862f
Merge PR #71: keep turns working after personal skill deletion
tbiyss Sep 8, 2026
bd4bcd6
fix: report received control-plane approval in tool results
tbiyss Sep 8, 2026
0e53ee5
docs: clarify approval receipts accompany returned outcomes
tbiyss Sep 8, 2026
1e276ea
test: let detached log wrapper exit before cleanup
tbiyss Sep 8, 2026
94b04ae
Merge PR #72: report received control-plane approval in tool results
tbiyss Sep 8, 2026
bf5dd90
Clarify approval receipts require an explicit human decision
tbiyss Sep 8, 2026
74dc783
Refresh advisory network policy in every engine attempt
tbiyss Sep 8, 2026
3e956e6
Clarify that approval receipts record an explicit human decision
tbiyss Sep 8, 2026
e3d2a55
Merge remote-tracking branch 'origin/beta' into fix/runtime-network-p…
tbiyss Sep 8, 2026
72597b3
Merge PR #74: refresh current network policy for engine attempts
tbiyss Sep 8, 2026
d942521
Preserve channel guest grants on unrelated admin saves
tbiyss Sep 8, 2026
2bd0478
Preserve channel guest grants on unrelated admin saves
tbiyss Sep 8, 2026
8a8697b
Add Teams event triggers and portable chat controls
tbiyss Sep 8, 2026
229d677
fix: explain automatic shared skill summaries
tbiyss Sep 8, 2026
d8bd90d
Merge PR #77: explain automatic shared skill summaries
tbiyss Sep 8, 2026
36a6cfe
Remove files command in favor of existing browser controls
tbiyss Sep 8, 2026
4a32d39
feat: add a standalone Slack menu command
tbiyss Sep 8, 2026
ffb9287
Merge PR #79: add standalone Slack menu
tbiyss Sep 8, 2026
3910e35
Merge beta menu support while retaining files command removal
tbiyss Sep 8, 2026
c14aa9f
Merge PR #78: remove files command
tbiyss Sep 8, 2026
fca3774
Add native Teams controls approvals files and local voice
tbiyss Sep 8, 2026
a6d7442
Merge remote-tracking branch 'origin/beta' into teams-ms
tbiyss Sep 8, 2026
daf6f0b
Show Teams session settings cards in the source conversation
tbiyss Sep 8, 2026
953f525
Allow unrestricted reads across connected identities
tbiyss Sep 9, 2026
7383829
fix: manage Slack secrets directly in settings
tbiyss Sep 9, 2026
ab20943
Merge fix: manage Slack secrets directly in settings
tbiyss Sep 9, 2026
faade04
fix: respect disabled Claude in login alert monitor
tbiyss Sep 9, 2026
2f1b8c6
Merge fix: suppress disabled Claude login alerts
tbiyss Sep 9, 2026
fc0c3e1
fix: explain shared workspace conflicts in Slack
tbiyss Sep 9, 2026
2b59005
feat: manage plugin packages through skill sources and grants
tbiyss Sep 9, 2026
df7156b
fix: compile executable plugin hooks as native event maps
tbiyss Sep 9, 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 .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI

on:
push:
branches: [main]
branches: [main, beta]
pull_request:

permissions:
Expand Down
36 changes: 34 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ and the store modules; never read the tables from a gated folder.
— one-time import of the pre-SQLite JSON/JSONL into the tables (guarded by a `_meta` flag; old
files are left on disk as inert backups).
- Tables: `users`, `channels`, `channel_meta`, `sessions`, `schedules`, `acks`,
`conversation_reply_sessions` (conversation-scoped user/bot message IDs → group session roots),
`followup_threads` + `followup_done`, `bg_jobs` (config-shaped rows keep their full record in a
JSON `data` blob so every field survives + no migration for new fields); `usage` and `events`
(the dashboard data — fully typed, indexed columns for day/week/month/channel/user rollups).
Expand Down Expand Up @@ -251,7 +252,10 @@ Config that stays as **JSON files** (read wholesale / bootstrap, hand-editable):
- **Composio identities stay distinct.** Inject the active author's token as `composio-user` and
independently inject shared `composio` from the channel token, falling back to the organization
token. A channel folder never stores either token in plain settings. “My account” means
`composio-user`; “your/channel account” means `composio`; ambiguous identity must be clarified.
`composio-user`; “your/channel account” means `composio`. Reads/searches may use either or both
unless the user restricts the account or scope. Writes/sends/state changes require the intended
identity and connected account; reuse established choices and clarify only unresolved mutation
identity. Independent authorized reads can continue while that clarification is pending.
- **Composio is the only external Slack MCP.** There is NO hosted per-user Slack MCP and no
`connect_slack`/`xoxp` OAuth (removed). Slack actions beyond the gateway's own bot tools —
cross-channel search, sending elsewhere, scheduled sends, canvases, reactions — go through the
Expand Down Expand Up @@ -328,7 +332,35 @@ Config that stays as **JSON files** (read wholesale / bootstrap, hand-editable):

## Contributor workflow

Use a dedicated branch and worktree from the latest upstream main. Keep shared integration
### Beta development and stable promotion

- `beta` is the integration branch for all new development, fixes, documentation and tests.
Start each task from current `origin/beta` in its own branch/worktree; validate and land on
`beta`, then push `origin beta`. Keep a served beta checkout on `beta` between tasks.
- `main` is the stable release branch for downstream installations. Completing a task or
receiving permission to push to `beta` never authorizes a merge or push to `main`.
- Promote `beta` to `main` only after BOTH a full test pass and the user's explicit confirmation
to release that exact candidate. Prepare a release PR and report its candidate commit, scope,
test results and live acceptance evidence BEFORE asking for confirmation. A request to adopt
this workflow, earlier general approval, silence, or a beta merge is not release approval.
- A full test pass means `npm run test:coverage` (the full regression suite with coverage floors),
`npm run check:static`, `npm run secret-scan`, `npm run test:security-coverage`,
`npm audit --omit=dev --audit-level=high`, and `npm run check:dco -- origin/main..HEAD`,
plus passing CI and every applicable live release gate in `TEST-PLAN.md` for Claude and Codex.
Include exact fixtures, prompts/actions and observed evidence; a skipped, blocked, failed or
unexecuted required check is not a pass. Only cases unaffected by engine choice may be marked
engine-independent. Maintainers complete private deployment acceptance where applicable.
- Approval and evidence belong to the exact tested candidate. If its content changes, or
integration with newer `main` changes the proposed release, rerun the applicable full checks
and obtain fresh user confirmation before promotion. Release only the approved candidate;
do not include later beta commits. Keep `beta` up to date with the approved stable history.
- These branch and release rules apply to both Claude and Codex and override generic skill
defaults that say to merge completed tasks into `main`. Use the deployment's serialized landing
lock for integration; never switch a shared served checkout to `main` merely to publish a release.


Use a dedicated branch and worktree from the latest upstream `beta`. Target development pull
requests at `beta`; completed development work is merged and pushed to `beta`. Keep shared integration
checkouts clean, stage only your changes, sign off commits under `CLA.md`, and open a pull request.
External contributors push to their own fork and never need the publisher's GitHub account or a
production checkout. See [CONTRIBUTING.md](CONTRIBUTING.md) for local checks and PR requirements.
Expand Down
86 changes: 83 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,40 @@
# Changelog — ChannelGate

- Reply in Slack when conflicting shared-folder skill or memory settings prevent a request
from starting, with admin repair instructions instead of silently logging the error.

- Put Remove and Add/update directly on Slack Settings → Secrets. Refresh the same page after
deletion, and return saved entry forms to their parent without duplicate lists or modal stack growth.

- Remove the `/files` slash command and typed file-browser entry. The reply folder button and
Browse channel files shortcut remain available; legacy typed requests explain the replacement.

- Explain in the All Shared Skills hint that its summary updates automatically when its source
groups are configured, matching the other combined skill summary.

- Include the current advisory network policy in every engine attempt, including resumed and
Clean turns, so a changed switch supersedes stale context and cached request results.

- Preserve existing channel guest grants when an unrelated Admin UI setting is saved, even if
the current member roster omits a saved guest. Explicit guest edits retain membership validation.

- Include received human approval in completed control-plane tool results while preserving the
operation outcome; clarify that approval cards can be outside the model transcript and that
the receipt records an explicit human decision, not an approval supplied by channel Auto mode.

- Keep subsequent turns working after an author deletes a personal skill, while retaining its
grant and revision history for restoration and refusing foreign personal skill access.

- Correct skill-creation approval descriptions to show personal versus shared ownership,
optional channel grants and automatic personal/channel-scope activation accurately.

- Keep text-only gateway commands on their control path after thread file sharing, while
preserving canonical current attachments and ordinary agent attachment recovery.

- Reject incomplete engine turns even when partial text exists; preserve failure diagnostics and
usage. Reserve restart recovery before Slack reconnects, show each recovering thread promptly,
and retry pending recoveries on reconnection without requiring another daemon restart.

- Fix one-time automation edits shifting by the browser/daemon timezone difference and potentially firing future tasks immediately.

ChannelGate was formerly *Claude Gateway for Slack*; entries below the rename keep their original
Expand All @@ -18,7 +53,52 @@ product overview.
> | Makeitfuture Sustainable Use License 1.1 | 2026-08-20 | never published |
> | Makeitfuture Sustainable Use License 1.0 | 2026-08-06 | never published |

## Unreleased
## 0.5.1 — Unreleased

- Manage plugin packages through existing skill sources, review, templates and channel grants.
Compile native Claude hooks as an inline event map so SessionStart hooks execute correctly;
keep executable hooks restricted to authorized live admin turns.

- Fix repeated native file creation and inline editing exhausting Slack’s modal stack. Successful
forms return to the existing browser/preview; Cancel and validation retain their prior behavior.

- Fix the first browser editor/upload opening from Slack: narrowly scoped SameSite=Lax session
cookies survive the cross-site GET redirect while preserving CSRF, authorization and cookie
confidentiality protections.

- Correct the bundled skill-authoring workflow: updates and change proposals accept only changed
files while retaining omitted files; complete packages are required for initial creation.

- Correct Composio guidance that assumed the agent identity always belonged to other people or
was shared across every channel. Preserve account selection and no-substitution rules, including
when personal and agent connections reach the same underlying service owner.

- Fix missing run identities in flat chats. Group-chat messages start separate sessions; quoting
user or bot messages resumes the original session, including after restart. Teams quotes support
both current entities and legacy Reply markup; personal chats remain continuous.

- Make skill assignment rows compact, reveal descriptions and metadata on click, and give Active
skills and Add skills matching fixed heights with preserved scroll position when managing skills.

- Make existing channel API/CLI credentials discoverable through a current names-only inventory
on non-Clean attempts, including resumed turns. Teach the operating guide to check credentials
alongside skills, CLI logins and selected-account MCPs before requesting another connection;
clarify runtime environment use without exposing values or silently changing accounts.

- Improve conversation and template skill selection with a shared Active skills / Add skills
editor, name and source filters, locked inherited groups, and preserved explicit selections.

- Clarify the Slack Skills categories and where each is configured. Org Skills explicitly
states that only admins can add or remove organization skills; combined lists are labelled
as automatic summaries.

- Save instruction-update approvals with no deadline. The exact rule remains actionable across
restarts and is applied once on approval; changed instructions, destinations or permissions
require a fresh request. Other live engine permission/plan approvals retain their timeout.

Next release version selected by the owner. Development continues on `beta`; full testing and
explicit approval of the exact candidate are required before promotion to `main`. Earlier
0.6.0 candidate tags and evidence below are retained as historical snapshots, not published releases.

- Give selected optional Codex MCPs the existing 120-second remote startup budget and raise
Claude's default initialize timeout to the same ceiling. Preserve explicit operator overrides,
Expand Down Expand Up @@ -76,7 +156,7 @@ product overview.
the footer. Recompute after retries, recovery and fallback; never infer a provider model
from an alias or an unexposed harness default.

## 0.6.0-rc.2 — 2026-09-08 (release candidate)
## 0.6.0-rc.2 — 2026-09-08 (superseded draft)

Follow-up candidate for the installer findings from disposable Linux acceptance. Full live QA
remains deferred; stable promotion is not approved.
Expand All @@ -92,7 +172,7 @@ remains deferred; stable promotion is not approved.
- Add disposable Linux installation, encrypted backup/restore, real updater rollback and actual
OS reboot checks; authenticated engine and chat acceptance remains a separate live gate.

## 0.6.0-rc.1 — 2026-09-08 (release candidate)
## 0.6.0-rc.1 — 2026-09-08 (superseded draft)

Candidate source and build evidence for review. The GitHub Release remains a draft; the planned
full live QA campaign is pending. This is not approval for stable-release promotion.
Expand Down
11 changes: 8 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ npm test # full node:test suite (test/*.test.js)
npm run test:coverage # the same suite with the enforced coverage floors — what CI runs
npm run check:static # syntax, undeclared identifiers, whitespace invariants
npm run secret-scan # dependency-free credential scan over tracked files
npm run check:dco # every commit in origin/main..HEAD carries a sign-off trailer
npm run check:dco -- origin/beta..HEAD # every development commit carries a sign-off trailer
```

`npm run test:security-coverage` enforces the extra coverage floors on the security-critical
Expand All @@ -50,10 +50,15 @@ on ubuntu-latest.

## Branches and review

Use your own fork, branch and isolated worktree. Start from the latest upstream main, make focused
commits and open a PR with validation results. You do not need access to the publisher's GitHub
Use your own fork, branch and isolated worktree. Start from the latest upstream `beta`, make focused
commits and open a PR targeting `beta` with validation results. You do not need access to the publisher's GitHub
account, private QA database or production host. Maintainers handle final integration and release.

`beta` receives all completed development work. `main` is the stable update branch. A release PR
from `beta` to `main` requires the full test and live acceptance evidence defined in `AGENTS.md`,
followed by explicit user confirmation for that exact tested candidate. Beta work is not
authorization to release; required checks that are blocked or unexecuted prevent promotion.

Keep `FEATURES.md` and `TEST-PLAN.md` consistent with behavior. Include exact fixtures, setup,
prompts/actions and pass rules for applicable Claude and Codex acceptance. Report live cases you
could not execute explicitly so maintainers can run them; a local unit test is not a live pass.
Expand Down
Loading
Loading