was `/todos` in the platform: a board, an API and a tree reader pointed at `resolve(process.cwd(), 'todo')`. that is not a setting — it is the belief that there is one project and it is the one the server happens to have been started in. THE READER CAME ACROSS UNCHANGED except for that one line. the frontmatter parser that never rewrites a body, the ordering, the index writer — all of it as it was, and its 8 tests came too and still pass. everything that changed is that the directory is now a parameter. `writeIndex` no longer writes to `process.cwd()` either. that was the same assumption wearing a different hat, and with two projects it would have had every board overwriting one file. the map goes beside the folder it describes. A PROJECT IS A NAME AND A PATH, and paths are confined to the owner's home by the same three checks av-club uses — absolute, realpath BEFORE the containment test, and `root` or `root + sep` rather than a bare startsWith. spelled out again rather than cross-referenced, because the next person to add a path-taking route reads the file they are in. it stores NO ITEMS. one table, a list of folders. uninstalling with "delete its data" ticked loses the list and never a line of anybody's work — which is the property the markdown format was chosen for. `/projects` is owner-only: pointing this at a directory is a statement about the filesystem. moving a card is not, so a member granted `kanban` can work any board they can see. removing a project removes the ROW. the route says so in its response and the button says so in its tooltip, because "delete" beside a folder full of somebody's work should not be ambiguous. README records the seam honestly: the platform keeps its own todo/ and its CLI, so there are two copies of the reader and they will drift. the alternative was making the platform's own backlog depend on a plugin being installed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
65 lines
2.7 KiB
TypeScript
65 lines
2.7 KiB
TypeScript
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.01',
|
|
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/<id>` is covered by the same rule as `/projects`.
|
|
*/
|
|
ownerOnly: ['/projects'],
|
|
},
|
|
],
|
|
};
|