jfl 0.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 (381) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +313 -0
  3. package/clawdbot-skill/README.md +328 -0
  4. package/clawdbot-skill/SKILL.md +362 -0
  5. package/clawdbot-skill/index.ts +486 -0
  6. package/clawdbot-skill/package.json +28 -0
  7. package/clawdbot-skill/skill.json +28 -0
  8. package/dist/commands/agents.d.ts +5 -0
  9. package/dist/commands/agents.d.ts.map +1 -0
  10. package/dist/commands/agents.js +399 -0
  11. package/dist/commands/agents.js.map +1 -0
  12. package/dist/commands/context-hub.d.ts +12 -0
  13. package/dist/commands/context-hub.d.ts.map +1 -0
  14. package/dist/commands/context-hub.js +642 -0
  15. package/dist/commands/context-hub.js.map +1 -0
  16. package/dist/commands/deploy.d.ts +5 -0
  17. package/dist/commands/deploy.d.ts.map +1 -0
  18. package/dist/commands/deploy.js +370 -0
  19. package/dist/commands/deploy.js.map +1 -0
  20. package/dist/commands/feedback.d.ts +2 -0
  21. package/dist/commands/feedback.d.ts.map +1 -0
  22. package/dist/commands/feedback.js +178 -0
  23. package/dist/commands/feedback.js.map +1 -0
  24. package/dist/commands/hud.d.ts +4 -0
  25. package/dist/commands/hud.d.ts.map +1 -0
  26. package/dist/commands/hud.js +262 -0
  27. package/dist/commands/hud.js.map +1 -0
  28. package/dist/commands/init.d.ts +4 -0
  29. package/dist/commands/init.d.ts.map +1 -0
  30. package/dist/commands/init.js +553 -0
  31. package/dist/commands/init.js.map +1 -0
  32. package/dist/commands/login.d.ts +23 -0
  33. package/dist/commands/login.d.ts.map +1 -0
  34. package/dist/commands/login.js +818 -0
  35. package/dist/commands/login.js.map +1 -0
  36. package/dist/commands/ralph.d.ts +9 -0
  37. package/dist/commands/ralph.d.ts.map +1 -0
  38. package/dist/commands/ralph.js +67 -0
  39. package/dist/commands/ralph.js.map +1 -0
  40. package/dist/commands/repair.d.ts +7 -0
  41. package/dist/commands/repair.d.ts.map +1 -0
  42. package/dist/commands/repair.js +283 -0
  43. package/dist/commands/repair.js.map +1 -0
  44. package/dist/commands/session-mgmt.d.ts +33 -0
  45. package/dist/commands/session-mgmt.d.ts.map +1 -0
  46. package/dist/commands/session-mgmt.js +404 -0
  47. package/dist/commands/session-mgmt.js.map +1 -0
  48. package/dist/commands/session.d.ts +2 -0
  49. package/dist/commands/session.d.ts.map +1 -0
  50. package/dist/commands/session.js +639 -0
  51. package/dist/commands/session.js.map +1 -0
  52. package/dist/commands/skills.d.ts +31 -0
  53. package/dist/commands/skills.d.ts.map +1 -0
  54. package/dist/commands/skills.js +314 -0
  55. package/dist/commands/skills.js.map +1 -0
  56. package/dist/commands/status.d.ts +2 -0
  57. package/dist/commands/status.d.ts.map +1 -0
  58. package/dist/commands/status.js +127 -0
  59. package/dist/commands/status.js.map +1 -0
  60. package/dist/commands/synopsis.d.ts +10 -0
  61. package/dist/commands/synopsis.d.ts.map +1 -0
  62. package/dist/commands/synopsis.js +277 -0
  63. package/dist/commands/synopsis.js.map +1 -0
  64. package/dist/commands/update.d.ts +10 -0
  65. package/dist/commands/update.d.ts.map +1 -0
  66. package/dist/commands/update.js +165 -0
  67. package/dist/commands/update.js.map +1 -0
  68. package/dist/commands/voice.d.ts +410 -0
  69. package/dist/commands/voice.d.ts.map +1 -0
  70. package/dist/commands/voice.js +4763 -0
  71. package/dist/commands/voice.js.map +1 -0
  72. package/dist/index.d.ts +9 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +512 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/mcp/context-hub-mcp.d.ts +11 -0
  77. package/dist/mcp/context-hub-mcp.d.ts.map +1 -0
  78. package/dist/mcp/context-hub-mcp.js +548 -0
  79. package/dist/mcp/context-hub-mcp.js.map +1 -0
  80. package/dist/telegram/voice.d.ts +146 -0
  81. package/dist/telegram/voice.d.ts.map +1 -0
  82. package/dist/telegram/voice.js +351 -0
  83. package/dist/telegram/voice.js.map +1 -0
  84. package/dist/types/skills.d.ts +44 -0
  85. package/dist/types/skills.d.ts.map +1 -0
  86. package/dist/types/skills.js +5 -0
  87. package/dist/types/skills.js.map +1 -0
  88. package/dist/ui/banner.d.ts +18 -0
  89. package/dist/ui/banner.d.ts.map +1 -0
  90. package/dist/ui/banner.js +323 -0
  91. package/dist/ui/banner.js.map +1 -0
  92. package/dist/ui/index.d.ts +8 -0
  93. package/dist/ui/index.d.ts.map +1 -0
  94. package/dist/ui/index.js +8 -0
  95. package/dist/ui/index.js.map +1 -0
  96. package/dist/ui/prompts.d.ts +52 -0
  97. package/dist/ui/prompts.d.ts.map +1 -0
  98. package/dist/ui/prompts.js +72 -0
  99. package/dist/ui/prompts.js.map +1 -0
  100. package/dist/ui/theme.d.ts +82 -0
  101. package/dist/ui/theme.d.ts.map +1 -0
  102. package/dist/ui/theme.js +142 -0
  103. package/dist/ui/theme.js.map +1 -0
  104. package/dist/utils/auth-guard.d.ts +66 -0
  105. package/dist/utils/auth-guard.d.ts.map +1 -0
  106. package/dist/utils/auth-guard.js +348 -0
  107. package/dist/utils/auth-guard.js.map +1 -0
  108. package/dist/utils/ensure-project.d.ts +11 -0
  109. package/dist/utils/ensure-project.d.ts.map +1 -0
  110. package/dist/utils/ensure-project.js +70 -0
  111. package/dist/utils/ensure-project.js.map +1 -0
  112. package/dist/utils/git.d.ts +73 -0
  113. package/dist/utils/git.d.ts.map +1 -0
  114. package/dist/utils/git.js +219 -0
  115. package/dist/utils/git.js.map +1 -0
  116. package/dist/utils/github-auth.d.ts +54 -0
  117. package/dist/utils/github-auth.d.ts.map +1 -0
  118. package/dist/utils/github-auth.js +375 -0
  119. package/dist/utils/github-auth.js.map +1 -0
  120. package/dist/utils/github-repo.d.ts +30 -0
  121. package/dist/utils/github-repo.d.ts.map +1 -0
  122. package/dist/utils/github-repo.js +219 -0
  123. package/dist/utils/github-repo.js.map +1 -0
  124. package/dist/utils/platform-auth.d.ts +81 -0
  125. package/dist/utils/platform-auth.d.ts.map +1 -0
  126. package/dist/utils/platform-auth.js +191 -0
  127. package/dist/utils/platform-auth.js.map +1 -0
  128. package/dist/utils/project-config.d.ts +43 -0
  129. package/dist/utils/project-config.d.ts.map +1 -0
  130. package/dist/utils/project-config.js +97 -0
  131. package/dist/utils/project-config.js.map +1 -0
  132. package/dist/utils/skill-registry.d.ts +49 -0
  133. package/dist/utils/skill-registry.d.ts.map +1 -0
  134. package/dist/utils/skill-registry.js +192 -0
  135. package/dist/utils/skill-registry.js.map +1 -0
  136. package/dist/utils/wallet.d.ts +62 -0
  137. package/dist/utils/wallet.d.ts.map +1 -0
  138. package/dist/utils/wallet.js +252 -0
  139. package/dist/utils/wallet.js.map +1 -0
  140. package/dist/utils/x402-client.d.ts +86 -0
  141. package/dist/utils/x402-client.d.ts.map +1 -0
  142. package/dist/utils/x402-client.js +265 -0
  143. package/dist/utils/x402-client.js.map +1 -0
  144. package/package.json +76 -0
  145. package/scripts/postinstall.js +116 -0
  146. package/scripts/test-onboarding.sh +121 -0
  147. package/scripts/voice-start.sh +128 -0
  148. package/scripts/voice-stop.sh +33 -0
  149. package/template/.claude/settings.json +92 -0
  150. package/template/.claude/skills/agent-browser/SKILL.md +116 -0
  151. package/template/.claude/skills/brand-architect/SKILL.md +240 -0
  152. package/template/.claude/skills/brand-architect/config.yaml +137 -0
  153. package/template/.claude/skills/campaign-hud/config.yaml +112 -0
  154. package/template/.claude/skills/content-creator/SKILL.md +294 -0
  155. package/template/.claude/skills/debug/MULTI_AGENT.md +360 -0
  156. package/template/.claude/skills/debug/SKILL.md +549 -0
  157. package/template/.claude/skills/fly-deploy/SKILL.md +676 -0
  158. package/template/.claude/skills/founder-video/SKILL.md +467 -0
  159. package/template/.claude/skills/hud/SKILL.md +157 -0
  160. package/template/.claude/skills/ralph-tui/SKILL.md +210 -0
  161. package/template/.claude/skills/react-best-practices/AGENTS.md +2249 -0
  162. package/template/.claude/skills/react-best-practices/README.md +123 -0
  163. package/template/.claude/skills/react-best-practices/SKILL.md +125 -0
  164. package/template/.claude/skills/react-best-practices/metadata.json +15 -0
  165. package/template/.claude/skills/react-best-practices/rules/_sections.md +46 -0
  166. package/template/.claude/skills/react-best-practices/rules/_template.md +28 -0
  167. package/template/.claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  168. package/template/.claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  169. package/template/.claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
  170. package/template/.claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
  171. package/template/.claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
  172. package/template/.claude/skills/react-best-practices/rules/async-parallel.md +28 -0
  173. package/template/.claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  174. package/template/.claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  175. package/template/.claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  176. package/template/.claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  177. package/template/.claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  178. package/template/.claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
  179. package/template/.claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  180. package/template/.claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  181. package/template/.claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  182. package/template/.claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  183. package/template/.claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  184. package/template/.claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  185. package/template/.claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  186. package/template/.claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
  187. package/template/.claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  188. package/template/.claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
  189. package/template/.claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  190. package/template/.claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  191. package/template/.claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  192. package/template/.claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  193. package/template/.claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
  194. package/template/.claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  195. package/template/.claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  196. package/template/.claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  197. package/template/.claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  198. package/template/.claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  199. package/template/.claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  200. package/template/.claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  201. package/template/.claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  202. package/template/.claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  203. package/template/.claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  204. package/template/.claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  205. package/template/.claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
  206. package/template/.claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  207. package/template/.claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  208. package/template/.claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  209. package/template/.claude/skills/react-best-practices/rules/server-cache-react.md +26 -0
  210. package/template/.claude/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
  211. package/template/.claude/skills/react-best-practices/rules/server-serialization.md +38 -0
  212. package/template/.claude/skills/remotion-best-practices/SKILL.md +43 -0
  213. package/template/.claude/skills/remotion-best-practices/rules/3d.md +86 -0
  214. package/template/.claude/skills/remotion-best-practices/rules/animations.md +29 -0
  215. package/template/.claude/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  216. package/template/.claude/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  217. package/template/.claude/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
  218. package/template/.claude/skills/remotion-best-practices/rules/assets.md +78 -0
  219. package/template/.claude/skills/remotion-best-practices/rules/audio.md +172 -0
  220. package/template/.claude/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
  221. package/template/.claude/skills/remotion-best-practices/rules/can-decode.md +75 -0
  222. package/template/.claude/skills/remotion-best-practices/rules/charts.md +58 -0
  223. package/template/.claude/skills/remotion-best-practices/rules/compositions.md +146 -0
  224. package/template/.claude/skills/remotion-best-practices/rules/display-captions.md +126 -0
  225. package/template/.claude/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  226. package/template/.claude/skills/remotion-best-practices/rules/fonts.md +152 -0
  227. package/template/.claude/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  228. package/template/.claude/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  229. package/template/.claude/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
  230. package/template/.claude/skills/remotion-best-practices/rules/gifs.md +138 -0
  231. package/template/.claude/skills/remotion-best-practices/rules/images.md +130 -0
  232. package/template/.claude/skills/remotion-best-practices/rules/import-srt-captions.md +67 -0
  233. package/template/.claude/skills/remotion-best-practices/rules/lottie.md +68 -0
  234. package/template/.claude/skills/remotion-best-practices/rules/measuring-dom-nodes.md +35 -0
  235. package/template/.claude/skills/remotion-best-practices/rules/measuring-text.md +143 -0
  236. package/template/.claude/skills/remotion-best-practices/rules/sequencing.md +106 -0
  237. package/template/.claude/skills/remotion-best-practices/rules/tailwind.md +11 -0
  238. package/template/.claude/skills/remotion-best-practices/rules/text-animations.md +20 -0
  239. package/template/.claude/skills/remotion-best-practices/rules/timing.md +179 -0
  240. package/template/.claude/skills/remotion-best-practices/rules/transcribe-captions.md +19 -0
  241. package/template/.claude/skills/remotion-best-practices/rules/transitions.md +122 -0
  242. package/template/.claude/skills/remotion-best-practices/rules/trimming.md +53 -0
  243. package/template/.claude/skills/remotion-best-practices/rules/videos.md +171 -0
  244. package/template/.claude/skills/search/SKILL.md +220 -0
  245. package/template/.claude/skills/spec/SKILL.md +377 -0
  246. package/template/.claude/skills/startup/SKILL.md +310 -0
  247. package/template/.claude/skills/web-architect/SKILL.md +309 -0
  248. package/template/.claude/skills/x-algorithm/SKILL.md +305 -0
  249. package/template/.jfl/config.json +8 -0
  250. package/template/.mcp.json +11 -0
  251. package/template/CLAUDE.md +960 -0
  252. package/template/content/.gitkeep +0 -0
  253. package/template/context-hub +3 -0
  254. package/template/knowledge/BRAND_BRIEF.md +124 -0
  255. package/template/knowledge/BRAND_DECISIONS.md +168 -0
  256. package/template/knowledge/NARRATIVE.md +114 -0
  257. package/template/knowledge/ROADMAP.md +128 -0
  258. package/template/knowledge/THESIS.md +108 -0
  259. package/template/knowledge/VISION.md +74 -0
  260. package/template/knowledge/VOICE_AND_TONE.md +146 -0
  261. package/template/previews/.gitkeep +0 -0
  262. package/template/scripts/session/auto-commit.sh +245 -0
  263. package/template/scripts/session/auto-merge.sh +325 -0
  264. package/template/scripts/session/jfl-doctor.sh +587 -0
  265. package/template/scripts/session/session-end.sh +194 -0
  266. package/template/scripts/session/session-init.sh +163 -0
  267. package/template/scripts/session/session-sync.sh +167 -0
  268. package/template/scripts/session/test-context-preservation.sh +160 -0
  269. package/template/skills/agent-browser/SKILL.md +116 -0
  270. package/template/skills/brand-architect/SKILL.md +240 -0
  271. package/template/skills/brand-architect/config.yaml +137 -0
  272. package/template/skills/campaign-hud/config.yaml +112 -0
  273. package/template/skills/content-creator/SKILL.md +294 -0
  274. package/template/skills/debug/MULTI_AGENT.md +360 -0
  275. package/template/skills/debug/SKILL.md +549 -0
  276. package/template/skills/fly-deploy/SKILL.md +676 -0
  277. package/template/skills/founder-video/SKILL.md +467 -0
  278. package/template/skills/hud/SKILL.md +204 -0
  279. package/template/skills/ralph-tui/SKILL.md +210 -0
  280. package/template/skills/react-best-practices/AGENTS.md +2249 -0
  281. package/template/skills/react-best-practices/README.md +123 -0
  282. package/template/skills/react-best-practices/SKILL.md +125 -0
  283. package/template/skills/react-best-practices/metadata.json +15 -0
  284. package/template/skills/react-best-practices/rules/_sections.md +46 -0
  285. package/template/skills/react-best-practices/rules/_template.md +28 -0
  286. package/template/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  287. package/template/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  288. package/template/skills/react-best-practices/rules/async-api-routes.md +38 -0
  289. package/template/skills/react-best-practices/rules/async-defer-await.md +80 -0
  290. package/template/skills/react-best-practices/rules/async-dependencies.md +36 -0
  291. package/template/skills/react-best-practices/rules/async-parallel.md +28 -0
  292. package/template/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  293. package/template/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  294. package/template/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  295. package/template/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  296. package/template/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  297. package/template/skills/react-best-practices/rules/bundle-preload.md +50 -0
  298. package/template/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  299. package/template/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  300. package/template/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  301. package/template/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  302. package/template/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  303. package/template/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  304. package/template/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  305. package/template/skills/react-best-practices/rules/js-early-exit.md +50 -0
  306. package/template/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  307. package/template/skills/react-best-practices/rules/js-index-maps.md +37 -0
  308. package/template/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  309. package/template/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  310. package/template/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  311. package/template/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  312. package/template/skills/react-best-practices/rules/rendering-activity.md +26 -0
  313. package/template/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  314. package/template/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  315. package/template/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  316. package/template/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  317. package/template/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  318. package/template/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  319. package/template/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  320. package/template/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  321. package/template/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  322. package/template/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  323. package/template/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  324. package/template/skills/react-best-practices/rules/rerender-memo.md +44 -0
  325. package/template/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  326. package/template/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  327. package/template/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  328. package/template/skills/react-best-practices/rules/server-cache-react.md +26 -0
  329. package/template/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
  330. package/template/skills/react-best-practices/rules/server-serialization.md +38 -0
  331. package/template/skills/remotion-best-practices/SKILL.md +43 -0
  332. package/template/skills/remotion-best-practices/rules/3d.md +86 -0
  333. package/template/skills/remotion-best-practices/rules/animations.md +29 -0
  334. package/template/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  335. package/template/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  336. package/template/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
  337. package/template/skills/remotion-best-practices/rules/assets.md +78 -0
  338. package/template/skills/remotion-best-practices/rules/audio.md +172 -0
  339. package/template/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
  340. package/template/skills/remotion-best-practices/rules/can-decode.md +75 -0
  341. package/template/skills/remotion-best-practices/rules/charts.md +58 -0
  342. package/template/skills/remotion-best-practices/rules/compositions.md +146 -0
  343. package/template/skills/remotion-best-practices/rules/display-captions.md +126 -0
  344. package/template/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  345. package/template/skills/remotion-best-practices/rules/fonts.md +152 -0
  346. package/template/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  347. package/template/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  348. package/template/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
  349. package/template/skills/remotion-best-practices/rules/gifs.md +138 -0
  350. package/template/skills/remotion-best-practices/rules/images.md +130 -0
  351. package/template/skills/remotion-best-practices/rules/import-srt-captions.md +67 -0
  352. package/template/skills/remotion-best-practices/rules/lottie.md +68 -0
  353. package/template/skills/remotion-best-practices/rules/measuring-dom-nodes.md +35 -0
  354. package/template/skills/remotion-best-practices/rules/measuring-text.md +143 -0
  355. package/template/skills/remotion-best-practices/rules/sequencing.md +106 -0
  356. package/template/skills/remotion-best-practices/rules/tailwind.md +11 -0
  357. package/template/skills/remotion-best-practices/rules/text-animations.md +20 -0
  358. package/template/skills/remotion-best-practices/rules/timing.md +179 -0
  359. package/template/skills/remotion-best-practices/rules/transcribe-captions.md +19 -0
  360. package/template/skills/remotion-best-practices/rules/transitions.md +122 -0
  361. package/template/skills/remotion-best-practices/rules/trimming.md +53 -0
  362. package/template/skills/remotion-best-practices/rules/videos.md +171 -0
  363. package/template/skills/search/SKILL.md +220 -0
  364. package/template/skills/spec/SKILL.md +377 -0
  365. package/template/skills/startup/SKILL.md +310 -0
  366. package/template/skills/web-architect/SKILL.md +309 -0
  367. package/template/skills/x-algorithm/SKILL.md +305 -0
  368. package/template/suggestions/.gitkeep +0 -0
  369. package/template/templates/QUICKSTART_SKILL_TO_PRODUCT.md +242 -0
  370. package/template/templates/brand/BRAND_BRIEF.md +124 -0
  371. package/template/templates/brand/BRAND_DECISIONS.md +168 -0
  372. package/template/templates/brand/BRAND_GUIDELINES.md +251 -0
  373. package/template/templates/brand/VOICE_AND_TONE.md +146 -0
  374. package/template/templates/brand/global.css +240 -0
  375. package/template/templates/collaboration/CONTRIBUTOR.md +74 -0
  376. package/template/templates/collaboration/CRM.md +97 -0
  377. package/template/templates/collaboration/TASKS.md +83 -0
  378. package/template/templates/strategic/NARRATIVE.md +114 -0
  379. package/template/templates/strategic/ROADMAP.md +128 -0
  380. package/template/templates/strategic/THESIS.md +108 -0
  381. package/template/templates/strategic/VISION.md +74 -0
@@ -0,0 +1,142 @@
1
+ /**
2
+ * JFL Theme System
3
+ * Consistent colors and styling across the CLI
4
+ */
5
+ import chalk from "chalk";
6
+ // ============================================================================
7
+ // COLOR PALETTE
8
+ // ============================================================================
9
+ export const colors = {
10
+ // Primary brand
11
+ accent: "#FFD700", // Gold - main brand color
12
+ accentSoft: "#FFA500", // Orange - secondary
13
+ accentDim: "#B8860B", // Dark gold - subtle emphasis
14
+ // Text hierarchy
15
+ text: "#F5F5F5", // Primary text
16
+ textSoft: "#C0C0C0", // Secondary text
17
+ dim: "#888888", // Muted/subtle
18
+ dimmer: "#555555", // Very subtle
19
+ // Semantic
20
+ success: "#00FF88", // Green - success
21
+ error: "#FF4444", // Red - error
22
+ warning: "#FFAA00", // Amber - warning
23
+ info: "#4FC3F7", // Light blue - info
24
+ // Special
25
+ rocket: "#FF6B6B", // Launch moments
26
+ ship: "#4ECDC4", // Ship references
27
+ code: "#F0C987", // Code/technical
28
+ // Backgrounds (for supported terminals)
29
+ bgDark: "#1E1E1E",
30
+ bgCard: "#2B2F36",
31
+ };
32
+ // ============================================================================
33
+ // THEME HELPERS
34
+ // ============================================================================
35
+ export const theme = {
36
+ // Text styles
37
+ text: (s) => chalk.hex(colors.text)(s),
38
+ soft: (s) => chalk.hex(colors.textSoft)(s),
39
+ dim: (s) => chalk.hex(colors.dim)(s),
40
+ dimmer: (s) => chalk.hex(colors.dimmer)(s),
41
+ // Brand
42
+ accent: (s) => chalk.hex(colors.accent)(s),
43
+ accentSoft: (s) => chalk.hex(colors.accentSoft)(s),
44
+ accentBold: (s) => chalk.hex(colors.accent).bold(s),
45
+ // Semantic
46
+ success: (s) => chalk.hex(colors.success)(s),
47
+ error: (s) => chalk.hex(colors.error)(s),
48
+ warning: (s) => chalk.hex(colors.warning)(s),
49
+ info: (s) => chalk.hex(colors.info)(s),
50
+ // Special
51
+ rocket: (s) => chalk.hex(colors.rocket)(s),
52
+ ship: (s) => chalk.hex(colors.ship)(s),
53
+ code: (s) => chalk.hex(colors.code)(s),
54
+ // Combinations
55
+ bold: chalk.bold,
56
+ italic: chalk.italic,
57
+ underline: chalk.underline,
58
+ // Utility
59
+ check: chalk.hex(colors.success)("✓"),
60
+ cross: chalk.hex(colors.error)("✗"),
61
+ dot: chalk.hex(colors.dim)("•"),
62
+ arrow: chalk.hex(colors.accent)("→"),
63
+ };
64
+ // ============================================================================
65
+ // SYMBOLS
66
+ // ============================================================================
67
+ export const symbols = {
68
+ // Status
69
+ success: "✓",
70
+ error: "✗",
71
+ warning: "⚠",
72
+ info: "ℹ",
73
+ // Progress
74
+ spinner: ["◐", "◓", "◑", "◒"],
75
+ dots: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
76
+ // Structure
77
+ bullet: "•",
78
+ arrow: "→",
79
+ arrowRight: "▸",
80
+ line: "─",
81
+ corner: "└",
82
+ tee: "├",
83
+ pipe: "│",
84
+ // Special
85
+ rocket: "🚀",
86
+ ship: "🚢",
87
+ fire: "🔥",
88
+ star: "⭐",
89
+ sparkle: "✨",
90
+ };
91
+ // ============================================================================
92
+ // BOX DRAWING
93
+ // ============================================================================
94
+ export const box = {
95
+ topLeft: "┌",
96
+ topRight: "┐",
97
+ bottomLeft: "└",
98
+ bottomRight: "┘",
99
+ horizontal: "─",
100
+ vertical: "│",
101
+ teeRight: "├",
102
+ teeLeft: "┤",
103
+ // Heavy variant
104
+ heavyHorizontal: "━",
105
+ heavyVertical: "┃",
106
+ };
107
+ export function drawBox(content, width) {
108
+ const maxLen = width || Math.max(...content.map((l) => stripAnsi(l).length));
109
+ const lines = [];
110
+ lines.push(theme.dim(box.topLeft + box.horizontal.repeat(maxLen + 2) + box.topRight));
111
+ for (const line of content) {
112
+ const stripped = stripAnsi(line);
113
+ const padding = " ".repeat(Math.max(0, maxLen - stripped.length));
114
+ lines.push(theme.dim(box.vertical) + " " + line + padding + " " + theme.dim(box.vertical));
115
+ }
116
+ lines.push(theme.dim(box.bottomLeft + box.horizontal.repeat(maxLen + 2) + box.bottomRight));
117
+ return lines.join("\n");
118
+ }
119
+ // ============================================================================
120
+ // UTILITIES
121
+ // ============================================================================
122
+ // Strip ANSI codes for length calculation
123
+ function stripAnsi(str) {
124
+ return str.replace(/\x1B\[[0-9;]*m/g, "");
125
+ }
126
+ // Get terminal width safely
127
+ export function getTerminalWidth() {
128
+ return process.stdout.columns || 80;
129
+ }
130
+ // Center text
131
+ export function center(text, width) {
132
+ const w = width || getTerminalWidth();
133
+ const stripped = stripAnsi(text);
134
+ const padding = Math.max(0, Math.floor((w - stripped.length) / 2));
135
+ return " ".repeat(padding) + text;
136
+ }
137
+ // Horizontal rule
138
+ export function hr(char = "─", width) {
139
+ const w = width || getTerminalWidth();
140
+ return theme.dimmer(char.repeat(w));
141
+ }
142
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Auth Guard for JFL CLI
3
+ *
4
+ * Payment model:
5
+ * - Project has ONE wallet (owner's) that pays for the project
6
+ * - Contributors can optionally have their own wallet
7
+ * - If project wallet low + contributor has wallet → can transfer directly
8
+ */
9
+ import { DayPass } from './x402-client.js';
10
+ export interface AuthResult {
11
+ authenticated: boolean;
12
+ dayPass?: DayPass;
13
+ reason?: string;
14
+ }
15
+ /**
16
+ * Check if user is authenticated (has wallet with signing capability)
17
+ */
18
+ export declare function hasWallet(): boolean;
19
+ /**
20
+ * Get user's wallet address
21
+ */
22
+ export declare function getWalletAddress(): string | null;
23
+ /**
24
+ * Check auth status and day pass
25
+ * Uses PROJECT wallet for payment, not user wallet
26
+ */
27
+ export declare function checkAuth(): Promise<AuthResult>;
28
+ /**
29
+ * Ensure project has valid day pass
30
+ * Uses PROJECT wallet for payment
31
+ * If project wallet low + user has wallet → offers transfer
32
+ */
33
+ export declare function ensureDayPass(): Promise<DayPass | null>;
34
+ /**
35
+ * Show day pass status
36
+ */
37
+ export declare function showDayPassStatus(): void;
38
+ /**
39
+ * Guard decorator for commands requiring day pass
40
+ * Use this to wrap command handlers
41
+ */
42
+ export declare function requireDayPass<T>(handler: (dayPass: DayPass) => Promise<T>): Promise<T | null>;
43
+ /**
44
+ * Check if running in trial mode (no payment required)
45
+ * Trial mode allows foundation + brand setup without payment
46
+ *
47
+ * Trial ends when:
48
+ * 1. Foundation is complete, OR
49
+ * 2. A teammate has actually joined (authenticated)
50
+ * - Creating a suggestions file doesn't end trial
51
+ * - Teammate must run `jfl login` to trigger payment
52
+ */
53
+ export declare function isTrialMode(): boolean;
54
+ /**
55
+ * Mark a teammate as joined in their suggestions file
56
+ */
57
+ export declare function markTeammateJoined(username: string): boolean;
58
+ /**
59
+ * Mark foundation as complete (triggers payment requirement)
60
+ */
61
+ export declare function markFoundationComplete(): void;
62
+ /**
63
+ * Check if feature requires payment
64
+ */
65
+ export declare function requiresPayment(feature: string): boolean;
66
+ //# sourceMappingURL=auth-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../src/utils/auth-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAIL,OAAO,EACR,MAAM,kBAAkB,CAAA;AAiBzB,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAqBD;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAInC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEhD;AAED;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAwBrD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAuH7D;AAqDD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAkBxC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAQnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAUrC;AA+BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAsB5D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAcxD"}
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Auth Guard for JFL CLI
3
+ *
4
+ * Payment model:
5
+ * - Project has ONE wallet (owner's) that pays for the project
6
+ * - Contributors can optionally have their own wallet
7
+ * - If project wallet low + contributor has wallet → can transfer directly
8
+ */
9
+ import chalk from 'chalk';
10
+ import ora from 'ora';
11
+ import inquirer from 'inquirer';
12
+ import Conf from 'conf';
13
+ import { getDayPass, getDayPassTimeRemaining, purchaseDayPass, } from './x402-client.js';
14
+ import { checkUsdcBalance, waitForUsdcBalance, getNetworkName, seedPhraseToPrivateKey, transferUsdc, } from './wallet.js';
15
+ import { getProjectWallet, getProjectName, } from './project-config.js';
16
+ const config = new Conf({ projectName: 'jfl' });
17
+ /**
18
+ * Get private key from config
19
+ */
20
+ function getPrivateKey() {
21
+ // Try seed phrase first
22
+ const seedPhrase = config.get('x402SeedPhrase');
23
+ if (seedPhrase) {
24
+ return seedPhraseToPrivateKey(seedPhrase, 0);
25
+ }
26
+ // Try direct private key
27
+ const privateKey = config.get('x402PrivateKey');
28
+ if (privateKey) {
29
+ return privateKey;
30
+ }
31
+ return null;
32
+ }
33
+ /**
34
+ * Check if user is authenticated (has wallet with signing capability)
35
+ */
36
+ export function hasWallet() {
37
+ const address = config.get('x402Address');
38
+ const hasKey = config.get('x402PrivateKey') || config.get('x402SeedPhrase');
39
+ return !!(address && hasKey);
40
+ }
41
+ /**
42
+ * Get user's wallet address
43
+ */
44
+ export function getWalletAddress() {
45
+ return config.get('x402Address');
46
+ }
47
+ /**
48
+ * Check auth status and day pass
49
+ * Uses PROJECT wallet for payment, not user wallet
50
+ */
51
+ export async function checkAuth() {
52
+ // Check if project has a wallet configured
53
+ const projectWallet = getProjectWallet();
54
+ if (!projectWallet) {
55
+ return {
56
+ authenticated: false,
57
+ reason: 'no_project_wallet',
58
+ };
59
+ }
60
+ // Check if day pass is valid (tied to project wallet)
61
+ const dayPass = getDayPass();
62
+ if (dayPass && dayPass.userAddress.toLowerCase() === projectWallet.toLowerCase()) {
63
+ return {
64
+ authenticated: true,
65
+ dayPass,
66
+ };
67
+ }
68
+ // No day pass - need payment
69
+ return {
70
+ authenticated: false,
71
+ reason: 'no_day_pass',
72
+ };
73
+ }
74
+ /**
75
+ * Ensure project has valid day pass
76
+ * Uses PROJECT wallet for payment
77
+ * If project wallet low + user has wallet → offers transfer
78
+ */
79
+ export async function ensureDayPass() {
80
+ const auth = await checkAuth();
81
+ const projectName = getProjectName();
82
+ if (auth.authenticated && auth.dayPass) {
83
+ return auth.dayPass;
84
+ }
85
+ // No project wallet configured - owner needs to set one up
86
+ if (auth.reason === 'no_project_wallet') {
87
+ console.log(chalk.yellow(`\n⚠️ No project wallet configured for "${projectName}"`));
88
+ console.log(chalk.gray(' Project owner needs to run: jfl login --x402\n'));
89
+ return null;
90
+ }
91
+ // Project has wallet but needs day pass
92
+ const projectWallet = getProjectWallet();
93
+ const userWallet = getWalletAddress();
94
+ const userPrivateKey = getPrivateKey();
95
+ const networkName = getNetworkName();
96
+ console.log(chalk.cyan(`\n💰 Day Pass Required ($5/day)\n`));
97
+ console.log(chalk.dim(`Project: ${projectName}`));
98
+ console.log(chalk.dim(`Network: ${networkName}`));
99
+ // Check project wallet balance
100
+ const spinner = ora('Checking project wallet...').start();
101
+ const { formatted } = await checkUsdcBalance(projectWallet);
102
+ const projectBalance = parseFloat(formatted);
103
+ spinner.stop();
104
+ console.log(chalk.gray(`Project wallet: ${projectWallet.slice(0, 10)}...${projectWallet.slice(-8)}`));
105
+ console.log(chalk.gray(`Balance: ${projectBalance >= 5 ? chalk.green('$' + projectBalance.toFixed(2)) : chalk.yellow('$' + projectBalance.toFixed(2))} USDC`));
106
+ // If project wallet has enough funds, try to purchase
107
+ if (projectBalance >= 5) {
108
+ return await purchaseProjectDayPass(projectWallet);
109
+ }
110
+ // Project wallet is low - check if user can help
111
+ console.log(chalk.yellow(`\n⚠️ Project wallet needs $${(5 - projectBalance).toFixed(2)} more USDC\n`));
112
+ // Does user have their own wallet with funds?
113
+ if (userWallet && userPrivateKey) {
114
+ const userSpinner = ora('Checking your wallet...').start();
115
+ const userUsdc = await checkUsdcBalance(userWallet);
116
+ const userBalance = parseFloat(userUsdc.formatted);
117
+ userSpinner.stop();
118
+ if (userBalance >= 5) {
119
+ console.log(chalk.green(`Your wallet has $${userBalance.toFixed(2)} USDC`));
120
+ console.log();
121
+ const { transfer } = await inquirer.prompt([
122
+ {
123
+ type: 'confirm',
124
+ name: 'transfer',
125
+ message: `Transfer $5 to project wallet? (gasless via x402)`,
126
+ default: true,
127
+ },
128
+ ]);
129
+ if (transfer) {
130
+ const transferSpinner = ora('Transferring via x402 (no gas needed)...').start();
131
+ try {
132
+ await transferUsdc(projectWallet, 5);
133
+ transferSpinner.succeed('Transferred $5 to project wallet!');
134
+ console.log();
135
+ // Now purchase day pass with project wallet
136
+ return await purchaseProjectDayPass(projectWallet);
137
+ }
138
+ catch (error) {
139
+ transferSpinner.fail('Transfer failed');
140
+ const errorMsg = error instanceof Error ? error.message : String(error);
141
+ console.error(chalk.red(errorMsg));
142
+ // If httpcat not installed, show manual instructions
143
+ if (errorMsg.includes('not installed')) {
144
+ console.log(chalk.dim('\nManual option - send USDC directly to:'));
145
+ console.log(chalk.cyan(` ${projectWallet}`));
146
+ }
147
+ console.log();
148
+ }
149
+ }
150
+ }
151
+ else if (userBalance > 0) {
152
+ console.log(chalk.gray(`Your wallet: $${userBalance.toFixed(2)} USDC (not enough to transfer)`));
153
+ }
154
+ }
155
+ // Can't auto-transfer - show funding options
156
+ console.log(chalk.bold('To fund the project, send USDC to:'));
157
+ console.log(chalk.cyan(` ${projectWallet}\n`));
158
+ if (userWallet) {
159
+ console.log(chalk.dim('Or top up your wallet and run jfl again to transfer'));
160
+ console.log(chalk.dim(`Your wallet: ${userWallet}`));
161
+ }
162
+ else {
163
+ console.log(chalk.dim('Want your own wallet? Run: jfl login --x402'));
164
+ }
165
+ console.log(chalk.dim('\nPress q or Escape to exit'));
166
+ console.log();
167
+ // Wait for project wallet funding
168
+ const fundingSpinner = ora('Waiting for project wallet funds...').start();
169
+ const funded = await waitForUsdcBalance(projectWallet, 5, (bal) => {
170
+ fundingSpinner.text = `Project balance: $${bal.toFixed(2)} USDC (need $5.00) - press q to exit`;
171
+ });
172
+ if (!funded) {
173
+ fundingSpinner.info('Exited');
174
+ return null;
175
+ }
176
+ fundingSpinner.succeed('Project funded!');
177
+ console.log();
178
+ return await purchaseProjectDayPass(projectWallet);
179
+ }
180
+ /**
181
+ * Purchase day pass using project wallet
182
+ * Owner's private key is needed - stored in project config or user config if they're the owner
183
+ */
184
+ async function purchaseProjectDayPass(projectWallet) {
185
+ // Check if current user is the owner (has the private key for project wallet)
186
+ const userWallet = getWalletAddress();
187
+ const userPrivateKey = getPrivateKey();
188
+ // User is the owner if their wallet matches project wallet
189
+ if (userWallet?.toLowerCase() === projectWallet.toLowerCase() && userPrivateKey) {
190
+ const { confirm } = await inquirer.prompt([
191
+ {
192
+ type: 'confirm',
193
+ name: 'confirm',
194
+ message: `Activate Day Pass for $5? (valid for 24 hours)`,
195
+ default: true,
196
+ },
197
+ ]);
198
+ if (!confirm) {
199
+ console.log(chalk.gray('Cancelled'));
200
+ return null;
201
+ }
202
+ const purchaseSpinner = ora('Activating Day Pass...').start();
203
+ try {
204
+ const dayPass = await purchaseDayPass(userPrivateKey);
205
+ purchaseSpinner.succeed('Day Pass activated!');
206
+ const remaining = getDayPassTimeRemaining();
207
+ if (remaining) {
208
+ console.log(chalk.green(`\n✅ Day Pass valid for ${remaining.hours}h ${remaining.minutes}m`));
209
+ }
210
+ console.log();
211
+ return dayPass;
212
+ }
213
+ catch (error) {
214
+ purchaseSpinner.fail('Failed to activate Day Pass');
215
+ console.error(chalk.red(error));
216
+ return null;
217
+ }
218
+ }
219
+ // User is NOT the owner - they can't sign for project wallet
220
+ console.log(chalk.yellow('\n⚠️ Project wallet has funds but needs owner to activate'));
221
+ console.log(chalk.gray(' Ask the project owner to run: jfl\n'));
222
+ return null;
223
+ }
224
+ /**
225
+ * Show day pass status
226
+ */
227
+ export function showDayPassStatus() {
228
+ const dayPass = getDayPass();
229
+ if (!dayPass) {
230
+ console.log(chalk.yellow('No active Day Pass'));
231
+ console.log(chalk.gray('Run a JFL command to purchase one'));
232
+ return;
233
+ }
234
+ const remaining = getDayPassTimeRemaining();
235
+ if (!remaining) {
236
+ console.log(chalk.yellow('Day Pass expired'));
237
+ return;
238
+ }
239
+ console.log(chalk.green(`✅ Day Pass active`));
240
+ console.log(chalk.gray(` Expires in: ${remaining.hours}h ${remaining.minutes}m`));
241
+ console.log(chalk.gray(` Address: ${dayPass.userAddress}`));
242
+ }
243
+ /**
244
+ * Guard decorator for commands requiring day pass
245
+ * Use this to wrap command handlers
246
+ */
247
+ export async function requireDayPass(handler) {
248
+ const dayPass = await ensureDayPass();
249
+ if (!dayPass) {
250
+ return null;
251
+ }
252
+ return handler(dayPass);
253
+ }
254
+ /**
255
+ * Check if running in trial mode (no payment required)
256
+ * Trial mode allows foundation + brand setup without payment
257
+ *
258
+ * Trial ends when:
259
+ * 1. Foundation is complete, OR
260
+ * 2. A teammate has actually joined (authenticated)
261
+ * - Creating a suggestions file doesn't end trial
262
+ * - Teammate must run `jfl login` to trigger payment
263
+ */
264
+ export function isTrialMode() {
265
+ // Check if user has completed foundation
266
+ const foundationComplete = config.get('foundationComplete');
267
+ if (foundationComplete)
268
+ return false;
269
+ // Check if any teammates have actually joined (authenticated)
270
+ const hasJoinedTeammates = checkForJoinedTeammates();
271
+ if (hasJoinedTeammates)
272
+ return false;
273
+ return true;
274
+ }
275
+ /**
276
+ * Check if any teammates have actually joined (authenticated)
277
+ * Looks for <!-- joined: DATE --> marker in suggestions/*.md files
278
+ */
279
+ function checkForJoinedTeammates() {
280
+ const cwd = process.cwd();
281
+ const suggestionsDir = `${cwd}/suggestions`;
282
+ try {
283
+ const { readdirSync, existsSync, readFileSync } = require('fs');
284
+ if (!existsSync(suggestionsDir))
285
+ return false;
286
+ const files = readdirSync(suggestionsDir);
287
+ const teammates = files.filter((f) => f.endsWith('.md'));
288
+ // Check each teammate file for joined marker
289
+ for (const file of teammates) {
290
+ const content = readFileSync(`${suggestionsDir}/${file}`, 'utf-8');
291
+ if (content.includes('<!-- joined:')) {
292
+ return true;
293
+ }
294
+ }
295
+ return false;
296
+ }
297
+ catch {
298
+ return false;
299
+ }
300
+ }
301
+ /**
302
+ * Mark a teammate as joined in their suggestions file
303
+ */
304
+ export function markTeammateJoined(username) {
305
+ const cwd = process.cwd();
306
+ const filePath = `${cwd}/suggestions/${username}.md`;
307
+ try {
308
+ const { existsSync, readFileSync, writeFileSync } = require('fs');
309
+ if (!existsSync(filePath))
310
+ return false;
311
+ const content = readFileSync(filePath, 'utf-8');
312
+ // Already joined?
313
+ if (content.includes('<!-- joined:'))
314
+ return true;
315
+ // Add joined marker at the top
316
+ const date = new Date().toISOString().split('T')[0];
317
+ const newContent = `<!-- joined: ${date} -->\n${content}`;
318
+ writeFileSync(filePath, newContent);
319
+ return true;
320
+ }
321
+ catch {
322
+ return false;
323
+ }
324
+ }
325
+ /**
326
+ * Mark foundation as complete (triggers payment requirement)
327
+ */
328
+ export function markFoundationComplete() {
329
+ config.set('foundationComplete', true);
330
+ }
331
+ /**
332
+ * Check if feature requires payment
333
+ */
334
+ export function requiresPayment(feature) {
335
+ const freeFeatures = [
336
+ 'init',
337
+ 'login',
338
+ 'logout',
339
+ 'status',
340
+ 'help',
341
+ 'version',
342
+ 'update',
343
+ // Trial features (until foundation complete)
344
+ ...(isTrialMode() ? ['foundation', 'brand', 'vision', 'narrative', 'thesis'] : []),
345
+ ];
346
+ return !freeFeatures.includes(feature);
347
+ }
348
+ //# sourceMappingURL=auth-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../src/utils/auth-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Check if we're in a JFL project. If not, offer to navigate to known projects.
3
+ * Returns true if we're in a project (or user navigated to one).
4
+ * Returns false if user cancelled or no projects available.
5
+ */
6
+ export declare function ensureInProject(): Promise<boolean>;
7
+ /**
8
+ * Check if current directory is a JFL project (no prompts)
9
+ */
10
+ export declare function isJflProject(): boolean;
11
+ //# sourceMappingURL=ensure-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-project.d.ts","sourceRoot":"","sources":["../../src/utils/ensure-project.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CA8DxD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAOtC"}