RENAME-PLAN.md
Rama main · réplica de lectura del repositorio original.
# Rename Plan: BorgHive → Ground Control (GCTRL)
This document is the canonical record of the BorgHive → Ground Control
rename. It captures the decisions, what shipped in which commit, and
what is intentionally still pending.
---
## Decisions (canonical values)
| Concern | Value |
|---|---|
| Brand name (user-facing) | **Ground Control** |
| Code / identifier prefix | **GCTRL** |
| Production customer domain | **gctrl.tech** |
| Customer app subdomain | **app.gctrl.tech** |
| Mail subdomain (Mailgun) | **mg.gctrl.tech** |
| RDF namespace for entity URIs | **`http://gctrl.tech/entity/`** |
| Test-only seed email TLD | **gctrl.test** (RFC 6761 reserved — non-routable) |
| Real seed admin email | **admin@gctrl.tech** |
These values are the source of truth. Anything in code/docs that
disagrees with this table is a bug.
---
## Done in commit `dc0fcfc` — user-facing string sweep
Brand display strings and human-readable copy were rewritten from
"BorgHive" / "Borg Hive" to **Ground Control**:
- UI strings (titles, headers, button labels, toasts)
- Marketing copy and landing-page text
- README headings and prose
- Comment headers in source files
This commit deliberately left infrastructure values, seed data, RDF
namespaces, package names, MCP tool names, env-var names, DB
identifiers, Docker container/network names, and the `borghive/` repo
folder name unchanged. That work is split out below.
---
## Done in THIS commit — production-domain sweep + RDF namespace migration
### Domain references
`.env.example` and `.env.production.example`, plus any docs that
quoted production URLs, now point at the canonical `gctrl.tech`
domain:
| File | Change |
|---|---|
| `.env.production.example` | `DOMAIN`, `FRONTEND_URL`, `BORGHIVE_BASE_URL` values → `app.gctrl.tech` |
| `.env.production.example` | `MAIL_USER` value → `postmaster@mg.gctrl.tech` |
| `.env.production.example` | `GRAFANA_URL` value → `https://app.gctrl.tech/grafana` |
Note: the env-var **name** `BORGHIVE_BASE_URL` is intentionally left
unchanged — renaming it would require coordinated changes to every
service that reads it. Only the **value** moves to `gctrl.tech`.
### Seed credentials + JWT defaults
| File | Change |
|---|---|
| `.env.example` | `JWT_SECRET` default → `GCTRL_dev_jwt_secret_change_in_production` |
| `.env.example` | `JWT_REFRESH_SECRET` default → `GCTRL_dev_refresh_secret_change_in_production` |
| `docs/buildsummary.md` | Admin seed → `admin@gctrl.tech` / `GCTRL_admin_change_me_now` |
| `docs/buildsummary.md` | Test user → `test@gctrl.test` (RFC 6761 reserved TLD) |
| `docs/buildsummary.md` | n8n package reference → `n8n-nodes-gctrl` (matches repo) |
Test-user email uses `gctrl.test` so it cannot accidentally collide
with a real production address — `.test` is reserved and non-routable
by RFC 6761.
### RDF namespace (code + migration)
- `services/fuse/src/config_builder.py`: default RDF namespace moves
from `http://borghive.dev/entity/` to `http://gctrl.tech/entity/`.
Made overridable via the `GCTRL_RDF_NAMESPACE` environment variable
so historical deployments can opt out until they have run the
migration script.
- `scripts/migrate-rdf-namespace.cypher`: idempotent Cypher script
that rewrites legacy `borghive.dev` entity URIs to the new
namespace.
- `scripts/migrate-rdf-namespace.sh`: thin shell wrapper that invokes
the Cypher inside the running `neo4j` container with sensible
defaults.
---
## Namespace Migration — operator runbook
The RDF namespace is a semantic identifier baked into every entity
URI in Neo4j. Flipping the default in code **without** rewriting the
stored URIs would silently break entity lookups, owl:sameAs links
emitted by the resolver, and any external system that holds a
reference to a `borghive.dev` URI. The migration is therefore
coordinated, not lazy.
### Why this needs a deliberate cutover
- Every `Entity.uri` currently in Neo4j is stamped with the legacy
namespace.
- The resolver emits new URIs using the new namespace.
- If both run at once without a rewrite, the same entity will exist
under two URIs and `owl:sameAs` will quietly drift.
### When to run
1. **Stop ingestion** (KEX + FUSE workers idle).
2. **Back up Neo4j** — `docker exec neo4j neo4j-admin database dump …`
or your standard snapshot procedure.
3. Run the migration (commands below).
4. **Then** redeploy services with the new default namespace.
5. Resume ingestion.
Do **not** run it ahead of the deploy — the legacy default is still
expected by the running services until they are cycled.
### Commands
Preferred (shell wrapper, picks up env overrides):
```bash
cd borghive
bash scripts/migrate-rdf-namespace.sh
```
Direct (in-container, defaults baked into the Cypher file):
```bash
docker exec -i neo4j cypher-shell -u neo4j -p password \
< scripts/migrate-rdf-namespace.cypher
```
Verify zero remaining legacy URIs:
```cypher
MATCH (n:Entity) WHERE n.uri STARTS WITH 'http://borghive.dev/entity/'
RETURN count(n);
```
### Rollback
The migration is symmetric. Re-run the wrapper with the namespaces
swapped:
```bash
OLD_NS='http://gctrl.tech/entity/' \
NEW_NS='http://borghive.dev/entity/' \
bash scripts/migrate-rdf-namespace.sh
```
If you have not yet redeployed the services, you can also unblock by
setting `GCTRL_RDF_NAMESPACE=http://borghive.dev/entity/` to keep the
old default until you are ready.
---
## Done in THIS commit — npm rename + MCP tool rename (with deprecation)
### 1. npm package rename — `n8n-nodes-borghive` → `n8n-nodes-gctrl`
The package is now a clean Ground Control package end-to-end:
- `package.json#name` = `n8n-nodes-gctrl`, version bumped to **1.0.0**
(major bump — this is a breaking change for anyone who already
installed `n8n-nodes-borghive`).
- TypeScript identifiers renamed throughout `src/`: `BorgHive` →
`Gctrl`, `borghive` → `gctrl`. Source files and folders renamed to
match (`nodes/Gctrl/Gctrl.node.ts`, `credentials/GctrlApi.credentials.ts`,
`shared/GctrlApiClient.ts`, etc.).
- Credential type id renamed from `GCTRLApi` (transitional) to
`gctrlApi` (n8n camelCase convention).
- Node `displayName` values switched to "Ground Control" / "Ground
Control Trigger" / "Ground Control Memory" / "Ground Control
Knowledge Tool".
- `package.json#n8n.nodes` and `package.json#n8n.credentials` updated
to point at the renamed dist paths.
- Icons renamed `borghive.svg` → `gctrl.svg`, referenced via
`icon: 'file:gctrl.svg'`.
- README rewritten under the Ground Control brand.
- New `MIGRATION.md` documents the user-side steps for moving from
`n8n-nodes-borghive` (uninstall old, install new, restart n8n,
re-select nodes in existing workflows, credentials carry over).
Builds clean with `npm run build` (tsc + gulp icons).
### 2. MCP tool rename — `borghive_*` → `gctrl_*` (with deprecation aliases)
Tool names in `services/mcp/src/index.ts` rewritten through a small
`registerToolWithAlias()` helper that registers each tool under both
its new canonical `gctrl_*` name and its legacy `borghive_*` name.
- Canonical names: `gctrl_extract`, `gctrl_query`, `gctrl_store`,
`gctrl_fuse`, `gctrl_search_entities`, `gctrl_list_graphs`,
`gctrl_list_ontologies`, `gctrl_list_extractions`, `gctrl_schema`.
- Each legacy `borghive_*` alias forwards to the same handler, logs a
`console.error` deprecation warning naming both the old and the new
tool name, and carries a `[DEPRECATED — use 'gctrl_X' instead,
alias will be removed in v2]` prefix on its description.
- Aliases marked in code with `// DEPRECATED — remove in v2`.
- Startup logs a clear notice that the deprecated names are still
exposed.
- `services/mcp/README.md` documents the new names with a
"Deprecated names (alias, removal in v2)" callout listing every
alias.
- `borghive/.mcp.json` (actually `Databorg/.mcp.json` — the only
example config in the repo) updated to the new env-var names
(`GCTRL_*`).
- `docs/buildsummary.md` updated to the new tool names with a
deprecation callout.
- `services/web/src/pages/settings/SettingsPage.tsx` "MCP Server"
panel updated to display the `gctrl_*` names.
Builds clean with `npm run build` (tsc). Both old and new names are
present in `dist/index.js` (18 registrations = 9 tools × 2 names).
### Removal schedule
- **MCP server v2.0**: drop the `registerToolWithAlias()` helper and
call `server.tool()` directly. Remove every `borghive_*` alias and
the deprecation-warning code path.
- **n8n package**: publish a single final `n8n-nodes-borghive` release
whose only purpose is to surface a "use `n8n-nodes-gctrl` instead"
notice (e.g. an error-throwing stub or a `deprecated` field in
package.json). Do not re-export — see `MIGRATION.md` for why.
---
## Still pending — needs deliberate work
### 1. `borghive/` repo folder rename — huge blast radius
Renaming the top-level `borghive/` directory affects:
- Every absolute and relative path in scripts (`scripts/run-e2e.ps1`,
`scripts/run-smoke.ps1`, `scripts/smoke-test.sh`).
- Every IDE / editor workspace file.
- Every CI configuration that hardcodes the path.
- Any developer's local clone with WIP branches.
This is a coordinated, single-PR change that should be done on a
quiet day with all collaborators warned in advance.
---
## Intentionally NOT changed
- Environment-variable **names** (e.g. `BORGHIVE_BASE_URL`, `JWT_SECRET`).
- Database column / table names.
- Docker container names and the `borghive_*` Docker network.
- The `borghive/` repo folder.
MCP tool names and the npm package were renamed in the latest commit;
the deprecation aliases / migration guide cover the transition. See
the "Removal schedule" above for when the legacy paths disappear.