From 8872337636f74298522743b010aee979f40f93db Mon Sep 17 00:00:00 2001 From: yuanhe Date: Sat, 11 Jul 2026 13:48:30 +0800 Subject: [PATCH] Simplify local install: merge migrate into server, drop dead scripts, rename compose file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docker-compose.local.yml -> docker-compose.yml (this is now the only recommended install path, so it gets the name docker compose looks for by default) - Merge the one-shot parsar-init container into parsar-server's own startup (parsar-migrate && exec parsar-server); goose migrations are idempotent so re-running them on every restart is a cheap no-op. Drops a container from every install and removes a depends_on hop. - install.sh: fix a curl-pipe-to-bash bug where `docker compose exec` in the health-check loop inherited stdin from the same pipe still delivering the unparsed tail of the script, silently swallowing the closing "Open: http://..." banner. Redirect all docker invocations from /dev/null. - Makefile: drop `docker-image-info` (never referenced anywhere) and `seed-dev` (wrote an inert JSON file nothing reads; the real dev seed path is server/internal/dev/fixtures.go) - packages/cli: remove the now-orphaned `seed-dev` subcommand - scripts/setup.sh absorbs scripts/parsar-paths.sh via a `paths` mode flag, since the latter was a pure read-only wrapper with no other consumers - docs/deploy/lan-deploy.md: sync container topology + filenames, and fix a pre-existing inaccuracy (claimed parsar-init auto-generates PARSAR_MASTER_KEY and prints it to logs; no such code path exists — operators must generate it themselves) Verified end-to-end via ./install.sh against a fresh Postgres volume: migrations apply on cold start, survive container restarts without touching existing data, and the closing banner now prints correctly under curl | bash. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/parsar-server-release.yml | 2 +- INSTALL.md | 10 +-- Makefile | 19 +--- deploy/compose/compose.selfhost.yml | 2 +- ...er-compose.local.yml => docker-compose.yml | 39 ++++---- docs/deploy/lan-deploy.md | 88 +++++++++---------- install.sh | 27 +++--- packages/cli/src/commands/seed.ts | 23 ----- packages/cli/src/index.ts | 2 - scripts/dev-server-up.sh | 2 +- scripts/parsar-paths.sh | 12 --- scripts/setup.sh | 43 ++++++--- 12 files changed, 116 insertions(+), 153 deletions(-) rename docker-compose.local.yml => docker-compose.yml (90%) delete mode 100644 packages/cli/src/commands/seed.ts delete mode 100755 scripts/parsar-paths.sh diff --git a/.github/workflows/parsar-server-release.yml b/.github/workflows/parsar-server-release.yml index c6f328b..eede0c9 100644 --- a/.github/workflows/parsar-server-release.yml +++ b/.github/workflows/parsar-server-release.yml @@ -1,6 +1,6 @@ # Build the parsar-server image in CI and push releases to GHCR. # -# This is the Phase 1 deliverable's "one command" enabler: docker-compose.local.yml +# This is the Phase 1 deliverable's "one command" enabler: docker-compose.yml # (and the Phase 2 self-host compose) pull ghcr.io//parsar-server by # default. Same image, two compose profiles — profile not fork. # diff --git a/INSTALL.md b/INSTALL.md index ac8fb3e..80212f0 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -29,8 +29,8 @@ user is the administrator. The script: -- uses `docker-compose.local.yml` from the current checkout, or downloads the - published copy to `~/.parsar/docker-compose.local.yml` +- uses `docker-compose.yml` from the current checkout, or downloads the + published copy to `~/.parsar/docker-compose.yml` - creates `~/.parsar/.env` - generates and persists `PARSAR_MASTER_KEY` - generates and persists the Postgres password @@ -63,9 +63,9 @@ make docker-build ## Manage The Stack ```bash -docker compose -f ~/.parsar/docker-compose.local.yml --env-file ~/.parsar/.env ps -docker compose -f ~/.parsar/docker-compose.local.yml --env-file ~/.parsar/.env logs -f parsar-server -docker compose -f ~/.parsar/docker-compose.local.yml --env-file ~/.parsar/.env down +docker compose -f ~/.parsar/docker-compose.yml --env-file ~/.parsar/.env ps +docker compose -f ~/.parsar/docker-compose.yml --env-file ~/.parsar/.env logs -f parsar-server +docker compose -f ~/.parsar/docker-compose.yml --env-file ~/.parsar/.env down ``` To remove all local data, stop the stack first and then delete `~/.parsar/`. diff --git a/Makefile b/Makefile index 657767c..98d5e62 100644 --- a/Makefile +++ b/Makefile @@ -8,16 +8,13 @@ SHELL := /bin/bash PARSAR_IMAGE ?= parsar PARSAR_IMAGE_TAG ?= dev -.PHONY: setup dev check reset-dev clean-dev paths seed-dev migrate-dev sqlc-generate server web cli devgateway http-runner-once http-runner-loop dev-all smoke e2e-http-agent e2e-feishu-gateway dev-server-up dev-server-down dev-server-log bootstrap docker-build docker-build-no-cache docker-image-info openapi +.PHONY: setup dev check reset-dev clean-dev paths migrate-dev sqlc-generate server web cli devgateway http-runner-once http-runner-loop dev-all smoke e2e-http-agent e2e-feishu-gateway dev-server-up dev-server-down dev-server-log bootstrap docker-build docker-build-no-cache openapi setup: ./scripts/setup.sh paths: - ./scripts/parsar-paths.sh - -seed-dev: - pnpm --filter @parsar/cli parsar -- seed-dev + ./scripts/setup.sh paths migrate-dev: cd server && go run ./cmd/migrate @@ -73,7 +70,7 @@ web: pnpm --filter @parsar/web dev cli: - pnpm --filter @parsar/cli parsar -- --help + pnpm --filter @parsar/cli parsar --help devgateway: cd server && go run ./cmd/devgateway --help @@ -123,16 +120,6 @@ docker-build-no-cache: -f Dockerfile \ . -# Quick sanity print so operators can confirm what they just built -# without piecing together `docker images | grep ...`. The size -# column is the strongest "I shipped the right thing" signal — if -# the runtime image is >300 MB the multi-stage build broke and -# someone is shipping the Go toolchain. -docker-image-info: - @docker image inspect \ - --format 'image={{.RepoTags}} id={{.Id}} created={{.Created}} size={{.Size}}' \ - $(PARSAR_IMAGE):$(PARSAR_IMAGE_TAG) - # --- OpenAPI spec (generated from swaggo annotations) ------------------ # # Runs `swag init` over server/**/*.go. Every handler carrying a diff --git a/deploy/compose/compose.selfhost.yml b/deploy/compose/compose.selfhost.yml index 28577c9..448dd5d 100644 --- a/deploy/compose/compose.selfhost.yml +++ b/deploy/compose/compose.selfhost.yml @@ -78,7 +78,7 @@ services: start_period: 10s parsar-server: - # Defaults to the GHCR prebuilt image (same one docker-compose.local.yml + # Defaults to the GHCR prebuilt image (same one docker-compose.yml # uses — profile not fork). Override PARSAR_SERVER_IMAGE in .env to pull # from your own registry (e.g. an Aliyun ACR mirror) or a pinned tag. image: ${PARSAR_SERVER_IMAGE:-ghcr.io/minimax-ai-dev/parsar-server:latest} diff --git a/docker-compose.local.yml b/docker-compose.yml similarity index 90% rename from docker-compose.local.yml rename to docker-compose.yml index 1747554..e5a8f46 100644 --- a/docker-compose.local.yml +++ b/docker-compose.yml @@ -2,11 +2,11 @@ # # One command, single machine, zero secrets to generate: # -# docker compose -f docker-compose.local.yml up +# docker compose up # -# Brings up Postgres + a one-shot migration init + parsar-server. Open -# http://127.0.0.1:18080 and create the first owner account in the web setup -# flow. +# Brings up Postgres + parsar-server (which runs migrations on startup +# before serving). Open http://127.0.0.1:18080 and create the first owner +# account in the web setup flow. # # Profile not fork: this is the SAME image as the self-host deployment # (deploy/compose/compose.selfhost.yml). Differences live only in this file @@ -17,7 +17,7 @@ # - Local build fallback (before the tag is published, or to test your # own changes): # make docker-build PARSAR_IMAGE=parsar PARSAR_IMAGE_TAG=local -# PARSAR_SERVER_IMAGE=parsar:local docker compose -f docker-compose.local.yml up +# PARSAR_SERVER_IMAGE=parsar:local docker compose up # # Override knobs (all optional — defaults make `up` work with no .env): # PARSAR_PROJECT_NAME compose project/network prefix (default: parsar) @@ -59,33 +59,26 @@ services: retries: 20 start_period: 10s - # One-shot: run migrations before the server starts. First owner creation - # happens in the web setup flow (POST /api/v1/bootstrap). - parsar-init: + parsar-server: image: ${PARSAR_SERVER_IMAGE:-ghcr.io/minimax-ai-dev/parsar-server:latest} - container_name: ${PARSAR_PROJECT_NAME:-parsar}-local-init + container_name: ${PARSAR_PROJECT_NAME:-parsar}-local-server + restart: unless-stopped depends_on: postgres: condition: service_healthy - environment: - DATABASE_URL: postgres://parsar:${PARSAR_PG_PASSWORD:-parsar}@postgres:5432/parsar?sslmode=disable + # Run migrations before serving, in the same container as the server. + # goose migrations are idempotent (already-applied ones are skipped), + # so re-running this on every `restart: unless-stopped` cycle is a + # cheap no-op — no separate one-shot init container needed. `exec` + # replaces the shell with parsar-server so it stays tini's direct + # child for correct signal handling. First owner creation happens in + # the web setup flow (POST /api/v1/bootstrap). entrypoint: ["/bin/sh", "-c"] command: - | set -e parsar-migrate - echo "[parsar-init] migrations complete — create the first owner in the web setup flow" - restart: "no" - - parsar-server: - image: ${PARSAR_SERVER_IMAGE:-ghcr.io/minimax-ai-dev/parsar-server:latest} - container_name: ${PARSAR_PROJECT_NAME:-parsar}-local-server - restart: unless-stopped - depends_on: - postgres: - condition: service_healthy - parsar-init: - condition: service_completed_successfully + exec /usr/local/bin/parsar-server ports: - "${PARSAR_BIND_ADDR:-127.0.0.1}:${PARSAR_LOCAL_PORT:-18080}:8080" environment: diff --git a/docs/deploy/lan-deploy.md b/docs/deploy/lan-deploy.md index f71e972..af4b675 100644 --- a/docs/deploy/lan-deploy.md +++ b/docs/deploy/lan-deploy.md @@ -145,10 +145,9 @@ PARSAR_FEISHU_VERIFICATION_TOKEN=xxxxxxxx # Verification Token from §2.1 PARSAR_FEISHU_DEFAULT_BOT_OPEN_ID=ou_xxxxxx # Bot Open ID from §2.1 # ---- Security ---- -# PARSAR_MASTER_KEY encrypts every Bot credential in the DB. Leave blank on -# first run — parsar-init in step 6 will auto-generate one on `up`, print it -# to the logs, and then fatal-exit; copy the printed key back into .env and -# run `up` again. You can also pre-generate: +# PARSAR_MASTER_KEY encrypts every Bot credential in the DB. There is no +# auto-generation — parsar-server fatal-exits at startup if this is empty +# in production profile. Generate it before the first `up`: # echo "PARSAR_MASTER_KEY=$(openssl rand -hex 32)" >> .env # Once set, DO NOT change it: any Bot credentials already stored become # undecryptable and every Bot must be re-bound. @@ -241,23 +240,22 @@ sudo docker run --rm --entrypoint /bin/sh parsar-sandbox:local \ ## 6. Bring up the service stack ```bash -sudo docker compose -f docker-compose.local.yml up -d +sudo docker compose -f docker-compose.yml up -d ``` **Startup order (automatic):** 1. `postgres` — PostgreSQL 16, wait for healthcheck. -2. `parsar-init` — master-key validation + database migration. -3. `parsar-server` — binds `0.0.0.0:18080`; Feishu WebSocket inbound + outbound worker start automatically. +2. `parsar-server` — runs `parsar-migrate` then starts serving; binds `0.0.0.0:18080`; Feishu WebSocket inbound + outbound worker start automatically. -> **First run will fatal-exit — that is intentional.** -> If you did not manually pre-fill `PARSAR_MASTER_KEY` in step 4, `parsar-init` generates one, prints it to its logs (`sudo docker logs parsar-local-init`), and then `parsar-server` refuses to start because env still has no key. **Copy the printed `PARSAR_MASTER_KEY=...` line from the init log into `.env`** and run `up -d` again to complete startup. -> On subsequent starts, if the key does not change, parsar-init only runs migrations and leaves the key alone. +> **If you left `PARSAR_MASTER_KEY` blank in step 4, startup will fatal-exit.** +> `parsar-server` refuses to start in production profile without a master key — it does not generate one for you. **Generate it yourself** (`echo "PARSAR_MASTER_KEY=$(openssl rand -hex 32)" >> .env`) **before** running `up -d`. +> Migrations re-run (as a fast no-op) on every restart, so this is safe to run `up -d` again after fixing `.env`. **Verify:** ```bash # Container status -sudo docker compose -f docker-compose.local.yml ps +sudo docker compose -f docker-compose.yml ps # Health checks curl -s http://YOUR_IP:18080/healthz # 200 @@ -320,16 +318,15 @@ sudo docker logs parsar-local-server 2>&1 | grep "feishu.*inbound.*ready" ### View logs ```bash -sudo docker logs -f parsar-local-server # server logs -sudo docker logs parsar-local-init # migration logs +sudo docker logs -f parsar-local-server # server logs (includes migration output on startup) sudo docker logs parsar-local-postgres # DB logs ``` ### Stop / clean up ```bash -sudo docker compose -f docker-compose.local.yml down # stop, keep data -sudo docker compose -f docker-compose.local.yml down -v # also delete data volumes +sudo docker compose -f docker-compose.yml down # stop, keep data +sudo docker compose -f docker-compose.yml down -v # also delete data volumes ``` ### Upgrade @@ -338,7 +335,7 @@ sudo docker compose -f docker-compose.local.yml down -v # also delete data vo git pull sudo docker build -t parsar:local . sudo docker build -f infra/sandbox/Dockerfile.local -t parsar-sandbox:local . -sudo docker compose -f docker-compose.local.yml up -d --force-recreate +sudo docker compose -f docker-compose.yml up -d --force-recreate ``` ### Change port @@ -347,7 +344,7 @@ Edit `PARSAR_LOCAL_PORT` in `.env` and **also update**: - the port in `PARSAR_FEISHU_REDIRECT_URI` - the redirect URL configured on the Feishu Open Platform -Then `sudo docker compose -f docker-compose.local.yml up -d --force-recreate`. +Then `sudo docker compose -f docker-compose.yml up -d --force-recreate`. --- @@ -361,7 +358,7 @@ HTTP_PROXY=http://your-proxy:port HTTPS_PROXY=http://your-proxy:port ``` -`docker-compose.local.yml` reads these variables and passes them to the +`docker-compose.yml` reads these variables and passes them to the container. Leave them blank on machines that do not need a proxy. You must also pass the proxy args at image-build time (see the `--build-arg` @@ -373,12 +370,12 @@ snippets in §5) because `docker build` does not read `.env`. | Symptom | Cause | Fix | |---|---|---| -| Server fatal-exits with `secret.master_key is required in production` | `.env` has an empty `PARSAR_MASTER_KEY` | Let `parsar-init` run once → copy the generated key from its logs into `.env` → `up -d` again | +| Server fatal-exits with `secret.master_key is required in production` | `.env` has an empty `PARSAR_MASTER_KEY` | Generate one yourself (`echo "PARSAR_MASTER_KEY=$(openssl rand -hex 32)" >> .env`) → `up -d` again | | Feishu login reports `redirect_uri mismatch` | `.env`'s `REDIRECT_URI` does not match the Feishu console | Keep both sides completely identical (scheme, IP, port, path) | | Other machines cannot reach 18080 | Firewall blocking it | `sudo ufw allow 18080/tcp` or the equivalent firewall rule | | Device pairing downloads daemon and hits **404** | The GHCR image has no embedded daemon | Build the server image locally (§5.1) | | Agent reports **"no runtime yet — ask an admin to rebuild it"** | The sandbox image lacks the Agent CLI | Rebuild the sandbox image via `Dockerfile.local` (§5.2), then click Rebuild in the UI | -| Sandbox comes up but the daemon cannot reach the server | Compose project name is not `parsar`, so network names do not match | Use the repo's `docker-compose.local.yml` (has `name: parsar` pinned at the top); do not override with `-p ` | +| Sandbox comes up but the daemon cannot reach the server | Compose project name is not `parsar`, so network names do not match | Use the repo's `docker-compose.yml` (has `name: parsar` pinned at the top); do not override with `-p ` | | Group @Bot **no response**, DM works fine | `PARSAR_FEISHU_DEFAULT_BOT_OPEN_ID` not set | Add the Bot's open_id to `.env` and restart the server | | Bot receives messages but does not reply | Outbound worker is not up | Grep server logs for `feishu outbound`; confirm `PARSAR_FEISHU_OUTBOUND=true` (compose already sets it) | | Server crash-loops with `owner URL not resolvable` | `PARSAR_AGENT_DAEMON_OWNER_URL` missing | Confirm compose has `PARSAR_AGENT_DAEMON_OWNER_URL: "http://parsar-server:8080"` | @@ -390,32 +387,29 @@ snippets in §5) because `docker build` does not read `.env`. ## Architecture overview ``` -┌─────────────────────────────────────────────────────────────────┐ -│ Deploy machine (YOUR_IP) │ -│ │ -│ ┌────────────┐ ┌────────────┐ ┌─────────────────────────┐ │ -│ │ PostgreSQL │ │ parsar-init│ │ parsar-server │ │ -│ │ :5432 │ │ (one-shot) │ │ SPA + API + WS │ │ -│ │ data vol │ │ migrate+ │ │ Feishu WS inbound + │ │ -│ │ │ │ onboard │ │ outbound worker │ │ -│ └────────────┘ └────────────┘ │ Docker sandbox mgr │ │ -│ └─────────┬───────────────┘ │ -│ │ │ -│ ┌──────────────────────┐ 0.0.0.0:18080 │ -│ │ sandbox container │ │ │ -│ │ (on demand) │ │ │ -│ │ Claude Code + Codex │ │ │ -│ │ parsar-daemon │ │ │ -│ └──────────────────────┘ │ │ -└────────────────────────────────────────────┼───────────────────┘ - │ - ┌──────────────────────────────────┼─────────────┐ - │ LAN / Feishu │ │ - │ │ │ - │ User browser ──── HTTP ────────┘ │ - │ User device ────── WebSocket ──┘ │ - │ Feishu group/DM ── Feishu WS ──┘ │ - └────────────────────────────────────────────────┘ +┌─────────────────────────────────────────────────────────────────────┐ +│ Deploy machine (YOUR_IP) │ +│ │ +│ ┌──────────────┐ ┌──────────────────────────────────────┐ │ +│ │PostgreSQL │ │parsar-server │ │ +│ │:5432 │ │migrate on startup, then: │ │ +│ │data vol │ │SPA + API + WS │ │ +│ └──────────────┘ │Feishu WS inbound + outbound worker │ │ +│ │Docker sandbox mgr │ │ +│ └──────────────────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────┐ │ +│ │sandbox container (on demand) │ │ +│ │Claude Code + Codex + parsar-daemon │ │ +│ └──────────────────────────────────────┘ │ +│ │ +│ Listens on 0.0.0.0:18080 │ +└─────────────────────────────────────────────────────────────────────┘ + +LAN / Feishu clients reach parsar-server on port 18080: + - User browser ── HTTP ──────→ parsar-server (web UI) + - User device ── WebSocket ─→ parsar-server (device pairing) + - Feishu group/DM ── Feishu WS ─→ parsar-server (bot) ``` --- @@ -434,7 +428,7 @@ sudo docker build -t parsar:local . sudo docker build -f infra/sandbox/Dockerfile.local -t parsar-sandbox:local . # 3. Bring it up -sudo docker compose -f docker-compose.local.yml up -d +sudo docker compose -f docker-compose.yml up -d # 4. Verify curl http://YOUR_IP:18080/healthz # 200 diff --git a/install.sh b/install.sh index ff5a052..5105939 100755 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -DEFAULT_COMPOSE_URL="https://raw.githubusercontent.com/MiniMax-AI-Dev/parsar/main/docker-compose.local.yml" +DEFAULT_COMPOSE_URL="https://raw.githubusercontent.com/MiniMax-AI-Dev/parsar/main/docker-compose.yml" DEFAULT_SERVER_IMAGE="ghcr.io/minimax-ai-dev/parsar-server:latest" DEFAULT_SANDBOX_IMAGE="ghcr.io/minimax-ai-dev/parsar-sandbox:latest" @@ -16,7 +16,7 @@ Usage: Options: --home PATH Install state directory. Must be absolute or ~/... Default: ~/.parsar - --compose-file PATH Compose file to use. Default: ./docker-compose.local.yml + --compose-file PATH Compose file to use. Default: ./docker-compose.yml when present, otherwise download the published template. --image IMAGE parsar-server image. Default: ghcr.io/minimax-ai-dev/parsar-server:latest @@ -85,21 +85,28 @@ set_env() { } detect_docker() { - if docker compose version >/dev/null 2>&1 && docker info >/dev/null 2>&1; then + if docker compose version >/dev/null 2>&1 /dev/null 2>&1 /dev/null 2>&1 && - sudo -n docker compose version >/dev/null 2>&1 && - sudo -n docker info >/dev/null 2>&1; then + sudo -n docker compose version >/dev/null 2>&1 /dev/null 2>&1 /dev/null 2>&1; then curl -fsSL "$DEFAULT_COMPOSE_URL" -o "$compose_file" elif command -v wget >/dev/null 2>&1; then wget -qO "$compose_file" "$DEFAULT_COMPOSE_URL" else - die "curl or wget is required to download docker-compose.local.yml" + die "curl or wget is required to download docker-compose.yml" fi } diff --git a/packages/cli/src/commands/seed.ts b/packages/cli/src/commands/seed.ts deleted file mode 100644 index b5104b5..0000000 --- a/packages/cli/src/commands/seed.ts +++ /dev/null @@ -1,23 +0,0 @@ -import fs from 'node:fs/promises' -import path from 'node:path' -import { parsarPaths } from '../paths.js' - -const seed = { - workspace: { id: 'dev_workspace', name: 'Demo Workspace', slug: 'demo' }, - users: [{ id: 'dev_admin', email: 'admin@example.com', name: 'Dev Admin', role: 'owner' }], - agents: [ - { id: 'agent_product', name: 'Product Agent', slug: 'product-agent' }, - { id: 'agent_backend', name: 'Backend Agent', slug: 'backend-agent' }, - { id: 'agent_test', name: 'Test Agent', slug: 'test-agent' }, - ], - conversations: [{ id: 'conv_demo_group', title: 'Demo Group', visibility: 'workspace' }], -} - -export async function writeDevSeed() { - const paths = parsarPaths() - const seedDir = path.join(paths.dev, 'seed') - await fs.mkdir(seedDir, { recursive: true }) - const seedPath = path.join(seedDir, 'seed.json') - await fs.writeFile(seedPath, JSON.stringify(seed, null, 2) + '\n') - console.log(`Wrote Parsar dev seed to ${seedPath}`) -} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 49d09cc..77a9070 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -3,7 +3,6 @@ import { Command } from 'commander' import { printDevInfo } from './commands/dev.js' import { runDoctor } from './commands/doctor.js' import { runSetup } from './commands/setup.js' -import { writeDevSeed } from './commands/seed.js' const program = new Command() @@ -15,6 +14,5 @@ program program.command('setup').description('Create ~/.parsar local directories').action(runSetup) program.command('dev').description('Print Phase 0 development endpoints').action(printDevInfo) program.command('doctor').description('Print diagnostic paths without touching CWD').action(runDoctor) -program.command('seed-dev').description('Write deterministic dev seed under ~/.parsar/dev/seed').action(writeDevSeed) program.parseAsync(process.argv) diff --git a/scripts/dev-server-up.sh b/scripts/dev-server-up.sh index ad382c9..16066ff 100755 --- a/scripts/dev-server-up.sh +++ b/scripts/dev-server-up.sh @@ -160,7 +160,7 @@ sleep 1 FEISHU_MOCK="${PARSAR_FEISHU_MOCK:-true}" OWNER_URL="${PARSAR_AGENT_DAEMON_OWNER_URL:-http://127.0.0.1:${PORT}}" # Feishu Bot IM (websocket inbound + outbound reply cards). Mirrors -# docker-compose.local.yml so the script path is turnkey — profile not +# docker-compose.yml so the script path is turnkey — profile not # fork. Gates default ON but stay override-friendly; with no bot bound # the manager just idles. Bot credentials are NOT set here: they flow in # through the Web UI bind card into the encrypted vault (hot-reloaded diff --git a/scripts/parsar-paths.sh b/scripts/parsar-paths.sh deleted file mode 100755 index 4fd45e9..0000000 --- a/scripts/parsar-paths.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -PARSAR_HOME="${PARSAR_HOME:-$HOME/.parsar}" -cat <&2 + exit 1 +fi + +cat <