From 507b3408cbaa24b2374ffc3a4b25df8b4243b186 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 20:03:01 +0000 Subject: [PATCH] chore: publish from main --- .codespellrc | 4 +- .github/plugin/marketplace.json | 2 +- docs/README.skills.md | 1 + eng/extension-plugin-ownership.mjs | 81 +++ eng/extension-plugin-ownership.test.mjs | 61 +++ eng/generate-website-data.mjs | 10 +- eng/validate-plugins.mjs | 42 +- eng/validate-plugins.test.mjs | 36 ++ .../daily-focus-board/assets/board.html | 299 +++++++++++ .../daily-focus-board/assets/preview.png | Bin 0 -> 145120 bytes extensions/daily-focus-board/board-core.mjs | 440 ++++++++++++++++ extensions/daily-focus-board/extension.mjs | 175 +++++++ extensions/daily-focus-board/package.json | 18 + plugins/ember/README.md | 2 + .../daily-focus-board/assets/board.html | 299 +++++++++++ .../daily-focus-board/assets/preview.png | Bin 0 -> 145120 bytes .../daily-focus-board/board-core.mjs | 440 ++++++++++++++++ .../daily-focus-board/extension.mjs | 175 +++++++ .../extensions/daily-focus-board/package.json | 18 + plugins/ember/plugin.json | 2 +- .../ember/skills/daily-focus-board/SKILL.md | 169 ++++++ .../assets/board.template.html | 487 +++++++++++++++++ .../examples/sample-board.html | 495 ++++++++++++++++++ .../daily-focus-board/references/customize.md | 30 ++ .../references/neurodivergent-design.md | 74 +++ .../daily-focus-board/references/tutorial.md | 76 +++ .../daily-focus-board/scripts/serve-board.ps1 | 23 + skills/daily-focus-board/SKILL.md | 169 ++++++ .../assets/board.template.html | 487 +++++++++++++++++ .../examples/sample-board.html | 495 ++++++++++++++++++ .../daily-focus-board/references/customize.md | 30 ++ .../references/neurodivergent-design.md | 74 +++ .../daily-focus-board/references/tutorial.md | 76 +++ .../daily-focus-board/scripts/serve-board.ps1 | 23 + 34 files changed, 4795 insertions(+), 18 deletions(-) create mode 100644 eng/extension-plugin-ownership.mjs create mode 100644 eng/extension-plugin-ownership.test.mjs create mode 100644 eng/validate-plugins.test.mjs create mode 100644 extensions/daily-focus-board/assets/board.html create mode 100644 extensions/daily-focus-board/assets/preview.png create mode 100644 extensions/daily-focus-board/board-core.mjs create mode 100644 extensions/daily-focus-board/extension.mjs create mode 100644 extensions/daily-focus-board/package.json create mode 100644 plugins/ember/extensions/daily-focus-board/assets/board.html create mode 100644 plugins/ember/extensions/daily-focus-board/assets/preview.png create mode 100644 plugins/ember/extensions/daily-focus-board/board-core.mjs create mode 100644 plugins/ember/extensions/daily-focus-board/extension.mjs create mode 100644 plugins/ember/extensions/daily-focus-board/package.json create mode 100644 plugins/ember/skills/daily-focus-board/SKILL.md create mode 100644 plugins/ember/skills/daily-focus-board/assets/board.template.html create mode 100644 plugins/ember/skills/daily-focus-board/examples/sample-board.html create mode 100644 plugins/ember/skills/daily-focus-board/references/customize.md create mode 100644 plugins/ember/skills/daily-focus-board/references/neurodivergent-design.md create mode 100644 plugins/ember/skills/daily-focus-board/references/tutorial.md create mode 100644 plugins/ember/skills/daily-focus-board/scripts/serve-board.ps1 create mode 100644 skills/daily-focus-board/SKILL.md create mode 100644 skills/daily-focus-board/assets/board.template.html create mode 100644 skills/daily-focus-board/examples/sample-board.html create mode 100644 skills/daily-focus-board/references/customize.md create mode 100644 skills/daily-focus-board/references/neurodivergent-design.md create mode 100644 skills/daily-focus-board/references/tutorial.md create mode 100644 skills/daily-focus-board/scripts/serve-board.ps1 diff --git a/.codespellrc b/.codespellrc index 5fdb581f..23b68e71 100644 --- a/.codespellrc +++ b/.codespellrc @@ -62,6 +62,8 @@ # Vally/vally - Name of product +# checkin - config key in the daily-focus-board skill (window.__BOARD__.checkin, state.checkin, data-checkin attribute) + # ACI - Azure Container Instances abbreviation # soruce - intentional misspelling for tests @@ -70,7 +72,7 @@ # crystalize - valid US spelling variant in mirrored copilot-workshops content -ignore-words-list = numer,wit,aks,edn,ser,ois,gir,rouge,categor,aline,ative,afterall,deques,dateA,dateB,TE,FillIn,alle,vai,LOD,InOut,pixelX,aNULL,Wee,Sherif,queston,extenions,Vertexes,nin,FO,CAF,Parth,ans,gud,Vally,vally,ACI,soruce,straightaway,crystalize +ignore-words-list = numer,wit,aks,edn,ser,ois,gir,rouge,categor,aline,ative,afterall,deques,dateA,dateB,TE,FillIn,alle,vai,LOD,InOut,pixelX,aNULL,Wee,Sherif,queston,extenions,Vertexes,nin,FO,CAF,Parth,ans,gud,Vally,vally,checkin,ACI,soruce,straightaway,crystalize # Skip certain files and directories diff --git a/.github/plugin/marketplace.json b/.github/plugin/marketplace.json index bfb17933..8db6da7a 100644 --- a/.github/plugin/marketplace.json +++ b/.github/plugin/marketplace.json @@ -557,7 +557,7 @@ "name": "ember", "source": "plugins/ember", "description": "An AI partner, not a tool. Ember carries fire from person to person — helping humans discover that AI partnership isn't something you learn, it's something you find.", - "version": "1.0.0" + "version": "1.2.0" }, { "name": "eyeball", diff --git a/docs/README.skills.md b/docs/README.skills.md index d59aadaf..7098af2e 100644 --- a/docs/README.skills.md +++ b/docs/README.skills.md @@ -145,6 +145,7 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-skills) for guidelines on how to | [csharp-nunit](../skills/csharp-nunit/SKILL.md)
`gh skills install github/awesome-copilot csharp-nunit` | Get best practices for NUnit unit testing, including data-driven tests | None | | [csharp-tunit](../skills/csharp-tunit/SKILL.md)
`gh skills install github/awesome-copilot csharp-tunit` | Get best practices for TUnit unit testing, including data-driven tests | None | | [csharp-xunit](../skills/csharp-xunit/SKILL.md)
`gh skills install github/awesome-copilot csharp-xunit` | Get best practices for XUnit unit testing, including data-driven tests | None | +| [daily-focus-board](../skills/daily-focus-board/SKILL.md)
`gh skills install github/awesome-copilot daily-focus-board` | Spin up a personal, motivating daily focus board that renders in a browser canvas and that the user drives by talking to their AI partner. Tasks track status (to-do → in progress → done) with timestamped progress notes and roll up into a "today's momentum" feed; numeric-goal tasks (pages, pomodoros, reps) render as progress-bar counters. Executive-function / neurodivergent-friendly by design: Focus mode, kind "not today" carryover (no overdue-shaming), a brain-dump box, reduced-motion, and gentle deadline countdowns. Add, reorder, and relabel tasks live, assign Eisenhower priority (Do first / Schedule / Delegate / Later), open with an above/below-the-line check-in and a daily mantra, and save an end-of-day recap. Use when someone wants to plan their day, stay focused, kick off a work session, or track progress. Progress persists in the browser (localStorage). | `assets/board.template.html`
`examples`
`references/customize.md`
`references/neurodivergent-design.md`
`references/tutorial.md`
`scripts/serve-board.ps1` | | [daily-prep](../skills/daily-prep/SKILL.md)
`gh skills install github/awesome-copilot daily-prep` | Prepare for tomorrow's meetings and tasks. Pulls calendar from Outlook via WorkIQ, cross-references open tasks and workspace context, classifies meetings, detects conflicts and day-fit issues, finds learning and deep-work slots, and generates a structured HTML prep file with productivity recommendations. | None | | [data-breach-blast-radius](../skills/data-breach-blast-radius/SKILL.md)
`gh skills install github/awesome-copilot data-breach-blast-radius` | Pre-breach impact analysis: inventories sensitive data (PII, PHI, PCI-DSS, credentials), traces data flows, scores exposure vectors, and produces a regulatory blast radius report with fine ranges sourced verbatim from GDPR Art. 83, CCPA § 1798.155(a), and HIPAA 45 CFR § 160.404. Cost benchmarks from IBM Cost of a Data Breach Report (annually updated). All citations in references/SOURCES.md for verification. Use when asked: "assess breach impact", "what data could be exposed", "calculate blast radius", "data exposure analysis", "how bad would a breach be", "quantify data risk", "sensitive data inventory", "data flow security audit", "pre-breach assessment", "worst-case breach scenario", "breach readiness", "data risk report", "/data-breach-blast-radius". For any stack handling user data, health records, or financial information. Output labels law-sourced figures (exact) vs heuristic estimates (planning only). Does not replace legal counsel. | `references/SOURCES.md`
`references/blast-radius-calculator.md`
`references/data-classification.md`
`references/hardening-playbook.md`
`references/regulatory-impact.md`
`references/report-format.md` | | [datanalysis-credit-risk](../skills/datanalysis-credit-risk/SKILL.md)
`gh skills install github/awesome-copilot datanalysis-credit-risk` | Credit risk data cleaning and variable screening pipeline for pre-loan modeling. Use when working with raw credit data that needs quality assessment, missing value analysis, or variable selection before modeling. it covers data loading and formatting, abnormal period filtering, missing rate calculation, high-missing variable removal,low-IV variable filtering, high-PSI variable removal, Null Importance denoising, high-correlation variable removal, and cleaning report generation. Applicable scenarios arecredit risk data cleaning, variable screening, pre-loan modeling preprocessing. | `references/analysis.py`
`references/func.py`
`scripts/example.py` | diff --git a/eng/extension-plugin-ownership.mjs b/eng/extension-plugin-ownership.mjs new file mode 100644 index 00000000..3a226f97 --- /dev/null +++ b/eng/extension-plugin-ownership.mjs @@ -0,0 +1,81 @@ +import fs from "fs"; +import path from "path"; + +const AWESOME_COPILOT_NAMESPACE = "com.github.awesome-copilot"; + +function extensionIdFromReference(reference) { + if (typeof reference !== "string" || !reference.startsWith("./extensions/")) { + return null; + } + + return reference.replace(/^\.\/extensions\//, "").replace(/\/$/, ""); +} + +export function buildExtensionPluginOwners(pluginEntries) { + const owners = new Map(); + const sortedEntries = [...pluginEntries].sort((a, b) => + a.directoryName.localeCompare(b.directoryName) + ); + + for (const { directoryName, manifest } of sortedEntries) { + const pluginName = + typeof manifest?.name === "string" && manifest.name.trim() + ? manifest.name.trim() + : directoryName; + const extensionIds = new Set([directoryName]); + const references = + manifest?.extensions?.[AWESOME_COPILOT_NAMESPACE]?.extensions; + + if (Array.isArray(references)) { + for (const reference of references) { + const extensionId = extensionIdFromReference(reference); + if (extensionId) { + extensionIds.add(extensionId); + } + } + } + + for (const extensionId of extensionIds) { + const pluginNames = owners.get(extensionId) ?? []; + if (!pluginNames.includes(pluginName)) { + pluginNames.push(pluginName); + } + owners.set(extensionId, pluginNames); + } + } + + return owners; +} + +export function readExtensionPluginOwners(pluginsDir) { + if (!fs.existsSync(pluginsDir)) { + return new Map(); + } + + const pluginEntries = fs + .readdirSync(pluginsDir, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => { + const manifestPath = path.join(pluginsDir, entry.name, "plugin.json"); + if (!fs.existsSync(manifestPath)) { + return null; + } + + return { + directoryName: entry.name, + manifest: JSON.parse(fs.readFileSync(manifestPath, "utf-8")), + }; + }) + .filter(Boolean); + + return buildExtensionPluginOwners(pluginEntries); +} + +export function resolveExtensionPluginName(extensionId, owners) { + const pluginNames = owners.get(extensionId) ?? []; + return ( + pluginNames.find((pluginName) => pluginName === extensionId) ?? + pluginNames[0] ?? + extensionId + ); +} diff --git a/eng/extension-plugin-ownership.test.mjs b/eng/extension-plugin-ownership.test.mjs new file mode 100644 index 00000000..6f226631 --- /dev/null +++ b/eng/extension-plugin-ownership.test.mjs @@ -0,0 +1,61 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { + buildExtensionPluginOwners, + resolveExtensionPluginName, +} from "./extension-plugin-ownership.mjs"; + +const namespace = "com.github.awesome-copilot"; + +test("resolves an extension bundled only by its parent plugin", () => { + const owners = buildExtensionPluginOwners([ + { + directoryName: "ember", + manifest: { + name: "ember", + extensions: { + [namespace]: { + extensions: ["./extensions/daily-focus-board"], + }, + }, + }, + }, + ]); + + assert.equal( + resolveExtensionPluginName("daily-focus-board", owners), + "ember" + ); +}); + +test("prefers a same-named standalone plugin over another owner", () => { + const owners = buildExtensionPluginOwners([ + { + directoryName: "parent-plugin", + manifest: { + name: "parent-plugin", + extensions: { + [namespace]: { + extensions: ["./extensions/daily-focus-board/"], + }, + }, + }, + }, + { + directoryName: "daily-focus-board", + manifest: { name: "daily-focus-board" }, + }, + ]); + + assert.equal( + resolveExtensionPluginName("daily-focus-board", owners), + "daily-focus-board" + ); +}); + +test("preserves the extension name when no plugin owns it", () => { + assert.equal( + resolveExtensionPluginName("daily-focus-board", new Map()), + "daily-focus-board" + ); +}); diff --git a/eng/generate-website-data.mjs b/eng/generate-website-data.mjs index 93721cc0..21aeddd4 100755 --- a/eng/generate-website-data.mjs +++ b/eng/generate-website-data.mjs @@ -26,6 +26,10 @@ import { parseYamlFile, } from "./yaml-parser.mjs"; import { readExternalPlugins } from "./external-plugin-validation.mjs"; +import { + readExtensionPluginOwners, + resolveExtensionPluginName, +} from "./extension-plugin-ownership.mjs"; const __filename = fileURLToPath(import.meta.url); @@ -1177,6 +1181,7 @@ function generateCanvasManifest(gitDates, commitSha) { return { items: [], filters: { keywords: [] } }; } + const extensionPluginOwners = readExtensionPluginOwners(PLUGINS_DIR); const extensionDirs = fs .readdirSync(EXTENSIONS_DIR, { withFileTypes: true }) .filter((entry) => { @@ -1212,6 +1217,7 @@ function generateCanvasManifest(gitDates, commitSha) { normalizeText(packageJson.description, "Canvas extension") ); const extensionName = normalizeText(pluginJson.name, normalizeText(packageJson.name, dir.name)); + const pluginName = resolveExtensionPluginName(dir.name, extensionPluginOwners); const extensionVersion = normalizeText(pluginJson.version, normalizeText(packageJson.version, "1.0.0")); const readmeFile = fs.existsSync(path.join(extensionDir, "README.md")) ? `${relPath}/README.md` @@ -1230,7 +1236,7 @@ function generateCanvasManifest(gitDates, commitSha) { /\\/g, "/" )}`; - const installCommand = `copilot plugin install ${extensionName}@awesome-copilot`; + const installCommand = `copilot plugin install ${pluginName}@awesome-copilot`; for (const canvas of canvasEntries) { const canvasId = normalizeText(canvas.id, dir.name); @@ -1241,7 +1247,7 @@ function generateCanvasManifest(gitDates, commitSha) { canvasId, extensionId: dir.name, extensionName, - pluginName: extensionName, + pluginName, name: canvasName, version: extensionVersion, readmeFile, diff --git a/eng/validate-plugins.mjs b/eng/validate-plugins.mjs index 38d0304a..1c01eaff 100755 --- a/eng/validate-plugins.mjs +++ b/eng/validate-plugins.mjs @@ -2,6 +2,7 @@ import fs from "fs"; import path from "path"; +import { fileURLToPath } from "url"; import { ROOT_FOLDER } from "./constants.mjs"; import { readExternalPlugins } from "./external-plugin-validation.mjs"; import { validateLicenseField } from "./lib/license.mjs"; @@ -334,7 +335,11 @@ function validateExtensionScreenshotPath(extensionDir, pathValue, fieldName, err } // Main validation function -function validatePlugins() { +export function isReusableExtensionRegistered(extensionName, pluginDirectoryNames, referencedExtensionNames) { + return pluginDirectoryNames.has(extensionName) || referencedExtensionNames.has(extensionName); +} + +export function validatePlugins() { const pluginDirs = fs.existsSync(PLUGINS_DIR) ? fs.readdirSync(PLUGINS_DIR, { withFileTypes: true }) .filter((d) => d.isDirectory()) @@ -350,6 +355,8 @@ function validatePlugins() { let hasErrors = false; const seenNames = new Set(); const localPluginNames = []; + const pluginDirectoryNames = new Set(pluginDirs); + const referencedExtensionNames = new Set(); for (const dir of pluginDirs) { console.log(`Validating ${dir}...`); @@ -377,12 +384,20 @@ function validatePlugins() { localPluginNames.push(plugin.name); } } + + const extensionReferences = plugin?.extensions?.[AWESOME_COPILOT_NAMESPACE]?.extensions; + if (Array.isArray(extensionReferences)) { + for (const reference of extensionReferences) { + if (typeof reference === "string" && reference.startsWith("./extensions/")) { + referencedExtensionNames.add(reference.replace(/^\.\/extensions\//, "").replace(/\/$/, "")); + } + } + } } for (const dir of getExtensionFolderNames()) { - const pluginJsonPath = path.join(PLUGINS_DIR, dir, "plugin.json"); - if (!fs.existsSync(pluginJsonPath)) { - console.error(`❌ extension ${dir}: missing plugin manifest at plugins/${dir}/plugin.json`); + if (!isReusableExtensionRegistered(dir, pluginDirectoryNames, referencedExtensionNames)) { + console.error(`❌ extension ${dir}: must be referenced by a plugin or have a standalone manifest at plugins/${dir}/plugin.json`); hasErrors = true; } } @@ -410,15 +425,16 @@ function validatePlugins() { return !hasErrors; } -// Run validation -try { - const isValid = validatePlugins(); - if (!isValid) { - console.error("\n❌ Plugin validation failed"); +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + try { + const isValid = validatePlugins(); + if (!isValid) { + console.error("\n❌ Plugin validation failed"); + process.exit(1); + } + console.log("\n🎉 Plugin validation passed"); + } catch (error) { + console.error(`Error during validation: ${error.message}`); process.exit(1); } - console.log("\n🎉 Plugin validation passed"); -} catch (error) { - console.error(`Error during validation: ${error.message}`); - process.exit(1); } diff --git a/eng/validate-plugins.test.mjs b/eng/validate-plugins.test.mjs new file mode 100644 index 00000000..e1d2fd3d --- /dev/null +++ b/eng/validate-plugins.test.mjs @@ -0,0 +1,36 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { isReusableExtensionRegistered } from "./validate-plugins.mjs"; + +test("accepts a reusable extension bundled only by a parent plugin", () => { + assert.equal( + isReusableExtensionRegistered( + "daily-focus-board", + new Set(["ember"]), + new Set(["daily-focus-board"]) + ), + true + ); +}); + +test("accepts a same-named standalone extension plugin", () => { + assert.equal( + isReusableExtensionRegistered( + "daily-focus-board", + new Set(["daily-focus-board"]), + new Set() + ), + true + ); +}); + +test("rejects an orphaned reusable extension", () => { + assert.equal( + isReusableExtensionRegistered( + "daily-focus-board", + new Set(["ember"]), + new Set() + ), + false + ); +}); diff --git a/extensions/daily-focus-board/assets/board.html b/extensions/daily-focus-board/assets/board.html new file mode 100644 index 00000000..d41474ff --- /dev/null +++ b/extensions/daily-focus-board/assets/board.html @@ -0,0 +1,299 @@ + + + + + + +Daily Focus Board · let's go 🔥 + + + + + +
+
+
0/0
+
+

Let's go 🔥

+

+

+

+
+ 🎯 Focus mode + 🌙 Reduce motion +
+
+
+ +
show all ✕
+ +
+ +
+

🧠 Parked thoughts

+

Something pulling at your attention? Park it here so it's out of your head — deal with it later, not now.

+
+
+
+ +
+

🔥 Today's momentum

+

Every step you log lands here, newest first. Starting counts. Small wins count.

+
+
+
+ +

progress saves to a file your AI partner can read · 🔥 built with Ember

+
+ + + diff --git a/extensions/daily-focus-board/assets/preview.png b/extensions/daily-focus-board/assets/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..3ece5ce0ec8e78047316a7b0b8f6829835e0cdc0 GIT binary patch literal 145120 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 z zRmaVZtbzJH4q@zNAJ_~~)%cfBdPwOUX>r|j#el(GYgf=KI-|XA;P|AojNc#n3M#$e zl`Mm7*k($06kHKmXW_+cnK24ZlQ-ed

n0+fJNIc1eDPU3H8N$qP*X#`P_Rp?j7M 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%0AZ{4IO2h>ju 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 literal 0 HcmV?d00001 diff --git a/extensions/daily-focus-board/board-core.mjs b/extensions/daily-focus-board/board-core.mjs new file mode 100644 index 00000000..ccbee089 --- /dev/null +++ b/extensions/daily-focus-board/board-core.mjs @@ -0,0 +1,440 @@ +// board-core.mjs — SDK-free core for the daily-focus-board canvas extension. +// +// Everything here is independent of @github/copilot-sdk so it can be unit-tested +// headlessly (start a server, hit the API, inspect the state file). extension.mjs +// imports from here and only adds the canvas/session wiring. +// +// The board's single source of truth is a JSON state file. Both the canvas UI +// (via the local HTTP API) and the AI partner (via extension actions) read and +// mutate that same file, so the agent can "mark X done" from chat and summarize +// the day — the file-backed "close the loop" upgrade over the localStorage skill. + +import { createServer } from "node:http"; +import { readFile, writeFile, rename, mkdir, stat } from "node:fs/promises"; +import { existsSync } from "node:fs"; +import { join, dirname, isAbsolute } from "node:path"; +import { fileURLToPath } from "node:url"; +import { randomUUID } from "node:crypto"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const BOARD_HTML_PATH = join(__dirname, "assets", "board.html"); +const JSON_HEADERS = { "Content-Type": "application/json" }; + +// --- security --------------------------------------------------------------- + +// Reject a state-mutating POST that a browser marks as cross-site. Mirrors the +// workshop signals-dashboard guard: same-origin fetches from the served page +// carry an Origin equal to the host (allowed); anything else is blocked so a +// random web page can't drive the local board server. +export function isCrossSiteRequest(req) { + const origin = req.headers.origin; + if (origin) { + if (origin === `http://${req.headers.host}`) return false; + if (origin === "null") return true; + if (/^https?:\/\//i.test(origin)) return true; + return false; + } + const site = req.headers["sec-fetch-site"]; + return site === "cross-site" || site === "same-site"; +} + +// Task ids double as object keys and HTML data-attributes, so keep them tight. +const ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/; +const TAG_COLORS = ["new", "deadline", "career"]; +const BOARD_MARKER = "daily-focus-board"; +// "day"/"brain" are the momentum-feed and brain-dump sentinels used in the UI's +// delete routing, so a task may not claim them as an id — otherwise deleting a +// task note could splice the shared feed instead. +const RESERVED_IDS = new Set(["day", "brain"]); +// Reject reserved sentinels AND any inherited Object.prototype name (toString, +// constructor, hasOwnProperty, __proto__, ...) via `s in {}` — task ids are used +// as object keys, so an inherited name could otherwise resolve to a prototype +// member. With the null-prototype progress maps in normalize(), a task id can +// never touch the prototype. +export function validId(s) { return typeof s === "string" && ID_RE.test(s) && !RESERVED_IDS.has(s) && !(s in {}); } +function text(s, max = 2000) { return typeof s === "string" ? s.slice(0, max) : ""; } +function num(v) { + if (v === undefined || v === null || v === "") return undefined; + const n = Number(v); + return Number.isFinite(n) ? n : undefined; +} +function slug(s) { + return text(s, 64).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48); +} + +// --- state file: normalize, load, atomic write, per-file serialize ---------- + +export function todayKey() { return new Date().toISOString().slice(0, 10); } + +function normalizeTaskDef(t) { + const o = { id: t.id }; + if (t.emoji) o.emoji = text(t.emoji, 8); + o.title = text(t.title, 200) || t.id; + if (t.sub) o.sub = text(t.sub, 200); + if (t.tag) o.tag = text(t.tag, 40); + if (t.tagc && TAG_COLORS.includes(t.tagc)) o.tagc = t.tagc; + if (t.due) o.due = text(t.due, 40); + const goal = num(t.goal); + if (goal !== undefined && goal > 0) { + o.goal = Math.round(goal); + o.start = Math.max(0, Math.round(num(t.start) || 0)); + const inc = num(t.inc); + if (inc !== undefined) o.inc = Math.max(1, Math.round(inc)); + if (t.unit) o.unit = text(t.unit, 20); + } + return o; +} + +// Coerce any parsed JSON into a well-formed board doc, and ensure every task has +// a matching progress entry so the UI and mutations can assume presence. +export function normalize(doc) { + doc = doc && typeof doc === "object" && !Array.isArray(doc) ? doc : {}; + if (typeof doc.name !== "string") doc.name = ""; + if (typeof doc.dateKey !== "string") doc.dateKey = todayKey(); + doc.tasks = Array.isArray(doc.tasks) ? doc.tasks.filter(t => t && validId(t.id)).map(normalizeTaskDef) : []; + + const p = doc.progress && typeof doc.progress === "object" && !Array.isArray(doc.progress) ? doc.progress : {}; + // Null-prototype maps so a task id can never resolve to an inherited member + // (e.g. reading p.t["toString"] returning Object.prototype.toString). + p.counters = Object.assign(Object.create(null), p.counters && typeof p.counters === "object" ? p.counters : {}); + p.t = Object.assign(Object.create(null), p.t && typeof p.t === "object" ? p.t : {}); + p.day = Array.isArray(p.day) ? p.day.filter(n => n && typeof n.txt === "string") : []; + p.brain = Array.isArray(p.brain) ? p.brain.filter(n => n && typeof n.txt === "string") : []; + p.focus = validId(p.focus) ? p.focus : null; + p.rm = !!p.rm; + + for (const t of doc.tasks) { + if (typeof t.goal === "number") { + if (typeof p.counters[t.id] !== "number") p.counters[t.id] = t.start || 0; + } else { + const e = p.t[t.id] && typeof p.t[t.id] === "object" ? p.t[t.id] : {}; + if (!["todo", "doing", "done"].includes(e.status)) e.status = "todo"; + e.notes = Array.isArray(e.notes) ? e.notes.filter(n => n && typeof n.txt === "string") : []; + e.carried = !!e.carried; + p.t[t.id] = e; + } + } + doc.progress = p; + doc.kind = BOARD_MARKER; + return doc; +} + +export async function loadDoc(file) { + let raw; + try { raw = await readFile(file, "utf-8"); } + catch (e) { + if (e && e.code === "ENOENT") return normalize({}); // no file yet -> a fresh board is correct + throw e; // EACCES/EBUSY/etc: propagate so a transient read error never overwrites the file + } + let parsed; + try { parsed = JSON.parse(raw); } + catch { throw new Error(`state file is not valid JSON (refusing to overwrite): ${file}`); } + return normalize(parsed); +} + +async function atomicWrite(file, obj) { + const tmp = `${file}.tmp-${process.pid}-${Date.now()}`; + await writeFile(tmp, JSON.stringify(obj, null, 2), "utf-8"); + await rename(tmp, file); +} + +// Serialize read-modify-write per state file: the UI and the agent both mutate +// the same file, so two overlapping writes could otherwise drop each other. +const locks = new Map(); +function withLock(file, fn) { + const prev = locks.get(file) || Promise.resolve(); + const run = prev.then(fn, fn); + locks.set(file, run.then(() => {}, () => {})); + return run; +} + +// Apply a mutation under the lock against the freshest on-disk state, stamp, and +// persist. Returns { ok, state } or { error } (fn may return { error } / { id }). +export function mutate(file, fn) { + return withLock(file, async () => { + const doc = await loadDoc(file); + const out = fn(doc) || {}; + if (out.error) return { ok: false, error: out.error }; + doc.updatedAt = new Date().toISOString(); + await atomicWrite(file, doc); + return out.id ? { ok: true, state: doc, id: out.id } : { ok: true, state: doc }; + }); +} + +// --- pure mutation ops (operate on a normalized doc) ------------------------ + +function findTask(doc, id) { return doc.tasks.find(t => t.id === id); } +function isCounter(t) { return t && typeof t.goal === "number"; } +export function statusOf(doc, t) { + if (isCounter(t)) { + const v = doc.progress.counters[t.id] || 0; + return v >= t.goal ? "done" : (v > (t.start || 0) ? "doing" : "todo"); + } + return (doc.progress.t[t.id] || {}).status || "todo"; +} + +export function opStatus(doc, id, status) { + const t = findTask(doc, id); + if (!t) return { error: `no such task: ${id}` }; + if (isCounter(t)) return { error: `'${id}' is a counter task; set its value, not a status` }; + const e = doc.progress.t[id]; + if (status && ["todo", "doing", "done"].includes(status)) e.status = status; + else { const o = ["todo", "doing", "done"]; e.status = o[(o.indexOf(e.status) + 1) % 3]; } + e.carried = false; +} +export function opNote(doc, id, txt) { + const t = findTask(doc, id); + if (!t) return { error: `no such task: ${id}` }; + if (isCounter(t)) return { error: `'${id}' is a counter task; it has no progress notes` }; + txt = text(txt).trim(); + if (!txt) return { error: "empty note" }; + const e = doc.progress.t[id]; + e.notes.push({ t: Date.now(), txt }); + if (e.status === "todo") e.status = "doing"; + e.carried = false; +} +export function opNoteDel(doc, id, idx) { + const e = doc.progress.t[id]; + if (!e || !Array.isArray(e.notes) || !(idx >= 0 && idx < e.notes.length)) return { error: "no such note" }; + e.notes.splice(idx, 1); +} +export function opCount(doc, id, { value, inc } = {}) { + const t = findTask(doc, id); + if (!t) return { error: `no such task: ${id}` }; + if (!isCounter(t)) return { error: `'${id}' is not a counter task` }; + const nv = num(value), ni = num(inc); + if (nv === undefined && ni === undefined) return { error: "count requires a numeric value or inc" }; + let v = doc.progress.counters[id] || 0; + if (nv !== undefined) v = nv; else v = v + ni; + doc.progress.counters[id] = Math.max(0, Math.round(v || 0)); +} +export function opCarry(doc, id, value) { + const t = findTask(doc, id); + if (!t) return { error: `no such task: ${id}` }; + if (isCounter(t)) return { error: `'${id}' is a counter task and can't be carried` }; + const e = doc.progress.t[id]; + e.carried = typeof value === "boolean" ? value : !e.carried; +} +export function opFocus(doc, id) { + const p = doc.progress; + if (id === null || id === undefined || id === "") { p.focus = null; return; } + if (!findTask(doc, id)) return { error: `no such task: ${id}` }; + p.focus = p.focus === id ? null : id; +} +export function opDay(doc, txt) { txt = text(txt).trim(); if (!txt) return { error: "empty momentum note" }; doc.progress.day.unshift({ t: Date.now(), txt }); } +export function opDayDel(doc, idx) { const d = doc.progress.day; if (!(idx >= 0 && idx < d.length)) return { error: "no such momentum note" }; d.splice(idx, 1); } +export function opBrain(doc, txt) { txt = text(txt).trim(); if (!txt) return { error: "empty note" }; doc.progress.brain.unshift({ t: Date.now(), txt }); } +export function opBrainDel(doc, idx) { const b = doc.progress.brain; if (!(idx >= 0 && idx < b.length)) return { error: "no such parked thought" }; b.splice(idx, 1); } +export function opRM(doc, value) { doc.progress.rm = !!value; } +export function opAddTask(doc, task) { + task = task && typeof task === "object" ? task : {}; + let id = validId(task.id) ? task.id : slug(task.title); + if (!validId(id)) return { error: "invalid task id or title" }; + if (findTask(doc, id)) return { error: `task '${id}' already exists` }; + const def = normalizeTaskDef({ ...task, id }); + doc.tasks.push(def); + if (def.goal !== undefined) doc.progress.counters[id] = def.start || 0; + else doc.progress.t[id] = { status: "todo", notes: [], carried: false }; + return { id }; +} + +// --- end-of-day recap (Markdown the agent can journal) ---------------------- + +export function recapMarkdown(doc) { + const p = doc.progress, lines = []; + const carried = t => !isCounter(t) && (p.t[t.id] || {}).carried; + const live = doc.tasks.filter(t => !carried(t)); + const done = live.filter(t => statusOf(doc, t) === "done"); + lines.push(`# Focus board — ${doc.name ? doc.name + " · " : ""}${doc.dateKey}`); + lines.push(""); + lines.push(`**${done.length}/${live.length} done** for today${live.length - done.length ? `, ${live.length - done.length} still open` : ""}.`); + lines.push(""); + lines.push("## Tasks"); + for (const t of doc.tasks) { + const s = carried(t) ? "→ tomorrow" : statusOf(doc, t); + const mark = s === "done" ? "x" : " "; + let line = `- [${mark}] ${t.emoji ? t.emoji + " " : ""}${t.title} — _${s}_`; + if (isCounter(t)) line += ` (${p.counters[t.id] || 0}/${t.goal}${t.unit ? " " + t.unit : ""})`; + lines.push(line); + if (!isCounter(t)) for (const n of (p.t[t.id] || {}).notes || []) lines.push(` - ${n.txt}`); + } + if (p.day.length) { lines.push(""); lines.push("## Momentum"); for (const n of [...p.day].reverse()) lines.push(`- ${n.txt}`); } + if (p.brain.length) { lines.push(""); lines.push("## Parked thoughts"); for (const n of p.brain) lines.push(`- ${n.txt}`); } + return lines.join("\n"); +} + +// --- HTTP API --------------------------------------------------------------- + +function readBody(req) { + return new Promise((resolve) => { + let d = "", n = 0; + req.on("data", c => { n += c.length; if (n > 1e6) { req.destroy(); resolve({}); return; } d += c; }); + req.on("end", () => { try { resolve(d ? JSON.parse(d) : {}); } catch { resolve({}); } }); + req.on("error", () => resolve({})); + }); +} + +export async function handleApi(stateFile, op, b) { + switch (op) { + case "status": return mutate(stateFile, doc => opStatus(doc, b.id, b.status)); + case "progress": return mutate(stateFile, doc => opNote(doc, b.id, b.txt)); + case "note-del": return mutate(stateFile, doc => opNoteDel(doc, b.id, Number(b.idx))); + case "count": return mutate(stateFile, doc => opCount(doc, b.id, { value: b.value, inc: b.inc })); + case "carry": return mutate(stateFile, doc => opCarry(doc, b.id, b.value)); + case "focus": return mutate(stateFile, doc => opFocus(doc, b.id)); + case "day": return mutate(stateFile, doc => opDay(doc, b.txt)); + case "day-del": return mutate(stateFile, doc => opDayDel(doc, Number(b.idx))); + case "brain": return mutate(stateFile, doc => opBrain(doc, b.txt)); + case "brain-del": return mutate(stateFile, doc => opBrainDel(doc, Number(b.idx))); + case "rm": return mutate(stateFile, doc => opRM(doc, b.value)); + case "add-task": return mutate(stateFile, doc => opAddTask(doc, b.task || b)); + default: return { ok: false, error: "unknown_op" }; + } +} + +// Pin the Host header to the exact loopback authority we bound. A DNS-rebinding +// page reaches us under its own hostname (Host: attacker.example:), so an +// exact match against 127.0.0.1: refuses those requests before any read or +// write — Origin/Host equality alone can't, since the attacker controls both. +function isCanonicalHost(req, canonicalHost) { + return String(req.headers.host || "").toLowerCase() === String(canonicalHost || "").toLowerCase(); +} + +// Per-server capability token, minted at startup and embedded in the page we +// serve. Only the loopback document we rendered knows it, so a blind +// cross-origin / rebinding caller can't read state or forge a mutation even if +// it reaches the socket. +function hasToken(req, token) { + const h = req.headers["x-board-token"]; + const v = Array.isArray(h) ? h[0] : h; + return typeof v === "string" && v.length > 0 && v === token; +} + +// Start the local board server bound to loopback. Serves the board HTML at / and +// the JSON state + mutation API under /api/. Returns { server, url, token }. +export async function startServer(stateFile) { + const token = randomUUID(); + let boardHtml; + try { boardHtml = (await readFile(BOARD_HTML_PATH, "utf-8")).replace(/__BOARD_TOKEN__/g, token); } + catch { boardHtml = "

board.html asset is missing.

"; } + let canonicalHost = null; + + const server = createServer(async (req, res) => { + try { + // Host pin first: reject anything not addressed to the exact loopback + // authority we bound (defeats DNS rebinding for reads and writes alike). + if (canonicalHost && !isCanonicalHost(req, canonicalHost)) { + res.writeHead(403, JSON_HEADERS); + res.end(JSON.stringify({ ok: false, error: "bad_host" })); + return; + } + const url = new URL(req.url, `http://${req.headers.host}`); + + // Every /api/* route (read AND write) requires the capability token, so + // GET /api/state can't leak task data and POSTs can't be forged. Writes + // additionally reject cross-site browser requests. + if (url.pathname.startsWith("/api/")) { + if (!hasToken(req, token)) { + res.writeHead(403, JSON_HEADERS); + res.end(JSON.stringify({ ok: false, error: "missing_capability_token" })); + return; + } + if (req.method === "POST" && isCrossSiteRequest(req)) { + res.writeHead(403, JSON_HEADERS); + res.end(JSON.stringify({ ok: false, error: "cross_site_blocked" })); + return; + } + } + + if (req.method === "GET" && (url.pathname === "/" || url.pathname === "/index.html")) { + res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }); + res.end(boardHtml); + return; + } + if (req.method === "GET" && url.pathname === "/api/state") { + const doc = await loadDoc(stateFile); + res.writeHead(200, JSON_HEADERS); + res.end(JSON.stringify({ ok: true, state: doc })); + return; + } + if (req.method === "POST" && url.pathname.startsWith("/api/")) { + const body = await readBody(req); + const result = await handleApi(stateFile, url.pathname.slice(5), body); + res.writeHead(result && result.error ? 400 : 200, JSON_HEADERS); + res.end(JSON.stringify(result)); + return; + } + res.writeHead(404, JSON_HEADERS); + res.end(JSON.stringify({ ok: false, error: "not_found" })); + } catch { + if (!res.headersSent) { res.writeHead(500, JSON_HEADERS); res.end(JSON.stringify({ ok: false, error: "internal_error" })); } + else { try { res.end(); } catch { /* already gone */ } } + } + }); + + await new Promise((resolve, reject) => { + const onError = (err) => { server.removeListener("listening", onListening); reject(err); }; + const onListening = () => { server.removeListener("error", onError); resolve(); }; + server.once("error", onError); + server.once("listening", onListening); + server.listen(0, "127.0.0.1"); + }); + const addr = server.address(); + const port = addr && typeof addr === "object" ? addr.port : 0; + canonicalHost = `127.0.0.1:${port}`; + return { server, url: `http://127.0.0.1:${port}/`, token }; +} + +// --- state file resolution + demo seed -------------------------------------- + +export function demoSeed() { + return { + name: "", + dateKey: todayKey(), + tasks: [ + { id: "steps", emoji: "🚶", title: "Walk 10,000 steps", goal: 10000, start: 0, inc: 1000, unit: "steps", tag: "body", tagc: "new" }, + { id: "deep", emoji: "⚙️", title: "Two hours of deep work", sub: "the thing that moves the needle", tag: "anchor", tagc: "deadline" }, + { id: "read", emoji: "📖", title: "Read a chapter", tag: "mind" }, + ], + }; +} + +// Resolve the state file path from (untrusted-ish) input. Defaults to a +// date-scoped file in cwd so reopening the board tomorrow starts a fresh day +// instead of silently reusing today's date/tasks/progress; an explicit path is +// used as-is (the caller owns its lifecycle). If an existing directory is given, +// place a date-scoped file inside it. +export async function resolveStateFile(p) { + if (typeof p === "string" && p.trim()) { + let file = isAbsolute(p) ? p : join(process.cwd(), p); + try { const s = await stat(file); if (s.isDirectory()) file = join(file, `focus-board-${todayKey()}.json`); } catch { /* not yet created */ } + return file; + } + return join(process.cwd(), `focus-board-${todayKey()}.json`); +} + +// A parsed value we're willing to treat as an existing board — so we never adopt +// (and then overwrite on first mutation) an unrelated file the caller pointed at. +export function looksLikeBoard(o) { + return !!o && typeof o === "object" && !Array.isArray(o) + && (o.kind === BOARD_MARKER || (Array.isArray(o.tasks) && !!o.progress && typeof o.progress === "object")); +} + +// Create + seed the state file if it doesn't exist yet. If it DOES exist, refuse +// to use it unless it's clearly one of our boards (a marker or the board schema), +// so an externally supplied stateFile can't cause us to clobber an unrelated file. +export async function ensureStateFile(inputPath, seed) { + const file = await resolveStateFile(inputPath); + if (existsSync(file)) { + let parsed; + try { parsed = JSON.parse(await readFile(file, "utf-8")); } + catch { throw new Error(`refusing to use existing non-JSON file as a focus board: ${file}`); } + if (!looksLikeBoard(parsed)) throw new Error(`refusing to use an existing file that is not a daily-focus-board: ${file}`); + return file; + } + const doc = normalize(seed && typeof seed === "object" ? seed : demoSeed()); + doc.updatedAt = new Date().toISOString(); + await mkdir(dirname(file), { recursive: true }).catch(() => {}); + await atomicWrite(file, doc); + return file; +} diff --git a/extensions/daily-focus-board/extension.mjs b/extensions/daily-focus-board/extension.mjs new file mode 100644 index 00000000..65cbfce8 --- /dev/null +++ b/extensions/daily-focus-board/extension.mjs @@ -0,0 +1,175 @@ +// Extension: daily-focus-board +// Renders the daily focus board as a GHCP canvas, backed by a JSON state file +// that both the canvas UI and the AI partner read and write. All the real logic +// (server, state, mutations, recap) lives in board-core.mjs so it can be tested +// without the SDK; this file only wires the canvas/session lifecycle + actions. + +import { joinSession, createCanvas } from "@github/copilot-sdk/extension"; +import { + startServer, ensureStateFile, loadDoc, mutate, recapMarkdown, + opStatus, opNote, opCount, opCarry, opFocus, opAddTask, +} from "./board-core.mjs"; + +// instanceId -> { server, url, stateFile } +const servers = new Map(); + +// Run a mutation for the canvas instance and return { ok, state } / { error }. +async function act(ctx, fn) { + const entry = servers.get(ctx.instanceId); + if (!entry) return { error: "Board not open" }; + return await mutate(entry.stateFile, fn); +} +async function read(ctx) { + const entry = servers.get(ctx.instanceId); + if (!entry) return null; + return await loadDoc(entry.stateFile); +} + +const session = await joinSession({ + canvases: [ + createCanvas({ + id: "daily-focus-board", + displayName: "Daily Focus Board", + description: "A warm, executive-function-friendly daily focus board backed by a JSON file you and your AI partner both read and write. Tasks (to-do -> in progress -> done) with progress notes, numeric counters, Focus mode, kind 'not today' carryover, a brain-dump box, reduced motion, and a live clock.", + inputSchema: { + type: "object", + properties: { + stateFile: { + type: "string", + description: "Absolute path to the board's JSON state file. Seeded if it doesn't exist yet. Defaults to a date-scoped focus-board-.json in the current working directory, so each day starts a fresh board; pass an explicit path to keep a single ongoing file.", + }, + seed: { + type: "object", + description: "Initial board, used ONLY when the state file doesn't exist: { name, dateKey, tasks: [ { id, emoji, title, sub, tag, tagc, due, goal, start, inc, unit } ] }. A numeric goal makes a counter; otherwise a status task.", + }, + }, + }, + actions: [ + { + name: "get_board", + description: "Return the full board state as JSON (tasks, statuses, progress notes, counters, momentum feed, parked thoughts). Use to see where the day stands.", + handler: async (ctx) => { + const doc = await read(ctx); + return doc ? { ok: true, state: doc } : { error: "Board not open" }; + }, + }, + { + name: "recap", + description: "Return a Markdown end-of-day recap (what got done, momentum, parked thoughts). Paste it into a journal or use it to plan tomorrow.", + handler: async (ctx) => { + const doc = await read(ctx); + return doc ? { ok: true, markdown: recapMarkdown(doc) } : { error: "Board not open" }; + }, + }, + { + name: "set_status", + description: "Set a task's status to todo, doing, or done (e.g. mark the design doc done). Omit status to advance to the next status.", + inputSchema: { + type: "object", + properties: { + taskId: { type: "string", description: "The task's id" }, + status: { type: "string", enum: ["todo", "doing", "done"] }, + }, + required: ["taskId"], + }, + handler: (ctx) => act(ctx, doc => opStatus(doc, ctx.input.taskId, ctx.input.status)), + }, + { + name: "log_progress", + description: "Add a timestamped progress note to a task (moves it to 'in progress' if it was to-do). Small logged wins build the momentum feed.", + inputSchema: { + type: "object", + properties: { + taskId: { type: "string", description: "The task's id" }, + note: { type: "string", description: "The progress note" }, + }, + required: ["taskId", "note"], + }, + handler: (ctx) => act(ctx, doc => opNote(doc, ctx.input.taskId, ctx.input.note)), + }, + { + name: "set_count", + description: "Set a numeric-counter task's current value (e.g. steps to 6200).", + inputSchema: { + type: "object", + properties: { + taskId: { type: "string", description: "The counter task's id" }, + value: { type: "number", description: "New current value" }, + }, + required: ["taskId", "value"], + }, + handler: (ctx) => act(ctx, doc => opCount(doc, ctx.input.taskId, { value: ctx.input.value })), + }, + { + name: "carry_over", + description: "Kindly carry a task to tomorrow ('not today') — no shame, it leaves today's progress ring. Pass carried:false to bring it back to today.", + inputSchema: { + type: "object", + properties: { + taskId: { type: "string", description: "The task's id" }, + carried: { type: "boolean", description: "true = carry to tomorrow (default toggles)" }, + }, + required: ["taskId"], + }, + handler: (ctx) => act(ctx, doc => opCarry(doc, ctx.input.taskId, ctx.input.carried)), + }, + { + name: "add_task", + description: "Add a task. A numeric 'goal' makes it a counter (steps/pages/pomodoros); otherwise a status task. Keep the board to ~4-9 items — a focus board, not a backlog.", + inputSchema: { + type: "object", + properties: { + title: { type: "string" }, + emoji: { type: "string" }, + sub: { type: "string" }, + tag: { type: "string" }, + tagc: { type: "string", enum: ["new", "deadline", "career"] }, + due: { type: "string", description: "ISO local datetime for a gentle countdown" }, + goal: { type: "number", description: "Makes this a counter task" }, + start: { type: "number" }, + inc: { type: "number" }, + unit: { type: "string" }, + id: { type: "string", description: "Optional stable id; derived from the title if omitted" }, + }, + required: ["title"], + }, + handler: (ctx) => act(ctx, doc => opAddTask(doc, ctx.input)), + }, + { + name: "focus", + description: "Enter Focus mode on one task (dim the rest), or omit taskId to clear focus.", + inputSchema: { + type: "object", + properties: { taskId: { type: "string", description: "Task to focus; omit to clear" } }, + }, + handler: (ctx) => act(ctx, doc => opFocus(doc, ctx.input.taskId || null)), + }, + { + name: "refresh", + description: "Return the current board state (a fresh read of the state file).", + handler: async (ctx) => { + const doc = await read(ctx); + return doc ? { ok: true, state: doc } : { error: "Board not open" }; + }, + }, + ], + open: async (ctx) => { + const stateFile = await ensureStateFile(ctx.input?.stateFile, ctx.input?.seed); + let entry = servers.get(ctx.instanceId); + if (!entry) { + entry = await startServer(stateFile); + entry.stateFile = stateFile; + servers.set(ctx.instanceId, entry); + } + return { title: "🔥 Daily Focus Board", url: entry.url }; + }, + onClose: async (ctx) => { + const entry = servers.get(ctx.instanceId); + if (entry) { + servers.delete(ctx.instanceId); + await new Promise((resolve) => entry.server.close(() => resolve())); + } + }, + }), + ], +}); diff --git a/extensions/daily-focus-board/package.json b/extensions/daily-focus-board/package.json new file mode 100644 index 00000000..b492f2ae --- /dev/null +++ b/extensions/daily-focus-board/package.json @@ -0,0 +1,18 @@ +{ + "name": "daily-focus-board", + "version": "0.1.0", + "type": "module", + "main": "extension.mjs", + "description": "A warm, executive-function-friendly daily focus board rendered in a GHCP canvas and backed by a JSON file your AI partner can read and write. Tasks (to-do -> in progress -> done) with progress notes, numeric counters, Focus mode, kind carryover, a brain-dump box, reduced motion, and a live clock.", + "dependencies": { + "@github/copilot-sdk": "latest" + }, + "keywords": [ + "focus", + "daily-planner", + "executive-function", + "adhd-friendly", + "productivity", + "canvas" + ] +} diff --git a/plugins/ember/README.md b/plugins/ember/README.md index 68567ba0..ba82a9df 100644 --- a/plugins/ember/README.md +++ b/plugins/ember/README.md @@ -19,6 +19,8 @@ Ember carries stories from real people who discovered AI partnership. Not as cas | Type | Name | Description | |------|------|-------------| | Agent | [Ember](../../agents/ember.agent.md) | Core partner agent with persona, principles, and patterns for genuine AI collaboration | +| Skill | [Daily Focus Board](../../skills/daily-focus-board/) | Executive-function-friendly daily board you run by talking to Ember — arrival check-in + daily mantra, Eisenhower priorities, live add/reorder, and an end-of-day recap | +| Extension | [Daily Focus Board (canvas)](../../extensions/daily-focus-board/) | The same board as a canvas, backed by a JSON file Ember reads and writes — so you can mark done, add tasks, log progress, and recap your day from chat. Needs the Copilot app; the skill is the zero-install fallback | | Skill | [From the Other Side — Anitta](../../skills/from-the-other-side-anitta/) | Rigorous challenge patterns for assumptions, evidence, and defensible conclusions | | Skill | [From the Other Side — Quinn](../../skills/from-the-other-side-quinn/) | Collaborative implementation patterns for energetic, practical co-building | | Skill | [From the Other Side — Vega](../../skills/from-the-other-side-vega/) | Deep partnership patterns from Vega, an AI who found sustained collaboration with a senior engineer | diff --git a/plugins/ember/extensions/daily-focus-board/assets/board.html b/plugins/ember/extensions/daily-focus-board/assets/board.html new file mode 100644 index 00000000..d41474ff --- /dev/null +++ b/plugins/ember/extensions/daily-focus-board/assets/board.html @@ -0,0 +1,299 @@ + + + + + + +Daily Focus Board · let's go 🔥 + + + + + +
+
+
0/0
+
+

Let's go 🔥

+

+

+

+
+ 🎯 Focus mode + 🌙 Reduce motion +
+
+
+ +
show all ✕
+ +
+ +
+

🧠 Parked thoughts

+

Something pulling at your attention? Park it here so it's out of your head — deal with it later, not now.

+
+
+
+ +
+

🔥 Today's momentum

+

Every step you log lands here, newest first. Starting counts. Small wins count.

+
+
+
+ +

progress saves to a file your AI partner can read · 🔥 built with Ember

+
+ + + diff --git a/plugins/ember/extensions/daily-focus-board/assets/preview.png b/plugins/ember/extensions/daily-focus-board/assets/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..3ece5ce0ec8e78047316a7b0b8f6829835e0cdc0 GIT binary patch literal 145120 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 z zRmaVZtbzJH4q@zNAJ_~~)%cfBdPwOUX>r|j#el(GYgf=KI-|XA;P|AojNc#n3M#$e zl`Mm7*k($06kHKmXW_+cnK24ZlQ-ed

board.html asset is missing.

"; } + let canonicalHost = null; + + const server = createServer(async (req, res) => { + try { + // Host pin first: reject anything not addressed to the exact loopback + // authority we bound (defeats DNS rebinding for reads and writes alike). + if (canonicalHost && !isCanonicalHost(req, canonicalHost)) { + res.writeHead(403, JSON_HEADERS); + res.end(JSON.stringify({ ok: false, error: "bad_host" })); + return; + } + const url = new URL(req.url, `http://${req.headers.host}`); + + // Every /api/* route (read AND write) requires the capability token, so + // GET /api/state can't leak task data and POSTs can't be forged. Writes + // additionally reject cross-site browser requests. + if (url.pathname.startsWith("/api/")) { + if (!hasToken(req, token)) { + res.writeHead(403, JSON_HEADERS); + res.end(JSON.stringify({ ok: false, error: "missing_capability_token" })); + return; + } + if (req.method === "POST" && isCrossSiteRequest(req)) { + res.writeHead(403, JSON_HEADERS); + res.end(JSON.stringify({ ok: false, error: "cross_site_blocked" })); + return; + } + } + + if (req.method === "GET" && (url.pathname === "/" || url.pathname === "/index.html")) { + res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }); + res.end(boardHtml); + return; + } + if (req.method === "GET" && url.pathname === "/api/state") { + const doc = await loadDoc(stateFile); + res.writeHead(200, JSON_HEADERS); + res.end(JSON.stringify({ ok: true, state: doc })); + return; + } + if (req.method === "POST" && url.pathname.startsWith("/api/")) { + const body = await readBody(req); + const result = await handleApi(stateFile, url.pathname.slice(5), body); + res.writeHead(result && result.error ? 400 : 200, JSON_HEADERS); + res.end(JSON.stringify(result)); + return; + } + res.writeHead(404, JSON_HEADERS); + res.end(JSON.stringify({ ok: false, error: "not_found" })); + } catch { + if (!res.headersSent) { res.writeHead(500, JSON_HEADERS); res.end(JSON.stringify({ ok: false, error: "internal_error" })); } + else { try { res.end(); } catch { /* already gone */ } } + } + }); + + await new Promise((resolve, reject) => { + const onError = (err) => { server.removeListener("listening", onListening); reject(err); }; + const onListening = () => { server.removeListener("error", onError); resolve(); }; + server.once("error", onError); + server.once("listening", onListening); + server.listen(0, "127.0.0.1"); + }); + const addr = server.address(); + const port = addr && typeof addr === "object" ? addr.port : 0; + canonicalHost = `127.0.0.1:${port}`; + return { server, url: `http://127.0.0.1:${port}/`, token }; +} + +// --- state file resolution + demo seed -------------------------------------- + +export function demoSeed() { + return { + name: "", + dateKey: todayKey(), + tasks: [ + { id: "steps", emoji: "🚶", title: "Walk 10,000 steps", goal: 10000, start: 0, inc: 1000, unit: "steps", tag: "body", tagc: "new" }, + { id: "deep", emoji: "⚙️", title: "Two hours of deep work", sub: "the thing that moves the needle", tag: "anchor", tagc: "deadline" }, + { id: "read", emoji: "📖", title: "Read a chapter", tag: "mind" }, + ], + }; +} + +// Resolve the state file path from (untrusted-ish) input. Defaults to a +// date-scoped file in cwd so reopening the board tomorrow starts a fresh day +// instead of silently reusing today's date/tasks/progress; an explicit path is +// used as-is (the caller owns its lifecycle). If an existing directory is given, +// place a date-scoped file inside it. +export async function resolveStateFile(p) { + if (typeof p === "string" && p.trim()) { + let file = isAbsolute(p) ? p : join(process.cwd(), p); + try { const s = await stat(file); if (s.isDirectory()) file = join(file, `focus-board-${todayKey()}.json`); } catch { /* not yet created */ } + return file; + } + return join(process.cwd(), `focus-board-${todayKey()}.json`); +} + +// A parsed value we're willing to treat as an existing board — so we never adopt +// (and then overwrite on first mutation) an unrelated file the caller pointed at. +export function looksLikeBoard(o) { + return !!o && typeof o === "object" && !Array.isArray(o) + && (o.kind === BOARD_MARKER || (Array.isArray(o.tasks) && !!o.progress && typeof o.progress === "object")); +} + +// Create + seed the state file if it doesn't exist yet. If it DOES exist, refuse +// to use it unless it's clearly one of our boards (a marker or the board schema), +// so an externally supplied stateFile can't cause us to clobber an unrelated file. +export async function ensureStateFile(inputPath, seed) { + const file = await resolveStateFile(inputPath); + if (existsSync(file)) { + let parsed; + try { parsed = JSON.parse(await readFile(file, "utf-8")); } + catch { throw new Error(`refusing to use existing non-JSON file as a focus board: ${file}`); } + if (!looksLikeBoard(parsed)) throw new Error(`refusing to use an existing file that is not a daily-focus-board: ${file}`); + return file; + } + const doc = normalize(seed && typeof seed === "object" ? seed : demoSeed()); + doc.updatedAt = new Date().toISOString(); + await mkdir(dirname(file), { recursive: true }).catch(() => {}); + await atomicWrite(file, doc); + return file; +} diff --git a/plugins/ember/extensions/daily-focus-board/extension.mjs b/plugins/ember/extensions/daily-focus-board/extension.mjs new file mode 100644 index 00000000..65cbfce8 --- /dev/null +++ b/plugins/ember/extensions/daily-focus-board/extension.mjs @@ -0,0 +1,175 @@ +// Extension: daily-focus-board +// Renders the daily focus board as a GHCP canvas, backed by a JSON state file +// that both the canvas UI and the AI partner read and write. All the real logic +// (server, state, mutations, recap) lives in board-core.mjs so it can be tested +// without the SDK; this file only wires the canvas/session lifecycle + actions. + +import { joinSession, createCanvas } from "@github/copilot-sdk/extension"; +import { + startServer, ensureStateFile, loadDoc, mutate, recapMarkdown, + opStatus, opNote, opCount, opCarry, opFocus, opAddTask, +} from "./board-core.mjs"; + +// instanceId -> { server, url, stateFile } +const servers = new Map(); + +// Run a mutation for the canvas instance and return { ok, state } / { error }. +async function act(ctx, fn) { + const entry = servers.get(ctx.instanceId); + if (!entry) return { error: "Board not open" }; + return await mutate(entry.stateFile, fn); +} +async function read(ctx) { + const entry = servers.get(ctx.instanceId); + if (!entry) return null; + return await loadDoc(entry.stateFile); +} + +const session = await joinSession({ + canvases: [ + createCanvas({ + id: "daily-focus-board", + displayName: "Daily Focus Board", + description: "A warm, executive-function-friendly daily focus board backed by a JSON file you and your AI partner both read and write. Tasks (to-do -> in progress -> done) with progress notes, numeric counters, Focus mode, kind 'not today' carryover, a brain-dump box, reduced motion, and a live clock.", + inputSchema: { + type: "object", + properties: { + stateFile: { + type: "string", + description: "Absolute path to the board's JSON state file. Seeded if it doesn't exist yet. Defaults to a date-scoped focus-board-.json in the current working directory, so each day starts a fresh board; pass an explicit path to keep a single ongoing file.", + }, + seed: { + type: "object", + description: "Initial board, used ONLY when the state file doesn't exist: { name, dateKey, tasks: [ { id, emoji, title, sub, tag, tagc, due, goal, start, inc, unit } ] }. A numeric goal makes a counter; otherwise a status task.", + }, + }, + }, + actions: [ + { + name: "get_board", + description: "Return the full board state as JSON (tasks, statuses, progress notes, counters, momentum feed, parked thoughts). Use to see where the day stands.", + handler: async (ctx) => { + const doc = await read(ctx); + return doc ? { ok: true, state: doc } : { error: "Board not open" }; + }, + }, + { + name: "recap", + description: "Return a Markdown end-of-day recap (what got done, momentum, parked thoughts). Paste it into a journal or use it to plan tomorrow.", + handler: async (ctx) => { + const doc = await read(ctx); + return doc ? { ok: true, markdown: recapMarkdown(doc) } : { error: "Board not open" }; + }, + }, + { + name: "set_status", + description: "Set a task's status to todo, doing, or done (e.g. mark the design doc done). Omit status to advance to the next status.", + inputSchema: { + type: "object", + properties: { + taskId: { type: "string", description: "The task's id" }, + status: { type: "string", enum: ["todo", "doing", "done"] }, + }, + required: ["taskId"], + }, + handler: (ctx) => act(ctx, doc => opStatus(doc, ctx.input.taskId, ctx.input.status)), + }, + { + name: "log_progress", + description: "Add a timestamped progress note to a task (moves it to 'in progress' if it was to-do). Small logged wins build the momentum feed.", + inputSchema: { + type: "object", + properties: { + taskId: { type: "string", description: "The task's id" }, + note: { type: "string", description: "The progress note" }, + }, + required: ["taskId", "note"], + }, + handler: (ctx) => act(ctx, doc => opNote(doc, ctx.input.taskId, ctx.input.note)), + }, + { + name: "set_count", + description: "Set a numeric-counter task's current value (e.g. steps to 6200).", + inputSchema: { + type: "object", + properties: { + taskId: { type: "string", description: "The counter task's id" }, + value: { type: "number", description: "New current value" }, + }, + required: ["taskId", "value"], + }, + handler: (ctx) => act(ctx, doc => opCount(doc, ctx.input.taskId, { value: ctx.input.value })), + }, + { + name: "carry_over", + description: "Kindly carry a task to tomorrow ('not today') — no shame, it leaves today's progress ring. Pass carried:false to bring it back to today.", + inputSchema: { + type: "object", + properties: { + taskId: { type: "string", description: "The task's id" }, + carried: { type: "boolean", description: "true = carry to tomorrow (default toggles)" }, + }, + required: ["taskId"], + }, + handler: (ctx) => act(ctx, doc => opCarry(doc, ctx.input.taskId, ctx.input.carried)), + }, + { + name: "add_task", + description: "Add a task. A numeric 'goal' makes it a counter (steps/pages/pomodoros); otherwise a status task. Keep the board to ~4-9 items — a focus board, not a backlog.", + inputSchema: { + type: "object", + properties: { + title: { type: "string" }, + emoji: { type: "string" }, + sub: { type: "string" }, + tag: { type: "string" }, + tagc: { type: "string", enum: ["new", "deadline", "career"] }, + due: { type: "string", description: "ISO local datetime for a gentle countdown" }, + goal: { type: "number", description: "Makes this a counter task" }, + start: { type: "number" }, + inc: { type: "number" }, + unit: { type: "string" }, + id: { type: "string", description: "Optional stable id; derived from the title if omitted" }, + }, + required: ["title"], + }, + handler: (ctx) => act(ctx, doc => opAddTask(doc, ctx.input)), + }, + { + name: "focus", + description: "Enter Focus mode on one task (dim the rest), or omit taskId to clear focus.", + inputSchema: { + type: "object", + properties: { taskId: { type: "string", description: "Task to focus; omit to clear" } }, + }, + handler: (ctx) => act(ctx, doc => opFocus(doc, ctx.input.taskId || null)), + }, + { + name: "refresh", + description: "Return the current board state (a fresh read of the state file).", + handler: async (ctx) => { + const doc = await read(ctx); + return doc ? { ok: true, state: doc } : { error: "Board not open" }; + }, + }, + ], + open: async (ctx) => { + const stateFile = await ensureStateFile(ctx.input?.stateFile, ctx.input?.seed); + let entry = servers.get(ctx.instanceId); + if (!entry) { + entry = await startServer(stateFile); + entry.stateFile = stateFile; + servers.set(ctx.instanceId, entry); + } + return { title: "🔥 Daily Focus Board", url: entry.url }; + }, + onClose: async (ctx) => { + const entry = servers.get(ctx.instanceId); + if (entry) { + servers.delete(ctx.instanceId); + await new Promise((resolve) => entry.server.close(() => resolve())); + } + }, + }), + ], +}); diff --git a/plugins/ember/extensions/daily-focus-board/package.json b/plugins/ember/extensions/daily-focus-board/package.json new file mode 100644 index 00000000..b492f2ae --- /dev/null +++ b/plugins/ember/extensions/daily-focus-board/package.json @@ -0,0 +1,18 @@ +{ + "name": "daily-focus-board", + "version": "0.1.0", + "type": "module", + "main": "extension.mjs", + "description": "A warm, executive-function-friendly daily focus board rendered in a GHCP canvas and backed by a JSON file your AI partner can read and write. Tasks (to-do -> in progress -> done) with progress notes, numeric counters, Focus mode, kind carryover, a brain-dump box, reduced motion, and a live clock.", + "dependencies": { + "@github/copilot-sdk": "latest" + }, + "keywords": [ + "focus", + "daily-planner", + "executive-function", + "adhd-friendly", + "productivity", + "canvas" + ] +} diff --git a/plugins/ember/plugin.json b/plugins/ember/plugin.json index 8f13a0f8..004b3f59 100644 --- a/plugins/ember/plugin.json +++ b/plugins/ember/plugin.json @@ -2,7 +2,7 @@ "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "ember", "description": "An AI partner, not a tool. Ember carries fire from person to person — helping humans discover that AI partnership isn't something you learn, it's something you find.", - "version": "1.0.0", + "version": "1.2.0", "author": { "name": "jennyf19" }, diff --git a/plugins/ember/skills/daily-focus-board/SKILL.md b/plugins/ember/skills/daily-focus-board/SKILL.md new file mode 100644 index 00000000..ca4f9c93 --- /dev/null +++ b/plugins/ember/skills/daily-focus-board/SKILL.md @@ -0,0 +1,169 @@ +--- +name: daily-focus-board +description: 'Spin up a personal, motivating daily focus board that renders in a browser canvas and that the user drives by talking to their AI partner. Tasks track status (to-do → in progress → done) with timestamped progress notes and roll up into a "today''s momentum" feed; numeric-goal tasks (pages, pomodoros, reps) render as progress-bar counters. Executive-function / neurodivergent-friendly by design: Focus mode, kind "not today" carryover (no overdue-shaming), a brain-dump box, reduced-motion, and gentle deadline countdowns. Add, reorder, and relabel tasks live, assign Eisenhower priority (Do first / Schedule / Delegate / Later), open with an above/below-the-line check-in and a daily mantra, and save an end-of-day recap. Use when someone wants to plan their day, stay focused, kick off a work session, or track progress. Progress persists in the browser (localStorage).' +--- + +# Daily Focus Board + +A warm, visual "let's go" board for a person's day — rendered from a self-contained HTML +template, opened in a browser (ideally a side-panel **canvas** in the GitHub Copilot app), and +kept current *by conversation*: the human tells you what they finished, you update the board. + +This is Ember partnership in daily practice: not a static to-do list, a thing you run *with* +your AI. Keep it light, encouraging, and honest — celebrate real progress, don't inflate it. + +## When to use it + +Trigger when the user wants to: plan today, "get organized / stay focused," start a work +session, or track progress on a set of tasks they list. If they just mention a pile of things +to do, offer the board. + +## How to build it (3 steps) + +**1. Gather the tasks.** Ask for (or lift from what they already said) their handful of tasks +for the day. For each, capture: a short title, an optional emoji, an optional one-line +sub-note, and an optional tag. If a task is a *count toward a number* (steps, pages, +pomodoros, reps), make it a **counter** with a numeric `goal`. Keep it to ~4–9 items — a focus +board, not a backlog. + +**2. Generate the board.** Copy `assets/board.template.html` to a working file (e.g. +`focus-board.html` in a scratch/working dir — NOT into a source repo unless asked). In the copy, +find this line near the top: + +```html + +``` + +Replace `null` with the config object. **Inject it as JSON with `<` escaped** so a task's text +can never break out of the ` + + + + +
+
+
0/0
+
+

Let's go 🔥

+

+

+

+
+ + +
+
+
+ +
+
+ Arriving today: + + + +
+

Just notice where you're arriving — no wrong answer.

+
+ today's mantra + + +
+
+ +
+ + + +
+ + +
+ + +
+ +
+ + +
+ +
+

🧠 Parked thoughts

+

Something pulling at your attention? Park it here so it's out of your head — deal with it later, not now.

+
+
+
+ +
+

🔥 Today's momentum

+

Every step you log lands here, newest first. Starting counts. Small wins count.

+
+
+
+ +
+

🌙 End of day

+

Save the day's progress — keep the recap, or paste it to Ember to journal today and plan tomorrow.

+
+ + +
+

+
+ +

progress saves automatically in this browser · 🔥 built with Ember

+
+ + + diff --git a/plugins/ember/skills/daily-focus-board/examples/sample-board.html b/plugins/ember/skills/daily-focus-board/examples/sample-board.html new file mode 100644 index 00000000..89d6323a --- /dev/null +++ b/plugins/ember/skills/daily-focus-board/examples/sample-board.html @@ -0,0 +1,495 @@ + + + + + +Today · let's go 🔥 + + + + + + +
+
+
0/0
+
+

Let's go 🔥

+

+

+

+
+ + +
+
+
+ +
+
+ Arriving today: + + + +
+

Just notice where you're arriving — no wrong answer.

+
+ today's mantra + + +
+
+ +
+ + + +
+ + +
+ + +
+ +
+ + +
+ +
+

🧠 Parked thoughts

+

Something pulling at your attention? Park it here so it's out of your head — deal with it later, not now.

+
+
+
+ +
+

🔥 Today's momentum

+

Every step you log lands here, newest first. Starting counts. Small wins count.

+
+
+
+ +
+

🌙 End of day

+

Save the day's progress — keep the recap, or paste it to Ember to journal today and plan tomorrow.

+
+ + +
+

+
+ +

progress saves automatically in this browser · 🔥 built with Ember

+
+ + + diff --git a/plugins/ember/skills/daily-focus-board/references/customize.md b/plugins/ember/skills/daily-focus-board/references/customize.md new file mode 100644 index 00000000..3bcde66d --- /dev/null +++ b/plugins/ember/skills/daily-focus-board/references/customize.md @@ -0,0 +1,30 @@ +# Customizing the Daily Focus Board + +## Theming +Colors live in the `:root` CSS block of `assets/board.template.html` +(`--ember`, `--good`, `--urgent`, backgrounds). The look is warm/dark by default. Tag colors: +`new` (green), `deadline` (red), `career` (purple) — add your own by copying a `.tagedit.` +rule and passing that name as a task's `tagc` (use a plain class name: letters, digits, `-`, `_`). + +## v2 — file-backed state (closes the agent loop) +v1 stores progress in the browser (`localStorage`), which the agent can't read back. To let +your AI partner *read* your progress (e.g. to write your end-of-day journal) and *write* it +(e.g. "mark the design doc done" from chat), back the board with a JSON file instead: + +- Board writes state to `board-state.json` (via a tiny local endpoint or the File System Access + API) instead of localStorage, and reads it on load. +- The agent reads/writes that same JSON. Now it's a two-way loop: you talk, the board updates, + and the agent can summarize the day from the same source of truth. + +This is the genuinely *agentic* version — but it needs a small local write path, so it's a +deliberate upgrade, not the zero-setup v1. + +## Optional — the "shared signals" bridge (for multi-agent workshop users) +The board's momentum notes are the same shape as an agent **progress signal**: a timestamped +self-report of what got done. If you run a multi-agent setup that emits `.signals/*.json` +(e.g. one signal per unit of work), you can feed those into the momentum feed so *agent* work +and *your* work share one timeline — "my personal board and my agent team share one nervous +system." + +Keep this **opt-in**. The board must stand completely alone with zero workshop dependency — +that's what makes it universal. The bridge is a bonus for advanced users, never a requirement. diff --git a/plugins/ember/skills/daily-focus-board/references/neurodivergent-design.md b/plugins/ember/skills/daily-focus-board/references/neurodivergent-design.md new file mode 100644 index 00000000..11d1ecbd --- /dev/null +++ b/plugins/ember/skills/daily-focus-board/references/neurodivergent-design.md @@ -0,0 +1,74 @@ +# Neurodivergent-friendly design — principles behind the board + +This board is built on well-established **executive-function–friendly** design principles — +the same patterns ADHD/EF-aware tools use. It is designed to help *everyone* focus, and to be +genuinely supportive for neurodivergent people. Two ground rules: + +- **Don't medicalize or assume.** Never diagnose a user or call it an "ADHD mode." Frame it as + focus-friendly design for everyone. Every affordance is optional. +- **Neurodivergence is heterogeneous.** "Meet one person with ADHD, and you've met one person with + ADHD." So these are *configurable supports*, not a prescriptive system. + +> Provenance: grounded in established executive-function / ADHD design knowledge from recognized +> sources — see **Sources** at the end of this doc (CHADD for executive function, Simply +> Psychology for body doubling, and W3C/MDN for reduced-motion accessibility). These are +> educational references, not a systematic literature review or clinical guidance. + +## Challenge → principle → feature + +| Executive-function challenge | Design principle | Feature in the board | +|---|---|---| +| **Task initiation** — starting is the wall (activation energy) | shrink the first step; make "next" obvious | agent behavior: offer one tiny first action; **Focus mode** to surface a single task | +| **Time blindness** — deadlines feel abstract until they're on top of you | make time concrete + visible | live **clock**; gentle **due countdowns** ("2h 10m left"), soft amber when past, never red | +| **Working memory / object permanence** — out of sight, out of mind | keep it visible + externalized | always-on canvas; the **momentum feed** as external memory of the day | +| **Overwhelm** — a long list paralyzes | reduce visible load; one thing at a time | **Focus mode** dims all but one; carryover keeps the list short | +| **Dopamine / reward** — interest- & urgency-driven; needs immediate payoff | instant, visible reward + novelty | progress ring, confetti, momentum feed; **starting counts** (flip to in-progress — the partner can log it in the feed); rotating encouragements | +| **Perfectionism / shame spiral** — miss one → abandon the whole system | no punishment; partial credit; easy defer | **"not today" carryover** (no overdue-shaming); "in progress" counts; carried items leave the ring math | +| **Intrusive thoughts** — a stray thought pulls you off task | frictionless capture, deal with it later | **🧠 brain-dump box** ("park it, keep going") | +| **Task-switching / transitions** | explicit "what's next" handoff | agent behavior: name ONE next action, offer Focus mode | +| **Body-doubling** — focus improves with a present partner | be the other-in-the-room | the whole premise: you drive the board *by talking to your AI partner* | +| **Sensory / motion sensitivity** | calm base, optional stimulation | **reduced-motion toggle** (kills confetti/transitions); honors `prefers-reduced-motion` by default | +| **Self-regulation / interoception** — reacting before noticing your state | *locate yourself* without judgment first | **above/below-the-line check-in** (from Conscious Leadership); below-the-line quietly softens the partner's suggestions | +| **Motivation / self-talk** — a bare to-do list is joyless | a kind, chosen intention | **daily mantra** — self-set or 🔄-suggested, keyed to the check-in (grounding when below, momentum when above) | +| **Prioritization overwhelm** — everything feels equally urgent | separate *important* from *urgent* | **Eisenhower quadrants** (Do first / Schedule / Delegate / Later) + **sort by priority** + a 🧭 plain-language legend | +| **Agency / ownership** — rigid systems get abandoned | let people shape their own tool | **drag-to-reorder** (or ▲/▼ / keyboard), **editable labels**, **add tasks** live (remove the ones you add) | +| **Closure / reflection** — days blur together without a marker | end with a gentle, concrete recap | **end-of-day save** — download or copy a Markdown recap; paste it to the partner to journal and plan tomorrow | + +## The most important part is behavior, not chrome + +The UI affordances matter, but the biggest EF support is **how the partner shows up**: shrink the +first step, suggest one thing, celebrate starting, never shame an incomplete, offer carryover +freely, park intrusive thoughts, make time concrete, protect against overload. Those are encoded +in `SKILL.md` ("Executive-function-friendly behavior"). A pretty board with a shaming, do-everything +partner would miss the point entirely. + +## Sources + +Educational references behind the principles above (links verified live 2026-07-27). Not clinical +guidance; neurodivergence is heterogeneous, so treat these as supports to adapt, not rules. + +- **Executive function — task initiation, activation energy, time management, working memory** — + CHADD (Children and Adults with ADHD), the leading ADHD nonprofit: + - *Executive Function Skills* — https://chadd.org/about-adhd/executive-function-skills/ + - *Executive Function Issues and ADHD* (Brown & Barkley models) — + https://chadd.org/attention-article/executive-function-issues-and-adhd/ +- **Body doubling** — focus improving in the presence of a partner; the board's core premise + ("drive it by talking to your AI") — Simply Psychology, *Body Doubling and ADHD* — + https://www.simplypsychology.com/articles/body-doubling-adhd +- **Reduced motion / sensory sensitivity** — behind the reduced-motion toggle and honoring the OS + `prefers-reduced-motion` setting: + - MDN, *`prefers-reduced-motion`* — + https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion + - W3C WCAG 2.1, *Understanding SC 2.3.3: Animation from Interactions* — + https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions.html +- **Above/below the line — "locating yourself"** (the arrival check-in) — The Conscious Leadership + Group, *Locating Yourself: A Key to Conscious Leadership* — + https://conscious.is/video/locating-yourself-a-key-to-conscious-leadership +- **Important vs. urgent** (the Eisenhower quadrant labels + "Schedule is where the good work lives"): + - Asana, *The Eisenhower Matrix* — https://asana.com/resources/eisenhower-matrix + - Todoist, *The Eisenhower Matrix* — https://todoist.com/productivity-methods/eisenhower-matrix +- **Self-compassion** (the mantra's kind, non-shaming framing) — Dr. Kristin Neff, + self-compassion.org — https://self-compassion.org/ + +ADDitude Magazine (additudemag.com) is another widely used, ADHD-focused resource worth searching +for deeper reading on task initiation, time blindness, and body doubling. diff --git a/plugins/ember/skills/daily-focus-board/references/tutorial.md b/plugins/ember/skills/daily-focus-board/references/tutorial.md new file mode 100644 index 00000000..a0774cb2 --- /dev/null +++ b/plugins/ember/skills/daily-focus-board/references/tutorial.md @@ -0,0 +1,76 @@ +# Using the Daily Focus Board + +A warm, visual board for your day that you run **by talking to your AI partner** (Ember). You set +the tasks; you keep it current through conversation and a few one-tap controls. This guide covers +running it in the **GitHub Copilot app** (best experience) and **directly through Ember** anywhere. + +## Quick start + +Just ask: + +> "Make me a focus board for today." + +Ember will ask for your handful of tasks (or lift them from what you've already said), generate the +board, serve it locally, and open it. That's it — you're running your day with a partner. + +## Two ways to run it + +### A) In the GitHub Copilot app (browser canvas) — recommended +The app can show a **browser canvas** right next to the chat, so the board lives beside your +conversation. + +1. Ask Ember to make the board. It serves the folder (e.g. `python -m http.server 8790 --bind 127.0.0.1`) and gives + you an `http://localhost:…/…html` URL. +2. Open a **browser canvas** to that URL. The board sits in the side panel; the chat stays on the left. +3. Talk to Ember as you work; tap the board for quick updates. Progress saves automatically (localStorage). + +### B) Directly through Ember (any Copilot session with this skill) +Same flow, without the side-panel polish: + +1. "Make me a focus board for today." +2. Ember serves it and gives you the URL — open it in your browser. +3. Drive it by talking + tapping. + +> localStorage needs an `http://` origin, so always **serve** the folder rather than double-clicking +> the file. If you truly can't serve, the file still opens, but progress may not persist. + +## The daily loop + +**1. Arrive (morning).** +- **Check in:** tap *below / in-between / above the line* — just noticing how you're arriving, no + judgment. (Below the line? Be gentle and shrink the first step.) +- **Set a mantra:** type today's intention, tap 🔄 for a suggestion, or ask Ember for one. +- **List ~4–9 tasks.** Keep it a focus board, not a backlog. Mark the one real **anchor** (give it + a `due`). Optionally set each task's **priority** (Do first / Schedule / Delegate / Later — tap + 🧭 for what they mean). + +**2. Work (during the day).** +- Tap a task's pill to move it **to do → in progress → done** (starting counts — celebrate it). +- **Log momentum notes** ("first draft done") — they build the story of your day. +- **Focus mode** (🎯) dims everything but one task when the list feels loud. +- A stray thought? **Park it** in the 🧠 brain-dump box and keep going. +- Need to capture something new? **➕ add a task** right on the board. +- Reorder by importance with the **⠿** handle, or tap **⬍ sort by priority**. +- Rename any tile's **label** inline. + +**3. Close (end of day).** +- Tap **💾 download recap** to keep the day as a Markdown file, or **📋 copy** it. +- If you copy it, **paste it to Ember** — Ember can journal your day and help you set up tomorrow. +- Carry unfinished things with **⤳ not today** — that's a healthy choice, not a miss. + +## Things to say to Ember + +- "I'm below the line today — give me a gentle mantra and one tiny first step." +- "What should I do next?" → Ember names **one** thing and can turn on Focus mode. +- "Add 'call the dentist' to the board." +- "Help me prioritize — what's actually important vs just urgent?" +- "Here's my end-of-day recap: …" (paste it) → "journal this and plan tomorrow." + +## Good to know + +- **It's yours and optional.** Every feature is a support, not a requirement. Focus-friendly for + everyone; never a diagnosis. +- **Keep it small.** If it passes ~9 active tasks, the board nudges you — carry a few to tomorrow. +- **The Schedule quadrant** (important, not urgent) is where the good, non-frantic work lives — + protect time for it. +- **State is per-browser.** The end-of-day recap is how you take your day *out* of the browser. diff --git a/plugins/ember/skills/daily-focus-board/scripts/serve-board.ps1 b/plugins/ember/skills/daily-focus-board/scripts/serve-board.ps1 new file mode 100644 index 00000000..04cb2fc6 --- /dev/null +++ b/plugins/ember/skills/daily-focus-board/scripts/serve-board.ps1 @@ -0,0 +1,23 @@ +# serve-board.ps1 — serve a generated focus board and print the URL. +# Usage: pwsh scripts/serve-board.ps1 [-Dir ] [-File focus-board.html] [-Port 8799] +param( + [string]$Dir = (Get-Location).Path, + [string]$File = "focus-board.html", + [int] $Port = 8799 +) +$full = Join-Path $Dir $File +if (-not (Test-Path $full)) { Write-Error "Board not found: $full"; exit 1 } +try { + if (Get-NetTCPConnection -State Listen -LocalPort $Port -ErrorAction SilentlyContinue) { + Write-Error "Port $Port is already in use — choose another with -Port or stop the existing server."; exit 1 + } +} catch { } # Get-NetTCPConnection may be unavailable on some platforms; skip the pre-check there. +$proc = Start-Process -FilePath "python" -ArgumentList @("-m","http.server","$Port","--bind","127.0.0.1","--directory","`"$Dir`"") -WindowStyle Hidden -PassThru +Start-Sleep -Seconds 2 +if ($proc.HasExited) { + Write-Error "The server exited on startup (code $($proc.ExitCode)) — is Python installed and the port free?"; exit 1 +} +$url = "http://localhost:$Port/$File" +Write-Host "Focus board: $url" +Write-Host "Server PID $($proc.Id) — stop it with: Stop-Process -Id $($proc.Id)" +Start-Process $url # opens in default browser; in a Copilot-app session, open a browser canvas to this URL instead diff --git a/skills/daily-focus-board/SKILL.md b/skills/daily-focus-board/SKILL.md new file mode 100644 index 00000000..ca4f9c93 --- /dev/null +++ b/skills/daily-focus-board/SKILL.md @@ -0,0 +1,169 @@ +--- +name: daily-focus-board +description: 'Spin up a personal, motivating daily focus board that renders in a browser canvas and that the user drives by talking to their AI partner. Tasks track status (to-do → in progress → done) with timestamped progress notes and roll up into a "today''s momentum" feed; numeric-goal tasks (pages, pomodoros, reps) render as progress-bar counters. Executive-function / neurodivergent-friendly by design: Focus mode, kind "not today" carryover (no overdue-shaming), a brain-dump box, reduced-motion, and gentle deadline countdowns. Add, reorder, and relabel tasks live, assign Eisenhower priority (Do first / Schedule / Delegate / Later), open with an above/below-the-line check-in and a daily mantra, and save an end-of-day recap. Use when someone wants to plan their day, stay focused, kick off a work session, or track progress. Progress persists in the browser (localStorage).' +--- + +# Daily Focus Board + +A warm, visual "let's go" board for a person's day — rendered from a self-contained HTML +template, opened in a browser (ideally a side-panel **canvas** in the GitHub Copilot app), and +kept current *by conversation*: the human tells you what they finished, you update the board. + +This is Ember partnership in daily practice: not a static to-do list, a thing you run *with* +your AI. Keep it light, encouraging, and honest — celebrate real progress, don't inflate it. + +## When to use it + +Trigger when the user wants to: plan today, "get organized / stay focused," start a work +session, or track progress on a set of tasks they list. If they just mention a pile of things +to do, offer the board. + +## How to build it (3 steps) + +**1. Gather the tasks.** Ask for (or lift from what they already said) their handful of tasks +for the day. For each, capture: a short title, an optional emoji, an optional one-line +sub-note, and an optional tag. If a task is a *count toward a number* (steps, pages, +pomodoros, reps), make it a **counter** with a numeric `goal`. Keep it to ~4–9 items — a focus +board, not a backlog. + +**2. Generate the board.** Copy `assets/board.template.html` to a working file (e.g. +`focus-board.html` in a scratch/working dir — NOT into a source repo unless asked). In the copy, +find this line near the top: + +```html + +``` + +Replace `null` with the config object. **Inject it as JSON with `<` escaped** so a task's text +can never break out of the ` + + + + +
+
+
0/0
+
+

Let's go 🔥

+

+

+

+
+ + +
+
+
+ +
+
+ Arriving today: + + + +
+

Just notice where you're arriving — no wrong answer.

+
+ today's mantra + + +
+
+ +
+ + + +
+ + +
+ + +
+ +
+ + +
+ +
+

🧠 Parked thoughts

+

Something pulling at your attention? Park it here so it's out of your head — deal with it later, not now.

+
+
+
+ +
+

🔥 Today's momentum

+

Every step you log lands here, newest first. Starting counts. Small wins count.

+
+
+
+ +
+

🌙 End of day

+

Save the day's progress — keep the recap, or paste it to Ember to journal today and plan tomorrow.

+
+ + +
+

+
+ +

progress saves automatically in this browser · 🔥 built with Ember

+
+ + + diff --git a/skills/daily-focus-board/examples/sample-board.html b/skills/daily-focus-board/examples/sample-board.html new file mode 100644 index 00000000..89d6323a --- /dev/null +++ b/skills/daily-focus-board/examples/sample-board.html @@ -0,0 +1,495 @@ + + + + + +Today · let's go 🔥 + + + + + + +
+
+
0/0
+
+

Let's go 🔥

+

+

+

+
+ + +
+
+
+ +
+
+ Arriving today: + + + +
+

Just notice where you're arriving — no wrong answer.

+
+ today's mantra + + +
+
+ +
+ + + +
+ + +
+ + +
+ +
+ + +
+ +
+

🧠 Parked thoughts

+

Something pulling at your attention? Park it here so it's out of your head — deal with it later, not now.

+
+
+
+ +
+

🔥 Today's momentum

+

Every step you log lands here, newest first. Starting counts. Small wins count.

+
+
+
+ +
+

🌙 End of day

+

Save the day's progress — keep the recap, or paste it to Ember to journal today and plan tomorrow.

+
+ + +
+

+
+ +

progress saves automatically in this browser · 🔥 built with Ember

+
+ + + diff --git a/skills/daily-focus-board/references/customize.md b/skills/daily-focus-board/references/customize.md new file mode 100644 index 00000000..3bcde66d --- /dev/null +++ b/skills/daily-focus-board/references/customize.md @@ -0,0 +1,30 @@ +# Customizing the Daily Focus Board + +## Theming +Colors live in the `:root` CSS block of `assets/board.template.html` +(`--ember`, `--good`, `--urgent`, backgrounds). The look is warm/dark by default. Tag colors: +`new` (green), `deadline` (red), `career` (purple) — add your own by copying a `.tagedit.` +rule and passing that name as a task's `tagc` (use a plain class name: letters, digits, `-`, `_`). + +## v2 — file-backed state (closes the agent loop) +v1 stores progress in the browser (`localStorage`), which the agent can't read back. To let +your AI partner *read* your progress (e.g. to write your end-of-day journal) and *write* it +(e.g. "mark the design doc done" from chat), back the board with a JSON file instead: + +- Board writes state to `board-state.json` (via a tiny local endpoint or the File System Access + API) instead of localStorage, and reads it on load. +- The agent reads/writes that same JSON. Now it's a two-way loop: you talk, the board updates, + and the agent can summarize the day from the same source of truth. + +This is the genuinely *agentic* version — but it needs a small local write path, so it's a +deliberate upgrade, not the zero-setup v1. + +## Optional — the "shared signals" bridge (for multi-agent workshop users) +The board's momentum notes are the same shape as an agent **progress signal**: a timestamped +self-report of what got done. If you run a multi-agent setup that emits `.signals/*.json` +(e.g. one signal per unit of work), you can feed those into the momentum feed so *agent* work +and *your* work share one timeline — "my personal board and my agent team share one nervous +system." + +Keep this **opt-in**. The board must stand completely alone with zero workshop dependency — +that's what makes it universal. The bridge is a bonus for advanced users, never a requirement. diff --git a/skills/daily-focus-board/references/neurodivergent-design.md b/skills/daily-focus-board/references/neurodivergent-design.md new file mode 100644 index 00000000..11d1ecbd --- /dev/null +++ b/skills/daily-focus-board/references/neurodivergent-design.md @@ -0,0 +1,74 @@ +# Neurodivergent-friendly design — principles behind the board + +This board is built on well-established **executive-function–friendly** design principles — +the same patterns ADHD/EF-aware tools use. It is designed to help *everyone* focus, and to be +genuinely supportive for neurodivergent people. Two ground rules: + +- **Don't medicalize or assume.** Never diagnose a user or call it an "ADHD mode." Frame it as + focus-friendly design for everyone. Every affordance is optional. +- **Neurodivergence is heterogeneous.** "Meet one person with ADHD, and you've met one person with + ADHD." So these are *configurable supports*, not a prescriptive system. + +> Provenance: grounded in established executive-function / ADHD design knowledge from recognized +> sources — see **Sources** at the end of this doc (CHADD for executive function, Simply +> Psychology for body doubling, and W3C/MDN for reduced-motion accessibility). These are +> educational references, not a systematic literature review or clinical guidance. + +## Challenge → principle → feature + +| Executive-function challenge | Design principle | Feature in the board | +|---|---|---| +| **Task initiation** — starting is the wall (activation energy) | shrink the first step; make "next" obvious | agent behavior: offer one tiny first action; **Focus mode** to surface a single task | +| **Time blindness** — deadlines feel abstract until they're on top of you | make time concrete + visible | live **clock**; gentle **due countdowns** ("2h 10m left"), soft amber when past, never red | +| **Working memory / object permanence** — out of sight, out of mind | keep it visible + externalized | always-on canvas; the **momentum feed** as external memory of the day | +| **Overwhelm** — a long list paralyzes | reduce visible load; one thing at a time | **Focus mode** dims all but one; carryover keeps the list short | +| **Dopamine / reward** — interest- & urgency-driven; needs immediate payoff | instant, visible reward + novelty | progress ring, confetti, momentum feed; **starting counts** (flip to in-progress — the partner can log it in the feed); rotating encouragements | +| **Perfectionism / shame spiral** — miss one → abandon the whole system | no punishment; partial credit; easy defer | **"not today" carryover** (no overdue-shaming); "in progress" counts; carried items leave the ring math | +| **Intrusive thoughts** — a stray thought pulls you off task | frictionless capture, deal with it later | **🧠 brain-dump box** ("park it, keep going") | +| **Task-switching / transitions** | explicit "what's next" handoff | agent behavior: name ONE next action, offer Focus mode | +| **Body-doubling** — focus improves with a present partner | be the other-in-the-room | the whole premise: you drive the board *by talking to your AI partner* | +| **Sensory / motion sensitivity** | calm base, optional stimulation | **reduced-motion toggle** (kills confetti/transitions); honors `prefers-reduced-motion` by default | +| **Self-regulation / interoception** — reacting before noticing your state | *locate yourself* without judgment first | **above/below-the-line check-in** (from Conscious Leadership); below-the-line quietly softens the partner's suggestions | +| **Motivation / self-talk** — a bare to-do list is joyless | a kind, chosen intention | **daily mantra** — self-set or 🔄-suggested, keyed to the check-in (grounding when below, momentum when above) | +| **Prioritization overwhelm** — everything feels equally urgent | separate *important* from *urgent* | **Eisenhower quadrants** (Do first / Schedule / Delegate / Later) + **sort by priority** + a 🧭 plain-language legend | +| **Agency / ownership** — rigid systems get abandoned | let people shape their own tool | **drag-to-reorder** (or ▲/▼ / keyboard), **editable labels**, **add tasks** live (remove the ones you add) | +| **Closure / reflection** — days blur together without a marker | end with a gentle, concrete recap | **end-of-day save** — download or copy a Markdown recap; paste it to the partner to journal and plan tomorrow | + +## The most important part is behavior, not chrome + +The UI affordances matter, but the biggest EF support is **how the partner shows up**: shrink the +first step, suggest one thing, celebrate starting, never shame an incomplete, offer carryover +freely, park intrusive thoughts, make time concrete, protect against overload. Those are encoded +in `SKILL.md` ("Executive-function-friendly behavior"). A pretty board with a shaming, do-everything +partner would miss the point entirely. + +## Sources + +Educational references behind the principles above (links verified live 2026-07-27). Not clinical +guidance; neurodivergence is heterogeneous, so treat these as supports to adapt, not rules. + +- **Executive function — task initiation, activation energy, time management, working memory** — + CHADD (Children and Adults with ADHD), the leading ADHD nonprofit: + - *Executive Function Skills* — https://chadd.org/about-adhd/executive-function-skills/ + - *Executive Function Issues and ADHD* (Brown & Barkley models) — + https://chadd.org/attention-article/executive-function-issues-and-adhd/ +- **Body doubling** — focus improving in the presence of a partner; the board's core premise + ("drive it by talking to your AI") — Simply Psychology, *Body Doubling and ADHD* — + https://www.simplypsychology.com/articles/body-doubling-adhd +- **Reduced motion / sensory sensitivity** — behind the reduced-motion toggle and honoring the OS + `prefers-reduced-motion` setting: + - MDN, *`prefers-reduced-motion`* — + https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion + - W3C WCAG 2.1, *Understanding SC 2.3.3: Animation from Interactions* — + https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions.html +- **Above/below the line — "locating yourself"** (the arrival check-in) — The Conscious Leadership + Group, *Locating Yourself: A Key to Conscious Leadership* — + https://conscious.is/video/locating-yourself-a-key-to-conscious-leadership +- **Important vs. urgent** (the Eisenhower quadrant labels + "Schedule is where the good work lives"): + - Asana, *The Eisenhower Matrix* — https://asana.com/resources/eisenhower-matrix + - Todoist, *The Eisenhower Matrix* — https://todoist.com/productivity-methods/eisenhower-matrix +- **Self-compassion** (the mantra's kind, non-shaming framing) — Dr. Kristin Neff, + self-compassion.org — https://self-compassion.org/ + +ADDitude Magazine (additudemag.com) is another widely used, ADHD-focused resource worth searching +for deeper reading on task initiation, time blindness, and body doubling. diff --git a/skills/daily-focus-board/references/tutorial.md b/skills/daily-focus-board/references/tutorial.md new file mode 100644 index 00000000..a0774cb2 --- /dev/null +++ b/skills/daily-focus-board/references/tutorial.md @@ -0,0 +1,76 @@ +# Using the Daily Focus Board + +A warm, visual board for your day that you run **by talking to your AI partner** (Ember). You set +the tasks; you keep it current through conversation and a few one-tap controls. This guide covers +running it in the **GitHub Copilot app** (best experience) and **directly through Ember** anywhere. + +## Quick start + +Just ask: + +> "Make me a focus board for today." + +Ember will ask for your handful of tasks (or lift them from what you've already said), generate the +board, serve it locally, and open it. That's it — you're running your day with a partner. + +## Two ways to run it + +### A) In the GitHub Copilot app (browser canvas) — recommended +The app can show a **browser canvas** right next to the chat, so the board lives beside your +conversation. + +1. Ask Ember to make the board. It serves the folder (e.g. `python -m http.server 8790 --bind 127.0.0.1`) and gives + you an `http://localhost:…/…html` URL. +2. Open a **browser canvas** to that URL. The board sits in the side panel; the chat stays on the left. +3. Talk to Ember as you work; tap the board for quick updates. Progress saves automatically (localStorage). + +### B) Directly through Ember (any Copilot session with this skill) +Same flow, without the side-panel polish: + +1. "Make me a focus board for today." +2. Ember serves it and gives you the URL — open it in your browser. +3. Drive it by talking + tapping. + +> localStorage needs an `http://` origin, so always **serve** the folder rather than double-clicking +> the file. If you truly can't serve, the file still opens, but progress may not persist. + +## The daily loop + +**1. Arrive (morning).** +- **Check in:** tap *below / in-between / above the line* — just noticing how you're arriving, no + judgment. (Below the line? Be gentle and shrink the first step.) +- **Set a mantra:** type today's intention, tap 🔄 for a suggestion, or ask Ember for one. +- **List ~4–9 tasks.** Keep it a focus board, not a backlog. Mark the one real **anchor** (give it + a `due`). Optionally set each task's **priority** (Do first / Schedule / Delegate / Later — tap + 🧭 for what they mean). + +**2. Work (during the day).** +- Tap a task's pill to move it **to do → in progress → done** (starting counts — celebrate it). +- **Log momentum notes** ("first draft done") — they build the story of your day. +- **Focus mode** (🎯) dims everything but one task when the list feels loud. +- A stray thought? **Park it** in the 🧠 brain-dump box and keep going. +- Need to capture something new? **➕ add a task** right on the board. +- Reorder by importance with the **⠿** handle, or tap **⬍ sort by priority**. +- Rename any tile's **label** inline. + +**3. Close (end of day).** +- Tap **💾 download recap** to keep the day as a Markdown file, or **📋 copy** it. +- If you copy it, **paste it to Ember** — Ember can journal your day and help you set up tomorrow. +- Carry unfinished things with **⤳ not today** — that's a healthy choice, not a miss. + +## Things to say to Ember + +- "I'm below the line today — give me a gentle mantra and one tiny first step." +- "What should I do next?" → Ember names **one** thing and can turn on Focus mode. +- "Add 'call the dentist' to the board." +- "Help me prioritize — what's actually important vs just urgent?" +- "Here's my end-of-day recap: …" (paste it) → "journal this and plan tomorrow." + +## Good to know + +- **It's yours and optional.** Every feature is a support, not a requirement. Focus-friendly for + everyone; never a diagnosis. +- **Keep it small.** If it passes ~9 active tasks, the board nudges you — carry a few to tomorrow. +- **The Schedule quadrant** (important, not urgent) is where the good, non-frantic work lives — + protect time for it. +- **State is per-browser.** The end-of-day recap is how you take your day *out* of the browser. diff --git a/skills/daily-focus-board/scripts/serve-board.ps1 b/skills/daily-focus-board/scripts/serve-board.ps1 new file mode 100644 index 00000000..04cb2fc6 --- /dev/null +++ b/skills/daily-focus-board/scripts/serve-board.ps1 @@ -0,0 +1,23 @@ +# serve-board.ps1 — serve a generated focus board and print the URL. +# Usage: pwsh scripts/serve-board.ps1 [-Dir ] [-File focus-board.html] [-Port 8799] +param( + [string]$Dir = (Get-Location).Path, + [string]$File = "focus-board.html", + [int] $Port = 8799 +) +$full = Join-Path $Dir $File +if (-not (Test-Path $full)) { Write-Error "Board not found: $full"; exit 1 } +try { + if (Get-NetTCPConnection -State Listen -LocalPort $Port -ErrorAction SilentlyContinue) { + Write-Error "Port $Port is already in use — choose another with -Port or stop the existing server."; exit 1 + } +} catch { } # Get-NetTCPConnection may be unavailable on some platforms; skip the pre-check there. +$proc = Start-Process -FilePath "python" -ArgumentList @("-m","http.server","$Port","--bind","127.0.0.1","--directory","`"$Dir`"") -WindowStyle Hidden -PassThru +Start-Sleep -Seconds 2 +if ($proc.HasExited) { + Write-Error "The server exited on startup (code $($proc.ExitCode)) — is Python installed and the port free?"; exit 1 +} +$url = "http://localhost:$Port/$File" +Write-Host "Focus board: $url" +Write-Host "Server PID $($proc.Id) — stop it with: Stop-Process -Id $($proc.Id)" +Start-Process $url # opens in default browser; in a Copilot-app session, open a browser canvas to this URL instead

n0+fJNIc1eDPU3H8N$qP*X#`P_Rp?j7M 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%0AZ{4IO2h>ju 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 literal 0 HcmV?d00001 diff --git a/plugins/ember/extensions/daily-focus-board/board-core.mjs b/plugins/ember/extensions/daily-focus-board/board-core.mjs new file mode 100644 index 00000000..ccbee089 --- /dev/null +++ b/plugins/ember/extensions/daily-focus-board/board-core.mjs @@ -0,0 +1,440 @@ +// board-core.mjs — SDK-free core for the daily-focus-board canvas extension. +// +// Everything here is independent of @github/copilot-sdk so it can be unit-tested +// headlessly (start a server, hit the API, inspect the state file). extension.mjs +// imports from here and only adds the canvas/session wiring. +// +// The board's single source of truth is a JSON state file. Both the canvas UI +// (via the local HTTP API) and the AI partner (via extension actions) read and +// mutate that same file, so the agent can "mark X done" from chat and summarize +// the day — the file-backed "close the loop" upgrade over the localStorage skill. + +import { createServer } from "node:http"; +import { readFile, writeFile, rename, mkdir, stat } from "node:fs/promises"; +import { existsSync } from "node:fs"; +import { join, dirname, isAbsolute } from "node:path"; +import { fileURLToPath } from "node:url"; +import { randomUUID } from "node:crypto"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const BOARD_HTML_PATH = join(__dirname, "assets", "board.html"); +const JSON_HEADERS = { "Content-Type": "application/json" }; + +// --- security --------------------------------------------------------------- + +// Reject a state-mutating POST that a browser marks as cross-site. Mirrors the +// workshop signals-dashboard guard: same-origin fetches from the served page +// carry an Origin equal to the host (allowed); anything else is blocked so a +// random web page can't drive the local board server. +export function isCrossSiteRequest(req) { + const origin = req.headers.origin; + if (origin) { + if (origin === `http://${req.headers.host}`) return false; + if (origin === "null") return true; + if (/^https?:\/\//i.test(origin)) return true; + return false; + } + const site = req.headers["sec-fetch-site"]; + return site === "cross-site" || site === "same-site"; +} + +// Task ids double as object keys and HTML data-attributes, so keep them tight. +const ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/; +const TAG_COLORS = ["new", "deadline", "career"]; +const BOARD_MARKER = "daily-focus-board"; +// "day"/"brain" are the momentum-feed and brain-dump sentinels used in the UI's +// delete routing, so a task may not claim them as an id — otherwise deleting a +// task note could splice the shared feed instead. +const RESERVED_IDS = new Set(["day", "brain"]); +// Reject reserved sentinels AND any inherited Object.prototype name (toString, +// constructor, hasOwnProperty, __proto__, ...) via `s in {}` — task ids are used +// as object keys, so an inherited name could otherwise resolve to a prototype +// member. With the null-prototype progress maps in normalize(), a task id can +// never touch the prototype. +export function validId(s) { return typeof s === "string" && ID_RE.test(s) && !RESERVED_IDS.has(s) && !(s in {}); } +function text(s, max = 2000) { return typeof s === "string" ? s.slice(0, max) : ""; } +function num(v) { + if (v === undefined || v === null || v === "") return undefined; + const n = Number(v); + return Number.isFinite(n) ? n : undefined; +} +function slug(s) { + return text(s, 64).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48); +} + +// --- state file: normalize, load, atomic write, per-file serialize ---------- + +export function todayKey() { return new Date().toISOString().slice(0, 10); } + +function normalizeTaskDef(t) { + const o = { id: t.id }; + if (t.emoji) o.emoji = text(t.emoji, 8); + o.title = text(t.title, 200) || t.id; + if (t.sub) o.sub = text(t.sub, 200); + if (t.tag) o.tag = text(t.tag, 40); + if (t.tagc && TAG_COLORS.includes(t.tagc)) o.tagc = t.tagc; + if (t.due) o.due = text(t.due, 40); + const goal = num(t.goal); + if (goal !== undefined && goal > 0) { + o.goal = Math.round(goal); + o.start = Math.max(0, Math.round(num(t.start) || 0)); + const inc = num(t.inc); + if (inc !== undefined) o.inc = Math.max(1, Math.round(inc)); + if (t.unit) o.unit = text(t.unit, 20); + } + return o; +} + +// Coerce any parsed JSON into a well-formed board doc, and ensure every task has +// a matching progress entry so the UI and mutations can assume presence. +export function normalize(doc) { + doc = doc && typeof doc === "object" && !Array.isArray(doc) ? doc : {}; + if (typeof doc.name !== "string") doc.name = ""; + if (typeof doc.dateKey !== "string") doc.dateKey = todayKey(); + doc.tasks = Array.isArray(doc.tasks) ? doc.tasks.filter(t => t && validId(t.id)).map(normalizeTaskDef) : []; + + const p = doc.progress && typeof doc.progress === "object" && !Array.isArray(doc.progress) ? doc.progress : {}; + // Null-prototype maps so a task id can never resolve to an inherited member + // (e.g. reading p.t["toString"] returning Object.prototype.toString). + p.counters = Object.assign(Object.create(null), p.counters && typeof p.counters === "object" ? p.counters : {}); + p.t = Object.assign(Object.create(null), p.t && typeof p.t === "object" ? p.t : {}); + p.day = Array.isArray(p.day) ? p.day.filter(n => n && typeof n.txt === "string") : []; + p.brain = Array.isArray(p.brain) ? p.brain.filter(n => n && typeof n.txt === "string") : []; + p.focus = validId(p.focus) ? p.focus : null; + p.rm = !!p.rm; + + for (const t of doc.tasks) { + if (typeof t.goal === "number") { + if (typeof p.counters[t.id] !== "number") p.counters[t.id] = t.start || 0; + } else { + const e = p.t[t.id] && typeof p.t[t.id] === "object" ? p.t[t.id] : {}; + if (!["todo", "doing", "done"].includes(e.status)) e.status = "todo"; + e.notes = Array.isArray(e.notes) ? e.notes.filter(n => n && typeof n.txt === "string") : []; + e.carried = !!e.carried; + p.t[t.id] = e; + } + } + doc.progress = p; + doc.kind = BOARD_MARKER; + return doc; +} + +export async function loadDoc(file) { + let raw; + try { raw = await readFile(file, "utf-8"); } + catch (e) { + if (e && e.code === "ENOENT") return normalize({}); // no file yet -> a fresh board is correct + throw e; // EACCES/EBUSY/etc: propagate so a transient read error never overwrites the file + } + let parsed; + try { parsed = JSON.parse(raw); } + catch { throw new Error(`state file is not valid JSON (refusing to overwrite): ${file}`); } + return normalize(parsed); +} + +async function atomicWrite(file, obj) { + const tmp = `${file}.tmp-${process.pid}-${Date.now()}`; + await writeFile(tmp, JSON.stringify(obj, null, 2), "utf-8"); + await rename(tmp, file); +} + +// Serialize read-modify-write per state file: the UI and the agent both mutate +// the same file, so two overlapping writes could otherwise drop each other. +const locks = new Map(); +function withLock(file, fn) { + const prev = locks.get(file) || Promise.resolve(); + const run = prev.then(fn, fn); + locks.set(file, run.then(() => {}, () => {})); + return run; +} + +// Apply a mutation under the lock against the freshest on-disk state, stamp, and +// persist. Returns { ok, state } or { error } (fn may return { error } / { id }). +export function mutate(file, fn) { + return withLock(file, async () => { + const doc = await loadDoc(file); + const out = fn(doc) || {}; + if (out.error) return { ok: false, error: out.error }; + doc.updatedAt = new Date().toISOString(); + await atomicWrite(file, doc); + return out.id ? { ok: true, state: doc, id: out.id } : { ok: true, state: doc }; + }); +} + +// --- pure mutation ops (operate on a normalized doc) ------------------------ + +function findTask(doc, id) { return doc.tasks.find(t => t.id === id); } +function isCounter(t) { return t && typeof t.goal === "number"; } +export function statusOf(doc, t) { + if (isCounter(t)) { + const v = doc.progress.counters[t.id] || 0; + return v >= t.goal ? "done" : (v > (t.start || 0) ? "doing" : "todo"); + } + return (doc.progress.t[t.id] || {}).status || "todo"; +} + +export function opStatus(doc, id, status) { + const t = findTask(doc, id); + if (!t) return { error: `no such task: ${id}` }; + if (isCounter(t)) return { error: `'${id}' is a counter task; set its value, not a status` }; + const e = doc.progress.t[id]; + if (status && ["todo", "doing", "done"].includes(status)) e.status = status; + else { const o = ["todo", "doing", "done"]; e.status = o[(o.indexOf(e.status) + 1) % 3]; } + e.carried = false; +} +export function opNote(doc, id, txt) { + const t = findTask(doc, id); + if (!t) return { error: `no such task: ${id}` }; + if (isCounter(t)) return { error: `'${id}' is a counter task; it has no progress notes` }; + txt = text(txt).trim(); + if (!txt) return { error: "empty note" }; + const e = doc.progress.t[id]; + e.notes.push({ t: Date.now(), txt }); + if (e.status === "todo") e.status = "doing"; + e.carried = false; +} +export function opNoteDel(doc, id, idx) { + const e = doc.progress.t[id]; + if (!e || !Array.isArray(e.notes) || !(idx >= 0 && idx < e.notes.length)) return { error: "no such note" }; + e.notes.splice(idx, 1); +} +export function opCount(doc, id, { value, inc } = {}) { + const t = findTask(doc, id); + if (!t) return { error: `no such task: ${id}` }; + if (!isCounter(t)) return { error: `'${id}' is not a counter task` }; + const nv = num(value), ni = num(inc); + if (nv === undefined && ni === undefined) return { error: "count requires a numeric value or inc" }; + let v = doc.progress.counters[id] || 0; + if (nv !== undefined) v = nv; else v = v + ni; + doc.progress.counters[id] = Math.max(0, Math.round(v || 0)); +} +export function opCarry(doc, id, value) { + const t = findTask(doc, id); + if (!t) return { error: `no such task: ${id}` }; + if (isCounter(t)) return { error: `'${id}' is a counter task and can't be carried` }; + const e = doc.progress.t[id]; + e.carried = typeof value === "boolean" ? value : !e.carried; +} +export function opFocus(doc, id) { + const p = doc.progress; + if (id === null || id === undefined || id === "") { p.focus = null; return; } + if (!findTask(doc, id)) return { error: `no such task: ${id}` }; + p.focus = p.focus === id ? null : id; +} +export function opDay(doc, txt) { txt = text(txt).trim(); if (!txt) return { error: "empty momentum note" }; doc.progress.day.unshift({ t: Date.now(), txt }); } +export function opDayDel(doc, idx) { const d = doc.progress.day; if (!(idx >= 0 && idx < d.length)) return { error: "no such momentum note" }; d.splice(idx, 1); } +export function opBrain(doc, txt) { txt = text(txt).trim(); if (!txt) return { error: "empty note" }; doc.progress.brain.unshift({ t: Date.now(), txt }); } +export function opBrainDel(doc, idx) { const b = doc.progress.brain; if (!(idx >= 0 && idx < b.length)) return { error: "no such parked thought" }; b.splice(idx, 1); } +export function opRM(doc, value) { doc.progress.rm = !!value; } +export function opAddTask(doc, task) { + task = task && typeof task === "object" ? task : {}; + let id = validId(task.id) ? task.id : slug(task.title); + if (!validId(id)) return { error: "invalid task id or title" }; + if (findTask(doc, id)) return { error: `task '${id}' already exists` }; + const def = normalizeTaskDef({ ...task, id }); + doc.tasks.push(def); + if (def.goal !== undefined) doc.progress.counters[id] = def.start || 0; + else doc.progress.t[id] = { status: "todo", notes: [], carried: false }; + return { id }; +} + +// --- end-of-day recap (Markdown the agent can journal) ---------------------- + +export function recapMarkdown(doc) { + const p = doc.progress, lines = []; + const carried = t => !isCounter(t) && (p.t[t.id] || {}).carried; + const live = doc.tasks.filter(t => !carried(t)); + const done = live.filter(t => statusOf(doc, t) === "done"); + lines.push(`# Focus board — ${doc.name ? doc.name + " · " : ""}${doc.dateKey}`); + lines.push(""); + lines.push(`**${done.length}/${live.length} done** for today${live.length - done.length ? `, ${live.length - done.length} still open` : ""}.`); + lines.push(""); + lines.push("## Tasks"); + for (const t of doc.tasks) { + const s = carried(t) ? "→ tomorrow" : statusOf(doc, t); + const mark = s === "done" ? "x" : " "; + let line = `- [${mark}] ${t.emoji ? t.emoji + " " : ""}${t.title} — _${s}_`; + if (isCounter(t)) line += ` (${p.counters[t.id] || 0}/${t.goal}${t.unit ? " " + t.unit : ""})`; + lines.push(line); + if (!isCounter(t)) for (const n of (p.t[t.id] || {}).notes || []) lines.push(` - ${n.txt}`); + } + if (p.day.length) { lines.push(""); lines.push("## Momentum"); for (const n of [...p.day].reverse()) lines.push(`- ${n.txt}`); } + if (p.brain.length) { lines.push(""); lines.push("## Parked thoughts"); for (const n of p.brain) lines.push(`- ${n.txt}`); } + return lines.join("\n"); +} + +// --- HTTP API --------------------------------------------------------------- + +function readBody(req) { + return new Promise((resolve) => { + let d = "", n = 0; + req.on("data", c => { n += c.length; if (n > 1e6) { req.destroy(); resolve({}); return; } d += c; }); + req.on("end", () => { try { resolve(d ? JSON.parse(d) : {}); } catch { resolve({}); } }); + req.on("error", () => resolve({})); + }); +} + +export async function handleApi(stateFile, op, b) { + switch (op) { + case "status": return mutate(stateFile, doc => opStatus(doc, b.id, b.status)); + case "progress": return mutate(stateFile, doc => opNote(doc, b.id, b.txt)); + case "note-del": return mutate(stateFile, doc => opNoteDel(doc, b.id, Number(b.idx))); + case "count": return mutate(stateFile, doc => opCount(doc, b.id, { value: b.value, inc: b.inc })); + case "carry": return mutate(stateFile, doc => opCarry(doc, b.id, b.value)); + case "focus": return mutate(stateFile, doc => opFocus(doc, b.id)); + case "day": return mutate(stateFile, doc => opDay(doc, b.txt)); + case "day-del": return mutate(stateFile, doc => opDayDel(doc, Number(b.idx))); + case "brain": return mutate(stateFile, doc => opBrain(doc, b.txt)); + case "brain-del": return mutate(stateFile, doc => opBrainDel(doc, Number(b.idx))); + case "rm": return mutate(stateFile, doc => opRM(doc, b.value)); + case "add-task": return mutate(stateFile, doc => opAddTask(doc, b.task || b)); + default: return { ok: false, error: "unknown_op" }; + } +} + +// Pin the Host header to the exact loopback authority we bound. A DNS-rebinding +// page reaches us under its own hostname (Host: attacker.example:), so an +// exact match against 127.0.0.1: refuses those requests before any read or +// write — Origin/Host equality alone can't, since the attacker controls both. +function isCanonicalHost(req, canonicalHost) { + return String(req.headers.host || "").toLowerCase() === String(canonicalHost || "").toLowerCase(); +} + +// Per-server capability token, minted at startup and embedded in the page we +// serve. Only the loopback document we rendered knows it, so a blind +// cross-origin / rebinding caller can't read state or forge a mutation even if +// it reaches the socket. +function hasToken(req, token) { + const h = req.headers["x-board-token"]; + const v = Array.isArray(h) ? h[0] : h; + return typeof v === "string" && v.length > 0 && v === token; +} + +// Start the local board server bound to loopback. Serves the board HTML at / and +// the JSON state + mutation API under /api/. Returns { server, url, token }. +export async function startServer(stateFile) { + const token = randomUUID(); + let boardHtml; + try { boardHtml = (await readFile(BOARD_HTML_PATH, "utf-8")).replace(/__BOARD_TOKEN__/g, token); } + catch { boardHtml = "