Publish pipeline:
- Add publish-npm step to .woodpecker/publish.yml — publishes all
@mosaic/* packages to Gitea npm registry on main push/tag
- Requires gitea_npm_token Woodpecker secret (package:write scope)
- publish-npm runs after build, parallel with Docker image builds
- pnpm publish resolves workspace:* to concrete versions automatically
Package configuration:
- All 20 packages versioned at 0.0.1-alpha.1
- publishConfig added to all packages (Gitea registry, public access)
- files field added to all packages (ship only dist/)
- @mosaic/forge includes pipeline/ assets in published package
Meta package (@mosaic/mosaic):
- Now depends on @mosaic/forge, @mosaic/macp, @mosaic/prdy,
@mosaic/quality-rails, @mosaic/types
- npm install @mosaic/mosaic pulls in the standalone framework
Build fixes:
- Fix forge and macp tsconfig rootDir: '.' -> 'src' so dist/index.js
resolves correctly (was dist/src/index.js)
- Exclude __tests__ and vitest.config from build includes
- Clean stale build artifacts from old rootDir config
Required Woodpecker secret:
woodpecker secret add mosaic/mosaic-stack \
--name gitea_npm_token --value '<token>' \
--event push,manual,tag
MACP OpenClaw Plugin
This plugin registers a new OpenClaw ACP runtime backend named macp.
When OpenClaw calls sessions_spawn(runtime: "macp"), the plugin now writes the prompt to a brief file, queues a MACP controller task in .mosaic/orchestrator/tasks.json, triggers mosaic-orchestrator-run --once, polls .mosaic/orchestrator/results/<task-id>.json, and streams the resulting output back as ACP runtime events.
Current behavior
- Supports ACP
mode: "oneshot"only - Accepts any
agentIdand maps it to the queued MACP taskruntime - Defaults queued tasks to
dispatch: "yolo"andruntime: "codex"when no override is provided - Rejects persistent ACP sessions
- Keeps
src/pi-bridge.tsfor futuredispatch: "pi"support
Install in OpenClaw
Add the plugin entry to your OpenClaw config:
{
"plugins": ["~/src/mosaic-mono-v1/plugins/macp/src/index.ts"]
}
Optional config
{
"plugins": [
{
"source": "~/src/mosaic-mono-v1/plugins/macp/src/index.ts",
"config": {
"defaultModel": "openai/gpt-5-mini",
"systemPrompt": "You are Pi running via MACP.",
"timeoutMs": 300000,
"logDir": "~/.openclaw/state/macp",
"repoRoot": "~/src/mosaic-mono-v1",
"orchDir": "~/src/mosaic-mono-v1/.mosaic/orchestrator",
"defaultDispatch": "yolo",
"defaultRuntime": "codex"
}
}
]
}
Runtime flow
- OpenClaw ensures a oneshot
macpsession and preserves the requestedagentId. runTurnwrites the turn prompt to~/.mosaic/macp-oc/<session>-<request>.md.- The plugin appends a pending MACP task to the configured orchestrator queue.
- The plugin triggers
~/.config/mosaic/bin/mosaic-orchestrator-run --oncein the configured repo root. - The plugin polls for
.mosaic/orchestrator/results/<task-id>.jsonand streams the result back to OpenClaw.
Verification
pnpm --filter @mosaic/oc-macp-plugin typecheck || npx tsc --noEmit -p plugins/macp/tsconfig.json
pnpm prettier --write "plugins/macp/**/*.{ts,json,md}"
pnpm format:check