harnery 0.0.1 → 0.2.1
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/LICENSE +21 -0
- package/README.md +84 -2
- package/bin/agent-coord +42 -0
- package/bin/agent-hook +44 -0
- package/bin/harn +40 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +18 -0
- package/dist/commander.d.ts +128 -0
- package/dist/commander.d.ts.map +1 -0
- package/dist/commander.js +126 -0
- package/dist/commands/agents.d.ts +18 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +3946 -0
- package/dist/commands/backup.d.ts +22 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +262 -0
- package/dist/commands/browse-ai.d.ts +4 -0
- package/dist/commands/browse-ai.d.ts.map +1 -0
- package/dist/commands/browse-ai.js +156 -0
- package/dist/commands/browse.d.ts +4 -0
- package/dist/commands/browse.d.ts.map +1 -0
- package/dist/commands/browse.js +590 -0
- package/dist/commands/callers.d.ts +4 -0
- package/dist/commands/callers.d.ts.map +1 -0
- package/dist/commands/callers.js +276 -0
- package/dist/commands/completion.d.ts +17 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +158 -0
- package/dist/commands/config-get.d.ts +4 -0
- package/dist/commands/config-get.d.ts.map +1 -0
- package/dist/commands/config-get.js +131 -0
- package/dist/commands/context.d.ts +11 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +185 -0
- package/dist/commands/cookies.d.ts +4 -0
- package/dist/commands/cookies.d.ts.map +1 -0
- package/dist/commands/cookies.js +140 -0
- package/dist/commands/docs.d.ts +4 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +137 -0
- package/dist/commands/doctor.d.ts +25 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +200 -0
- package/dist/commands/edit-batch.d.ts +18 -0
- package/dist/commands/edit-batch.d.ts.map +1 -0
- package/dist/commands/edit-batch.js +172 -0
- package/dist/commands/eml.d.ts +4 -0
- package/dist/commands/eml.d.ts.map +1 -0
- package/dist/commands/eml.js +428 -0
- package/dist/commands/env.d.ts +4 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +201 -0
- package/dist/commands/fetch.d.ts +4 -0
- package/dist/commands/fetch.d.ts.map +1 -0
- package/dist/commands/fetch.js +99 -0
- package/dist/commands/file-history.d.ts +4 -0
- package/dist/commands/file-history.d.ts.map +1 -0
- package/dist/commands/file-history.js +152 -0
- package/dist/commands/grep.d.ts +4 -0
- package/dist/commands/grep.d.ts.map +1 -0
- package/dist/commands/grep.js +317 -0
- package/dist/commands/init.d.ts +82 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +288 -0
- package/dist/commands/outline.d.ts +4 -0
- package/dist/commands/outline.d.ts.map +1 -0
- package/dist/commands/outline.js +509 -0
- package/dist/commands/presence.d.ts +12 -0
- package/dist/commands/presence.d.ts.map +1 -0
- package/dist/commands/presence.js +123 -0
- package/dist/commands/read.d.ts +7 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +46 -0
- package/dist/commands/scratch.d.ts +4 -0
- package/dist/commands/scratch.d.ts.map +1 -0
- package/dist/commands/scratch.js +426 -0
- package/dist/commands/session.d.ts +4 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +162 -0
- package/dist/commands/sync.d.ts +24 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +275 -0
- package/dist/commands/toc.d.ts +5 -0
- package/dist/commands/toc.d.ts.map +1 -0
- package/dist/commands/toc.js +153 -0
- package/dist/commands/tokens.d.ts +4 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +48 -0
- package/dist/commands/tunnel.d.ts +4 -0
- package/dist/commands/tunnel.d.ts.map +1 -0
- package/dist/commands/tunnel.js +513 -0
- package/dist/commands/uninstall.d.ts +22 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +126 -0
- package/dist/commands/web.d.ts +4 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +165 -0
- package/dist/core/agents/canonical-emit.d.ts +27 -0
- package/dist/core/agents/canonical-emit.d.ts.map +1 -0
- package/dist/core/agents/canonical-emit.js +72 -0
- package/dist/core/agents/cli-emit.d.ts +27 -0
- package/dist/core/agents/cli-emit.d.ts.map +1 -0
- package/dist/core/agents/cli-emit.js +57 -0
- package/dist/core/agents/cli.d.ts +10 -0
- package/dist/core/agents/cli.d.ts.map +1 -0
- package/dist/core/agents/cli.js +757 -0
- package/dist/core/agents/codex-replay.d.ts +29 -0
- package/dist/core/agents/codex-replay.d.ts.map +1 -0
- package/dist/core/agents/codex-replay.js +138 -0
- package/dist/core/agents/coord-client.d.ts +98 -0
- package/dist/core/agents/coord-client.d.ts.map +1 -0
- package/dist/core/agents/coord-client.js +212 -0
- package/dist/core/agents/events/consume.d.ts +59 -0
- package/dist/core/agents/events/consume.d.ts.map +1 -0
- package/dist/core/agents/events/consume.js +147 -0
- package/dist/core/agents/events/emit.d.ts +42 -0
- package/dist/core/agents/events/emit.d.ts.map +1 -0
- package/dist/core/agents/events/emit.js +70 -0
- package/dist/core/agents/events/ulid.d.ts +11 -0
- package/dist/core/agents/events/ulid.d.ts.map +1 -0
- package/dist/core/agents/events/ulid.js +47 -0
- package/dist/core/agents/index.d.ts +14 -0
- package/dist/core/agents/index.d.ts.map +1 -0
- package/dist/core/agents/index.js +13 -0
- package/dist/core/agents/paths.d.ts +6 -0
- package/dist/core/agents/paths.d.ts.map +1 -0
- package/dist/core/agents/paths.js +17 -0
- package/dist/core/agents/render/prompt-context.d.ts +43 -0
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -0
- package/dist/core/agents/render/prompt-context.js +335 -0
- package/dist/core/agents/render/session-context.d.ts +39 -0
- package/dist/core/agents/render/session-context.d.ts.map +1 -0
- package/dist/core/agents/render/session-context.js +283 -0
- package/dist/core/agents/rules/claim-conflict.d.ts +35 -0
- package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -0
- package/dist/core/agents/rules/claim-conflict.js +244 -0
- package/dist/core/agents/rules/commit-conflict.d.ts +59 -0
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -0
- package/dist/core/agents/rules/commit-conflict.js +244 -0
- package/dist/core/agents/rules/stop-hook.d.ts +44 -0
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -0
- package/dist/core/agents/rules/stop-hook.js +161 -0
- package/dist/core/agents/session-events.d.ts +41 -0
- package/dist/core/agents/session-events.d.ts.map +1 -0
- package/dist/core/agents/session-events.js +205 -0
- package/dist/core/agents/state/activity-log.d.ts +18 -0
- package/dist/core/agents/state/activity-log.d.ts.map +1 -0
- package/dist/core/agents/state/activity-log.js +34 -0
- package/dist/core/agents/state/council.d.ts +39 -0
- package/dist/core/agents/state/council.d.ts.map +1 -0
- package/dist/core/agents/state/council.js +216 -0
- package/dist/core/agents/state/heartbeat-projector.d.ts +59 -0
- package/dist/core/agents/state/heartbeat-projector.d.ts.map +1 -0
- package/dist/core/agents/state/heartbeat-projector.js +436 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts +64 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -0
- package/dist/core/agents/state/heartbeat-writer.js +271 -0
- package/dist/core/agents/state/names.d.ts +35 -0
- package/dist/core/agents/state/names.d.ts.map +1 -0
- package/dist/core/agents/state/names.js +376 -0
- package/dist/core/agents/state/pidmap.d.ts +11 -0
- package/dist/core/agents/state/pidmap.d.ts.map +1 -0
- package/dist/core/agents/state/pidmap.js +32 -0
- package/dist/core/agents/state/scratch.d.ts +27 -0
- package/dist/core/agents/state/scratch.d.ts.map +1 -0
- package/dist/core/agents/state/scratch.js +90 -0
- package/dist/core/agents/state/shell-mutation.d.ts +17 -0
- package/dist/core/agents/state/shell-mutation.d.ts.map +1 -0
- package/dist/core/agents/state/shell-mutation.js +41 -0
- package/dist/core/agents/state/stale-sweep.d.ts +16 -0
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -0
- package/dist/core/agents/state/stale-sweep.js +166 -0
- package/dist/core/config.d.ts +29 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +108 -0
- package/dist/core/hooks/cli.d.ts +21 -0
- package/dist/core/hooks/cli.d.ts.map +1 -0
- package/dist/core/hooks/cli.js +1123 -0
- package/dist/core/hooks/effects/image-capture.d.ts +43 -0
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -0
- package/dist/core/hooks/effects/image-capture.js +288 -0
- package/dist/core/hooks/effects/index.d.ts +64 -0
- package/dist/core/hooks/effects/index.d.ts.map +1 -0
- package/dist/core/hooks/effects/index.js +197 -0
- package/dist/core/hooks/events/emit.d.ts +31 -0
- package/dist/core/hooks/events/emit.d.ts.map +1 -0
- package/dist/core/hooks/events/emit.js +89 -0
- package/dist/core/hooks/events/schema.d.ts +235 -0
- package/dist/core/hooks/events/schema.d.ts.map +1 -0
- package/dist/core/hooks/events/schema.js +12 -0
- package/dist/core/hooks/events/ulid.d.ts +10 -0
- package/dist/core/hooks/events/ulid.d.ts.map +1 -0
- package/dist/core/hooks/events/ulid.js +47 -0
- package/dist/core/hooks/harness/detect.d.ts +9 -0
- package/dist/core/hooks/harness/detect.d.ts.map +1 -0
- package/dist/core/hooks/harness/detect.js +29 -0
- package/dist/core/hooks/harness/events.d.ts +45 -0
- package/dist/core/hooks/harness/events.d.ts.map +1 -0
- package/dist/core/hooks/harness/events.js +71 -0
- package/dist/core/hooks/harness/output.d.ts +46 -0
- package/dist/core/hooks/harness/output.d.ts.map +1 -0
- package/dist/core/hooks/harness/output.js +87 -0
- package/dist/core/hooks/harness/parse.d.ts +67 -0
- package/dist/core/hooks/harness/parse.d.ts.map +1 -0
- package/dist/core/hooks/harness/parse.js +132 -0
- package/dist/core/hooks/index.d.ts +8 -0
- package/dist/core/hooks/index.d.ts.map +1 -0
- package/dist/core/hooks/index.js +7 -0
- package/dist/core/hooks/resolve/anchor.d.ts +37 -0
- package/dist/core/hooks/resolve/anchor.d.ts.map +1 -0
- package/dist/core/hooks/resolve/anchor.js +48 -0
- package/dist/core/hooks/resolve/coord-root.d.ts +6 -0
- package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -0
- package/dist/core/hooks/resolve/coord-root.js +27 -0
- package/dist/core/hooks/resolve/intent.d.ts +33 -0
- package/dist/core/hooks/resolve/intent.d.ts.map +1 -0
- package/dist/core/hooks/resolve/intent.js +79 -0
- package/dist/core/hooks/resolve/owner.d.ts +42 -0
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -0
- package/dist/core/hooks/resolve/owner.js +140 -0
- package/dist/core/hooks/resolve/transcript.d.ts +26 -0
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -0
- package/dist/core/hooks/resolve/transcript.js +73 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/lib/agent-browser/client.d.ts +99 -0
- package/dist/lib/agent-browser/client.d.ts.map +1 -0
- package/dist/lib/agent-browser/client.js +177 -0
- package/dist/lib/agent-browser/index.d.ts +2 -0
- package/dist/lib/agent-browser/index.d.ts.map +1 -0
- package/dist/lib/agent-browser/index.js +1 -0
- package/dist/lib/browser/client.d.ts +193 -0
- package/dist/lib/browser/client.d.ts.map +1 -0
- package/dist/lib/browser/client.js +325 -0
- package/dist/lib/browser/dev-overlay.d.ts +23 -0
- package/dist/lib/browser/dev-overlay.d.ts.map +1 -0
- package/dist/lib/browser/dev-overlay.js +153 -0
- package/dist/lib/browser/index.d.ts +5 -0
- package/dist/lib/browser/index.d.ts.map +1 -0
- package/dist/lib/browser/index.js +2 -0
- package/dist/lib/browser/layout.d.ts +79 -0
- package/dist/lib/browser/layout.d.ts.map +1 -0
- package/dist/lib/browser/layout.js +220 -0
- package/dist/lib/browser/visibility.d.ts +86 -0
- package/dist/lib/browser/visibility.d.ts.map +1 -0
- package/dist/lib/browser/visibility.js +333 -0
- package/dist/lib/browser/visual-diff.d.ts +38 -0
- package/dist/lib/browser/visual-diff.d.ts.map +1 -0
- package/dist/lib/browser/visual-diff.js +107 -0
- package/dist/lib/completion/bash.d.ts +25 -0
- package/dist/lib/completion/bash.d.ts.map +1 -0
- package/dist/lib/completion/bash.js +284 -0
- package/dist/lib/completion/fish.d.ts +16 -0
- package/dist/lib/completion/fish.d.ts.map +1 -0
- package/dist/lib/completion/fish.js +118 -0
- package/dist/lib/completion/index.d.ts +5 -0
- package/dist/lib/completion/index.d.ts.map +1 -0
- package/dist/lib/completion/index.js +4 -0
- package/dist/lib/completion/walk.d.ts +68 -0
- package/dist/lib/completion/walk.d.ts.map +1 -0
- package/dist/lib/completion/walk.js +102 -0
- package/dist/lib/completion/zsh.d.ts +13 -0
- package/dist/lib/completion/zsh.d.ts.map +1 -0
- package/dist/lib/completion/zsh.js +249 -0
- package/dist/lib/context/index.d.ts +107 -0
- package/dist/lib/context/index.d.ts.map +1 -0
- package/dist/lib/context/index.js +275 -0
- package/dist/lib/cookies/client.d.ts +131 -0
- package/dist/lib/cookies/client.d.ts.map +1 -0
- package/dist/lib/cookies/client.js +239 -0
- package/dist/lib/cookies/index.d.ts +2 -0
- package/dist/lib/cookies/index.d.ts.map +1 -0
- package/dist/lib/cookies/index.js +1 -0
- package/dist/lib/council/index.d.ts +266 -0
- package/dist/lib/council/index.d.ts.map +1 -0
- package/dist/lib/council/index.js +674 -0
- package/dist/lib/docs-index.d.ts +28 -0
- package/dist/lib/docs-index.d.ts.map +1 -0
- package/dist/lib/docs-index.js +169 -0
- package/dist/lib/docs-lint.d.ts +26 -0
- package/dist/lib/docs-lint.d.ts.map +1 -0
- package/dist/lib/docs-lint.js +378 -0
- package/dist/lib/docs-sweep.d.ts +34 -0
- package/dist/lib/docs-sweep.d.ts.map +1 -0
- package/dist/lib/docs-sweep.js +304 -0
- package/dist/lib/docs.d.ts +27 -0
- package/dist/lib/docs.d.ts.map +1 -0
- package/dist/lib/docs.js +142 -0
- package/dist/lib/env.d.ts +11 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +12 -0
- package/dist/lib/exec.d.ts +32 -0
- package/dist/lib/exec.d.ts.map +1 -0
- package/dist/lib/exec.js +54 -0
- package/dist/lib/format.d.ts +29 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +139 -0
- package/dist/lib/http/client.d.ts +56 -0
- package/dist/lib/http/client.d.ts.map +1 -0
- package/dist/lib/http/client.js +160 -0
- package/dist/lib/http/index.d.ts +2 -0
- package/dist/lib/http/index.d.ts.map +1 -0
- package/dist/lib/http/index.js +1 -0
- package/dist/lib/identities/index.d.ts +77 -0
- package/dist/lib/identities/index.d.ts.map +1 -0
- package/dist/lib/identities/index.js +190 -0
- package/dist/lib/machine.d.ts +19 -0
- package/dist/lib/machine.d.ts.map +1 -0
- package/dist/lib/machine.js +61 -0
- package/dist/lib/presence.d.ts +48 -0
- package/dist/lib/presence.d.ts.map +1 -0
- package/dist/lib/presence.js +123 -0
- package/dist/lib/readability/client.d.ts +39 -0
- package/dist/lib/readability/client.d.ts.map +1 -0
- package/dist/lib/readability/client.js +121 -0
- package/dist/lib/readability/index.d.ts +2 -0
- package/dist/lib/readability/index.d.ts.map +1 -0
- package/dist/lib/readability/index.js +1 -0
- package/dist/lib/scratch/index.d.ts +74 -0
- package/dist/lib/scratch/index.d.ts.map +1 -0
- package/dist/lib/scratch/index.js +393 -0
- package/dist/lib/tunnel/gate.d.ts +12 -0
- package/dist/lib/tunnel/gate.d.ts.map +1 -0
- package/dist/lib/tunnel/gate.js +101 -0
- package/dist/lib/tunnel/state.d.ts +34 -0
- package/dist/lib/tunnel/state.d.ts.map +1 -0
- package/dist/lib/tunnel/state.js +132 -0
- package/package.json +160 -8
- package/schemas/.gitkeep +0 -0
- package/schemas/config.schema.json +109 -0
- package/src/cli.ts +22 -0
- package/src/commander.ts +242 -0
- package/src/commands/.gitkeep +0 -0
- package/src/commands/agents.ts +4567 -0
- package/src/commands/backup.ts +305 -0
- package/src/commands/browse-ai.ts +198 -0
- package/src/commands/browse.ts +849 -0
- package/src/commands/callers.ts +363 -0
- package/src/commands/completion.ts +193 -0
- package/src/commands/config-get.ts +161 -0
- package/src/commands/context.ts +209 -0
- package/src/commands/cookies.ts +198 -0
- package/src/commands/docs.ts +174 -0
- package/src/commands/doctor.ts +231 -0
- package/src/commands/edit-batch.ts +233 -0
- package/src/commands/eml.ts +519 -0
- package/src/commands/env.ts +254 -0
- package/src/commands/fetch.ts +136 -0
- package/src/commands/file-history.ts +202 -0
- package/src/commands/grep.ts +371 -0
- package/src/commands/init.ts +335 -0
- package/src/commands/outline.ts +583 -0
- package/src/commands/presence.ts +152 -0
- package/src/commands/read.ts +64 -0
- package/src/commands/scratch.ts +445 -0
- package/src/commands/session.ts +187 -0
- package/src/commands/sync.ts +306 -0
- package/src/commands/toc.ts +218 -0
- package/src/commands/tokens.ts +79 -0
- package/src/commands/tunnel.ts +633 -0
- package/src/commands/uninstall.ts +144 -0
- package/src/commands/web.ts +193 -0
- package/src/core/agents/canonical-emit.ts +77 -0
- package/src/core/agents/cli-emit.ts +64 -0
- package/src/core/agents/cli.ts +838 -0
- package/src/core/agents/codex-replay.ts +163 -0
- package/src/core/agents/coord-client.ts +249 -0
- package/src/core/agents/events/consume.ts +196 -0
- package/src/core/agents/events/emit.ts +108 -0
- package/src/core/agents/events/ulid.ts +51 -0
- package/src/core/agents/index.ts +14 -0
- package/src/core/agents/paths.ts +16 -0
- package/src/core/agents/render/prompt-context.ts +401 -0
- package/src/core/agents/render/session-context.ts +341 -0
- package/src/core/agents/rules/claim-conflict.ts +282 -0
- package/src/core/agents/rules/commit-conflict.ts +303 -0
- package/src/core/agents/rules/stop-hook.ts +229 -0
- package/src/core/agents/session-events.ts +228 -0
- package/src/core/agents/state/activity-log.ts +33 -0
- package/src/core/agents/state/council.ts +265 -0
- package/src/core/agents/state/heartbeat-projector.ts +488 -0
- package/src/core/agents/state/heartbeat-writer.ts +333 -0
- package/src/core/agents/state/names.ts +399 -0
- package/src/core/agents/state/pidmap.ts +38 -0
- package/src/core/agents/state/scratch.ts +121 -0
- package/src/core/agents/state/shell-mutation.ts +44 -0
- package/src/core/agents/state/stale-sweep.ts +190 -0
- package/src/core/config.ts +111 -0
- package/src/core/hooks/cli.ts +1247 -0
- package/src/core/hooks/effects/image-capture.ts +330 -0
- package/src/core/hooks/effects/index.ts +210 -0
- package/src/core/hooks/events/emit.ts +120 -0
- package/src/core/hooks/events/schema.ts +430 -0
- package/src/core/hooks/events/ulid.ts +51 -0
- package/src/core/hooks/harness/detect.ts +30 -0
- package/src/core/hooks/harness/events.ts +102 -0
- package/src/core/hooks/harness/output.ts +100 -0
- package/src/core/hooks/harness/parse.ts +180 -0
- package/src/core/hooks/index.ts +16 -0
- package/src/core/hooks/resolve/anchor.ts +51 -0
- package/src/core/hooks/resolve/coord-root.ts +25 -0
- package/src/core/hooks/resolve/intent.ts +89 -0
- package/src/core/hooks/resolve/owner.ts +140 -0
- package/src/core/hooks/resolve/transcript.ts +72 -0
- package/src/hooks/.gitkeep +0 -0
- package/src/index.ts +15 -0
- package/src/lib/agent-browser/client.ts +239 -0
- package/src/lib/agent-browser/index.ts +1 -0
- package/src/lib/browser/client.ts +449 -0
- package/src/lib/browser/dev-overlay.ts +207 -0
- package/src/lib/browser/index.ts +24 -0
- package/src/lib/browser/layout.ts +288 -0
- package/src/lib/browser/visibility.ts +419 -0
- package/src/lib/browser/visual-diff.ts +150 -0
- package/src/lib/completion/bash.ts +291 -0
- package/src/lib/completion/fish.ts +134 -0
- package/src/lib/completion/index.ts +10 -0
- package/src/lib/completion/walk.ts +184 -0
- package/src/lib/completion/zsh.ts +262 -0
- package/src/lib/context/index.ts +386 -0
- package/src/lib/cookies/client.ts +301 -0
- package/src/lib/cookies/index.ts +13 -0
- package/src/lib/council/index.ts +803 -0
- package/src/lib/docs-index.ts +216 -0
- package/src/lib/docs-lint.ts +413 -0
- package/src/lib/docs-sweep.ts +348 -0
- package/src/lib/docs.ts +199 -0
- package/src/lib/env.ts +12 -0
- package/src/lib/exec.ts +74 -0
- package/src/lib/format.ts +147 -0
- package/src/lib/http/client.ts +211 -0
- package/src/lib/http/index.ts +1 -0
- package/src/lib/identities/index.ts +210 -0
- package/src/lib/machine.ts +61 -0
- package/src/lib/presence.ts +154 -0
- package/src/lib/readability/client.ts +169 -0
- package/src/lib/readability/index.ts +5 -0
- package/src/lib/readability/turndown-plugin-gfm.d.ts +10 -0
- package/src/lib/scratch/index.ts +470 -0
- package/src/lib/tunnel/gate.ts +113 -0
- package/src/lib/tunnel/state.ts +167 -0
- package/src/web/.gitkeep +0 -0
- package/index.js +0 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `harn doctor`: runtime + dependency check.
|
|
3
|
+
*
|
|
4
|
+
* Walks through every dependency harnery touches and reports presence,
|
|
5
|
+
* version, and OS-specific install hints. Returns a checklist:
|
|
6
|
+
*
|
|
7
|
+
* ✓ ok: dep is present and recent enough
|
|
8
|
+
* ⚠ warn: optional dep missing (feature degrades)
|
|
9
|
+
* ✗ fail: required dep missing (commands will throw)
|
|
10
|
+
*
|
|
11
|
+
* Exits 0 unless a required dep is missing.
|
|
12
|
+
*/
|
|
13
|
+
import { spawnSync } from "node:child_process";
|
|
14
|
+
import { existsSync } from "node:fs";
|
|
15
|
+
import os from "node:os";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
export function registerDoctorCommand(program, emit) {
|
|
18
|
+
program
|
|
19
|
+
.command("doctor")
|
|
20
|
+
.description("Verify the runtime + optional deps harnery commands expect. Exits 0 " +
|
|
21
|
+
"unless a required dep (Node, git) is missing.")
|
|
22
|
+
.option("--json", "Machine-readable JSON output")
|
|
23
|
+
.action((opts) => {
|
|
24
|
+
const checks = runChecks();
|
|
25
|
+
const requiredFailed = checks.some((c) => c.severity === "fail");
|
|
26
|
+
if (opts.json) {
|
|
27
|
+
emit.data({
|
|
28
|
+
checks,
|
|
29
|
+
summary: {
|
|
30
|
+
total: checks.length,
|
|
31
|
+
ok: checks.filter((c) => c.severity === "ok").length,
|
|
32
|
+
warn: checks.filter((c) => c.severity === "warn").length,
|
|
33
|
+
fail: checks.filter((c) => c.severity === "fail").length,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
emit.setExitCode(requiredFailed ? 1 : 0);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const symbols = { ok: "✓", warn: "⚠", fail: "✗" };
|
|
40
|
+
const widest = Math.max(...checks.map((c) => c.name.length));
|
|
41
|
+
const lines = [];
|
|
42
|
+
for (const c of checks) {
|
|
43
|
+
lines.push(`${symbols[c.severity]} ${c.name.padEnd(widest)} ${c.detail}`);
|
|
44
|
+
if (c.hint)
|
|
45
|
+
lines.push(` ↳ ${c.hint}`);
|
|
46
|
+
}
|
|
47
|
+
const summary = `\n${checks.filter((c) => c.severity === "ok").length} ok, ${checks.filter((c) => c.severity === "warn").length} warn, ${checks.filter((c) => c.severity === "fail").length} fail`;
|
|
48
|
+
emit.text(`${lines.join("\n")}${summary}`);
|
|
49
|
+
emit.setExitCode(requiredFailed ? 1 : 0);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
export function runChecks() {
|
|
53
|
+
return [
|
|
54
|
+
checkNode(),
|
|
55
|
+
checkGit(),
|
|
56
|
+
checkBun(),
|
|
57
|
+
checkHarneryDir(),
|
|
58
|
+
checkRestic(),
|
|
59
|
+
checkRclone(),
|
|
60
|
+
checkPlaywright(),
|
|
61
|
+
checkPython(),
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
function whichVersion(bin, args = ["--version"]) {
|
|
65
|
+
const r = spawnSync(bin, args, { encoding: "utf-8" });
|
|
66
|
+
if (r.status !== 0)
|
|
67
|
+
return { ok: false, out: "" };
|
|
68
|
+
const out = (r.stdout || r.stderr).trim().split("\n")[0];
|
|
69
|
+
return { ok: true, out };
|
|
70
|
+
}
|
|
71
|
+
function checkNode() {
|
|
72
|
+
const v = process.versions.node;
|
|
73
|
+
const major = Number.parseInt(v.split(".")[0], 10);
|
|
74
|
+
if (Number.isNaN(major) || major < 20) {
|
|
75
|
+
return {
|
|
76
|
+
name: "node",
|
|
77
|
+
severity: "fail",
|
|
78
|
+
detail: `${v} (need ≥ 20)`,
|
|
79
|
+
hint: "https://nodejs.org/en/download",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return { name: "node", severity: "ok", detail: v };
|
|
83
|
+
}
|
|
84
|
+
function checkGit() {
|
|
85
|
+
const r = whichVersion("git");
|
|
86
|
+
if (!r.ok) {
|
|
87
|
+
return {
|
|
88
|
+
name: "git",
|
|
89
|
+
severity: "fail",
|
|
90
|
+
detail: "missing",
|
|
91
|
+
hint: macOrLinux("brew install git", "apt-get install -y git"),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return { name: "git", severity: "ok", detail: r.out.replace(/^git version\s*/, "") };
|
|
95
|
+
}
|
|
96
|
+
function checkBun() {
|
|
97
|
+
const r = whichVersion("bun");
|
|
98
|
+
if (!r.ok) {
|
|
99
|
+
return {
|
|
100
|
+
name: "bun",
|
|
101
|
+
severity: "warn",
|
|
102
|
+
detail: "missing (Node-only mode: fine, just slower than bun-native)",
|
|
103
|
+
hint: "curl -fsSL https://bun.sh/install | bash",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return { name: "bun", severity: "ok", detail: r.out };
|
|
107
|
+
}
|
|
108
|
+
function checkRestic() {
|
|
109
|
+
const r = whichVersion("restic", ["version"]);
|
|
110
|
+
if (!r.ok) {
|
|
111
|
+
return {
|
|
112
|
+
name: "restic",
|
|
113
|
+
severity: "warn",
|
|
114
|
+
detail: "missing (needed for `harn backup`)",
|
|
115
|
+
hint: macOrLinux("brew install restic", "apt-get install -y restic"),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return { name: "restic", severity: "ok", detail: r.out };
|
|
119
|
+
}
|
|
120
|
+
function checkRclone() {
|
|
121
|
+
const r = whichVersion("rclone", ["version"]);
|
|
122
|
+
if (!r.ok) {
|
|
123
|
+
return {
|
|
124
|
+
name: "rclone",
|
|
125
|
+
severity: "warn",
|
|
126
|
+
detail: "missing (needed for `harn sync`)",
|
|
127
|
+
hint: "curl https://rclone.org/install.sh | sudo bash",
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// first line is "rclone v1.XX.X"
|
|
131
|
+
return { name: "rclone", severity: "ok", detail: r.out };
|
|
132
|
+
}
|
|
133
|
+
function checkPlaywright() {
|
|
134
|
+
// Check if playwright is importable + chromium installed.
|
|
135
|
+
try {
|
|
136
|
+
const moduleId = "playwright";
|
|
137
|
+
require.resolve(moduleId);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return {
|
|
141
|
+
name: "playwright",
|
|
142
|
+
severity: "warn",
|
|
143
|
+
detail: "module missing (needed for `harn browse`)",
|
|
144
|
+
hint: "npm install -g playwright && npx playwright install chromium",
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// Check chromium browser binary exists.
|
|
148
|
+
const home = os.homedir();
|
|
149
|
+
const candidates = [
|
|
150
|
+
path.join(home, ".cache", "ms-playwright"),
|
|
151
|
+
path.join(home, "Library", "Caches", "ms-playwright"),
|
|
152
|
+
];
|
|
153
|
+
const found = candidates.find(existsSync);
|
|
154
|
+
if (!found) {
|
|
155
|
+
return {
|
|
156
|
+
name: "playwright",
|
|
157
|
+
severity: "warn",
|
|
158
|
+
detail: "module ok but no browsers installed",
|
|
159
|
+
hint: "npx playwright install chromium",
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return { name: "playwright", severity: "ok", detail: `module + browsers at ${found}` };
|
|
163
|
+
}
|
|
164
|
+
function checkPython() {
|
|
165
|
+
const r = whichVersion("python3");
|
|
166
|
+
if (!r.ok) {
|
|
167
|
+
return {
|
|
168
|
+
name: "python3",
|
|
169
|
+
severity: "warn",
|
|
170
|
+
detail: "missing (optional; some examples use python)",
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
return { name: "python3", severity: "ok", detail: r.out };
|
|
174
|
+
}
|
|
175
|
+
function checkHarneryDir() {
|
|
176
|
+
// Walk up from cwd looking for .harnery/.
|
|
177
|
+
let dir = process.cwd();
|
|
178
|
+
for (let i = 0; i < 8; i++) {
|
|
179
|
+
if (existsSync(path.join(dir, ".harnery"))) {
|
|
180
|
+
return {
|
|
181
|
+
name: ".harnery/",
|
|
182
|
+
severity: "ok",
|
|
183
|
+
detail: path.join(dir, ".harnery"),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
const parent = path.dirname(dir);
|
|
187
|
+
if (parent === dir)
|
|
188
|
+
break;
|
|
189
|
+
dir = parent;
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
name: ".harnery/",
|
|
193
|
+
severity: "warn",
|
|
194
|
+
detail: "no .harnery/ found above cwd",
|
|
195
|
+
hint: "create one with `mkdir -p .harnery/active` from your monorepo root",
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function macOrLinux(mac, linux) {
|
|
199
|
+
return os.platform() === "darwin" ? mac : linux;
|
|
200
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { EmitContext } from "../commander.js";
|
|
3
|
+
/**
|
|
4
|
+
* `harn edit-batch`: coordinated find/replace across N files in one call.
|
|
5
|
+
*
|
|
6
|
+
* Solves the recurring "rename oldName → newName everywhere" pattern that
|
|
7
|
+
* otherwise costs N sequential Edit tool calls. Literal-string by default;
|
|
8
|
+
* --regex flag treats the find string as a JS regex. --all flag replaces
|
|
9
|
+
* every occurrence per file (default: first match only, matching the Edit
|
|
10
|
+
* tool's default).
|
|
11
|
+
*
|
|
12
|
+
* Atomic per-file: writes to <path>.batch.tmp.<pid> then renames. If any
|
|
13
|
+
* file errors mid-batch, already-written files stay written: it's
|
|
14
|
+
* idempotent at the per-file level, not transactional across the set.
|
|
15
|
+
* Use --dry-run to preview before committing.
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerEditBatchCommand(program: Command, emit: EmitContext): void;
|
|
18
|
+
//# sourceMappingURL=edit-batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-batch.d.ts","sourceRoot":"","sources":["../../src/commands/edit-batch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAkClF"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { existsSync, readFileSync, renameSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* `harn edit-batch`: coordinated find/replace across N files in one call.
|
|
5
|
+
*
|
|
6
|
+
* Solves the recurring "rename oldName → newName everywhere" pattern that
|
|
7
|
+
* otherwise costs N sequential Edit tool calls. Literal-string by default;
|
|
8
|
+
* --regex flag treats the find string as a JS regex. --all flag replaces
|
|
9
|
+
* every occurrence per file (default: first match only, matching the Edit
|
|
10
|
+
* tool's default).
|
|
11
|
+
*
|
|
12
|
+
* Atomic per-file: writes to <path>.batch.tmp.<pid> then renames. If any
|
|
13
|
+
* file errors mid-batch, already-written files stay written: it's
|
|
14
|
+
* idempotent at the per-file level, not transactional across the set.
|
|
15
|
+
* Use --dry-run to preview before committing.
|
|
16
|
+
*/
|
|
17
|
+
export function registerEditBatchCommand(program, emit) {
|
|
18
|
+
program
|
|
19
|
+
.command("edit-batch <old> <new> <files...>")
|
|
20
|
+
.description("Coordinated find/replace across N files (literal by default; --regex for pattern). " +
|
|
21
|
+
"Atomic per-file. Use --dry-run to preview.")
|
|
22
|
+
.option("--all", "Replace every occurrence in each file (default: first match only)")
|
|
23
|
+
.option("--regex", "Treat <old> as a JS regex (and <new> as the replacement template)")
|
|
24
|
+
.option("--regex-flags <flags>", "Regex flags (e.g. 'i' for case-insensitive). Implies --regex.", "")
|
|
25
|
+
.option("--dry-run", "Show what would change without writing")
|
|
26
|
+
.option("--require-match", "Fail (exit 1) if any file has zero matches")
|
|
27
|
+
.option("--json", "Structured JSON envelope")
|
|
28
|
+
.action(async (oldStr, newStr, files, opts) => {
|
|
29
|
+
try {
|
|
30
|
+
const result = await runEditBatch(oldStr, newStr, files, opts);
|
|
31
|
+
if (opts.json) {
|
|
32
|
+
emit.config({ format: "json" });
|
|
33
|
+
emit.data(result);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
emit.text(`${renderResult(result)}\n`);
|
|
37
|
+
if (opts.requireMatch && result.zero_match_files.length > 0) {
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
emit.error({ code: "edit_batch_failed", message: err.message });
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async function runEditBatch(oldStr, newStr, files, opts) {
|
|
48
|
+
if (files.length === 0) {
|
|
49
|
+
throw new Error("at least one file path required");
|
|
50
|
+
}
|
|
51
|
+
if (oldStr.length === 0) {
|
|
52
|
+
throw new Error("<old> string is empty");
|
|
53
|
+
}
|
|
54
|
+
const useRegex = !!opts.regex || (opts.regexFlags ?? "").length > 0;
|
|
55
|
+
let pattern;
|
|
56
|
+
if (useRegex) {
|
|
57
|
+
let flags = opts.regexFlags ?? "";
|
|
58
|
+
if (opts.all && !flags.includes("g"))
|
|
59
|
+
flags += "g";
|
|
60
|
+
try {
|
|
61
|
+
pattern = new RegExp(oldStr, flags);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
throw new Error(`invalid regex: ${err.message}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Literal-string mode: escape regex specials so the user can pass anything.
|
|
69
|
+
const escaped = oldStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
70
|
+
pattern = new RegExp(escaped, opts.all ? "g" : "");
|
|
71
|
+
}
|
|
72
|
+
const fileResults = [];
|
|
73
|
+
for (const filePath of files) {
|
|
74
|
+
const abs = resolve(filePath);
|
|
75
|
+
const r = {
|
|
76
|
+
path: filePath,
|
|
77
|
+
matched: 0,
|
|
78
|
+
replaced: 0,
|
|
79
|
+
bytes_before: 0,
|
|
80
|
+
bytes_after: 0,
|
|
81
|
+
written: false,
|
|
82
|
+
error: null,
|
|
83
|
+
};
|
|
84
|
+
try {
|
|
85
|
+
if (!existsSync(abs)) {
|
|
86
|
+
r.error = "file not found";
|
|
87
|
+
fileResults.push(r);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const before = readFileSync(abs, "utf8");
|
|
91
|
+
r.bytes_before = Buffer.byteLength(before, "utf8");
|
|
92
|
+
// Count matches independently of replace (handles both modes).
|
|
93
|
+
const countPattern = new RegExp(pattern.source, pattern.flags.includes("g") ? pattern.flags : `${pattern.flags}g`);
|
|
94
|
+
r.matched = (before.match(countPattern) || []).length;
|
|
95
|
+
if (r.matched === 0) {
|
|
96
|
+
fileResults.push(r);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const after = before.replace(pattern, newStr);
|
|
100
|
+
// The `g` flag (explicit --all OR passed via --regex-flags) is what actually
|
|
101
|
+
// controls replace-all behavior. Count what String.replace actually did,
|
|
102
|
+
// not what --all said.
|
|
103
|
+
const replacedAll = pattern.flags.includes("g");
|
|
104
|
+
r.replaced = replacedAll ? r.matched : Math.min(1, r.matched);
|
|
105
|
+
r.bytes_after = Buffer.byteLength(after, "utf8");
|
|
106
|
+
if (!opts.dryRun) {
|
|
107
|
+
const tmp = `${abs}.batch.tmp.${process.pid}`;
|
|
108
|
+
writeFileSync(tmp, after, "utf8");
|
|
109
|
+
const mode = statSync(abs).mode;
|
|
110
|
+
renameSync(tmp, abs);
|
|
111
|
+
// mode preservation: chmod after rename if needed.
|
|
112
|
+
// (omitted: writeFileSync defaults are fine; rename keeps inode anyway when same filesystem)
|
|
113
|
+
void mode;
|
|
114
|
+
r.written = true;
|
|
115
|
+
}
|
|
116
|
+
fileResults.push(r);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
r.error = err.message;
|
|
120
|
+
fileResults.push(r);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const totalMatches = fileResults.reduce((acc, f) => acc + f.matched, 0);
|
|
124
|
+
const totalReplacements = fileResults.reduce((acc, f) => acc + f.replaced, 0);
|
|
125
|
+
const filesModified = fileResults.filter((f) => f.written).length;
|
|
126
|
+
const zeroMatch = fileResults.filter((f) => f.matched === 0 && !f.error).map((f) => f.path);
|
|
127
|
+
return {
|
|
128
|
+
old: oldStr,
|
|
129
|
+
new: newStr,
|
|
130
|
+
mode: useRegex ? "regex" : "literal",
|
|
131
|
+
all: !!opts.all,
|
|
132
|
+
dry_run: !!opts.dryRun,
|
|
133
|
+
files: fileResults,
|
|
134
|
+
total_matches: totalMatches,
|
|
135
|
+
total_replacements: totalReplacements,
|
|
136
|
+
files_modified: filesModified,
|
|
137
|
+
zero_match_files: zeroMatch,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function renderResult(r) {
|
|
141
|
+
const lines = [];
|
|
142
|
+
const verb = r.dry_run ? "would replace" : "replaced";
|
|
143
|
+
lines.push(`edit-batch · ${r.mode} · ${r.all ? "all" : "first"}-match · ${r.files.length} file(s)`);
|
|
144
|
+
lines.push(` '${truncate(r.old, 60)}' → '${truncate(r.new, 60)}'`);
|
|
145
|
+
lines.push("");
|
|
146
|
+
for (const f of r.files) {
|
|
147
|
+
if (f.error) {
|
|
148
|
+
lines.push(` ✗ ${f.path} (error: ${f.error})`);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (f.matched === 0) {
|
|
152
|
+
lines.push(` · ${f.path} (no match)`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const tag = r.dry_run ? "?" : f.written ? "✓" : "·";
|
|
156
|
+
const delta = f.bytes_after - f.bytes_before;
|
|
157
|
+
const deltaStr = delta === 0 ? "0 bytes" : delta > 0 ? `+${delta} bytes` : `${delta} bytes`;
|
|
158
|
+
lines.push(` ${tag} ${f.path} (${f.matched} match${f.matched === 1 ? "" : "es"}, ${verb} ${f.replaced}, ${deltaStr})`);
|
|
159
|
+
}
|
|
160
|
+
lines.push("");
|
|
161
|
+
lines.push(`total: ${r.total_matches} match(es) across ${r.files.length} file(s); ` +
|
|
162
|
+
`${verb} ${r.total_replacements} in ${r.files_modified || (r.dry_run ? r.files.filter((f) => f.matched > 0).length : 0)} file(s)`);
|
|
163
|
+
if (r.zero_match_files.length > 0) {
|
|
164
|
+
lines.push(`zero-match files: ${r.zero_match_files.length} (use --require-match to fail when this happens)`);
|
|
165
|
+
}
|
|
166
|
+
return lines.join("\n");
|
|
167
|
+
}
|
|
168
|
+
function truncate(s, n) {
|
|
169
|
+
if (s.length <= n)
|
|
170
|
+
return s;
|
|
171
|
+
return `${s.slice(0, n - 1)}…`;
|
|
172
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eml.d.ts","sourceRoot":"","sources":["../../src/commands/eml.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAmBnD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAkB5E"}
|