openclaw-node-harness 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (779) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/bin/discord-read.js +228 -0
  4. package/bin/fleet-deploy.js +365 -0
  5. package/bin/lane-watchdog.js +232 -0
  6. package/bin/mesh-agent.js +714 -0
  7. package/bin/mesh-bridge.js +535 -0
  8. package/bin/mesh-deploy-listener.js +322 -0
  9. package/bin/mesh-deploy.js +1048 -0
  10. package/bin/mesh-health-publisher.js +247 -0
  11. package/bin/mesh-task-daemon.js +451 -0
  12. package/bin/mesh-tool-discord.js +293 -0
  13. package/bin/mesh.js +649 -0
  14. package/boot/manifest.yaml +187 -0
  15. package/cli.js +35 -0
  16. package/config/daemon.json.template +16 -0
  17. package/config/obsidian-sync.json.template +39 -0
  18. package/config/openclaw.json.template +124 -0
  19. package/config/transcript-sources.json.template +22 -0
  20. package/identity/AGENTS.md +201 -0
  21. package/identity/CLAUDE.md +64 -0
  22. package/identity/DELEGATION.md +304 -0
  23. package/identity/HEARTBEAT.md +163 -0
  24. package/identity/MEMORY_SPEC.md +368 -0
  25. package/identity/PRINCIPLES.md +81 -0
  26. package/identity/SOUL.md +48 -0
  27. package/identity/TOOLS.md +47 -0
  28. package/install.sh +895 -0
  29. package/lib/agent-activity.js +390 -0
  30. package/lib/kanban-io.js +352 -0
  31. package/lib/mesh-registry.js +194 -0
  32. package/lib/mesh-roles.js +13 -0
  33. package/lib/mesh-tasks.js +306 -0
  34. package/lib/nats-resolve.js +108 -0
  35. package/mission-control/README.md +36 -0
  36. package/mission-control/drizzle/0000_simple_silhouette.sql +62 -0
  37. package/mission-control/drizzle/meta/0000_snapshot.json +413 -0
  38. package/mission-control/drizzle/meta/_journal.json +13 -0
  39. package/mission-control/drizzle.config.ts +13 -0
  40. package/mission-control/eslint.config.mjs +18 -0
  41. package/mission-control/next.config.ts +7 -0
  42. package/mission-control/package-lock.json +10518 -0
  43. package/mission-control/package.json +49 -0
  44. package/mission-control/postcss.config.mjs +7 -0
  45. package/mission-control/public/file.svg +1 -0
  46. package/mission-control/public/globe.svg +1 -0
  47. package/mission-control/public/next.svg +1 -0
  48. package/mission-control/public/vercel.svg +1 -0
  49. package/mission-control/public/window.svg +1 -0
  50. package/mission-control/scripts/enrich-descriptions.js +193 -0
  51. package/mission-control/scripts/gen-chronology.js +102 -0
  52. package/mission-control/scripts/import-pipeline-v2.js +523 -0
  53. package/mission-control/scripts/import-pipeline.js +295 -0
  54. package/mission-control/src/app/api/activity/live/route.ts +27 -0
  55. package/mission-control/src/app/api/activity/route.ts +47 -0
  56. package/mission-control/src/app/api/burndown/route.ts +112 -0
  57. package/mission-control/src/app/api/critical-path/route.ts +159 -0
  58. package/mission-control/src/app/api/dependencies/route.ts +176 -0
  59. package/mission-control/src/app/api/memory/categories/route.ts +93 -0
  60. package/mission-control/src/app/api/memory/consolidate/route.ts +107 -0
  61. package/mission-control/src/app/api/memory/doc/route.ts +89 -0
  62. package/mission-control/src/app/api/memory/flush/route.ts +129 -0
  63. package/mission-control/src/app/api/memory/graph/route.ts +105 -0
  64. package/mission-control/src/app/api/memory/items/route.ts +86 -0
  65. package/mission-control/src/app/api/memory/list/route.ts +48 -0
  66. package/mission-control/src/app/api/memory/retrieve/route.ts +51 -0
  67. package/mission-control/src/app/api/memory/search/route.ts +143 -0
  68. package/mission-control/src/app/api/memory/sync/route.ts +23 -0
  69. package/mission-control/src/app/api/memory/wikilinks/route.ts +75 -0
  70. package/mission-control/src/app/api/mesh/events/route.ts +67 -0
  71. package/mission-control/src/app/api/mesh/nodes/route.ts +221 -0
  72. package/mission-control/src/app/api/mesh/tokens/route.ts +133 -0
  73. package/mission-control/src/app/api/projects/route.ts +102 -0
  74. package/mission-control/src/app/api/resolve-path/route.ts +92 -0
  75. package/mission-control/src/app/api/scheduler/tick/route.ts +38 -0
  76. package/mission-control/src/app/api/scheduler/waves/route.ts +54 -0
  77. package/mission-control/src/app/api/screenshot/route.ts +127 -0
  78. package/mission-control/src/app/api/settings/gateway/route.ts +92 -0
  79. package/mission-control/src/app/api/skills/[id]/health/route.ts +57 -0
  80. package/mission-control/src/app/api/skills/list/route.ts +41 -0
  81. package/mission-control/src/app/api/souls/[id]/evolution/route.ts +253 -0
  82. package/mission-control/src/app/api/souls/[id]/prompt/route.ts +205 -0
  83. package/mission-control/src/app/api/souls/[id]/propagate/route.ts +146 -0
  84. package/mission-control/src/app/api/souls/route.ts +174 -0
  85. package/mission-control/src/app/api/tasks/[id]/handoff/route.ts +115 -0
  86. package/mission-control/src/app/api/tasks/[id]/route.ts +266 -0
  87. package/mission-control/src/app/api/tasks/[id]/tree/route.ts +94 -0
  88. package/mission-control/src/app/api/tasks/route.ts +253 -0
  89. package/mission-control/src/app/api/tts/route.ts +47 -0
  90. package/mission-control/src/app/api/workspace/files/route.ts +88 -0
  91. package/mission-control/src/app/api/workspace/read/route.ts +73 -0
  92. package/mission-control/src/app/burndown/page.tsx +309 -0
  93. package/mission-control/src/app/calendar/page.tsx +839 -0
  94. package/mission-control/src/app/favicon.ico +0 -0
  95. package/mission-control/src/app/globals.css +67 -0
  96. package/mission-control/src/app/graph/page.tsx +352 -0
  97. package/mission-control/src/app/layout.tsx +35 -0
  98. package/mission-control/src/app/live/page.tsx +232 -0
  99. package/mission-control/src/app/memory/page.tsx +154 -0
  100. package/mission-control/src/app/mesh/page.tsx +457 -0
  101. package/mission-control/src/app/obsidian/page.tsx +252 -0
  102. package/mission-control/src/app/page.tsx +70 -0
  103. package/mission-control/src/app/roadmap/page.tsx +1757 -0
  104. package/mission-control/src/app/settings/page.tsx +260 -0
  105. package/mission-control/src/app/souls/page.tsx +573 -0
  106. package/mission-control/src/components/board/activity-timeline.tsx +96 -0
  107. package/mission-control/src/components/board/daily-board.tsx +373 -0
  108. package/mission-control/src/components/board/kanban-board.tsx +364 -0
  109. package/mission-control/src/components/board/kanban-column.tsx +105 -0
  110. package/mission-control/src/components/board/live-stream.tsx +116 -0
  111. package/mission-control/src/components/board/skill-health-card.tsx +128 -0
  112. package/mission-control/src/components/board/status-banner.tsx +124 -0
  113. package/mission-control/src/components/board/task-card.tsx +454 -0
  114. package/mission-control/src/components/board/unified-task-dialog.tsx +1043 -0
  115. package/mission-control/src/components/layout/resizable-layout.tsx +68 -0
  116. package/mission-control/src/components/layout/sidebar.tsx +90 -0
  117. package/mission-control/src/components/live/audio-spectrum.tsx +106 -0
  118. package/mission-control/src/components/live/chat-bubble.tsx +52 -0
  119. package/mission-control/src/components/live/chat-input.tsx +92 -0
  120. package/mission-control/src/components/memory/doc-reader.tsx +172 -0
  121. package/mission-control/src/components/memory/memory-list.tsx +169 -0
  122. package/mission-control/src/components/memory/search-bar.tsx +67 -0
  123. package/mission-control/src/components/memory/search-results.tsx +149 -0
  124. package/mission-control/src/components/obsidian/backlinks-panel.tsx +52 -0
  125. package/mission-control/src/components/obsidian/file-tree.tsx +186 -0
  126. package/mission-control/src/components/obsidian/local-graph.tsx +107 -0
  127. package/mission-control/src/components/obsidian/obsidian-graph.tsx +192 -0
  128. package/mission-control/src/components/obsidian/obsidian-reader.tsx +246 -0
  129. package/mission-control/src/lib/activity.ts +29 -0
  130. package/mission-control/src/lib/config.ts +21 -0
  131. package/mission-control/src/lib/db/index.ts +429 -0
  132. package/mission-control/src/lib/db/schema.ts +218 -0
  133. package/mission-control/src/lib/gateway-notify.ts +113 -0
  134. package/mission-control/src/lib/hooks.ts +536 -0
  135. package/mission-control/src/lib/memory/categories.ts +125 -0
  136. package/mission-control/src/lib/memory/entities.ts +482 -0
  137. package/mission-control/src/lib/memory/extract.ts +369 -0
  138. package/mission-control/src/lib/memory/retrieval.ts +281 -0
  139. package/mission-control/src/lib/memory/wikilinks.ts +147 -0
  140. package/mission-control/src/lib/nats.ts +126 -0
  141. package/mission-control/src/lib/parsers/clawvault-doc.ts +98 -0
  142. package/mission-control/src/lib/parsers/daily-log.ts +73 -0
  143. package/mission-control/src/lib/parsers/memory-md.ts +81 -0
  144. package/mission-control/src/lib/parsers/task-markdown.ts +459 -0
  145. package/mission-control/src/lib/parsers/transcript.ts +209 -0
  146. package/mission-control/src/lib/scheduler.ts +394 -0
  147. package/mission-control/src/lib/speech/use-speech-pipeline.ts +176 -0
  148. package/mission-control/src/lib/sync/memory.ts +224 -0
  149. package/mission-control/src/lib/sync/tasks.ts +271 -0
  150. package/mission-control/src/lib/tts/edge.ts +31 -0
  151. package/mission-control/src/lib/tts/google.ts +78 -0
  152. package/mission-control/src/lib/tts/index.ts +39 -0
  153. package/mission-control/src/lib/tts/types.ts +18 -0
  154. package/mission-control/tsconfig.json +42 -0
  155. package/obsidian-vault/.obsidian/app.json +10 -0
  156. package/obsidian-vault/.obsidian/community-plugins.json +8 -0
  157. package/obsidian-vault/.obsidian/graph.json +40 -0
  158. package/obsidian-vault/.obsidian/plugins/obsidian-local-rest-api/main.js +58769 -0
  159. package/obsidian-vault/.obsidian/plugins/obsidian-local-rest-api/manifest.json +10 -0
  160. package/obsidian-vault/.obsidian/plugins/obsidian-local-rest-api/styles.css +47 -0
  161. package/obsidian-vault/00-meta/.gitkeep +0 -0
  162. package/obsidian-vault/01-architecture/.gitkeep +0 -0
  163. package/obsidian-vault/02-smart-contracts/.gitkeep +0 -0
  164. package/obsidian-vault/03-backend/.gitkeep +0 -0
  165. package/obsidian-vault/04-mobile/.gitkeep +0 -0
  166. package/obsidian-vault/05-ar-mapping/.gitkeep +0 -0
  167. package/obsidian-vault/06-3d-assets/.gitkeep +0 -0
  168. package/obsidian-vault/07-sound-music/.gitkeep +0 -0
  169. package/obsidian-vault/08-lore/.gitkeep +0 -0
  170. package/obsidian-vault/09-quests-playthrough/.gitkeep +0 -0
  171. package/obsidian-vault/10-economy/.gitkeep +0 -0
  172. package/obsidian-vault/11-nft-assets/.gitkeep +0 -0
  173. package/obsidian-vault/12-nft-mechanics/.gitkeep +0 -0
  174. package/obsidian-vault/13-dao-guild-social/.gitkeep +0 -0
  175. package/obsidian-vault/14-game-progression/.gitkeep +0 -0
  176. package/obsidian-vault/15-analytics/.gitkeep +0 -0
  177. package/obsidian-vault/16-security/.gitkeep +0 -0
  178. package/obsidian-vault/17-devops/.gitkeep +0 -0
  179. package/obsidian-vault/18-marketplace/.gitkeep +0 -0
  180. package/obsidian-vault/19-decisions/.gitkeep +0 -0
  181. package/obsidian-vault/20-business-strategy/.gitkeep +0 -0
  182. package/obsidian-vault/21-legal-regulatory/.gitkeep +0 -0
  183. package/obsidian-vault/nodes/.gitkeep +0 -0
  184. package/openclaw.env.example +17 -0
  185. package/package.json +45 -0
  186. package/services/launchd/ai.openclaw.gateway.plist +59 -0
  187. package/services/launchd/ai.openclaw.lane-watchdog.plist +32 -0
  188. package/services/launchd/ai.openclaw.log-rotate.plist +28 -0
  189. package/services/launchd/ai.openclaw.memory-daemon.plist +36 -0
  190. package/services/launchd/ai.openclaw.mesh-agent.plist +38 -0
  191. package/services/launchd/ai.openclaw.mesh-bridge.plist +36 -0
  192. package/services/launchd/ai.openclaw.mesh-deploy-listener.plist +33 -0
  193. package/services/launchd/ai.openclaw.mesh-health-publisher.plist +29 -0
  194. package/services/launchd/ai.openclaw.mesh-task-daemon.plist +36 -0
  195. package/services/launchd/ai.openclaw.mesh-tool-discord.plist +36 -0
  196. package/services/launchd/ai.openclaw.mission-control.plist +41 -0
  197. package/services/service-manifest.json +13 -0
  198. package/services/systemd/openclaw-gateway.service +21 -0
  199. package/services/systemd/openclaw-lane-watchdog.service +21 -0
  200. package/services/systemd/openclaw-log-rotate.service +13 -0
  201. package/services/systemd/openclaw-log-rotate.timer +9 -0
  202. package/services/systemd/openclaw-memory-daemon.service +21 -0
  203. package/services/systemd/openclaw-mesh-agent.service +19 -0
  204. package/services/systemd/openclaw-mesh-bridge.service +21 -0
  205. package/services/systemd/openclaw-mesh-deploy-listener.service +23 -0
  206. package/services/systemd/openclaw-mesh-health-publisher.service +21 -0
  207. package/services/systemd/openclaw-mesh-task-daemon.service +21 -0
  208. package/services/systemd/openclaw-mesh-tool-discord.service +21 -0
  209. package/services/systemd/openclaw-mission-control.service +22 -0
  210. package/skills/1password/.clawhub/origin.json +7 -0
  211. package/skills/1password/SKILL.md +63 -0
  212. package/skills/1password/references/cli-examples.md +29 -0
  213. package/skills/1password/references/get-started.md +17 -0
  214. package/skills/acquisition-channel-advisor/SKILL.md +643 -0
  215. package/skills/acquisition-channel-advisor/examples/conversation-flow.md +531 -0
  216. package/skills/agent-browser/.clawhub/origin.json +7 -0
  217. package/skills/agent-browser/CONTRIBUTING.md +63 -0
  218. package/skills/agent-browser/SKILL.md +338 -0
  219. package/skills/agentic-compass/.clawhub/origin.json +7 -0
  220. package/skills/agentic-compass/README.md +96 -0
  221. package/skills/agentic-compass/SKILL.md +112 -0
  222. package/skills/agentic-compass/references/README.md +5 -0
  223. package/skills/agentic-compass/scripts/agentic-compass.py +196 -0
  224. package/skills/arcane-dev-ops/SKILL.md +61 -0
  225. package/skills/arcane-dev-ops/references/checklist.md +22 -0
  226. package/skills/arcane-dev-ops/references/validation-cases.md +11 -0
  227. package/skills/arcane-dev-ops/scripts/prepush_check.sh +41 -0
  228. package/skills/auto-updater/.clawhub/origin.json +7 -0
  229. package/skills/auto-updater/SKILL.md +158 -0
  230. package/skills/auto-updater/references/agent-guide.md +152 -0
  231. package/skills/auto-updater/references/summary-examples.md +109 -0
  232. package/skills/business-health-diagnostic/SKILL.md +782 -0
  233. package/skills/byterover/.clawhub/origin.json +7 -0
  234. package/skills/byterover/SKILL.md +105 -0
  235. package/skills/byterover/TROUBLESHOOTING.md +50 -0
  236. package/skills/byterover/WORKFLOWS.md +229 -0
  237. package/skills/capability-evolver/.clawhub/origin.json +7 -0
  238. package/skills/capability-evolver/CONTRIBUTING.md +11 -0
  239. package/skills/capability-evolver/README.md +157 -0
  240. package/skills/capability-evolver/README.zh-CN.md +112 -0
  241. package/skills/capability-evolver/SKILL.md +93 -0
  242. package/skills/capability-evolver/assets/gep/capsules.json +5 -0
  243. package/skills/capability-evolver/assets/gep/genes.json +104 -0
  244. package/skills/capability-evolver/index.js +59 -0
  245. package/skills/capability-evolver/package.json +22 -0
  246. package/skills/capability-evolver/scripts/analyze_by_skill.js +121 -0
  247. package/skills/capability-evolver/scripts/build_public.js +350 -0
  248. package/skills/capability-evolver/scripts/export_history.js +98 -0
  249. package/skills/capability-evolver/scripts/extract_log.js +85 -0
  250. package/skills/capability-evolver/scripts/generate_history.js +75 -0
  251. package/skills/capability-evolver/scripts/human_report.js +147 -0
  252. package/skills/capability-evolver/scripts/publish_public.js +516 -0
  253. package/skills/capability-evolver/scripts/suggest_version.js +89 -0
  254. package/skills/capability-evolver/src/evolve.js +594 -0
  255. package/skills/capability-evolver/src/gep/assetStore.js +204 -0
  256. package/skills/capability-evolver/src/gep/candidates.js +134 -0
  257. package/skills/capability-evolver/src/gep/paths.js +23 -0
  258. package/skills/capability-evolver/src/gep/prompt.js +254 -0
  259. package/skills/capability-evolver/src/gep/selector.js +89 -0
  260. package/skills/capability-evolver/src/gep/signals.js +27 -0
  261. package/skills/cc-godmode/.clawhub/origin.json +7 -0
  262. package/skills/cc-godmode/CHANGELOG.md +66 -0
  263. package/skills/cc-godmode/README.md +293 -0
  264. package/skills/cc-godmode/SKILL.md +242 -0
  265. package/skills/cc-godmode/docs/AGENTS.md +332 -0
  266. package/skills/cc-godmode/docs/MIGRATION.md +206 -0
  267. package/skills/cc-godmode/docs/TROUBLESHOOTING.md +357 -0
  268. package/skills/cc-godmode/docs/WORKFLOWS.md +329 -0
  269. package/skills/cc-godmode/references/agents.md +433 -0
  270. package/skills/cc-godmode/scripts/build-skill.js +232 -0
  271. package/skills/clawdbot-filesystem/.clawhub/origin.json +7 -0
  272. package/skills/clawdbot-filesystem/LICENSE.md +21 -0
  273. package/skills/clawdbot-filesystem/README.md +322 -0
  274. package/skills/clawdbot-filesystem/SKILL.md +219 -0
  275. package/skills/clawdbot-filesystem/config.json +41 -0
  276. package/skills/clawdbot-filesystem/package.json +69 -0
  277. package/skills/clawdbot-security-check/.clawhub/origin.json +7 -0
  278. package/skills/clawdbot-security-check/README.md +168 -0
  279. package/skills/clawdbot-security-check/SKILL.md +145 -0
  280. package/skills/clawdbot-security-check/references/audit-checks.md +521 -0
  281. package/skills/clawdbot-security-check/skill.json +42 -0
  282. package/skills/clawddocs/.clawhub/origin.json +7 -0
  283. package/skills/clawddocs/SKILL.md +176 -0
  284. package/skills/clawddocs/package.json +9 -0
  285. package/skills/clawddocs/scripts/build-index.sh +17 -0
  286. package/skills/clawddocs/scripts/cache.sh +13 -0
  287. package/skills/clawddocs/scripts/fetch-doc.sh +7 -0
  288. package/skills/clawddocs/scripts/recent.sh +5 -0
  289. package/skills/clawddocs/scripts/search.sh +8 -0
  290. package/skills/clawddocs/scripts/sitemap.sh +23 -0
  291. package/skills/clawddocs/scripts/track-changes.sh +16 -0
  292. package/skills/clawddocs/snippets/common-configs.md +69 -0
  293. package/skills/clawguard/.clawhub/origin.json +7 -0
  294. package/skills/clawguard/SKILL.md +137 -0
  295. package/skills/company-research/SKILL.md +393 -0
  296. package/skills/company-research/examples/sample.md +164 -0
  297. package/skills/company-research/template.md +60 -0
  298. package/skills/crypto-price/.clawhub/origin.json +7 -0
  299. package/skills/crypto-price/ARCHITECTURE.md +437 -0
  300. package/skills/crypto-price/README.md +194 -0
  301. package/skills/crypto-price/SKILL.md +61 -0
  302. package/skills/crypto-price/requirements.txt +1 -0
  303. package/skills/crypto-price/scripts/get_price_chart.py +988 -0
  304. package/skills/customer-journey-map/SKILL.md +343 -0
  305. package/skills/customer-journey-map/examples/sample.md +33 -0
  306. package/skills/customer-journey-map/template.md +28 -0
  307. package/skills/customer-journey-mapping-workshop/SKILL.md +522 -0
  308. package/skills/deep-research/.clawhub/origin.json +7 -0
  309. package/skills/deep-research/SKILL.md +93 -0
  310. package/skills/deep-research/rules/logic.md +32 -0
  311. package/skills/discord-telegram-triage/SKILL.md +59 -0
  312. package/skills/discord-telegram-triage/references/discord-runbook.md +28 -0
  313. package/skills/discord-telegram-triage/references/validation-cases.md +11 -0
  314. package/skills/discord-telegram-triage/scripts/triage_snapshot.sh +23 -0
  315. package/skills/discovery-interview-prep/SKILL.md +408 -0
  316. package/skills/discovery-process/SKILL.md +503 -0
  317. package/skills/discovery-process/examples/sample.md +60 -0
  318. package/skills/discovery-process/template.md +39 -0
  319. package/skills/dist/arcane-dev-ops.skill +0 -0
  320. package/skills/dist/discord-telegram-triage.skill +0 -0
  321. package/skills/dist/founder-brief-summarizer.skill +0 -0
  322. package/skills/epic-breakdown-advisor/SKILL.md +664 -0
  323. package/skills/epic-hypothesis/SKILL.md +285 -0
  324. package/skills/epic-hypothesis/examples/sample.md +104 -0
  325. package/skills/epic-hypothesis/template.md +30 -0
  326. package/skills/excel/.clawhub/origin.json +7 -0
  327. package/skills/excel/SKILL.md +332 -0
  328. package/skills/excel/scripts/excel.py +1120 -0
  329. package/skills/fast-browser-use/.clawhub/origin.json +7 -0
  330. package/skills/fast-browser-use/CODEBUDDY.md +142 -0
  331. package/skills/fast-browser-use/Cargo.toml +77 -0
  332. package/skills/fast-browser-use/README.md +62 -0
  333. package/skills/fast-browser-use/SKILL.md +217 -0
  334. package/skills/fast-browser-use/package-lock.json +28 -0
  335. package/skills/fast-browser-use/package.json +8 -0
  336. package/skills/fast-browser-use/rustfmt.toml +10 -0
  337. package/skills/fast-browser-use/src/bin/cli.rs +373 -0
  338. package/skills/fast-browser-use/src/bin/mcp_server.rs +203 -0
  339. package/skills/fast-browser-use/src/browser/config.rs +136 -0
  340. package/skills/fast-browser-use/src/browser/debug.rs +16 -0
  341. package/skills/fast-browser-use/src/browser/mod.rs +61 -0
  342. package/skills/fast-browser-use/src/browser/session.rs +478 -0
  343. package/skills/fast-browser-use/src/dom/element.rs +442 -0
  344. package/skills/fast-browser-use/src/dom/extract_dom.js +849 -0
  345. package/skills/fast-browser-use/src/dom/mod.rs +14 -0
  346. package/skills/fast-browser-use/src/dom/tree.rs +296 -0
  347. package/skills/fast-browser-use/src/dom/yaml.rs +149 -0
  348. package/skills/fast-browser-use/src/error.rs +115 -0
  349. package/skills/fast-browser-use/src/lib.rs +17 -0
  350. package/skills/fast-browser-use/src/mcp/handler.rs +63 -0
  351. package/skills/fast-browser-use/src/mcp/mod.rs +81 -0
  352. package/skills/fast-browser-use/src/tools/Readability.min.js +1480 -0
  353. package/skills/fast-browser-use/src/tools/annotate.rs +165 -0
  354. package/skills/fast-browser-use/src/tools/click.rs +84 -0
  355. package/skills/fast-browser-use/src/tools/close.rs +35 -0
  356. package/skills/fast-browser-use/src/tools/close_tab.rs +45 -0
  357. package/skills/fast-browser-use/src/tools/convert_to_markdown.js +117 -0
  358. package/skills/fast-browser-use/src/tools/cookies.rs +58 -0
  359. package/skills/fast-browser-use/src/tools/debug.rs +44 -0
  360. package/skills/fast-browser-use/src/tools/evaluate.rs +40 -0
  361. package/skills/fast-browser-use/src/tools/extract.rs +66 -0
  362. package/skills/fast-browser-use/src/tools/go_back.rs +35 -0
  363. package/skills/fast-browser-use/src/tools/go_forward.rs +35 -0
  364. package/skills/fast-browser-use/src/tools/hover.js +33 -0
  365. package/skills/fast-browser-use/src/tools/hover.rs +97 -0
  366. package/skills/fast-browser-use/src/tools/html_to_markdown.rs +99 -0
  367. package/skills/fast-browser-use/src/tools/input.rs +93 -0
  368. package/skills/fast-browser-use/src/tools/local_storage.rs +159 -0
  369. package/skills/fast-browser-use/src/tools/markdown.rs +181 -0
  370. package/skills/fast-browser-use/src/tools/mod.rs +326 -0
  371. package/skills/fast-browser-use/src/tools/navigate.rs +55 -0
  372. package/skills/fast-browser-use/src/tools/new_tab.rs +60 -0
  373. package/skills/fast-browser-use/src/tools/press_key.rs +78 -0
  374. package/skills/fast-browser-use/src/tools/read_links.rs +59 -0
  375. package/skills/fast-browser-use/src/tools/readability_script.rs +8 -0
  376. package/skills/fast-browser-use/src/tools/screenshot.rs +47 -0
  377. package/skills/fast-browser-use/src/tools/scroll.js +22 -0
  378. package/skills/fast-browser-use/src/tools/scroll.rs +95 -0
  379. package/skills/fast-browser-use/src/tools/select.js +23 -0
  380. package/skills/fast-browser-use/src/tools/select.rs +129 -0
  381. package/skills/fast-browser-use/src/tools/sitemap.rs +426 -0
  382. package/skills/fast-browser-use/src/tools/snapshot.rs +324 -0
  383. package/skills/fast-browser-use/src/tools/switch_tab.rs +69 -0
  384. package/skills/fast-browser-use/src/tools/tab_list.rs +76 -0
  385. package/skills/fast-browser-use/src/tools/utils.rs +92 -0
  386. package/skills/fast-browser-use/src/tools/wait.rs +53 -0
  387. package/skills/fast-browser-use/test_auth.json +3 -0
  388. package/skills/fast-browser-use/test_state.json +6 -0
  389. package/skills/fast-browser-use/tests/browser_tools_integration.rs +233 -0
  390. package/skills/fast-browser-use/tests/cli_recipes_integration.rs +112 -0
  391. package/skills/fast-browser-use/tests/cookies_integration.rs +56 -0
  392. package/skills/fast-browser-use/tests/debug_integration.rs +83 -0
  393. package/skills/fast-browser-use/tests/dom_integration.rs +170 -0
  394. package/skills/fast-browser-use/tests/local_storage_integration.rs +75 -0
  395. package/skills/fast-browser-use/tests/markdown_integration.rs +448 -0
  396. package/skills/fast-browser-use/tests/navigation_integration.rs +241 -0
  397. package/skills/fast-browser-use/tests/sitemap_integration.rs +326 -0
  398. package/skills/fast-browser-use/tests/tab_management_integration.rs +300 -0
  399. package/skills/feature-investment-advisor/SKILL.md +639 -0
  400. package/skills/feature-investment-advisor/examples/conversation-flow.md +538 -0
  401. package/skills/finance-based-pricing-advisor/SKILL.md +763 -0
  402. package/skills/finance-metrics-quickref/SKILL.md +309 -0
  403. package/skills/find-skills/.clawhub/origin.json +7 -0
  404. package/skills/find-skills/SKILL.md +143 -0
  405. package/skills/flavor-text-writer/SKILL.md +27 -0
  406. package/skills/founder-brief-summarizer/SKILL.md +52 -0
  407. package/skills/founder-brief-summarizer/references/response-templates.md +15 -0
  408. package/skills/founder-brief-summarizer/references/validation-cases.md +11 -0
  409. package/skills/founder-brief-summarizer/scripts/brief_template.sh +28 -0
  410. package/skills/frontend-design/.clawhub/origin.json +7 -0
  411. package/skills/frontend-design/LICENSE.txt +190 -0
  412. package/skills/frontend-design/SKILL.md +53 -0
  413. package/skills/gemini/.clawhub/origin.json +7 -0
  414. package/skills/gemini/SKILL.md +33 -0
  415. package/skills/gemini-deep-research/.clawhub/origin.json +7 -0
  416. package/skills/gemini-deep-research/SKILL.md +78 -0
  417. package/skills/gemini-deep-research/scripts/deep_research.py +176 -0
  418. package/skills/git-essentials/.clawhub/origin.json +7 -0
  419. package/skills/git-essentials/SKILL.md +239 -0
  420. package/skills/git-essentials/references/advanced.md +211 -0
  421. package/skills/github/.clawhub/origin.json +7 -0
  422. package/skills/github/SKILL.md +57 -0
  423. package/skills/google-drive/.clawhub/origin.json +7 -0
  424. package/skills/google-drive/LICENSE.txt +21 -0
  425. package/skills/google-drive/SKILL.md +320 -0
  426. package/skills/growth-loop/SKILL.md +270 -0
  427. package/skills/growth-loop/_meta.json +9 -0
  428. package/skills/growth-loop/references/diagnosis-framework.md +84 -0
  429. package/skills/growth-loop/references/platform-benchmarks.md +79 -0
  430. package/skills/growth-loop/scripts/init-campaign.sh +274 -0
  431. package/skills/humanize-ai-text/.clawhub/origin.json +7 -0
  432. package/skills/humanize-ai-text/SKILL.md +192 -0
  433. package/skills/humanize-ai-text/scripts/compare.py +58 -0
  434. package/skills/humanize-ai-text/scripts/detect.py +160 -0
  435. package/skills/humanize-ai-text/scripts/patterns.json +191 -0
  436. package/skills/humanize-ai-text/scripts/transform.py +127 -0
  437. package/skills/humanizer/.clawhub/origin.json +7 -0
  438. package/skills/humanizer/README.md +82 -0
  439. package/skills/humanizer/SKILL.md +443 -0
  440. package/skills/jobs-to-be-done/SKILL.md +378 -0
  441. package/skills/jobs-to-be-done/examples/sample.md +80 -0
  442. package/skills/jobs-to-be-done/template.md +65 -0
  443. package/skills/lean-ux-canvas/SKILL.md +561 -0
  444. package/skills/lean-ux-canvas/examples/sample.md +88 -0
  445. package/skills/lean-ux-canvas/template.md +32 -0
  446. package/skills/markdown-formatter/.clawhub/origin.json +7 -0
  447. package/skills/markdown-formatter/README.md +137 -0
  448. package/skills/markdown-formatter/SKILL.md +369 -0
  449. package/skills/markdown-formatter/config.json +20 -0
  450. package/skills/markdown-formatter/index.js +439 -0
  451. package/skills/markdown-formatter/package.json +23 -0
  452. package/skills/markdown-formatter/test.js +23 -0
  453. package/skills/marketing-mode/.clawhub/origin.json +7 -0
  454. package/skills/marketing-mode/README.md +49 -0
  455. package/skills/marketing-mode/SKILL.md +703 -0
  456. package/skills/marketing-mode/mode-prompt.md +39 -0
  457. package/skills/marketing-mode/skill.json +51 -0
  458. package/skills/memory-hygiene/.clawhub/origin.json +7 -0
  459. package/skills/memory-hygiene/SKILL.md +91 -0
  460. package/skills/memory-setup/.clawhub/origin.json +7 -0
  461. package/skills/memory-setup/SKILL.md +180 -0
  462. package/skills/memorylayer/.clawhub/origin.json +7 -0
  463. package/skills/memorylayer/README.md +197 -0
  464. package/skills/memorylayer/SKILL.md +227 -0
  465. package/skills/memorylayer/examples/agent-integration.js +145 -0
  466. package/skills/memorylayer/examples/basic-usage.js +87 -0
  467. package/skills/memorylayer/examples/token-savings-demo.js +183 -0
  468. package/skills/memorylayer/index.js +115 -0
  469. package/skills/memorylayer/package-lock.json +295 -0
  470. package/skills/memorylayer/package.json +27 -0
  471. package/skills/memorylayer/python/memorylayer_skill.py +230 -0
  472. package/skills/memorylayer/python/requirements.txt +7 -0
  473. package/skills/mesh/SKILL.md +184 -0
  474. package/skills/model-usage/.clawhub/origin.json +7 -0
  475. package/skills/model-usage/SKILL.md +54 -0
  476. package/skills/model-usage/references/codexbar-cli.md +28 -0
  477. package/skills/model-usage/scripts/model_usage.py +310 -0
  478. package/skills/moltbook-interact/.clawhub/origin.json +7 -0
  479. package/skills/moltbook-interact/INSTALL.md +139 -0
  480. package/skills/moltbook-interact/README.md +198 -0
  481. package/skills/moltbook-interact/SKILL.md +72 -0
  482. package/skills/moltbook-interact/references/api.md +106 -0
  483. package/skills/moltbook-interact/scripts/moltbook.sh +142 -0
  484. package/skills/moltbook-registry/.clawhub/origin.json +7 -0
  485. package/skills/moltbook-registry/README.md +26 -0
  486. package/skills/moltbook-registry/SKILL.md +82 -0
  487. package/skills/moltbook-registry/index.js +180 -0
  488. package/skills/moltbook-registry/package.json +11 -0
  489. package/skills/mythril-scanner/SKILL.md +27 -0
  490. package/skills/n8n/.clawhub/origin.json +7 -0
  491. package/skills/n8n/SKILL.md +141 -0
  492. package/skills/n8n/references/api.md +156 -0
  493. package/skills/n8n/scripts/n8n_api.py +158 -0
  494. package/skills/n8n-workflow-automation/.clawhub/origin.json +7 -0
  495. package/skills/n8n-workflow-automation/SKILL.md +103 -0
  496. package/skills/n8n-workflow-automation/assets/runbook-template.md +32 -0
  497. package/skills/narrative-designer/SKILL.md +27 -0
  498. package/skills/ontology/.clawhub/origin.json +7 -0
  499. package/skills/ontology/SKILL.md +236 -0
  500. package/skills/ontology/references/queries.md +211 -0
  501. package/skills/ontology/references/schema.md +322 -0
  502. package/skills/ontology/scripts/ontology.py +374 -0
  503. package/skills/openai-image-gen/.clawhub/origin.json +7 -0
  504. package/skills/openai-image-gen/SKILL.md +45 -0
  505. package/skills/openai-image-gen/scripts/gen.py +227 -0
  506. package/skills/openclaw-agent-optimize/.clawhub/origin.json +7 -0
  507. package/skills/openclaw-agent-optimize/SKILL.md +33 -0
  508. package/skills/openclaw-agent-optimize/references/agent-orchestration.md +20 -0
  509. package/skills/openclaw-agent-optimize/references/context-management.md +15 -0
  510. package/skills/openclaw-agent-optimize/references/continuous-learning.md +14 -0
  511. package/skills/openclaw-agent-optimize/references/cron-optimization.md +16 -0
  512. package/skills/openclaw-agent-optimize/references/memory-patterns.md +14 -0
  513. package/skills/openclaw-agent-optimize/references/model-selection.md +18 -0
  514. package/skills/openclaw-skill-scanner/.clawhub/origin.json +7 -0
  515. package/skills/openclaw-skill-scanner/SKILL.md +88 -0
  516. package/skills/openclaw-skill-scanner/install-hook.sh +294 -0
  517. package/skills/openclaw-skill-scanner/report-template.md +53 -0
  518. package/skills/openclaw-skill-scanner/scanner.py +929 -0
  519. package/skills/openclaw-skill-scanner/whitelist.json +18 -0
  520. package/skills/opportunity-solution-tree/SKILL.md +428 -0
  521. package/skills/opportunity-solution-tree/examples/sample.md +104 -0
  522. package/skills/opportunity-solution-tree/template.md +33 -0
  523. package/skills/pdf/.clawhub/origin.json +7 -0
  524. package/skills/pdf/SKILL.md +304 -0
  525. package/skills/pestel-analysis/SKILL.md +384 -0
  526. package/skills/pestel-analysis/examples/sample.md +143 -0
  527. package/skills/pestel-analysis/template.md +53 -0
  528. package/skills/pol-probe/SKILL.md +217 -0
  529. package/skills/pol-probe/examples/sample.md +136 -0
  530. package/skills/pol-probe/template.md +59 -0
  531. package/skills/pol-probe-advisor/SKILL.md +492 -0
  532. package/skills/positioning-statement/SKILL.md +229 -0
  533. package/skills/positioning-statement/examples/sample.md +51 -0
  534. package/skills/positioning-statement/template.md +25 -0
  535. package/skills/positioning-workshop/SKILL.md +424 -0
  536. package/skills/prd-development/SKILL.md +654 -0
  537. package/skills/prd-development/examples/sample.md +43 -0
  538. package/skills/prd-development/template.md +55 -0
  539. package/skills/press-release/SKILL.md +277 -0
  540. package/skills/press-release/examples/sample.md +73 -0
  541. package/skills/press-release/template.md +39 -0
  542. package/skills/prioritization-advisor/SKILL.md +451 -0
  543. package/skills/proactive-messages/.clawhub/origin.json +7 -0
  544. package/skills/proactive-messages/SKILL.md +91 -0
  545. package/skills/problem-framing-canvas/SKILL.md +466 -0
  546. package/skills/problem-framing-canvas/examples/sample.md +58 -0
  547. package/skills/problem-framing-canvas/template.md +22 -0
  548. package/skills/problem-statement/SKILL.md +255 -0
  549. package/skills/problem-statement/examples/sample.md +82 -0
  550. package/skills/problem-statement/template.md +37 -0
  551. package/skills/product-strategy-session/SKILL.md +434 -0
  552. package/skills/product-strategy-session/examples/sample.md +67 -0
  553. package/skills/product-strategy-session/template.md +38 -0
  554. package/skills/prompt-guard/.clawhub/origin.json +7 -0
  555. package/skills/prompt-guard/ARCHITECTURE.md +364 -0
  556. package/skills/prompt-guard/CHANGELOG.md +200 -0
  557. package/skills/prompt-guard/README.md +215 -0
  558. package/skills/prompt-guard/SECURITY.md +66 -0
  559. package/skills/prompt-guard/SKILL.md +174 -0
  560. package/skills/prompt-guard/blog/how-i-secured-my-ai-agent.md +185 -0
  561. package/skills/prompt-guard/config.example.yaml +56 -0
  562. package/skills/prompt-guard/references/detection-patterns.md +298 -0
  563. package/skills/prompt-guard/requirements.txt +1 -0
  564. package/skills/prompt-guard/scripts/analyze_log.py +224 -0
  565. package/skills/prompt-guard/scripts/audit.py +344 -0
  566. package/skills/prompt-guard/scripts/detect.py +1587 -0
  567. package/skills/prompt-guard/scripts/hivefence.py +345 -0
  568. package/skills/proto-persona/SKILL.md +336 -0
  569. package/skills/proto-persona/examples/sample.md +97 -0
  570. package/skills/proto-persona/template.md +45 -0
  571. package/skills/recommendation-canvas/SKILL.md +382 -0
  572. package/skills/recommendation-canvas/examples/sample.md +94 -0
  573. package/skills/recommendation-canvas/template.md +86 -0
  574. package/skills/refactor-suggest/.clawhub/origin.json +7 -0
  575. package/skills/refactor-suggest/SKILL.md +94 -0
  576. package/skills/roadmap-planning/SKILL.md +506 -0
  577. package/skills/roadmap-planning/examples/sample.md +62 -0
  578. package/skills/roadmap-planning/template.md +30 -0
  579. package/skills/saas-economics-efficiency-metrics/SKILL.md +694 -0
  580. package/skills/saas-economics-efficiency-metrics/examples/cash-trap.md +365 -0
  581. package/skills/saas-economics-efficiency-metrics/examples/healthy-unit-economics.md +279 -0
  582. package/skills/saas-economics-efficiency-metrics/template.md +263 -0
  583. package/skills/saas-revenue-growth-metrics/SKILL.md +629 -0
  584. package/skills/saas-revenue-growth-metrics/examples/healthy-saas.md +131 -0
  585. package/skills/saas-revenue-growth-metrics/examples/warning-signs.md +229 -0
  586. package/skills/saas-revenue-growth-metrics/template.md +192 -0
  587. package/skills/save-money/.clawhub/origin.json +7 -0
  588. package/skills/save-money/SKILL.md +173 -0
  589. package/skills/scripts/golden_skills_v3.sh +32 -0
  590. package/skills/search/.clawhub/origin.json +7 -0
  591. package/skills/search/SKILL.md +18 -0
  592. package/skills/search/skill.json +1 -0
  593. package/skills/second-brain/.clawhub/origin.json +7 -0
  594. package/skills/second-brain/SKILL.md +278 -0
  595. package/skills/second-brain/scripts/ensue-api.sh +37 -0
  596. package/skills/self-improving-agent/.clawhub/origin.json +7 -0
  597. package/skills/self-improving-agent/.learnings/ERRORS.md +5 -0
  598. package/skills/self-improving-agent/.learnings/FEATURE_REQUESTS.md +5 -0
  599. package/skills/self-improving-agent/.learnings/LEARNINGS.md +5 -0
  600. package/skills/self-improving-agent/SKILL.md +130 -0
  601. package/skills/self-improving-agent/assets/LEARNINGS.md +45 -0
  602. package/skills/self-improving-agent/assets/SKILL-TEMPLATE.md +177 -0
  603. package/skills/self-improving-agent/hooks/openclaw/HOOK.md +23 -0
  604. package/skills/self-improving-agent/hooks/openclaw/handler.js +56 -0
  605. package/skills/self-improving-agent/hooks/openclaw/handler.ts +62 -0
  606. package/skills/self-improving-agent/references/examples.md +374 -0
  607. package/skills/self-improving-agent/references/hooks-setup.md +223 -0
  608. package/skills/self-improving-agent/references/openclaw-integration.md +248 -0
  609. package/skills/self-improving-agent/references/templates.md +480 -0
  610. package/skills/self-improving-agent/scripts/activator.sh +20 -0
  611. package/skills/self-improving-agent/scripts/error-detector.sh +55 -0
  612. package/skills/self-improving-agent/scripts/extract-skill.sh +203 -0
  613. package/skills/self-improving-agent-1-0-2/.clawhub/origin.json +7 -0
  614. package/skills/self-improving-agent-1-0-2/SKILL.md +562 -0
  615. package/skills/self-improving-agent-1-0-2/assets/LEARNINGS.md +45 -0
  616. package/skills/self-improving-agent-1-0-2/assets/SKILL-TEMPLATE.md +182 -0
  617. package/skills/self-improving-agent-1-0-2/references/clawdbot-integration.md +311 -0
  618. package/skills/self-improving-agent-1-0-2/references/examples.md +374 -0
  619. package/skills/self-improving-agent-1-0-2/references/hooks-setup.md +223 -0
  620. package/skills/self-improving-agent-1-0-2/scripts/activator.sh +20 -0
  621. package/skills/self-improving-agent-1-0-2/scripts/error-detector.sh +55 -0
  622. package/skills/self-improving-agent-1-0-2/scripts/extract-skill.sh +203 -0
  623. package/skills/self-love-confidence/.clawhub/origin.json +7 -0
  624. package/skills/self-love-confidence/SKILL.md +79 -0
  625. package/skills/self-reflection/.clawhub/origin.json +7 -0
  626. package/skills/self-reflection/README.md +292 -0
  627. package/skills/self-reflection/SKILL.md +110 -0
  628. package/skills/self-reflection/self-reflection.example.json +6 -0
  629. package/skills/slither-analyzer/SKILL.md +27 -0
  630. package/skills/solidity-audit/SKILL.md +27 -0
  631. package/skills/soulcraft/.clawhub/origin.json +7 -0
  632. package/skills/soulcraft/README.md +123 -0
  633. package/skills/soulcraft/SKILL.md +340 -0
  634. package/skills/soulcraft/references/question-bank.md +154 -0
  635. package/skills/soulcraft/references/soul-examples.md +207 -0
  636. package/skills/soulcraft/research/RESEARCH_REPORT.md +317 -0
  637. package/skills/spotify-player/.clawhub/origin.json +7 -0
  638. package/skills/spotify-player/SKILL.md +44 -0
  639. package/skills/storyboard/SKILL.md +259 -0
  640. package/skills/storyboard/examples/sample.md +71 -0
  641. package/skills/storyboard/template.md +41 -0
  642. package/skills/summarize/.clawhub/origin.json +7 -0
  643. package/skills/summarize/SKILL.md +59 -0
  644. package/skills/superdesign/.clawhub/origin.json +7 -0
  645. package/skills/superdesign/SKILL.md +224 -0
  646. package/skills/tam-sam-som-calculator/SKILL.md +399 -0
  647. package/skills/tam-sam-som-calculator/examples/sample.md +142 -0
  648. package/skills/tam-sam-som-calculator/scripts/market-sizing.py +95 -0
  649. package/skills/tam-sam-som-calculator/template.md +35 -0
  650. package/skills/tavily-search/.clawhub/origin.json +7 -0
  651. package/skills/tavily-search/SKILL.md +49 -0
  652. package/skills/tavily-search/scripts/extract.mjs +59 -0
  653. package/skills/tavily-search/scripts/search.mjs +101 -0
  654. package/skills/twitter/SKILL.md +74 -0
  655. package/skills/twitter/_meta.json +9 -0
  656. package/skills/twitter/references/validation-cases.md +53 -0
  657. package/skills/twitter/scripts/twitter.sh +421 -0
  658. package/skills/ui-ux-pro-max/.clawhub/origin.json +7 -0
  659. package/skills/ui-ux-pro-max/SKILL.md +54 -0
  660. package/skills/ui-ux-pro-max/assets/data/charts.csv +26 -0
  661. package/skills/ui-ux-pro-max/assets/data/colors.csv +97 -0
  662. package/skills/ui-ux-pro-max/assets/data/icons.csv +101 -0
  663. package/skills/ui-ux-pro-max/assets/data/landing.csv +31 -0
  664. package/skills/ui-ux-pro-max/assets/data/products.csv +97 -0
  665. package/skills/ui-ux-pro-max/assets/data/react-performance.csv +45 -0
  666. package/skills/ui-ux-pro-max/assets/data/stacks/astro.csv +54 -0
  667. package/skills/ui-ux-pro-max/assets/data/stacks/flutter.csv +53 -0
  668. package/skills/ui-ux-pro-max/assets/data/stacks/html-tailwind.csv +56 -0
  669. package/skills/ui-ux-pro-max/assets/data/stacks/jetpack-compose.csv +53 -0
  670. package/skills/ui-ux-pro-max/assets/data/stacks/nextjs.csv +53 -0
  671. package/skills/ui-ux-pro-max/assets/data/stacks/nuxt-ui.csv +51 -0
  672. package/skills/ui-ux-pro-max/assets/data/stacks/nuxtjs.csv +59 -0
  673. package/skills/ui-ux-pro-max/assets/data/stacks/react-native.csv +52 -0
  674. package/skills/ui-ux-pro-max/assets/data/stacks/react.csv +54 -0
  675. package/skills/ui-ux-pro-max/assets/data/stacks/shadcn.csv +61 -0
  676. package/skills/ui-ux-pro-max/assets/data/stacks/svelte.csv +54 -0
  677. package/skills/ui-ux-pro-max/assets/data/stacks/swiftui.csv +51 -0
  678. package/skills/ui-ux-pro-max/assets/data/stacks/vue.csv +50 -0
  679. package/skills/ui-ux-pro-max/assets/data/styles.csv +68 -0
  680. package/skills/ui-ux-pro-max/assets/data/typography.csv +58 -0
  681. package/skills/ui-ux-pro-max/assets/data/ui-reasoning.csv +101 -0
  682. package/skills/ui-ux-pro-max/assets/data/ux-guidelines.csv +100 -0
  683. package/skills/ui-ux-pro-max/assets/data/web-interface.csv +31 -0
  684. package/skills/ui-ux-pro-max/references/upstream-README.md +488 -0
  685. package/skills/ui-ux-pro-max/references/upstream-skill-content.md +288 -0
  686. package/skills/ui-ux-pro-max/scripts/__init__.py +0 -0
  687. package/skills/ui-ux-pro-max/scripts/core.py +253 -0
  688. package/skills/ui-ux-pro-max/scripts/design_system.py +1071 -0
  689. package/skills/ui-ux-pro-max/scripts/search.py +111 -0
  690. package/skills/user-story/SKILL.md +272 -0
  691. package/skills/user-story/examples/sample.md +110 -0
  692. package/skills/user-story/scripts/user-story-template.py +65 -0
  693. package/skills/user-story/template.md +32 -0
  694. package/skills/user-story-mapping/SKILL.md +296 -0
  695. package/skills/user-story-mapping/examples/sample.md +77 -0
  696. package/skills/user-story-mapping/template.md +41 -0
  697. package/skills/user-story-mapping-workshop/SKILL.md +485 -0
  698. package/skills/user-story-mapping-workshop/template.md +28 -0
  699. package/skills/user-story-splitting/SKILL.md +313 -0
  700. package/skills/user-story-splitting/examples/sample.md +147 -0
  701. package/skills/user-story-splitting/template.md +37 -0
  702. package/skills/wacli/.clawhub/origin.json +7 -0
  703. package/skills/wacli/SKILL.md +53 -0
  704. package/skills/web-search/.clawhub/origin.json +7 -0
  705. package/skills/web-search/SKILL.md +151 -0
  706. package/skills/web-search/references/api-details.md +207 -0
  707. package/skills/web-search/scripts/search.py +576 -0
  708. package/skills/workshop-facilitation/SKILL.md +88 -0
  709. package/skills/world-builder/SKILL.md +27 -0
  710. package/souls/blockchain-auditor/PRINCIPLES.md +75 -0
  711. package/souls/blockchain-auditor/SOUL.md +56 -0
  712. package/souls/blockchain-auditor/capabilities.json +33 -0
  713. package/souls/blockchain-auditor/evolution/capsules.json +4 -0
  714. package/souls/blockchain-auditor/evolution/events.jsonl +1 -0
  715. package/souls/blockchain-auditor/evolution/genes.json +62 -0
  716. package/souls/daedalus/PRINCIPLES.md +78 -0
  717. package/souls/daedalus/SOUL.md +48 -0
  718. package/souls/daedalus/capabilities.json +46 -0
  719. package/souls/identity-architect/PRINCIPLES.md +83 -0
  720. package/souls/identity-architect/SOUL.md +66 -0
  721. package/souls/identity-architect/capabilities.json +38 -0
  722. package/souls/identity-architect/evolution/capsules.json +4 -0
  723. package/souls/identity-architect/evolution/events.jsonl +0 -0
  724. package/souls/identity-architect/evolution/genes.json +4 -0
  725. package/souls/infra-ops/PRINCIPLES.md +77 -0
  726. package/souls/infra-ops/SOUL.md +56 -0
  727. package/souls/infra-ops/capabilities.json +33 -0
  728. package/souls/infra-ops/evolution/capsules.json +4 -0
  729. package/souls/infra-ops/evolution/events.jsonl +0 -0
  730. package/souls/infra-ops/evolution/genes.json +4 -0
  731. package/souls/lore-writer/PRINCIPLES.md +74 -0
  732. package/souls/lore-writer/SOUL.md +54 -0
  733. package/souls/lore-writer/capabilities.json +37 -0
  734. package/souls/lore-writer/evolution/capsules.json +4 -0
  735. package/souls/lore-writer/evolution/events.jsonl +0 -0
  736. package/souls/lore-writer/evolution/genes.json +4 -0
  737. package/souls/qa-evidence/PRINCIPLES.md +97 -0
  738. package/souls/qa-evidence/SOUL.md +66 -0
  739. package/souls/qa-evidence/capabilities.json +32 -0
  740. package/souls/qa-evidence/evolution/capsules.json +4 -0
  741. package/souls/qa-evidence/evolution/events.jsonl +0 -0
  742. package/souls/qa-evidence/evolution/genes.json +4 -0
  743. package/souls/registry.json +211 -0
  744. package/souls/sync-registry.js +65 -0
  745. package/uninstall.sh +102 -0
  746. package/workspace-bin/auto-checkpoint +60 -0
  747. package/workspace-bin/clawvault-access-control +65 -0
  748. package/workspace-bin/clawvault-local +28 -0
  749. package/workspace-bin/compile-boot +494 -0
  750. package/workspace-bin/daily-log-writer.mjs +251 -0
  751. package/workspace-bin/evolve +540 -0
  752. package/workspace-bin/fitness_score.py +395 -0
  753. package/workspace-bin/hooks/pre-commit +80 -0
  754. package/workspace-bin/install-daemon +299 -0
  755. package/workspace-bin/lane-watchdog.js +232 -0
  756. package/workspace-bin/lib/__init__.py +0 -0
  757. package/workspace-bin/lib/frontmatter.py +114 -0
  758. package/workspace-bin/memory-daemon.mjs +879 -0
  759. package/workspace-bin/memory-maintenance.mjs +531 -0
  760. package/workspace-bin/mesh-bridge.mjs +154 -0
  761. package/workspace-bin/multi-review +130 -0
  762. package/workspace-bin/obsidian +125 -0
  763. package/workspace-bin/obsidian-sync.mjs +888 -0
  764. package/workspace-bin/openclaw-register-source +102 -0
  765. package/workspace-bin/proactive-scan +147 -0
  766. package/workspace-bin/quality-gate +175 -0
  767. package/workspace-bin/screenshot +96 -0
  768. package/workspace-bin/session-recap +453 -0
  769. package/workspace-bin/skill-audit +494 -0
  770. package/workspace-bin/skill-quality-check +134 -0
  771. package/workspace-bin/skill-routing-eval +599 -0
  772. package/workspace-bin/soul-prompt +251 -0
  773. package/workspace-bin/subagent-audit.mjs +267 -0
  774. package/workspace-bin/test-multi-soul-workflow +130 -0
  775. package/workspace-bin/trust-registry +465 -0
  776. package/workspace-docs/AGENTS.md +201 -0
  777. package/workspace-docs/CLAUDE.md +64 -0
  778. package/workspace-docs/PRINCIPLES.md +81 -0
  779. package/workspace-docs/SOUL.md +48 -0
@@ -0,0 +1,1043 @@
1
+ "use client";
2
+
3
+ import { useState, useEffect, useCallback, useRef } from "react";
4
+ import { X, Zap, Paperclip, Trash2, ArrowLeftFromLine, ArrowRightFromLine, Clock, User } from "lucide-react";
5
+ import { createTask, updateTask, createProject, type Task } from "@/lib/hooks";
6
+
7
+ const TYPES = ["project", "pipeline", "phase"] as const;
8
+ type HierarchyType = (typeof TYPES)[number];
9
+
10
+ const STATUSES = [
11
+ "queued",
12
+ "ready",
13
+ "running",
14
+ "blocked",
15
+ "waiting-user",
16
+ "done",
17
+ "cancelled",
18
+ ];
19
+
20
+ const COLORS = [
21
+ "#6d28d9", // purple
22
+ "#2563eb", // blue
23
+ "#059669", // green
24
+ "#d97706", // amber
25
+ "#dc2626", // red
26
+ "#0891b2", // cyan
27
+ "#7c3aed", // violet
28
+ "#ea580c", // orange
29
+ ];
30
+
31
+ interface DepLink {
32
+ id: string;
33
+ title: string;
34
+ status: string;
35
+ }
36
+
37
+ interface UnifiedTaskDialogProps {
38
+ item: Task | null; // null = create mode
39
+ open: boolean;
40
+ onClose: () => void;
41
+ defaultScheduledDate?: string | null;
42
+ defaultType?: HierarchyType;
43
+ defaultParentId?: string | null;
44
+ parentOptions?: { id: string; title: string; type: string }[];
45
+ phaseOptions?: { id: string; title: string; pipeline: string }[];
46
+ predecessors?: DepLink[];
47
+ successors?: DepLink[];
48
+ }
49
+
50
+ export function UnifiedTaskDialog({
51
+ item,
52
+ open,
53
+ onClose,
54
+ defaultScheduledDate,
55
+ defaultType,
56
+ defaultParentId = null,
57
+ parentOptions = [],
58
+ phaseOptions = [],
59
+ predecessors = [],
60
+ successors = [],
61
+ }: UnifiedTaskDialogProps) {
62
+ // Hierarchy mode: roadmap passes parentOptions or defaultType
63
+ const isHierarchyMode = parentOptions.length > 0 || !!defaultType;
64
+
65
+ const [id, setId] = useState("");
66
+ const [title, setTitle] = useState("");
67
+ const [type, setType] = useState<HierarchyType>(defaultType || "project");
68
+ const [parentId, setParentId] = useState<string>("");
69
+ const [status, setStatus] = useState("queued");
70
+ const [owner, setOwner] = useState("");
71
+ const [nextAction, setNextAction] = useState("");
72
+ const [scheduledDate, setScheduledDate] = useState("");
73
+ const [project, setProject] = useState("");
74
+ const [description, setDescription] = useState("");
75
+ const [richDescription, setRichDescription] = useState("");
76
+ const [estimatedTime, setEstimatedTime] = useState("");
77
+ // Hierarchy-only fields
78
+ const [startDate, setStartDate] = useState("");
79
+ const [endDate, setEndDate] = useState("");
80
+ const [color, setColor] = useState(COLORS[0]);
81
+ // Scheduling fields
82
+ const [needsApproval, setNeedsApproval] = useState(true);
83
+ const [triggerKind, setTriggerKind] = useState("none");
84
+ const [triggerAt, setTriggerAt] = useState("");
85
+ const [triggerCron, setTriggerCron] = useState("");
86
+ const [triggerTz, setTriggerTz] = useState("America/Montreal");
87
+ const [isRecurring, setIsRecurring] = useState(false);
88
+ const [capacityClass, setCapacityClass] = useState("normal");
89
+ const [autoPriority, setAutoPriority] = useState(0);
90
+ const [showInCalendar, setShowInCalendar] = useState(false);
91
+ const [acknowledgedAt, setAcknowledgedAt] = useState<string | null>(null);
92
+ const [artifacts, setArtifacts] = useState<string[]>([]);
93
+ const [dragOver, setDragOver] = useState(false);
94
+ const [saving, setSaving] = useState(false);
95
+ const initializedForOpen = useRef(false);
96
+
97
+ useEffect(() => {
98
+ // Only initialize form state when the dialog opens (open transitions to true).
99
+ // This prevents SWR refreshes from resetting form fields while editing.
100
+ if (!open) {
101
+ initializedForOpen.current = false;
102
+ return;
103
+ }
104
+ if (initializedForOpen.current) return;
105
+ initializedForOpen.current = true;
106
+
107
+ if (item) {
108
+ setId(item.id);
109
+ setTitle(item.title);
110
+ setType((item.type as HierarchyType) || defaultType || "project");
111
+ setParentId(item.parentId ?? "");
112
+ setStatus(item.status);
113
+ setOwner(item.owner ?? "");
114
+ setNextAction(item.nextAction ?? "");
115
+ setScheduledDate(item.scheduledDate ?? "");
116
+ setProject(item.project ?? "");
117
+ // Parse description into metadata + rich
118
+ const rawDesc = item.description ?? "";
119
+ const nlIdx = rawDesc.indexOf("\n\n");
120
+ const metaLine = nlIdx >= 0 ? rawDesc.slice(0, nlIdx) : rawDesc;
121
+ const richPart = nlIdx >= 0 ? rawDesc.slice(nlIdx + 2) : "";
122
+ // If no double-newline and no structured metadata separator, treat entire
123
+ // description as rich text (shows in the textarea, not the read-only field)
124
+ if (nlIdx < 0 && !metaLine.includes(" · ")) {
125
+ setDescription("");
126
+ setRichDescription(metaLine);
127
+ } else {
128
+ setDescription(metaLine);
129
+ setRichDescription(richPart);
130
+ }
131
+ const descParts = metaLine.split(" · ");
132
+ const hoursPart = descParts.find((p) => /^\d+(\.\d+)?h$/.test(p.trim()));
133
+ setEstimatedTime(hoursPart?.trim() ?? "");
134
+ // Hierarchy fields
135
+ setStartDate(item.startDate ?? "");
136
+ setEndDate(item.endDate ?? "");
137
+ setColor(item.color ?? COLORS[0]);
138
+ // Scheduling
139
+ setNeedsApproval(item.needsApproval !== 0);
140
+ setTriggerKind(item.triggerKind ?? "none");
141
+ setTriggerAt(item.triggerAt ?? "");
142
+ setTriggerCron(item.triggerCron ?? "");
143
+ setTriggerTz(item.triggerTz ?? "America/Montreal");
144
+ setIsRecurring(!!item.isRecurring);
145
+ setCapacityClass(item.capacityClass ?? "normal");
146
+ setAutoPriority(item.autoPriority ?? 0);
147
+ setShowInCalendar(!!item.showInCalendar);
148
+ setAcknowledgedAt(item.acknowledgedAt ?? null);
149
+ setArtifacts(item.artifacts ?? []);
150
+ } else {
151
+ setId("");
152
+ setTitle("");
153
+ setType(defaultType || "project");
154
+ setParentId(defaultParentId ?? "");
155
+ setStatus("queued");
156
+ setOwner("");
157
+ setNextAction("");
158
+ setScheduledDate(defaultScheduledDate ?? "");
159
+ setProject("");
160
+ setDescription("");
161
+ setRichDescription("");
162
+ setEstimatedTime("");
163
+ setStartDate("");
164
+ setEndDate("");
165
+ setColor(COLORS[0]);
166
+ setNeedsApproval(true);
167
+ setTriggerKind("none");
168
+ setTriggerAt("");
169
+ setTriggerCron("");
170
+ setTriggerTz("America/Montreal");
171
+ setIsRecurring(false);
172
+ setCapacityClass("normal");
173
+ setAutoPriority(0);
174
+ setArtifacts([]);
175
+ }
176
+ // eslint-disable-next-line react-hooks/exhaustive-deps
177
+ }, [open, item, defaultType, defaultParentId, defaultScheduledDate]);
178
+
179
+ const resolveBasenames = useCallback(async (names: string[]) => {
180
+ const resolved = await Promise.all(
181
+ names.map(async (name) => {
182
+ if (name.startsWith("/") || name.includes("://")) return name;
183
+ try {
184
+ const res = await fetch("/api/resolve-path", {
185
+ method: "POST",
186
+ headers: { "Content-Type": "application/json" },
187
+ body: JSON.stringify({ name }),
188
+ });
189
+ const data = await res.json();
190
+ return data.path || name;
191
+ } catch {
192
+ return name;
193
+ }
194
+ })
195
+ );
196
+ return resolved;
197
+ }, []);
198
+
199
+ const handleDrop = useCallback(
200
+ async (e: React.DragEvent) => {
201
+ e.preventDefault();
202
+ e.stopPropagation();
203
+ setDragOver(false);
204
+
205
+ const collected: string[] = [];
206
+ const uriData = e.dataTransfer.getData("text/uri-list");
207
+ const textData = e.dataTransfer.getData("text/plain");
208
+ const rawText = uriData || textData || "";
209
+
210
+ for (const line of rawText.split("\n")) {
211
+ const trimmed = line.trim();
212
+ if (!trimmed || trimmed.startsWith("#")) continue;
213
+ if (trimmed.startsWith("file://")) {
214
+ collected.push(decodeURIComponent(trimmed.replace("file://", "")));
215
+ } else if (trimmed.length > 0) {
216
+ collected.push(trimmed);
217
+ }
218
+ }
219
+
220
+ if (collected.length === 0 && e.dataTransfer.files.length > 0) {
221
+ for (const file of Array.from(e.dataTransfer.files)) {
222
+ collected.push(file.name);
223
+ }
224
+ }
225
+
226
+ if (collected.length > 0) {
227
+ const resolved = await resolveBasenames(collected);
228
+ setArtifacts((prev) => {
229
+ const set = new Set(prev);
230
+ for (const p of resolved) set.add(p);
231
+ return Array.from(set);
232
+ });
233
+ }
234
+ },
235
+ [resolveBasenames]
236
+ );
237
+
238
+ const handleDragOver = useCallback((e: React.DragEvent) => {
239
+ e.preventDefault();
240
+ e.stopPropagation();
241
+ setDragOver(true);
242
+ }, []);
243
+
244
+ const handleDragLeave = useCallback((e: React.DragEvent) => {
245
+ e.preventDefault();
246
+ e.stopPropagation();
247
+ setDragOver(false);
248
+ }, []);
249
+
250
+ const removeArtifact = (path: string) => {
251
+ setArtifacts((prev) => prev.filter((a) => a !== path));
252
+ };
253
+
254
+ if (!open) return null;
255
+
256
+ // Filter parent options based on type hierarchy
257
+ const validParents = parentOptions.filter((p) => {
258
+ if (type === "pipeline") return p.type === "project";
259
+ if (type === "phase") return p.type === "pipeline";
260
+ return false;
261
+ });
262
+
263
+ // Rebuild description: metadata line + optional rich description
264
+ const buildDescription = () => {
265
+ let metaLine = description;
266
+ if (!metaLine && !estimatedTime && !richDescription) return null;
267
+ if (!metaLine && estimatedTime) metaLine = estimatedTime;
268
+ else if (metaLine) {
269
+ const parts = metaLine.split(" · ");
270
+ const hoursIdx = parts.findIndex((p) => /^\d+(\.\d+)?h$/.test(p.trim()));
271
+ if (estimatedTime) {
272
+ if (hoursIdx >= 0) {
273
+ parts[hoursIdx] = estimatedTime;
274
+ } else {
275
+ parts.splice(1, 0, estimatedTime);
276
+ }
277
+ } else if (hoursIdx >= 0) {
278
+ parts.splice(hoursIdx, 1);
279
+ }
280
+ metaLine = parts.join(" · ");
281
+ }
282
+ const rich = richDescription.trim();
283
+ if (rich) {
284
+ return metaLine ? `${metaLine}\n\n${rich}` : rich;
285
+ }
286
+ return metaLine || null;
287
+ };
288
+
289
+ const handleSave = async () => {
290
+ if (!title.trim()) return;
291
+ setSaving(true);
292
+ const finalDescription = buildDescription();
293
+ try {
294
+ if (item) {
295
+ // Update path — send superset of all fields
296
+ const result = await updateTask(item.id, {
297
+ title,
298
+ status,
299
+ type: isHierarchyMode ? type : undefined,
300
+ owner: owner || null,
301
+ next_action: nextAction || null,
302
+ scheduled_date: scheduledDate || null,
303
+ project: !isHierarchyMode ? (project || null) : undefined,
304
+ parent_id: parentId || null,
305
+ description: finalDescription,
306
+ start_date: isHierarchyMode ? (startDate || null) : undefined,
307
+ end_date: isHierarchyMode ? (endDate || null) : undefined,
308
+ color: isHierarchyMode ? (color || null) : undefined,
309
+ needs_approval: needsApproval,
310
+ trigger_kind: triggerKind,
311
+ trigger_at: triggerAt || null,
312
+ trigger_cron: triggerCron || null,
313
+ trigger_tz: triggerTz,
314
+ is_recurring: isRecurring,
315
+ capacity_class: capacityClass,
316
+ auto_priority: autoPriority,
317
+ show_in_calendar: showInCalendar,
318
+ artifacts: artifacts.length > 0 ? artifacts : null,
319
+ } as Record<string, unknown>);
320
+ if (result?.error) {
321
+ alert(`Update failed: ${result.error}`);
322
+ return;
323
+ }
324
+ } else if (isHierarchyMode) {
325
+ // Create hierarchy item
326
+ const slug =
327
+ id.trim() ||
328
+ title
329
+ .toLowerCase()
330
+ .replace(/[^a-z0-9]+/g, "-")
331
+ .replace(/^-|-$/g, "");
332
+
333
+ if (type === "project") {
334
+ await createProject({
335
+ id: slug,
336
+ title,
337
+ description: finalDescription || undefined,
338
+ color: color || undefined,
339
+ start_date: startDate || undefined,
340
+ end_date: endDate || undefined,
341
+ owner: owner || undefined,
342
+ status,
343
+ });
344
+ } else {
345
+ await createTask({
346
+ id: slug,
347
+ title,
348
+ status,
349
+ type,
350
+ parent_id: parentId || undefined,
351
+ description: finalDescription || undefined,
352
+ start_date: startDate || undefined,
353
+ end_date: endDate || undefined,
354
+ scheduled_date: scheduledDate || undefined,
355
+ color: color || undefined,
356
+ owner: owner || undefined,
357
+ nextAction: nextAction || undefined,
358
+ needs_approval: needsApproval,
359
+ trigger_kind: triggerKind,
360
+ trigger_at: triggerAt || undefined,
361
+ trigger_cron: triggerCron || undefined,
362
+ trigger_tz: triggerTz,
363
+ is_recurring: isRecurring || undefined,
364
+ capacity_class: capacityClass,
365
+ auto_priority: autoPriority || undefined,
366
+ artifacts: artifacts.length > 0 ? artifacts : undefined,
367
+ });
368
+ }
369
+ } else {
370
+ // Create leaf task
371
+ await createTask({
372
+ title,
373
+ status,
374
+ owner: owner || undefined,
375
+ description: finalDescription || undefined,
376
+ nextAction: nextAction || undefined,
377
+ scheduled_date: scheduledDate || undefined,
378
+ project: project || undefined,
379
+ parent_id: parentId || undefined,
380
+ needs_approval: needsApproval,
381
+ trigger_kind: triggerKind,
382
+ trigger_at: triggerAt || undefined,
383
+ trigger_cron: triggerCron || undefined,
384
+ trigger_tz: triggerTz,
385
+ is_recurring: isRecurring || undefined,
386
+ capacity_class: capacityClass,
387
+ auto_priority: autoPriority || undefined,
388
+ artifacts: artifacts.length > 0 ? artifacts : undefined,
389
+ });
390
+ }
391
+ onClose();
392
+ } finally {
393
+ setSaving(false);
394
+ }
395
+ };
396
+
397
+ const displayType = isHierarchyMode ? type : "task";
398
+
399
+ return (
400
+ <div className="fixed inset-0 z-50 flex items-center justify-center">
401
+ <div
402
+ className="absolute inset-0 bg-black/60 backdrop-blur-sm"
403
+ onClick={onClose}
404
+ />
405
+ <div className={`relative w-full ${isHierarchyMode ? "max-w-lg" : "max-w-md"} max-h-[90vh] overflow-y-auto rounded-xl border border-border bg-card p-6 shadow-2xl`}>
406
+ <div className="flex items-center justify-between mb-4">
407
+ <h2 className="text-lg font-semibold text-foreground">
408
+ {item ? `Edit ${displayType}` : `New ${displayType}`}
409
+ </h2>
410
+ <button
411
+ onClick={onClose}
412
+ className="text-muted-foreground hover:text-foreground transition-colors"
413
+ >
414
+ <X className="h-5 w-5" />
415
+ </button>
416
+ </div>
417
+
418
+ {/* Done checkbox + Started by — leaf mode only */}
419
+ {!isHierarchyMode && (
420
+ <div className="flex items-center gap-3 mb-4">
421
+ <label className="flex items-center gap-2 cursor-pointer group">
422
+ <input
423
+ type="checkbox"
424
+ checked={status === "done"}
425
+ onChange={(e) => setStatus(e.target.checked ? "done" : "queued")}
426
+ className="h-5 w-5 rounded border-border text-green-500 focus:ring-green-500/50 accent-green-500 cursor-pointer"
427
+ />
428
+ <span className={`text-sm font-medium transition-colors ${status === "done" ? "text-green-400 line-through" : "text-muted-foreground group-hover:text-foreground"}`}>
429
+ Mark as done
430
+ </span>
431
+ </label>
432
+ {/* Daedalus acknowledgment checkbox — shows when auto-dispatched */}
433
+ {item && status === "running" && owner?.toLowerCase() === "daedalus" && (
434
+ <label className="flex items-center gap-2 cursor-pointer group ml-2">
435
+ <input
436
+ type="checkbox"
437
+ checked={!!acknowledgedAt}
438
+ onChange={async (e) => {
439
+ const val = e.target.checked ? new Date().toISOString() : null;
440
+ setAcknowledgedAt(val);
441
+ await updateTask(item.id, { acknowledged_at: val } as Record<string, unknown>);
442
+ }}
443
+ className="h-5 w-5 rounded border-red-500/50 text-red-500 focus:ring-red-500/50 accent-red-500 cursor-pointer"
444
+ />
445
+ <span className={`text-sm font-medium transition-colors ${acknowledgedAt ? "text-red-400" : "text-muted-foreground group-hover:text-foreground"}`}>
446
+ Daedalus
447
+ </span>
448
+ </label>
449
+ )}
450
+ {item && (status === "running" || status === "done") && owner && (
451
+ <span className="inline-flex items-center gap-1 text-[11px] font-medium rounded-md px-2 py-1 bg-purple-500/15 text-purple-400 border border-purple-500/20">
452
+ <User className="h-3 w-3" />
453
+ {owner}
454
+ </span>
455
+ )}
456
+ </div>
457
+ )}
458
+
459
+ <div className="space-y-4">
460
+ {/* Type selector — hierarchy create mode only */}
461
+ {isHierarchyMode && !item && (
462
+ <div className="flex gap-1 p-1 bg-background rounded-lg border border-border">
463
+ {TYPES.map((t) => (
464
+ <button
465
+ key={t}
466
+ onClick={() => setType(t)}
467
+ className={`flex-1 px-3 py-1.5 text-xs font-medium rounded-md transition-colors ${
468
+ type === t
469
+ ? "bg-primary text-primary-foreground"
470
+ : "text-muted-foreground hover:text-foreground"
471
+ }`}
472
+ >
473
+ {t.charAt(0).toUpperCase() + t.slice(1)}
474
+ </button>
475
+ ))}
476
+ </div>
477
+ )}
478
+
479
+ {/* ID + Title — hierarchy mode has ID slug on create */}
480
+ {isHierarchyMode ? (
481
+ <div className="grid grid-cols-3 gap-3">
482
+ {!item && (
483
+ <div>
484
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
485
+ ID (slug)
486
+ </label>
487
+ <input
488
+ type="text"
489
+ value={id}
490
+ onChange={(e) => setId(e.target.value)}
491
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary font-mono"
492
+ placeholder="auto"
493
+ />
494
+ </div>
495
+ )}
496
+ <div className={item ? "col-span-3" : "col-span-2"}>
497
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
498
+ Title
499
+ </label>
500
+ <input
501
+ type="text"
502
+ value={title}
503
+ onChange={(e) => setTitle(e.target.value)}
504
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary"
505
+ placeholder={`${type} title...`}
506
+ autoFocus
507
+ />
508
+ </div>
509
+ </div>
510
+ ) : (
511
+ <div>
512
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
513
+ Title
514
+ </label>
515
+ <input
516
+ type="text"
517
+ value={title}
518
+ onChange={(e) => setTitle(e.target.value)}
519
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary"
520
+ placeholder="Task title..."
521
+ autoFocus
522
+ />
523
+ </div>
524
+ )}
525
+
526
+ {/* Parent selector — hierarchy pipeline/phase only */}
527
+ {isHierarchyMode && type !== "project" && validParents.length > 0 && (
528
+ <div>
529
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
530
+ Parent {type === "pipeline" ? "Project" : "Pipeline"}
531
+ </label>
532
+ <select
533
+ value={parentId}
534
+ onChange={(e) => setParentId(e.target.value)}
535
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
536
+ >
537
+ <option value="">Select parent...</option>
538
+ {validParents.map((p) => (
539
+ <option key={p.id} value={p.id}>
540
+ {p.title}
541
+ </option>
542
+ ))}
543
+ </select>
544
+ </div>
545
+ )}
546
+
547
+ {/* Status + Scheduled Date */}
548
+ <div className="grid grid-cols-2 gap-3">
549
+ <div>
550
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
551
+ Status
552
+ </label>
553
+ <select
554
+ value={status}
555
+ onChange={(e) => setStatus(e.target.value)}
556
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
557
+ >
558
+ {STATUSES.map((s) => (
559
+ <option key={s} value={s}>
560
+ {s}
561
+ </option>
562
+ ))}
563
+ </select>
564
+ </div>
565
+ <div>
566
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
567
+ Scheduled Date
568
+ </label>
569
+ <input
570
+ type="date"
571
+ value={scheduledDate}
572
+ onChange={(e) => setScheduledDate(e.target.value)}
573
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
574
+ />
575
+ </div>
576
+ </div>
577
+
578
+ {/* Date range — hierarchy mode only */}
579
+ {isHierarchyMode && (
580
+ <div className="grid grid-cols-2 gap-3">
581
+ <div>
582
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
583
+ Start Date
584
+ </label>
585
+ <input
586
+ type="date"
587
+ value={startDate}
588
+ onChange={(e) => {
589
+ setStartDate(e.target.value);
590
+ if (scheduledDate === startDate || scheduledDate === "") {
591
+ setScheduledDate(e.target.value);
592
+ }
593
+ }}
594
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
595
+ />
596
+ <label className="flex items-center gap-1.5 mt-1 cursor-pointer">
597
+ <input
598
+ type="checkbox"
599
+ checked={!!startDate && scheduledDate === startDate}
600
+ onChange={(e) => {
601
+ if (e.target.checked && startDate) {
602
+ setScheduledDate(startDate);
603
+ } else {
604
+ setScheduledDate("");
605
+ }
606
+ }}
607
+ className="rounded border-border"
608
+ disabled={!startDate}
609
+ />
610
+ <span className="text-[10px] text-muted-foreground">
611
+ Schedule to start date
612
+ </span>
613
+ </label>
614
+ </div>
615
+ <div>
616
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
617
+ End Date
618
+ </label>
619
+ <input
620
+ type="date"
621
+ value={endDate}
622
+ onChange={(e) => setEndDate(e.target.value)}
623
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
624
+ />
625
+ </div>
626
+ </div>
627
+ )}
628
+
629
+ {/* Show in calendar — meta-tasks only (works from any view) */}
630
+ {item && (type === "project" || type === "pipeline" || type === "phase") && (
631
+ <label className="flex items-center gap-2 cursor-pointer">
632
+ <input
633
+ type="checkbox"
634
+ checked={showInCalendar}
635
+ onChange={(e) => setShowInCalendar(e.target.checked)}
636
+ className="rounded border-border"
637
+ />
638
+ <span className="text-xs text-muted-foreground">
639
+ Show in calendar
640
+ </span>
641
+ </label>
642
+ )}
643
+
644
+ {/* Estimated Time + Owner */}
645
+ <div className="grid grid-cols-2 gap-3">
646
+ <div>
647
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
648
+ <Clock className="inline h-3.5 w-3.5 mr-1 text-cyan-400" />
649
+ Estimated Time
650
+ </label>
651
+ <input
652
+ type="text"
653
+ value={estimatedTime}
654
+ onChange={(e) => setEstimatedTime(e.target.value)}
655
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-cyan-400"
656
+ placeholder="e.g. 5.0h"
657
+ />
658
+ </div>
659
+ <div>
660
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
661
+ Owner
662
+ </label>
663
+ <input
664
+ type="text"
665
+ value={owner}
666
+ onChange={(e) => setOwner(e.target.value)}
667
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary"
668
+ placeholder="gui, daedalus..."
669
+ />
670
+ </div>
671
+ </div>
672
+
673
+ {/* Description */}
674
+ <div>
675
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
676
+ Description
677
+ </label>
678
+ <textarea
679
+ value={richDescription}
680
+ onChange={(e) => setRichDescription(e.target.value)}
681
+ rows={5}
682
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary resize-y"
683
+ placeholder="Task description, context, references..."
684
+ />
685
+ {description && (
686
+ <input
687
+ type="text"
688
+ value={description}
689
+ readOnly
690
+ className="mt-1 w-full rounded-md border border-border/50 bg-muted/30 px-3 py-1.5 text-[11px] text-muted-foreground font-mono focus:outline-none"
691
+ title="Metadata (dept · hours · schedule · deps)"
692
+ />
693
+ )}
694
+ </div>
695
+
696
+ {/* Project — leaf mode only */}
697
+ {!isHierarchyMode && (
698
+ <div>
699
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
700
+ Project
701
+ </label>
702
+ <input
703
+ type="text"
704
+ value={project}
705
+ onChange={(e) => setProject(e.target.value)}
706
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary"
707
+ placeholder="arcane, mission-control..."
708
+ />
709
+ </div>
710
+ )}
711
+
712
+ {/* Phase selector — leaf mode only */}
713
+ {!isHierarchyMode && phaseOptions.length > 0 && (
714
+ <div>
715
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
716
+ Phase (optional)
717
+ </label>
718
+ <select
719
+ value={parentId}
720
+ onChange={(e) => setParentId(e.target.value)}
721
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
722
+ >
723
+ <option value="">No phase</option>
724
+ {phaseOptions.map((p) => (
725
+ <option key={p.id} value={p.id}>
726
+ {p.pipeline} / {p.title}
727
+ </option>
728
+ ))}
729
+ </select>
730
+ </div>
731
+ )}
732
+
733
+ {/* Scheduling section */}
734
+ <div className="border border-border/50 rounded-lg p-3 space-y-3">
735
+ {isHierarchyMode ? (
736
+ <div className="flex items-center justify-between">
737
+ <p className="text-xs font-semibold text-foreground flex items-center gap-1.5">
738
+ <Zap className="h-3.5 w-3.5 text-amber-400" />
739
+ Scheduling
740
+ </p>
741
+ <div>
742
+ <label className="block text-[10px] font-medium text-muted-foreground mb-1 text-right">
743
+ Color
744
+ </label>
745
+ <div className="flex gap-1.5">
746
+ {COLORS.map((c) => (
747
+ <button
748
+ key={c}
749
+ onClick={() => setColor(c)}
750
+ className={`h-5 w-5 rounded-full border-2 transition-transform ${
751
+ color === c
752
+ ? "border-foreground scale-110"
753
+ : "border-transparent hover:scale-105"
754
+ }`}
755
+ style={{ backgroundColor: c }}
756
+ />
757
+ ))}
758
+ </div>
759
+ </div>
760
+ </div>
761
+ ) : (
762
+ <p className="text-xs font-semibold text-foreground flex items-center gap-1.5">
763
+ <Zap className="h-3.5 w-3.5 text-amber-400" />
764
+ Scheduling
765
+ </p>
766
+ )}
767
+
768
+ <label className="flex items-center gap-2 cursor-pointer">
769
+ <input
770
+ type="checkbox"
771
+ checked={!needsApproval}
772
+ onChange={(e) => setNeedsApproval(!e.target.checked)}
773
+ className="rounded border-border"
774
+ />
775
+ <span className="text-xs text-foreground">
776
+ Start without Gui approval
777
+ </span>
778
+ </label>
779
+
780
+ <div>
781
+ <label className="block text-[10px] font-medium text-muted-foreground mb-1">
782
+ Trigger
783
+ </label>
784
+ <div className="flex gap-2">
785
+ {(["none", "at", "cron"] as const).map((kind) => (
786
+ <button
787
+ key={kind}
788
+ type="button"
789
+ onClick={() => setTriggerKind(kind)}
790
+ className={`px-2.5 py-1 text-[10px] rounded-md border transition-colors ${
791
+ triggerKind === kind
792
+ ? "border-primary bg-primary/10 text-primary"
793
+ : "border-border text-muted-foreground hover:text-foreground"
794
+ }`}
795
+ >
796
+ {kind === "none" ? "Manual" : kind === "at" ? "At time" : "Cron"}
797
+ </button>
798
+ ))}
799
+ </div>
800
+ </div>
801
+
802
+ {triggerKind === "at" && (
803
+ <div>
804
+ <label className="block text-[10px] font-medium text-muted-foreground mb-1">
805
+ Trigger at
806
+ </label>
807
+ <input
808
+ type="datetime-local"
809
+ value={triggerAt}
810
+ onChange={(e) => setTriggerAt(e.target.value)}
811
+ className="w-full rounded-md border border-border bg-background px-2 py-1.5 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
812
+ />
813
+ </div>
814
+ )}
815
+
816
+ {triggerKind === "cron" && (
817
+ <div className="space-y-2">
818
+ <div>
819
+ <label className="block text-[10px] font-medium text-muted-foreground mb-1">
820
+ Cron expression
821
+ </label>
822
+ <input
823
+ type="text"
824
+ value={triggerCron}
825
+ onChange={(e) => setTriggerCron(e.target.value)}
826
+ placeholder="0 10 * * 1 (Mon 10:00)"
827
+ className="w-full rounded-md border border-border bg-background px-2 py-1.5 text-xs text-foreground font-mono placeholder:text-muted-foreground/40 focus:outline-none focus:ring-1 focus:ring-primary"
828
+ />
829
+ </div>
830
+ <div>
831
+ <label className="block text-[10px] font-medium text-muted-foreground mb-1">
832
+ Timezone
833
+ </label>
834
+ <input
835
+ type="text"
836
+ value={triggerTz}
837
+ onChange={(e) => setTriggerTz(e.target.value)}
838
+ className="w-full rounded-md border border-border bg-background px-2 py-1.5 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
839
+ />
840
+ </div>
841
+ </div>
842
+ )}
843
+
844
+ <label className="flex items-center gap-2 cursor-pointer">
845
+ <input
846
+ type="checkbox"
847
+ checked={isRecurring}
848
+ onChange={(e) => setIsRecurring(e.target.checked)}
849
+ className="rounded border-border"
850
+ />
851
+ <span className="text-xs text-foreground">Recurring</span>
852
+ <span className="text-[10px] text-muted-foreground">
853
+ Auto-recreates after completion
854
+ </span>
855
+ </label>
856
+
857
+ <div className="grid grid-cols-2 gap-3">
858
+ <div>
859
+ <label className="block text-[10px] font-medium text-muted-foreground mb-1">
860
+ Capacity
861
+ </label>
862
+ <select
863
+ value={capacityClass}
864
+ onChange={(e) => setCapacityClass(e.target.value)}
865
+ className="w-full rounded-md border border-border bg-background px-2 py-1.5 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
866
+ >
867
+ <option value="light">Light (0.5)</option>
868
+ <option value="normal">Normal (1.0)</option>
869
+ <option value="heavy">Heavy (2.0)</option>
870
+ </select>
871
+ </div>
872
+ <div>
873
+ <label className="block text-[10px] font-medium text-muted-foreground mb-1">
874
+ Priority
875
+ </label>
876
+ <input
877
+ type="number"
878
+ value={autoPriority}
879
+ onChange={(e) => setAutoPriority(parseInt(e.target.value, 10) || 0)}
880
+ min={0}
881
+ className="w-full rounded-md border border-border bg-background px-2 py-1.5 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-primary"
882
+ />
883
+ </div>
884
+ </div>
885
+ </div>
886
+
887
+ {/* Next Action */}
888
+ <div>
889
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
890
+ Next Action
891
+ </label>
892
+ <textarea
893
+ value={nextAction}
894
+ onChange={(e) => setNextAction(e.target.value)}
895
+ rows={2}
896
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary resize-none"
897
+ placeholder="What's the next step?"
898
+ />
899
+ </div>
900
+
901
+ {/* Dependencies — hierarchy edit mode only */}
902
+ {isHierarchyMode && item && (predecessors.length > 0 || successors.length > 0) && (
903
+ <div className="border border-border/50 rounded-lg p-3 space-y-2">
904
+ <p className="text-xs font-semibold text-foreground flex items-center gap-1.5">
905
+ <ArrowRightFromLine className="h-3.5 w-3.5 text-purple-400" />
906
+ Dependencies
907
+ </p>
908
+
909
+ {predecessors.length > 0 && (
910
+ <div>
911
+ <p className="text-[10px] font-medium text-blue-400 mb-1 flex items-center gap-1">
912
+ <ArrowLeftFromLine className="h-3 w-3" />
913
+ Depends on ({predecessors.length})
914
+ </p>
915
+ <div className="space-y-1 ml-4">
916
+ {predecessors.map((p) => (
917
+ <div key={p.id} className="flex items-center gap-2 text-xs">
918
+ <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${
919
+ p.status === "done" ? "bg-green-400" : p.status === "running" ? "bg-yellow-400" : "bg-orange-400"
920
+ }`} />
921
+ <span className="text-foreground/80 truncate flex-1">{p.title}</span>
922
+ <span className="text-[9px] text-muted-foreground/50 font-mono shrink-0">{p.id}</span>
923
+ <span className={`text-[9px] px-1.5 py-0.5 rounded-full ${
924
+ p.status === "done" ? "bg-green-500/15 text-green-400" : "bg-orange-500/15 text-orange-400"
925
+ }`}>{p.status}</span>
926
+ </div>
927
+ ))}
928
+ </div>
929
+ </div>
930
+ )}
931
+
932
+ {successors.length > 0 && (
933
+ <div>
934
+ <p className="text-[10px] font-medium text-purple-400 mb-1 flex items-center gap-1">
935
+ <ArrowRightFromLine className="h-3 w-3" />
936
+ Blocks ({successors.length})
937
+ </p>
938
+ <div className="space-y-1 ml-4">
939
+ {successors.map((s) => (
940
+ <div key={s.id} className="flex items-center gap-2 text-xs">
941
+ <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${
942
+ s.status === "done" ? "bg-green-400" : s.status === "running" ? "bg-yellow-400" : "bg-zinc-400"
943
+ }`} />
944
+ <span className="text-foreground/80 truncate flex-1">{s.title}</span>
945
+ <span className="text-[9px] text-muted-foreground/50 font-mono shrink-0">{s.id}</span>
946
+ <span className={`text-[9px] px-1.5 py-0.5 rounded-full ${
947
+ s.status === "done" ? "bg-green-500/15 text-green-400" : "bg-zinc-500/15 text-zinc-400"
948
+ }`}>{s.status}</span>
949
+ </div>
950
+ ))}
951
+ </div>
952
+ </div>
953
+ )}
954
+ </div>
955
+ )}
956
+
957
+ {/* Attachments / Items */}
958
+ <div>
959
+ <label className="block text-xs font-medium text-muted-foreground mb-1">
960
+ <Paperclip className="inline h-3.5 w-3.5 mr-1" />
961
+ Items / Attachments
962
+ </label>
963
+ <div
964
+ onDrop={handleDrop}
965
+ onDragOver={handleDragOver}
966
+ onDragLeave={handleDragLeave}
967
+ className={`rounded-lg border-2 border-dashed transition-colors p-3 min-h-[60px] ${
968
+ dragOver
969
+ ? "border-primary bg-primary/5"
970
+ : "border-border/50 hover:border-border"
971
+ }`}
972
+ >
973
+ {artifacts.length > 0 ? (
974
+ <ul className="space-y-1">
975
+ {artifacts.map((a) => (
976
+ <li
977
+ key={a}
978
+ className="flex items-center gap-2 group/artifact"
979
+ >
980
+ <span className="flex-1 min-w-0 text-xs text-foreground/80 truncate font-mono" title={a}>
981
+ {a}
982
+ </span>
983
+ <button
984
+ type="button"
985
+ onClick={() => removeArtifact(a)}
986
+ className="shrink-0 text-muted-foreground/40 hover:text-red-400 transition-colors opacity-0 group-hover/artifact:opacity-100"
987
+ >
988
+ <Trash2 className="h-3 w-3" />
989
+ </button>
990
+ </li>
991
+ ))}
992
+ </ul>
993
+ ) : (
994
+ <p className="text-[11px] text-muted-foreground/50 text-center py-1">
995
+ Drop files or links here
996
+ </p>
997
+ )}
998
+ </div>
999
+ <input
1000
+ type="text"
1001
+ placeholder="Or paste a path / URL and press Enter"
1002
+ className="mt-1.5 w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-xs text-foreground font-mono placeholder:text-muted-foreground/40 focus:outline-none focus:ring-1 focus:ring-primary"
1003
+ onKeyDown={(e) => {
1004
+ if (e.key === "Enter") {
1005
+ const val = (e.target as HTMLInputElement).value.trim();
1006
+ if (val) {
1007
+ setArtifacts((prev) =>
1008
+ prev.includes(val) ? prev : [...prev, val]
1009
+ );
1010
+ (e.target as HTMLInputElement).value = "";
1011
+ }
1012
+ e.preventDefault();
1013
+ }
1014
+ }}
1015
+ />
1016
+ </div>
1017
+ </div>
1018
+
1019
+ <div className="mt-6 flex justify-end gap-2">
1020
+ <button
1021
+ onClick={onClose}
1022
+ className="rounded-md px-4 py-2 text-sm text-muted-foreground hover:text-foreground transition-colors"
1023
+ >
1024
+ Cancel
1025
+ </button>
1026
+ <button
1027
+ onClick={handleSave}
1028
+ disabled={saving || !title.trim()}
1029
+ className="rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50"
1030
+ >
1031
+ {saving
1032
+ ? "Saving..."
1033
+ : item
1034
+ ? "Update"
1035
+ : isHierarchyMode
1036
+ ? `Create ${type}`
1037
+ : "Create"}
1038
+ </button>
1039
+ </div>
1040
+ </div>
1041
+ </div>
1042
+ );
1043
+ }