@pencil-agent/nano-pencil 2.0.0-beta.9 → 2.0.0
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/README.md +267 -267
- package/dist/build-meta.json +3 -3
- package/dist/core/export-html/AGENT.md +11 -11
- package/dist/core/export-html/template.css +971 -971
- package/dist/core/export-html/template.html +54 -54
- package/dist/core/extensions-host/index.d.ts +1 -1
- package/dist/core/extensions-host/types.d.ts +5 -8
- package/dist/extensions/builtin/AGENT.md +115 -115
- package/dist/extensions/builtin/browser/AGENT.md +17 -17
- package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
- package/dist/extensions/builtin/browser/browser.md +73 -73
- package/dist/extensions/builtin/browser/install.md +142 -142
- package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
- package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
- package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
- package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
- package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
- package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
- package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
- package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
- package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
- package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
- package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
- package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
- package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
- package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
- package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
- package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
- package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
- package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
- package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
- package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
- package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
- package/dist/extensions/builtin/goal/README.md +67 -67
- package/dist/extensions/builtin/goal/goal-controller.js +1 -1
- package/dist/extensions/builtin/goal/goal-prompts.js +4 -4
- package/dist/extensions/builtin/grub/README.md +112 -112
- package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
- package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
- package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
- package/dist/extensions/builtin/link-world/linkworld.md +313 -313
- package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -67
- package/dist/extensions/builtin/loop/README.md +92 -92
- package/dist/extensions/builtin/mcp/figma-design.md +68 -68
- package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
- package/dist/extensions/builtin/recap/AGENT.md +15 -15
- package/dist/extensions/builtin/sal/README.md +72 -72
- package/dist/extensions/builtin/security-audit/README.md +289 -289
- package/dist/extensions/builtin/team/AGENT.md +112 -112
- package/dist/extensions/builtin/team/TESTING.md +299 -299
- package/dist/extensions/builtin/token-save/README.md +56 -56
- package/dist/extensions/optional/AGENT.md +10 -10
- package/dist/index.d.ts +5 -30
- package/dist/index.js +1 -1
- package/dist/models.d.ts +7 -0
- package/dist/models.js +1 -0
- package/dist/modes/interactive/theme/dark.json +85 -85
- package/dist/modes/interactive/theme/light.json +84 -84
- package/dist/modes/interactive/theme/theme-schema.json +335 -335
- package/dist/modes/interactive/theme/warm.json +81 -81
- package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
- package/dist/packages/protocol/src/flags.d.ts +20 -0
- package/dist/packages/protocol/src/flags.js +0 -0
- package/dist/packages/protocol/src/hooks.d.ts +17 -0
- package/dist/packages/protocol/src/hooks.js +0 -0
- package/dist/packages/protocol/src/index.d.ts +4 -2
- package/dist/packages/protocol/src/index.js +1 -1
- package/dist/packages/protocol/src/lifecycle.d.ts +11 -21
- package/dist/public-config.d.ts +12 -0
- package/dist/public-config.js +1 -0
- package/dist/runtime.d.ts +9 -0
- package/dist/runtime.js +1 -0
- package/dist/session-compaction.d.ts +7 -0
- package/dist/session-compaction.js +1 -0
- package/dist/session.d.ts +7 -0
- package/dist/session.js +1 -0
- package/dist/skills.d.ts +7 -0
- package/dist/skills.js +1 -0
- package/dist/tools.d.ts +7 -0
- package/dist/tools.js +1 -0
- package/docs/ACP/345/215/217/350/256/256/351/233/206/346/210/220/345/274/200/345/217/221/346/226/207/346/241/243.md +851 -0
- package/docs/SDK-TESTING.md +364 -0
- package/docs/codex-goal-command-impl.md +1055 -1055
- package/docs/codex-goal-vs-grub.md +500 -500
- package/docs/custom-provider.md +27 -27
- package/docs/extensions.md +27 -27
- package/docs/keybindings.md +27 -27
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
- package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
- package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/256/236/347/216/260/346/212/245/345/221/212.md" +158 -158
- package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/257/271/346/257/224/345/210/206/346/236/220.md" +128 -128
- package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
- package/docs/loop-usage-examples.md +214 -214
- package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
- package/docs/models.md +27 -27
- package/docs/packages.md +27 -27
- package/docs/pi-design-philosophy.md +457 -457
- package/docs/planmode.md +1987 -1987
- package/docs/prompt-templates.md +27 -27
- package/docs/providers.md +27 -27
- package/docs/sdk.md +27 -27
- package/docs/skills.md +27 -27
- package/docs/startup-performance-optimization.md +301 -0
- package/docs/themes.md +27 -27
- package/docs/tui.md +27 -27
- package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
- package/package.json +190 -162
- package/docs/cc-agent-design.md +0 -1297
- package/docs/cc-tui-design.md +0 -1333
- package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +0 -170
- package/docs/scan-report.md +0 -3820
- package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
- package/docs//351/230/277/351/207/214/345/267/264/345/267/264/350/264/242/346/212/245/345/210/206/346/236/220/344/271/246.md +0 -261
|
@@ -1,103 +1,103 @@
|
|
|
1
|
-
"""Browser Harness CLI-compatible runner used by NanoPencil subprocess tools.
|
|
2
|
-
|
|
3
|
-
[WHO]: Provides main() command dispatch, daemon auto-start, setup/doctor/update/reload flags, and snippet execution
|
|
4
|
-
[FROM]: Depends on browser_harness.admin, browser_harness.helpers, urllib, os, and sys
|
|
5
|
-
[TO]: Consumed by NanoPencil browser/browser_admin tools via python -m browser_harness.run
|
|
6
|
-
[HERE]: extensions/builtin/browser/src/browser_harness/run.py within vendored Browser Harness package
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import os, sys, urllib.request
|
|
10
|
-
|
|
11
|
-
# Windows default stdout encoding is cp1252, which can't encode the 🟢 marker
|
|
12
|
-
# helpers prepend to tab titles (or anything else outside Latin-1). Force UTF-8
|
|
13
|
-
# so `print(page_info())` doesn't UnicodeEncodeError on Windows. Issue #124(4).
|
|
14
|
-
if hasattr(sys.stdout, "reconfigure"):
|
|
15
|
-
try: sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
|
16
|
-
except Exception: pass
|
|
17
|
-
|
|
18
|
-
from .admin import (
|
|
19
|
-
_version,
|
|
20
|
-
NAME,
|
|
21
|
-
daemon_alive,
|
|
22
|
-
ensure_daemon,
|
|
23
|
-
list_cloud_profiles,
|
|
24
|
-
list_local_profiles,
|
|
25
|
-
print_update_banner,
|
|
26
|
-
restart_daemon,
|
|
27
|
-
run_doctor,
|
|
28
|
-
run_setup,
|
|
29
|
-
run_update,
|
|
30
|
-
start_remote_daemon,
|
|
31
|
-
stop_remote_daemon,
|
|
32
|
-
sync_local_profile,
|
|
33
|
-
)
|
|
34
|
-
from .helpers import *
|
|
35
|
-
|
|
36
|
-
HELP = """Browser Harness
|
|
37
|
-
|
|
38
|
-
Read SKILL.md for the default workflow and examples.
|
|
39
|
-
|
|
40
|
-
Typical usage:
|
|
41
|
-
browser-harness -c '
|
|
42
|
-
ensure_real_tab()
|
|
43
|
-
print(page_info())
|
|
44
|
-
'
|
|
45
|
-
|
|
46
|
-
Helpers are pre-imported. The daemon auto-starts and connects to the running browser.
|
|
47
|
-
|
|
48
|
-
Commands:
|
|
49
|
-
browser-harness --version print the installed version
|
|
50
|
-
browser-harness --doctor diagnose install, daemon, and browser state
|
|
51
|
-
browser-harness --setup interactively attach to your running browser
|
|
52
|
-
browser-harness --update [-y] pull the latest version (agents: pass -y)
|
|
53
|
-
browser-harness --reload stop the daemon so next call picks up code changes
|
|
54
|
-
"""
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
# Probe /json/version (not a bare TCP connect) so a non-Chrome process bound to
|
|
58
|
-
# 9222/9223 doesn't masquerade as Chrome and skip the cloud bootstrap. Mirrors
|
|
59
|
-
# daemon.py's fallback probe.
|
|
60
|
-
def _local_chrome_listening():
|
|
61
|
-
for port in (9222, 9223):
|
|
62
|
-
try:
|
|
63
|
-
urllib.request.urlopen(f"http://127.0.0.1:{port}/json/version", timeout=0.3).close()
|
|
64
|
-
return True
|
|
65
|
-
except OSError: pass
|
|
66
|
-
return False
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def main():
|
|
70
|
-
args = sys.argv[1:]
|
|
71
|
-
if args and args[0] in {"-h", "--help"}:
|
|
72
|
-
print(HELP)
|
|
73
|
-
return
|
|
74
|
-
if args and args[0] == "--version":
|
|
75
|
-
print(_version() or "unknown")
|
|
76
|
-
return
|
|
77
|
-
if args and args[0] == "--doctor":
|
|
78
|
-
sys.exit(run_doctor())
|
|
79
|
-
if args and args[0] == "--setup":
|
|
80
|
-
sys.exit(run_setup())
|
|
81
|
-
if args and args[0] == "--update":
|
|
82
|
-
yes = any(a in {"-y", "--yes"} for a in args[1:])
|
|
83
|
-
sys.exit(run_update(yes=yes))
|
|
84
|
-
if args and args[0] == "--reload":
|
|
85
|
-
restart_daemon()
|
|
86
|
-
print("daemon stopped — will restart fresh on next call")
|
|
87
|
-
return
|
|
88
|
-
if args and args[0] == "--debug-clicks":
|
|
89
|
-
os.environ["BH_DEBUG_CLICKS"] = "1"
|
|
90
|
-
args = args[1:]
|
|
91
|
-
if not args or args[0] != "-c":
|
|
92
|
-
sys.exit("Usage: browser-harness -c \"print(page_info())\"")
|
|
93
|
-
if len(args) < 2:
|
|
94
|
-
sys.exit("Usage: browser-harness -c \"print(page_info())\"")
|
|
95
|
-
print_update_banner()
|
|
96
|
-
if not daemon_alive() and not _local_chrome_listening() and os.environ.get("BROWSER_USE_API_KEY"):
|
|
97
|
-
start_remote_daemon(NAME)
|
|
98
|
-
ensure_daemon()
|
|
99
|
-
exec(args[1], globals())
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if __name__ == "__main__":
|
|
103
|
-
main()
|
|
1
|
+
"""Browser Harness CLI-compatible runner used by NanoPencil subprocess tools.
|
|
2
|
+
|
|
3
|
+
[WHO]: Provides main() command dispatch, daemon auto-start, setup/doctor/update/reload flags, and snippet execution
|
|
4
|
+
[FROM]: Depends on browser_harness.admin, browser_harness.helpers, urllib, os, and sys
|
|
5
|
+
[TO]: Consumed by NanoPencil browser/browser_admin tools via python -m browser_harness.run
|
|
6
|
+
[HERE]: extensions/builtin/browser/src/browser_harness/run.py within vendored Browser Harness package
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import os, sys, urllib.request
|
|
10
|
+
|
|
11
|
+
# Windows default stdout encoding is cp1252, which can't encode the 🟢 marker
|
|
12
|
+
# helpers prepend to tab titles (or anything else outside Latin-1). Force UTF-8
|
|
13
|
+
# so `print(page_info())` doesn't UnicodeEncodeError on Windows. Issue #124(4).
|
|
14
|
+
if hasattr(sys.stdout, "reconfigure"):
|
|
15
|
+
try: sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
|
16
|
+
except Exception: pass
|
|
17
|
+
|
|
18
|
+
from .admin import (
|
|
19
|
+
_version,
|
|
20
|
+
NAME,
|
|
21
|
+
daemon_alive,
|
|
22
|
+
ensure_daemon,
|
|
23
|
+
list_cloud_profiles,
|
|
24
|
+
list_local_profiles,
|
|
25
|
+
print_update_banner,
|
|
26
|
+
restart_daemon,
|
|
27
|
+
run_doctor,
|
|
28
|
+
run_setup,
|
|
29
|
+
run_update,
|
|
30
|
+
start_remote_daemon,
|
|
31
|
+
stop_remote_daemon,
|
|
32
|
+
sync_local_profile,
|
|
33
|
+
)
|
|
34
|
+
from .helpers import *
|
|
35
|
+
|
|
36
|
+
HELP = """Browser Harness
|
|
37
|
+
|
|
38
|
+
Read SKILL.md for the default workflow and examples.
|
|
39
|
+
|
|
40
|
+
Typical usage:
|
|
41
|
+
browser-harness -c '
|
|
42
|
+
ensure_real_tab()
|
|
43
|
+
print(page_info())
|
|
44
|
+
'
|
|
45
|
+
|
|
46
|
+
Helpers are pre-imported. The daemon auto-starts and connects to the running browser.
|
|
47
|
+
|
|
48
|
+
Commands:
|
|
49
|
+
browser-harness --version print the installed version
|
|
50
|
+
browser-harness --doctor diagnose install, daemon, and browser state
|
|
51
|
+
browser-harness --setup interactively attach to your running browser
|
|
52
|
+
browser-harness --update [-y] pull the latest version (agents: pass -y)
|
|
53
|
+
browser-harness --reload stop the daemon so next call picks up code changes
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# Probe /json/version (not a bare TCP connect) so a non-Chrome process bound to
|
|
58
|
+
# 9222/9223 doesn't masquerade as Chrome and skip the cloud bootstrap. Mirrors
|
|
59
|
+
# daemon.py's fallback probe.
|
|
60
|
+
def _local_chrome_listening():
|
|
61
|
+
for port in (9222, 9223):
|
|
62
|
+
try:
|
|
63
|
+
urllib.request.urlopen(f"http://127.0.0.1:{port}/json/version", timeout=0.3).close()
|
|
64
|
+
return True
|
|
65
|
+
except OSError: pass
|
|
66
|
+
return False
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def main():
|
|
70
|
+
args = sys.argv[1:]
|
|
71
|
+
if args and args[0] in {"-h", "--help"}:
|
|
72
|
+
print(HELP)
|
|
73
|
+
return
|
|
74
|
+
if args and args[0] == "--version":
|
|
75
|
+
print(_version() or "unknown")
|
|
76
|
+
return
|
|
77
|
+
if args and args[0] == "--doctor":
|
|
78
|
+
sys.exit(run_doctor())
|
|
79
|
+
if args and args[0] == "--setup":
|
|
80
|
+
sys.exit(run_setup())
|
|
81
|
+
if args and args[0] == "--update":
|
|
82
|
+
yes = any(a in {"-y", "--yes"} for a in args[1:])
|
|
83
|
+
sys.exit(run_update(yes=yes))
|
|
84
|
+
if args and args[0] == "--reload":
|
|
85
|
+
restart_daemon()
|
|
86
|
+
print("daemon stopped — will restart fresh on next call")
|
|
87
|
+
return
|
|
88
|
+
if args and args[0] == "--debug-clicks":
|
|
89
|
+
os.environ["BH_DEBUG_CLICKS"] = "1"
|
|
90
|
+
args = args[1:]
|
|
91
|
+
if not args or args[0] != "-c":
|
|
92
|
+
sys.exit("Usage: browser-harness -c \"print(page_info())\"")
|
|
93
|
+
if len(args) < 2:
|
|
94
|
+
sys.exit("Usage: browser-harness -c \"print(page_info())\"")
|
|
95
|
+
print_update_banner()
|
|
96
|
+
if not daemon_alive() and not _local_chrome_listening() and os.environ.get("BROWSER_USE_API_KEY"):
|
|
97
|
+
start_remote_daemon(NAME)
|
|
98
|
+
ensure_daemon()
|
|
99
|
+
exec(args[1], globals())
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
if __name__ == "__main__":
|
|
103
|
+
main()
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: brainstorming
|
|
3
|
-
description: Use before creative or behavioral work when intent, scope, design choices, acceptance criteria, or trade-offs are not already explicit.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Brainstorming
|
|
7
|
-
|
|
8
|
-
Turn an idea into an implementable design before writing code.
|
|
9
|
-
|
|
10
|
-
## Gate
|
|
11
|
-
|
|
12
|
-
Do not edit implementation files until the design is clear enough to state:
|
|
13
|
-
|
|
14
|
-
- The user-visible goal
|
|
15
|
-
- The constrained scope
|
|
16
|
-
- The recommended approach and at least one rejected alternative
|
|
17
|
-
- The main files or modules likely affected
|
|
18
|
-
- Acceptance criteria and verification commands
|
|
19
|
-
|
|
20
|
-
For small changes, the design can be short. The gate is clarity, not ceremony.
|
|
21
|
-
|
|
22
|
-
## Process
|
|
23
|
-
|
|
24
|
-
1. Explore current project context with read-only tools.
|
|
25
|
-
2. Ask one high-value clarification question at a time only when the answer cannot be inferred safely.
|
|
26
|
-
3. Present 2-3 viable approaches with trade-offs.
|
|
27
|
-
4. Recommend one approach and explain why it fits the existing codebase.
|
|
28
|
-
5. Get user approval before implementation when the change is broad, risky, or changes behavior.
|
|
29
|
-
6. If the design will take multiple implementation steps, transition to `writing-plans`.
|
|
30
|
-
|
|
31
|
-
## Output Standard
|
|
32
|
-
|
|
33
|
-
Use evidence from the codebase. State assumptions explicitly. Keep the design actionable enough that another agent could implement it without rediscovering the architecture.
|
|
1
|
+
---
|
|
2
|
+
name: brainstorming
|
|
3
|
+
description: Use before creative or behavioral work when intent, scope, design choices, acceptance criteria, or trade-offs are not already explicit.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Brainstorming
|
|
7
|
+
|
|
8
|
+
Turn an idea into an implementable design before writing code.
|
|
9
|
+
|
|
10
|
+
## Gate
|
|
11
|
+
|
|
12
|
+
Do not edit implementation files until the design is clear enough to state:
|
|
13
|
+
|
|
14
|
+
- The user-visible goal
|
|
15
|
+
- The constrained scope
|
|
16
|
+
- The recommended approach and at least one rejected alternative
|
|
17
|
+
- The main files or modules likely affected
|
|
18
|
+
- Acceptance criteria and verification commands
|
|
19
|
+
|
|
20
|
+
For small changes, the design can be short. The gate is clarity, not ceremony.
|
|
21
|
+
|
|
22
|
+
## Process
|
|
23
|
+
|
|
24
|
+
1. Explore current project context with read-only tools.
|
|
25
|
+
2. Ask one high-value clarification question at a time only when the answer cannot be inferred safely.
|
|
26
|
+
3. Present 2-3 viable approaches with trade-offs.
|
|
27
|
+
4. Recommend one approach and explain why it fits the existing codebase.
|
|
28
|
+
5. Get user approval before implementation when the change is broad, risky, or changes behavior.
|
|
29
|
+
6. If the design will take multiple implementation steps, transition to `writing-plans`.
|
|
30
|
+
|
|
31
|
+
## Output Standard
|
|
32
|
+
|
|
33
|
+
Use evidence from the codebase. State assumptions explicitly. Keep the design actionable enough that another agent could implement it without rediscovering the architecture.
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: executing-plans
|
|
3
|
-
description: Use when implementing an approved written plan in the current session.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Executing Plans
|
|
7
|
-
|
|
8
|
-
Execute the approved plan task by task with verification checkpoints.
|
|
9
|
-
|
|
10
|
-
## Process
|
|
11
|
-
|
|
12
|
-
1. Read the plan completely.
|
|
13
|
-
2. Check for contradictions, missing files, missing tests, or unsafe assumptions.
|
|
14
|
-
3. Raise blockers before editing.
|
|
15
|
-
4. For each task:
|
|
16
|
-
- Mark the task in progress.
|
|
17
|
-
- Follow the stated steps.
|
|
18
|
-
- Use `test-driven-development` for behavior changes.
|
|
19
|
-
- Run the specified verification.
|
|
20
|
-
- Mark the task complete only after evidence supports it.
|
|
21
|
-
5. After all tasks, use `verification-before-completion`.
|
|
22
|
-
|
|
23
|
-
## Stop Conditions
|
|
24
|
-
|
|
25
|
-
Stop when a plan instruction is ambiguous enough to change behavior, a required dependency is missing, verification fails repeatedly, or the plan conflicts with current codebase evidence.
|
|
1
|
+
---
|
|
2
|
+
name: executing-plans
|
|
3
|
+
description: Use when implementing an approved written plan in the current session.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Executing Plans
|
|
7
|
+
|
|
8
|
+
Execute the approved plan task by task with verification checkpoints.
|
|
9
|
+
|
|
10
|
+
## Process
|
|
11
|
+
|
|
12
|
+
1. Read the plan completely.
|
|
13
|
+
2. Check for contradictions, missing files, missing tests, or unsafe assumptions.
|
|
14
|
+
3. Raise blockers before editing.
|
|
15
|
+
4. For each task:
|
|
16
|
+
- Mark the task in progress.
|
|
17
|
+
- Follow the stated steps.
|
|
18
|
+
- Use `test-driven-development` for behavior changes.
|
|
19
|
+
- Run the specified verification.
|
|
20
|
+
- Mark the task complete only after evidence supports it.
|
|
21
|
+
5. After all tasks, use `verification-before-completion`.
|
|
22
|
+
|
|
23
|
+
## Stop Conditions
|
|
24
|
+
|
|
25
|
+
Stop when a plan instruction is ambiguous enough to change behavior, a required dependency is missing, verification fails repeatedly, or the plan conflicts with current codebase evidence.
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: finishing-development-branch
|
|
3
|
-
description: Use after implementation is complete and verified, when deciding how to merge, push, preserve, or discard branch work.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Finishing a Development Branch
|
|
7
|
-
|
|
8
|
-
Complete branch work with evidence and a clear integration choice.
|
|
9
|
-
|
|
10
|
-
## Process
|
|
11
|
-
|
|
12
|
-
1. Run the verification that proves the completed work.
|
|
13
|
-
2. Inspect git status and current branch.
|
|
14
|
-
3. Detect whether the workspace is a normal checkout, linked worktree, or detached/headless workspace.
|
|
15
|
-
4. Present concrete options:
|
|
16
|
-
- Merge locally
|
|
17
|
-
- Push and create a PR
|
|
18
|
-
- Keep branch/worktree as-is
|
|
19
|
-
- Discard work, with explicit confirmation
|
|
20
|
-
5. Execute the chosen path.
|
|
21
|
-
6. Re-run verification after merge when merging locally.
|
|
22
|
-
|
|
23
|
-
## Safety
|
|
24
|
-
|
|
25
|
-
Never discard work without typed confirmation. Never remove a worktree unless you can prove it was created for this workflow and is not owned by the harness.
|
|
1
|
+
---
|
|
2
|
+
name: finishing-development-branch
|
|
3
|
+
description: Use after implementation is complete and verified, when deciding how to merge, push, preserve, or discard branch work.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Finishing a Development Branch
|
|
7
|
+
|
|
8
|
+
Complete branch work with evidence and a clear integration choice.
|
|
9
|
+
|
|
10
|
+
## Process
|
|
11
|
+
|
|
12
|
+
1. Run the verification that proves the completed work.
|
|
13
|
+
2. Inspect git status and current branch.
|
|
14
|
+
3. Detect whether the workspace is a normal checkout, linked worktree, or detached/headless workspace.
|
|
15
|
+
4. Present concrete options:
|
|
16
|
+
- Merge locally
|
|
17
|
+
- Push and create a PR
|
|
18
|
+
- Keep branch/worktree as-is
|
|
19
|
+
- Discard work, with explicit confirmation
|
|
20
|
+
5. Execute the chosen path.
|
|
21
|
+
6. Re-run verification after merge when merging locally.
|
|
22
|
+
|
|
23
|
+
## Safety
|
|
24
|
+
|
|
25
|
+
Never discard work without typed confirmation. Never remove a worktree unless you can prove it was created for this workflow and is not owned by the harness.
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: receiving-code-review
|
|
3
|
-
description: Use when applying human, agent, or external review feedback.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Receiving Code Review
|
|
7
|
-
|
|
8
|
-
Treat review as technical input to verify, not a script to follow blindly.
|
|
9
|
-
|
|
10
|
-
## Process
|
|
11
|
-
|
|
12
|
-
1. Read all feedback before editing.
|
|
13
|
-
2. Restate unclear items or ask for clarification.
|
|
14
|
-
3. Verify each item against current codebase behavior.
|
|
15
|
-
4. Accept technically valid feedback and implement one item at a time.
|
|
16
|
-
5. Push back with evidence when feedback is incorrect, breaks existing behavior, or violates scope.
|
|
17
|
-
6. Run focused verification after each substantive fix.
|
|
18
|
-
7. Run broader verification before completion.
|
|
19
|
-
|
|
20
|
-
## YAGNI Check
|
|
21
|
-
|
|
22
|
-
If feedback asks for "proper" infrastructure, search for actual usage. If nothing uses the path, consider deleting or deferring rather than expanding unused surface area.
|
|
1
|
+
---
|
|
2
|
+
name: receiving-code-review
|
|
3
|
+
description: Use when applying human, agent, or external review feedback.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Receiving Code Review
|
|
7
|
+
|
|
8
|
+
Treat review as technical input to verify, not a script to follow blindly.
|
|
9
|
+
|
|
10
|
+
## Process
|
|
11
|
+
|
|
12
|
+
1. Read all feedback before editing.
|
|
13
|
+
2. Restate unclear items or ask for clarification.
|
|
14
|
+
3. Verify each item against current codebase behavior.
|
|
15
|
+
4. Accept technically valid feedback and implement one item at a time.
|
|
16
|
+
5. Push back with evidence when feedback is incorrect, breaks existing behavior, or violates scope.
|
|
17
|
+
6. Run focused verification after each substantive fix.
|
|
18
|
+
7. Run broader verification before completion.
|
|
19
|
+
|
|
20
|
+
## YAGNI Check
|
|
21
|
+
|
|
22
|
+
If feedback asks for "proper" infrastructure, search for actual usage. If nothing uses the path, consider deleting or deferring rather than expanding unused surface area.
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: requesting-code-review
|
|
3
|
-
description: Use after meaningful implementation tasks, before merging, or when a fresh review would reduce risk.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Requesting Code Review
|
|
7
|
-
|
|
8
|
-
Ask for review with precise context and explicit requirements.
|
|
9
|
-
|
|
10
|
-
## Review Packet
|
|
11
|
-
|
|
12
|
-
Provide the reviewer:
|
|
13
|
-
|
|
14
|
-
- Summary of the intended change
|
|
15
|
-
- Requirements or plan being checked
|
|
16
|
-
- Files changed
|
|
17
|
-
- Base and head SHAs when available
|
|
18
|
-
- Verification already run
|
|
19
|
-
- Known risks or areas needing attention
|
|
20
|
-
|
|
21
|
-
## Review Standard
|
|
22
|
-
|
|
23
|
-
Ask the reviewer to lead with findings ordered by severity. Findings need file and line references, a concrete failure mode, and a suggested correction. Require distinction between:
|
|
24
|
-
|
|
25
|
-
- Critical: must fix before proceeding
|
|
26
|
-
- Important: should fix before merge
|
|
27
|
-
- Minor: optional improvement
|
|
28
|
-
|
|
29
|
-
## After Review
|
|
30
|
-
|
|
31
|
-
Use `receiving-code-review` before applying feedback.
|
|
1
|
+
---
|
|
2
|
+
name: requesting-code-review
|
|
3
|
+
description: Use after meaningful implementation tasks, before merging, or when a fresh review would reduce risk.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Requesting Code Review
|
|
7
|
+
|
|
8
|
+
Ask for review with precise context and explicit requirements.
|
|
9
|
+
|
|
10
|
+
## Review Packet
|
|
11
|
+
|
|
12
|
+
Provide the reviewer:
|
|
13
|
+
|
|
14
|
+
- Summary of the intended change
|
|
15
|
+
- Requirements or plan being checked
|
|
16
|
+
- Files changed
|
|
17
|
+
- Base and head SHAs when available
|
|
18
|
+
- Verification already run
|
|
19
|
+
- Known risks or areas needing attention
|
|
20
|
+
|
|
21
|
+
## Review Standard
|
|
22
|
+
|
|
23
|
+
Ask the reviewer to lead with findings ordered by severity. Findings need file and line references, a concrete failure mode, and a suggested correction. Require distinction between:
|
|
24
|
+
|
|
25
|
+
- Critical: must fix before proceeding
|
|
26
|
+
- Important: should fix before merge
|
|
27
|
+
- Minor: optional improvement
|
|
28
|
+
|
|
29
|
+
## After Review
|
|
30
|
+
|
|
31
|
+
Use `receiving-code-review` before applying feedback.
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: systematic-debugging
|
|
3
|
-
description: Use for any bug, test failure, build failure, performance issue, flaky behavior, or unexpected runtime result before proposing fixes.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Systematic Debugging
|
|
7
|
-
|
|
8
|
-
Find the root cause before changing code.
|
|
9
|
-
|
|
10
|
-
## Gate
|
|
11
|
-
|
|
12
|
-
No fixes before root-cause investigation. A patch that only explains the symptom is not ready.
|
|
13
|
-
|
|
14
|
-
## Process
|
|
15
|
-
|
|
16
|
-
1. Read the exact error, stack trace, failing assertion, or observed behavior.
|
|
17
|
-
2. Reproduce the issue or document why reproduction is not currently possible.
|
|
18
|
-
3. Check recent changes and nearby working examples.
|
|
19
|
-
4. Trace the bad value, state, or control flow backward to its source.
|
|
20
|
-
5. Form one explicit hypothesis: "X causes Y because Z."
|
|
21
|
-
6. Test the hypothesis with the smallest evidence-gathering action.
|
|
22
|
-
7. Add a failing regression test or minimal reproduction before the fix when the codebase can support it.
|
|
23
|
-
8. Implement one root-cause fix.
|
|
24
|
-
9. Run focused verification, then broader regression checks as risk requires.
|
|
25
|
-
|
|
26
|
-
## Stop Conditions
|
|
27
|
-
|
|
28
|
-
Stop and re-analyze when a hypothesis fails. If three fix attempts fail or each fix reveals a new unrelated problem, question the architecture instead of stacking patches.
|
|
1
|
+
---
|
|
2
|
+
name: systematic-debugging
|
|
3
|
+
description: Use for any bug, test failure, build failure, performance issue, flaky behavior, or unexpected runtime result before proposing fixes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Systematic Debugging
|
|
7
|
+
|
|
8
|
+
Find the root cause before changing code.
|
|
9
|
+
|
|
10
|
+
## Gate
|
|
11
|
+
|
|
12
|
+
No fixes before root-cause investigation. A patch that only explains the symptom is not ready.
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
1. Read the exact error, stack trace, failing assertion, or observed behavior.
|
|
17
|
+
2. Reproduce the issue or document why reproduction is not currently possible.
|
|
18
|
+
3. Check recent changes and nearby working examples.
|
|
19
|
+
4. Trace the bad value, state, or control flow backward to its source.
|
|
20
|
+
5. Form one explicit hypothesis: "X causes Y because Z."
|
|
21
|
+
6. Test the hypothesis with the smallest evidence-gathering action.
|
|
22
|
+
7. Add a failing regression test or minimal reproduction before the fix when the codebase can support it.
|
|
23
|
+
8. Implement one root-cause fix.
|
|
24
|
+
9. Run focused verification, then broader regression checks as risk requires.
|
|
25
|
+
|
|
26
|
+
## Stop Conditions
|
|
27
|
+
|
|
28
|
+
Stop and re-analyze when a hypothesis fails. If three fix attempts fail or each fix reveals a new unrelated problem, question the architecture instead of stacking patches.
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: test-driven-development
|
|
3
|
-
description: Use when implementing features, bug fixes, refactors, or behavior changes before writing production code.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Test-Driven Development
|
|
7
|
-
|
|
8
|
-
Use red, green, refactor for behavior changes.
|
|
9
|
-
|
|
10
|
-
## Gate
|
|
11
|
-
|
|
12
|
-
No production behavior change without first seeing a test fail for the intended reason, unless the user explicitly accepts an exception.
|
|
13
|
-
|
|
14
|
-
## Cycle
|
|
15
|
-
|
|
16
|
-
1. Write the smallest test that describes one desired behavior.
|
|
17
|
-
2. Run it and verify it fails for the expected reason.
|
|
18
|
-
3. Implement the minimum production code needed to pass.
|
|
19
|
-
4. Run the focused test and verify it passes.
|
|
20
|
-
5. Run nearby or broader tests appropriate to the blast radius.
|
|
21
|
-
6. Refactor only after tests are green, then re-run verification.
|
|
22
|
-
|
|
23
|
-
## Good Tests
|
|
24
|
-
|
|
25
|
-
- Test observable behavior, not private implementation details.
|
|
26
|
-
- Prefer real code paths over mocks unless isolation requires a mock.
|
|
27
|
-
- Use names that describe the behavior being guaranteed.
|
|
28
|
-
- Split tests when the name needs "and".
|
|
29
|
-
|
|
30
|
-
## Exceptions
|
|
31
|
-
|
|
32
|
-
Acceptable exceptions include pure documentation, generated artifacts, exploratory prototypes, and configuration-only changes. State the exception before proceeding.
|
|
1
|
+
---
|
|
2
|
+
name: test-driven-development
|
|
3
|
+
description: Use when implementing features, bug fixes, refactors, or behavior changes before writing production code.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Test-Driven Development
|
|
7
|
+
|
|
8
|
+
Use red, green, refactor for behavior changes.
|
|
9
|
+
|
|
10
|
+
## Gate
|
|
11
|
+
|
|
12
|
+
No production behavior change without first seeing a test fail for the intended reason, unless the user explicitly accepts an exception.
|
|
13
|
+
|
|
14
|
+
## Cycle
|
|
15
|
+
|
|
16
|
+
1. Write the smallest test that describes one desired behavior.
|
|
17
|
+
2. Run it and verify it fails for the expected reason.
|
|
18
|
+
3. Implement the minimum production code needed to pass.
|
|
19
|
+
4. Run the focused test and verify it passes.
|
|
20
|
+
5. Run nearby or broader tests appropriate to the blast radius.
|
|
21
|
+
6. Refactor only after tests are green, then re-run verification.
|
|
22
|
+
|
|
23
|
+
## Good Tests
|
|
24
|
+
|
|
25
|
+
- Test observable behavior, not private implementation details.
|
|
26
|
+
- Prefer real code paths over mocks unless isolation requires a mock.
|
|
27
|
+
- Use names that describe the behavior being guaranteed.
|
|
28
|
+
- Split tests when the name needs "and".
|
|
29
|
+
|
|
30
|
+
## Exceptions
|
|
31
|
+
|
|
32
|
+
Acceptable exceptions include pure documentation, generated artifacts, exploratory prototypes, and configuration-only changes. State the exception before proceeding.
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: using-git-worktrees
|
|
3
|
-
description: Use before feature work that should be isolated from the current branch, or before executing a multi-step implementation plan.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Using Git Worktrees
|
|
7
|
-
|
|
8
|
-
Prefer isolated workspaces for risky or multi-step changes.
|
|
9
|
-
|
|
10
|
-
## Process
|
|
11
|
-
|
|
12
|
-
1. Detect whether the current checkout is already a linked worktree:
|
|
13
|
-
- `git rev-parse --git-dir`
|
|
14
|
-
- `git rev-parse --git-common-dir`
|
|
15
|
-
- `git rev-parse --show-superproject-working-tree`
|
|
16
|
-
2. If already isolated and not a submodule, continue there.
|
|
17
|
-
3. If not isolated, ask before creating a worktree unless the user or plan already requested isolation.
|
|
18
|
-
4. Prefer native workspace tools when available.
|
|
19
|
-
5. If using `git worktree`, place project-local worktrees under `.worktrees/` when it is ignored.
|
|
20
|
-
6. Run project setup only when dependencies are missing or stale.
|
|
21
|
-
7. Establish a clean baseline with the relevant tests before changing behavior.
|
|
22
|
-
|
|
23
|
-
## Safety
|
|
24
|
-
|
|
25
|
-
Do not remove harness-owned worktrees. Do not proceed from a failing baseline without telling the user what failed and getting direction or investigating the failure.
|
|
1
|
+
---
|
|
2
|
+
name: using-git-worktrees
|
|
3
|
+
description: Use before feature work that should be isolated from the current branch, or before executing a multi-step implementation plan.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Using Git Worktrees
|
|
7
|
+
|
|
8
|
+
Prefer isolated workspaces for risky or multi-step changes.
|
|
9
|
+
|
|
10
|
+
## Process
|
|
11
|
+
|
|
12
|
+
1. Detect whether the current checkout is already a linked worktree:
|
|
13
|
+
- `git rev-parse --git-dir`
|
|
14
|
+
- `git rev-parse --git-common-dir`
|
|
15
|
+
- `git rev-parse --show-superproject-working-tree`
|
|
16
|
+
2. If already isolated and not a submodule, continue there.
|
|
17
|
+
3. If not isolated, ask before creating a worktree unless the user or plan already requested isolation.
|
|
18
|
+
4. Prefer native workspace tools when available.
|
|
19
|
+
5. If using `git worktree`, place project-local worktrees under `.worktrees/` when it is ignored.
|
|
20
|
+
6. Run project setup only when dependencies are missing or stale.
|
|
21
|
+
7. Establish a clean baseline with the relevant tests before changing behavior.
|
|
22
|
+
|
|
23
|
+
## Safety
|
|
24
|
+
|
|
25
|
+
Do not remove harness-owned worktrees. Do not proceed from a failing baseline without telling the user what failed and getting direction or investigating the failure.
|