@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,67 +1,67 @@
1
- ---
2
- name: network-routing
3
- description: Decide whether a task should use NanoPencil's web_search, link_world tools, or browser automation.
4
- ---
5
-
6
- # Network Routing
7
-
8
- NanoPencil has two different network paths:
9
-
10
- - `web_search` and `web_fetch` when those high-level tools are actually available in the current session
11
- - `link_world_*` as the durable lower-level integration path
12
- - `browser` and `browser_admin` for direct browser control and page interaction
13
-
14
- Choose the path by task shape, not by habit.
15
-
16
- ## Use `web_search` First
17
-
18
- Use `web_search` when it is available and the user needs:
19
-
20
- - current facts
21
- - recent news
22
- - API/library documentation lookup
23
- - general web research
24
- - "what is", "find", "latest", "look up", "compare", or "summarize" style requests
25
-
26
- If setup is uncertain, call `link_world_admin` with `status` or `doctor` first.
27
-
28
- ## Use `web_fetch` When The URL Is Known
29
-
30
- Use `web_fetch` when it is available and:
31
-
32
- - the user already gave a URL
33
- - a prior search step found the exact page you need
34
- - you need page content, not browser interaction
35
- - the task is fetch-and-read rather than click-and-drive
36
-
37
- ## Use `browser` First
38
-
39
- Use `browser` when the user needs:
40
-
41
- - login-gated pages
42
- - clicking, typing, uploads, downloads, tabs, screenshots
43
- - form submission
44
- - navigating a live web app
45
- - inspecting visible UI state
46
- - browser-based verification
47
-
48
- If setup is uncertain, call `browser_admin` with `status` or `setup` first.
49
-
50
- ## Fallback Order
51
-
52
- 1. If `web_search` is available, use it for current knowledge discovery.
53
- 2. If `web_fetch` is available and the target URL is already known, use it.
54
- 3. If the answer requires interacting with a page, switch to `browser`.
55
- 4. If high-level link-world tools are unavailable but internet runtime is present, use `link_world_exec`.
56
- 5. Only fall back to `bash` for external CLIs when the dedicated tools are unavailable.
57
-
58
- ## Working Rule
59
-
60
- Prefer NanoPencil's named tools over raw shell commands. The integration boundary should stay inside:
61
-
62
- - `link_world_admin`
63
- - `web_search`
64
- - `web_fetch`
65
- - `link_world_exec`
66
- - `browser_admin`
67
- - `browser`
1
+ ---
2
+ name: network-routing
3
+ description: Decide whether a task should use NanoPencil's web_search, link_world tools, or browser automation.
4
+ ---
5
+
6
+ # Network Routing
7
+
8
+ NanoPencil has two different network paths:
9
+
10
+ - `web_search` and `web_fetch` when those high-level tools are actually available in the current session
11
+ - `link_world_*` as the durable lower-level integration path
12
+ - `browser` and `browser_admin` for direct browser control and page interaction
13
+
14
+ Choose the path by task shape, not by habit.
15
+
16
+ ## Use `web_search` First
17
+
18
+ Use `web_search` when it is available and the user needs:
19
+
20
+ - current facts
21
+ - recent news
22
+ - API/library documentation lookup
23
+ - general web research
24
+ - "what is", "find", "latest", "look up", "compare", or "summarize" style requests
25
+
26
+ If setup is uncertain, call `link_world_admin` with `status` or `doctor` first.
27
+
28
+ ## Use `web_fetch` When The URL Is Known
29
+
30
+ Use `web_fetch` when it is available and:
31
+
32
+ - the user already gave a URL
33
+ - a prior search step found the exact page you need
34
+ - you need page content, not browser interaction
35
+ - the task is fetch-and-read rather than click-and-drive
36
+
37
+ ## Use `browser` First
38
+
39
+ Use `browser` when the user needs:
40
+
41
+ - login-gated pages
42
+ - clicking, typing, uploads, downloads, tabs, screenshots
43
+ - form submission
44
+ - navigating a live web app
45
+ - inspecting visible UI state
46
+ - browser-based verification
47
+
48
+ If setup is uncertain, call `browser_admin` with `status` or `setup` first.
49
+
50
+ ## Fallback Order
51
+
52
+ 1. If `web_search` is available, use it for current knowledge discovery.
53
+ 2. If `web_fetch` is available and the target URL is already known, use it.
54
+ 3. If the answer requires interacting with a page, switch to `browser`.
55
+ 4. If high-level link-world tools are unavailable but internet runtime is present, use `link_world_exec`.
56
+ 5. Only fall back to `bash` for external CLIs when the dedicated tools are unavailable.
57
+
58
+ ## Working Rule
59
+
60
+ Prefer NanoPencil's named tools over raw shell commands. The integration boundary should stay inside:
61
+
62
+ - `link_world_admin`
63
+ - `web_search`
64
+ - `web_fetch`
65
+ - `link_world_exec`
66
+ - `browser_admin`
67
+ - `browser`
@@ -1,92 +1,92 @@
1
- # Loop Extension
2
-
3
- `/loop` schedules a recurring prompt or slash command for the current session.
4
- Uses the unified **cron scheduler** architecture per the refactoring plan.
5
-
6
- For the autonomous "keep digging until done" runner, see the sibling
7
- [`grub` extension](../grub/README.md).
8
-
9
- ## Architecture
10
-
11
- ```
12
- /loop command ──→ addCronTask ──→ unified store ──→ cron scheduler ──→ onFire ──→ dispatch
13
- │ │
14
- CronCreate tool file watcher (3s reload)
15
- CronDelete tool jitter + lock
16
- CronList tool 7-day expiry
17
- ```
18
-
19
- **Key design decisions**:
20
- - Single scheduler (cron scheduler) for all tasks
21
- - Single storage (`.nanopencil/cron-tasks.json` for durable, memory for session)
22
- - `/loop` command and CronCreate tool both use `addCronTask`
23
- - Enhanced features (--name, --max, --quiet, pause/resume) built on top
24
-
25
- ## Quick start
26
-
27
- ```
28
- /loop check the build # every 10m (default)
29
- /loop 5m /grub status # slash command every 5 minutes
30
- /loop every 10m Review test failures
31
- /loop Drink water every 30m --name hydrate --max 8 --quiet
32
- /loop Check build every 5m --durable # persists across sessions
33
- ```
34
-
35
- ## Manage
36
-
37
- ```
38
- /loop list # all scheduled loops
39
- /loop status <ref> # detail one loop (ref = name or id)
40
- /loop pause <ref>
41
- /loop resume <ref>
42
- /loop run <ref> # fire immediately
43
- /loop cancel <ref> # remove one
44
- /loop clear # remove all
45
- ```
46
-
47
- `<ref>` can be either the auto-generated id or the `--name` slug.
48
-
49
- ## Flags
50
-
51
- - `--name <slug>` — give the loop a friendly handle so you can `pause hydrate`
52
- instead of memorising hex ids.
53
- - `--max <n>` — auto-cancel after `n` runs.
54
- - `--quiet` (or `-q`) — suppress per-tick UI messages. Errors and terminal
55
- events still surface; routine ticks are still recorded via `appendEntry`.
56
- - `--durable` (or `-d`) — persist the loop across sessions. Durable loops are
57
- saved to `.nanopencil/cron-tasks.json` and will resume when you reopen the
58
- project.
59
-
60
- ## Notes
61
-
62
- - By default, loops are **session-scoped**: closing the session clears them.
63
- - Use `--durable` to persist loops across sessions.
64
- - Durable loops are stored in `.nanopencil/cron-tasks.json` in your project
65
- directory.
66
- - **Auto-expiry**: Durable loops automatically expire after 7 days to prevent
67
- zombie tasks from accumulating.
68
- - Due tasks wait for the agent to be idle; missed intervals collapse to one
69
- pending run.
70
- - Slash-command payloads are detected at parse time and dispatched through
71
- `executeCommand`; everything else is delivered through `sendUserMessage` as
72
- a follow-up turn.
73
- - After each loop tick the last assistant message is captured (truncated to
74
- 120 chars) and shown in `/loop status <ref>` as `Last output`.
75
- - Supports `s/m/h/d` durations and `hourly`/`daily` shortcuts.
76
- - **Jitter**: Tasks have deterministic jitter (based on task ID) to avoid
77
- traffic spikes at round times.
78
- - **Scheduler lock**: Multiple sessions in the same project use proper-lockfile
79
- to prevent duplicate task execution.
80
-
81
- ## Cron Tools
82
-
83
- The extension also registers three tools for the model to use directly:
84
-
85
- | Tool | Purpose |
86
- |------|---------|
87
- | `CronCreate` | Create a scheduled task with cron expression |
88
- | `CronDelete` | Delete a scheduled task by ID |
89
- | `CronList` | List all active scheduled tasks |
90
-
91
- This allows the model to create and manage scheduled tasks through natural
92
- language understanding, following the refactoring plan's architecture.
1
+ # Loop Extension
2
+
3
+ `/loop` schedules a recurring prompt or slash command for the current session.
4
+ Uses the unified **cron scheduler** architecture per the refactoring plan.
5
+
6
+ For the autonomous "keep digging until done" runner, see the sibling
7
+ [`grub` extension](../grub/README.md).
8
+
9
+ ## Architecture
10
+
11
+ ```
12
+ /loop command ──→ addCronTask ──→ unified store ──→ cron scheduler ──→ onFire ──→ dispatch
13
+ │ │
14
+ CronCreate tool file watcher (3s reload)
15
+ CronDelete tool jitter + lock
16
+ CronList tool 7-day expiry
17
+ ```
18
+
19
+ **Key design decisions**:
20
+ - Single scheduler (cron scheduler) for all tasks
21
+ - Single storage (`.nanopencil/cron-tasks.json` for durable, memory for session)
22
+ - `/loop` command and CronCreate tool both use `addCronTask`
23
+ - Enhanced features (--name, --max, --quiet, pause/resume) built on top
24
+
25
+ ## Quick start
26
+
27
+ ```
28
+ /loop check the build # every 10m (default)
29
+ /loop 5m /grub status # slash command every 5 minutes
30
+ /loop every 10m Review test failures
31
+ /loop Drink water every 30m --name hydrate --max 8 --quiet
32
+ /loop Check build every 5m --durable # persists across sessions
33
+ ```
34
+
35
+ ## Manage
36
+
37
+ ```
38
+ /loop list # all scheduled loops
39
+ /loop status <ref> # detail one loop (ref = name or id)
40
+ /loop pause <ref>
41
+ /loop resume <ref>
42
+ /loop run <ref> # fire immediately
43
+ /loop cancel <ref> # remove one
44
+ /loop clear # remove all
45
+ ```
46
+
47
+ `<ref>` can be either the auto-generated id or the `--name` slug.
48
+
49
+ ## Flags
50
+
51
+ - `--name <slug>` — give the loop a friendly handle so you can `pause hydrate`
52
+ instead of memorising hex ids.
53
+ - `--max <n>` — auto-cancel after `n` runs.
54
+ - `--quiet` (or `-q`) — suppress per-tick UI messages. Errors and terminal
55
+ events still surface; routine ticks are still recorded via `appendEntry`.
56
+ - `--durable` (or `-d`) — persist the loop across sessions. Durable loops are
57
+ saved to `.nanopencil/cron-tasks.json` and will resume when you reopen the
58
+ project.
59
+
60
+ ## Notes
61
+
62
+ - By default, loops are **session-scoped**: closing the session clears them.
63
+ - Use `--durable` to persist loops across sessions.
64
+ - Durable loops are stored in `.nanopencil/cron-tasks.json` in your project
65
+ directory.
66
+ - **Auto-expiry**: Durable loops automatically expire after 7 days to prevent
67
+ zombie tasks from accumulating.
68
+ - Due tasks wait for the agent to be idle; missed intervals collapse to one
69
+ pending run.
70
+ - Slash-command payloads are detected at parse time and dispatched through
71
+ `executeCommand`; everything else is delivered through `sendUserMessage` as
72
+ a follow-up turn.
73
+ - After each loop tick the last assistant message is captured (truncated to
74
+ 120 chars) and shown in `/loop status <ref>` as `Last output`.
75
+ - Supports `s/m/h/d` durations and `hourly`/`daily` shortcuts.
76
+ - **Jitter**: Tasks have deterministic jitter (based on task ID) to avoid
77
+ traffic spikes at round times.
78
+ - **Scheduler lock**: Multiple sessions in the same project use proper-lockfile
79
+ to prevent duplicate task execution.
80
+
81
+ ## Cron Tools
82
+
83
+ The extension also registers three tools for the model to use directly:
84
+
85
+ | Tool | Purpose |
86
+ |------|---------|
87
+ | `CronCreate` | Create a scheduled task with cron expression |
88
+ | `CronDelete` | Delete a scheduled task by ID |
89
+ | `CronList` | List all active scheduled tasks |
90
+
91
+ This allows the model to create and manage scheduled tasks through natural
92
+ language understanding, following the refactoring plan's architecture.
@@ -1,68 +1,68 @@
1
- ---
2
- name: figma-design
3
- description: Use this skill when the user wants NanoPencil to inspect, create, or edit designs in Figma through MCP.
4
- ---
5
-
6
- # Figma Design
7
-
8
- Use this skill when the user asks NanoPencil to:
9
-
10
- - Generate a design in Figma
11
- - Edit an existing Figma file
12
- - Turn requirements into Figma frames, components, or styles
13
- - Read design context from Figma before implementing UI
14
-
15
- ## Preferred integration path
16
-
17
- Prefer the official Figma Remote MCP server first. Use the desktop server as a fallback or as an additional local-context path.
18
-
19
- NanoPencil includes two built-in disabled MCP presets:
20
-
21
- - Server ID: `figma-remote`
22
- - URL: `https://mcp.figma.com/mcp`
23
- - Auth: `/figma auth` tries a standalone browser OAuth flow first. If Figma blocks first-time client registration on this machine, NanoPencil can fall back to importing an existing official local session.
24
-
25
- - Server ID: `figma-desktop`
26
- - URL: `http://127.0.0.1:3845/mcp`
27
-
28
- ## First-time setup flow
29
-
30
- If the Figma MCP tools are not available yet:
31
-
32
- 1. Prefer the remote setup first:
33
-
34
- ```text
35
- /figma auth
36
- /figma remote
37
- ```
38
-
39
- If the user already has dedicated Figma OAuth credentials for NanoPencil, they can also set:
40
-
41
- ```text
42
- NANOPENCIL_FIGMA_CLIENT_ID
43
- NANOPENCIL_FIGMA_CLIENT_SECRET
44
- ```
45
-
46
- 2. If the user wants the local desktop route instead, ask them to open the Figma desktop app and enable the desktop MCP server in Figma Dev Mode.
47
- 3. Then tell them to run:
48
-
49
- ```text
50
- /figma setup
51
- ```
52
-
53
- 4. After reload, check whether MCP tools from a Figma server are available.
54
-
55
- ## How to work once Figma tools are available
56
-
57
- - First inspect the available Figma MCP tools in the current session.
58
- - Prefer reading the current file or selection context before writing.
59
- - Then create or update frames, components, text, styles, or variables as needed.
60
- - When the user wants generated UI, write the result into Figma instead of only describing it in chat.
61
-
62
- ## Important guidance
63
-
64
- - Prefer the remote path when possible because it is closer to the Codex/Claude-style setup.
65
- - If the remote path is not authenticated yet, guide the user through `/figma auth` before falling back to desktop.
66
- - The official write-capable path is MCP, not the read-heavy REST API.
67
- - If tools are missing after enabling either server, remind the user to run `/reload`.
68
- - If the remote path fails but the user already has a valid local desktop MCP server, use the desktop route so the design task can still move forward.
1
+ ---
2
+ name: figma-design
3
+ description: Use this skill when the user wants NanoPencil to inspect, create, or edit designs in Figma through MCP.
4
+ ---
5
+
6
+ # Figma Design
7
+
8
+ Use this skill when the user asks NanoPencil to:
9
+
10
+ - Generate a design in Figma
11
+ - Edit an existing Figma file
12
+ - Turn requirements into Figma frames, components, or styles
13
+ - Read design context from Figma before implementing UI
14
+
15
+ ## Preferred integration path
16
+
17
+ Prefer the official Figma Remote MCP server first. Use the desktop server as a fallback or as an additional local-context path.
18
+
19
+ NanoPencil includes two built-in disabled MCP presets:
20
+
21
+ - Server ID: `figma-remote`
22
+ - URL: `https://mcp.figma.com/mcp`
23
+ - Auth: `/figma auth` tries a standalone browser OAuth flow first. If Figma blocks first-time client registration on this machine, NanoPencil can fall back to importing an existing official local session.
24
+
25
+ - Server ID: `figma-desktop`
26
+ - URL: `http://127.0.0.1:3845/mcp`
27
+
28
+ ## First-time setup flow
29
+
30
+ If the Figma MCP tools are not available yet:
31
+
32
+ 1. Prefer the remote setup first:
33
+
34
+ ```text
35
+ /figma auth
36
+ /figma remote
37
+ ```
38
+
39
+ If the user already has dedicated Figma OAuth credentials for NanoPencil, they can also set:
40
+
41
+ ```text
42
+ NANOPENCIL_FIGMA_CLIENT_ID
43
+ NANOPENCIL_FIGMA_CLIENT_SECRET
44
+ ```
45
+
46
+ 2. If the user wants the local desktop route instead, ask them to open the Figma desktop app and enable the desktop MCP server in Figma Dev Mode.
47
+ 3. Then tell them to run:
48
+
49
+ ```text
50
+ /figma setup
51
+ ```
52
+
53
+ 4. After reload, check whether MCP tools from a Figma server are available.
54
+
55
+ ## How to work once Figma tools are available
56
+
57
+ - First inspect the available Figma MCP tools in the current session.
58
+ - Prefer reading the current file or selection context before writing.
59
+ - Then create or update frames, components, text, styles, or variables as needed.
60
+ - When the user wants generated UI, write the result into Figma instead of only describing it in chat.
61
+
62
+ ## Important guidance
63
+
64
+ - Prefer the remote path when possible because it is closer to the Codex/Claude-style setup.
65
+ - If the remote path is not authenticated yet, guide the user through `/figma auth` before falling back to desktop.
66
+ - The official write-capable path is MCP, not the read-heavy REST API.
67
+ - If tools are missing after enabling either server, remind the user to run `/reload`.
68
+ - If the remote path fails but the user already has a valid local desktop MCP server, use the desktop route so the design task can still move forward.
@@ -1,85 +1,85 @@
1
- ---
2
- name: mcp-management
3
- description: Use this skill when the user asks to install, configure, debug, enable, or disable MCP servers or MCP tools in NanoPencil.
4
- ---
5
-
6
- # MCP Management
7
-
8
- Use this skill when the user asks for any of the following:
9
-
10
- - Install a new MCP server
11
- - Configure an existing MCP server
12
- - Enable or disable MCP servers in NanoPencil
13
- - Debug why MCP tools are missing
14
- - Add API keys or environment variables for an MCP server
15
-
16
- ## What NanoPencil already does
17
-
18
- - MCP is enabled by default in NanoPencil unless the user launched it with `--no-mcp` or in offline mode.
19
- - NanoPencil reads MCP server definitions from `~/.nanopencil/agent/mcp.json`.
20
- - MCP tools are loaded into the current session at startup and on `/reload`.
21
-
22
- Important:
23
-
24
- - Editing `mcp.json` alone does not make new MCP tools appear immediately in the current session.
25
- - After changing MCP config, tell the user to run `/reload`, or explain that a restart/reload is needed before the new tools can be used.
26
-
27
- ## How to inspect the current MCP setup
28
-
29
- 1. Read `~/.nanopencil/agent/mcp.json` if it exists.
30
- 2. Check whether the target server already exists in `mcpServers`.
31
- 3. Check whether it is enabled.
32
- 4. Check whether required environment variables are present.
33
-
34
- If the file does not exist, NanoPencil will create a default one when MCP config is first loaded.
35
-
36
- ## How to add a new MCP server
37
-
38
- 1. Find the official install/start command from the server's documentation.
39
- 2. Prefer stable commands such as:
40
- - `npx -y <package>`
41
- - `uvx <package>`
42
- - `python -m <module>`
43
- - `node /absolute/path/to/server.js`
44
- 3. Add a server entry to `~/.nanopencil/agent/mcp.json`.
45
- 4. Set `enabled: true` only if the command and required credentials are ready.
46
- 5. Tell the user that `/reload` is required to apply the change.
47
-
48
- ## Config shape reminder
49
-
50
- Use this structure:
51
-
52
- ```json
53
- {
54
- "mcpServers": [
55
- {
56
- "id": "example",
57
- "name": "Example",
58
- "command": "npx",
59
- "args": ["-y", "@example/server"],
60
- "enabled": true,
61
- "transport": "stdio",
62
- "toolTimeout": 30000
63
- }
64
- ]
65
- }
66
- ```
67
-
68
- For remote HTTP/SSE MCP servers, use the server's documented transport and URL fields supported by NanoPencil's MCP config.
69
-
70
- ## Safe operating rules
71
-
72
- - Do not invent MCP package names. Check the server's official docs first.
73
- - Do not claim the new MCP tools are ready until the config is written and the user has reloaded.
74
- - If credentials are required, ask the user for the missing values instead of guessing.
75
- - If an install command modifies global system state, tell the user what will be installed.
76
-
77
- ## Good response pattern
78
-
79
- When the user asks you to install an MCP server:
80
-
81
- 1. Inspect `mcp.json`
82
- 2. Install or configure the server
83
- 3. Update `mcp.json`
84
- 4. Tell the user exactly what changed
85
- 5. Ask them to run `/reload` if the current session needs to pick up the new tools
1
+ ---
2
+ name: mcp-management
3
+ description: Use this skill when the user asks to install, configure, debug, enable, or disable MCP servers or MCP tools in NanoPencil.
4
+ ---
5
+
6
+ # MCP Management
7
+
8
+ Use this skill when the user asks for any of the following:
9
+
10
+ - Install a new MCP server
11
+ - Configure an existing MCP server
12
+ - Enable or disable MCP servers in NanoPencil
13
+ - Debug why MCP tools are missing
14
+ - Add API keys or environment variables for an MCP server
15
+
16
+ ## What NanoPencil already does
17
+
18
+ - MCP is enabled by default in NanoPencil unless the user launched it with `--no-mcp` or in offline mode.
19
+ - NanoPencil reads MCP server definitions from `~/.nanopencil/agent/mcp.json`.
20
+ - MCP tools are loaded into the current session at startup and on `/reload`.
21
+
22
+ Important:
23
+
24
+ - Editing `mcp.json` alone does not make new MCP tools appear immediately in the current session.
25
+ - After changing MCP config, tell the user to run `/reload`, or explain that a restart/reload is needed before the new tools can be used.
26
+
27
+ ## How to inspect the current MCP setup
28
+
29
+ 1. Read `~/.nanopencil/agent/mcp.json` if it exists.
30
+ 2. Check whether the target server already exists in `mcpServers`.
31
+ 3. Check whether it is enabled.
32
+ 4. Check whether required environment variables are present.
33
+
34
+ If the file does not exist, NanoPencil will create a default one when MCP config is first loaded.
35
+
36
+ ## How to add a new MCP server
37
+
38
+ 1. Find the official install/start command from the server's documentation.
39
+ 2. Prefer stable commands such as:
40
+ - `npx -y <package>`
41
+ - `uvx <package>`
42
+ - `python -m <module>`
43
+ - `node /absolute/path/to/server.js`
44
+ 3. Add a server entry to `~/.nanopencil/agent/mcp.json`.
45
+ 4. Set `enabled: true` only if the command and required credentials are ready.
46
+ 5. Tell the user that `/reload` is required to apply the change.
47
+
48
+ ## Config shape reminder
49
+
50
+ Use this structure:
51
+
52
+ ```json
53
+ {
54
+ "mcpServers": [
55
+ {
56
+ "id": "example",
57
+ "name": "Example",
58
+ "command": "npx",
59
+ "args": ["-y", "@example/server"],
60
+ "enabled": true,
61
+ "transport": "stdio",
62
+ "toolTimeout": 30000
63
+ }
64
+ ]
65
+ }
66
+ ```
67
+
68
+ For remote HTTP/SSE MCP servers, use the server's documented transport and URL fields supported by NanoPencil's MCP config.
69
+
70
+ ## Safe operating rules
71
+
72
+ - Do not invent MCP package names. Check the server's official docs first.
73
+ - Do not claim the new MCP tools are ready until the config is written and the user has reloaded.
74
+ - If credentials are required, ask the user for the missing values instead of guessing.
75
+ - If an install command modifies global system state, tell the user what will be installed.
76
+
77
+ ## Good response pattern
78
+
79
+ When the user asks you to install an MCP server:
80
+
81
+ 1. Inspect `mcp.json`
82
+ 2. Install or configure the server
83
+ 3. Update `mcp.json`
84
+ 4. Tell the user exactly what changed
85
+ 5. Ask them to run `/reload` if the current session needs to pick up the new tools
@@ -1,15 +1,15 @@
1
- # extensions/builtin/recap/
2
-
3
- > P2 | Parent: ../AGENT.md
4
-
5
- Member List
6
- index.ts: recapExtension entry — registers /recap command (Free deterministic by default; --smart opts into LLM-polished synthesis) and ※ recap message renderer; on-demand only, no auto trigger
7
- recap-types.ts: RECAP_MESSAGE_TYPE constant, RecapEntry / RecapSource / RecapTriggerReason / RecapSettings types, RECAP_DEFAULTS conservative settings
8
- recap-budget.ts: estimateInputTokens() char-count pre-flight estimate, checkPerCallBudget() pre-call hard-cap enforcement
9
- recap-extractor.ts: extractFreeRecap() + formatFreeRecap() + walkSessionActivity() — zero-LLM deterministic Free path; goal=longest substantive user message, facts=tool/file frequency top-3, next=question-mark detection
10
- recap-synthesizer.ts: buildRecapContext() returns prompt + activity counts (userTurns/assistantTurns/toolCalls) via shared walkSessionActivity walker, hasMeaningfulActivity() pre-check used by handler before "Synthesizing…" notify, synthesizeSmartRecap() runs completeSimpleWithUsage with three-clause system prompt, surfaces real provider usage, returns empty_session as a defensive fallback
11
- recap-renderer.ts: createRecapRenderer() — italic dim ※ recap with `{in} in / {out} out · ~${cost}` badge, no background block (low-weight in-conversation hint), Text-only (no Markdown coupling)
12
-
13
- Rule: Members complete, one item per line, parent links valid, precise terms first
14
-
15
- [COVENANT]: Update this file header on changes and verify against parent AGENT.md
1
+ # extensions/builtin/recap/
2
+
3
+ > P2 | Parent: ../AGENT.md
4
+
5
+ Member List
6
+ index.ts: recapExtension entry — registers /recap command (Free deterministic by default; --smart opts into LLM-polished synthesis) and ※ recap message renderer; on-demand only, no auto trigger
7
+ recap-types.ts: RECAP_MESSAGE_TYPE constant, RecapEntry / RecapSource / RecapTriggerReason / RecapSettings types, RECAP_DEFAULTS conservative settings
8
+ recap-budget.ts: estimateInputTokens() char-count pre-flight estimate, checkPerCallBudget() pre-call hard-cap enforcement
9
+ recap-extractor.ts: extractFreeRecap() + formatFreeRecap() + walkSessionActivity() — zero-LLM deterministic Free path; goal=longest substantive user message, facts=tool/file frequency top-3, next=question-mark detection
10
+ recap-synthesizer.ts: buildRecapContext() returns prompt + activity counts (userTurns/assistantTurns/toolCalls) via shared walkSessionActivity walker, hasMeaningfulActivity() pre-check used by handler before "Synthesizing…" notify, synthesizeSmartRecap() runs completeSimpleWithUsage with three-clause system prompt, surfaces real provider usage, returns empty_session as a defensive fallback
11
+ recap-renderer.ts: createRecapRenderer() — italic dim ※ recap with `{in} in / {out} out · ~${cost}` badge, no background block (low-weight in-conversation hint), Text-only (no Markdown coupling)
12
+
13
+ Rule: Members complete, one item per line, parent links valid, precise terms first
14
+
15
+ [COVENANT]: Update this file header on changes and verify against parent AGENT.md