Migration Notes
What moved, what was renamed, where things live now
The Holons codebase has consolidated significantly. If you've been away for a while—or you've followed older docs—this page is the map from "where things used to be" to "where they are now."
The big change: one monorepo, one core
Previously, the ecosystem was a set of independent repos with overlapping logic. Now everything lives in one monorepo with a single shared core:
Before After
──────────────────────────────── ─────────────────────────────────
liminalvillage/harvest ──► harvest/apps/web
(SvelteKit dashboard, was the
standalone Harvest repo)
liminalvillage/holonsbot ──► harvest/packages/telegram-ui
(Telegraf bot, business logic
extracted to @holons/core)
(scattered across both repos) ──► harvest/packages/core
(@holons/core — shared domain
logic, called by every UI)
(new) ──► harvest/packages/text-ui
(@holons/text-ui — CLI/REPL)
(new) ──► harvest/packages/ai-ui
(@holons/ai-ui — in-process
Claude tool-use loop)
(new) ──► harvest/packages/mcp-ui
(@holons/mcp-ui — MCP server,
replaces legacy HTTP API)If you previously cloned liminalvillage/harvest for the dashboard or liminalvillage/holonsbot for the bot, the modern equivalent is one clone of the harvest monorepo with pnpm workspaces.
The legacy holonsbot repo still exists and still runs in production at some installations, but new development happens in the monorepo.
What was renamed
Harvest (the dashboard)
harvest-web / apps/web
The dashboard is now one app inside the Harvest monorepo
Harvest (the project)
harvest (the monorepo)
The name now refers to the whole codebase
HolonsBot (the codebase)
@holons/telegram-ui
The Telegram surface is preserved; logic moved to core
HolonsBot HTTP API (port 3101)
@holons/mcp-ui
The HTTP API is replaced by an MCP server
holonsbot/mcp/holons-mcp.js
@holons/mcp-ui
The bot-side MCP wrapper is being deprecated
packages/telegram-ui/mcp/server.js
redirect to @holons/mcp-ui
Kept as a backwards-compat shim
The MCP layer
If you've been pointing Claude Desktop at the older holons-mcp server, the modern equivalent is @holons/mcp-ui:
Concern
Old (holons-mcp)
New (@holons/mcp-ui)
Path
holonsbot/mcp/holons-mcp.js
harvest/packages/mcp-ui/dist/index.js
Style
HTTP wrapper around the bot daemon
Direct exposure of @holons/core functions
Tool count
~20 higher-level operations
~100 fine-grained tools across 14 domains
Transport
stdio + SSE on port 3100
stdio + SSE on configurable port (default 3200)
Identity
Bot-attributed
Explicit actor via HOLONS_ACTOR_* env vars
Both run side-by-side today. The recommended path forward is the new server—see MCP Server for the full reference.
The value equation
The scoring equation used to have a top-level hours weight:
New code reads hours through currencies.hour:
migrateEquation() folds the legacy form into the new one on load—idempotent and safe to call repeatedly. The deprecated top-level hours field is preserved (set equal to currencies.hour) so unmigrated consumers keep computing the same score.
If you wrote a custom UI against the old shape, it still works. See Scoring for the full migration rules.
The Quest model
Five separate types collapsed into one. Where the code used to distinguish:
tasks
proposals
events
offers
requests
…there is now one Quest interface with a type discriminator. The shape is open, so any extra fields the old types carried (message_thread_id, stoppers, schedule fields, frequency, timeTracking, etc.) are preserved on writes.
Concretely:
Telegram-bot quest records continue to round-trip with all their original fields.
Web-app quest records keep their richer schedule data.
New code works against the unified shape; old code reading the legacy fields keeps working.
See Tasks for the full Quest model.
Federation source identity
Older code used holonId as the federation source. Newer code accepts an explicit federationSourceId—typically a Nostr public key—falling back to holonId when not provided.
If you've been calling publishToFederation directly, no change is required: omitting federationSourceId produces the old behavior. To take advantage of Nostr-keyed federation, pass the public key.
Run commands
If your scripts hard-coded the old install/run patterns:
Install
yarn
pnpm install
Run the web app
yarn dev
pnpm dev
Run the bot
separate repo, separate install
pnpm dev:bot
Run the CLI
did not exist
pnpm -F @holons/text-ui exec holons --help
Run the AI loop
did not exist
pnpm -F @holons/ai-ui exec holons-ai "…"
Run the MCP server
separate, via holonsbot
node packages/mcp-ui/dist/index.js
Memory tuning
NODE_OPTIONS="--max-old-space-size=4096"
same
See also
Harvest — the monorepo overview
MCP Server — the canonical MCP entry point
The Shared Core — how
@holons/coreis organized
Last updated
Was this helpful?