@pencil-agent/nano-pencil 2.0.1 → 2.0.2

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 (186) 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/discipline/skills/brainstorming/SKILL.md +33 -33
  118. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
  119. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
  120. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
  121. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
  122. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
  123. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
  124. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
  125. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
  126. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
  127. package/dist/extensions/builtin/goal/README.md +67 -67
  128. package/dist/extensions/builtin/grub/README.md +112 -112
  129. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
  130. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
  131. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
  132. package/dist/extensions/builtin/link-world/linkworld.md +313 -313
  133. package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -67
  134. package/dist/extensions/builtin/loop/README.md +92 -92
  135. package/dist/extensions/builtin/mcp/figma-design.md +68 -68
  136. package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
  137. package/dist/extensions/builtin/recap/AGENT.md +15 -15
  138. package/dist/extensions/builtin/sal/README.md +72 -72
  139. package/dist/extensions/builtin/security-audit/README.md +289 -289
  140. package/dist/extensions/builtin/team/AGENT.md +112 -112
  141. package/dist/extensions/builtin/team/TESTING.md +299 -299
  142. package/dist/extensions/builtin/token-save/README.md +56 -56
  143. package/dist/extensions/optional/AGENT.md +10 -10
  144. package/dist/modes/interactive/controllers/input-submit-controller.js +2 -2
  145. package/dist/modes/interactive/controllers/stream-render-controller.js +2 -2
  146. package/dist/modes/interactive/interactive-mode.js +19 -19
  147. package/dist/modes/interactive/theme/dark.json +85 -85
  148. package/dist/modes/interactive/theme/light.json +84 -84
  149. package/dist/modes/interactive/theme/theme-schema.json +335 -335
  150. package/dist/modes/interactive/theme/warm.json +81 -81
  151. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
  152. package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +1 -1
  153. 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
  154. package/docs/SDK-TESTING.md +364 -0
  155. package/docs/codex-goal-command-impl.md +1055 -1055
  156. package/docs/codex-goal-vs-grub.md +500 -500
  157. package/docs/custom-provider.md +27 -27
  158. package/docs/extensions.md +27 -27
  159. package/docs/keybindings.md +27 -27
  160. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
  161. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
  162. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
  163. 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
  164. 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
  165. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
  166. package/docs/loop-usage-examples.md +214 -214
  167. package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
  168. package/docs/models.md +27 -27
  169. package/docs/packages.md +27 -27
  170. package/docs/pi-design-philosophy.md +457 -457
  171. package/docs/planmode.md +1987 -1987
  172. package/docs/prompt-templates.md +27 -27
  173. package/docs/providers.md +27 -27
  174. package/docs/sdk.md +27 -27
  175. package/docs/skills.md +27 -27
  176. package/docs/startup-performance-optimization.md +301 -0
  177. package/docs/themes.md +27 -27
  178. package/docs/tui.md +27 -27
  179. package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
  180. package/package.json +190 -190
  181. package/docs/cc-agent-design.md +0 -1297
  182. package/docs/cc-tui-design.md +0 -1333
  183. package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +0 -170
  184. package/docs/scan-report.md +0 -3820
  185. package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
  186. 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,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
  重构按照计划顺利完成,代码质量高,测试覆盖充分,文档完善。建议根据实际使用情况决定是否进入阶段二的架构优化。