app/: Next.js App Router pages, API routes, and UI components.app/api/: REST endpoints for auth, files, and downloads.app/components/: UI building blocks (file browser, editor, terminal).app/lib/: auth, local filesystem, utilities.app/store/: Zustand state stores.
components/ui/: shadcn/ui primitives (button, dialog, tooltip, etc.).docs/: deployment, security, monitoring guides.server/: custom Node server for WebSocket terminal.scripts/: build/deploy/test helpers.
- Diese Regeln gelten für alle Arbeiten an der neuen Agent-Logik.
- UI- und End-to-End-Prüfungen mit Playwright oder Chrome DevTools durchführen.
- immer ein npm run build testen bevor ein container gebaut wird.
- Sicherstellen, dass nie mehrere Test-Container parallel laufen.
- Test-Container bei neuem Testlauf immer mit aktuellem Stand neu laden (recreate/rebuild), statt alte Container weiterzuverwenden.
- committe sauber die einzelnen fertigen to dos; pushen ist erlaubt, wenn ein PR erstellt/aktualisiert werden soll oder der User es explizit fordert.
- container auf nur bauen wenn es explizit gefordert wird
- login für die app über
BOOTSTRAP_ADMIN_EMAILundBOOTSTRAP_ADMIN_PASSWORDaus der lokalen Env-Konfiguration - mach mit keinem to do weiter wenn der vorherige to do noch nicht fertig ist
- arbeite proaktiv, mach commits zwischendurch und mach noch keine weitere task bevor eine wichtige task fertig ist.
- teste auch das UI wenn du etwas integrierst.
Für das lokale Dev-Setup den Skill
canvas-local-team-seat-devverwenden; er definiert den verwalteten Stack und verhindert parallele Testumgebungen. - nutz playwright oder so nur wenn ich es explizit sage oder frage danach bevor du es verwendest
npm run dev: local dev server (setPORT=3001if needed).npm run build: production build.npm run start: start the custom server.npm run lint: eslint checks.npm run test:smoke: smoke test against a running server.npm run test:integration: API integration tests.npm run test:e2e: Playwright E2E tests.npm run test:all: build + start + all tests.
- TypeScript/React with 2-space indentation.
- Components in
PascalCase(FileBrowser.tsx). - Functions/variables in
camelCase(loadFileTree). - Linting: ESLint (
npm run lint). - Prefer small, focused components and avoid heavy inline logic.
- E2E: Playwright (
tests/e2e.spec.ts). - Integration/smoke scripts in
scripts/. - No explicit coverage target; keep tests relevant to changed behavior.
- Run
npm run test:allbefore production deploys.
- Git history has a single initial commit; no enforced convention.
- Use short, descriptive commit messages (e.g.,
Fix terminal copy on iPad). - PRs should include: summary, screenshots for UI changes, and steps to verify.
- Before merging a PR into
main, verify that all required status checks have completed successfully and that no unresolved actionable review threads remain. - Review all human and automated comments. Fix actionable findings; document and resolve non-actionable or false-positive findings.
- Do not merge while required checks are pending or failing.
- Production uses
systemd(canvas-notebook.service). - Base data path is configured via
DATA(default:./data). Workspace, SQLite, and skills are stored under this path. - Keep secrets in
.env.local/.env.systemdand out of git.
Agent-managed files are persisted in /data for easy access and backup:
- System Prompt Files:
/data/canvas-agent/(AGENTS.md, MEMORY.md, SOUL.md, TOOLS.md) - Runtime Config:
/data/canvas-agent/pi-runtime-config.json - Secrets:
/data/secrets/(Canvas-Integrations.env, Canvas-Agents.env)
These paths replace the legacy /home/node/canvas-agent/ location. The bootstrap script automatically migrates existing files on container startup.
WICHTIG: Alle Environment-Variablen für Skills, Integrationen und API-Keys müssen zentral verwaltet werden.
- Integrations-Env-Datei:
/data/secrets/Canvas-Integrations.env - Diese Datei wird über den Settings-Bereich unter dem Tab "Integrations" verwaltet
- Keine Hardcoded Secrets: API-Keys, Tokens oder sensible Daten dürfen niemals direkt im Code oder in Konfigurationsdateien hinterlegt werden
- Zentrale Verwaltung: Alle Env-Variablen müssen über den Integrations-Tab in
/data/secrets/Canvas-Integrations.envgespeichert werden - Zugriff über API: Skills und Tools müssen Env-Variablen über die bereitgestellten API-Endpunkte (
/api/integrations/env) abrufen - Beispiele für erforderliche Keys:
GEMINI_API_KEY- Für Bildgenerierung, Video-Generierung und Ad-Localisierung- Provider-spezifische API-Keys (OpenAI, Anthropic, etc.)
Wenn ein Skill oder Tool eine Env-Variable benötigt, die nicht gesetzt ist:
- Zeige eine klare Fehlermeldung im UI an
- Verlinke auf den Integrations-Tab in den Settings
- Biete einen direkten Link:
/settings?tab=integrations
This repository contains the Canvas Notebook service (the payload). It is managed remotely by the Canvas Control Plane via the Canvas Agent running on the VM host.
The Agent is a lightweight Node.js service (systemd) that:
- Connects to the Control Plane API via WebSocket tunnel
- Collects host and Docker metrics
- Executes management commands locally
- Reports status, alerts (OOM), and container health
| Interface | Location | Purpose |
|---|---|---|
| Canvas CLI | /usr/local/bin/canvas-notebook |
Commands: update, restart, start, stop, health, logs, status |
| Health Endpoint | GET /api/health (inside container) |
Container readiness check (returns { ok: true } or DB-connected health JSON) |
| Docker Compose | /opt/canvas/canvas-notebook-compose.yaml |
Container lifecycle management |
| Systemd Service | canvas-notebook.service |
Host-level service control (if installed) |
- Canvas Notebook context:
docs/architecture/canvas-notebook/plan.md - Complete system architecture:
docs/architecture/canvas-control-plane/plan.md - Implementation tasks:
docs/architecture/canvas-notebook/todo.json
No code changes in this repository are required for Control Plane integration. The Agent interacts exclusively through the CLI, Docker, and HTTP health endpoint.
This project is indexed by GitNexus as canvas-notebook (30278 symbols, 81766 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
Index stale? Run
node .gitnexus/run.cjs analyzefrom the project root — it auto-selects an available runner. No.gitnexus/run.cjsyet?npx gitnexus analyze(npm 11 crash →npm i -g gitnexus; #1939).
- MUST run impact analysis before editing any symbol. Before modifying a function, class, or method, run
impact({target: "symbolName", direction: "upstream"})and report the blast radius (direct callers, affected processes, risk level) to the user. - MUST run
detect_changes()before committing to verify your changes only affect expected symbols and execution flows. For regression review, compare against the default branch:detect_changes({scope: "compare", base_ref: "main"}). - MUST warn the user if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
- When exploring unfamiliar code, use
query({search_query: "concept"})to find execution flows instead of grepping. It returns process-grouped results ranked by relevance. - When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use
context({name: "symbolName"}). - For security review,
explain({target: "fileOrSymbol"})lists taint findings (source→sink flows; needsanalyze --pdg).
- NEVER edit a function, class, or method without first running
impacton it. - NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
- NEVER rename symbols with find-and-replace — use
renamewhich understands the call graph. - NEVER commit changes without running
detect_changes()to check affected scope.
| Resource | Use for |
|---|---|
gitnexus://repo/canvas-notebook/context |
Codebase overview, check index freshness |
gitnexus://repo/canvas-notebook/clusters |
All functional areas |
gitnexus://repo/canvas-notebook/processes |
All execution flows |
gitnexus://repo/canvas-notebook/process/{name} |
Step-by-step execution trace |
| Task | Read this skill file |
|---|---|
| Understand architecture / "How does X work?" | .claude/skills/gitnexus/gitnexus-exploring/SKILL.md |
| Blast radius / "What breaks if I change X?" | .claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md |
| Trace bugs / "Why is X failing?" | .claude/skills/gitnexus/gitnexus-debugging/SKILL.md |
| Rename / extract / split / refactor | .claude/skills/gitnexus/gitnexus-refactoring/SKILL.md |
| Tools, resources, schema reference | .claude/skills/gitnexus/gitnexus-guide/SKILL.md |
| Index, status, clean, wiki CLI commands | .claude/skills/gitnexus/gitnexus-cli/SKILL.md |