youmd 0.8.11 → 0.8.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/add.js +1 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/build.js +2 -2
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/chat.js +1 -1
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +11 -10
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/init.js +5 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.js +8 -1
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/login.js +2 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/machine.d.ts.map +1 -1
- package/dist/commands/machine.js +193 -13
- package/dist/commands/machine.js.map +1 -1
- package/dist/commands/mcp.js +4 -4
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/private.js +2 -2
- package/dist/commands/private.js.map +1 -1
- package/dist/commands/publish.js +1 -1
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/pull.js +1 -1
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.js +1 -1
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/skill.d.ts +1 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +72 -53
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +30 -25
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.js +2 -2
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/whoami.js +3 -3
- package/dist/commands/whoami.js.map +1 -1
- package/dist/create.js +0 -0
- package/dist/index.js +30 -28
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +11 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +3 -2
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts +20 -12
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +113 -42
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/daemon.d.ts +2 -0
- package/dist/lib/daemon.d.ts.map +1 -1
- package/dist/lib/daemon.js +28 -19
- package/dist/lib/daemon.js.map +1 -1
- package/dist/lib/machine-bootstrap-prompt.d.ts.map +1 -1
- package/dist/lib/machine-bootstrap-prompt.js +135 -128
- package/dist/lib/machine-bootstrap-prompt.js.map +1 -1
- package/dist/lib/machine-verify.d.ts +24 -0
- package/dist/lib/machine-verify.d.ts.map +1 -1
- package/dist/lib/machine-verify.js +41 -3
- package/dist/lib/machine-verify.js.map +1 -1
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +3 -8
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/portfolio-audit.d.ts.map +1 -1
- package/dist/lib/portfolio-audit.js +2 -1
- package/dist/lib/portfolio-audit.js.map +1 -1
- package/dist/lib/project.d.ts +3 -3
- package/dist/lib/project.d.ts.map +1 -1
- package/dist/lib/project.js +18 -11
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/projectContext.d.ts +10 -9
- package/dist/lib/projectContext.d.ts.map +1 -1
- package/dist/lib/projectContext.js +29 -23
- package/dist/lib/projectContext.js.map +1 -1
- package/dist/lib/realtime-sync.d.ts +1 -1
- package/dist/lib/realtime-sync.d.ts.map +1 -1
- package/dist/lib/realtime-sync.js +9 -8
- package/dist/lib/realtime-sync.js.map +1 -1
- package/dist/lib/render.js +1 -1
- package/dist/lib/render.js.map +1 -1
- package/dist/lib/skill-catalog.d.ts +26 -0
- package/dist/lib/skill-catalog.d.ts.map +1 -1
- package/dist/lib/skill-catalog.js +100 -0
- package/dist/lib/skill-catalog.js.map +1 -1
- package/dist/lib/vault.d.ts +3 -3
- package/dist/lib/vault.d.ts.map +1 -1
- package/dist/lib/vault.js +10 -8
- package/dist/lib/vault.js.map +1 -1
- package/dist/lib/youstack.js +12 -12
- package/dist/lib/youstack.js.map +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +74 -13
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +135 -7
- package/dist/mcp/server.js.map +1 -1
- package/dist/postinstall.js +3 -2
- package/dist/postinstall.js.map +1 -1
- package/dist/you.js +0 -0
- package/package.json +1 -1
- package/scripts/local-agent-stack-inventory.mjs +59 -21
- package/scripts/skillstack-sync/README.md +25 -25
- package/scripts/skillstack-sync/bootstrap-new-mac.sh +1 -1
- package/scripts/skillstack-sync/capture-agent-config.sh +8 -1
- package/scripts/skillstack-sync/{com.youmd.context-sync.plist → com.you.context-sync.plist} +3 -3
- package/scripts/skillstack-sync/{com.youmd.identity-sync.plist → com.you.identity-sync.plist} +3 -3
- package/scripts/skillstack-sync/{com.youmd.realtime-sync.plist → com.you.realtime-sync.plist} +3 -3
- package/scripts/skillstack-sync/{com.youmd.skillstack-sync.plist → com.you.skillstack-sync.plist} +3 -3
- package/scripts/skillstack-sync/context-sync.sh +1 -1
- package/scripts/skillstack-sync/install-daemons.sh +20 -6
- package/scripts/skillstack-sync/restore-agent-config.sh +1 -1
- package/scripts/skillstack-sync/sync.sh +1 -1
- package/skills/machine-bootstrap.md +57 -55
|
@@ -83,13 +83,13 @@ function portableHomePath(value) {
|
|
|
83
83
|
}
|
|
84
84
|
function buildFreshMachineBootstrapScript() {
|
|
85
85
|
return `set -euo pipefail
|
|
86
|
-
export PATH="$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
87
|
-
ROOT="\${YOUMD_CODE_ROOT:-$HOME/Desktop/CODE_YOU}"
|
|
88
|
-
DAYS="\${YOUMD_ACTIVE_DAYS:-30}"
|
|
89
|
-
EXPAND_DAYS="\${YOUMD_EXPAND_ACTIVE_DAYS:-90}"
|
|
90
|
-
LIMIT="\${YOUMD_PROJECT_LIMIT:-80}"
|
|
91
|
-
HYDRATE_TIMEOUT="\${YOUMD_PORTFOLIO_HYDRATE_TIMEOUT_SECONDS:-180}"
|
|
92
|
-
MIN_YOUMD_VERSION="\${YOUMD_MIN_VERSION:-0.8.
|
|
86
|
+
export PATH="$HOME/.you/bin:$HOME/.you/npm-global/bin:$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
87
|
+
ROOT="\${YOU_CODE_ROOT:-\${YOUMD_CODE_ROOT:-$HOME/Desktop/CODE_YOU}}"
|
|
88
|
+
DAYS="\${YOU_ACTIVE_DAYS:-\${YOUMD_ACTIVE_DAYS:-30}}"
|
|
89
|
+
EXPAND_DAYS="\${YOU_EXPAND_ACTIVE_DAYS:-\${YOUMD_EXPAND_ACTIVE_DAYS:-90}}"
|
|
90
|
+
LIMIT="\${YOU_PROJECT_LIMIT:-\${YOUMD_PROJECT_LIMIT:-80}}"
|
|
91
|
+
HYDRATE_TIMEOUT="\${YOU_PORTFOLIO_HYDRATE_TIMEOUT_SECONDS:-\${YOUMD_PORTFOLIO_HYDRATE_TIMEOUT_SECONDS:-180}}"
|
|
92
|
+
MIN_YOUMD_VERSION="\${YOU_MIN_VERSION:-\${YOUMD_MIN_VERSION:-0.8.12}}"
|
|
93
93
|
mkdir -p "$ROOT"
|
|
94
94
|
|
|
95
95
|
command_exists() { command -v "$1" >/dev/null 2>&1; }
|
|
@@ -115,18 +115,18 @@ version_at_least() {
|
|
|
115
115
|
}
|
|
116
116
|
ensure_youmd_min_version() {
|
|
117
117
|
local installed
|
|
118
|
-
installed="$(
|
|
118
|
+
installed="$(you --version 2>/dev/null | tr -d '[:space:]' || true)"
|
|
119
119
|
echo "[you.md] installed version: \${installed:-unknown}"
|
|
120
120
|
if [ -n "$installed" ] && version_at_least "$installed" "$MIN_YOUMD_VERSION"; then
|
|
121
121
|
return 0
|
|
122
122
|
fi
|
|
123
|
-
echo "[you.md] installed
|
|
124
|
-
curl -fsSL https://you.md/install.sh |
|
|
125
|
-
export PATH="$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
126
|
-
installed="$(
|
|
123
|
+
echo "[you.md] installed you is older than required \${MIN_YOUMD_VERSION}; forcing GitHub source install"
|
|
124
|
+
curl -fsSL https://you.md/install.sh | YOU_INSTALL_CHANNEL=source YOU_SOURCE_REF=main bash
|
|
125
|
+
export PATH="$HOME/.you/bin:$HOME/.you/npm-global/bin:$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
126
|
+
installed="$(you --version 2>/dev/null | tr -d '[:space:]' || true)"
|
|
127
127
|
echo "[you.md] installed version after forced source install: \${installed:-unknown}"
|
|
128
128
|
if [ -z "$installed" ] || ! version_at_least "$installed" "$MIN_YOUMD_VERSION"; then
|
|
129
|
-
echo "[you.md]
|
|
129
|
+
echo "[you.md] you \${MIN_YOUMD_VERSION}+ is required for Secret Vault, agent bus, agent stack inventory, and fresh-machine restore. npm latest may still be behind; rerun after this commit is deployed or install from GitHub main." >&2
|
|
130
130
|
exit 1
|
|
131
131
|
fi
|
|
132
132
|
}
|
|
@@ -150,14 +150,14 @@ run_with_timeout() {
|
|
|
150
150
|
fi
|
|
151
151
|
}
|
|
152
152
|
run_agent_stack_inventory() {
|
|
153
|
-
INVENTORY_DIR="\${YOUMD_AGENT_STACK_INVENTORY_DIR:-$HOME/.
|
|
153
|
+
INVENTORY_DIR="\${YOU_AGENT_STACK_INVENTORY_DIR:-\${YOUMD_AGENT_STACK_INVENTORY_DIR:-$HOME/.you/agent-stack-inventory}}"
|
|
154
154
|
mkdir -p "$INVENTORY_DIR"
|
|
155
155
|
echo "[you.md] running local/global agent stack inventory into $INVENTORY_DIR"
|
|
156
|
-
if
|
|
157
|
-
|
|
156
|
+
if you skill inventory --out-dir "$INVENTORY_DIR" --register-catalog --sync; then
|
|
157
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) generated agent stack inventory at $INVENTORY_DIR" || true
|
|
158
158
|
else
|
|
159
|
-
echo "[you.md] agent stack inventory did not complete; continuing setup so sync can self-heal, then rerun:
|
|
160
|
-
|
|
159
|
+
echo "[you.md] agent stack inventory did not complete; continuing setup so sync can self-heal, then rerun: you skill inventory --out-dir $INVENTORY_DIR --register-catalog --sync"
|
|
160
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) could not complete agent stack inventory yet; rerun after shared skill sync" || true
|
|
161
161
|
fi
|
|
162
162
|
}
|
|
163
163
|
|
|
@@ -169,7 +169,7 @@ bootstrap_prereqs() {
|
|
|
169
169
|
fi
|
|
170
170
|
if [ -x /opt/homebrew/bin/brew ]; then eval "$(/opt/homebrew/bin/brew shellenv)" || true; fi
|
|
171
171
|
if [ -x /usr/local/bin/brew ]; then eval "$(/usr/local/bin/brew shellenv)" || true; fi
|
|
172
|
-
export PATH="$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
172
|
+
export PATH="$HOME/.you/bin:$HOME/.you/npm-global/bin:$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
173
173
|
|
|
174
174
|
if command_exists brew; then
|
|
175
175
|
MAJOR="$(node_major)"
|
|
@@ -183,7 +183,7 @@ bootstrap_prereqs() {
|
|
|
183
183
|
command_exists bun || brew install bun || brew install oven-sh/bun/bun || true
|
|
184
184
|
fi
|
|
185
185
|
|
|
186
|
-
export PATH="$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
186
|
+
export PATH="$HOME/.you/bin:$HOME/.you/npm-global/bin:$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
187
187
|
command_exists corepack && corepack enable || true
|
|
188
188
|
if command_exists corepack && ! command_exists pnpm; then
|
|
189
189
|
corepack prepare pnpm@latest --activate || true
|
|
@@ -224,131 +224,137 @@ ensure_github_auth() {
|
|
|
224
224
|
bootstrap_prereqs
|
|
225
225
|
|
|
226
226
|
echo "[you.md] installing runtime from GitHub main"
|
|
227
|
-
curl -fsSL https://you.md/install.sh |
|
|
228
|
-
export PATH="$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
229
|
-
if ! command_exists
|
|
230
|
-
echo "[you.md]
|
|
227
|
+
curl -fsSL https://you.md/install.sh | YOU_INSTALL_CHANNEL=source YOU_SOURCE_REF=main bash
|
|
228
|
+
export PATH="$HOME/.you/bin:$HOME/.you/npm-global/bin:$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
229
|
+
if ! command_exists you; then
|
|
230
|
+
echo "[you.md] you was installed but is not on PATH. Try a new Terminal, then rerun this command." >&2
|
|
231
231
|
exit 1
|
|
232
232
|
fi
|
|
233
233
|
ensure_youmd_min_version
|
|
234
|
+
echo "[you.md] proving canonical ~/.you home migration"
|
|
235
|
+
you machine migrate-home --yes || true
|
|
234
236
|
|
|
235
|
-
|
|
237
|
+
YOU_BOOTSTRAP_API_KEY="\${YOU_API_KEY:-\${YOUMD_API_KEY:-}}"
|
|
238
|
+
if [ -n "$YOU_BOOTSTRAP_API_KEY" ]; then
|
|
236
239
|
echo "[you.md] logging in with bootstrap key"
|
|
237
|
-
|
|
240
|
+
you login --key "$YOU_BOOTSTRAP_API_KEY"
|
|
238
241
|
else
|
|
239
|
-
echo "[you.md] no
|
|
240
|
-
|
|
242
|
+
echo "[you.md] no YOU_API_KEY set; starting interactive login"
|
|
243
|
+
you login
|
|
241
244
|
fi
|
|
242
245
|
|
|
243
246
|
echo "[you.md] pulling identity bundle and syncing local brain"
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
+
you pull
|
|
248
|
+
you sync
|
|
249
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) authenticated, pulled identity, and started setup" || true
|
|
247
250
|
|
|
248
251
|
echo "[you.md] installing resident realtime/identity/skillstack/project-context daemons early"
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
+
you stack daemon install || true
|
|
253
|
+
you stack daemon status || true
|
|
254
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) installed resident realtime/skillstack daemons" || true
|
|
252
255
|
|
|
253
256
|
GITHUB_READY=0
|
|
254
257
|
if ensure_github_auth; then
|
|
255
258
|
GITHUB_READY=1
|
|
256
|
-
elif [ "\${YOUMD_REQUIRE_GITHUB_AUTH:-1}" = "1" ]; then
|
|
259
|
+
elif [ "\${YOU_REQUIRE_GITHUB_AUTH:-\${YOUMD_REQUIRE_GITHUB_AUTH:-1}}" = "1" ]; then
|
|
257
260
|
echo "[you.md] stopping after You.md identity/daemon setup because GitHub auth is required for private repos." >&2
|
|
258
261
|
exit 2
|
|
259
262
|
fi
|
|
260
263
|
|
|
261
264
|
echo "[you.md] restoring shared skills, stacks, and agent host config"
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
265
|
+
you machine setup || echo "[you.md] machine setup reported a warning; continuing to skills/MCP so the next run can self-heal"
|
|
266
|
+
you skill install all || true
|
|
267
|
+
you skill sync || true
|
|
268
|
+
you mcp --install claude --auto || true
|
|
269
|
+
you mcp --install codex --auto || true
|
|
270
|
+
you skill link claude || true
|
|
271
|
+
you skill link codex || true
|
|
269
272
|
run_agent_stack_inventory
|
|
270
|
-
|
|
273
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) restored shared skills/stacks and MCP config" || true
|
|
271
274
|
|
|
272
275
|
if [ "$GITHUB_READY" != "1" ]; then
|
|
273
276
|
echo "[you.md] GitHub auth is still missing; project clone pass skipped. Rerun after gh auth login."
|
|
274
|
-
|
|
277
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) stopped: GitHub auth required before private project clone" || true
|
|
275
278
|
exit 2
|
|
276
279
|
fi
|
|
277
280
|
|
|
278
281
|
RECENT_ONLY_ARGS=()
|
|
279
|
-
if
|
|
282
|
+
if you machine --help 2>/dev/null | grep -q -- "--recent-only"; then
|
|
280
283
|
RECENT_ONLY_ARGS=(--recent-only)
|
|
281
284
|
else
|
|
282
285
|
echo "[you.md] installed CLI does not expose --recent-only yet; using noninteractive no-to-older-projects fallback"
|
|
283
286
|
fi
|
|
284
287
|
run_machine_projects_recent_only() {
|
|
285
288
|
if [ "\${#RECENT_ONLY_ARGS[@]}" -gt 0 ]; then
|
|
286
|
-
|
|
289
|
+
you machine projects "$@"
|
|
287
290
|
else
|
|
288
|
-
|
|
291
|
+
you machine projects "$@" </dev/null
|
|
289
292
|
fi
|
|
290
293
|
}
|
|
291
294
|
|
|
292
295
|
echo "[you.md] hydrating portfolio graph from You.md/GitHub before the 30-day local clone pass"
|
|
293
|
-
run_with_timeout "$HYDRATE_TIMEOUT"
|
|
296
|
+
run_with_timeout "$HYDRATE_TIMEOUT" you project portfolio-hydrate --root "$ROOT" --days "$DAYS" --limit "$LIMIT" || true
|
|
294
297
|
PROJECT_ARGS=(--root "$ROOT" --days "$DAYS" "\${RECENT_ONLY_ARGS[@]}")
|
|
295
|
-
|
|
296
|
-
|
|
298
|
+
MAX_CLONE_PROJECTS="\${YOU_MAX_CLONE_PROJECTS:-\${YOUMD_MAX_CLONE_PROJECTS:-}}"
|
|
299
|
+
if [ -n "$MAX_CLONE_PROJECTS" ]; then
|
|
300
|
+
PROJECT_ARGS+=(--max-clone-projects "$MAX_CLONE_PROJECTS")
|
|
297
301
|
fi
|
|
298
302
|
echo "[you.md] previewing graph-backed 30-day project setup plan (ACTIVE + Top Priority/Focusing only)"
|
|
299
303
|
run_machine_projects_recent_only "\${PROJECT_ARGS[@]}" --dry-run || true
|
|
300
304
|
echo "[you.md] creating code workspace and cloning ACTIVE + Top Priority/Focusing 30-day project repos"
|
|
301
305
|
run_machine_projects_recent_only "\${PROJECT_ARGS[@]}"
|
|
302
|
-
|
|
306
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) finished 30-day active/focused project clone pass into $ROOT" || true
|
|
303
307
|
|
|
304
308
|
echo "[you.md] checking encrypted env-vault tooling without printing secrets"
|
|
305
|
-
|
|
309
|
+
you env backup --root "$ROOT" --preflight || true
|
|
306
310
|
SECRET_VAULT_RESTORED=0
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
311
|
+
ENV_VAULT_PATH="\${YOU_ENV_VAULT:-\${YOUMD_ENV_VAULT:-}}"
|
|
312
|
+
ALLOW_LOCAL_ENV_VAULT_FALLBACK="\${YOU_ALLOW_LOCAL_ENV_VAULT_FALLBACK:-\${YOUMD_ALLOW_LOCAL_ENV_VAULT_FALLBACK:-0}}"
|
|
313
|
+
if [ -z "$ENV_VAULT_PATH" ] && [ "\${YOU_SECRET_VAULT_PULL:-\${YOUMD_SECRET_VAULT_PULL:-1}}" = "1" ]; then
|
|
314
|
+
SECRET_VAULT_DIR="\${YOU_SECRET_VAULT_DIR:-\${YOUMD_SECRET_VAULT_DIR:-$HOME/.you/secret-vault}}"
|
|
310
315
|
echo "[you.md] registering this Mac as a trusted Secret Vault device"
|
|
311
|
-
|
|
316
|
+
you env vault device-register || true
|
|
312
317
|
echo "[you.md] checking You.md Secret Vault for the latest encrypted env vault and trusted-device envelope"
|
|
313
|
-
if
|
|
318
|
+
if you env vault pull --out "$SECRET_VAULT_DIR" --restore --root "$ROOT" --map-existing --existing-only --skip-agent-auth; then
|
|
314
319
|
SECRET_VAULT_RESTORED=1
|
|
315
320
|
echo "[you.md] restored env vault through trusted-device Secret Vault"
|
|
316
|
-
|
|
321
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) restored encrypted env vault through trusted-device Secret Vault" || true
|
|
317
322
|
else
|
|
318
323
|
echo "[you.md] account-backed Secret Vault restore is waiting for a trusted-device share"
|
|
319
|
-
echo "[you.md] source Mac action:
|
|
320
|
-
echo "[you.md] new Mac retry:
|
|
321
|
-
|
|
324
|
+
echo "[you.md] source Mac action: you env vault share"
|
|
325
|
+
echo "[you.md] new Mac retry: you env vault pull --restore --root \\"$ROOT\\" --map-existing --existing-only --skip-agent-auth"
|
|
326
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) registered Secret Vault device and is waiting for source Mac trusted-device share" || true
|
|
322
327
|
fi
|
|
323
328
|
fi
|
|
324
|
-
if [ "$SECRET_VAULT_RESTORED" != "1" ] && [ -z "
|
|
329
|
+
if [ "$SECRET_VAULT_RESTORED" != "1" ] && [ -z "$ENV_VAULT_PATH" ]; then
|
|
325
330
|
if [ "$ALLOW_LOCAL_ENV_VAULT_FALLBACK" = "1" ]; then
|
|
326
331
|
echo "[you.md] opt-in local/iCloud passphrase vault fallback enabled"
|
|
327
332
|
for DEFAULT_ENV_VAULT_DIR in "$HOME/Desktop/youmd-env-vault" "$HOME/Library/Mobile Documents/com~apple~CloudDocs/Desktop/youmd-env-vault" "$HOME/Library/Mobile Documents/com~apple~CloudDocs/youmd-env-vault"; do
|
|
328
333
|
if [ -d "$DEFAULT_ENV_VAULT_DIR" ]; then
|
|
329
334
|
DETECTED_ENV_VAULT="$(find "$DEFAULT_ENV_VAULT_DIR" -maxdepth 1 -type f \\( -name "env-vault-*.tar.enc" -o -name "env-vault-*.tar.age" -o -name "env-vault-*.tar.gpg" \\) -print 2>/dev/null | sort | tail -n 1 || true)"
|
|
330
335
|
if [ -n "$DETECTED_ENV_VAULT" ]; then
|
|
331
|
-
|
|
332
|
-
|
|
336
|
+
ENV_VAULT_PATH="$DETECTED_ENV_VAULT"
|
|
337
|
+
export YOU_ENV_VAULT="$ENV_VAULT_PATH"
|
|
338
|
+
echo "[you.md] using detected env vault: $ENV_VAULT_PATH"
|
|
333
339
|
break
|
|
334
340
|
fi
|
|
335
341
|
fi
|
|
336
342
|
done
|
|
337
343
|
else
|
|
338
344
|
echo "[you.md] local/iCloud passphrase vault fallback disabled by default"
|
|
339
|
-
echo "[you.md] set
|
|
345
|
+
echo "[you.md] set YOU_ALLOW_LOCAL_ENV_VAULT_FALLBACK=1 or YOU_ENV_VAULT=/path/to/env-vault only if you intentionally want the older passphrase flow"
|
|
340
346
|
fi
|
|
341
347
|
fi
|
|
342
348
|
if [ "$SECRET_VAULT_RESTORED" = "1" ]; then
|
|
343
349
|
:
|
|
344
|
-
elif [ -n "
|
|
350
|
+
elif [ -n "$ENV_VAULT_PATH" ]; then
|
|
345
351
|
echo "[you.md] using explicit/opt-in local encrypted vault fallback"
|
|
346
|
-
if [ ! -f "$
|
|
347
|
-
echo "[you.md] env vault path does not exist: $
|
|
352
|
+
if [ ! -f "$ENV_VAULT_PATH" ]; then
|
|
353
|
+
echo "[you.md] env vault path does not exist: $ENV_VAULT_PATH" >&2
|
|
348
354
|
exit 1
|
|
349
355
|
fi
|
|
350
356
|
if [ -z "\${ENV_VAULT_PASS:-}" ] && command_exists security; then
|
|
351
|
-
KEYCHAIN_SERVICE="\${YOUMD_ENV_VAULT_KEYCHAIN_SERVICE:-
|
|
357
|
+
KEYCHAIN_SERVICE="\${YOU_ENV_VAULT_KEYCHAIN_SERVICE:-\${YOUMD_ENV_VAULT_KEYCHAIN_SERVICE:-you-env-vault}}"
|
|
352
358
|
if ENV_VAULT_PASS_FROM_KEYCHAIN="$(security find-generic-password -a "\${USER:-\${LOGNAME:-houston}}" -s "$KEYCHAIN_SERVICE" -w 2>/dev/null)"; then
|
|
353
359
|
export ENV_VAULT_PASS="$ENV_VAULT_PASS_FROM_KEYCHAIN"
|
|
354
360
|
unset ENV_VAULT_PASS_FROM_KEYCHAIN
|
|
@@ -358,112 +364,112 @@ elif [ -n "\${YOUMD_ENV_VAULT:-}" ]; then
|
|
|
358
364
|
fi
|
|
359
365
|
fi
|
|
360
366
|
echo "[you.md] listing encrypted .env.local vault before restore"
|
|
361
|
-
|
|
367
|
+
you env restore "$ENV_VAULT_PATH" --root "$ROOT" --list --map-existing --existing-only --skip-agent-auth
|
|
362
368
|
echo "[you.md] restoring encrypted .env.local vault into existing cloned project dirs"
|
|
363
|
-
|
|
364
|
-
|
|
369
|
+
you env restore "$ENV_VAULT_PATH" --root "$ROOT" --map-existing --existing-only --skip-agent-auth
|
|
370
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) restored encrypted env vault into existing project dirs" || true
|
|
365
371
|
else
|
|
366
372
|
echo "[you.md] env vault not restored yet"
|
|
367
373
|
echo "[you.md] On the old/source Mac, create the encrypted vault first:"
|
|
368
|
-
echo "
|
|
374
|
+
echo "you env vault push --root ~/Desktop/CODE_2025 --out ~/Desktop/youmd-env-vault"
|
|
369
375
|
echo "[you.md] Then share local decrypt access to registered trusted Macs:"
|
|
370
|
-
echo "
|
|
376
|
+
echo "you env vault share"
|
|
371
377
|
echo "[you.md] Then retry on this Mac:"
|
|
372
|
-
echo "
|
|
378
|
+
echo "you env vault pull --restore --root \\"$ROOT\\" --map-existing --existing-only --skip-agent-auth"
|
|
373
379
|
echo "[you.md] This strict fresh-machine flow intentionally does not ask for a local vault passphrase on the new Mac by default."
|
|
374
380
|
echo "[you.md] Optional fallback: create a transferable local copy without account sync:"
|
|
375
|
-
echo "
|
|
381
|
+
echo "you env backup --root ~/Desktop/CODE_2025 --out ~/Desktop/youmd-env-vault"
|
|
376
382
|
echo "[you.md] Local/iCloud auto-detect is opt-in only. Rerun with:"
|
|
377
|
-
echo "
|
|
383
|
+
echo "YOU_ALLOW_LOCAL_ENV_VAULT_FALLBACK=1 YOU_REQUIRE_ENV_VAULT=1 <same command>"
|
|
378
384
|
echo "[you.md] Move the generated env-vault-*.tar.enc file to this Mac, then rerun this command with:"
|
|
379
|
-
echo "
|
|
385
|
+
echo "YOU_ENV_VAULT=/path/to/env-vault-YYYYMMDDTHHMMZ.tar.enc YOU_REQUIRE_ENV_VAULT=1 <same command>"
|
|
380
386
|
echo "[you.md] Or restore manually after clone:"
|
|
381
|
-
echo "
|
|
382
|
-
if [ "\${YOUMD_REQUIRE_ENV_VAULT:-}" = "1" ]; then
|
|
387
|
+
echo "you env restore <vault> --root \\"$ROOT\\" --map-existing --existing-only --skip-agent-auth"
|
|
388
|
+
if [ "\${YOU_REQUIRE_ENV_VAULT:-\${YOUMD_REQUIRE_ENV_VAULT:-}}" = "1" ]; then
|
|
383
389
|
echo "[you.md] strict proof is waiting for trusted-device Secret Vault share or an explicitly provided local vault; stopping before readiness is marked complete" >&2
|
|
384
|
-
|
|
390
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) stopped: waiting for trusted-device Secret Vault share or explicit local vault fallback" || true
|
|
385
391
|
exit 1
|
|
386
392
|
fi
|
|
387
393
|
fi
|
|
388
394
|
echo "[you.md] reconciling identity/skills after env-vault and source-Mac updates"
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
395
|
+
you pull || true
|
|
396
|
+
you sync || true
|
|
397
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) reconciled You.md bundle after env-vault handling" || true
|
|
392
398
|
echo "[you.md] rehydrating portfolio graph with local README/project-context/env-key evidence"
|
|
393
|
-
run_with_timeout "$HYDRATE_TIMEOUT"
|
|
399
|
+
run_with_timeout "$HYDRATE_TIMEOUT" you project portfolio-hydrate --root "$ROOT" --days "$DAYS" --limit "$LIMIT" || true
|
|
394
400
|
echo "[you.md] auditing cloned project readiness"
|
|
395
|
-
|
|
396
|
-
|
|
401
|
+
you machine verify --root "$ROOT" --max-projects "$LIMIT" --write-report --sync-report || true
|
|
402
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) synced machine readiness proof for $ROOT" || true
|
|
397
403
|
FULL_PROJECT_SET_COMPLETE=0
|
|
398
|
-
EXPAND_TO_90="\${YOUMD_EXPAND_TO_90_DAYS:-}"
|
|
399
|
-
if [ -z "$EXPAND_TO_90" ] && [ "\${YOUMD_SKIP_90_DAY_EXPANSION_PROMPT:-}" != "1" ] && [ -t 0 ]; then
|
|
404
|
+
EXPAND_TO_90="\${YOU_EXPAND_TO_90_DAYS:-\${YOUMD_EXPAND_TO_90_DAYS:-}}"
|
|
405
|
+
if [ -z "$EXPAND_TO_90" ] && [ "\${YOU_SKIP_90_DAY_EXPANSION_PROMPT:-\${YOUMD_SKIP_90_DAY_EXPANSION_PROMPT:-}}" != "1" ] && [ -t 0 ]; then
|
|
400
406
|
printf "\\n[you.md] expand to all active projects from the last \${EXPAND_DAYS} days before calling setup complete? [y/N] "
|
|
401
407
|
read -r EXPAND_TO_90
|
|
402
408
|
fi
|
|
403
409
|
case "$EXPAND_TO_90" in
|
|
404
410
|
y|Y|yes|YES|1|true|TRUE)
|
|
405
411
|
echo "[you.md] expanding workspace to active \${EXPAND_DAYS}-day project set"
|
|
406
|
-
run_with_timeout "$HYDRATE_TIMEOUT"
|
|
412
|
+
run_with_timeout "$HYDRATE_TIMEOUT" you project portfolio-hydrate --root "$ROOT" --days "$EXPAND_DAYS" --limit "$LIMIT" || true
|
|
407
413
|
EXPAND_PROJECT_ARGS=(--root "$ROOT" --days "$EXPAND_DAYS" "\${RECENT_ONLY_ARGS[@]}")
|
|
408
|
-
if [ -n "
|
|
409
|
-
EXPAND_PROJECT_ARGS+=(--max-clone-projects "$
|
|
414
|
+
if [ -n "$MAX_CLONE_PROJECTS" ]; then
|
|
415
|
+
EXPAND_PROJECT_ARGS+=(--max-clone-projects "$MAX_CLONE_PROJECTS")
|
|
410
416
|
fi
|
|
411
417
|
run_machine_projects_recent_only "\${EXPAND_PROJECT_ARGS[@]}" --dry-run || true
|
|
412
418
|
run_machine_projects_recent_only "\${EXPAND_PROJECT_ARGS[@]}"
|
|
413
|
-
run_with_timeout "$HYDRATE_TIMEOUT"
|
|
414
|
-
|
|
415
|
-
|
|
419
|
+
run_with_timeout "$HYDRATE_TIMEOUT" you project portfolio-hydrate --root "$ROOT" --days "$EXPAND_DAYS" --limit "$LIMIT" || true
|
|
420
|
+
you machine verify --root "$ROOT" --max-projects "$LIMIT" --write-report --sync-report || true
|
|
421
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) expanded to active/focused \${EXPAND_DAYS}-day project set and synced proof" || true
|
|
416
422
|
FULL_PROJECT_SET_COMPLETE=1
|
|
417
423
|
;;
|
|
418
424
|
*)
|
|
419
425
|
echo "[you.md] stopped after the \${DAYS}-day active project setup; \${EXPAND_DAYS}-day expansion remains intentionally open."
|
|
420
426
|
;;
|
|
421
427
|
esac
|
|
422
|
-
if [ "\${YOUMD_RUN_CHECKS:-}" = "1" ]; then
|
|
428
|
+
if [ "\${YOU_RUN_CHECKS:-\${YOUMD_RUN_CHECKS:-}}" = "1" ]; then
|
|
423
429
|
echo "[you.md] running bounded package checks"
|
|
424
|
-
|
|
430
|
+
you machine verify --root "$ROOT" --max-projects "$LIMIT" --run-checks --max-check-projects "\${YOU_MAX_CHECK_PROJECTS:-\${YOUMD_MAX_CHECK_PROJECTS:-8}}" --check-timeout-ms "\${YOU_CHECK_TIMEOUT_MS:-\${YOUMD_CHECK_TIMEOUT_MS:-120000}}" --write-report --sync-report || true
|
|
425
431
|
else
|
|
426
|
-
echo "[you.md] bounded package checks skipped; set
|
|
432
|
+
echo "[you.md] bounded package checks skipped; set YOU_RUN_CHECKS=1 to run lint/typecheck/test/build caps"
|
|
427
433
|
fi
|
|
428
|
-
if [ "\${YOUMD_INSTALL_DEPS:-}" = "1" ] || [ "\${YOUMD_PROBE_SERVERS:-}" = "1" ]; then
|
|
434
|
+
if [ "\${YOU_INSTALL_DEPS:-\${YOUMD_INSTALL_DEPS:-}}" = "1" ] || [ "\${YOU_PROBE_SERVERS:-\${YOUMD_PROBE_SERVERS:-}}" = "1" ]; then
|
|
429
435
|
echo "[you.md] running bounded clean-host install/server proof"
|
|
430
436
|
VERIFY_ARGS=(--root "$ROOT" --max-projects "$LIMIT")
|
|
431
|
-
if [ "\${YOUMD_INSTALL_DEPS:-}" = "1" ]; then
|
|
432
|
-
VERIFY_ARGS+=(--install-deps --max-install-projects "\${YOUMD_MAX_INSTALL_PROJECTS:-4}" --install-timeout-ms "\${YOUMD_INSTALL_TIMEOUT_MS:-180000}")
|
|
437
|
+
if [ "\${YOU_INSTALL_DEPS:-\${YOUMD_INSTALL_DEPS:-}}" = "1" ]; then
|
|
438
|
+
VERIFY_ARGS+=(--install-deps --max-install-projects "\${YOU_MAX_INSTALL_PROJECTS:-\${YOUMD_MAX_INSTALL_PROJECTS:-4}}" --install-timeout-ms "\${YOU_INSTALL_TIMEOUT_MS:-\${YOUMD_INSTALL_TIMEOUT_MS:-180000}}")
|
|
433
439
|
fi
|
|
434
|
-
if [ "\${YOUMD_PROBE_SERVERS:-}" = "1" ]; then
|
|
435
|
-
VERIFY_ARGS+=(--probe-servers --max-server-projects "\${YOUMD_MAX_SERVER_PROJECTS:-3}" --server-timeout-ms "\${YOUMD_SERVER_TIMEOUT_MS:-45000}" --server-start-port "\${YOUMD_SERVER_START_PORT:-4310}")
|
|
440
|
+
if [ "\${YOU_PROBE_SERVERS:-\${YOUMD_PROBE_SERVERS:-}}" = "1" ]; then
|
|
441
|
+
VERIFY_ARGS+=(--probe-servers --max-server-projects "\${YOU_MAX_SERVER_PROJECTS:-\${YOUMD_MAX_SERVER_PROJECTS:-3}}" --server-timeout-ms "\${YOU_SERVER_TIMEOUT_MS:-\${YOUMD_SERVER_TIMEOUT_MS:-45000}}" --server-start-port "\${YOU_SERVER_START_PORT:-\${YOUMD_SERVER_START_PORT:-4310}}")
|
|
436
442
|
fi
|
|
437
|
-
|
|
443
|
+
you machine verify "\${VERIFY_ARGS[@]}" --write-report --sync-report || true
|
|
438
444
|
else
|
|
439
|
-
echo "[you.md] clean-host install/server proof skipped; set
|
|
445
|
+
echo "[you.md] clean-host install/server proof skipped; set YOU_INSTALL_DEPS=1 and YOU_PROBE_SERVERS=1 to install deps and smoke-probe local dev servers"
|
|
440
446
|
fi
|
|
441
447
|
echo "[you.md] confirming resident realtime/identity/skillstack/project-context daemons"
|
|
442
|
-
|
|
443
|
-
|
|
448
|
+
you stack daemon install || true
|
|
449
|
+
you stack daemon status || true
|
|
444
450
|
run_agent_stack_inventory
|
|
445
451
|
echo "[you.md] running final one-command machine sync/proof consolidation"
|
|
446
|
-
|
|
447
|
-
|
|
452
|
+
you machine sync-now --root "$ROOT" --max-projects "$LIMIT" || true
|
|
453
|
+
you status
|
|
448
454
|
if [ "$FULL_PROJECT_SET_COMPLETE" = "1" ]; then
|
|
449
455
|
echo "[you.md] fresh-machine full \${EXPAND_DAYS}-day project setup complete: $ROOT"
|
|
450
|
-
|
|
456
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) complete: full \${EXPAND_DAYS}-day active/focused setup at $ROOT" || true
|
|
451
457
|
else
|
|
452
458
|
echo "[you.md] fresh-machine \${DAYS}-day setup pass complete; \${EXPAND_DAYS}-day expansion is still open: $ROOT"
|
|
453
|
-
|
|
459
|
+
you agent send --channel machine-sync --kind status "fresh machine \$(hostname) complete for \${DAYS}-day active/focused pass at $ROOT; \${EXPAND_DAYS}-day expansion still open" || true
|
|
454
460
|
fi`;
|
|
455
461
|
}
|
|
456
462
|
function buildFreshMachineBootstrapCommand(options = {}) {
|
|
457
463
|
const assignments = [
|
|
458
|
-
envAssignment("
|
|
459
|
-
envAssignment("
|
|
460
|
-
envAssignment("
|
|
461
|
-
envAssignment("
|
|
462
|
-
envAssignment("
|
|
463
|
-
envAssignment("
|
|
464
|
-
envAssignment("
|
|
464
|
+
envAssignment("YOU_API_KEY", options.apiKey),
|
|
465
|
+
envAssignment("YOU_CODE_ROOT", portableHomePath(options.root), { expandHome: true }),
|
|
466
|
+
envAssignment("YOU_ACTIVE_DAYS", options.days ?? exports.DEFAULT_FRESH_MACHINE_DAYS),
|
|
467
|
+
envAssignment("YOU_PROJECT_LIMIT", options.limit ?? exports.DEFAULT_FRESH_MACHINE_LIMIT),
|
|
468
|
+
envAssignment("YOU_MAX_CLONE_PROJECTS", options.maxCloneProjects),
|
|
469
|
+
envAssignment("YOU_ENV_VAULT", portableHomePath(options.envVaultPath), { expandHome: true }),
|
|
470
|
+
envAssignment("YOU_REQUIRE_ENV_VAULT", options.requireEnvVault ? "1" : undefined),
|
|
465
471
|
].filter((value) => Boolean(value));
|
|
466
|
-
const pathPrefix = `PATH="$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"`;
|
|
472
|
+
const pathPrefix = `PATH="$HOME/.you/bin:$HOME/.you/npm-global/bin:$HOME/.youmd/bin:$HOME/.youmd/npm-global/bin:/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"`;
|
|
467
473
|
return `${[pathPrefix, ...assignments].join(" ")} bash -lc ${shellQuote(buildFreshMachineBootstrapScript())}`;
|
|
468
474
|
}
|
|
469
475
|
function buildFreshMachineBootstrapPrompt(options = {}) {
|
|
@@ -484,7 +490,7 @@ function buildFreshMachineBootstrapPrompt(options = {}) {
|
|
|
484
490
|
"",
|
|
485
491
|
authLine,
|
|
486
492
|
"",
|
|
487
|
-
"Behind-the-scenes operating rule: use the You.md CLI and You Agent yourself before asking Houston to do anything. Run deterministic commands like `
|
|
493
|
+
"Behind-the-scenes operating rule: use the You.md CLI and You Agent yourself before asking Houston to do anything. Run deterministic commands like `you status`, `you whoami`, `you pull`, `you sync`, `you skill install all`, `you skill sync`, `you skill inventory`, `you env vault list`, `you env vault device-register`, `you env vault pull --restore`, `you machine prompt`, `you machine verify`, `you project portfolio-hydrate`, and `you agent status` as needed. Use `you agent send --channel machine-sync --kind status \"...\"` to report setup milestones back to Houston's other trusted Macs over the realtime agent bus. Use `you` / `you chat` only when you need the You Agent to synthesize or route context, then turn its output into concrete shell actions. Interrupt Houston only for true human-gated steps: GitHub browser auth, source-Mac Secret Vault share if the trusted-device envelope has not been created yet, local vault passphrase/Keychain only when `YOU_ALLOW_LOCAL_ENV_VAULT_FALLBACK=1` or `YOU_ENV_VAULT` is explicitly provided, npm OTP, OS permissions, or an explicit choice such as the 90-day expansion.",
|
|
488
494
|
"",
|
|
489
495
|
"Exact setup command:",
|
|
490
496
|
"",
|
|
@@ -495,27 +501,28 @@ function buildFreshMachineBootstrapPrompt(options = {}) {
|
|
|
495
501
|
"What it will do:",
|
|
496
502
|
"- check/install the local prerequisites first: Homebrew, Node 22/npm, git, GitHub CLI, bun, and pnpm/corepack",
|
|
497
503
|
"- install You.md from the curl runtime and force the You.md/Homebrew/Node 22 paths into this setup shell",
|
|
504
|
+
"- prove the canonical `~/.you` home migration while preserving legacy `~/.youmd` fallback",
|
|
498
505
|
"- authenticate and pull/sync your identity bundle",
|
|
499
506
|
"- install resident realtime sync daemons early so identity/skill/project-context sync is not deferred until the end",
|
|
500
507
|
"- require GitHub CLI auth before private shared-skill/project repos clone; if browser auth fails inside Claude/Codex, it prints the exact Terminal command to run and stops cleanly",
|
|
501
508
|
"- install/configure MCP for Claude Code and Codex",
|
|
502
509
|
"- restore shared agent skills, stack config, Claude/Codex links, and agent host config",
|
|
503
|
-
"- generate a secret-safe local/global agent stack inventory under `~/.
|
|
510
|
+
"- generate a secret-safe local/global agent stack inventory under `~/.you/agent-stack-inventory` after shared skills are restored and again near final proof",
|
|
504
511
|
"- use the installed You.md CLI behind the scenes for status, skill sync, Secret Vault pull, portfolio graph hydration, machine verification, and You Agent context routing instead of making Houston manually drive those steps",
|
|
505
|
-
"- publish setup milestones through `
|
|
512
|
+
"- publish setup milestones through `you agent send` so Houston's source Mac and realtime daemon can see the Mac mini come online without clipboard babysitting",
|
|
506
513
|
"- hydrate the portfolio graph from You.md + authenticated GitHub before cloning",
|
|
507
514
|
`- preview the graph-backed plan, create ${root}, and clone only projects marked ACTIVE plus Top Priority/Focusing from the last ${days} days first`,
|
|
508
515
|
`- ask whether to expand to all ACTIVE plus Top Priority/Focusing projects from the last ${expandDays} days before calling the full project clone set complete`,
|
|
509
|
-
"- check env-vault tooling, register this Mac as a trusted Secret Vault device, pull the latest account-backed You.md Secret Vault encrypted snapshot when available, unwrap the vault passphrase locally through a trusted-device key envelope, restore env files into existing cloned project dirs with `--map-existing --existing-only --skip-agent-auth`, or stop with the exact source-Mac `
|
|
510
|
-
"- reconcile `
|
|
516
|
+
"- check env-vault tooling, register this Mac as a trusted Secret Vault device, pull the latest account-backed You.md Secret Vault encrypted snapshot when available, unwrap the vault passphrase locally through a trusted-device key envelope, restore env files into existing cloned project dirs with `--map-existing --existing-only --skip-agent-auth`, or stop with the exact source-Mac `you env vault share` action instead of asking for a passphrase on the new Mac. Local/iCloud passphrase fallback runs only when `YOU_ALLOW_LOCAL_ENV_VAULT_FALLBACK=1` or `YOU_ENV_VAULT` is explicitly provided. After env handling, rehydrate local project/env evidence.",
|
|
517
|
+
"- reconcile `you pull && you sync` after env-vault handling so source-Mac bundle updates, new trusted-device envelopes, shared skills, and machine proof state do not leave this Mac showing `remote ahead`",
|
|
511
518
|
"- write and sync a secret-safe machine proof report, with optional bounded install/check/server proof flags",
|
|
512
|
-
"- bound portfolio hydration with `
|
|
519
|
+
"- bound portfolio hydration with `YOU_PORTFOLIO_HYDRATE_TIMEOUT_SECONDS` so large restored roots do not wedge setup",
|
|
513
520
|
"",
|
|
514
521
|
`Project source: You.md portfolio graph + authenticated GitHub recent repos, capped at ${limit} tracked projects before local audit evidence is merged. When the graph exists, new-computer setup clones only projects with status ACTIVE and focus Top Priority/Focusing; inactive, unsorted, on-ice, abandoned, killed, and unreviewed GitHub-only repos are skipped unless --include-inactive is explicitly used. First pass is ${days} days with out-of-window projects skipped; the ${expandDays}-day pass is explicit.`,
|
|
515
|
-
"Secret rule: .env.local values are never embedded here. Best path: on the old/source Mac, run `
|
|
522
|
+
"Secret rule: .env.local values are never embedded here. Best path: on the old/source Mac, run `you env vault push --root ~/Desktop/CODE_2025 --out ~/Desktop/youmd-env-vault` once, then after the new Mac registers itself run `you env vault share` on the source Mac. That uploads only encrypted archive bytes plus safe manifest metadata, and stores only per-device encrypted passphrase envelopes. A trusted new Mac pulls the encrypted snapshot after login and decrypts locally with its private device key; raw env values never hit the browser, chat, or You.md servers. If the envelope is missing, the command stops and sends a machine-sync status telling the source Mac to run `you env vault share`. Local fallback is opt-in only: run `you env backup --root ~/Desktop/CODE_2025 --out ~/Desktop/youmd-env-vault`, move the generated `env-vault-*.tar.enc` file to the new machine, then rerun with `YOU_ALLOW_LOCAL_ENV_VAULT_FALLBACK=1` or explicit `YOU_ENV_VAULT=/path/to/env-vault-*.tar.enc`. The restore path lists variable names/counts and target paths only, never values, maps old folder names onto cloned dirs, and skips agent auth config so it does not clobber the new machine's active Claude/Codex login.",
|
|
516
523
|
"",
|
|
517
524
|
"After the command finishes, report:",
|
|
518
|
-
"- the `
|
|
525
|
+
"- the `you status` sync state",
|
|
519
526
|
`- the \`${root}\` project count`,
|
|
520
527
|
"- whether the encrypted env vault restored",
|
|
521
528
|
"- whether Claude/Codex MCP config was installed",
|
|
@@ -523,7 +530,7 @@ function buildFreshMachineBootstrapPrompt(options = {}) {
|
|
|
523
530
|
"- the synced machine proof status",
|
|
524
531
|
"- whether I should expand to the 90-day active project set if I have not answered yet",
|
|
525
532
|
"",
|
|
526
|
-
"Done-ness rule: for real fresh-computer proof, set
|
|
533
|
+
"Done-ness rule: for real fresh-computer proof, set YOU_REQUIRE_ENV_VAULT=1 or pass --require-env-vault so the command fails instead of pretending setup is complete when the encrypted env vault is missing.",
|
|
527
534
|
].join("\n");
|
|
528
535
|
}
|
|
529
536
|
//# sourceMappingURL=machine-bootstrap-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machine-bootstrap-prompt.js","sourceRoot":"","sources":["../../src/lib/machine-bootstrap-prompt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,
|
|
1
|
+
{"version":3,"file":"machine-bootstrap-prompt.js","sourceRoot":"","sources":["../../src/lib/machine-bootstrap-prompt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,4EAyXC;AAED,8EAaC;AAED,4EA6DC;AA9fD,uCAAyB;AAEZ,QAAA,0BAA0B,GAAG,oBAAoB,CAAC;AAClD,QAAA,0BAA0B,GAAG,EAAE,CAAC;AAChC,QAAA,iCAAiC,GAAG,EAAE,CAAC;AACvC,QAAA,2BAA2B,GAAG,EAAE,CAAC;AAY9C,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CACpB,IAAY,EACZ,KAAkC,EAClC,UAAoC,EAAE;IAEtC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACnF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,WAAW,KAAK,GAAG;YAAE,OAAO,GAAG,IAAI,UAAU,CAAC;QAClD,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,IAAI,UAAU,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC;QAC7F,CAAC;QACD,IAAI,WAAW,KAAK,OAAO;YAAE,OAAO,GAAG,IAAI,UAAU,CAAC;QACtD,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,GAAG,IAAI,WAAW,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC;QAC5G,CAAC;QACD,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,GAAG,IAAI,UAAU,CAAC;QACxD,IAAI,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACvC,OAAO,GAAG,IAAI,WAAW,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC;QAC9G,CAAC;IACH,CAAC;IACD,OAAO,GAAG,IAAI,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IACxB,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,MAAM,EAAE,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,gCAAgC;IAC9C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuXN,CAAC;AACJ,CAAC;AAED,SAAgB,iCAAiC,CAAC,UAAwC,EAAE;IAC1F,MAAM,WAAW,GAAG;QAClB,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC;QAC5C,aAAa,CAAC,eAAe,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACpF,aAAa,CAAC,iBAAiB,EAAE,OAAO,CAAC,IAAI,IAAI,kCAA0B,CAAC;QAC5E,aAAa,CAAC,mBAAmB,EAAE,OAAO,CAAC,KAAK,IAAI,mCAA2B,CAAC;QAChF,aAAa,CAAC,wBAAwB,EAAE,OAAO,CAAC,gBAAgB,CAAC;QACjE,aAAa,CAAC,eAAe,EAAE,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC5F,aAAa,CAAC,uBAAuB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;KAClF,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAErD,MAAM,UAAU,GAAG,8LAA8L,CAAC;IAClN,OAAO,GAAG,CAAC,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC,gCAAgC,EAAE,CAAC,EAAE,CAAC;AAChH,CAAC;AAED,SAAgB,gCAAgC,CAAC,UAAwC,EAAE;IACzF,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,kCAA0B,CAAC;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,kCAA0B,CAAC;IACxD,MAAM,UAAU,GAAG,yCAAiC,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,mCAA2B,CAAC;IAC3D,MAAM,OAAO,GAAG,iCAAiC,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM;QAC7B,CAAC,CAAC,+FAA+F;QACjG,CAAC,CAAC,sFAAsF,CAAC;IAE3F,OAAO;QACL,2DAA2D;QAC3D,EAAE;QACF,gSAAgS;QAChS,EAAE;QACF,yIAAyI;QACzI,EAAE;QACF,QAAQ;QACR,EAAE;QACF,gmCAAgmC;QAChmC,EAAE;QACF,sBAAsB;QACtB,EAAE;QACF,SAAS;QACT,OAAO;QACP,KAAK;QACL,EAAE;QACF,kBAAkB;QAClB,+GAA+G;QAC/G,0GAA0G;QAC1G,2FAA2F;QAC3F,mDAAmD;QACnD,qHAAqH;QACrH,qLAAqL;QACrL,mDAAmD;QACnD,wFAAwF;QACxF,8JAA8J;QAC9J,iOAAiO;QACjO,gKAAgK;QAChK,iFAAiF;QACjF,2CAA2C,IAAI,oFAAoF,IAAI,aAAa;QACpJ,2FAA2F,UAAU,0DAA0D;QAC/J,4oBAA4oB;QAC5oB,6MAA6M;QAC7M,6GAA6G;QAC7G,qHAAqH;QACrH,EAAE;QACF,yFAAyF,KAAK,uUAAuU,IAAI,kDAAkD,UAAU,wBAAwB;QAC7f,wrCAAwrC;QACxrC,EAAE;QACF,qCAAqC;QACrC,+BAA+B;QAC/B,WAAW,IAAI,kBAAkB;QACjC,4CAA4C;QAC5C,iDAAiD;QACjD,yDAAyD;QACzD,mCAAmC;QACnC,uFAAuF;QACvF,EAAE;QACF,8MAA8M;KAC/M,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -125,6 +125,25 @@ export interface MachineAgentStackInventoryProof {
|
|
|
125
125
|
secretValuesExposed: false;
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
|
+
export interface MachineDaemonProof {
|
|
129
|
+
status: "ready" | "warn";
|
|
130
|
+
loaded: number;
|
|
131
|
+
total: number;
|
|
132
|
+
legacyLoaded: number;
|
|
133
|
+
warnings: string[];
|
|
134
|
+
labels: Array<{
|
|
135
|
+
label: string;
|
|
136
|
+
legacyLabel?: string;
|
|
137
|
+
name: string;
|
|
138
|
+
loaded: boolean;
|
|
139
|
+
legacyLoaded: boolean;
|
|
140
|
+
lastActivityAt?: string;
|
|
141
|
+
warning?: string;
|
|
142
|
+
}>;
|
|
143
|
+
security: {
|
|
144
|
+
secretValuesExposed: false;
|
|
145
|
+
};
|
|
146
|
+
}
|
|
128
147
|
export interface MachineVerificationProof {
|
|
129
148
|
schemaVersion: 1;
|
|
130
149
|
generatedAt: string;
|
|
@@ -137,6 +156,7 @@ export interface MachineVerificationProof {
|
|
|
137
156
|
checks?: MachineRunChecksReport;
|
|
138
157
|
servers?: MachineServerProbeReport;
|
|
139
158
|
agentStackInventory?: MachineAgentStackInventoryProof;
|
|
159
|
+
daemons: MachineDaemonProof;
|
|
140
160
|
summary: {
|
|
141
161
|
status: "ready" | "warn" | "failed";
|
|
142
162
|
scanned: number;
|
|
@@ -146,6 +166,9 @@ export interface MachineVerificationProof {
|
|
|
146
166
|
installPassed: number;
|
|
147
167
|
checksPassed: number;
|
|
148
168
|
serversPassed: number;
|
|
169
|
+
daemonsLoaded: number;
|
|
170
|
+
daemonsTotal: number;
|
|
171
|
+
legacyDaemonsLoaded: number;
|
|
149
172
|
failures: number;
|
|
150
173
|
warnings: string[];
|
|
151
174
|
};
|
|
@@ -154,6 +177,7 @@ export interface MachineVerificationProofWriteResult {
|
|
|
154
177
|
latestPath: string;
|
|
155
178
|
archivedPath: string;
|
|
156
179
|
}
|
|
180
|
+
export declare function buildMachineDaemonProof(): MachineDaemonProof;
|
|
157
181
|
export declare function defaultAgentStackInventoryDir(): string;
|
|
158
182
|
export declare function loadLatestAgentStackInventoryProof(outDir?: string): MachineAgentStackInventoryProof | null;
|
|
159
183
|
export declare function inspectMachineProject(projectDir: string): MachineProjectReadiness;
|