From 3443bcacd00ab21d3dee02e7618e6fee31ce3749 Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Wed, 27 May 2026 16:48:59 +0200 Subject: [PATCH] refactor(plugins): rename document-mode to doc-mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renames the bundled plugin's id (`document-mode` → `doc-mode`), display name (`Document Mode (Alpha)` → `Doc Mode (Alpha)`), package name, directory, and asset path. No migration: the plugin has never been published, so there is no on-disk user data to preserve. Touched everywhere the id was hardcoded: - Plugin manifest, package.json, build/deploy/test scripts, log prefixes - Host BUNDLED_PLUGIN_PATHS entry (src/app/plugins/plugin.service.ts) - Host comments and test fixtures (plugin-hooks, plugin-persistence-key, plugin-persistence.model, conflict-resolution.service.spec) - E2E spec filenames + PLUGIN_ID constant + label assertions - build-all.js plugin orchestrator - build/release-notes.md user-facing entry Test pass: 88/88 plugin specs, 8/8 plugin-hooks, 132/132 conflict-resolution, 15/15 plugin-persistence-key.util. Bundle redeployed to src/assets/bundled-plugins/doc-mode (gitignored). The old `src/assets/bundled-plugins/document-mode/` dir is gitignored and left on disk after this commit; the host loader no longer references it, so it's inert. Remove with `rm -rf src/assets/bundled-plugins/document-mode`. --- build/release-notes.md | 2 +- ...ndled.spec.ts => doc-mode-bundled.spec.ts} | 10 ++++---- ...ion.spec.ts => doc-mode-migration.spec.ts} | 12 +++++----- .../{document-mode => doc-mode}/.gitignore | 0 .../package-lock.json | 4 ++-- .../{document-mode => doc-mode}/package.json | 2 +- .../scripts/build.js | 2 +- .../scripts/deploy.js | 2 +- .../scripts/test.js | 2 +- .../src/background.ts | 6 ++--- .../src/doc-transform.spec.ts | 0 .../src/doc-transform.ts | 2 +- .../{document-mode => doc-mode}/src/icon.svg | 0 .../src/manifest.json | 4 ++-- .../src/persistence.spec.ts | 0 .../src/persistence.ts | 0 .../src/reconcile-enabled.spec.ts | 0 .../src/reconcile-enabled.ts | 4 ++-- .../src/ui/doc-nav.spec.ts | 0 .../src/ui/doc-nav.ts | 2 +- .../src/ui/editor.ts | 8 +++---- .../src/ui/icons.ts | 2 +- .../src/ui/index.html | 2 +- .../src/ui/task-ref-node.ts | 0 .../{document-mode => doc-mode}/tsconfig.json | 0 packages/plugin-dev/scripts/build-all.js | 6 ++--- .../sync/conflict-resolution.service.spec.ts | 10 ++++---- src/app/plugins/plugin-hooks.spec.ts | 23 ++++++++----------- src/app/plugins/plugin-hooks.ts | 2 +- src/app/plugins/plugin-persistence.model.ts | 4 ++-- src/app/plugins/plugin.service.ts | 2 +- .../util/plugin-persistence-key.util.ts | 2 +- 32 files changed, 56 insertions(+), 59 deletions(-) rename e2e/tests/plugins/{document-mode-bundled.spec.ts => doc-mode-bundled.spec.ts} (80%) rename e2e/tests/plugins/{document-mode-migration.spec.ts => doc-mode-migration.spec.ts} (96%) rename packages/plugin-dev/{document-mode => doc-mode}/.gitignore (100%) rename packages/plugin-dev/{document-mode => doc-mode}/package-lock.json (99%) rename packages/plugin-dev/{document-mode => doc-mode}/package.json (96%) rename packages/plugin-dev/{document-mode => doc-mode}/scripts/build.js (97%) rename packages/plugin-dev/{document-mode => doc-mode}/scripts/deploy.js (98%) rename packages/plugin-dev/{document-mode => doc-mode}/scripts/test.js (97%) rename packages/plugin-dev/{document-mode => doc-mode}/src/background.ts (96%) rename packages/plugin-dev/{document-mode => doc-mode}/src/doc-transform.spec.ts (100%) rename packages/plugin-dev/{document-mode => doc-mode}/src/doc-transform.ts (99%) rename packages/plugin-dev/{document-mode => doc-mode}/src/icon.svg (100%) rename packages/plugin-dev/{document-mode => doc-mode}/src/manifest.json (90%) rename packages/plugin-dev/{document-mode => doc-mode}/src/persistence.spec.ts (100%) rename packages/plugin-dev/{document-mode => doc-mode}/src/persistence.ts (100%) rename packages/plugin-dev/{document-mode => doc-mode}/src/reconcile-enabled.spec.ts (100%) rename packages/plugin-dev/{document-mode => doc-mode}/src/reconcile-enabled.ts (95%) rename packages/plugin-dev/{document-mode => doc-mode}/src/ui/doc-nav.spec.ts (100%) rename packages/plugin-dev/{document-mode => doc-mode}/src/ui/doc-nav.ts (99%) rename packages/plugin-dev/{document-mode => doc-mode}/src/ui/editor.ts (99%) rename packages/plugin-dev/{document-mode => doc-mode}/src/ui/icons.ts (97%) rename packages/plugin-dev/{document-mode => doc-mode}/src/ui/index.html (99%) rename packages/plugin-dev/{document-mode => doc-mode}/src/ui/task-ref-node.ts (100%) rename packages/plugin-dev/{document-mode => doc-mode}/tsconfig.json (100%) diff --git a/build/release-notes.md b/build/release-notes.md index ca3928ca50..9c02afd6a3 100644 --- a/build/release-notes.md +++ b/build/release-notes.md @@ -33,6 +33,6 @@ For all current downloads, package links, and platform-specific notes: [check th ### Plugins & Advanced - Added plugin support for work-context header buttons, an embed slot, the WORK_CONTEXT_CHANGE hook, and iframe-only installs. -- Added a TipTap-based document-mode plugin and reduced redundant synced chip data. +- Added a TipTap-based doc-mode plugin and reduced redundant synced chip data. - Added distribution-target suffixes to Electron version strings. - Fixed SuperSync Caddy healthchecks, PostgreSQL connection headroom, Docker sync package inclusion, and the F-Droid build dependency issue. diff --git a/e2e/tests/plugins/document-mode-bundled.spec.ts b/e2e/tests/plugins/doc-mode-bundled.spec.ts similarity index 80% rename from e2e/tests/plugins/document-mode-bundled.spec.ts rename to e2e/tests/plugins/doc-mode-bundled.spec.ts index 33899fc2e2..90d5421087 100644 --- a/e2e/tests/plugins/document-mode-bundled.spec.ts +++ b/e2e/tests/plugins/doc-mode-bundled.spec.ts @@ -5,9 +5,9 @@ import { } from '../../helpers/plugin-test.helpers'; // Smoke test for the BUNDLED_PLUGIN_PATHS entry added in commit 199e816479. -// A typo or accidental removal of 'assets/bundled-plugins/document-mode' +// A typo or accidental removal of 'assets/bundled-plugins/doc-mode' // would silently regress this; the test fails loudly instead. -test.describe('Document Mode bundled plugin', () => { +test.describe('Doc Mode bundled plugin', () => { test('appears in plugin management list', async ({ page, workViewPage }) => { test.setTimeout(60000); @@ -26,7 +26,7 @@ test.describe('Document Mode bundled plugin', () => { const pluginReady = await waitForPluginManagementInit(page); expect(pluginReady).toBeTruthy(); - // Manifest declares the user-visible name as "Document Mode (Alpha)". + // Manifest declares the user-visible name as "Doc Mode (Alpha)". // Match on the prefix so a future Alpha→Beta label change doesn't break. const titles = await page.evaluate(() => { const cards = Array.from(document.querySelectorAll('plugin-management mat-card')); @@ -35,7 +35,7 @@ test.describe('Document Mode bundled plugin', () => { .filter(Boolean); }); - const hasDocumentMode = titles.some((t) => t.startsWith('Document Mode')); - expect(hasDocumentMode).toBeTruthy(); + const hasDocMode = titles.some((t) => t.startsWith('Doc Mode')); + expect(hasDocMode).toBeTruthy(); }); }); diff --git a/e2e/tests/plugins/document-mode-migration.spec.ts b/e2e/tests/plugins/doc-mode-migration.spec.ts similarity index 96% rename from e2e/tests/plugins/document-mode-migration.spec.ts rename to e2e/tests/plugins/doc-mode-migration.spec.ts index 89c81adc9a..40f98887a0 100644 --- a/e2e/tests/plugins/document-mode-migration.spec.ts +++ b/e2e/tests/plugins/doc-mode-migration.spec.ts @@ -7,8 +7,8 @@ import { /** * End-to-end coverage of the Stage A keyed persistence migration in the - * bundled document-mode plugin. The migration logic is unit-tested against - * a mock PluginAPI (`packages/plugin-dev/document-mode/src/persistence.spec.ts`), + * bundled doc-mode plugin. The migration logic is unit-tested against + * a mock PluginAPI (`packages/plugin-dev/doc-mode/src/persistence.spec.ts`), * but those tests can't catch real-iframe quirks: postMessage handling of * `undefined` second args, commit-chain timing across the host's rate * limiter, hydration ordering against the op-log. @@ -21,7 +21,7 @@ import { * `doc:${ctxId}` keyed entries and tombstones the legacy id. */ -const PLUGIN_ID = 'document-mode'; +const PLUGIN_ID = 'doc-mode'; // Underscore-cased so the @typescript-eslint/naming-convention rule on // object literal keys is happy. The keys are opaque context ids; their // shape doesn't matter to the host. @@ -79,7 +79,7 @@ const findEntry = ( id: string, ): PluginUserDataEntry | undefined => entries?.find((e) => e.id === id); -test.describe('Document Mode Stage A migration', () => { +test.describe('Doc Mode Stage A migration', () => { test('stamps migration success on a fresh install', async ({ page, workViewPage }) => { test.setTimeout(60000); @@ -96,7 +96,7 @@ test.describe('Document Mode Stage A migration', () => { const pluginReady = await waitForPluginManagementInit(page); expect(pluginReady).toBeTruthy(); - const enabled = await enablePluginWithVerification(page, 'Document Mode'); + const enabled = await enablePluginWithVerification(page, 'Doc Mode'); expect(enabled).toBeTruthy(); // The migration runs once the plugin's background.js executes init(). @@ -169,7 +169,7 @@ test.describe('Document Mode Stage A migration', () => { const pluginReady = await waitForPluginManagementInit(page); expect(pluginReady).toBeTruthy(); - const enabled = await enablePluginWithVerification(page, 'Document Mode'); + const enabled = await enablePluginWithVerification(page, 'Doc Mode'); expect(enabled).toBeTruthy(); // Wait for the migration to stamp success. The full sequence is: diff --git a/packages/plugin-dev/document-mode/.gitignore b/packages/plugin-dev/doc-mode/.gitignore similarity index 100% rename from packages/plugin-dev/document-mode/.gitignore rename to packages/plugin-dev/doc-mode/.gitignore diff --git a/packages/plugin-dev/document-mode/package-lock.json b/packages/plugin-dev/doc-mode/package-lock.json similarity index 99% rename from packages/plugin-dev/document-mode/package-lock.json rename to packages/plugin-dev/doc-mode/package-lock.json index af65920dc4..314124e4ce 100644 --- a/packages/plugin-dev/document-mode/package-lock.json +++ b/packages/plugin-dev/doc-mode/package-lock.json @@ -1,11 +1,11 @@ { - "name": "document-mode", + "name": "doc-mode", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "document-mode", + "name": "doc-mode", "version": "0.1.0", "dependencies": { "@super-productivity/plugin-api": "file:../../plugin-api", diff --git a/packages/plugin-dev/document-mode/package.json b/packages/plugin-dev/doc-mode/package.json similarity index 96% rename from packages/plugin-dev/document-mode/package.json rename to packages/plugin-dev/doc-mode/package.json index c2ae0c45c8..f5e3a5e444 100644 --- a/packages/plugin-dev/document-mode/package.json +++ b/packages/plugin-dev/doc-mode/package.json @@ -1,5 +1,5 @@ { - "name": "document-mode", + "name": "doc-mode", "version": "0.1.0", "description": "Document-style editor for projects and Today using TipTap", "private": true, diff --git a/packages/plugin-dev/document-mode/scripts/build.js b/packages/plugin-dev/doc-mode/scripts/build.js similarity index 97% rename from packages/plugin-dev/document-mode/scripts/build.js rename to packages/plugin-dev/doc-mode/scripts/build.js index bd2f70e925..77f35938a0 100644 --- a/packages/plugin-dev/document-mode/scripts/build.js +++ b/packages/plugin-dev/doc-mode/scripts/build.js @@ -9,7 +9,7 @@ const SRC_DIR = path.join(ROOT_DIR, 'src'); const DIST_DIR = path.join(ROOT_DIR, 'dist'); async function buildPlugin() { - console.log('Building document-mode plugin with esbuild...'); + console.log('Building doc-mode plugin with esbuild...'); if (fs.existsSync(DIST_DIR)) { fs.rmSync(DIST_DIR, { recursive: true }); diff --git a/packages/plugin-dev/document-mode/scripts/deploy.js b/packages/plugin-dev/doc-mode/scripts/deploy.js similarity index 98% rename from packages/plugin-dev/document-mode/scripts/deploy.js rename to packages/plugin-dev/doc-mode/scripts/deploy.js index 480932d564..04efd5bca7 100644 --- a/packages/plugin-dev/document-mode/scripts/deploy.js +++ b/packages/plugin-dev/doc-mode/scripts/deploy.js @@ -13,7 +13,7 @@ const TARGET_DIR = path.join( 'src', 'assets', 'bundled-plugins', - 'document-mode', + 'doc-mode', ); // editor.js is inlined into index.html, so it doesn't need to be deployed. diff --git a/packages/plugin-dev/document-mode/scripts/test.js b/packages/plugin-dev/doc-mode/scripts/test.js similarity index 97% rename from packages/plugin-dev/document-mode/scripts/test.js rename to packages/plugin-dev/doc-mode/scripts/test.js index c289f76b14..7709f8a1d4 100644 --- a/packages/plugin-dev/document-mode/scripts/test.js +++ b/packages/plugin-dev/doc-mode/scripts/test.js @@ -1,7 +1,7 @@ #!/usr/bin/env node /* eslint-disable @typescript-eslint/no-require-imports */ /** - * Unit-test runner for the document-mode plugin. + * Unit-test runner for the doc-mode plugin. * * The plugin has no browser-based test setup — its testable logic is the pure * `doc-transform` module. This script transpiles every `*.spec.ts` under diff --git a/packages/plugin-dev/document-mode/src/background.ts b/packages/plugin-dev/doc-mode/src/background.ts similarity index 96% rename from packages/plugin-dev/document-mode/src/background.ts rename to packages/plugin-dev/doc-mode/src/background.ts index b5d6c58bf9..fd6d0c8494 100644 --- a/packages/plugin-dev/document-mode/src/background.ts +++ b/packages/plugin-dev/doc-mode/src/background.ts @@ -54,7 +54,7 @@ const init = async (): Promise => { try { await migrateToKeyedPersistence(PluginAPI); } catch (err) { - PluginAPI.log.err('document-mode: migration failed', err); + PluginAPI.log.err('doc-mode: migration failed', err); // Continue anyway: a partial migration leaves the data in place // (corruption guard in persistence.ts) and the next session will retry. } @@ -94,12 +94,12 @@ const onButtonClick = async (ctx: ActiveWorkContext): Promise => { return [...set]; }); } catch (err) { - PluginAPI.log.err('document-mode: failed to persist toggle', err); + PluginAPI.log.err('doc-mode: failed to persist toggle', err); } }; PluginAPI.registerWorkContextHeaderButton({ - label: 'Document Mode', + label: 'Doc Mode', icon: 'description', showFor: ['PROJECT', 'TODAY'], onClick: (ctx) => { diff --git a/packages/plugin-dev/document-mode/src/doc-transform.spec.ts b/packages/plugin-dev/doc-mode/src/doc-transform.spec.ts similarity index 100% rename from packages/plugin-dev/document-mode/src/doc-transform.spec.ts rename to packages/plugin-dev/doc-mode/src/doc-transform.spec.ts diff --git a/packages/plugin-dev/document-mode/src/doc-transform.ts b/packages/plugin-dev/doc-mode/src/doc-transform.ts similarity index 99% rename from packages/plugin-dev/document-mode/src/doc-transform.ts rename to packages/plugin-dev/doc-mode/src/doc-transform.ts index a18454452b..e77a44df1d 100644 --- a/packages/plugin-dev/document-mode/src/doc-transform.ts +++ b/packages/plugin-dev/doc-mode/src/doc-transform.ts @@ -1,5 +1,5 @@ /** - * Pure document-transform helpers for Document Mode. + * Pure document-transform helpers for Doc Mode. * * Everything here operates on plain ProseMirror-JSON (`PMNode`) and a task * lookup function — no TipTap editor, no DOM, no module-global cache. That diff --git a/packages/plugin-dev/document-mode/src/icon.svg b/packages/plugin-dev/doc-mode/src/icon.svg similarity index 100% rename from packages/plugin-dev/document-mode/src/icon.svg rename to packages/plugin-dev/doc-mode/src/icon.svg diff --git a/packages/plugin-dev/document-mode/src/manifest.json b/packages/plugin-dev/doc-mode/src/manifest.json similarity index 90% rename from packages/plugin-dev/document-mode/src/manifest.json rename to packages/plugin-dev/doc-mode/src/manifest.json index 29ece6c29e..98839ce667 100644 --- a/packages/plugin-dev/document-mode/src/manifest.json +++ b/packages/plugin-dev/doc-mode/src/manifest.json @@ -1,7 +1,7 @@ { - "id": "document-mode", + "id": "doc-mode", "manifestVersion": 1, - "name": "Document Mode (Alpha)", + "name": "Doc Mode (Alpha)", "version": "0.1.0", "description": "Document-style editor for projects and Today, powered by TipTap.", "author": "SuperProductivity", diff --git a/packages/plugin-dev/document-mode/src/persistence.spec.ts b/packages/plugin-dev/doc-mode/src/persistence.spec.ts similarity index 100% rename from packages/plugin-dev/document-mode/src/persistence.spec.ts rename to packages/plugin-dev/doc-mode/src/persistence.spec.ts diff --git a/packages/plugin-dev/document-mode/src/persistence.ts b/packages/plugin-dev/doc-mode/src/persistence.ts similarity index 100% rename from packages/plugin-dev/document-mode/src/persistence.ts rename to packages/plugin-dev/doc-mode/src/persistence.ts diff --git a/packages/plugin-dev/document-mode/src/reconcile-enabled.spec.ts b/packages/plugin-dev/doc-mode/src/reconcile-enabled.spec.ts similarity index 100% rename from packages/plugin-dev/document-mode/src/reconcile-enabled.spec.ts rename to packages/plugin-dev/doc-mode/src/reconcile-enabled.spec.ts diff --git a/packages/plugin-dev/document-mode/src/reconcile-enabled.ts b/packages/plugin-dev/doc-mode/src/reconcile-enabled.ts similarity index 95% rename from packages/plugin-dev/document-mode/src/reconcile-enabled.ts rename to packages/plugin-dev/doc-mode/src/reconcile-enabled.ts index 6d86870413..590a858cbd 100644 --- a/packages/plugin-dev/document-mode/src/reconcile-enabled.ts +++ b/packages/plugin-dev/doc-mode/src/reconcile-enabled.ts @@ -48,7 +48,7 @@ export const reconcileEnabledIds = async ( try { next = new Set(await loadEnabledCtxIds(api)); } catch (err) { - api.log.err('document-mode: enabled-ids reload failed', err); + api.log.err('doc-mode: enabled-ids reload failed', err); return { next: new Set(prev), action: 'noop' }; } // Skip the visibility reconcile when membership is identical — most fires @@ -69,7 +69,7 @@ export const reconcileEnabledIds = async ( const ctx = await api.getActiveWorkContext(); activeId = ctx?.id ?? null; } catch (err) { - api.log.err('document-mode: active-ctx read failed', err); + api.log.err('doc-mode: active-ctx read failed', err); return { next, action: 'noop' }; } if (activeId === null) return { next, action: 'noop' }; diff --git a/packages/plugin-dev/document-mode/src/ui/doc-nav.spec.ts b/packages/plugin-dev/doc-mode/src/ui/doc-nav.spec.ts similarity index 100% rename from packages/plugin-dev/document-mode/src/ui/doc-nav.spec.ts rename to packages/plugin-dev/doc-mode/src/ui/doc-nav.spec.ts diff --git a/packages/plugin-dev/document-mode/src/ui/doc-nav.ts b/packages/plugin-dev/doc-mode/src/ui/doc-nav.ts similarity index 99% rename from packages/plugin-dev/document-mode/src/ui/doc-nav.ts rename to packages/plugin-dev/doc-mode/src/ui/doc-nav.ts index cfa64af71f..6fa4b414b8 100644 --- a/packages/plugin-dev/document-mode/src/ui/doc-nav.ts +++ b/packages/plugin-dev/doc-mode/src/ui/doc-nav.ts @@ -1,5 +1,5 @@ /** - * Pure top-level-navigation helpers for the Document Mode editor. + * Pure top-level-navigation helpers for the Doc Mode editor. * * Every function here operates on a `DocLike` — the minimal structural * slice of a ProseMirror document node that the drag / move / keyboard diff --git a/packages/plugin-dev/document-mode/src/ui/editor.ts b/packages/plugin-dev/doc-mode/src/ui/editor.ts similarity index 99% rename from packages/plugin-dev/document-mode/src/ui/editor.ts rename to packages/plugin-dev/doc-mode/src/ui/editor.ts index 3c5cd954b3..52c3812217 100644 --- a/packages/plugin-dev/document-mode/src/ui/editor.ts +++ b/packages/plugin-dev/doc-mode/src/ui/editor.ts @@ -113,7 +113,7 @@ const logErr = (msg: string, err?: unknown): void => { // ignore — fall through to console } // eslint-disable-next-line no-console - console.error('[document-mode]', msg, err); + console.error('[doc-mode]', msg, err); }; /** @@ -1910,7 +1910,7 @@ const mount = async (): Promise => { try { await migrateToKeyedPersistence(PluginAPI); } catch (err) { - logErr('document-mode: migration failed', err); + logErr('doc-mode: migration failed', err); } updateDocStatusBanner(); const initialCtx = await PluginAPI.getActiveWorkContext(); @@ -2149,7 +2149,7 @@ const waitForPluginAPI = (): Promise => if (attempts >= MAX_ATTEMPTS) { // eslint-disable-next-line no-console console.error( - '[document-mode] PluginAPI not injected after', + '[doc-mode] PluginAPI not injected after', MAX_ATTEMPTS * INTERVAL_MS, 'ms — giving up', ); @@ -2173,7 +2173,7 @@ void waitForPluginAPI() const msg = document.createElement('div'); msg.className = 'doc-error-state'; msg.textContent = - 'Document Mode could not connect to Super Productivity. ' + + 'Doc Mode could not connect to Super Productivity. ' + 'Try closing and reopening this panel.'; root.appendChild(msg); } diff --git a/packages/plugin-dev/document-mode/src/ui/icons.ts b/packages/plugin-dev/doc-mode/src/ui/icons.ts similarity index 97% rename from packages/plugin-dev/document-mode/src/ui/icons.ts rename to packages/plugin-dev/doc-mode/src/ui/icons.ts index 159812bdac..b77ec84575 100644 --- a/packages/plugin-dev/document-mode/src/ui/icons.ts +++ b/packages/plugin-dev/doc-mode/src/ui/icons.ts @@ -1,5 +1,5 @@ /** - * Inline SVG icons for Document Mode. Kept as a static path map so the + * Inline SVG icons for Doc Mode. Kept as a static path map so the * iframe renders icons offline — no Material Icons web font, no Google * Fonts request. Paths are the standard Material Symbols 24×24 outlines. */ diff --git a/packages/plugin-dev/document-mode/src/ui/index.html b/packages/plugin-dev/doc-mode/src/ui/index.html similarity index 99% rename from packages/plugin-dev/document-mode/src/ui/index.html rename to packages/plugin-dev/doc-mode/src/ui/index.html index 0690fd8530..24a1a8d362 100644 --- a/packages/plugin-dev/document-mode/src/ui/index.html +++ b/packages/plugin-dev/doc-mode/src/ui/index.html @@ -2,7 +2,7 @@ - Document Mode + Doc Mode