import type { PluginManifest } from '@@/plugins/manifest'; /** * Kanban — a board over a folder of markdown files. * * ── What it was ── * * `/todos` in the platform: a board, an API and a tree reader, all pointed at * `resolve(process.cwd(), 'todo')` — the platform's own todo folder, found by assuming the server's * working directory. It worked, for exactly one project, on exactly one checkout. * * ── What changed in the extraction ── * * One thing, and everything else was carried across untouched: **the directory is a setting**. A * project is a name and a path, there can be as many as you like, and the board asks which one you are * looking at. The frontmatter reader that never rewrites a body, the ordering, the generated index — * all of it came over as it was, and its tests came with it and still pass. * * ── It stores no items ── * * The files on disk are the truth. This plugin's only table is a list of folders, so uninstalling it * with "delete its data" ticked loses the list and never a line of anybody's work. That is the same * property the markdown format was chosen for: readable, diffable and editable without Officer. * * ── What stayed in the platform, and why it is a seam rather than a loose end ── * * `scripts/todo-index.ts` and the platform's own `todo/` folder. That folder is the platform's own * content — its deferred work, in its own repository, committed with its own code — and the CLI is how * it is regenerated from a terminal with no Officer running. Moving either would have made the * platform's own backlog depend on a plugin being installed. * * So the platform keeps its folder; this plugin points AT it as one project among however many. */ export const manifest: PluginManifest = { publisher: 'officerdev', version: '2026.08.29.02', platform: '>=1.0.0', label: 'Kanban', summary: 'A board over folders of markdown todo files — as many projects as you point it at', tags: ['Development'], icon: 'SquareKanban', color: '#8b5cf6', // Nothing to declare. It reads and writes markdown with node's own fs; there is no binary on the // path and no service to reach. permissions: [ { key: 'kanban', label: 'Kanban', description: 'Read and edit todo boards over folders you have added', /* Which FOLDERS exist on the machine is an owner's decision; moving a card is not. Adding a project points this plugin at a directory and is therefore a statement about the filesystem — the same class of decision as av-club's root location. Prefix-matched, so `/projects/` is covered by the same rule as `/projects`. */ ownerOnly: ['/projects'], }, ], };