annotask 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -5,12 +5,26 @@ import WebSocket from "ws";
5
5
  import { existsSync, mkdirSync, cpSync, readdirSync, symlinkSync, lstatSync, rmSync, readlinkSync } from "fs";
6
6
  import { resolve, dirname, relative } from "path";
7
7
  import { fileURLToPath } from "url";
8
+ import { readFileSync } from "fs";
8
9
  var args = process.argv.slice(2);
9
10
  var command = args[0] || "watch";
10
11
  var port = args.find((a) => a.startsWith("--port="))?.split("=")[1] || "5173";
11
12
  var host = args.find((a) => a.startsWith("--host="))?.split("=")[1] || "localhost";
12
- var wsUrl = `ws://${host}:${port}/__annotask/ws`;
13
- var apiUrl = `http://${host}:${port}/__annotask/api`;
13
+ var serverArg = args.find((a) => a.startsWith("--server="))?.split("=")[1] || "";
14
+ var mfeArg = args.find((a) => a.startsWith("--mfe="))?.split("=")[1] || "";
15
+ var baseUrl = "";
16
+ var mfeFilter = mfeArg;
17
+ try {
18
+ const serverJson = JSON.parse(readFileSync(".annotask/server.json", "utf-8"));
19
+ baseUrl = serverArg || serverJson.url || "";
20
+ if (!mfeFilter && serverJson.mfe) mfeFilter = serverJson.mfe;
21
+ } catch {
22
+ }
23
+ if (!baseUrl) {
24
+ baseUrl = serverArg || `http://${host}:${port}`;
25
+ }
26
+ var wsUrl = baseUrl.replace(/^http/, "ws") + "/__annotask/ws";
27
+ var apiUrl = baseUrl + "/__annotask/api";
14
28
  var KNOWN_TARGETS = {
15
29
  claude: ".claude/skills",
16
30
  agents: ".agents/skills",
@@ -106,12 +120,21 @@ function watchChanges() {
106
120
  }
107
121
  async function fetchReport() {
108
122
  try {
109
- const res = await fetch(`${apiUrl}/report`);
110
- const data = await res.json();
111
- console.log(JSON.stringify(data, null, 2));
123
+ const tasksUrl = mfeFilter ? `${apiUrl}/tasks?mfe=${encodeURIComponent(mfeFilter)}` : `${apiUrl}/tasks`;
124
+ const reportUrl = `${apiUrl}/report`;
125
+ const [tasksRes, reportRes] = await Promise.all([
126
+ fetch(tasksUrl),
127
+ fetch(reportUrl)
128
+ ]);
129
+ const tasks = await tasksRes.json();
130
+ const report = await reportRes.json();
131
+ console.log(JSON.stringify({ report, tasks }, null, 2));
132
+ if (mfeFilter) {
133
+ console.error(`\x1B[36m[Annotask]\x1B[0m Filtered by MFE: ${mfeFilter}`);
134
+ }
112
135
  } catch (err) {
113
136
  console.error(`\x1B[31m[Annotask]\x1B[0m Failed to fetch report: ${err.message}`);
114
- console.error(`Make sure your Vite dev server is running with the annotask() plugin on port ${port}`);
137
+ console.error(`Make sure the Annotask server is running at ${baseUrl}`);
115
138
  process.exit(1);
116
139
  }
117
140
  }
@@ -119,10 +142,11 @@ async function checkStatus() {
119
142
  try {
120
143
  const res = await fetch(`${apiUrl}/status`);
121
144
  const data = await res.json();
122
- console.log(`\x1B[32m[Annotask]\x1B[0m Server is running on port ${port}`);
145
+ console.log(`\x1B[32m[Annotask]\x1B[0m Server is running at ${baseUrl}`);
146
+ if (mfeFilter) console.log(`\x1B[36m[Annotask]\x1B[0m MFE filter: ${mfeFilter}`);
123
147
  console.log(JSON.stringify(data, null, 2));
124
148
  } catch {
125
- console.log(`\x1B[31m[Annotask]\x1B[0m No Annotask server found on port ${port}`);
149
+ console.log(`\x1B[31m[Annotask]\x1B[0m No Annotask server found at ${baseUrl}`);
126
150
  process.exit(1);
127
151
  }
128
152
  }
@@ -227,8 +251,10 @@ function printHelp() {
227
251
  help Show this help
228
252
 
229
253
  \x1B[33mOptions:\x1B[0m
230
- --port=N Vite dev server port (default: 5173)
231
- --host=H Vite dev server host (default: localhost)
254
+ --port=N Dev server port (default: 5173)
255
+ --host=H Dev server host (default: localhost)
256
+ --server=URL Annotask server URL (overrides .annotask/server.json)
257
+ --mfe=NAME Filter tasks by MFE identity (overrides server.json mfe)
232
258
  --force Overwrite existing skills (for init-skills)
233
259
  --target=NAME Comma-separated targets (default: claude,agents)
234
260
  Built-in: claude, agents, copilot
@@ -239,7 +265,9 @@ function printHelp() {
239
265
  annotask watch --port=3000 # Watch on custom port
240
266
  annotask report # Get current report JSON
241
267
  annotask report | jq # Pipe to jq for formatting
268
+ annotask report --mfe=@antenna/factory # Report filtered by MFE
242
269
  annotask status # Check connection
270
+ annotask status --server=http://localhost:24678 # Check remote server
243
271
  annotask init-skills # Install to .claude + .agents (default)
244
272
  annotask init-skills --target=claude # Only .claude/skills/
245
273
  annotask init-skills --target=copilot # Only .copilot/skills/
package/dist/index.d.ts CHANGED
@@ -3,6 +3,17 @@ import { Plugin } from 'vite';
3
3
  interface AnnotaskOptions {
4
4
  /** @experimental Not yet implemented. OpenAPI spec path or URL */
5
5
  openapi?: string;
6
+ /** MFE identity for multi-project setups (e.g. '@antenna/factory').
7
+ * Adds data-annotask-mfe attribute to all elements.
8
+ * When used alone, annotask runs normally (shell + server available).
9
+ * When combined with `server`, the local server is skipped and
10
+ * .annotask/server.json points to the remote root server. */
11
+ mfe?: string;
12
+ /** Remote annotask server URL (e.g. 'http://localhost:24678').
13
+ * When set, the local annotask server is skipped — the root shell's
14
+ * plugin handles the server and UI injection. Writes .annotask/server.json
15
+ * pointing to this URL so skills/CLI connect to the root. */
16
+ server?: string;
6
17
  }
7
18
  declare function annotask(options?: AnnotaskOptions): Plugin[];
8
19
 
package/dist/index.js CHANGED
@@ -1,27 +1,32 @@
1
1
  import {
2
2
  bridgeClientScript,
3
3
  toggleButtonScript
4
- } from "./chunk-2TUWBFQG.js";
4
+ } from "./chunk-VI4NPM6C.js";
5
5
  import {
6
+ writeMfeServerInfo,
6
7
  writeServerInfo
7
- } from "./chunk-XR26XVHT.js";
8
+ } from "./chunk-XLNGAH3S.js";
8
9
  import {
9
10
  createAnnotaskServer
10
- } from "./chunk-T6TKVAAA.js";
11
+ } from "./chunk-JLOSPIJ4.js";
11
12
  import {
12
13
  transformFile,
13
14
  transformHTML
14
- } from "./chunk-6UQW2W7S.js";
15
+ } from "./chunk-VU7Z7EZA.js";
15
16
 
16
17
  // src/plugin/index.ts
17
18
  function annotask(options = {}) {
18
19
  let projectRoot = "";
20
+ const mfe = options.mfe;
19
21
  const transformPlugin = {
20
22
  name: "annotask:transform",
21
23
  enforce: "pre",
22
24
  apply: "serve",
23
25
  configResolved(config) {
24
26
  projectRoot = config.root;
27
+ if (mfe && options.server) {
28
+ writeMfeServerInfo(projectRoot, options.server, mfe);
29
+ }
25
30
  },
26
31
  transform(code, id) {
27
32
  if (id.endsWith("/main.ts") || id.endsWith("/main.js") || id.endsWith("/main.tsx") || id.endsWith("/main.jsx")) {
@@ -48,7 +53,7 @@ window.__ANNOTASK_SVELTE__ = { mount: __uf_mount, unmount: __uf_unmount };
48
53
  }
49
54
  }
50
55
  if (!id.endsWith(".vue") && !id.endsWith(".svelte") && !/\.[jt]sx$/.test(id)) return null;
51
- const result = transformFile(code, id, projectRoot);
56
+ const result = transformFile(code, id, projectRoot, mfe);
52
57
  if (!result) return null;
53
58
  let output = result;
54
59
  const importRegex = /import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g;
@@ -73,7 +78,10 @@ if (typeof window !== 'undefined') { window.__ANNOTASK_COMPONENTS__ = window.__A
73
78
  return { code: output, map: null };
74
79
  },
75
80
  transformIndexHtml(html, ctx) {
76
- const transformed = transformHTML(html, ctx.filename, projectRoot);
81
+ const transformed = transformHTML(html, ctx.filename, projectRoot, mfe);
82
+ if (options.server) {
83
+ return transformed ?? html;
84
+ }
77
85
  return {
78
86
  html: transformed ?? html,
79
87
  tags: [
@@ -161,6 +169,9 @@ if (typeof window !== 'undefined') { window.__ANNOTASK_COMPONENTS__ = window.__A
161
169
  });
162
170
  }
163
171
  };
172
+ if (options.server) {
173
+ return [transformPlugin];
174
+ }
164
175
  return [transformPlugin, servePlugin];
165
176
  }
166
177
  var plugin_default = annotask;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin/index.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite'\nimport { transformFile, transformHTML } from './transform.js'\nimport { toggleButtonScript } from './toggle-button.js'\nimport { bridgeClientScript } from './bridge-client.js'\nimport { createAnnotaskServer } from '../server/index.js'\nimport { writeServerInfo } from '../server/discovery.js'\n\nexport interface AnnotaskOptions {\n /** @experimental Not yet implemented. OpenAPI spec path or URL */\n openapi?: string\n}\n\nexport function annotask(options: AnnotaskOptions = {}): Plugin[] {\n let projectRoot = ''\n\n const transformPlugin: Plugin = {\n name: 'annotask:transform',\n enforce: 'pre',\n apply: 'serve',\n\n configResolved(config) {\n projectRoot = config.root\n },\n\n transform(code, id) {\n // Expose framework runtime for Annotask component rendering\n if (id.endsWith('/main.ts') || id.endsWith('/main.js') || id.endsWith('/main.tsx') || id.endsWith('/main.jsx')) {\n let injection = ''\n if (code.includes(\"from 'vue'\") || code.includes('from \"vue\"')) {\n injection = `\\n;import { createApp as __uf_createApp, h as __uf_h } from 'vue';\\nwindow.__ANNOTASK_VUE__ = { createApp: __uf_createApp, h: __uf_h };\\n`\n } else if (code.includes(\"from 'react'\") || code.includes('from \"react\"')) {\n injection = `\\n;import { createElement as __uf_createElement } from 'react';\\nimport { createRoot as __uf_createRoot } from 'react-dom/client';\\nwindow.__ANNOTASK_REACT__ = { createElement: __uf_createElement, createRoot: __uf_createRoot };\\n`\n } else if (code.includes(\"from 'svelte'\") || code.includes('from \"svelte\"')) {\n injection = `\\n;import { mount as __uf_mount, unmount as __uf_unmount } from 'svelte';\\nwindow.__ANNOTASK_SVELTE__ = { mount: __uf_mount, unmount: __uf_unmount };\\n`\n }\n if (injection) {\n return { code: code + injection, map: null }\n }\n }\n\n // Transform source files to inject data-annotask-* attributes\n // Note: .astro files are excluded because Astro's compiler runs before\n // our transform (even with enforce: 'pre'). Astro source mapping is\n // handled via data-astro-source-* attributes in the bridge client.\n if (!id.endsWith('.vue') && !id.endsWith('.svelte') && !/\\.[jt]sx$/.test(id)) return null\n\n const result = transformFile(code, id, projectRoot)\n if (!result) return null\n\n // Register imported PascalCase components globally\n let output = result\n const importRegex = /import\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g\n let match\n const registrations: string[] = []\n while ((match = importRegex.exec(result)) !== null) {\n const [, name, source] = match\n if (name[0] === name[0].toUpperCase() && name[0] !== name[0].toLowerCase() && !source.startsWith('.')) {\n registrations.push(`window.__ANNOTASK_COMPONENTS__['${name}'] = ${name}`)\n }\n }\n if (registrations.length > 0) {\n const regCode = `\\nif (typeof window !== 'undefined') { window.__ANNOTASK_COMPONENTS__ = window.__ANNOTASK_COMPONENTS__ || {}; ${registrations.join('; ')} }\\n`\n // Vue SFCs: inject before </script>. JSX/Svelte: append to end of file.\n if (id.endsWith('.vue') && output.includes('</script>')) {\n output = output.replace(/<\\/script>/, regCode + '</script>')\n } else {\n output += regCode\n }\n }\n\n return { code: output, map: null }\n },\n\n transformIndexHtml(html, ctx) {\n const transformed = transformHTML(html, ctx.filename, projectRoot)\n return {\n html: transformed ?? html,\n tags: [\n {\n tag: 'script',\n attrs: { type: 'module' },\n children: toggleButtonScript(),\n injectTo: 'body',\n },\n {\n tag: 'script',\n children: bridgeClientScript(),\n injectTo: 'body',\n },\n ],\n }\n },\n }\n\n const servePlugin: Plugin = {\n name: 'annotask:serve',\n apply: 'serve',\n\n configureServer(server: ViteDevServer) {\n const uiServer = createAnnotaskServer({ projectRoot })\n\n // Mount middleware on Vite's connect instance\n server.middlewares.use(uiServer.middleware)\n\n // Handle WebSocket upgrades\n server.httpServer?.on('upgrade', (req, socket, head) => {\n if (req.url === '/__annotask/ws') {\n uiServer.handleUpgrade(req, socket, head)\n }\n })\n\n // Write server.json so skills/CLI know where to connect\n server.httpServer?.once('listening', () => {\n const addr = server.httpServer?.address()\n const port = typeof addr === 'object' && addr ? addr.port : 5173\n writeServerInfo(projectRoot, port)\n })\n\n console.log('[Annotask] Design tool available at /__annotask/')\n console.log('[Annotask] WebSocket: ws://localhost:<port>/__annotask/ws')\n console.log('[Annotask] API: http://localhost:<port>/__annotask/api/report')\n\n // Inject bridge scripts into SSR HTML responses (Astro, etc.)\n // Sniffs content-type from writeHead, buffers only HTML responses,\n // and injects scripts before </body>.\n server.middlewares.use((req: any, res: any, next: any) => {\n if (req.url?.startsWith('/__annotask')) return next()\n\n const _end = res.end\n const _write = res.write\n const _writeHead = res.writeHead\n const chunks: string[] = []\n let isHtml = false\n let decided = false\n\n res.writeHead = function (statusCode: any, ...rest: any[]) {\n if (!decided) {\n decided = true\n const headers = rest.find((a: any) => typeof a === 'object' && a !== null)\n if (headers) {\n const ct = headers['content-type'] || headers['Content-Type']\n if (typeof ct === 'string') isHtml = ct.includes('text/html')\n }\n if (!isHtml) {\n const ct = res.getHeader('content-type')\n if (typeof ct === 'string') isHtml = ct.includes('text/html')\n }\n }\n return _writeHead.apply(res, [statusCode, ...rest])\n }\n\n res.write = function (chunk: any, ...args: any[]) {\n if (isHtml) {\n if (chunk != null) chunks.push(typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString())\n return true\n }\n return _write.apply(res, [chunk, ...args] as any)\n }\n\n res.end = function (chunk: any, ...args: any[]) {\n if (isHtml) {\n if (chunk != null && chunk !== '') chunks.push(typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString())\n if (chunks.length > 0) {\n let body = chunks.join('')\n if (body.includes('</body>') && !body.includes('__ANNOTASK_BRIDGE__')) {\n const scripts = `<script type=\"module\">${toggleButtonScript()}</script>\\n<script>${bridgeClientScript()}</script>\\n`\n body = body.replace('</body>', scripts + '</body>')\n }\n return _end.call(res, body)\n }\n }\n return _end.apply(res, [chunk, ...args] as any)\n }\n\n next()\n })\n },\n }\n\n return [transformPlugin, servePlugin]\n}\n\nexport default annotask\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/plugin/index.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite'\nimport { transformFile, transformHTML } from './transform.js'\nimport { toggleButtonScript } from './toggle-button.js'\nimport { bridgeClientScript } from './bridge-client.js'\nimport { createAnnotaskServer } from '../server/index.js'\nimport { writeServerInfo, writeMfeServerInfo } from '../server/discovery.js'\n\nexport interface AnnotaskOptions {\n /** @experimental Not yet implemented. OpenAPI spec path or URL */\n openapi?: string\n /** MFE identity for multi-project setups (e.g. '@antenna/factory').\n * Adds data-annotask-mfe attribute to all elements.\n * When used alone, annotask runs normally (shell + server available).\n * When combined with `server`, the local server is skipped and\n * .annotask/server.json points to the remote root server. */\n mfe?: string\n /** Remote annotask server URL (e.g. 'http://localhost:24678').\n * When set, the local annotask server is skipped — the root shell's\n * plugin handles the server and UI injection. Writes .annotask/server.json\n * pointing to this URL so skills/CLI connect to the root. */\n server?: string\n}\n\nexport function annotask(options: AnnotaskOptions = {}): Plugin[] {\n let projectRoot = ''\n const mfe = options.mfe\n\n const transformPlugin: Plugin = {\n name: 'annotask:transform',\n enforce: 'pre',\n apply: 'serve',\n\n configResolved(config) {\n projectRoot = config.root\n\n // When a remote server is specified, write server.json pointing to it\n // so skills/CLI in this repo connect to the root's annotask server.\n if (mfe && options.server) {\n writeMfeServerInfo(projectRoot, options.server, mfe)\n }\n },\n\n transform(code, id) {\n // Expose framework runtime for Annotask component rendering\n if (id.endsWith('/main.ts') || id.endsWith('/main.js') || id.endsWith('/main.tsx') || id.endsWith('/main.jsx')) {\n let injection = ''\n if (code.includes(\"from 'vue'\") || code.includes('from \"vue\"')) {\n injection = `\\n;import { createApp as __uf_createApp, h as __uf_h } from 'vue';\\nwindow.__ANNOTASK_VUE__ = { createApp: __uf_createApp, h: __uf_h };\\n`\n } else if (code.includes(\"from 'react'\") || code.includes('from \"react\"')) {\n injection = `\\n;import { createElement as __uf_createElement } from 'react';\\nimport { createRoot as __uf_createRoot } from 'react-dom/client';\\nwindow.__ANNOTASK_REACT__ = { createElement: __uf_createElement, createRoot: __uf_createRoot };\\n`\n } else if (code.includes(\"from 'svelte'\") || code.includes('from \"svelte\"')) {\n injection = `\\n;import { mount as __uf_mount, unmount as __uf_unmount } from 'svelte';\\nwindow.__ANNOTASK_SVELTE__ = { mount: __uf_mount, unmount: __uf_unmount };\\n`\n }\n if (injection) {\n return { code: code + injection, map: null }\n }\n }\n\n // Transform source files to inject data-annotask-* attributes\n // Note: .astro files are excluded because Astro's compiler runs before\n // our transform (even with enforce: 'pre'). Astro source mapping is\n // handled via data-astro-source-* attributes in the bridge client.\n if (!id.endsWith('.vue') && !id.endsWith('.svelte') && !/\\.[jt]sx$/.test(id)) return null\n\n const result = transformFile(code, id, projectRoot, mfe)\n if (!result) return null\n\n // Register imported PascalCase components globally\n let output = result\n const importRegex = /import\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g\n let match\n const registrations: string[] = []\n while ((match = importRegex.exec(result)) !== null) {\n const [, name, source] = match\n if (name[0] === name[0].toUpperCase() && name[0] !== name[0].toLowerCase() && !source.startsWith('.')) {\n registrations.push(`window.__ANNOTASK_COMPONENTS__['${name}'] = ${name}`)\n }\n }\n if (registrations.length > 0) {\n const regCode = `\\nif (typeof window !== 'undefined') { window.__ANNOTASK_COMPONENTS__ = window.__ANNOTASK_COMPONENTS__ || {}; ${registrations.join('; ')} }\\n`\n // Vue SFCs: inject before </script>. JSX/Svelte: append to end of file.\n if (id.endsWith('.vue') && output.includes('</script>')) {\n output = output.replace(/<\\/script>/, regCode + '</script>')\n } else {\n output += regCode\n }\n }\n\n return { code: output, map: null }\n },\n\n transformIndexHtml(html, ctx) {\n const transformed = transformHTML(html, ctx.filename, projectRoot, mfe)\n // When embedded in a root (server option set), skip bridge/toggle — root handles that\n if (options.server) {\n return transformed ?? html\n }\n return {\n html: transformed ?? html,\n tags: [\n {\n tag: 'script',\n attrs: { type: 'module' },\n children: toggleButtonScript(),\n injectTo: 'body',\n },\n {\n tag: 'script',\n children: bridgeClientScript(),\n injectTo: 'body',\n },\n ],\n }\n },\n }\n\n const servePlugin: Plugin = {\n name: 'annotask:serve',\n apply: 'serve',\n\n configureServer(server: ViteDevServer) {\n const uiServer = createAnnotaskServer({ projectRoot })\n\n // Mount middleware on Vite's connect instance\n server.middlewares.use(uiServer.middleware)\n\n // Handle WebSocket upgrades\n server.httpServer?.on('upgrade', (req, socket, head) => {\n if (req.url === '/__annotask/ws') {\n uiServer.handleUpgrade(req, socket, head)\n }\n })\n\n // Write server.json so skills/CLI know where to connect\n server.httpServer?.once('listening', () => {\n const addr = server.httpServer?.address()\n const port = typeof addr === 'object' && addr ? addr.port : 5173\n writeServerInfo(projectRoot, port)\n })\n\n console.log('[Annotask] Design tool available at /__annotask/')\n console.log('[Annotask] WebSocket: ws://localhost:<port>/__annotask/ws')\n console.log('[Annotask] API: http://localhost:<port>/__annotask/api/report')\n\n // Inject bridge scripts into SSR HTML responses (Astro, etc.)\n // Sniffs content-type from writeHead, buffers only HTML responses,\n // and injects scripts before </body>.\n server.middlewares.use((req: any, res: any, next: any) => {\n if (req.url?.startsWith('/__annotask')) return next()\n\n const _end = res.end\n const _write = res.write\n const _writeHead = res.writeHead\n const chunks: string[] = []\n let isHtml = false\n let decided = false\n\n res.writeHead = function (statusCode: any, ...rest: any[]) {\n if (!decided) {\n decided = true\n const headers = rest.find((a: any) => typeof a === 'object' && a !== null)\n if (headers) {\n const ct = headers['content-type'] || headers['Content-Type']\n if (typeof ct === 'string') isHtml = ct.includes('text/html')\n }\n if (!isHtml) {\n const ct = res.getHeader('content-type')\n if (typeof ct === 'string') isHtml = ct.includes('text/html')\n }\n }\n return _writeHead.apply(res, [statusCode, ...rest])\n }\n\n res.write = function (chunk: any, ...args: any[]) {\n if (isHtml) {\n if (chunk != null) chunks.push(typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString())\n return true\n }\n return _write.apply(res, [chunk, ...args] as any)\n }\n\n res.end = function (chunk: any, ...args: any[]) {\n if (isHtml) {\n if (chunk != null && chunk !== '') chunks.push(typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString())\n if (chunks.length > 0) {\n let body = chunks.join('')\n if (body.includes('</body>') && !body.includes('__ANNOTASK_BRIDGE__')) {\n const scripts = `<script type=\"module\">${toggleButtonScript()}</script>\\n<script>${bridgeClientScript()}</script>\\n`\n body = body.replace('</body>', scripts + '</body>')\n }\n return _end.call(res, body)\n }\n }\n return _end.apply(res, [chunk, ...args] as any)\n }\n\n next()\n })\n },\n }\n\n // When a remote server is specified, skip the serve plugin — no local\n // server, bridge, or toggle. The root shell's plugin handles all of that.\n // When only `mfe` is set (no server), annotask runs normally so the\n // shell is available for standalone testing.\n if (options.server) {\n return [transformPlugin]\n }\n\n return [transformPlugin, servePlugin]\n}\n\nexport default annotask\n"],"mappings":";;;;;;;;;;;;;;;;;AAuBO,SAAS,SAAS,UAA2B,CAAC,GAAa;AAChE,MAAI,cAAc;AAClB,QAAM,MAAM,QAAQ;AAEpB,QAAM,kBAA0B;AAAA,IAC9B,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IAEP,eAAe,QAAQ;AACrB,oBAAc,OAAO;AAIrB,UAAI,OAAO,QAAQ,QAAQ;AACzB,2BAAmB,aAAa,QAAQ,QAAQ,GAAG;AAAA,MACrD;AAAA,IACF;AAAA,IAEA,UAAU,MAAM,IAAI;AAElB,UAAI,GAAG,SAAS,UAAU,KAAK,GAAG,SAAS,UAAU,KAAK,GAAG,SAAS,WAAW,KAAK,GAAG,SAAS,WAAW,GAAG;AAC9G,YAAI,YAAY;AAChB,YAAI,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,YAAY,GAAG;AAC9D,sBAAY;AAAA;AAAA;AAAA;AAAA,QACd,WAAW,KAAK,SAAS,cAAc,KAAK,KAAK,SAAS,cAAc,GAAG;AACzE,sBAAY;AAAA;AAAA;AAAA;AAAA;AAAA,QACd,WAAW,KAAK,SAAS,eAAe,KAAK,KAAK,SAAS,eAAe,GAAG;AAC3E,sBAAY;AAAA;AAAA;AAAA;AAAA,QACd;AACA,YAAI,WAAW;AACb,iBAAO,EAAE,MAAM,OAAO,WAAW,KAAK,KAAK;AAAA,QAC7C;AAAA,MACF;AAMA,UAAI,CAAC,GAAG,SAAS,MAAM,KAAK,CAAC,GAAG,SAAS,SAAS,KAAK,CAAC,YAAY,KAAK,EAAE,EAAG,QAAO;AAErF,YAAM,SAAS,cAAc,MAAM,IAAI,aAAa,GAAG;AACvD,UAAI,CAAC,OAAQ,QAAO;AAGpB,UAAI,SAAS;AACb,YAAM,cAAc;AACpB,UAAI;AACJ,YAAM,gBAA0B,CAAC;AACjC,cAAQ,QAAQ,YAAY,KAAK,MAAM,OAAO,MAAM;AAClD,cAAM,CAAC,EAAE,MAAM,MAAM,IAAI;AACzB,YAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,YAAY,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,YAAY,KAAK,CAAC,OAAO,WAAW,GAAG,GAAG;AACrG,wBAAc,KAAK,mCAAmC,IAAI,QAAQ,IAAI,EAAE;AAAA,QAC1E;AAAA,MACF;AACA,UAAI,cAAc,SAAS,GAAG;AAC5B,cAAM,UAAU;AAAA,8GAAiH,cAAc,KAAK,IAAI,CAAC;AAAA;AAEzJ,YAAI,GAAG,SAAS,MAAM,KAAK,OAAO,SAAS,WAAW,GAAG;AACvD,mBAAS,OAAO,QAAQ,cAAc,UAAU,WAAW;AAAA,QAC7D,OAAO;AACL,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,aAAO,EAAE,MAAM,QAAQ,KAAK,KAAK;AAAA,IACnC;AAAA,IAEA,mBAAmB,MAAM,KAAK;AAC5B,YAAM,cAAc,cAAc,MAAM,IAAI,UAAU,aAAa,GAAG;AAEtE,UAAI,QAAQ,QAAQ;AAClB,eAAO,eAAe;AAAA,MACxB;AACA,aAAO;AAAA,QACL,MAAM,eAAe;AAAA,QACrB,MAAM;AAAA,UACJ;AAAA,YACE,KAAK;AAAA,YACL,OAAO,EAAE,MAAM,SAAS;AAAA,YACxB,UAAU,mBAAmB;AAAA,YAC7B,UAAU;AAAA,UACZ;AAAA,UACA;AAAA,YACE,KAAK;AAAA,YACL,UAAU,mBAAmB;AAAA,YAC7B,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAsB;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IAEP,gBAAgB,QAAuB;AACrC,YAAM,WAAW,qBAAqB,EAAE,YAAY,CAAC;AAGrD,aAAO,YAAY,IAAI,SAAS,UAAU;AAG1C,aAAO,YAAY,GAAG,WAAW,CAAC,KAAK,QAAQ,SAAS;AACtD,YAAI,IAAI,QAAQ,kBAAkB;AAChC,mBAAS,cAAc,KAAK,QAAQ,IAAI;AAAA,QAC1C;AAAA,MACF,CAAC;AAGD,aAAO,YAAY,KAAK,aAAa,MAAM;AACzC,cAAM,OAAO,OAAO,YAAY,QAAQ;AACxC,cAAM,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,OAAO;AAC5D,wBAAgB,aAAa,IAAI;AAAA,MACnC,CAAC;AAED,cAAQ,IAAI,kDAAkD;AAC9D,cAAQ,IAAI,2DAA2D;AACvE,cAAQ,IAAI,+DAA+D;AAK3E,aAAO,YAAY,IAAI,CAAC,KAAU,KAAU,SAAc;AACxD,YAAI,IAAI,KAAK,WAAW,aAAa,EAAG,QAAO,KAAK;AAEpD,cAAM,OAAO,IAAI;AACjB,cAAM,SAAS,IAAI;AACnB,cAAM,aAAa,IAAI;AACvB,cAAM,SAAmB,CAAC;AAC1B,YAAI,SAAS;AACb,YAAI,UAAU;AAEd,YAAI,YAAY,SAAU,eAAoB,MAAa;AACzD,cAAI,CAAC,SAAS;AACZ,sBAAU;AACV,kBAAM,UAAU,KAAK,KAAK,CAAC,MAAW,OAAO,MAAM,YAAY,MAAM,IAAI;AACzE,gBAAI,SAAS;AACX,oBAAM,KAAK,QAAQ,cAAc,KAAK,QAAQ,cAAc;AAC5D,kBAAI,OAAO,OAAO,SAAU,UAAS,GAAG,SAAS,WAAW;AAAA,YAC9D;AACA,gBAAI,CAAC,QAAQ;AACX,oBAAM,KAAK,IAAI,UAAU,cAAc;AACvC,kBAAI,OAAO,OAAO,SAAU,UAAS,GAAG,SAAS,WAAW;AAAA,YAC9D;AAAA,UACF;AACA,iBAAO,WAAW,MAAM,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;AAAA,QACpD;AAEA,YAAI,QAAQ,SAAU,UAAe,MAAa;AAChD,cAAI,QAAQ;AACV,gBAAI,SAAS,KAAM,QAAO,KAAK,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK,KAAK,EAAE,SAAS,CAAC;AAChG,mBAAO;AAAA,UACT;AACA,iBAAO,OAAO,MAAM,KAAK,CAAC,OAAO,GAAG,IAAI,CAAQ;AAAA,QAClD;AAEA,YAAI,MAAM,SAAU,UAAe,MAAa;AAC9C,cAAI,QAAQ;AACV,gBAAI,SAAS,QAAQ,UAAU,GAAI,QAAO,KAAK,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK,KAAK,EAAE,SAAS,CAAC;AAChH,gBAAI,OAAO,SAAS,GAAG;AACrB,kBAAI,OAAO,OAAO,KAAK,EAAE;AACzB,kBAAI,KAAK,SAAS,SAAS,KAAK,CAAC,KAAK,SAAS,qBAAqB,GAAG;AACrE,sBAAM,UAAU,yBAAyB,mBAAmB,CAAC;AAAA,UAAsB,mBAAmB,CAAC;AAAA;AACvG,uBAAO,KAAK,QAAQ,WAAW,UAAU,SAAS;AAAA,cACpD;AACA,qBAAO,KAAK,KAAK,KAAK,IAAI;AAAA,YAC5B;AAAA,UACF;AACA,iBAAO,KAAK,MAAM,KAAK,CAAC,OAAO,GAAG,IAAI,CAAQ;AAAA,QAChD;AAEA,aAAK;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF;AAMA,MAAI,QAAQ,QAAQ;AAClB,WAAO,CAAC,eAAe;AAAA,EACzB;AAEA,SAAO,CAAC,iBAAiB,WAAW;AACtC;AAEA,IAAO,iBAAQ;","names":[]}
package/dist/server.d.ts CHANGED
@@ -27,7 +27,10 @@ interface APIOptions {
27
27
  getReport: () => unknown;
28
28
  getConfig: () => unknown;
29
29
  getDesignSpec: () => unknown;
30
- getTasks: () => unknown;
30
+ getTasks: () => {
31
+ version: string;
32
+ tasks: any[];
33
+ };
31
34
  updateTask: (id: string, updates: Record<string, unknown>) => unknown;
32
35
  addTask: (task: Record<string, unknown>) => unknown;
33
36
  }
package/dist/server.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  createProjectState,
5
5
  createShellMiddleware,
6
6
  createWSServer
7
- } from "./chunk-T6TKVAAA.js";
7
+ } from "./chunk-JLOSPIJ4.js";
8
8
  export {
9
9
  createAPIMiddleware,
10
10
  createAnnotaskServer,