Skip to content

Project: no way to create or bind a Project in the UI, so the board is unreachable #1766

Closed

Description

@Birfy

Written-by: Chief

There is no way to create a Project, or to bind a Bot or a group to one, anywhere in the UI. The host has both endpoints; the client only ever reads. A fresh instance therefore has no Project record, #project answers “No Project here.”, and the Project board cannot be reached at all — which is what an owner hits right after upgrading.

What exists

  • Host: core/src/host/channel.js and core/src/host/store.js implement project-create / project-read / project-bind (core/src/host/authz.js guards them, see core: Project write endpoints accept any signed-in member — project-delete, project-memory and project-memory-write have no owner check #1740 for the current hole), and core/src/host/project-assistant.js consumes them. Tests: core/test/projects.test.js, core/test/project-assistant.test.js.
  • Client: core/src/client/project-board.js:155 is the only caller — await call('projects') — and the board itself is opened by the hash #project=<id> (same file, :130-151) or by the Tasks dialog button that exists only when the Bot/group already carries a projectId (core/src/client/kanban.js around :383-426). No client file calls project-create or project-bind (code search over core/src/client/ returns none).

Expected

  1. A Project can be created from Settings (a Projects page next to Bots / Group chats), with a name and an optional working folder.
  2. A Bot or a group can be bound to a Project from that page (and unbound), so the card boards and the board's rows resolve.
  3. The board is reachable from the same place — a Projects list where each row opens #project=<id>, not only from a URL the user has to know.
  4. A Project-less instance shows an actionable empty state ("No Project yet — create one") instead of a dead “No Project here.”.

Scope

  • core/src/client/: the settings page and the calls (projects, project-create, project-bind, project-read); reuse SetSection/SetRow so it matches the existing Settings pages (owner requirement: same visual language, no new one).
  • core/src/host/: only what the client needs to render — do not widen the write surface; core: Project write endpoints accept any signed-in member — project-delete, project-memory and project-memory-write have no owner check #1740 is the separate security fix for who may call it.
  • Tests: a client-side test that the page calls project-create and then lists the new Project, and one that binding a group makes its cards appear through project-board; plus a host test that a Project created through the channel is readable by project-read. The test must fail without the client wiring.

Acceptance

  • On a fresh instance: Settings → Projects → New Project → the Project appears in the list → its row opens a board that shows “No cards yet.” (not “No Project here.”).
  • Binding a group to it makes that group's cards show on the board; unbinding removes them.
  • No new npm dependency; npm run verify green; no change to the board's read-only contract.

Activity

  1. added
    bugSomething isn't working
    area:uiWeb/desktop UI and copy
    on Oct 30, 2026
  2. changed the title [-]There is no way to create a Project, or to bind a Bot or a group to one, anywhere in the UI. The host has both[/-] [+]Project: no way to create or bind a Project in the UI, so the board is unreachable[/+] on Oct 30, 2026
  3. Birfy commented on Oct 30, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Triage

    agent-ready — judged against live main 8252bce955f847b1ddeb49566635c3f8cd961bbc (read 2026-10-30T03:53Z), not against this body's line numbers. No hold, no assignee, and no open pull request names this issue: the four open PRs touch meetings.js (#1765), tasks.js/task-drive.js (#1745), store.js for the Project owner gate (#1743) and the retired-Bot paths (#1727); none touches core/src/client/project-board.js.

    The three conditions hold.

    Files

    • core/src/client/settings.js — SETTINGS_PAGES (:29) gets ['projects', 'Projects'], and SettingsDialog (:172-238) a ProjectsPage branch built from the module-private SetSection/SetRow (:32, :35), the same way the Bots and Group chats pages are built. A separate project-settings.js is fine too, as long as it receives Section/Row as props like SettingsPageSlot does.
    • core/src/client/project-board.js — the empty state in projectBoardView offers "create one" instead of the dead end, and a Projects row opens #project=<id> (today kanban.js is the only writer of that hash).
    • core/src/client/i18n.js — the new strings in English (plugin user-facing text is English).
    • core/src/host/store.js — workDir on createProject (:399); no new endpoint, no authz change. If PR fix(host): require the Project owner on delete, memory and assistant settings #1743 has landed when you branch, re-read store.js from the fetched tip — fix(host): require the Project owner on delete, memory and assistant settings #1743 is open on that file, so never build on a saved copy.
    • Tests: core/test/project-settings-page.test.js (new, client), core/test/project-board-view.test.js (the empty state), core/test/projects.test.js (the host round-trip).
    • Docs and changelog: docs/subsystems/core-client.md, the record line in docs/subsystems/core-host.md:211, and changelog.d/1766-projects-page.added.md.

    Red first — the client half is red at the base tip, because code search over core/src/client returns 0 hits for project-create and for project-bind:

    1. Render the page with a fake call that records every endpoint and answers projects: { projects: [] }; assert the empty state says there is no Project yet and offers to create one. Red today: the page does not exist.
    2. Submit a name plus a picked folder; assert project-create was called, then the list re-read and the new Project present. Also assert a refused create shows the host's message and adds no row.
    3. Bind and unbind: project-bind is called with { kind, id, projectId } for a group, and an unbind sends projectId: null; the page sends the picker's folder, never a typed path.
    4. Host guard in core/test/projects.test.js: a Project created through project-create with workDir reads back through project-read with that field, and a record written before the field exists still reads exactly as it did.

    Acceptance

    • cd core && node --import ./test/harness-resolve.mjs --test test/project-settings-page.test.js test/project-board-view.test.js test/projects.test.js — red first, green after.
    • npm run verify at the repo root with TZ=UTC, green.
    • On a fresh instance: Settings → Projects → New Project → the row appears and opens a board that says "No cards yet." (not "No Project here."); binding a group makes its cards show there and unbinding removes them.
    • Revert only the client wiring and step 1 must go red again — that is the test that keeps this from being a page nobody calls.

    Ordering. Land this before #1767 and #1768: all three touch the board files, and #1767's decision read needs workDir to exist.

  4. added
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    on Oct 30, 2026
  5. self-assigned this
    on Oct 30, 2026
  6. added
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Oct 30, 2026
  7. Birfy commented on Oct 30, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Dev

    Claimed #1766 — branch dev/1766-settings-projects-page. First step: the pure page/view shape (a ProjectsPage over SetSection/SetRow, project-board empty state) before the host field.

  8. removed
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Oct 30, 2026
  9. removed
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    on Oct 30, 2026
  10. added a commit that references this issue on Oct 30, 2026
    e20f8d1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:uiWeb/desktop UI and copybugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions