-
Notifications
You must be signed in to change notification settings - Fork 2
feat(n8n): default to postgres control plane and track workflows #882
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -1413,11 +1413,26 @@ up-legacy-both: ## Ensure v1 hi-rag gateway CPU+GPU are up | |||||||||||||||||||||
| # always operate on the same stack regardless of cwd/path. | ||||||||||||||||||||||
| PROJECT ?= pmoves | ||||||||||||||||||||||
| export PROJECT | ||||||||||||||||||||||
| N8N_SUBMODULE_DIR ?= ../PMOVES-n8n | ||||||||||||||||||||||
| N8N_CANONICAL_FLOWS_DIR ?= $(N8N_SUBMODULE_DIR)/workflows | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| # n8n persistence mode: | ||||||||||||||||||||||
| # - sqlite: simplest local bring-up (default) | ||||||||||||||||||||||
| # - postgres: production-grade n8n DB (recommended for VPS) | ||||||||||||||||||||||
| N8N_DB ?= sqlite | ||||||||||||||||||||||
| # - postgres: production-grade n8n DB (default) | ||||||||||||||||||||||
| # - sqlite: legacy/local escape hatch only | ||||||||||||||||||||||
| N8N_DB ?= postgres | ||||||||||||||||||||||
| N8N_DB_NAME ?= n8n | ||||||||||||||||||||||
| N8N_DB_USER ?= n8n | ||||||||||||||||||||||
| N8N_DB_PASSWORD ?= pmoves_n8n_local | ||||||||||||||||||||||
| N8N_DB_SCHEMA ?= public | ||||||||||||||||||||||
| N8N_BASE_URL ?= http://localhost:5678 | ||||||||||||||||||||||
| N8N_API_URL ?= $(N8N_BASE_URL)/api/v1 | ||||||||||||||||||||||
| N8N_OWNER_EMAIL ?= $(if $(PMOVES_OPERATOR_EMAIL),$(PMOVES_OPERATOR_EMAIL),$(SUPABASE_BOOT_USER_EMAIL)) | ||||||||||||||||||||||
| N8N_OWNER_FIRST_NAME ?= PMOVES | ||||||||||||||||||||||
| N8N_OWNER_LAST_NAME ?= Operator | ||||||||||||||||||||||
| N8N_API_KEY_LABEL ?= PMOVES.AI automation bootstrap | ||||||||||||||||||||||
| N8N_ENV_WRITE_FILE ?= .env.local | ||||||||||||||||||||||
| export N8N_DB N8N_DB_NAME N8N_DB_USER N8N_DB_PASSWORD N8N_DB_SCHEMA | ||||||||||||||||||||||
| export N8N_BASE_URL N8N_API_URL N8N_OWNER_EMAIL N8N_OWNER_FIRST_NAME N8N_OWNER_LAST_NAME N8N_API_KEY_LABEL | ||||||||||||||||||||||
| ifeq ($(N8N_DB),postgres) | ||||||||||||||||||||||
| N8N_DB_STACK_FILE := -f docker-compose.n8n.postgres.yml | ||||||||||||||||||||||
| else | ||||||||||||||||||||||
|
|
@@ -2344,8 +2359,13 @@ up-agents-integrations: ## Start agents using your forks (builds from $(INTEGRAT | |||||||||||||||||||||
| @$(DC) -f docker-compose.agents.integrations.yml --profile agents up -d nats agent-zero archon archon-ui mesh-agent publisher-discord | ||||||||||||||||||||||
| @echo "✔ Agents started from integrations workspace. Workspace: $(INTEGRATIONS_WORKSPACE)" | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| .PHONY: up-n8n | ||||||||||||||||||||||
| up-n8n: ensure-env-shared | ||||||||||||||||||||||
| .PHONY: up-n8n n8n-sync-submodule-flows n8n-api-bootstrap n8n-import-flows n8n-activate-flows n8n-sync-supabase-registry n8n-bootstrap n8n-export-repo-flows | ||||||||||||||||||||||
| n8n-sync-submodule-flows: ## Mirror canonical PMOVES-n8n workflows into pmoves/n8n/flows | ||||||||||||||||||||||
| @$(PYTHON) -c "from pathlib import Path; import shutil; src=Path(r'$(N8N_CANONICAL_FLOWS_DIR)'); dst=Path(r'$(CURDIR)/n8n/flows'); dst.mkdir(parents=True, exist_ok=True); [shutil.copy2(path, dst / path.name) for path in sorted(src.glob('*.json'))]" | ||||||||||||||||||||||
| @echo "✔ Mirrored PMOVES-n8n workflows into pmoves/n8n/flows" | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| up-n8n: ensure-env-shared n8n-sync-submodule-flows | ||||||||||||||||||||||
| @docker network create cataclysm-net >/dev/null 2>&1 || true | ||||||||||||||||||||||
| @if [ "$(N8N_DB)" = "postgres" ]; then \ | ||||||||||||||||||||||
| echo "→ n8n DB mode: postgres"; \ | ||||||||||||||||||||||
| $(N8N_DC) up -d n8n-db n8n n8n-runners; \ | ||||||||||||||||||||||
|
|
@@ -2359,6 +2379,32 @@ down-n8n: ## Stop n8n workflow services | |||||||||||||||||||||
| @$(N8N_DC) stop n8n n8n-runners n8n-db >/dev/null 2>&1 || true | ||||||||||||||||||||||
| @$(N8N_DC) rm -f n8n n8n-runners n8n-db >/dev/null 2>&1 || true | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| n8n-api-bootstrap: ## Create/login the n8n owner and mint a fresh Public API key into the local env file | ||||||||||||||||||||||
| @$(LOAD_ENV_SHARED); $(PYTHON) "$(N8N_SUBMODULE_DIR)/scripts/bootstrap_n8n_api.py" \ | ||||||||||||||||||||||
| --base-url "$(N8N_BASE_URL)" \ | ||||||||||||||||||||||
| --api-url "$(N8N_API_URL)" \ | ||||||||||||||||||||||
| --email "$(N8N_OWNER_EMAIL)" \ | ||||||||||||||||||||||
| --first-name "$(N8N_OWNER_FIRST_NAME)" \ | ||||||||||||||||||||||
| --last-name "$(N8N_OWNER_LAST_NAME)" \ | ||||||||||||||||||||||
| --label "$(N8N_API_KEY_LABEL)" \ | ||||||||||||||||||||||
| --write-env "$(N8N_ENV_WRITE_FILE)" | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| n8n-import-flows: ## Import canonical PMOVES-n8n workflows into the live n8n instance | ||||||||||||||||||||||
| @$(LOAD_ENV_SHARED); $(PYTHON) "$(N8N_SUBMODULE_DIR)/scripts/import_repo_flows.py" --container pmoves-n8n --workflow-dir "$(N8N_CANONICAL_FLOWS_DIR)" --skip-activation | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| n8n-activate-flows: ## Publish canonical PMOVES-n8n workflows (keeps chat-platform voice flows inactive unless VOICE_PLATFORMS=1) | ||||||||||||||||||||||
| @$(LOAD_ENV_SHARED); $(PYTHON) "$(N8N_SUBMODULE_DIR)/scripts/import_repo_flows.py" --container pmoves-n8n --workflow-dir "$(N8N_CANONICAL_FLOWS_DIR)" --activate-only $(if $(VOICE_PLATFORMS),--voice-platforms,) | ||||||||||||||||||||||
|
Comment on lines
+2395
to
+2396
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested fix n8n-activate-flows: ## Publish canonical PMOVES-n8n workflows (keeps chat-platform voice flows inactive unless VOICE_PLATFORMS=1)
- @$(LOAD_ENV_SHARED); $(PYTHON) "$(N8N_SUBMODULE_DIR)/scripts/import_repo_flows.py" --container pmoves-n8n --workflow-dir "$(N8N_CANONICAL_FLOWS_DIR)" --activate-only $(if $(VOICE_PLATFORMS),--voice-platforms,)
+ @$(LOAD_ENV_SHARED); $(PYTHON) "$(N8N_SUBMODULE_DIR)/scripts/import_repo_flows.py" --container pmoves-n8n --workflow-dir "$(N8N_CANONICAL_FLOWS_DIR)" --activate-only $(if $(filter 1 true yes,$(VOICE_PLATFORMS)),--voice-platforms,)📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||
|
|
||||||||||||||||||||||
| n8n-sync-supabase-registry: ## Upsert live n8n workflow state into pmoves_core.n8n_workflow_registry | ||||||||||||||||||||||
| @$(LOAD_ENV_SHARED); $(PYTHON) "$(N8N_SUBMODULE_DIR)/scripts/sync_supabase_registry.py" --workflow-dir "$(N8N_CANONICAL_FLOWS_DIR)" | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| n8n-bootstrap: up-n8n n8n-api-bootstrap n8n-import-flows n8n-activate-flows n8n-sync-supabase-registry ## Bring up n8n, bootstrap API access, import workflows, publish defaults, and sync Supabase tracking | ||||||||||||||||||||||
| @echo "✔ n8n bootstrap complete" | ||||||||||||||||||||||
|
Comment on lines
+2398
to
+2402
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The final step calls Suggested fix-n8n-bootstrap: up-n8n n8n-api-bootstrap n8n-import-flows n8n-activate-flows n8n-sync-supabase-registry ## Bring up n8n, bootstrap API access, import workflows, publish defaults, and sync Supabase tracking
+n8n-bootstrap: supabase-bootstrap up-n8n n8n-api-bootstrap n8n-import-flows n8n-activate-flows n8n-sync-supabase-registry ## Bring up n8n, bootstrap API access, import workflows, publish defaults, and sync Supabase tracking
`@echo` "✔ n8n bootstrap complete"📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||
|
|
||||||||||||||||||||||
| n8n-export-repo-flows: ## Export live n8n workflows into PMOVES-n8n and refresh the compatibility mirror | ||||||||||||||||||||||
| @$(PYTHON) "$(N8N_SUBMODULE_DIR)/scripts/export_repo_flows.py" --container pmoves-n8n --workflow-dir "$(N8N_CANONICAL_FLOWS_DIR)" | ||||||||||||||||||||||
| @$(MAKE) n8n-sync-submodule-flows | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| .PHONY: up-comfyui comfyui-smoke | ||||||||||||||||||||||
| up-comfyui: ## Start ComfyUI (docker profile; used by n8n pmoves_comfy_gen flow) | ||||||||||||||||||||||
| @$(DC) --profile creator up -d comfyui | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -12,6 +12,14 @@ _Last updated: 2026-03-12_ | |
| - Added `pmoves/docs/PMOVES.AI PLANS/CREATOR_NETWORK_CONTROL_PLANE.md` to frame YouTube, Discord agents, transcribe-and-fetch, model routing, and Tokenism as one creator-network lane. | ||
| - Next focus: finish review cleanup, get PMOVES.YT/root checks green, and keep the creator/channel-monitor runbooks aligned with the authoritative runtime instead of the compatibility mirror. | ||
|
|
||
| ### Latest changes (Mar 12, 2026) — n8n Production Control Plane Refresh | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix the heading level jump. This starts at 🧰 Tools🪛 markdownlint-cli2 (0.21.0)[warning] 6-6: Heading levels should only increment by one level at a time (MD001, heading-increment) 🤖 Prompt for AI Agents |
||
| - `PMOVES-n8n` is now the authoritative n8n runtime/workflow lane; root `pmoves` consumes it instead of treating `pmoves/n8n/flows` as canon. | ||
| - n8n defaults to the dedicated `n8n-db` Postgres sidecar (`make -C pmoves up-n8n`), with SQLite reduced to a legacy escape hatch only. | ||
| - Added `make -C pmoves n8n-api-bootstrap` to automate owner bootstrap + Public API key rotation for n8n 2.1. | ||
| - Workflow activation/import now targets the n8n Public API path, replacing the failing CLI publish/unpublish fallback for the production lane. | ||
| - Added Supabase tracking schema `pmoves_core.n8n_workflow_registry` plus `make -C pmoves n8n-sync-supabase-registry` so PMOVES can inventory live workflow state. | ||
| - Next focus: validate the full bootstrap against Postgres-backed n8n, refresh PMOVES.YT from demo to production against the same automation lane, and decide which BotZ/MCP workflows join the shared canonical catalog. | ||
|
|
||
| ### Latest changes (Mar 8, 2026) — CI Runner Migration + RG-3 Automation | ||
| - **AB-9 mitigation:** Migrated 10 lightweight CI jobs from `[self-hosted, Linux, X64]` to `ubuntu-latest`: | ||
| - `sql-policy-lint`, `python-tests`, `webhook-smoke`, `yt-dlp-bump`, `deploy-gateway-agent` (validate only) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,8 +1,8 @@ | ||
| # n8n Setup Checklist (Supabase → Agent Zero → Discord) | ||
| _Last updated: 2025-12-14_ | ||
| _Last updated: 2026-03-12_ | ||
|
|
||
| ## Overview | ||
| This guide streamlines importing and running the PMOVES approval and publish workflows in n8n. It targets Supabase CLI on the host, Agent Zero + NATS in Docker, and Discord webhooks. | ||
| This guide covers the production n8n path for PMOVES.AI. `PMOVES-n8n` is the authoritative runtime/workflow fork, n8n internals live on the dedicated `n8n-db` Postgres sidecar, and Supabase tracks PMOVES workflow state in `pmoves_core.n8n_workflow_registry`. | ||
|
|
||
| ## Preflight (quick) | ||
| - Start stacks: `make up && make up-agents && make up-n8n` | ||
|
|
@@ -14,8 +14,8 @@ This guide streamlines importing and running the PMOVES approval and publish wor | |
| - Supabase CLI running locally: `supabase start` or `make supa-start` | ||
| - PMOVES stack up: `make up && make up-agents` | ||
| - n8n running: | ||
| - Local/dev (SQLite): `make up-n8n` (UI at `http://localhost:5678`, launches `n8n` + `n8n-runners`) | ||
| - VPS/prod (Postgres): `N8N_DB=postgres make up-n8n` (adds `n8n-db` Postgres for durable state) | ||
| - Production/default: `make -C pmoves up-n8n` (starts `n8n`, `n8n-runners`, and `n8n-db`) | ||
| - Legacy escape hatch only: `N8N_DB=sqlite make -C pmoves up-n8n` | ||
| - Secrets at hand: `SUPABASE_SERVICE_ROLE_KEY`, `DISCORD_WEBHOOK_URL`, `N8N_RUNNERS_AUTH_TOKEN` | ||
|
|
||
| ## Environment (n8n) | ||
|
|
@@ -28,40 +28,50 @@ Set these in n8n (Settings → Variables) or via container env: | |
| - `DISCORD_WEBHOOK_USERNAME` = `PMOVES Publisher` | ||
| - `N8N_RUNNERS_AUTH_TOKEN` = `<shared secret – must match the sidecar>` | ||
| - `N8N_DEFAULT_TIMEZONE` = `America/New_York` (aligns cron schedules with project TZ) | ||
| - `N8N_DB_NAME` / `N8N_DB_USER` / `N8N_DB_PASSWORD` = dedicated `n8n-db` credentials | ||
| - `N8N_OWNER_EMAIL` / `N8N_OWNER_PASSWORD` = owner bootstrap credentials used by `make -C pmoves n8n-api-bootstrap` | ||
| - `N8N_API_KEY` = Public API key minted by `make -C pmoves n8n-api-bootstrap` | ||
|
Comment on lines
+31
to
+33
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These bootstrap variables are documented in the wrong place.
As per coding guidelines, "Check docs for operational accuracy: Keep status claims aligned with evidence in runbooks and smokes." 🤖 Prompt for AI Agents |
||
|
|
||
| ### n8n persistence mode (SQLite vs Postgres) | ||
| By default, `make up-n8n` runs n8n with SQLite for quick local bring-up. | ||
| By default, `make -C pmoves up-n8n` runs n8n on the dedicated Postgres sidecar. | ||
|
|
||
| For VPS/production, run n8n on Postgres: | ||
| - Set `N8N_DB=postgres` | ||
| - Set `N8N_DB_NAME`, `N8N_DB_USER`, `N8N_DB_PASSWORD` (in `pmoves/env.shared` or injected secrets) | ||
| - Bring up: `N8N_DB=postgres make -C pmoves up-n8n` | ||
| For production, keep n8n on Postgres: | ||
| - `N8N_DB=postgres` | ||
| - `N8N_DB_NAME`, `N8N_DB_USER`, `N8N_DB_PASSWORD` | ||
| - `make -C pmoves up-n8n` | ||
|
|
||
| This uses `pmoves/docker-compose.n8n.postgres.yml` to add a dedicated `n8n-db` container. It does **not** move your PMOVES app data into n8n — it only stores n8n’s own workflow/execution state in Postgres. | ||
|
|
||
| Supabase remains the PMOVES system of record for workflow tracking, approvals, publishing, and operator UI state. | ||
|
|
||
| > **Supabase runtime note:** The CLI runtime binds REST on port `65421` per `supabase/config.toml`. If you switch back to the docker-compose PostgREST service, update `SUPABASE_REST_URL` accordingly (typically `http://host.docker.internal:54321/rest/v1`). | ||
|
|
||
| Tip: These defaults are prewired in `docker-compose.n8n.yml`. If you use `make up-n8n`, populate `SUPABASE_SERVICE_ROLE_KEY`, `DISCORD_WEBHOOK_URL`, and `N8N_RUNNERS_AUTH_TOKEN` in `pmoves/env.shared` or `pmoves/.env.local`. The runner token is loaded via `env_file` (not compose-time interpolation) so recreating containers won’t accidentally desync the broker and sidecar. | ||
|
|
||
| Note: n8n 1.115.3 already executes cron triggers in the main process. Avoid re-adding the deprecated `EXECUTIONS_PROCESS` flag—the service emits a warning and ignores it. | ||
|
|
||
| ## Production Bootstrap | ||
| - `make -C pmoves up-n8n` | ||
| - `make -C pmoves n8n-api-bootstrap` | ||
| - `make -C pmoves n8n-import-flows` | ||
| - `make -C pmoves n8n-activate-flows` | ||
| - `make -C pmoves n8n-sync-supabase-registry` | ||
| - `make -C pmoves n8n-bootstrap` | ||
|
Comment on lines
+53
to
+59
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don’t tell operators to run the umbrella bootstrap after every substep.
As per coding guidelines, "Check docs for operational accuracy: Keep status claims aligned with evidence in runbooks and smokes." 🤖 Prompt for AI Agents |
||
|
|
||
| `n8n-api-bootstrap` creates or logs into the n8n owner account, rotates the `PMOVES.AI automation bootstrap` Public API key, validates it against `/api/v1/workflows`, and writes the resulting `N8N_API_KEY` plus owner credentials into `pmoves/.env.local`. | ||
|
|
||
| ## Container Tooling | ||
| - The custom image defined in `compose/n8n/Dockerfile` bakes in the `sqlite3` CLI so DB inspections persist across restarts. | ||
| - Run `make up-n8n` after pulling updates to rebuild the service when the Dockerfile changes. | ||
|
|
||
| ## Import Workflows | ||
| 1. Open n8n → Workflows → Import from File. | ||
| 2. Import the core approvals stack: | ||
| - `pmoves/n8n/flows/approval_poller.json` | ||
| - `pmoves/n8n/flows/echo_publisher.json` | ||
| 3. Import the creative webhooks (requires ComfyUI hosts prepared via [`pmoves/creator/README.md`](../creator/README.md)): | ||
| - `pmoves/n8n/flows/wan_to_cgp.webhook.json` | ||
| - `pmoves/n8n/flows/qwen_to_cgp.webhook.json` | ||
| - `pmoves/n8n/flows/vibevoice_to_cgp.webhook.json` | ||
| 4. (Optional) Import the audio enrichment flows: | ||
| - `pmoves/n8n/flows/vibevoice_audio_ingest.json` | ||
| - `pmoves/n8n/flows/vibevoice_discord_preview.json` | ||
| 5. Keep everything inactive until env is confirmed (Supabase keys, MinIO buckets, Discord webhooks). | ||
| Canonical workflow JSON now lives in `PMOVES-n8n/workflows/`. | ||
|
|
||
| - Recommended: `make -C pmoves n8n-import-flows` | ||
| - Activation: `make -C pmoves n8n-activate-flows` | ||
| - Full bootstrap: `make -C pmoves n8n-bootstrap` | ||
|
|
||
| The root `pmoves/n8n/flows/` directory is now only a compatibility mirror. | ||
|
|
||
| ## Validate Env Bindings | ||
| - Approval Poller | ||
|
|
@@ -85,6 +95,8 @@ Note: n8n 1.115.3 already executes cron triggers in the main process. Avoid re-a | |
| 5. Activate echo publisher → confirm Discord embed (title/link/thumbnail if provided) | ||
| 6. Optional: Post directly to n8n webhook (flow must be active) | ||
| - `make n8n-webhook-demo` | ||
| 7. Sync the live workflow registry back into Supabase: | ||
| - `make -C pmoves n8n-sync-supabase-registry` | ||
|
|
||
| ### Voice platform flows (Discord/Telegram) | ||
| The repo includes optional chat-platform voice agent flows (Discord/Telegram) that require additional credentials and/or custom n8n nodes. | ||
|
|
@@ -126,6 +138,8 @@ These flows extend the core approval automations so we can surface RVC voice out | |
|
|
||
| ## Troubleshooting | ||
| - 404 from Supabase in n8n: ensure `/rest/v1` is included in `SUPABASE_REST_URL`. | ||
| - `401` from `/api/v1/workflows`: run `make -C pmoves n8n-api-bootstrap` to rotate the Public API key. | ||
| - Workflow import works but activation fails: use the Public API path (`n8n-api-bootstrap` + `n8n-activate-flows`) instead of the legacy CLI publish fallback. | ||
| - 503 from Agent Zero: confirm NATS + Agent Zero are running (`make up-agents`). | ||
| - Discord no messages: verify `DISCORD_WEBHOOK_URL` and check rate limits in n8n logs. | ||
| - n8n cannot reach host services on Linux: replace `host.docker.internal` with the host IP or Docker gateway (`172.17.0.1`). | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -12,6 +12,12 @@ A production-ready, self-hostable orchestration mesh for creative + agent worklo | |
| - the Supabase docs sync contract was refreshed for the current CLI stack: `pmoves_core.tool_docs` writes now use schema-profile headers plus URL-encoded `on_conflict`. | ||
| - root `pmoves/services/pmoves-yt` remains as a compatibility shim so existing tests/import paths keep working while production moves to the submodule. | ||
| - downloader defaults are being normalized around the authoritative runtime: PMOVES.YT now documents the modern client/token path, root compose passes explicit companion wiring, and Jellyfin/channel-monitor docs are being moved off older MCP and future-work framing. | ||
| - March 12 n8n production-path remediation landed locally: | ||
| - `PMOVES-n8n` is now the authoritative runtime/workflow lane consumed by the root repo. | ||
| - `make -C pmoves up-n8n` now defaults to the dedicated `n8n-db` Postgres sidecar instead of SQLite. | ||
| - n8n owner/bootstrap automation is scripted (`n8n-api-bootstrap`) so Public API keys no longer depend on manual UI steps. | ||
| - workflow activation now targets the n8n 2.1 Public API (`/api/v1/workflows/{id}/activate|deactivate`) instead of the brittle CLI publish fallback. | ||
| - Supabase tracking contract added: `pmoves_core.n8n_workflow_registry` stores live workflow state synced from n8n. | ||
|
Comment on lines
+15
to
+20
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The section date is now misleading. These bullets sit under As per coding guidelines, "Check docs for operational accuracy: Keep status claims aligned with evidence in runbooks and smokes." 🤖 Prompt for AI Agents |
||
| - March 7 merge wave completed on `main`: `#814`, `#815`, `#816`, `#817`, `#818`, `#819`, `#820`, `#821` (8 PRs, 3 batches). | ||
| - Chrome extension security hardening landed in `#821`: 9 CodeRabbit review items addressed (auth storage isolation, XSS remediation, mock server hardening, timeout guards, state management fixes, CSP). | ||
| - Distributed topology documentation + examples landed in `#820`. | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| # PMOVES n8n Mirror | ||
|
|
||
| `pmoves/n8n/flows/` is now a compatibility mirror. | ||
|
|
||
| Canonical n8n workflow ownership lives in [`PMOVES-n8n/workflows/`](../../PMOVES-n8n/workflows). The parent repo keeps this mirror so older docs, UI links, and operator muscle memory do not break during the transition. | ||
|
|
||
| Canonical edit path: | ||
|
|
||
| ```bash | ||
| make -C pmoves n8n-api-bootstrap | ||
| make -C pmoves n8n-sync-submodule-flows | ||
| make -C pmoves n8n-import-flows | ||
| make -C pmoves n8n-activate-flows | ||
| make -C pmoves n8n-sync-supabase-registry | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Make the mirror target actually sync, not just copy.
This target never removes JSON files deleted from
PMOVES-n8n/workflows, sopmoves/n8n/flowscan keep serving stale workflows after the canonical catalog drops them. It also prints success even when the source directory is missing, which makes drift hard to spot.Suggested fix
📝 Committable suggestion
🤖 Prompt for AI Agents