For the complete documentation index, see llms.txt. This page is also available as Markdown.

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

Old name
New name
Notes

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:

Action
Old (standalone harvest)
New (monorepo)

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

Last updated

Was this helpful?