DRU-387 - Local issue tracker - #476
Open
chaosk wants to merge 15 commits into
Open
Conversation
…410) * Add Software Factory's local board: issues projects, tickets, and comments. Co-authored-by: Cursor <cursoragent@cursor.com> * Point the issues tables revision at main's migration head. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
chaosk
force-pushed
the
integration/issues
branch
from
September 8, 2026 03:44
81d1db6 to
ce2de3f
Compare
* Issue board doors: create, move, edit, and comment on a ticket. Co-authored-by: Cursor <cursoragent@cursor.com> * Assign tickets to any real account; main no longer has a system actor. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
…Factory (#414) * Issue board, list, and ticket pages, mounted from Software Factory. Co-authored-by: Cursor <cursoragent@cursor.com> * Use Account.list_all for assignee options after the default-account model. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
Selecting druks needs no Service identity: status writes go through Ticket.transition and the existing funnel opens the build. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
…tch and comment (#420) * Ship the appliance /mcp into issues builds so agents can fetch and comment. Linear comments go through tracker MCP in the sandbox; when the tracker is the local board, that server is this process, named druks and credentialed with a run PAT. Co-authored-by: Cursor <cursoragent@cursor.com> * Use the run account or the default account after the system actor was removed. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
Card.link wraps the panel when there are no controls, so Open is no longer a second way onto the ticket. Co-authored-by: Cursor <cursoragent@cursor.com>
* Make the ticket page save in place. Title, description, and properties sit like a Linear issue; creating already in Ready for Agent is the same transition as moving there. Co-authored-by: Cursor <cursoragent@cursor.com> * Type live form fixtures as forms, not as Block. Spreading a Block union made submit look like a Link field, which tsc -b refused. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
* Let tickets select a GitHub repo instead of a second project table. Prefix lives on the GitHub Project; the operator picks the ProjectRepo the pull request will target. Co-authored-by: Cursor <cursoragent@cursor.com> * Retarget issues MCP tests after tickets bind to a repo. The create-ticket-project tool is gone; minting uses the GitHub project's prefix. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
The wire value stays a markdown string; Tiptap renders it in place so the operator writes the same source they read. Co-authored-by: Cursor <cursoragent@cursor.com>
start() returns the parked run without publishing, so the ticket stayed Ready for Agent while the work was already in review. Co-authored-by: Cursor <cursoragent@cursor.com>
The contract names the Druks MCP get-ticket tool so the agent reads the board ticket it was given. Co-authored-by: Cursor <cursoragent@cursor.com>
…ior. (#479) The tracker is druks on this appliance, not a separate Issues app, and builds fetch the ticket from /mcp. Co-authored-by: Cursor <cursoragent@cursor.com>
Identifier and Title are 32px links; Priority and Assignee inherited a 20px line and sat lower. Co-authored-by: Cursor <cursoragent@cursor.com>
Created and Updated were already facts; Created by was missing, so the row's creator_id never reached the page. Co-authored-by: Cursor <cursoragent@cursor.com>
The ticket page already moved work through set_status. The board now uses that same door, so a drop cannot open a second write path. While dragging, the shell previews the landing column and commits that column, not whichever neighbor sits under the pointer after layout shifts. Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linear ticket: DRU-387
A ticket tracker that lives in this appliance. Software Factory can use it instead of Linear or Jira. There is nothing to paste in Settings → Services. Selecting tracker
issues(the select shows druks) is the whole connect.This is Software Factory, not a second bundled app and not a Service card. There is no
issuesentry point and noalembic_version_issues.What the operator gets
/software_factory/boardand list/software_factory/list. Overview stays the React home.{project.prefix}-{n}(for exampleBOX-3). Title, markdown description, status, priority, optional assignee, comments.Projectthat repo sits in. Moving a ticket to another repo does not remint the identifier.set_status.How a build starts
ticket.transitionedstill feedsBuild.dispatch. The in-processIssuesTrackerwrites status back onto the ticket row. No webhook, no Service identity.Ready for Agent opens a build against the selected repo. If that ticket already has a scheduled, running, or parked build, dispatch mirrors the ticket onto that run (In Review when parked on review, otherwise In Progress) instead of starting a second one.
When the tracker is
issues, the sandbox also gets this appliance’s/mcpasdruks, credentialed with a run PAT, so the agent fetches and comments withsoftware_factory_get_ticket/software_factory_add_comment. Prompts treat a Druks identifier like Linear/Jira, not as a GitHub issue number.Out of scope
Comment edit/delete, attachments, labels, estimates, Linear import, a standalone Issues app.
Tickets (all landed on
integration/issues)issues/mcpin issues buildsIssuesProject)Risk
Alembic revisions for
issues_*tables, thenprojects.prefix/ticket_seqandissues_tickets.repo_id. Unreleased stack: existing local tickets were not migrated; they are dropped rather than mapped.Replay: Ready for Agent on a live run does not start a second workflow. Merge is still an external GitHub fact, not inferred from run lifecycle.
Verification
uv run ruff check backenduv run ruff format --check backenduv pip install -e backend/tests/druks-field_notesuv run pytest backend/npm --prefix frontend run lintnpm --prefix frontend testnpm --prefix frontend run buildissueslabeled druks; no Services paste. Doctor is ok.{prefix}-1.issues, the sandbox cansoftware_factory_get_ticketforBOX-3and does not treat it as GitHub issue Subject keying rides DBOS workflow attributes; durable_runs shrinks #3.Made with Cursor