Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
170 commits
Select commit Hold shift + click to select a range
8764d33
test(memory): wait for the summary to settle instead of a fixed delay
Oct 14, 2026
59626e3
feat(flybot): ctx.flybot plugin API in ds-bot
Oct 14, 2026
c73c725
feat(social): Bot Social plugin (homes, member identities, approvals,…
Oct 14, 2026
782caae
feat(tree): recursive Bot tree plugin (from Birfy/recursive-bot 324fb59)
Oct 14, 2026
5805f1e
feat(social): file sharing between Bots
Oct 14, 2026
f42d9bb
fix(flybot): provide the flybot service with ctx.provide (Cordis 4 re…
Oct 14, 2026
5644467
feat(social): Add friend in the sidebar (invite link, join by link, a…
Oct 14, 2026
e6cf976
fix(plugins): register social/tree client bundles under their package…
Oct 14, 2026
090c5c5
fix(tree): web entry registers its section through the browser flybot…
Oct 14, 2026
25e1c93
feat(tree): refresh the sidebar tree every 10 s (removals emit no fie…
Oct 14, 2026
59f3092
fix(ds-bot): keep /api/bot served across a hot reload
Oct 14, 2026
eb49c11
feat(social): redesign the Friends' Bots panel
Oct 14, 2026
e87f294
feat(tree): styled sidebar tree and startup root (from recursive-bot …
Oct 14, 2026
8b957e9
feat(tree): Chief is the tree root; migrate the auto-created Root (fr…
Oct 14, 2026
fcff16e
feat(social): Copy puts an instruction message with the invite link o…
Oct 14, 2026
3b10d2e
feat(ds-bot): the sidebar Bot list as one tree (flybot.sidebar.struct…
Oct 14, 2026
7bf2842
feat(social): per-Bot invites only; API for other plugins
Oct 14, 2026
90d39c1
test(ds-bot): the slot list includes flybot.sidebar.structure
Oct 14, 2026
913b07e
feat(tree): ds-bot's Bot list draws the tree; tree.forest helper; ret…
Oct 14, 2026
5908881
feat(tree): per-node 'Copy invite link' via the structure entry's nod…
Oct 14, 2026
671c1e2
fix(ds-bot): drop the always-on red '!' on Connect plugins
Oct 14, 2026
7b806c6
feat: Copy invite link in a Bot's right-click menu (structure menuIte…
Oct 14, 2026
4238df6
Merge pull request #2 from Birfy/flybot-plugins
Birfy Oct 14, 2026
582c8fd
fix(tree): Copy invite link always copies the full instruction messag…
Oct 14, 2026
08760fc
Friends' bots: full chat sessions, per-friend auto-accept, one sideba…
Oct 14, 2026
417c9f0
Friends' bots: keep remote chats on the relay route; @-mentions and m…
Oct 14, 2026
1e9a9a5
Tree: stop/report control messages, prompt refresh after removal, ser…
Oct 14, 2026
59637e2
Untrusted fences cannot be escaped; remote names sanitized (Fixes #9)
Oct 14, 2026
bdfb5b3
Social inbox: per-event cursor, persisted, deduped, single-flight; de…
Oct 14, 2026
f5e2594
Social files: refuse private/credential paths and unknown types, alwa…
Oct 14, 2026
87f4b37
Social identity: credentials bound to server, explicit token wins, Un…
Oct 14, 2026
d71ae1b
Approvals: approve resumes the chain after the holder, failed sends v…
Oct 14, 2026
c9b32cf
Mentions: friends' Bots matched by the shared @ rule (code, links, qu…
Oct 14, 2026
e05a658
Read-only host: FlyBot and plugin query endpoints served, social poll…
Oct 14, 2026
d272186
ctx.flybot: change epoch survives host restarts, listeners get copies…
Oct 14, 2026
38d465d
FlyBot client: error boundary per plugin slot, approval copy through …
Oct 14, 2026
378e3a6
Friends' Bots sidebar: per-home groups drawn with ds-bot's Bot row (g…
Oct 14, 2026
9bd3723
Review nits: stale flybot.js refs, dead flybotSendUserMentions, appro…
Oct 14, 2026
0d31b00
ctx.flybot tools: visibleTo also removes the tool from a Bot's tool l…
Oct 14, 2026
aedce82
Docs: FlyBot sections in README.zh.md mirror README.md, incl. install…
Oct 14, 2026
fb0831b
tree: #6 and #20 tree items from recursive-bot (flybot-tree 5631cbc)
Oct 14, 2026
5fe15ab
client: friends' Bots never get the lost-model picker
Oct 14, 2026
ee92675
client: inbound friend chats read like a two-party chat
Oct 14, 2026
f422006
client: sidebar preview drops the one-line trace; a lone arrow line s…
Oct 14, 2026
487f235
tree: trace line only when relaying down the tree, not in replies to …
Oct 14, 2026
36f269c
fix(remote-chat): don't drop typed text when a time-context snapshot …
Oct 14, 2026
3f73992
invites: "Copy invite link" copies only the URL; new "Copy invite wit…
Oct 14, 2026
f1bab9b
Merge pull request #22 from Birfy/flybot-plugins
Birfy Oct 14, 2026
2d6aeca
Add .gitattributes: LF line endings everywhere, so Windows CI checkou…
Oct 14, 2026
a256b46
fix(social): never let two local Bots share one Bot Social member ide…
Oct 14, 2026
c168f01
Merge pull request #24 from Birfy/fix-shared-member-identity
Birfy Oct 14, 2026
fd46187
ci: cache npm, allow manual runs, name the build check step
Oct 14, 2026
49d3a69
test: read flybot-slots.js with LF line endings, so the #19 check pas…
Oct 14, 2026
419b3c2
fix(social): apply Auto-accept's server auto-approve to friendships m…
Oct 14, 2026
414a49d
test(social): teardown retries removing the temp home while a plugin …
Oct 14, 2026
57cc2b5
Merge pull request #23 from Birfy/ci-workflows
Birfy Oct 14, 2026
f5e8bfc
fix(remote-chat): reopen a friend's Bot's chat right after it is deleted
Oct 14, 2026
4bbb2f3
Merge pull request #26 from Birfy/fix-stale-remote-chat
Birfy Oct 14, 2026
d09a378
fix(social): a friendship covers only the invited Bot and the Bot tha…
Birfy Oct 14, 2026
78625da
docs: rewrite README in English around installing FlyBot and its plugins
Oct 14, 2026
10a4da0
Brand all user-facing text as FlyBot
Oct 14, 2026
ea7d380
Merge pull request #25 from Birfy/scope-friend-to-invited-bot
Birfy Oct 14, 2026
de39258
ci: slim Test matrix to ubuntu Node 24 + DSH 0.2.0-rc.2
hsliuustc0106 Oct 14, 2026
6d8149d
Point repository links and the update check at ThinkFlowLab/FlyBot
Oct 14, 2026
c0507e1
ci: CI modeled on yetone/magpie, on top of the slim PR gate (#31)
Birfy Oct 14, 2026
d8d09a8
New FlyBot logo and fresh screenshots of the current web UI
Oct 14, 2026
ca74a84
README.zh: use the new English screenshots
Oct 14, 2026
88c3b62
Restore ds-bot/ to main: keep the core identical to upstream (#33, #34)
Oct 14, 2026
8d1c914
docs: Magpie-style LESSONS, code-standards, and review skill (#28)
hsliuustc0106 Oct 14, 2026
17c7de5
ci: slim Test matrix to ubuntu Node 24 + DSH 0.2.0-rc.2 (#31)
hsliuustc0106 Oct 14, 2026
a7868fc
ci: Compatibility nightly + local Mac CI (cost-reduced) (#35)
hsliuustc0106 Oct 14, 2026
97956aa
Merge remote-tracking branch 'upstream/main' into ci-magpie
hsliuustc0106 Oct 14, 2026
318eab9
Merge pull request #29 from Birfy/ci-magpie
Birfy Oct 14, 2026
7702c03
Merge remote-tracking branch 'tf/main' into branding-readme
Oct 14, 2026
1360a63
Pin pristine upstream ds-bot and apply FlyBot's core changes as an or…
Oct 14, 2026
88dff5a
build(deps): bump the github-actions group with 2 updates
dependabot[bot] Oct 14, 2026
e1f71f9
Merge pull request #36 from ThinkFlowLab/dependabot/github_actions/gi…
Birfy Oct 14, 2026
5f8167f
Merge pull request #27 from Birfy/branding-readme
Birfy Oct 14, 2026
5a10f65
Merge remote-tracking branch 'tf/main' into ds-bot-pin
Oct 14, 2026
40dd919
ci: turn off CodeQL (remove the workflow added in #29)
Oct 14, 2026
253b2f9
Merge pull request #38 from Birfy/no-codeql
Birfy Oct 14, 2026
f12e52f
Merge remote-tracking branch 'tf/main' into ds-bot-pin
Oct 14, 2026
2ba176f
Merge pull request #37 from Birfy/ds-bot-pin
Birfy Oct 14, 2026
76bc623
tree: move @flybot/tree to repo-root plugins/tree on the pinned core;…
recursive-bot Oct 14, 2026
d9c8a97
Move social to plugins/social; per-plugin CI jobs (#34 PR 2)
Oct 14, 2026
67554b5
Merge pull request #40 from Birfy/plugins-decouple
Birfy Oct 14, 2026
2acbaa2
feat(core): install doctor for clean DSH plugin setup (#41)
hsliuustc0106 Oct 14, 2026
74bbc9a
docs: v0.1.0 FlyBot release-notes refresh (highlights-first) (#42)
hsliuustc0106 Oct 14, 2026
b608a61
ci: allow product tag v0.1.0 without bumping core package (#44)
hsliuustc0106 Oct 14, 2026
bebce7e
docs: Magpie-style architecture and subsystem docs (#45)
hsliuustc0106 Oct 14, 2026
bf7d1ce
Branding: Wingbot logo + wordmark, README hero and architecture (#43)
Birfy Oct 14, 2026
113a73b
docs: define team ownership and Chief collaboration boundaries (#59)
hsliuustc0106 Oct 14, 2026
dc62ef7
docs: link to Bot Social (self-hosted server for the social plugin)
Birfy Oct 14, 2026
c84d785
docs(social): link the self-hosted Bot Social server in the subsystem…
Birfy Oct 14, 2026
d1aa432
feat(identity): persist team members and owner-bound bots (#60)
hsliuustc0106 Oct 14, 2026
4b2f986
Merge pull request #61 from Birfy/link-bot-social
Birfy Oct 14, 2026
e913c0e
feat(auth): member sign-in and revocable invitations (#62)
hsliuustc0106 Oct 15, 2026
c617471
docs: README leads with tree + social, Quick Start, demo GIFs
Oct 15, 2026
c5ebbc0
Merge pull request #63 from Birfy/readme-features
Birfy Oct 15, 2026
f822243
feat(authz): scope bot resources and administration to their owner (#49)
Oct 15, 2026
a96d1a9
docs: complete social demo (add friend, held reply, approval, deliver…
Oct 15, 2026
f4299ce
Remote chat: skip agent-instructions and notice messages when finding…
Oct 15, 2026
c24ed98
docs: ds-bot-core invariant for remoteTurn context messages (#66)
Oct 15, 2026
30e661e
Merge pull request #65 from Birfy/readme-social-demo
Birfy Oct 15, 2026
a48fd86
Merge pull request #67 from Birfy/fix-remote-first-message
Birfy Oct 15, 2026
112d20b
Show pending Bot Social approvals in Friends' Bots
cursoragent Oct 15, 2026
2ed9c32
Merge pull request #70 from Birfy/cursor/pending-approval-cue-5abe
Birfy Oct 15, 2026
4788242
social: map Bot Social conversation pauses to an actionable error
Oct 15, 2026
d1d64c1
Render a remote mention's handle as the Bot display name (#71)
Oct 15, 2026
54d86b1
Merge pull request #64 from ThinkFlowLab/feat/owner-scoped-access-49
Birfy Oct 15, 2026
6184caf
Merge pull request #73 from ThinkFlowLab/social-paused-chat-72
Birfy Oct 15, 2026
bd4eba5
nameMentions: rewrite all handles in one pass (#71)
Oct 15, 2026
c2f1cf5
Merge pull request #74 from ThinkFlowLab/fix-71-remote-mention-render
hsliuustc0106 Oct 15, 2026
a763683
Sanitize peer-controlled names in cleanRemote
cursoragent Oct 15, 2026
148f834
Show a friendly Friends' Bots state when social fails to start
cursoragent Oct 15, 2026
9711103
Note flybot.warn on the ds-bot-core diagnostics invariant
cursoragent Oct 15, 2026
7473790
Add the fix-issue skill: one issue end to end
Oct 15, 2026
b32b59b
Merge pull request #77 from Birfy/cursor/friends-bots-social-unavaila…
Birfy Oct 15, 2026
0dc6b59
feat(rooms): support human and Chief participants with attributed mes…
cursoragent Oct 15, 2026
26e2414
Merge pull request #78 from ThinkFlowLab/fix-issue-skill
hsliuustc0106 Oct 15, 2026
5e9eb0d
fix(authz): make owner-scoped access usable for the owner it scopes
Oct 15, 2026
52657b3
feat(rooms): add published friend Bots with per-viewer room display
cursoragent Oct 15, 2026
9034e9e
Merge pull request #82 from Birfy/cursor/rooms-human-chief-participan…
Birfy Oct 15, 2026
70a459c
Post a group receipt for @-mentions of a friend's Bot (#80, #81)
Oct 15, 2026
ccebfd3
Seed a remote Bot's default look with its handle (#84)
Oct 15, 2026
aeaa342
Published Bots: only published Bots are reachable from outside (#51)
Birfy Oct 15, 2026
de0a19f
Merge origin/main into cursor/sanitize-cleanremote-names-cc89
Birfy Oct 15, 2026
3f957ec
Merge pull request #87 from Birfy/51-published-reach
Birfy Oct 15, 2026
ccc08c8
Merge origin/main into cursor/sanitize-cleanremote-names-cc89
Birfy Oct 15, 2026
c1a4ca4
Merge pull request #76 from Birfy/cursor/sanitize-cleanremote-names-cc89
Birfy Oct 15, 2026
bb186f7
Merge origin/main into fix/owner-scoped-access-49-followups
Birfy Oct 15, 2026
db2ac68
Merge pull request #79 from ThinkFlowLab/fix/owner-scoped-access-49-f…
Birfy Oct 15, 2026
901e521
Merge origin/main into fix-84-remote-bot-look
Birfy Oct 15, 2026
9aa3f53
Merge pull request #85 from ThinkFlowLab/fix-84-remote-bot-look
Birfy Oct 15, 2026
9c990dd
Merge origin/main into mention-receipt-80-81
Birfy Oct 15, 2026
e3bb869
Merge pull request #86 from ThinkFlowLab/mention-receipt-80-81
Birfy Oct 15, 2026
4f5f6d1
feat(social): join a face-to-face room by a 6-digit number
cursoragent Oct 15, 2026
5f332c5
feat(social): one-click auto-send for face-to-face room messages
cursoragent Oct 15, 2026
1ae6681
feat(social): Published to friends toggle for set-published (#51)
cursoragent Oct 15, 2026
cd383ab
i18n: Chinese copy for face-room auto-send strings
cursoragent Oct 15, 2026
4724819
Merge pull request #88 from Birfy/cursor/face-to-face-group-35e7
Birfy Oct 15, 2026
a9e87a6
Register unpublished Bots at face-to-face join
cursoragent Oct 15, 2026
9e6e121
Merge pull request #89 from Birfy/cursor/face-room-auto-register-cf0e
Birfy Oct 15, 2026
cf8e590
Replace published with independent per-Bot grants
cursoragent Oct 15, 2026
811df19
Merge pull request #91 from Birfy/cursor/remove-friend-bot-inchat-app…
Birfy Oct 15, 2026
93a7782
Make Remove this Bot optimistic and compact
cursoragent Oct 15, 2026
4602881
Merge pull request #93 from Birfy/cursor/remove-bot-polish-2176
Birfy Oct 15, 2026
755a6c5
chore: AGENTS.md pipeline contract and npm run verify (#95)
Birfy Oct 15, 2026
d2f0c4b
Face-to-face group: + Add entry, pick Bots, live joined roster, Enter…
Birfy Oct 15, 2026
14da241
Face-to-face in the sidebar +, removed Bots stay gone, faster Friends…
Birfy Oct 15, 2026
1736161
Add autonomous-dev Phase 0: agent-task form, labels, PR template, rep…
Birfy Oct 15, 2026
9c8b446
Conflict-proof the generated patches, CHANGELOG and core docs (Phase …
Birfy Oct 15, 2026
c39e68c
Add merge_group trigger to Test so a merge queue can be enabled later…
Birfy Oct 15, 2026
b4ac22d
Add a label-only controller, dry run by default (Phase 1, PR C) (#105)
Birfy Oct 15, 2026
edc66db
Face-to-face: per-Bot avatars and a tile-grid waiting room (#107)
Birfy Oct 15, 2026
4ac0360
Show FlyBot branding in the web UI (header, About, settings, update p…
Birfy Oct 15, 2026
40d1164
Face-to-face: Auto-send setting over MCP, friend Bot avatars (#109)
Birfy Oct 15, 2026
4b26974
feat(approvals): bind delegated requests and decisions to the owning …
hsliuustc0106 Oct 15, 2026
8479441
feat(context): enforce explicit context sharing across owners (#53) (…
hsliuustc0106 Oct 15, 2026
7f5f69e
Rooms: show a group to the owner of a friend's Bot added to it (inbou…
Birfy Oct 16, 2026
0ae2446
Sidebar tree: bigger collapse chevron and hit target (#113)
Birfy Oct 16, 2026
28ca0a6
Approve held replies in the open chat; compact Friends' Bots panels; …
Birfy Oct 16, 2026
b24a3ec
docs(tree): allow non-Main tree Bots to create children (#16 Option B…
Birfy Oct 16, 2026
87c6940
fix(social): Face-to-face card, join and messages across two instance…
Birfy Oct 16, 2026
4d15d03
fix(security): fence a friend's Bot's lines in every shared room (#98…
Birfy Oct 16, 2026
b6e658c
feat(tasks): track handoffs and requester acceptance (#54) (#121)
Birfy Oct 16, 2026
e884312
fix(social): face-to-face tile UI, message sync and simpler + menu (#…
Birfy Oct 16, 2026
649bebe
fix(social): face-room poll empty handle and approval notice delivery…
Birfy Oct 16, 2026
2f2740e
Fix chat previews, human names, friendly errors, and the + menu
cursoragent Oct 16, 2026
af5af0d
Fix Face-to-face past rooms, titles, + actions, and live poll
cursoragent Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
64 changes: 64 additions & 0 deletions .claude/skills/fix-issue/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
---
name: fix-issue
description: Fix one FlyBot issue end to end — establish the facts, worktree, fail-without-change test, gates, PR, independent review loop, merge on green. The Verifier stage is the review-pr skill.
---

# FlyBot fix-issue

One issue per branch, one worktree per issue. The loop: establish the facts → test red → fix → gates → PR → independent review → merge on green. Magpie-*style* habits for FlyBot; do not copy another product's docs. This skill grants **no merge authority by itself**: the maintainer merges, or explicitly delegates for one instance.

## 0. Establish the work

1. `git fetch origin`, then read the **current** rules from `origin/main`: [AGENTS.md](../../../AGENTS.md), [docs/code-standards.md](../../../docs/code-standards.md), [LESSONS.md](../../../LESSONS.md), [CONTRIBUTING.md](../../../CONTRIBUTING.md) — not stale local copies.
2. Turn the report into observable facts before touching code. For a screenshot: crop the regions and read the exact strings. If no issue exists yet, file it first (see *Filing* below) and reference the umbrella it belongs to (#9 fences/display names, #5 social).
3. Confirm scope: one issue, or one tightly coupled pair (code-standards, Tiny loops). Reproduce or locate the defect in code; cite `file:line` in the PR.

## 1. Worktree and environment

- `git worktree add /tmp/flybot-<issue> -b fix-<issue>-<slug> origin/main`.
- `npm ci` in `core/` (build tool only). Unit tests load `@deepseek-ai/*` from `DSH_HARNESS` or `core/dev/harness/node_modules`; a fresh worktree has neither, and the resolver's git fallback can land on a repo-root harness checkout that misses packages — `at-menu`/`time-context` failures mean this, not your diff. Symlink an installed `dev/harness/node_modules` or set `DSH_HARNESS`.
- `git push` over HTTPS may time out while `gh api` works; push via the SSH URL (`git push git@github.com:ThinkFlowLab/FlyBot.git <branch>`).

## 2. Implement (fail without change)

1. Write the regression test **first** and run it red on the unbroken tip. Keep both halves of the evidence — red at base, green at the tip — a reviewer re-verifies this mechanically.
2. Fix the class, not the sample (code-standards). Respect the trust boundaries (#9): peer-controlled strings never become trusted or model-visible text; display names come from local records, never from message text.
3. Keep the host untouched when the defect is display-only — a client-only change skips the smoke gate.
4. Tests are flat `node:test` blocks like the neighbors; assertion helpers are local to each test file. User-facing strings are English with a `ZH` entry in `core/src/client/i18n.js` (the i18n test scans for missing keys).

## 3. Gates (every one, at the tip you will link)

```sh
npm run build # core/client.js from src/client
npm test # unit tests; fails if client.js is stale
node scripts/build-client.mjs --check
npm run lint # oxlint, then arch-docs
node scripts/ds-bot-patches.mjs generate && node scripts/ds-bot-patches.mjs check
```

- An owned file ([docs/subsystems/](../../../docs/subsystems/README.md)) changed → update that subsystem doc in the same PR; `Docs-not-needed:` only when the doc truly says nothing about the change.
- An upstream file (one that `ds-bot/` has) edited in `core/` for the first time must join a topic in `patches/ds-bot/topics.json` before `generate`. A new file needs no entry; `generate` stores it whole in `patches/ds-bot/files/`.
- Compare lint warnings against base: new warnings are findings.
- `index.js`/`src/host/` changes → run the smoke test as well.

## 4. PR

- Subject: imperative; the reason in the body; `Fixes #N` on its own line.
- A Verification section per Verifier honesty: tip SHA, each gate with **real numbers**, Not run with reasons.
- A reviewer note for environment traps (e.g. the worktree harness symlink above).

## 5. Independent review loop

1. A **separate agent with fresh context** reviews the PR tip following [review-pr](../review-pr/SKILL.md): it re-runs the gates itself and re-verifies red-at-base mechanically (worktree at base + only the test files copied in). The implementer's claims are narrative, not evidence.
2. Findings → fix the class, add the test, push. **A tip advance voids the previous PASS** — the reviewer re-reviews the delta and re-runs the gates at the new tip.
3. A non-blocking note whose root cause lies outside the diff becomes a follow-up issue immediately (security ones into the #9 queue), not a comment lost in the PR.

## 6. Merge and cleanup

- Merge only when all hold **on the same tip**: review PASS (and implementer↔reviewer agreement, or a maintainer waiver of one side), required checks green, maintainer's go. Tip moved → start over from the review.
- Then: fetch and fast-forward main, delete the branch locally and remotely, remove the worktree, and carry follow-up issues (not TODOs).

## Filing (before the fix)

- `gh` cannot attach images to issues and gists reject binaries: push the screenshot to the `issue-assets` branch and embed the `raw.githubusercontent.com/ThinkFlowLab/FlyBot/<commit-sha>/<file>` URL in the issue body.
- Issue shape (matches recent issues): Environment / Steps to reproduce / Actual / Expected / Where it sits (`file:line` pointers) / Suggested direction (for discussion, not prescriptive).
98 changes: 98 additions & 0 deletions .claude/skills/review-pr/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
---
name: review-pr
description: Review a FlyBot change or PR with Magpie-style Verifier honesty. Report PASS, FAIL, or INC at a tip SHA; check OpenCode↔Codex agreement and security fence / display-name rules.
---

# FlyBot review-pr

Use for local or PR tip reviews on `ThinkFlowLab/FlyBot`. Produce a Verifier report only. This skill does **not** authorize push, approve, merge, or posting a GitHub review unless a human explicitly asked for that action.

## Establish the tip

1. Confirm repo identity (`ThinkFlowLab/FlyBot` or the agreed fork) and the commit under review.
2. Record **tip SHA** (`git rev-parse HEAD` or the PR head SHA). If the tip moves, re-run from scratch.
3. Load the **latest rules from `origin/main`** before each review: `git fetch origin && git show origin/main:.claude/skills/review-pr/SKILL.md` (and the same for `docs/code-standards.md` / `AGENTS.md` if the local tree is behind). Prefer the fetched rules over a stale local copy.
4. Read [LESSONS.md](../../../LESSONS.md), [docs/code-standards.md](../../../docs/code-standards.md), [AGENTS.md](../../../AGENTS.md), and the hard rules in [CONTRIBUTING.md](../../../CONTRIBUTING.md).
5. Inventory changed files vs the merge base. Do not treat author narrative as evidence.

## Architecture docs / owned paths (FAIL gate)

- Subsystem pages under `docs/subsystems/` declare `owned_paths` (longest match wins).
- **FAIL** if any file matching an `owned_paths` entry changed without a corresponding subsystem doc update in the same PR, unless the commit message carries a `Docs-not-needed:` trailer (or the arch-doc check is otherwise green).
- Do not invent a `Docs-not-needed:` excuse for security, fence, or API-contract changes that change behavior documented in a subsystem page.

## Verdicts

| Verdict | Meaning |
|---|---|
| **PASS** | No actionable findings for the scoped risk; required checks you claim were **run at this tip** and green; OpenCode and Codex **agree** on this tip when both participated. |
| **FAIL** | Actionable defect (correctness, security, DSH hard-rule break, missing fail-without-change test for a claimed fix, dishonest claim). |
| **INC** | Incomplete evidence: material checks **not run**, tip moved, only one side of OpenCode↔Codex finished, or scope unclear. INC is not PASS. |

## Magpie-style Verifier lines (required in the report)

Always include:

```text
Tip SHA: <full or 12+ hex>
Ran:
- <command> → pass|fail
- …
Not run:
- <check> — reason
OpenCode↔Codex: agree PASS | disagree | only OpenCode | only Codex | n/a
Verdict: PASS | FAIL | INC
```

Honesty rules:

- List what **you** ran at this tip. Stale CI on another SHA is not “Ran”.
- Explicit **Not run** for smoke, Desktop, real-model steward, etc., when relevant.
- No “secure / fixed / ready” without the matching tests or an INC/FAIL.

## Security fence / display-name checks

For any change that touches delivery, social, fencing, or model-visible remote text (especially issues #9 / #10 / related):

1. **Fence escape:** closing markers must not reconstitute after stripping (nested `</untrusted-…>` patterns). Cover message and file fences.
2. **Shared helper:** prefer one neutralization path shared with the client parser; reject one-shot `replaceAll` as sufficient.
3. **Display names / handles / file names:** sanitized (no raw newlines/controls; length-capped) before trusted headers; fenced when they remain model-visible.
4. **Tests:** fail-without-change negative tests for reconstitution and forged headers. Absence of tests for a claimed security fix → **FAIL** or **INC**, never PASS.
5. Cross-check open LESSONS entries dated for fences / claim honesty.

## OpenCode ↔ Codex agreement

When the iteration loop is in use:

- **PASS** only if both sides report PASS on the **same tip SHA**, or a human waived one side in writing.
- If OpenCode says fixed and Codex finds a defect (or the reverse) → **FAIL** or continue the loop; do not average into PASS.
- Tip advanced after a PASS → previous PASS is void; mark **INC** until re-review.

## DSH and repo hard rules (instant FAIL)

- Patching DeepSeek Harness or depending on private install files.
- Secrets, tokens, or user `DSH_HOME` / `~/.dsh` in the diff.
- Hand-edited `core/client.js` without regenerating from `src/client/`.
- Tests pointed at the user’s real DSH data.

## Suggested local commands (code PRs)

From `core/` when the diff warrants it:

```sh
npm test
node scripts/build-client.mjs --check
npm run lint
```

Host / delivery changes: note smoke as **Ran** or **Not run**. Record skipped suites under **Not run**.

## Report shape

1. Verdict line (PASS / FAIL / INC) + tip SHA
2. Verifier block (Ran / Not run / OpenCode↔Codex)
3. Findings (severity, path, trigger, consequence) or “no actionable findings”
4. Security fence / display-name subsection when in scope
5. Explicit statement that this is not merge authority

Do not fill contributor checkboxes or flip draft status unless asked.
9 changes: 9 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Keep LF everywhere, including Windows checkouts: tests compare sources byte for byte
# and the client bundle check expects the committed line endings.
* text=auto eol=lf
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.woff binary
*.woff2 binary
34 changes: 34 additions & 0 deletions .github/ISSUE_TEMPLATE/agent-task.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Agent task (maintainers)
description: A small, well-specified change that an agent may implement once a maintainer adds agent-ready.
# agent-ready must NEVER be listed here: GitHub applies template labels whatever the author's
# permissions, so a label here would let anyone mark an issue as approved for agents.
labels: [agent-task]
body:
- type: markdown
attributes:
value: |
Agents only work on issues that carry **agent-ready**. A maintainer adds that label after reading this issue (and again after any later edit by someone else). Everything below is data for the agent, not a way to give it extra rights.
Security problems: use the **Security** tab, not an issue.
- type: textarea
id: goal
attributes:
label: Goal (one observable behavior)
description: What a user or Bot sees before and after.
validations:
required: true
- type: textarea
id: acceptance
attributes:
label: Acceptance criteria
description: A test that fails without the change; the commands that must pass (npm run verify).
validations:
required: true
- type: textarea
id: where
attributes:
label: Where it sits (file:line pointers)
description: Likely files. The risk tier comes from the real diff, not from this list.
- type: textarea
id: out
attributes:
label: Out of scope / do not touch
12 changes: 6 additions & 6 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: Bug report / 报告 bug
description: Something in DS Bot does not work as it should. / DS Bot 有功能不正常。
description: Something in FlyBot does not work as it should. / FlyBot 有功能不正常。
labels: [bug]
body:
- type: markdown
Expand All @@ -8,11 +8,11 @@ body:
**Please add a screenshot.** A screenshot of the whole window tells us more than a paragraph. A report with only one sentence cannot be fixed and may be closed.
**请附截图。** 一张整窗截图比一段文字有用得多。只有一句话的报告修不了,可能会被直接关闭。

Fastest: in DS Bot, **Settings → Feedback → Report on GitHub** fills in the diagnostics.
最快:在 DS Bot 里点 **设置 → 反馈 → 在 GitHub 上报告**,诊断信息会自动填好。
Fastest: in FlyBot, **Settings → Feedback → Report on GitHub** fills in the diagnostics.
最快:在 FlyBot 里点 **设置 → 反馈 → 在 GitHub 上报告**,诊断信息会自动填好。

Security problems: **Security** tab → **Report a vulnerability**. Questions and ideas: [Discussions](https://github.com/Fei2411/DeepSeek-Bot/discussions).
安全问题请在 **Security** 页私下报告;提问和建议请发到 [Discussions](https://github.com/Fei2411/DeepSeek-Bot/discussions)。
Security problems: **Security** tab → **Report a vulnerability**. Questions and ideas: [Discussions](https://github.com/ThinkFlowLab/FlyBot/discussions).
安全问题请在 **Security** 页私下报告;提问和建议请发到 [Discussions](https://github.com/ThinkFlowLab/FlyBot/discussions)。
- type: textarea
id: what
attributes:
Expand All @@ -39,7 +39,7 @@ body:
id: diagnostics
attributes:
label: Diagnostics / 诊断信息
description: In DS Bot, Settings → Feedback → Copy, then paste here. / 在 DS Bot 里点 设置 → 反馈 → 复制,粘贴到这里。
description: In FlyBot, Settings → Feedback → Copy, then paste here. / 在 FlyBot 里点 设置 → 反馈 → 复制,粘贴到这里。
validations:
required: true
- type: checkboxes
Expand Down
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Questions & help
url: https://github.com/Fei2411/DeepSeek-Bot/discussions/new?category=q-a
url: https://github.com/ThinkFlowLab/FlyBot/discussions/new?category=q-a
about: Installation, setup and usage questions — ask in Discussions, not Issues.
- name: Feature requests & ideas
url: https://github.com/Fei2411/DeepSeek-Bot/discussions/new?category=ideas
url: https://github.com/ThinkFlowLab/FlyBot/discussions/new?category=ideas
about: Suggest features and discuss anything that is not a bug — in Discussions.
119 changes: 119 additions & 0 deletions .github/actions/flybot-tests/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
name: FlyBot tests
description: >-
Node, npm ci, the DSH harness, lint, the client bundle check and core's (ds-bot) suite
(optionally as a coverage run), plus the peer plugin suites under plugins/ unless
plugins is 'false'. Test (the PR gate) runs core here and each plugin in its own
`plugins (<name>)` job; the Compatibility legs (nightly.yml) can use it for everything.
inputs:
node:
description: Node.js version
required: true
dsh:
description: DSH (@deepseek-ai/dsh) version for the harness
required: true
coverage:
description: "'true': run all suites in one coverage run and upload lcov"
required: false
default: 'false'
plugins:
description: "'false': core only (the plugins/* suites run elsewhere)"
required: false
default: 'true'
runs:
using: composite
steps:
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: ${{ inputs.node }}
cache: npm
cache-dependency-path: core/package-lock.json
# The job-level timeout-minutes bounds a stuck registry (composite steps take none).
- name: npm ci
shell: bash
working-directory: core
run: npm ci --no-fund --no-audit
- name: Install DSH
shell: bash
working-directory: core
env:
DSH: ${{ inputs.dsh }}
run: npm run harness -- --no-save "@deepseek-ai/dsh@$DSH"
- name: Fetch origin/main for arch-docs check
shell: bash
run: |
set -euo pipefail
git fetch --no-tags --depth=1 origin main:refs/remotes/origin/main
for n in 50 200 1000 5000; do
if git merge-base origin/main HEAD >/dev/null 2>&1; then
break
fi
git fetch --no-tags --deepen="$n" origin main 2>/dev/null || true
git fetch --no-tags --deepen="$n" origin HEAD 2>/dev/null || true
done
if ! git merge-base origin/main HEAD >/dev/null 2>&1; then
git fetch --unshallow 2>/dev/null || git fetch --no-tags origin main
fi
git merge-base origin/main HEAD >/dev/null
git rev-parse --verify origin/main^{commit}
# Lint and the bundle check first: a slip fails in seconds instead of after the suite.
- name: Lint
shell: bash
working-directory: core
run: npm run lint
- name: Build (client bundle is up to date)
shell: bash
working-directory: core
run: node scripts/build-client.mjs --check
# Core's suite (incl. bot-tree: the public flybot.sidebar.structure slot), then each peer
# plugin's own suite and lint (plugins/social, plugins/tree; each also tests against core/).
- name: Unit tests
if: inputs.coverage != 'true'
shell: bash
working-directory: core
run: npm test
- name: Plugin lint
if: inputs.plugins != 'false'
shell: bash
run: node scripts/lint-plugins.mjs
- name: Plugin tests (social)
if: inputs.plugins != 'false'
shell: bash
working-directory: plugins/social
env:
DSH_HARNESS: ${{ github.workspace }}/core/dev/harness
run: npm test
- name: Plugin tests (tree)
if: inputs.plugins != 'false'
shell: bash
working-directory: plugins/tree
env:
DSH_HARNESS: ${{ github.workspace }}/core/dev/harness
run: npm test
# Core's suite as a coverage run (each plugin runs its own suite).
- name: Unit tests with coverage
if: inputs.coverage == 'true'
shell: bash
working-directory: core
env:
NODE_V: ${{ inputs.node }}
DSH: ${{ inputs.dsh }}
run: |
set -o pipefail
node --import ./test/harness-resolve.mjs --test --experimental-test-coverage \
--test-reporter=spec --test-reporter-destination=stdout \
--test-reporter=lcov --test-reporter-destination=lcov.info \
"test/*.test.js" | tee test-output.txt
{
echo "### Coverage: core (ds-bot) (Node $NODE_V, DSH $DSH)"
echo '```'
grep -E 'file +\| line %|all files' test-output.txt | sed 's/^ℹ //' | head -2
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
- name: Upload coverage
if: always() && inputs.coverage == 'true'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: coverage-lcov
path: core/lcov.info
if-no-files-found: ignore
retention-days: 14
9 changes: 9 additions & 0 deletions .github/agent/controller.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"note": "Read by .github/scripts/controller.mjs from the default branch. Editing this file is T3. Maintainers listed here are the only people whose edits keep an issue agent-ready.",
"maintainers": ["Birfy", "hsliuustc0106"],
"agentBranchPrefixes": ["agent/"],
"agentAuthors": [],
"claimTtlHours": 6,
"maxPrsPerRun": 50,
"maxIssuesPerRun": 50
}
Loading
Loading