@pencil-agent/nano-pencil 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) 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/mcp/mcp-client.d.ts +3 -1
  7. package/dist/core/mcp/mcp-client.js +6 -6
  8. package/dist/core/mcp/mcp-config.d.ts +3 -3
  9. package/dist/core/mcp/mcp-config.js +1 -1
  10. package/dist/core/mcp/mcp-manager.d.ts +5 -1
  11. package/dist/core/mcp/mcp-manager.js +1 -1
  12. package/dist/core/platform/config/resource-loader.d.ts +2 -0
  13. package/dist/core/platform/config/resource-loader.js +2 -2
  14. package/dist/core/runtime/agent-session.d.ts +12 -0
  15. package/dist/core/runtime/agent-session.js +8 -8
  16. package/dist/core/runtime/sdk.d.ts +8 -0
  17. package/dist/core/runtime/sdk.js +1 -1
  18. package/dist/extensions/builtin/AGENT.md +115 -115
  19. package/dist/extensions/builtin/browser/AGENT.md +17 -17
  20. package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
  21. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
  22. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
  23. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
  24. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
  25. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
  26. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
  27. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
  28. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
  29. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
  30. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
  31. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
  32. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
  33. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
  34. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
  35. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
  36. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
  37. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
  38. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
  39. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
  40. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
  41. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
  42. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
  43. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
  44. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
  45. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
  46. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
  47. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
  48. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
  49. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
  50. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
  51. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
  52. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
  53. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
  54. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
  55. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
  56. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
  57. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
  58. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
  59. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
  60. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
  61. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
  62. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
  63. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
  64. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
  65. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
  66. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
  67. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
  68. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
  69. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
  70. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
  71. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
  72. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
  73. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
  74. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
  75. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
  76. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
  77. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
  78. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
  79. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
  80. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
  81. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
  82. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
  83. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
  84. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
  85. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
  86. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
  87. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
  88. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
  89. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
  90. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
  91. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
  92. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
  93. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
  94. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
  95. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
  96. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
  97. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
  98. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
  99. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
  100. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
  101. package/dist/extensions/builtin/browser/browser.md +73 -73
  102. package/dist/extensions/builtin/browser/install.md +142 -142
  103. package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
  104. package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
  105. package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
  106. package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
  107. package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
  108. package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
  109. package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
  110. package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
  111. package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
  112. package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
  113. package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
  114. package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
  115. package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
  116. package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
  117. package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
  118. package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
  119. package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
  120. package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
  121. package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
  122. package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
  123. package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
  124. package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
  125. package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
  126. package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
  127. package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
  128. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
  129. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
  130. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
  131. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
  132. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
  133. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
  134. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
  135. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
  136. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
  137. package/dist/extensions/builtin/goal/README.md +67 -67
  138. package/dist/extensions/builtin/grub/README.md +112 -112
  139. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
  140. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
  141. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
  142. package/dist/extensions/builtin/link-world/linkworld.md +313 -313
  143. package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -67
  144. package/dist/extensions/builtin/loop/README.md +92 -92
  145. package/dist/extensions/builtin/mcp/figma-design.md +68 -68
  146. package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
  147. package/dist/extensions/builtin/recap/AGENT.md +15 -15
  148. package/dist/extensions/builtin/sal/README.md +72 -72
  149. package/dist/extensions/builtin/security-audit/README.md +289 -289
  150. package/dist/extensions/builtin/team/AGENT.md +112 -112
  151. package/dist/extensions/builtin/team/TESTING.md +299 -299
  152. package/dist/extensions/builtin/token-save/README.md +56 -56
  153. package/dist/extensions/optional/AGENT.md +10 -10
  154. package/dist/modes/interactive/interactive-mode.js +36 -36
  155. package/dist/modes/interactive/theme/dark.json +85 -85
  156. package/dist/modes/interactive/theme/light.json +84 -84
  157. package/dist/modes/interactive/theme/theme-schema.json +335 -335
  158. package/dist/modes/interactive/theme/warm.json +81 -81
  159. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop.js +3 -2
  160. package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-agent-loop.js +2 -1
  161. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
  162. package/docs/cc-agent-design.md +1297 -0
  163. package/docs/cc-tui-design.md +1333 -0
  164. package/docs/codex-goal-command-impl.md +1055 -1055
  165. package/docs/codex-goal-vs-grub.md +500 -500
  166. package/docs/custom-provider.md +27 -27
  167. package/docs/extensions.md +27 -27
  168. package/docs/keybindings.md +27 -27
  169. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
  170. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
  171. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
  172. 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
  173. 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
  174. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
  175. package/docs/loop-usage-examples.md +214 -214
  176. package/docs/models.md +27 -27
  177. package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +170 -0
  178. package/docs/packages.md +27 -27
  179. package/docs/pi-design-philosophy.md +457 -457
  180. package/docs/planmode.md +1987 -1987
  181. package/docs/prompt-templates.md +27 -27
  182. package/docs/providers.md +27 -27
  183. package/docs/scan-report.md +3820 -0
  184. package/docs/sdk.md +27 -27
  185. package/docs/skills.md +27 -27
  186. package/docs/themes.md +27 -27
  187. package/docs/tui.md +27 -27
  188. package/docs//345/257/271/346/240/207Claude-Code.md +1775 -0
  189. 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 +261 -0
  190. package/package.json +190 -190
  191. 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 +0 -851
  192. package/docs/SDK-TESTING.md +0 -364
  193. package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +0 -593
  194. package/docs/startup-performance-optimization.md +0 -301
  195. package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +0 -47
@@ -1,27 +1,27 @@
1
- ---
2
- name: custom-provider
3
- description: Use when the user asks how to add or configure a custom model provider.
4
- surface: TODO # user entry points: /command, --flag, config key, file location
5
- owner: core/lib/ai/ # DIP P2 anchor — read its AGENT.md member list to find code
6
- status: draft
7
- ---
8
-
9
- # Custom Providers
10
-
11
- > TODO: one line — what this feature does for the user.
12
-
13
- ## When to use
14
- TODO: the user intents that should pull this doc (mirrors the frontmatter `description`).
15
-
16
- ## Usage
17
- TODO: commands / flags / config keys / file locations, with one minimal example.
18
-
19
- ## Behavior & defaults
20
- TODO: default on/off, side effects, opt-in/opt-out.
21
-
22
- ## Code map → DIP
23
- - Owner: `core/lib/ai/` — read its DIP **P2 member list** (the nearest `AGENT.md`) to locate files.
24
- - Then follow **P3** file headers (WHO / FROM / TO / HERE) to navigate. Do **not** duplicate code paths here.
25
-
26
- ## Related
27
- [[models]] [[providers]]
1
+ ---
2
+ name: custom-provider
3
+ description: Use when the user asks how to add or configure a custom model provider.
4
+ surface: TODO # user entry points: /command, --flag, config key, file location
5
+ owner: core/lib/ai/ # DIP P2 anchor — read its AGENT.md member list to find code
6
+ status: draft
7
+ ---
8
+
9
+ # Custom Providers
10
+
11
+ > TODO: one line — what this feature does for the user.
12
+
13
+ ## When to use
14
+ TODO: the user intents that should pull this doc (mirrors the frontmatter `description`).
15
+
16
+ ## Usage
17
+ TODO: commands / flags / config keys / file locations, with one minimal example.
18
+
19
+ ## Behavior & defaults
20
+ TODO: default on/off, side effects, opt-in/opt-out.
21
+
22
+ ## Code map → DIP
23
+ - Owner: `core/lib/ai/` — read its DIP **P2 member list** (the nearest `AGENT.md`) to locate files.
24
+ - Then follow **P3** file headers (WHO / FROM / TO / HERE) to navigate. Do **not** duplicate code paths here.
25
+
26
+ ## Related
27
+ [[models]] [[providers]]
@@ -1,27 +1,27 @@
1
- ---
2
- name: extensions
3
- description: Use when the user asks how to write, load, or configure a NanoPencil extension.
4
- surface: TODO # user entry points: /command, --flag, config key, file location
5
- owner: core/extensions-host/ # DIP P2 anchor — read its AGENT.md member list to find code
6
- status: draft
7
- ---
8
-
9
- # Extensions
10
-
11
- > TODO: one line — what this feature does for the user.
12
-
13
- ## When to use
14
- TODO: the user intents that should pull this doc (mirrors the frontmatter `description`).
15
-
16
- ## Usage
17
- TODO: commands / flags / config keys / file locations, with one minimal example.
18
-
19
- ## Behavior & defaults
20
- TODO: default on/off, side effects, opt-in/opt-out.
21
-
22
- ## Code map → DIP
23
- - Owner: `core/extensions-host/` — read its DIP **P2 member list** (the nearest `AGENT.md`) to locate files.
24
- - Then follow **P3** file headers (WHO / FROM / TO / HERE) to navigate. Do **not** duplicate code paths here.
25
-
26
- ## Related
27
- [[sdk]] [[packages]] [[skills]]
1
+ ---
2
+ name: extensions
3
+ description: Use when the user asks how to write, load, or configure a NanoPencil extension.
4
+ surface: TODO # user entry points: /command, --flag, config key, file location
5
+ owner: core/extensions-host/ # DIP P2 anchor — read its AGENT.md member list to find code
6
+ status: draft
7
+ ---
8
+
9
+ # Extensions
10
+
11
+ > TODO: one line — what this feature does for the user.
12
+
13
+ ## When to use
14
+ TODO: the user intents that should pull this doc (mirrors the frontmatter `description`).
15
+
16
+ ## Usage
17
+ TODO: commands / flags / config keys / file locations, with one minimal example.
18
+
19
+ ## Behavior & defaults
20
+ TODO: default on/off, side effects, opt-in/opt-out.
21
+
22
+ ## Code map → DIP
23
+ - Owner: `core/extensions-host/` — read its DIP **P2 member list** (the nearest `AGENT.md`) to locate files.
24
+ - Then follow **P3** file headers (WHO / FROM / TO / HERE) to navigate. Do **not** duplicate code paths here.
25
+
26
+ ## Related
27
+ [[sdk]] [[packages]] [[skills]]
@@ -1,27 +1,27 @@
1
- ---
2
- name: keybindings
3
- description: Use when the user asks how to view or remap keybindings.
4
- surface: TODO # user entry points: /command, --flag, config key, file location
5
- owner: core/platform/keybindings.ts # DIP P2 anchor — read its AGENT.md member list to find code
6
- status: draft
7
- ---
8
-
9
- # Keybindings
10
-
11
- > TODO: one line — what this feature does for the user.
12
-
13
- ## When to use
14
- TODO: the user intents that should pull this doc (mirrors the frontmatter `description`).
15
-
16
- ## Usage
17
- TODO: commands / flags / config keys / file locations, with one minimal example.
18
-
19
- ## Behavior & defaults
20
- TODO: default on/off, side effects, opt-in/opt-out.
21
-
22
- ## Code map → DIP
23
- - Owner: `core/platform/keybindings.ts` — read its DIP **P2 member list** (the nearest `AGENT.md`) to locate files.
24
- - Then follow **P3** file headers (WHO / FROM / TO / HERE) to navigate. Do **not** duplicate code paths here.
25
-
26
- ## Related
27
- [[tui]]
1
+ ---
2
+ name: keybindings
3
+ description: Use when the user asks how to view or remap keybindings.
4
+ surface: TODO # user entry points: /command, --flag, config key, file location
5
+ owner: core/platform/keybindings.ts # DIP P2 anchor — read its AGENT.md member list to find code
6
+ status: draft
7
+ ---
8
+
9
+ # Keybindings
10
+
11
+ > TODO: one line — what this feature does for the user.
12
+
13
+ ## When to use
14
+ TODO: the user intents that should pull this doc (mirrors the frontmatter `description`).
15
+
16
+ ## Usage
17
+ TODO: commands / flags / config keys / file locations, with one minimal example.
18
+
19
+ ## Behavior & defaults
20
+ TODO: default on/off, side effects, opt-in/opt-out.
21
+
22
+ ## Code map → DIP
23
+ - Owner: `core/platform/keybindings.ts` — read its DIP **P2 member list** (the nearest `AGENT.md`) to locate files.
24
+ - Then follow **P3** file headers (WHO / FROM / TO / HERE) to navigate. Do **not** duplicate code paths here.
25
+
26
+ ## Related
27
+ [[tui]]
@@ -1,251 +1,251 @@
1
- # `/loop` 命令重构完成总结
2
-
3
- > 完成日期:2026-04-18
4
- > 重构阶段:阶段一(核心功能补全)
5
-
6
- ## 已完成的工作
7
-
8
- ### ✅ 目标1.1:添加 durable 持久化存储
9
-
10
- **新增文件:**
11
- - `extensions/defaults/loop/loop-tasks.ts` (5772字节)
12
- - `readLoopTasks()` - 从文件读取durable任务
13
- - `writeLoopTasks()` - 保存durable任务到文件
14
- - `addDurableLoopTask()` - 添加durable任务
15
- - `removeDurableLoopTask()` - 删除durable任务
16
- - `clearDurableLoopTasks()` - 清除所有durable任务
17
- - `updateDurableLoopTask()` - 更新durable任务
18
-
19
- **修改文件:**
20
- 1. `scheduler-types.ts`
21
- - `ScheduledLoopTask` 增加 `durable?: boolean` 和 `agentId?: string` 字段
22
- - `LoopStartSpec` 增加 `durable?: boolean` 字段
23
-
24
- 2. `scheduler-parser.ts`
25
- - `ExtractedFlags` 增加 `durable?: boolean` 字段
26
- - `extractFlags()` 解析 `--durable` 和 `-d` flag
27
- - `withDefaults()` 包含 `durable` 字段
28
- - `buildSchedulerHelp()` 更新帮助文档
29
-
30
- 3. `scheduler-controller.ts`
31
- - 增加 `projectRoot` 和 `isLockOwner` 字段
32
- - 增加 `setProjectRoot()` 和 `getProjectRoot()` 方法
33
- - 增加 `setLockOwner()` 和 `getIsLockOwner()` 方法
34
- - 增加 `loadDurableTasks()` - 从文件加载durable任务
35
- - 增加 `saveDurableTasks()` - 保存durable任务到文件
36
- - 增加 `createDurableTask()` - 创建durable任务
37
-
38
- 4. `index.ts`
39
- - `session_start` 事件中设置project root并加载durable任务
40
- - 创建任务时根据 `durable` flag 调用不同方法
41
- - 修改 `clear` 操作后保存durable任务
42
- - 修改 `cancel` 操作后保存durable任务
43
- - 修改 `pause` 和 `resume` 操作后保存durable任务
44
- - `agent_end` 事件中保存durable任务状态更新
45
- - `maybeAutoCancel()` 改为async,取消durable任务时保存
46
-
47
- **功能特性:**
48
- - ✅ 支持创建持久化任务(`--durable` 或 `-d` flag)
49
- - ✅ 任务保存到 `.nanopencil/loop-tasks.json`
50
- - ✅ 会话启动时自动恢复durable任务
51
- - ✅ 任务状态变更时自动保存
52
- - ✅ 最大50个durable任务限制
53
- - ✅ 容错读取(文件损坏不会崩溃)
54
- - ✅ 名称冲突检测
55
-
56
- ### ✅ 目标1.3:添加 auto-expiry 自动过期
57
-
58
- **修改文件:**
59
- 1. `scheduler-controller.ts`
60
- - 添加常量 `DEFAULT_RECURRING_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000`(7天)
61
- - `markDispatched()` 增加过期检查
62
- - 过期任务自动取消并抛出错误
63
-
64
- **功能特性:**
65
- - ✅ Durable 任务默认 7 天后自动过期
66
- - ✅ 防止僵尸任务无限运行
67
- - ✅ 过期时自动取消任务
68
- - ✅ 清晰的控制台日志提示
69
-
70
- ### ✅ 目标1.2:添加 scheduler lock
71
-
72
- **修改文件:**
73
- 1. `scheduler-controller.ts`
74
- - 增加 `lockRelease` 字段
75
- - 增加 `acquireLock()` - 获取调度器锁
76
- - 增加 `releaseLock()` - 释放调度器锁
77
- - 使用 `proper-lockfile` 包实现文件锁
78
-
79
- 2. `index.ts`
80
- - `session_start` 事件中获取锁
81
- - `session_shutdown` 事件中释放锁
82
-
83
- 3. `scheduler-controller.ts`
84
- - `nextDue()` 方法增加锁检查
85
- - 只有lock owner才触发durable任务
86
-
87
- **功能特性:**
88
- - ✅ 文件锁机制防止多实例重复触发
89
- - ✅ 锁文件路径:`.nanopencil/loop-scheduler.lock`
90
- - ✅ 获取锁失败时降级为非owner模式
91
- - ✅ 非owner模式下跳过durable任务触发
92
- - ✅ session-only任务不受锁影响
93
-
94
- ### ✅ 文档和测试
95
-
96
- **新增文档:**
97
- 1. `extensions/defaults/loop/README.md` - 更新说明durable功能
98
- 2. `docs/loop-usage-examples.md` - 详细的使用示例(4714字节)
99
- 3. `extensions/defaults/loop/test-durable.mjs` - 单元测试(6374字节)
100
-
101
- **测试覆盖:**
102
- - ✅ Test 1: Durable Task Persistence - 验证持久化功能
103
- - ✅ Test 2: Session-Only Task Not Persisted - 验证session-only任务不持久化
104
- - ✅ Test 3: Scheduler Lock - 验证锁机制
105
- - ✅ Test 4: Lock Owner Only Triggers Durable Tasks - 验证只有lock owner触发durable任务
106
- - ✅ Test 5: Auto-expiry - 验证自动过期功能
107
-
108
- ## 测试结果
109
-
110
- ```
111
- === Test 1: Durable Task Persistence ===
112
- ✓ Task in controller: true
113
- ✓ Task in file: true
114
- ✓ Task ID matches: true
115
- ✓ Task loaded in new controller: true
116
- ✓ Task data preserved: true
117
- ✓ Test 1 PASSED
118
-
119
- === Test 2: Session-Only Task Not Persisted ===
120
- ✓ Task in controller: true
121
- ✓ Task NOT in file: true
122
- ✓ Test 2 PASSED
123
-
124
- === Test 3: Scheduler Lock ===
125
- ✓ Test 3 PASSED
126
-
127
- === Test 4: Lock Owner Only Triggers Durable Tasks ===
128
- ✓ Controller 1 (lock owner) can trigger tasks: true
129
- ✓ Durable task in controller2: true
130
- ✓ Controller2 is lock owner: false
131
- ✓ Controller 2 (not lock owner) next due is null (durable skipped): true
132
- ✓ Test 4 PASSED
133
-
134
- === Test 5: Auto-expiry for Durable Tasks ===
135
- ✓ Task age: 8 days
136
- ✓ Error thrown for expired task: true
137
- ✓ Error thrown: true
138
- ✓ Task cancelled: true
139
- ✓ Test 5 PASSED
140
-
141
- === ALL TESTS PASSED ===
142
- ```
143
-
144
- ## 文件变更统计
145
-
146
- **新增文件:** 2个
147
- - `extensions/defaults/loop/loop-tasks.ts` (5772 bytes)
148
- - `extensions/defaults/loop/test-durable.mjs` (6374 bytes)
149
-
150
- **修改文件:** 4个
151
- - `extensions/defaults/loop/scheduler-types.ts` (新增2个字段)
152
- - `extensions/defaults/loop/scheduler-parser.ts` (新增durable解析)
153
- - `extensions/defaults/loop/scheduler-controller.ts` (+108行)
154
- - `extensions/defaults/loop/index.ts` (+31行)
155
-
156
- **文档文件:** 2个
157
- - `extensions/defaults/loop/README.md` (更新)
158
- - `docs/loop-usage-examples.md` (新增)
159
-
160
- ## 向后兼容性
161
-
162
- ✅ **完全向后兼容**
163
- - 现有session-only任务不受影响
164
- - 命令接口保持不变
165
- - 没有破坏性变更
166
- - 默认行为不变(仍是session-scoped)
167
-
168
- ## 架构改进
169
-
170
- 1. **关注点分离**
171
- - 文件存储逻辑独立到 `loop-tasks.ts`
172
- - 锁管理封装在 `scheduler-controller.ts`
173
-
174
- 2. **错误处理**
175
- - 容错读取,文件损坏不影响运行
176
- - 锁获取失败时优雅降级
177
-
178
- 3. **类型安全**
179
- - 所有新增字段都有完整类型定义
180
- - 编译时检查通过
181
-
182
- ## 使用示例
183
-
184
- ### 创建durable任务
185
- ```bash
186
- /loop Check build every 5m --durable
187
- ```
188
-
189
- ### 创建session-only任务(默认)
190
- ```bash
191
- /loop Check build every 5m
192
- ```
193
-
194
- ### 管理durable任务
195
- ```bash
196
- /loop list # 查看所有任务
197
- /loop status build-monitor # 查看任务详情
198
- /loop pause build-monitor # 暂停任务
199
- /loop resume build-monitor # 恢复任务
200
- /loop cancel build-monitor # 取消任务
201
- ```
202
-
203
- ## 后续建议
204
-
205
- ### 短期(可选)
206
- - [ ] 手动集成测试 - 在真实nanoPencil环境中测试
207
- - [ ] 性能测试 - 测试大量durable任务的性能
208
- - [ ] 压力测试 - 测试多进程并发场景
209
-
210
- ### 中期(推荐)
211
- - [ ] 阶段二:独立调度器模块
212
- - 提取 `loop-scheduler.ts`
213
- - 提升可测试性
214
- - 支持mock和独立测试
215
-
216
- - [ ] 阶段二:jitter机制
217
- - 防止流量尖峰
218
- - 基于taskId的确定性jitter
219
-
220
- ### 长期(未来考虑)
221
- - [ ] 阶段三:teammate路由支持
222
- - [ ] 阶段三:自动过期机制
223
- - [ ] 性能优化(批量保存、缓存等)
224
-
225
- ## 已知限制
226
-
227
- 1. **锁机制限制**
228
- - 基于文件锁,依赖文件系统
229
- - 在某些网络文件系统上可能不工作
230
- - 需要手动清理僵尸锁文件
231
-
232
- 2. **性能限制**
233
- - 每次任务变更都写入文件
234
- - 未来可考虑批量保存或延迟写入
235
-
236
- 3. **功能限制**
237
- - 没有实现jitter机制(阶段二)
238
- - 没有自动过期机制(阶段三)
239
- - 没有teammate支持(阶段三)
240
-
241
- ## 总结
242
-
243
- 本次重构成功实现了 **durable持久化存储**、**scheduler lock** 和 **auto-expiry** 三个核心功能,完全向后兼容,所有单元测试通过。用户现在可以:
244
-
245
- 1. ✅ 创建跨会话保持的durable任务
246
- 2. ✅ 在多进程环境下安全运行durable任务
247
- 3. ✅ 自动过期防止僵尸任务(7天)
248
- 4. ✅ 继续使用现有的session-only任务
249
- 5. ✅ 享受完整的命令行界面和帮助文档
250
-
1
+ # `/loop` 命令重构完成总结
2
+
3
+ > 完成日期:2026-04-18
4
+ > 重构阶段:阶段一(核心功能补全)
5
+
6
+ ## 已完成的工作
7
+
8
+ ### ✅ 目标1.1:添加 durable 持久化存储
9
+
10
+ **新增文件:**
11
+ - `extensions/defaults/loop/loop-tasks.ts` (5772字节)
12
+ - `readLoopTasks()` - 从文件读取durable任务
13
+ - `writeLoopTasks()` - 保存durable任务到文件
14
+ - `addDurableLoopTask()` - 添加durable任务
15
+ - `removeDurableLoopTask()` - 删除durable任务
16
+ - `clearDurableLoopTasks()` - 清除所有durable任务
17
+ - `updateDurableLoopTask()` - 更新durable任务
18
+
19
+ **修改文件:**
20
+ 1. `scheduler-types.ts`
21
+ - `ScheduledLoopTask` 增加 `durable?: boolean` 和 `agentId?: string` 字段
22
+ - `LoopStartSpec` 增加 `durable?: boolean` 字段
23
+
24
+ 2. `scheduler-parser.ts`
25
+ - `ExtractedFlags` 增加 `durable?: boolean` 字段
26
+ - `extractFlags()` 解析 `--durable` 和 `-d` flag
27
+ - `withDefaults()` 包含 `durable` 字段
28
+ - `buildSchedulerHelp()` 更新帮助文档
29
+
30
+ 3. `scheduler-controller.ts`
31
+ - 增加 `projectRoot` 和 `isLockOwner` 字段
32
+ - 增加 `setProjectRoot()` 和 `getProjectRoot()` 方法
33
+ - 增加 `setLockOwner()` 和 `getIsLockOwner()` 方法
34
+ - 增加 `loadDurableTasks()` - 从文件加载durable任务
35
+ - 增加 `saveDurableTasks()` - 保存durable任务到文件
36
+ - 增加 `createDurableTask()` - 创建durable任务
37
+
38
+ 4. `index.ts`
39
+ - `session_start` 事件中设置project root并加载durable任务
40
+ - 创建任务时根据 `durable` flag 调用不同方法
41
+ - 修改 `clear` 操作后保存durable任务
42
+ - 修改 `cancel` 操作后保存durable任务
43
+ - 修改 `pause` 和 `resume` 操作后保存durable任务
44
+ - `agent_end` 事件中保存durable任务状态更新
45
+ - `maybeAutoCancel()` 改为async,取消durable任务时保存
46
+
47
+ **功能特性:**
48
+ - ✅ 支持创建持久化任务(`--durable` 或 `-d` flag)
49
+ - ✅ 任务保存到 `.nanopencil/loop-tasks.json`
50
+ - ✅ 会话启动时自动恢复durable任务
51
+ - ✅ 任务状态变更时自动保存
52
+ - ✅ 最大50个durable任务限制
53
+ - ✅ 容错读取(文件损坏不会崩溃)
54
+ - ✅ 名称冲突检测
55
+
56
+ ### ✅ 目标1.3:添加 auto-expiry 自动过期
57
+
58
+ **修改文件:**
59
+ 1. `scheduler-controller.ts`
60
+ - 添加常量 `DEFAULT_RECURRING_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000`(7天)
61
+ - `markDispatched()` 增加过期检查
62
+ - 过期任务自动取消并抛出错误
63
+
64
+ **功能特性:**
65
+ - ✅ Durable 任务默认 7 天后自动过期
66
+ - ✅ 防止僵尸任务无限运行
67
+ - ✅ 过期时自动取消任务
68
+ - ✅ 清晰的控制台日志提示
69
+
70
+ ### ✅ 目标1.2:添加 scheduler lock
71
+
72
+ **修改文件:**
73
+ 1. `scheduler-controller.ts`
74
+ - 增加 `lockRelease` 字段
75
+ - 增加 `acquireLock()` - 获取调度器锁
76
+ - 增加 `releaseLock()` - 释放调度器锁
77
+ - 使用 `proper-lockfile` 包实现文件锁
78
+
79
+ 2. `index.ts`
80
+ - `session_start` 事件中获取锁
81
+ - `session_shutdown` 事件中释放锁
82
+
83
+ 3. `scheduler-controller.ts`
84
+ - `nextDue()` 方法增加锁检查
85
+ - 只有lock owner才触发durable任务
86
+
87
+ **功能特性:**
88
+ - ✅ 文件锁机制防止多实例重复触发
89
+ - ✅ 锁文件路径:`.nanopencil/loop-scheduler.lock`
90
+ - ✅ 获取锁失败时降级为非owner模式
91
+ - ✅ 非owner模式下跳过durable任务触发
92
+ - ✅ session-only任务不受锁影响
93
+
94
+ ### ✅ 文档和测试
95
+
96
+ **新增文档:**
97
+ 1. `extensions/defaults/loop/README.md` - 更新说明durable功能
98
+ 2. `docs/loop-usage-examples.md` - 详细的使用示例(4714字节)
99
+ 3. `extensions/defaults/loop/test-durable.mjs` - 单元测试(6374字节)
100
+
101
+ **测试覆盖:**
102
+ - ✅ Test 1: Durable Task Persistence - 验证持久化功能
103
+ - ✅ Test 2: Session-Only Task Not Persisted - 验证session-only任务不持久化
104
+ - ✅ Test 3: Scheduler Lock - 验证锁机制
105
+ - ✅ Test 4: Lock Owner Only Triggers Durable Tasks - 验证只有lock owner触发durable任务
106
+ - ✅ Test 5: Auto-expiry - 验证自动过期功能
107
+
108
+ ## 测试结果
109
+
110
+ ```
111
+ === Test 1: Durable Task Persistence ===
112
+ ✓ Task in controller: true
113
+ ✓ Task in file: true
114
+ ✓ Task ID matches: true
115
+ ✓ Task loaded in new controller: true
116
+ ✓ Task data preserved: true
117
+ ✓ Test 1 PASSED
118
+
119
+ === Test 2: Session-Only Task Not Persisted ===
120
+ ✓ Task in controller: true
121
+ ✓ Task NOT in file: true
122
+ ✓ Test 2 PASSED
123
+
124
+ === Test 3: Scheduler Lock ===
125
+ ✓ Test 3 PASSED
126
+
127
+ === Test 4: Lock Owner Only Triggers Durable Tasks ===
128
+ ✓ Controller 1 (lock owner) can trigger tasks: true
129
+ ✓ Durable task in controller2: true
130
+ ✓ Controller2 is lock owner: false
131
+ ✓ Controller 2 (not lock owner) next due is null (durable skipped): true
132
+ ✓ Test 4 PASSED
133
+
134
+ === Test 5: Auto-expiry for Durable Tasks ===
135
+ ✓ Task age: 8 days
136
+ ✓ Error thrown for expired task: true
137
+ ✓ Error thrown: true
138
+ ✓ Task cancelled: true
139
+ ✓ Test 5 PASSED
140
+
141
+ === ALL TESTS PASSED ===
142
+ ```
143
+
144
+ ## 文件变更统计
145
+
146
+ **新增文件:** 2个
147
+ - `extensions/defaults/loop/loop-tasks.ts` (5772 bytes)
148
+ - `extensions/defaults/loop/test-durable.mjs` (6374 bytes)
149
+
150
+ **修改文件:** 4个
151
+ - `extensions/defaults/loop/scheduler-types.ts` (新增2个字段)
152
+ - `extensions/defaults/loop/scheduler-parser.ts` (新增durable解析)
153
+ - `extensions/defaults/loop/scheduler-controller.ts` (+108行)
154
+ - `extensions/defaults/loop/index.ts` (+31行)
155
+
156
+ **文档文件:** 2个
157
+ - `extensions/defaults/loop/README.md` (更新)
158
+ - `docs/loop-usage-examples.md` (新增)
159
+
160
+ ## 向后兼容性
161
+
162
+ ✅ **完全向后兼容**
163
+ - 现有session-only任务不受影响
164
+ - 命令接口保持不变
165
+ - 没有破坏性变更
166
+ - 默认行为不变(仍是session-scoped)
167
+
168
+ ## 架构改进
169
+
170
+ 1. **关注点分离**
171
+ - 文件存储逻辑独立到 `loop-tasks.ts`
172
+ - 锁管理封装在 `scheduler-controller.ts`
173
+
174
+ 2. **错误处理**
175
+ - 容错读取,文件损坏不影响运行
176
+ - 锁获取失败时优雅降级
177
+
178
+ 3. **类型安全**
179
+ - 所有新增字段都有完整类型定义
180
+ - 编译时检查通过
181
+
182
+ ## 使用示例
183
+
184
+ ### 创建durable任务
185
+ ```bash
186
+ /loop Check build every 5m --durable
187
+ ```
188
+
189
+ ### 创建session-only任务(默认)
190
+ ```bash
191
+ /loop Check build every 5m
192
+ ```
193
+
194
+ ### 管理durable任务
195
+ ```bash
196
+ /loop list # 查看所有任务
197
+ /loop status build-monitor # 查看任务详情
198
+ /loop pause build-monitor # 暂停任务
199
+ /loop resume build-monitor # 恢复任务
200
+ /loop cancel build-monitor # 取消任务
201
+ ```
202
+
203
+ ## 后续建议
204
+
205
+ ### 短期(可选)
206
+ - [ ] 手动集成测试 - 在真实nanoPencil环境中测试
207
+ - [ ] 性能测试 - 测试大量durable任务的性能
208
+ - [ ] 压力测试 - 测试多进程并发场景
209
+
210
+ ### 中期(推荐)
211
+ - [ ] 阶段二:独立调度器模块
212
+ - 提取 `loop-scheduler.ts`
213
+ - 提升可测试性
214
+ - 支持mock和独立测试
215
+
216
+ - [ ] 阶段二:jitter机制
217
+ - 防止流量尖峰
218
+ - 基于taskId的确定性jitter
219
+
220
+ ### 长期(未来考虑)
221
+ - [ ] 阶段三:teammate路由支持
222
+ - [ ] 阶段三:自动过期机制
223
+ - [ ] 性能优化(批量保存、缓存等)
224
+
225
+ ## 已知限制
226
+
227
+ 1. **锁机制限制**
228
+ - 基于文件锁,依赖文件系统
229
+ - 在某些网络文件系统上可能不工作
230
+ - 需要手动清理僵尸锁文件
231
+
232
+ 2. **性能限制**
233
+ - 每次任务变更都写入文件
234
+ - 未来可考虑批量保存或延迟写入
235
+
236
+ 3. **功能限制**
237
+ - 没有实现jitter机制(阶段二)
238
+ - 没有自动过期机制(阶段三)
239
+ - 没有teammate支持(阶段三)
240
+
241
+ ## 总结
242
+
243
+ 本次重构成功实现了 **durable持久化存储**、**scheduler lock** 和 **auto-expiry** 三个核心功能,完全向后兼容,所有单元测试通过。用户现在可以:
244
+
245
+ 1. ✅ 创建跨会话保持的durable任务
246
+ 2. ✅ 在多进程环境下安全运行durable任务
247
+ 3. ✅ 自动过期防止僵尸任务(7天)
248
+ 4. ✅ 继续使用现有的session-only任务
249
+ 5. ✅ 享受完整的命令行界面和帮助文档
250
+
251
251
  重构按照计划顺利完成,代码质量高,测试覆盖充分,文档完善。建议根据实际使用情况决定是否进入阶段二的架构优化。