diff --git a/README.md b/README.md index 5ae9968..75f8ce2 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,13 @@ project registry that several tools consume. ## project-manifest.json is an API -`project-manifest.json` is the canonical registry of every project in the -account. It is consumed by: +`project-manifest.json` is the canonical public registry of projects backed +by public DaveHomeAssist repositories. Private inventory is never published +through this repository. The public registry is consumed by: - **This hub** (`index.html`) to render the portfolio - **graph-explorer** to visualize the ecosystem -- **command-center-061eed** (mirror of the private `ops-hub`) to monitor live - surfaces and git sync state +- **command-center-061eed** to monitor public live surfaces and git sync state Treat changes to it as API changes: keep `id` values stable, update `meta.lastUpdated` on any edit, and never delete an entry for a repo that @@ -24,7 +24,7 @@ still exists on GitHub (mark it `archived` instead). | `id` | Stable slug; never reuse or rename | | `status` | `active`, `wip`, `archived`, or `candidate` (added by sweep, pending curation) | | `featured` | Mirrors the `featured-product` GitHub topic; exactly the set pinned on the profile | -| `visibility` | `public` or `unlisted` (published but not surfaced in hub navigation) | +| `visibility` | Catalog visibility: `public`, `unlisted`, or `isolated`; private values are forbidden in public output | | `hosting` / `url` | Where the live surface runs, if any | | `repo` | GitHub URL; update on renames even though GitHub redirects | diff --git a/index.html b/index.html index a0ba78a..41cd778 100644 --- a/index.html +++ b/index.html @@ -981,7 +981,7 @@

Useful things that got out of hand.

- AgentDeck + PixelForge Garden OS Ballparks Recipes @@ -1069,7 +1069,7 @@

Project directory

"meta": { "owner": "DaveHomeAssist", "github": "https://github.com/DaveHomeAssist", - "lastUpdated": "2026-08-16", + "lastUpdated": "2026-08-23", "hub": "https://davehomeassist.github.io" }, "projects": [ @@ -1820,7 +1820,7 @@

Project directory

{ "id": "stereo-field-compressor", "name": "Stereo Field Compressor", - "description": "Sidechain driven spatial compression plugin (public prototype, archived; canonical source is the private StereoFieldCompressor repo)", + "description": "Sidechain-driven spatial compression plugin (public prototype, archived; canonical source pending duplicate-resolution review)", "category": "audio-music-tools", "status": "archived", "visibility": "public", @@ -1970,25 +1970,6 @@

Project directory

"shared" ] }, - { - "id": "agentdeck", - "name": "AgentDeck", - "description": "Local-first registry, inspector, and evaluation bench for AI agents, skills, prompt packages, fixtures, and backend adapters.", - "category": "ai-agent-systems", - "status": "active", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "agents", - "evals", - "local-first" - ] - }, { "id": "recipe-tracker", "name": "Recipe Tracker", @@ -2008,25 +1989,6 @@

Project directory

"family" ] }, - { - "id": "content-automation", - "name": "Content Automation", - "description": "Local content engine for discovery, trend scoring, script generation, critique, repurposing, and review-gated publishing.", - "category": "ai-agent-systems", - "status": "active", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "automation", - "content", - "workflow" - ] - }, { "id": "code-dashboard", "name": "Code Dashboard", @@ -2046,78 +2008,6 @@

Project directory

"automation" ] }, - { - "id": "llm-log-candidate", - "name": "LLM Log", - "description": "Private snapshot dashboard of DB | Discussion Log", - "category": "ai-agent-systems", - "status": "archived", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, - { - "id": "bpmdelay-calc-candidate", - "name": "BPM Delay Calc", - "description": "JUCE BPM delay calculator plugin with Windows GitHub Actions build artifacts", - "category": "audio-music-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "c++" - ] - }, - { - "id": "stereo-field-compressor-private-candidate", - "name": "Stereo Field Compressor", - "description": "JUCE VST3/Standalone spatial compressor — mid/side, cone-weighted gain reduction", - "category": "audio-music-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "c++" - ] - }, - { - "id": "cueforge-candidate", - "name": "CueForge", - "description": "Live cue control software: audio, video, lighting (DMX), MIDI, and OSC in a single timeline", - "category": "av-show-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, { "id": "plotforge-candidate", "name": "PlotForge", @@ -2157,7 +2047,7 @@

Project directory

{ "id": "command-center-061eed-candidate", "name": "Command Center", - "description": "Single-page ops dashboard: one-screen view of project status, git sync state, and domain health (mirror of ops-hub)", + "description": "Public operations dashboard for project status, git sync state, and domain health", "category": "command-center-ops", "status": "candidate", "visibility": "public", @@ -2172,95 +2062,6 @@

Project directory

"html" ] }, - { - "id": "ops-hub-candidate", - "name": "Ops Hub", - "description": "Local generator workspace for the Ops Hub switchboard; canonical source behind the command center", - "category": "command-center-ops", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, - { - "id": "secrets-inventory-candidate", - "name": "Secrets Inventory", - "description": "Cross-project API credentials and env-var inventory. Tracker, not a vault.", - "category": "command-center-ops", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate" - ] - }, - { - "id": "chip-signals-webapp-candidate", - "name": "Chip Signals Webapp", - "description": "Web interface for the daily chip-signals report: 2-minute briefing plus valuation and catalyst data", - "category": "content-signals", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, - { - "id": "frontier-signals-candidate", - "name": "Frontier Signals", - "description": "Astro source for frontiersignals.io, editorial site of record for AI infrastructure research", - "category": "content-signals", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "astro" - ] - }, - { - "id": "frontier-signals-pipeline-candidate", - "name": "Frontier Signals Pipeline", - "description": "Quantum news scraper + dashboard. Daily Task Scheduler 7:30 AM ET.", - "category": "content-signals", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, { "id": "hat-in-ring-candidate", "name": "Hat In Ring Archive", @@ -2333,24 +2134,6 @@

Project directory

"catalog-candidate" ] }, - { - "id": "aoe2-clone-candidate", - "name": "AOE2 Clone", - "description": "Deterministic C++ RTS in the Age of Empires II lineage. Headless sim core plus optional SDL3 app. Lockstep multiplayer over TCP.", - "category": "games-interactive-play", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, { "id": "clever-paws-candidate", "name": "Clever Paws", @@ -2443,117 +2226,6 @@

Project directory

"local-first", "pwa" ] - }, - { - "id": "streamdeck-icon-server-candidate", - "name": "Stream Deck Icon Server", - "description": "Local icon server for Stream Deck profiles (private; no description on GitHub yet)", - "category": "av-show-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html", - "stream-deck" - ] - }, - { - "id": "arena-ops-candidate", - "name": "Arena Ops", - "description": "Native macOS readiness dashboard for Resolume Arena", - "category": "av-show-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "swift", - "resolume" - ] - }, - { - "id": "world-cup-app-candidate", - "name": "World Cup App", - "description": "Interactive FIFA World Cup 2026 bracket predictor - standalone System by Dave app.", - "category": "games-interactive-play", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, - { - "id": "tradetron-candidate", - "name": "Tradetron", - "description": "Self-contained crypto trading bot: pure Python strategy engine plus Tkinter desktop dashboard", - "category": "research-developer-utility", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "python" - ] - }, - { - "id": "marsscape-candidate", - "name": "Marsscape", - "description": "Tick-based Mars colony skiller: gather, craft, build, survive on the RuneScape XP curve", - "category": "games-interactive-play", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, - { - "id": "sbd-core-candidate", - "name": "SBD Core", - "description": "System by Dave shared core library: zero-dependency local-first primitives extracted from the portfolio", - "category": "ai-agent-systems", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "javascript", - "library" - ] } ], "categories": { diff --git a/package.json b/package.json index f41acc4..cef3b51 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "private": true, "type": "module", "scripts": { - "sync-manifest": "node scripts/sync-manifest.mjs" + "validate-manifest": "node scripts/validate-public-manifest.mjs", + "sync-manifest": "npm run validate-manifest && node scripts/sync-manifest.mjs" } } diff --git a/private-hub.html b/private-hub.html index 3b91831..c9f9798 100644 --- a/private-hub.html +++ b/private-hub.html @@ -953,7 +953,7 @@

Project details

"meta": { "owner": "DaveHomeAssist", "github": "https://github.com/DaveHomeAssist", - "lastUpdated": "2026-08-16", + "lastUpdated": "2026-08-23", "hub": "https://davehomeassist.github.io" }, "projects": [ @@ -1704,7 +1704,7 @@

Project details

{ "id": "stereo-field-compressor", "name": "Stereo Field Compressor", - "description": "Sidechain driven spatial compression plugin (public prototype, archived; canonical source is the private StereoFieldCompressor repo)", + "description": "Sidechain-driven spatial compression plugin (public prototype, archived; canonical source pending duplicate-resolution review)", "category": "audio-music-tools", "status": "archived", "visibility": "public", @@ -1854,25 +1854,6 @@

Project details

"shared" ] }, - { - "id": "agentdeck", - "name": "AgentDeck", - "description": "Local-first registry, inspector, and evaluation bench for AI agents, skills, prompt packages, fixtures, and backend adapters.", - "category": "ai-agent-systems", - "status": "active", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "agents", - "evals", - "local-first" - ] - }, { "id": "recipe-tracker", "name": "Recipe Tracker", @@ -1892,25 +1873,6 @@

Project details

"family" ] }, - { - "id": "content-automation", - "name": "Content Automation", - "description": "Local content engine for discovery, trend scoring, script generation, critique, repurposing, and review-gated publishing.", - "category": "ai-agent-systems", - "status": "active", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "automation", - "content", - "workflow" - ] - }, { "id": "code-dashboard", "name": "Code Dashboard", @@ -1930,78 +1892,6 @@

Project details

"automation" ] }, - { - "id": "llm-log-candidate", - "name": "LLM Log", - "description": "Private snapshot dashboard of DB | Discussion Log", - "category": "ai-agent-systems", - "status": "archived", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, - { - "id": "bpmdelay-calc-candidate", - "name": "BPM Delay Calc", - "description": "JUCE BPM delay calculator plugin with Windows GitHub Actions build artifacts", - "category": "audio-music-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "c++" - ] - }, - { - "id": "stereo-field-compressor-private-candidate", - "name": "Stereo Field Compressor", - "description": "JUCE VST3/Standalone spatial compressor — mid/side, cone-weighted gain reduction", - "category": "audio-music-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "c++" - ] - }, - { - "id": "cueforge-candidate", - "name": "CueForge", - "description": "Live cue control software: audio, video, lighting (DMX), MIDI, and OSC in a single timeline", - "category": "av-show-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, { "id": "plotforge-candidate", "name": "PlotForge", @@ -2041,7 +1931,7 @@

Project details

{ "id": "command-center-061eed-candidate", "name": "Command Center", - "description": "Single-page ops dashboard: one-screen view of project status, git sync state, and domain health (mirror of ops-hub)", + "description": "Public operations dashboard for project status, git sync state, and domain health", "category": "command-center-ops", "status": "candidate", "visibility": "public", @@ -2056,95 +1946,6 @@

Project details

"html" ] }, - { - "id": "ops-hub-candidate", - "name": "Ops Hub", - "description": "Local generator workspace for the Ops Hub switchboard; canonical source behind the command center", - "category": "command-center-ops", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, - { - "id": "secrets-inventory-candidate", - "name": "Secrets Inventory", - "description": "Cross-project API credentials and env-var inventory. Tracker, not a vault.", - "category": "command-center-ops", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate" - ] - }, - { - "id": "chip-signals-webapp-candidate", - "name": "Chip Signals Webapp", - "description": "Web interface for the daily chip-signals report: 2-minute briefing plus valuation and catalyst data", - "category": "content-signals", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, - { - "id": "frontier-signals-candidate", - "name": "Frontier Signals", - "description": "Astro source for frontiersignals.io, editorial site of record for AI infrastructure research", - "category": "content-signals", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "astro" - ] - }, - { - "id": "frontier-signals-pipeline-candidate", - "name": "Frontier Signals Pipeline", - "description": "Quantum news scraper + dashboard. Daily Task Scheduler 7:30 AM ET.", - "category": "content-signals", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, { "id": "hat-in-ring-candidate", "name": "Hat In Ring Archive", @@ -2217,24 +2018,6 @@

Project details

"catalog-candidate" ] }, - { - "id": "aoe2-clone-candidate", - "name": "AOE2 Clone", - "description": "Deterministic C++ RTS in the Age of Empires II lineage. Headless sim core plus optional SDL3 app. Lockstep multiplayer over TCP.", - "category": "games-interactive-play", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, { "id": "clever-paws-candidate", "name": "Clever Paws", @@ -2327,117 +2110,6 @@

Project details

"local-first", "pwa" ] - }, - { - "id": "streamdeck-icon-server-candidate", - "name": "Stream Deck Icon Server", - "description": "Local icon server for Stream Deck profiles (private; no description on GitHub yet)", - "category": "av-show-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html", - "stream-deck" - ] - }, - { - "id": "arena-ops-candidate", - "name": "Arena Ops", - "description": "Native macOS readiness dashboard for Resolume Arena", - "category": "av-show-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "swift", - "resolume" - ] - }, - { - "id": "world-cup-app-candidate", - "name": "World Cup App", - "description": "Interactive FIFA World Cup 2026 bracket predictor - standalone System by Dave app.", - "category": "games-interactive-play", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, - { - "id": "tradetron-candidate", - "name": "Tradetron", - "description": "Self-contained crypto trading bot: pure Python strategy engine plus Tkinter desktop dashboard", - "category": "research-developer-utility", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "python" - ] - }, - { - "id": "marsscape-candidate", - "name": "Marsscape", - "description": "Tick-based Mars colony skiller: gather, craft, build, survive on the RuneScape XP curve", - "category": "games-interactive-play", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, - { - "id": "sbd-core-candidate", - "name": "SBD Core", - "description": "System by Dave shared core library: zero-dependency local-first primitives extracted from the portfolio", - "category": "ai-agent-systems", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "javascript", - "library" - ] } ], "categories": { diff --git a/project-manifest.json b/project-manifest.json index 78c9cc0..2b5ea51 100644 --- a/project-manifest.json +++ b/project-manifest.json @@ -2,7 +2,7 @@ "meta": { "owner": "DaveHomeAssist", "github": "https://github.com/DaveHomeAssist", - "lastUpdated": "2026-08-16", + "lastUpdated": "2026-08-23", "hub": "https://davehomeassist.github.io" }, "projects": [ @@ -753,7 +753,7 @@ { "id": "stereo-field-compressor", "name": "Stereo Field Compressor", - "description": "Sidechain driven spatial compression plugin (public prototype, archived; canonical source is the private StereoFieldCompressor repo)", + "description": "Sidechain-driven spatial compression plugin (public prototype, archived; canonical source pending duplicate-resolution review)", "category": "audio-music-tools", "status": "archived", "visibility": "public", @@ -903,25 +903,6 @@ "shared" ] }, - { - "id": "agentdeck", - "name": "AgentDeck", - "description": "Local-first registry, inspector, and evaluation bench for AI agents, skills, prompt packages, fixtures, and backend adapters.", - "category": "ai-agent-systems", - "status": "active", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "agents", - "evals", - "local-first" - ] - }, { "id": "recipe-tracker", "name": "Recipe Tracker", @@ -941,25 +922,6 @@ "family" ] }, - { - "id": "content-automation", - "name": "Content Automation", - "description": "Local content engine for discovery, trend scoring, script generation, critique, repurposing, and review-gated publishing.", - "category": "ai-agent-systems", - "status": "active", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "automation", - "content", - "workflow" - ] - }, { "id": "code-dashboard", "name": "Code Dashboard", @@ -979,78 +941,6 @@ "automation" ] }, - { - "id": "llm-log-candidate", - "name": "LLM Log", - "description": "Private snapshot dashboard of DB | Discussion Log", - "category": "ai-agent-systems", - "status": "archived", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, - { - "id": "bpmdelay-calc-candidate", - "name": "BPM Delay Calc", - "description": "JUCE BPM delay calculator plugin with Windows GitHub Actions build artifacts", - "category": "audio-music-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "c++" - ] - }, - { - "id": "stereo-field-compressor-private-candidate", - "name": "Stereo Field Compressor", - "description": "JUCE VST3/Standalone spatial compressor — mid/side, cone-weighted gain reduction", - "category": "audio-music-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "c++" - ] - }, - { - "id": "cueforge-candidate", - "name": "CueForge", - "description": "Live cue control software: audio, video, lighting (DMX), MIDI, and OSC in a single timeline", - "category": "av-show-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, { "id": "plotforge-candidate", "name": "PlotForge", @@ -1090,7 +980,7 @@ { "id": "command-center-061eed-candidate", "name": "Command Center", - "description": "Single-page ops dashboard: one-screen view of project status, git sync state, and domain health (mirror of ops-hub)", + "description": "Public operations dashboard for project status, git sync state, and domain health", "category": "command-center-ops", "status": "candidate", "visibility": "public", @@ -1105,95 +995,6 @@ "html" ] }, - { - "id": "ops-hub-candidate", - "name": "Ops Hub", - "description": "Local generator workspace for the Ops Hub switchboard; canonical source behind the command center", - "category": "command-center-ops", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, - { - "id": "secrets-inventory-candidate", - "name": "Secrets Inventory", - "description": "Cross-project API credentials and env-var inventory. Tracker, not a vault.", - "category": "command-center-ops", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate" - ] - }, - { - "id": "chip-signals-webapp-candidate", - "name": "Chip Signals Webapp", - "description": "Web interface for the daily chip-signals report: 2-minute briefing plus valuation and catalyst data", - "category": "content-signals", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, - { - "id": "frontier-signals-candidate", - "name": "Frontier Signals", - "description": "Astro source for frontiersignals.io, editorial site of record for AI infrastructure research", - "category": "content-signals", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "astro" - ] - }, - { - "id": "frontier-signals-pipeline-candidate", - "name": "Frontier Signals Pipeline", - "description": "Quantum news scraper + dashboard. Daily Task Scheduler 7:30 AM ET.", - "category": "content-signals", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, { "id": "hat-in-ring-candidate", "name": "Hat In Ring Archive", @@ -1266,24 +1067,6 @@ "catalog-candidate" ] }, - { - "id": "aoe2-clone-candidate", - "name": "AOE2 Clone", - "description": "Deterministic C++ RTS in the Age of Empires II lineage. Headless sim core plus optional SDL3 app. Lockstep multiplayer over TCP.", - "category": "games-interactive-play", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, { "id": "clever-paws-candidate", "name": "Clever Paws", @@ -1376,117 +1159,6 @@ "local-first", "pwa" ] - }, - { - "id": "streamdeck-icon-server-candidate", - "name": "Stream Deck Icon Server", - "description": "Local icon server for Stream Deck profiles (private; no description on GitHub yet)", - "category": "av-show-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html", - "stream-deck" - ] - }, - { - "id": "arena-ops-candidate", - "name": "Arena Ops", - "description": "Native macOS readiness dashboard for Resolume Arena", - "category": "av-show-tools", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "swift", - "resolume" - ] - }, - { - "id": "world-cup-app-candidate", - "name": "World Cup App", - "description": "Interactive FIFA World Cup 2026 bracket predictor - standalone System by Dave app.", - "category": "games-interactive-play", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "typescript" - ] - }, - { - "id": "tradetron-candidate", - "name": "Tradetron", - "description": "Self-contained crypto trading bot: pure Python strategy engine plus Tkinter desktop dashboard", - "category": "research-developer-utility", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "python" - ] - }, - { - "id": "marsscape-candidate", - "name": "Marsscape", - "description": "Tick-based Mars colony skiller: gather, craft, build, survive on the RuneScape XP curve", - "category": "games-interactive-play", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "html" - ] - }, - { - "id": "sbd-core-candidate", - "name": "SBD Core", - "description": "System by Dave shared core library: zero-dependency local-first primitives extracted from the portfolio", - "category": "ai-agent-systems", - "status": "candidate", - "visibility": "private", - "featured": false, - "hosting": "none", - "url": "", - "repo": "", - "localPath": "", - "runCommand": "", - "tags": [ - "catalog-candidate", - "javascript", - "library" - ] } ], "categories": { @@ -1582,4 +1254,4 @@ "color": "#adb5bd" } } -} \ No newline at end of file +} diff --git a/scripts/validate-public-manifest.mjs b/scripts/validate-public-manifest.mjs new file mode 100644 index 0000000..4d0b118 --- /dev/null +++ b/scripts/validate-public-manifest.mjs @@ -0,0 +1,37 @@ +#!/usr/bin/env node + +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { dirname, resolve } from 'node:path'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const manifestPath = resolve(__dirname, '..', 'project-manifest.json'); +const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); +const projects = Array.isArray(manifest.projects) ? manifest.projects : null; +const allowedVisibilities = new Set(['public', 'unlisted', 'isolated']); + +if (!projects) { + throw new Error('Public manifest must contain a projects array.'); +} + +const ids = new Set(); +for (const project of projects) { + if (!project.id || ids.has(project.id)) { + throw new Error(`Public manifest contains a missing or duplicate id: ${project.id || '(missing)'}`); + } + ids.add(project.id); + + if (!allowedVisibilities.has(project.visibility)) { + throw new Error(`Public manifest rejects visibility "${project.visibility}" for ${project.id}.`); + } + + if (!/^https:\/\/github\.com\/DaveHomeAssist\/[A-Za-z0-9._-]+\/?$/.test(project.repo || '')) { + throw new Error(`Public manifest requires a DaveHomeAssist GitHub repository URL for ${project.id}.`); + } + + if (project.localPath || project.runCommand) { + throw new Error(`Public manifest rejects localPath/runCommand values for ${project.id}.`); + } +} + +console.log(`Validated ${projects.length} public-safe projects across ${new Set(projects.map((project) => project.repo)).size} repositories.`);