@pencil-agent/nano-pencil 2.0.1 → 2.0.3

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.
Files changed (188) hide show
  1. package/README.md +267 -267
  2. package/dist/build-meta.json +3 -3
  3. package/dist/core/export-html/AGENT.md +11 -11
  4. package/dist/core/export-html/template.css +971 -971
  5. package/dist/core/export-html/template.html +54 -54
  6. package/dist/core/model/custom-providers.js +1 -1
  7. package/dist/core/model-registry.js +5 -5
  8. package/dist/extensions/builtin/AGENT.md +115 -115
  9. package/dist/extensions/builtin/browser/AGENT.md +17 -17
  10. package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
  11. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
  12. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
  13. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
  14. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
  15. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
  16. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
  17. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
  18. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
  19. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
  20. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
  21. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
  22. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
  23. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
  24. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
  25. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
  26. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
  27. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
  28. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
  29. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
  30. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
  31. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
  32. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
  33. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
  34. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
  35. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
  36. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
  37. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
  38. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
  39. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
  40. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
  41. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
  42. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
  43. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
  44. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
  45. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
  46. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
  47. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
  48. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
  49. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
  50. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
  51. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
  52. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
  53. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
  54. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
  55. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
  56. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
  57. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
  58. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
  59. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
  60. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
  61. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
  62. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
  63. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
  64. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
  65. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
  66. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
  67. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
  68. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
  69. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
  70. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
  71. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
  72. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
  73. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
  74. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
  75. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
  76. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
  77. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
  78. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
  79. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
  80. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
  81. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
  82. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
  83. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
  84. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
  85. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
  86. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
  87. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
  88. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
  89. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
  90. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
  91. package/dist/extensions/builtin/browser/browser.md +73 -73
  92. package/dist/extensions/builtin/browser/install.md +142 -142
  93. package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
  94. package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
  95. package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
  96. package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
  97. package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
  98. package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
  99. package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
  100. package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
  101. package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
  102. package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
  103. package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
  104. package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
  105. package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
  106. package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
  107. package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
  108. package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
  109. package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
  110. package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
  111. package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
  112. package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
  113. package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
  114. package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
  115. package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
  116. package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
  117. package/dist/extensions/builtin/debug/index.js +9 -9
  118. package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
  119. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
  120. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
  121. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
  122. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
  123. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
  124. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
  125. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
  126. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
  127. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
  128. package/dist/extensions/builtin/goal/README.md +67 -67
  129. package/dist/extensions/builtin/goal/index.js +6 -6
  130. package/dist/extensions/builtin/grub/README.md +112 -112
  131. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
  132. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
  133. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
  134. package/dist/extensions/builtin/link-world/linkworld.md +313 -313
  135. package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -67
  136. package/dist/extensions/builtin/loop/README.md +92 -92
  137. package/dist/extensions/builtin/mcp/figma-design.md +68 -68
  138. package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
  139. package/dist/extensions/builtin/recap/AGENT.md +15 -15
  140. package/dist/extensions/builtin/sal/README.md +72 -72
  141. package/dist/extensions/builtin/security-audit/README.md +289 -289
  142. package/dist/extensions/builtin/team/AGENT.md +112 -112
  143. package/dist/extensions/builtin/team/TESTING.md +299 -299
  144. package/dist/extensions/builtin/token-save/README.md +56 -56
  145. package/dist/extensions/optional/AGENT.md +10 -10
  146. package/dist/modes/interactive/controllers/input-submit-controller.js +2 -2
  147. package/dist/modes/interactive/controllers/stream-render-controller.js +2 -2
  148. package/dist/modes/interactive/interactive-mode.js +19 -19
  149. package/dist/modes/interactive/theme/dark.json +85 -85
  150. package/dist/modes/interactive/theme/light.json +84 -84
  151. package/dist/modes/interactive/theme/theme-schema.json +335 -335
  152. package/dist/modes/interactive/theme/warm.json +81 -81
  153. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
  154. package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +1 -1
  155. 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
  156. package/docs/SDK-TESTING.md +364 -0
  157. package/docs/codex-goal-command-impl.md +1055 -1055
  158. package/docs/codex-goal-vs-grub.md +500 -500
  159. package/docs/custom-provider.md +27 -27
  160. package/docs/extensions.md +27 -27
  161. package/docs/keybindings.md +27 -27
  162. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
  163. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
  164. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
  165. 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
  166. 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
  167. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
  168. package/docs/loop-usage-examples.md +214 -214
  169. package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
  170. package/docs/models.md +27 -27
  171. package/docs/packages.md +27 -27
  172. package/docs/pi-design-philosophy.md +457 -457
  173. package/docs/planmode.md +1987 -1987
  174. package/docs/prompt-templates.md +27 -27
  175. package/docs/providers.md +27 -27
  176. package/docs/sdk.md +27 -27
  177. package/docs/skills.md +27 -27
  178. package/docs/startup-performance-optimization.md +301 -0
  179. package/docs/themes.md +27 -27
  180. package/docs/tui.md +27 -27
  181. package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
  182. package/package.json +190 -190
  183. package/docs/cc-agent-design.md +0 -1297
  184. package/docs/cc-tui-design.md +0 -1333
  185. package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +0 -170
  186. package/docs/scan-report.md +0 -3820
  187. package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
  188. 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,4 +1,4 @@
1
- var D=Object.defineProperty;var c=(a,e)=>D(a,"name",{value:e,configurable:!0});import{Box as C,Container as E,Spacer as $,Text as P}from"@pencil-agent/tui";import{collectSystemInfo as h,collectModelInfo as y,collectSessionInfo as b,collectConfigInfo as I,collectGitInfo as O,collectAgentState as M,collectPreferencesInfo as U,sanitizeForLLM as _,formatDiagnosticData as L}from"./collectors.js";const S="debug",v="[DEBUG:",A="[DEBUG]",j=`You are a diagnostic analyst for nanoPencil (a terminal-native AI coding agent).
1
+ var D=Object.defineProperty;var c=(r,e)=>D(r,"name",{value:e,configurable:!0});import{Box as C,Container as E,Spacer as $,Text as P}from"@pencil-agent/tui";import{collectSystemInfo as h,collectModelInfo as y,collectSessionInfo as b,collectConfigInfo as I,collectGitInfo as O,collectAgentState as M,collectPreferencesInfo as U,sanitizeForLLM as _,formatDiagnosticData as L}from"./collectors.js";const S="debug",v="[DEBUG:",A="[DEBUG]",j=`You are a diagnostic analyst for nanoPencil (a terminal-native AI coding agent).
2
2
  Analyze the provided system state and produce a structured three-layer diagnostic report.
3
3
 
4
4
  Output format (use these exact section headers):
@@ -28,22 +28,22 @@ Rules:
28
28
  - If no specific issue, perform a general health assessment
29
29
  - Use concise language; prefer tables and bullet lists over prose
30
30
  - If a diagnostic collection failed, treat that failure itself as a diagnostic signal
31
- - Do NOT use any tools \u2014 this is a pure analysis task`;let p;function z(a){return a.startsWith(v)}c(z,"isDebugPrompt");const k=[{value:"env",label:"env",description:"Show terminal and system details"},{value:"session",label:"session",description:"Show current conversation state"},{value:"model",label:"model",description:"Show active model and provider details"},{value:"preferences",label:"preferences",description:"Show saved preferences"}],N=[{value:"zh",label:"zh",description:"Use Chinese for future replies"},{value:"en",label:"en",description:"Use English for future replies"}];function w(a){const e=a.trim().toLowerCase();return e==="env"?{subcommand:"env"}:e==="session"?{subcommand:"session"}:e==="model"?{subcommand:"model"}:e==="preferences"?{subcommand:"preferences"}:{subcommand:"full",issueDescription:a.trim()||void 0}}c(w,"parseDebugArgs");async function R(a,e,r){const t=w(a);e.ui.setStatus("debug","Collecting diagnostics...");try{const[n,s,o,i,u,l]=await Promise.allSettled([h(),y(e),b(e),I(e),O(e.cwd),M(e)]),m={system:n.status==="fulfilled"?n.value:{data:null,error:String(n.reason)},model:s.status==="fulfilled"?s.value:{data:null,error:String(s.reason)},session:o.status==="fulfilled"?o.value:{data:null,error:String(o.reason)},config:i.status==="fulfilled"?i.value:{data:null,error:String(i.reason)},git:u.status==="fulfilled"?u.value:{data:null,error:String(u.reason)},agent:l.status==="fulfilled"?l.value:{data:null,error:String(l.reason)}},g=_(m);e.ui.setStatus("debug",void 0);const d=[];d.push(`${A} Perform a three-layer diagnostic analysis.`),t.issueDescription&&d.push(`
31
+ - Do NOT use any tools \u2014 this is a pure analysis task`;let p;function k(r){return r.startsWith(v)}c(k,"isDebugPrompt");const z=[{value:"env",label:"env",description:"Show terminal and system details"},{value:"session",label:"session",description:"Show current conversation state"},{value:"model",label:"model",description:"Show active model and provider details"},{value:"preferences",label:"preferences",description:"Show saved preferences"}],N=[{value:"zh",label:"zh",description:"Use Chinese for future replies"},{value:"en",label:"en",description:"Use English for future replies"}];function w(r){const e=r.trim().toLowerCase();return e==="env"?{subcommand:"env"}:e==="session"?{subcommand:"session"}:e==="model"?{subcommand:"model"}:e==="preferences"?{subcommand:"preferences"}:{subcommand:"full",issueDescription:r.trim()||void 0}}c(w,"parseDebugArgs");async function R(r,e,o){const t=w(r);e.ui.setStatus("debug","Collecting diagnostics...");try{const[n,s,a,i,u,l]=await Promise.allSettled([h(),y(e),b(e),I(e),O(e.cwd),M(e)]),m={system:n.status==="fulfilled"?n.value:{data:null,error:String(n.reason)},model:s.status==="fulfilled"?s.value:{data:null,error:String(s.reason)},session:a.status==="fulfilled"?a.value:{data:null,error:String(a.reason)},config:i.status==="fulfilled"?i.value:{data:null,error:String(i.reason)},git:u.status==="fulfilled"?u.value:{data:null,error:String(u.reason)},agent:l.status==="fulfilled"?l.value:{data:null,error:String(l.reason)}},g=_(m);e.ui.setStatus("debug",void 0);const d=[];d.push(`${A} Perform a three-layer diagnostic analysis.`),t.issueDescription&&d.push(`
32
32
  User-Reported Issue: ${t.issueDescription}`),d.push(`
33
33
  Collected Diagnostics:
34
34
  `),d.push(L(g));const f=`${v}${Date.now()}]
35
35
  ${d.join(`
36
- `)}`;p=f,r.sendUserMessage(f,{deliverAs:"followUp"})}catch(n){e.ui.setStatus("debug",void 0);const s=n instanceof Error?n.message:String(n);e.ui.notify(`Debug error: ${s}`,"error")}}c(R,"handleFullDiagnostic");async function T(a,e,r){let t;switch(a){case"env":{const n=await h();t=n.data?`| System | |
36
+ `)}`;p=f,o.sendUserMessage(f,{deliverAs:"followUp"})}catch(n){e.ui.setStatus("debug",void 0);const s=n instanceof Error?n.message:String(n);e.ui.notify(`Debug error: ${s}`,"error")}}c(R,"handleFullDiagnostic");async function T(r,e,o){let t;switch(r){case"env":{const n=await h();t=n.data?`| System | |
37
37
  |---|---|
38
- ${Object.entries(n.data).map(([s,o])=>`| ${s} | ${o} |`).join(`
38
+ ${Object.entries(n.data).map(([s,a])=>`| ${s} | ${a} |`).join(`
39
39
  `)}`:`> Collection failed: ${n.error}`;break}case"session":{const n=await b(e);t=n.data?`| Session | |
40
40
  |---|---|
41
- ${Object.entries(n.data).map(([s,o])=>`| ${s} | ${o} |`).join(`
41
+ ${Object.entries(n.data).map(([s,a])=>`| ${s} | ${a} |`).join(`
42
42
  `)}`:`> Collection failed: ${n.error}`;break}case"model":{const n=await y(e);t=n.data?`| Model | |
43
43
  |---|---|
44
- ${Object.entries(n.data).map(([s,o])=>`| ${s} | ${o} |`).join(`
44
+ ${Object.entries(n.data).map(([s,a])=>`| ${s} | ${a} |`).join(`
45
45
  `)}`:`> Collection failed: ${n.error}`;break}case"preferences":{const n=await U(e);t=n.data?`| Preferences | |
46
46
  |---|---|
47
- ${Object.entries(n.data).map(([s,o])=>`| ${s} | ${typeof o=="string"?o:JSON.stringify(o)} |`).join(`
48
- `)}`:`> Collection failed: ${n.error}`;break}}r.sendMessage({customType:S,content:t,display:!0})}c(T,"handleQuickSub");async function B(a,e,r){const t=w(a);t.subcommand!=="full"?await T(t.subcommand,e,r):await R(a,e,r)}c(B,"handleDebugCommand");async function G(a){a.registerMessageRenderer(S,(e,r,t)=>{const n=typeof e.content=="string"?e.content:e.content.filter(i=>i.type==="text").map(i=>i.text).join(`
49
- `),s=new C(1,1,i=>t.bg("customMessageBg",i));s.addChild(new P(t.fg("dim",n),0,0));const o=new E;return o.addChild(new $(1)),o.addChild(s),o}),a.on("before_agent_start",e=>{if(!(!z(e.prompt)||e.prompt!==p))return{appendSystemPrompt:j}}),a.on("agent_end",()=>{p&&(p=void 0)}),a.registerCommand("debug",{description:"Check NanoPencil health or investigate an issue. Usage: /debug [env|session|model|preferences|<issue>]",getArgumentCompletions:c((e,r)=>{if(r&&r.tokenIndex>0)return null;const t=e.trim().toLowerCase(),n=k.filter(s=>s.value.startsWith(t));return n.length>0?n:null},"getArgumentCompletions"),handler:c((e,r)=>B(e,r,a),"handler")}),a.registerCommand("set-locale",{description:"Set language preference (/set-locale zh|en)",getArgumentCompletions:c((e,r)=>{if(r&&r.tokenIndex>0)return null;const t=e.trim().toLowerCase(),n=N.filter(s=>s.value.startsWith(t));return n.length>0?n:null},"getArgumentCompletions"),handler:c(async(e,r)=>{const t=e.trim().toLowerCase();if(t!=="zh"&&t!=="en"){r.ui.notify("Usage: /set-locale zh or /set-locale en","info");return}const n=await import("node:os"),s=await import("node:fs"),o=await import("node:path"),i=process.env.NANOMEM_MEMORY_DIR||o.join(n.homedir(),".nanopencil","agent","memory"),u=o.join(i,"preferences.json");try{let l=[];s.existsSync(u)&&(l=JSON.parse(s.readFileSync(u,"utf-8")));const m=l.findIndex(d=>{const f=d.name||"";return f.includes("\u7528\u6237\u504F\u597D")||f.includes("language preference")||f.includes("locale")}),g={id:`set-locale-${Date.now()}`,type:"preference",name:t==="zh"?"\u7528\u6237\u504F\u597D\u4E2D\u6587":"Language Preference (English)",summary:t==="zh"?"\u7528\u6237\u5E0C\u671B\u6211\u7528\u4E2D\u6587\u56DE\u590D":"User prefers English",detail:t==="zh"?"\u7528\u6237\u901A\u8FC7 /set-locale \u547D\u4EE4\u660E\u786E\u8BBE\u7F6E\u8BED\u8A00\u4E3A\u4E2D\u6587":"User explicitly set language to English via /set-locale command",content:t==="zh"?"\u7528\u6237\u5E0C\u671B\u7528\u4E2D\u6587\u56DE\u590D":"User prefers English responses",tags:["locale","language",t==="zh"?"\u4E2D\u6587":"english"],importance:10,strength:1e3,created:new Date().toISOString(),eventTime:new Date().toISOString(),accessCount:0,retention:"core",salience:10,stability:"stable",relations:[]};m>=0?l[m]=g:l.push(g),s.writeFileSync(u,JSON.stringify(l,null,2)),r.ui.notify(`Locale set to ${t==="zh"?"\u4E2D\u6587":"English"}. Restart or run /debug preferences to verify.`,"info")}catch(l){r.ui.notify(`Failed to set locale: ${l}`,"error")}},"handler")})}c(G,"debugExtension");export{G as default};
47
+ ${Object.entries(n.data).map(([s,a])=>`| ${s} | ${typeof a=="string"?a:JSON.stringify(a)} |`).join(`
48
+ `)}`:`> Collection failed: ${n.error}`;break}}o.sendMessage({customType:S,content:t,display:!0})}c(T,"handleQuickSub");async function B(r,e,o){const t=w(r);t.subcommand!=="full"?await T(t.subcommand,e,o):await R(r,e,o)}c(B,"handleDebugCommand");async function G(r){r.registerMessageRenderer(S,(e,o,t)=>{const n=typeof e.content=="string"?e.content:e.content.filter(i=>i.type==="text").map(i=>i.text).join(`
49
+ `),s=new C(1,1,i=>t.bg("customMessageBg",i));s.addChild(new P(t.fg("dim",n),0,0));const a=new E;return a.addChild(new $(1)),a.addChild(s),a}),r.on("before_agent_start",e=>{if(!(!k(e.prompt)||e.prompt!==p))return{appendSystemPrompt:j}}),r.on("agent_end",()=>{p&&(p=void 0)}),r.registerCommand("debug",{description:"Check NanoPencil health or investigate an issue. Usage: /debug [env|session|model|preferences|<issue>]",getArgumentCompletions:c((e,o)=>{if(o&&o.tokenIndex>0)return null;const t=e.trim().toLowerCase(),n=z.filter(s=>s.value.startsWith(t));return n.length>0?n:null},"getArgumentCompletions"),handler:c((e,o)=>B(e,o,r),"handler")}),r.registerCommand("set-locale",{description:"Set language preference (/set-locale zh|en)",getArgumentCompletions:c((e,o)=>{if(o&&o.tokenIndex>0)return null;const t=e.trim().toLowerCase(),n=N.filter(s=>s.value.startsWith(t));return n.length>0?n:null},"getArgumentCompletions"),handler:c(async(e,o)=>{const t=e.trim().toLowerCase();if(t!=="zh"&&t!=="en"){o.ui.notify("Usage: /set-locale zh or /set-locale en","info");return}const n=await import("node:os"),s=await import("node:fs"),a=await import("node:path"),i=process.env.NANOMEM_MEMORY_DIR||a.join(n.homedir(),".nanopencil","agent","memory"),u=a.join(i,"preferences.json");try{let l=[];s.existsSync(u)&&(l=JSON.parse(s.readFileSync(u,"utf-8")));const m=l.findIndex(d=>{const f=d.name||"";return f.includes("\u7528\u6237\u504F\u597D")||f.includes("language preference")||f.includes("locale")}),g={id:`set-locale-${Date.now()}`,type:"preference",name:t==="zh"?"\u7528\u6237\u504F\u597D\u4E2D\u6587":"Language Preference (English)",summary:t==="zh"?"\u7528\u6237\u5E0C\u671B\u6211\u7528\u4E2D\u6587\u56DE\u590D":"User prefers English",detail:t==="zh"?"\u7528\u6237\u901A\u8FC7 /set-locale \u547D\u4EE4\u660E\u786E\u8BBE\u7F6E\u8BED\u8A00\u4E3A\u4E2D\u6587":"User explicitly set language to English via /set-locale command",content:t==="zh"?"\u7528\u6237\u5E0C\u671B\u7528\u4E2D\u6587\u56DE\u590D":"User prefers English responses",tags:["locale","language",t==="zh"?"\u4E2D\u6587":"english"],importance:10,strength:1e3,created:new Date().toISOString(),eventTime:new Date().toISOString(),accessCount:0,retention:"core",salience:10,stability:"stable",relations:[]};m>=0?l[m]=g:l.push(g),s.mkdirSync(i,{recursive:!0}),s.writeFileSync(u,JSON.stringify(l,null,2)),o.ui.notify(`Locale set to ${t==="zh"?"\u4E2D\u6587":"English"}. Restart or run /debug preferences to verify.`,"info")}catch(l){o.ui.notify(`Failed to set locale: ${l}`,"error")}},"handler")})}c(G,"debugExtension");export{G as default};
@@ -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.