moooon
Motir
Vibe the project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.
- Vibe Project
- Open Source
- AI Agent
- AI Loop
- 6
- requests
- 4
- upvotes
- 486
- planned
- 5,026
- shipped
- (motir-core · design) Access at the project, drawn — the Access & members page's three access modes and its people list, the confirm that names who loses entry, the workspace Members page's Full / Limited scope column and invite scope, the access-change rows in the migration notice, and the shell a Limited person added to no project lands inRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core · verification) VERIFY the workspace-role release is SERVING on production before its fallback is removed — MOTIR-6168's three migrations applied, zero NULL `workspace_role`, the report rows the deploy log counted, and the running image carrying the resolver changeRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-ai) The planner's validate tools drop `crossLevelEdges`, so a plan over a committed cross-level edge reads `valid: false` with no reason given
- (motir-core) `shared-store.test.ts`'s second store client takes the DEFAULT 250 ms deadline, so a loaded runner times it out: the store-timeout class MOTIR-2658 and MOTIR-3067 fixed, at a third site
- (motir-core · test) E2E + acceptance video — a Manager changes a Member to Viewer and the project goes read-only, authors a Reviewer role without the runs key and the Runs room closes, finds no role control in project settings, and reads the migration reportRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core · test) The workspace-roles integration gate — the changed surface topped up to the 90% floor, the role × project key matrix driven through the real resolver and routes against the real database, and the migration run over a fixture tenant with its report and its never-wider failureRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) The Roles pages move to workspace settings — list, detail, editor and New role under `/settings/workspace/roles` with a rail entry, the project Roles routes redirect there, and the project Members page loses its role column and controlsRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) The workspace Members page shows each person's role and lets a Manager change it — the role column and change-role control, read-only for everyone else, and the migration report's changed people with their reason shown to ManagersRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) Project roles stop being grants on the server — the project members service and API add and remove people only, a role in the request is refused, the project roles routes answer 410 naming the workspace Roles page, and the last-project-admin guard retiresRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) A Manager changes a member's workspace role — the service method, the route and the server action, Manager-only, the last Manager protected, a built-in or a workspace custom role assignable, and the new keys effective in every project at onceRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) Every reader of the old workspace role moves to the new one — the `isWorkspaceManager` sites and workspace-settings gates, workspace creation (creator = Manager) and invites (Member), the `findOwnerByWorkspace` stand-in principal and its 18 callers, and the seed scriptsRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) The migration's never-wider check — each person's key set per project before and after, compared inside the migration, which fails on any widening except the one the model decides (a workspace member gaining the Member set in a project they were never added to)Roles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) Custom roles live at the workspace — create from a Manager, Member or Viewer base, edit, and delete-with-reassign move from `projectRoleDefinitionService` to a workspace role service and `/api/workspaces/.../roles` routes, Manager-onlyRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) One resolver reads the workspace role — `resolvePermissions` takes the workspace role (or workspace custom role) and whether the person was added to the project, Manager / Member / Viewer sets replace the project role sets and the implicit member set, `isWorkspaceManager` means Manager, and `member-facing-permissions.md` is amendedRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) The role migration's mapping — every workspace membership given one workspace role by the DECISION's table, project custom roles re-created at their workspace, the NARROWEST role kept where a person's roles differed, and a report row for every person whose role changedRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) The workspace role storage, added beside the old — a `WorkspaceRole` enum (manager · member · viewer), `workspace_membership.workspace_role` + `role_definition_id`, a `workspace_role_definition` table and a `role_migration_report` table, with their RLS policies and repositoriesRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- Roles live on the WORKSPACE — Manager · Member · Viewer and workspace custom roles resolve every project's permissions, project roles retire, and every existing membership is migrated with a reportRoles & permissions, refined — org Owner · Admin · Member, ROLE on the workspace and ACCESS on the project, an automatic Visitor on public projects, and a UI that offers each role only what it can do
- (motir-core) A cross-level `blocked_by` is REFUSED at the link door (`CROSS_LEVEL_LINK`) when it should be ACCEPTED and reported by `validate_work_item` as INVALID ("blocked elsewhere"): the level rule is planning discipline, not a limit on what a dependency can express
- (motir-core) `findMalformedIntraPlanRefs`' ReDoS test is a 1-second wall-clock bound on a 2.6 MB input, and it goes red on a loaded CI runner (1013 ms) while the scan is linear (94 ms locally)
- (motir-ai) The drift guard's cache NOTICES are mostly false: it compares raw ratios against 6-dp-rounded rates, and reads "no write price" as disagreeing with a write rate equal to input — ~60 notices over the generated rates bury the one real disagreement