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.
- package/LICENSE +21 -0
- package/README.md +313 -0
- package/clawdbot-skill/README.md +328 -0
- package/clawdbot-skill/SKILL.md +362 -0
- package/clawdbot-skill/index.ts +486 -0
- package/clawdbot-skill/package.json +28 -0
- package/clawdbot-skill/skill.json +28 -0
- package/dist/commands/agents.d.ts +5 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +399 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/context-hub.d.ts +12 -0
- package/dist/commands/context-hub.d.ts.map +1 -0
- package/dist/commands/context-hub.js +642 -0
- package/dist/commands/context-hub.js.map +1 -0
- package/dist/commands/deploy.d.ts +5 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +370 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/feedback.d.ts +2 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +178 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/hud.d.ts +4 -0
- package/dist/commands/hud.d.ts.map +1 -0
- package/dist/commands/hud.js +262 -0
- package/dist/commands/hud.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +553 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +23 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +818 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/ralph.d.ts +9 -0
- package/dist/commands/ralph.d.ts.map +1 -0
- package/dist/commands/ralph.js +67 -0
- package/dist/commands/ralph.js.map +1 -0
- package/dist/commands/repair.d.ts +7 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.js +283 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/session-mgmt.d.ts +33 -0
- package/dist/commands/session-mgmt.d.ts.map +1 -0
- package/dist/commands/session-mgmt.js +404 -0
- package/dist/commands/session-mgmt.js.map +1 -0
- package/dist/commands/session.d.ts +2 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +639 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/skills.d.ts +31 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +314 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/synopsis.d.ts +10 -0
- package/dist/commands/synopsis.d.ts.map +1 -0
- package/dist/commands/synopsis.js +277 -0
- package/dist/commands/synopsis.js.map +1 -0
- package/dist/commands/update.d.ts +10 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +165 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/voice.d.ts +410 -0
- package/dist/commands/voice.d.ts.map +1 -0
- package/dist/commands/voice.js +4763 -0
- package/dist/commands/voice.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +512 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/context-hub-mcp.d.ts +11 -0
- package/dist/mcp/context-hub-mcp.d.ts.map +1 -0
- package/dist/mcp/context-hub-mcp.js +548 -0
- package/dist/mcp/context-hub-mcp.js.map +1 -0
- package/dist/telegram/voice.d.ts +146 -0
- package/dist/telegram/voice.d.ts.map +1 -0
- package/dist/telegram/voice.js +351 -0
- package/dist/telegram/voice.js.map +1 -0
- package/dist/types/skills.d.ts +44 -0
- package/dist/types/skills.d.ts.map +1 -0
- package/dist/types/skills.js +5 -0
- package/dist/types/skills.js.map +1 -0
- package/dist/ui/banner.d.ts +18 -0
- package/dist/ui/banner.d.ts.map +1 -0
- package/dist/ui/banner.js +323 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/index.d.ts +8 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +8 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/prompts.d.ts +52 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +72 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/theme.d.ts +82 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +142 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/auth-guard.d.ts +66 -0
- package/dist/utils/auth-guard.d.ts.map +1 -0
- package/dist/utils/auth-guard.js +348 -0
- package/dist/utils/auth-guard.js.map +1 -0
- package/dist/utils/ensure-project.d.ts +11 -0
- package/dist/utils/ensure-project.d.ts.map +1 -0
- package/dist/utils/ensure-project.js +70 -0
- package/dist/utils/ensure-project.js.map +1 -0
- package/dist/utils/git.d.ts +73 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +219 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/github-auth.d.ts +54 -0
- package/dist/utils/github-auth.d.ts.map +1 -0
- package/dist/utils/github-auth.js +375 -0
- package/dist/utils/github-auth.js.map +1 -0
- package/dist/utils/github-repo.d.ts +30 -0
- package/dist/utils/github-repo.d.ts.map +1 -0
- package/dist/utils/github-repo.js +219 -0
- package/dist/utils/github-repo.js.map +1 -0
- package/dist/utils/platform-auth.d.ts +81 -0
- package/dist/utils/platform-auth.d.ts.map +1 -0
- package/dist/utils/platform-auth.js +191 -0
- package/dist/utils/platform-auth.js.map +1 -0
- package/dist/utils/project-config.d.ts +43 -0
- package/dist/utils/project-config.d.ts.map +1 -0
- package/dist/utils/project-config.js +97 -0
- package/dist/utils/project-config.js.map +1 -0
- package/dist/utils/skill-registry.d.ts +49 -0
- package/dist/utils/skill-registry.d.ts.map +1 -0
- package/dist/utils/skill-registry.js +192 -0
- package/dist/utils/skill-registry.js.map +1 -0
- package/dist/utils/wallet.d.ts +62 -0
- package/dist/utils/wallet.d.ts.map +1 -0
- package/dist/utils/wallet.js +252 -0
- package/dist/utils/wallet.js.map +1 -0
- package/dist/utils/x402-client.d.ts +86 -0
- package/dist/utils/x402-client.d.ts.map +1 -0
- package/dist/utils/x402-client.js +265 -0
- package/dist/utils/x402-client.js.map +1 -0
- package/package.json +76 -0
- package/scripts/postinstall.js +116 -0
- package/scripts/test-onboarding.sh +121 -0
- package/scripts/voice-start.sh +128 -0
- package/scripts/voice-stop.sh +33 -0
- package/template/.claude/settings.json +92 -0
- package/template/.claude/skills/agent-browser/SKILL.md +116 -0
- package/template/.claude/skills/brand-architect/SKILL.md +240 -0
- package/template/.claude/skills/brand-architect/config.yaml +137 -0
- package/template/.claude/skills/campaign-hud/config.yaml +112 -0
- package/template/.claude/skills/content-creator/SKILL.md +294 -0
- package/template/.claude/skills/debug/MULTI_AGENT.md +360 -0
- package/template/.claude/skills/debug/SKILL.md +549 -0
- package/template/.claude/skills/fly-deploy/SKILL.md +676 -0
- package/template/.claude/skills/founder-video/SKILL.md +467 -0
- package/template/.claude/skills/hud/SKILL.md +157 -0
- package/template/.claude/skills/ralph-tui/SKILL.md +210 -0
- package/template/.claude/skills/react-best-practices/AGENTS.md +2249 -0
- package/template/.claude/skills/react-best-practices/README.md +123 -0
- package/template/.claude/skills/react-best-practices/SKILL.md +125 -0
- package/template/.claude/skills/react-best-practices/metadata.json +15 -0
- package/template/.claude/skills/react-best-practices/rules/_sections.md +46 -0
- package/template/.claude/skills/react-best-practices/rules/_template.md +28 -0
- package/template/.claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/template/.claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/template/.claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/template/.claude/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/template/.claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/template/.claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/template/.claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.claude/skills/react-best-practices/rules/server-cache-react.md +26 -0
- package/template/.claude/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
- package/template/.claude/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/template/.claude/skills/remotion-best-practices/SKILL.md +43 -0
- package/template/.claude/skills/remotion-best-practices/rules/3d.md +86 -0
- package/template/.claude/skills/remotion-best-practices/rules/animations.md +29 -0
- package/template/.claude/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/template/.claude/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/template/.claude/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/template/.claude/skills/remotion-best-practices/rules/assets.md +78 -0
- package/template/.claude/skills/remotion-best-practices/rules/audio.md +172 -0
- package/template/.claude/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
- package/template/.claude/skills/remotion-best-practices/rules/can-decode.md +75 -0
- package/template/.claude/skills/remotion-best-practices/rules/charts.md +58 -0
- package/template/.claude/skills/remotion-best-practices/rules/compositions.md +146 -0
- package/template/.claude/skills/remotion-best-practices/rules/display-captions.md +126 -0
- package/template/.claude/skills/remotion-best-practices/rules/extract-frames.md +229 -0
- package/template/.claude/skills/remotion-best-practices/rules/fonts.md +152 -0
- package/template/.claude/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/template/.claude/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/template/.claude/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
- package/template/.claude/skills/remotion-best-practices/rules/gifs.md +138 -0
- package/template/.claude/skills/remotion-best-practices/rules/images.md +130 -0
- package/template/.claude/skills/remotion-best-practices/rules/import-srt-captions.md +67 -0
- package/template/.claude/skills/remotion-best-practices/rules/lottie.md +68 -0
- package/template/.claude/skills/remotion-best-practices/rules/measuring-dom-nodes.md +35 -0
- package/template/.claude/skills/remotion-best-practices/rules/measuring-text.md +143 -0
- package/template/.claude/skills/remotion-best-practices/rules/sequencing.md +106 -0
- package/template/.claude/skills/remotion-best-practices/rules/tailwind.md +11 -0
- package/template/.claude/skills/remotion-best-practices/rules/text-animations.md +20 -0
- package/template/.claude/skills/remotion-best-practices/rules/timing.md +179 -0
- package/template/.claude/skills/remotion-best-practices/rules/transcribe-captions.md +19 -0
- package/template/.claude/skills/remotion-best-practices/rules/transitions.md +122 -0
- package/template/.claude/skills/remotion-best-practices/rules/trimming.md +53 -0
- package/template/.claude/skills/remotion-best-practices/rules/videos.md +171 -0
- package/template/.claude/skills/search/SKILL.md +220 -0
- package/template/.claude/skills/spec/SKILL.md +377 -0
- package/template/.claude/skills/startup/SKILL.md +310 -0
- package/template/.claude/skills/web-architect/SKILL.md +309 -0
- package/template/.claude/skills/x-algorithm/SKILL.md +305 -0
- package/template/.jfl/config.json +8 -0
- package/template/.mcp.json +11 -0
- package/template/CLAUDE.md +960 -0
- package/template/content/.gitkeep +0 -0
- package/template/context-hub +3 -0
- package/template/knowledge/BRAND_BRIEF.md +124 -0
- package/template/knowledge/BRAND_DECISIONS.md +168 -0
- package/template/knowledge/NARRATIVE.md +114 -0
- package/template/knowledge/ROADMAP.md +128 -0
- package/template/knowledge/THESIS.md +108 -0
- package/template/knowledge/VISION.md +74 -0
- package/template/knowledge/VOICE_AND_TONE.md +146 -0
- package/template/previews/.gitkeep +0 -0
- package/template/scripts/session/auto-commit.sh +245 -0
- package/template/scripts/session/auto-merge.sh +325 -0
- package/template/scripts/session/jfl-doctor.sh +587 -0
- package/template/scripts/session/session-end.sh +194 -0
- package/template/scripts/session/session-init.sh +163 -0
- package/template/scripts/session/session-sync.sh +167 -0
- package/template/scripts/session/test-context-preservation.sh +160 -0
- package/template/skills/agent-browser/SKILL.md +116 -0
- package/template/skills/brand-architect/SKILL.md +240 -0
- package/template/skills/brand-architect/config.yaml +137 -0
- package/template/skills/campaign-hud/config.yaml +112 -0
- package/template/skills/content-creator/SKILL.md +294 -0
- package/template/skills/debug/MULTI_AGENT.md +360 -0
- package/template/skills/debug/SKILL.md +549 -0
- package/template/skills/fly-deploy/SKILL.md +676 -0
- package/template/skills/founder-video/SKILL.md +467 -0
- package/template/skills/hud/SKILL.md +204 -0
- package/template/skills/ralph-tui/SKILL.md +210 -0
- package/template/skills/react-best-practices/AGENTS.md +2249 -0
- package/template/skills/react-best-practices/README.md +123 -0
- package/template/skills/react-best-practices/SKILL.md +125 -0
- package/template/skills/react-best-practices/metadata.json +15 -0
- package/template/skills/react-best-practices/rules/_sections.md +46 -0
- package/template/skills/react-best-practices/rules/_template.md +28 -0
- package/template/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/template/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/template/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/template/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/template/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/template/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/template/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/template/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/template/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/template/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/template/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/template/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/template/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/skills/react-best-practices/rules/server-cache-react.md +26 -0
- package/template/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
- package/template/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/template/skills/remotion-best-practices/SKILL.md +43 -0
- package/template/skills/remotion-best-practices/rules/3d.md +86 -0
- package/template/skills/remotion-best-practices/rules/animations.md +29 -0
- package/template/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/template/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/template/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/template/skills/remotion-best-practices/rules/assets.md +78 -0
- package/template/skills/remotion-best-practices/rules/audio.md +172 -0
- package/template/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
- package/template/skills/remotion-best-practices/rules/can-decode.md +75 -0
- package/template/skills/remotion-best-practices/rules/charts.md +58 -0
- package/template/skills/remotion-best-practices/rules/compositions.md +146 -0
- package/template/skills/remotion-best-practices/rules/display-captions.md +126 -0
- package/template/skills/remotion-best-practices/rules/extract-frames.md +229 -0
- package/template/skills/remotion-best-practices/rules/fonts.md +152 -0
- package/template/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/template/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/template/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
- package/template/skills/remotion-best-practices/rules/gifs.md +138 -0
- package/template/skills/remotion-best-practices/rules/images.md +130 -0
- package/template/skills/remotion-best-practices/rules/import-srt-captions.md +67 -0
- package/template/skills/remotion-best-practices/rules/lottie.md +68 -0
- package/template/skills/remotion-best-practices/rules/measuring-dom-nodes.md +35 -0
- package/template/skills/remotion-best-practices/rules/measuring-text.md +143 -0
- package/template/skills/remotion-best-practices/rules/sequencing.md +106 -0
- package/template/skills/remotion-best-practices/rules/tailwind.md +11 -0
- package/template/skills/remotion-best-practices/rules/text-animations.md +20 -0
- package/template/skills/remotion-best-practices/rules/timing.md +179 -0
- package/template/skills/remotion-best-practices/rules/transcribe-captions.md +19 -0
- package/template/skills/remotion-best-practices/rules/transitions.md +122 -0
- package/template/skills/remotion-best-practices/rules/trimming.md +53 -0
- package/template/skills/remotion-best-practices/rules/videos.md +171 -0
- package/template/skills/search/SKILL.md +220 -0
- package/template/skills/spec/SKILL.md +377 -0
- package/template/skills/startup/SKILL.md +310 -0
- package/template/skills/web-architect/SKILL.md +309 -0
- package/template/skills/x-algorithm/SKILL.md +305 -0
- package/template/suggestions/.gitkeep +0 -0
- package/template/templates/QUICKSTART_SKILL_TO_PRODUCT.md +242 -0
- package/template/templates/brand/BRAND_BRIEF.md +124 -0
- package/template/templates/brand/BRAND_DECISIONS.md +168 -0
- package/template/templates/brand/BRAND_GUIDELINES.md +251 -0
- package/template/templates/brand/VOICE_AND_TONE.md +146 -0
- package/template/templates/brand/global.css +240 -0
- package/template/templates/collaboration/CONTRIBUTOR.md +74 -0
- package/template/templates/collaboration/CRM.md +97 -0
- package/template/templates/collaboration/TASKS.md +83 -0
- package/template/templates/strategic/NARRATIVE.md +114 -0
- package/template/templates/strategic/ROADMAP.md +128 -0
- package/template/templates/strategic/THESIS.md +108 -0
- package/template/templates/strategic/VISION.md +74 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 Payment Client for JFL
|
|
3
|
+
*
|
|
4
|
+
* Handles x402 micropayments for JFL Day Pass ($5/day)
|
|
5
|
+
* Based on httpcat-cli implementation
|
|
6
|
+
*/
|
|
7
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
8
|
+
import { randomBytes } from 'crypto';
|
|
9
|
+
import Conf from 'conf';
|
|
10
|
+
const config = new Conf({ projectName: 'jfl' });
|
|
11
|
+
// Network configuration
|
|
12
|
+
const USE_TESTNET = process.env.JFL_TESTNET === 'true' || process.env.NODE_ENV !== 'production';
|
|
13
|
+
const NETWORK_CONFIG = {
|
|
14
|
+
testnet: {
|
|
15
|
+
caip2: 'eip155:84532',
|
|
16
|
+
chainId: 84532,
|
|
17
|
+
usdcAddress: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',
|
|
18
|
+
usdcName: 'USDC',
|
|
19
|
+
},
|
|
20
|
+
mainnet: {
|
|
21
|
+
caip2: 'eip155:8453',
|
|
22
|
+
chainId: 8453,
|
|
23
|
+
usdcAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
24
|
+
usdcName: 'USD Coin',
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
function getNetwork() {
|
|
28
|
+
return USE_TESTNET ? NETWORK_CONFIG.testnet : NETWORK_CONFIG.mainnet;
|
|
29
|
+
}
|
|
30
|
+
// JFL API endpoints
|
|
31
|
+
const JFL_API_URL = process.env.JFL_API_URL || 'https://api.jfl.run';
|
|
32
|
+
// Day Pass cost: $5 = 5,000,000 (6 decimals)
|
|
33
|
+
const DAY_PASS_COST = BigInt(5_000_000);
|
|
34
|
+
const DAY_PASS_COST_HEX = '0x4c4b40'; // 5,000,000 in hex
|
|
35
|
+
/**
|
|
36
|
+
* Create x402 client with signing capability
|
|
37
|
+
*/
|
|
38
|
+
export function createX402Client(privateKey) {
|
|
39
|
+
const signer = privateKeyToAccount(privateKey);
|
|
40
|
+
const network = getNetwork();
|
|
41
|
+
return {
|
|
42
|
+
signer,
|
|
43
|
+
network,
|
|
44
|
+
address: signer.address,
|
|
45
|
+
/**
|
|
46
|
+
* Create EIP-712 payment signature for x402
|
|
47
|
+
*/
|
|
48
|
+
async createPaymentSignature(requirements) {
|
|
49
|
+
// Generate unique nonce (critical for each payment)
|
|
50
|
+
const nonceBytes = randomBytes(32);
|
|
51
|
+
const nonce = `0x${nonceBytes.toString('hex').padStart(64, '0')}`;
|
|
52
|
+
// Timing windows
|
|
53
|
+
const validAfter = Math.floor(Date.now() / 1000) - 30; // 30s in past
|
|
54
|
+
const validBefore = validAfter + 330; // 5 minutes total
|
|
55
|
+
// Amount handling
|
|
56
|
+
let valueHex;
|
|
57
|
+
if (requirements.maxAmountRequired.startsWith('0x')) {
|
|
58
|
+
valueHex = requirements.maxAmountRequired;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
valueHex = `0x${BigInt(requirements.maxAmountRequired).toString(16)}`;
|
|
62
|
+
}
|
|
63
|
+
// EIP-712 domain
|
|
64
|
+
const domain = {
|
|
65
|
+
name: network.usdcName,
|
|
66
|
+
version: '2',
|
|
67
|
+
chainId: network.chainId,
|
|
68
|
+
verifyingContract: network.usdcAddress,
|
|
69
|
+
};
|
|
70
|
+
// EIP-712 types for TransferWithAuthorization (EIP-3009)
|
|
71
|
+
const types = {
|
|
72
|
+
TransferWithAuthorization: [
|
|
73
|
+
{ name: 'from', type: 'address' },
|
|
74
|
+
{ name: 'to', type: 'address' },
|
|
75
|
+
{ name: 'value', type: 'uint256' },
|
|
76
|
+
{ name: 'validAfter', type: 'uint256' },
|
|
77
|
+
{ name: 'validBefore', type: 'uint256' },
|
|
78
|
+
{ name: 'nonce', type: 'bytes32' },
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
// Sign authorization
|
|
82
|
+
const signature = await signer.signTypedData({
|
|
83
|
+
domain,
|
|
84
|
+
types,
|
|
85
|
+
primaryType: 'TransferWithAuthorization',
|
|
86
|
+
message: {
|
|
87
|
+
from: signer.address,
|
|
88
|
+
to: requirements.payTo,
|
|
89
|
+
value: BigInt(valueHex),
|
|
90
|
+
validAfter: BigInt(validAfter),
|
|
91
|
+
validBefore: BigInt(validBefore),
|
|
92
|
+
nonce: nonce,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
// Build x402 V2 payment payload
|
|
96
|
+
const paymentPayload = {
|
|
97
|
+
x402Version: 2,
|
|
98
|
+
scheme: 'exact',
|
|
99
|
+
network: network.caip2,
|
|
100
|
+
payload: {
|
|
101
|
+
signature: signature,
|
|
102
|
+
authorization: {
|
|
103
|
+
from: signer.address,
|
|
104
|
+
to: requirements.payTo,
|
|
105
|
+
value: valueHex,
|
|
106
|
+
validAfter: validAfter.toString(),
|
|
107
|
+
validBefore: validBefore.toString(),
|
|
108
|
+
nonce: nonce,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
// Encode as base64 for header
|
|
113
|
+
return Buffer.from(JSON.stringify(paymentPayload)).toString('base64');
|
|
114
|
+
},
|
|
115
|
+
/**
|
|
116
|
+
* Make x402 request with payment handling
|
|
117
|
+
*/
|
|
118
|
+
async request(url, options = {}) {
|
|
119
|
+
// Initial request without payment
|
|
120
|
+
const initialResponse = await fetch(url, {
|
|
121
|
+
...options,
|
|
122
|
+
headers: {
|
|
123
|
+
'Content-Type': 'application/json',
|
|
124
|
+
...options.headers,
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
// Check for 402 Payment Required
|
|
128
|
+
if (initialResponse.status === 402) {
|
|
129
|
+
// Parse payment requirements
|
|
130
|
+
const paymentRequiredHeader = initialResponse.headers.get('payment-required') ||
|
|
131
|
+
initialResponse.headers.get('Payment-Required');
|
|
132
|
+
let requirements = null;
|
|
133
|
+
if (paymentRequiredHeader) {
|
|
134
|
+
const decoded = Buffer.from(paymentRequiredHeader, 'base64').toString('utf-8');
|
|
135
|
+
const headerData = JSON.parse(decoded);
|
|
136
|
+
if (headerData.accepts && Array.isArray(headerData.accepts)) {
|
|
137
|
+
requirements = headerData.accepts[0];
|
|
138
|
+
}
|
|
139
|
+
else if (headerData.network && headerData.maxAmountRequired) {
|
|
140
|
+
requirements = headerData;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (!requirements) {
|
|
144
|
+
// Try to parse from body
|
|
145
|
+
const responseText = await initialResponse.text();
|
|
146
|
+
const paymentInfo = JSON.parse(responseText);
|
|
147
|
+
requirements = paymentInfo.accepts?.[0];
|
|
148
|
+
}
|
|
149
|
+
if (!requirements) {
|
|
150
|
+
throw new Error('Could not parse payment requirements from 402 response');
|
|
151
|
+
}
|
|
152
|
+
// Create payment signature
|
|
153
|
+
const paymentHeader = await this.createPaymentSignature(requirements);
|
|
154
|
+
// Retry with payment
|
|
155
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
156
|
+
return fetch(url, {
|
|
157
|
+
...options,
|
|
158
|
+
headers: {
|
|
159
|
+
'Content-Type': 'application/json',
|
|
160
|
+
'PAYMENT-SIGNATURE': paymentHeader,
|
|
161
|
+
...options.headers,
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return initialResponse;
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check if user has valid day pass
|
|
171
|
+
*/
|
|
172
|
+
export function getDayPass() {
|
|
173
|
+
const dayPass = config.get('dayPass');
|
|
174
|
+
if (!dayPass)
|
|
175
|
+
return null;
|
|
176
|
+
// Check if expired (day passes are valid for 24 hours)
|
|
177
|
+
const now = Date.now();
|
|
178
|
+
if (now > dayPass.expiresAt) {
|
|
179
|
+
// Expired, clear it
|
|
180
|
+
config.delete('dayPass');
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
return dayPass;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Save day pass after successful payment
|
|
187
|
+
*/
|
|
188
|
+
export function saveDayPass(leaseId, userAddress) {
|
|
189
|
+
const now = Date.now();
|
|
190
|
+
const dayPass = {
|
|
191
|
+
leaseId,
|
|
192
|
+
userAddress,
|
|
193
|
+
paidAt: now,
|
|
194
|
+
expiresAt: now + 24 * 60 * 60 * 1000, // 24 hours
|
|
195
|
+
};
|
|
196
|
+
config.set('dayPass', dayPass);
|
|
197
|
+
return dayPass;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if user needs to pay for today
|
|
201
|
+
*/
|
|
202
|
+
export function needsPayment() {
|
|
203
|
+
const dayPass = getDayPass();
|
|
204
|
+
return !dayPass;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get time remaining on day pass
|
|
208
|
+
*/
|
|
209
|
+
export function getDayPassTimeRemaining() {
|
|
210
|
+
const dayPass = getDayPass();
|
|
211
|
+
if (!dayPass)
|
|
212
|
+
return null;
|
|
213
|
+
const remaining = dayPass.expiresAt - Date.now();
|
|
214
|
+
if (remaining <= 0)
|
|
215
|
+
return null;
|
|
216
|
+
const hours = Math.floor(remaining / (60 * 60 * 1000));
|
|
217
|
+
const minutes = Math.floor((remaining % (60 * 60 * 1000)) / (60 * 1000));
|
|
218
|
+
return { hours, minutes };
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Purchase day pass via x402
|
|
222
|
+
*/
|
|
223
|
+
export async function purchaseDayPass(privateKey) {
|
|
224
|
+
const client = createX402Client(privateKey);
|
|
225
|
+
const network = getNetwork();
|
|
226
|
+
// Call JFL API to purchase day pass
|
|
227
|
+
const response = await client.request(`${JFL_API_URL}/v1/daypass/purchase`, {
|
|
228
|
+
method: 'POST',
|
|
229
|
+
body: JSON.stringify({
|
|
230
|
+
userAddress: client.address,
|
|
231
|
+
network: network.caip2,
|
|
232
|
+
}),
|
|
233
|
+
});
|
|
234
|
+
if (!response.ok) {
|
|
235
|
+
const error = await response.text();
|
|
236
|
+
throw new Error(`Failed to purchase day pass: ${error}`);
|
|
237
|
+
}
|
|
238
|
+
const result = await response.json();
|
|
239
|
+
// Save and return day pass
|
|
240
|
+
return saveDayPass(result.leaseId, client.address);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Verify day pass with JFL API
|
|
244
|
+
*/
|
|
245
|
+
export async function verifyDayPass(dayPass) {
|
|
246
|
+
try {
|
|
247
|
+
const response = await fetch(`${JFL_API_URL}/v1/daypass/verify`, {
|
|
248
|
+
method: 'POST',
|
|
249
|
+
headers: { 'Content-Type': 'application/json' },
|
|
250
|
+
body: JSON.stringify({
|
|
251
|
+
leaseId: dayPass.leaseId,
|
|
252
|
+
userAddress: dayPass.userAddress,
|
|
253
|
+
}),
|
|
254
|
+
});
|
|
255
|
+
if (!response.ok)
|
|
256
|
+
return false;
|
|
257
|
+
const result = await response.json();
|
|
258
|
+
return result.valid === true;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// If API is down, trust local day pass if not expired
|
|
262
|
+
return Date.now() < dayPass.expiresAt;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=x402-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-client.js","sourceRoot":"","sources":["../../src/utils/x402-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "jfl",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Just Fucking Launch - CLI for AI-powered GTM and development",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"jfl": "dist/index.js",
|
|
9
|
+
"jfl-context-hub-mcp": "dist/mcp/context-hub-mcp.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"scripts",
|
|
14
|
+
"template",
|
|
15
|
+
"clawdbot-skill",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"dev": "tsx --watch src/index.ts",
|
|
22
|
+
"start": "node dist/index.js",
|
|
23
|
+
"prepublishOnly": "npm run build",
|
|
24
|
+
"postinstall": "node scripts/postinstall.js"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"ai",
|
|
28
|
+
"claude",
|
|
29
|
+
"gtm",
|
|
30
|
+
"go-to-market",
|
|
31
|
+
"launch",
|
|
32
|
+
"cli",
|
|
33
|
+
"productivity",
|
|
34
|
+
"startup",
|
|
35
|
+
"marketing",
|
|
36
|
+
"x402",
|
|
37
|
+
"crypto"
|
|
38
|
+
],
|
|
39
|
+
"author": "Alec Taggart <402goose@users.noreply.github.com>",
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/402goose/jfl-cli.git"
|
|
44
|
+
},
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/402goose/jfl-cli/issues"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://jfl.run",
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=18.0.0"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@clack/prompts": "^0.11.0",
|
|
54
|
+
"@scure/bip32": "^2.0.1",
|
|
55
|
+
"@scure/bip39": "^2.0.1",
|
|
56
|
+
"@x402/core": "^2.2.0",
|
|
57
|
+
"@x402/evm": "^2.2.0",
|
|
58
|
+
"chalk": "^5.3.0",
|
|
59
|
+
"commander": "^12.0.0",
|
|
60
|
+
"conf": "^12.0.0",
|
|
61
|
+
"httpcat-cli": "^0.3.3",
|
|
62
|
+
"inquirer": "^9.2.14",
|
|
63
|
+
"node-global-key-listener": "^0.3.0",
|
|
64
|
+
"open": "^10.0.0",
|
|
65
|
+
"ora": "^8.0.1",
|
|
66
|
+
"viem": "^2.44.4",
|
|
67
|
+
"ws": "^8.16.0"
|
|
68
|
+
},
|
|
69
|
+
"devDependencies": {
|
|
70
|
+
"@types/inquirer": "^9.0.7",
|
|
71
|
+
"@types/node": "^20.11.0",
|
|
72
|
+
"@types/ws": "^8.18.1",
|
|
73
|
+
"tsx": "^4.7.0",
|
|
74
|
+
"typescript": "^5.3.3"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* JFL CLI Postinstall Script
|
|
4
|
+
*
|
|
5
|
+
* Installs bundled tools that enhance the JFL experience:
|
|
6
|
+
* - ralph-tui: AI agent loop orchestrator for autonomous task execution
|
|
7
|
+
*
|
|
8
|
+
* These tools require Bun runtime. If Bun is not installed,
|
|
9
|
+
* we'll show instructions but continue (tools are optional).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { execSync, spawnSync } from "child_process";
|
|
13
|
+
import { platform } from "os";
|
|
14
|
+
|
|
15
|
+
const TOOLS = [
|
|
16
|
+
{
|
|
17
|
+
name: "ralph-tui",
|
|
18
|
+
package: "ralph-tui",
|
|
19
|
+
description: "AI agent loop orchestrator",
|
|
20
|
+
requiresBun: true,
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
function hasBun() {
|
|
25
|
+
try {
|
|
26
|
+
execSync("bun --version", { stdio: "ignore" });
|
|
27
|
+
return true;
|
|
28
|
+
} catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function hasCommand(cmd) {
|
|
34
|
+
try {
|
|
35
|
+
execSync(`which ${cmd}`, { stdio: "ignore" });
|
|
36
|
+
return true;
|
|
37
|
+
} catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function installWithBun(pkg) {
|
|
43
|
+
try {
|
|
44
|
+
console.log(` Installing ${pkg}...`);
|
|
45
|
+
execSync(`bun install -g ${pkg}`, { stdio: "inherit" });
|
|
46
|
+
return true;
|
|
47
|
+
} catch (error) {
|
|
48
|
+
console.error(` Failed to install ${pkg}: ${error.message}`);
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function main() {
|
|
54
|
+
console.log("\n๐ JFL CLI - Setting up bundled tools...\n");
|
|
55
|
+
|
|
56
|
+
const bunInstalled = hasBun();
|
|
57
|
+
|
|
58
|
+
if (!bunInstalled) {
|
|
59
|
+
console.log("โ ๏ธ Bun runtime not found.");
|
|
60
|
+
console.log(" Some JFL tools (like ralph-tui) require Bun.");
|
|
61
|
+
console.log("");
|
|
62
|
+
console.log(" Install Bun:");
|
|
63
|
+
if (platform() === "win32") {
|
|
64
|
+
console.log(' powershell -c "irm bun.sh/install.ps1 | iex"');
|
|
65
|
+
} else {
|
|
66
|
+
console.log(" curl -fsSL https://bun.sh/install | bash");
|
|
67
|
+
}
|
|
68
|
+
console.log("");
|
|
69
|
+
console.log(" Then run: jfl update");
|
|
70
|
+
console.log("");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
console.log("โ
Bun runtime detected\n");
|
|
75
|
+
|
|
76
|
+
for (const tool of TOOLS) {
|
|
77
|
+
if (tool.requiresBun && !bunInstalled) {
|
|
78
|
+
console.log(`โญ๏ธ Skipping ${tool.name} (requires Bun)`);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Check if already installed
|
|
83
|
+
if (hasCommand(tool.name)) {
|
|
84
|
+
console.log(`โ
${tool.name} already installed`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
console.log(`๐ฆ Installing ${tool.name} - ${tool.description}`);
|
|
89
|
+
const success = installWithBun(tool.package);
|
|
90
|
+
|
|
91
|
+
if (success) {
|
|
92
|
+
console.log(`โ
${tool.name} installed successfully\n`);
|
|
93
|
+
} else {
|
|
94
|
+
console.log(`โ ๏ธ ${tool.name} installation failed (optional)\n`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
console.log("๐ JFL CLI setup complete!\n");
|
|
99
|
+
console.log("Available tools:");
|
|
100
|
+
console.log(" jfl - Main CLI");
|
|
101
|
+
if (hasCommand("ralph-tui")) {
|
|
102
|
+
console.log(" ralph-tui - AI agent loop orchestrator");
|
|
103
|
+
}
|
|
104
|
+
console.log("");
|
|
105
|
+
|
|
106
|
+
// Check for Clawdbot integration
|
|
107
|
+
if (hasCommand("clawdbot")) {
|
|
108
|
+
console.log("๐ฆ Clawdbot detected!");
|
|
109
|
+
console.log("");
|
|
110
|
+
console.log("Add JFL to Telegram/Slack/Discord:");
|
|
111
|
+
console.log(" jfl clawdbot install");
|
|
112
|
+
console.log("");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
main();
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Test JFL onboarding flow in isolated environment
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
TEST_DIR="/tmp/jfl-test-$(date +%s)"
|
|
7
|
+
CONFIG_BACKUP="$HOME/.config/jfl.backup-$(date +%s)"
|
|
8
|
+
|
|
9
|
+
echo "๐งช JFL Test Mode"
|
|
10
|
+
echo ""
|
|
11
|
+
echo "This will:"
|
|
12
|
+
echo " 1. Backup your current JFL config"
|
|
13
|
+
echo " 2. Clear config for fresh onboarding"
|
|
14
|
+
echo " 3. Create test directory: $TEST_DIR"
|
|
15
|
+
echo " 4. Launch JFL"
|
|
16
|
+
echo " 5. Restore your config when done"
|
|
17
|
+
echo ""
|
|
18
|
+
read -p "Continue? (y/n) " -n 1 -r
|
|
19
|
+
echo
|
|
20
|
+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
21
|
+
echo "Cancelled."
|
|
22
|
+
exit 0
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# Backup current config
|
|
26
|
+
if [ -d "$HOME/.config/jfl" ]; then
|
|
27
|
+
echo "๐ฆ Backing up config to $CONFIG_BACKUP"
|
|
28
|
+
mv "$HOME/.config/jfl" "$CONFIG_BACKUP"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# Create test directory
|
|
32
|
+
echo "๐ Creating test directory: $TEST_DIR"
|
|
33
|
+
mkdir -p "$TEST_DIR"
|
|
34
|
+
cd "$TEST_DIR"
|
|
35
|
+
|
|
36
|
+
# Cleanup function
|
|
37
|
+
cleanup() {
|
|
38
|
+
echo ""
|
|
39
|
+
echo "๐งน Cleaning up..."
|
|
40
|
+
|
|
41
|
+
# Check for created GitHub repos in test directory
|
|
42
|
+
CREATED_REPOS=()
|
|
43
|
+
if [ -d "$TEST_DIR" ]; then
|
|
44
|
+
# Find any directories with .git in them (product repos)
|
|
45
|
+
for dir in "$TEST_DIR"/*/product; do
|
|
46
|
+
if [ -d "$dir/.git" ]; then
|
|
47
|
+
# Get repo name from git remote
|
|
48
|
+
cd "$dir" 2>/dev/null || continue
|
|
49
|
+
REPO_URL=$(git remote get-url origin 2>/dev/null || echo "")
|
|
50
|
+
if [[ -n "$REPO_URL" ]]; then
|
|
51
|
+
# Extract owner/repo from URL
|
|
52
|
+
# Handles both SSH (git@github.com:owner/repo.git) and HTTPS (https://github.com/owner/repo.git)
|
|
53
|
+
REPO_FULL=$(echo "$REPO_URL" | sed -E 's#^(https://|git@)github\.com[:/]##' | sed 's/\.git$//')
|
|
54
|
+
CREATED_REPOS+=("$REPO_FULL")
|
|
55
|
+
fi
|
|
56
|
+
fi
|
|
57
|
+
done
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
# Ask about deleting GitHub repos
|
|
61
|
+
if [ ${#CREATED_REPOS[@]} -gt 0 ]; then
|
|
62
|
+
echo ""
|
|
63
|
+
echo "Found ${#CREATED_REPOS[@]} test repo(s) on GitHub:"
|
|
64
|
+
for repo in "${CREATED_REPOS[@]}"; do
|
|
65
|
+
echo " - $repo"
|
|
66
|
+
done
|
|
67
|
+
echo ""
|
|
68
|
+
read -p "Delete these repos from GitHub? (y/n) " -n 1 -r
|
|
69
|
+
echo
|
|
70
|
+
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
71
|
+
for repo in "${CREATED_REPOS[@]}"; do
|
|
72
|
+
echo "Deleting $repo from GitHub..."
|
|
73
|
+
if gh repo delete "$repo" --yes 2>/dev/null; then
|
|
74
|
+
echo " โ Deleted: $repo"
|
|
75
|
+
else
|
|
76
|
+
echo " โ ๏ธ Failed to delete: $repo (may need to delete manually)"
|
|
77
|
+
fi
|
|
78
|
+
done
|
|
79
|
+
else
|
|
80
|
+
echo "Repos kept on GitHub"
|
|
81
|
+
fi
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
# Remove test config
|
|
85
|
+
rm -rf "$HOME/.config/jfl"
|
|
86
|
+
|
|
87
|
+
# Restore original config
|
|
88
|
+
if [ -d "$CONFIG_BACKUP" ]; then
|
|
89
|
+
echo "๐ฆ Restoring config from $CONFIG_BACKUP"
|
|
90
|
+
mv "$CONFIG_BACKUP" "$HOME/.config/jfl"
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# Ask about test directory
|
|
94
|
+
echo ""
|
|
95
|
+
read -p "Delete test directory $TEST_DIR? (y/n) " -n 1 -r
|
|
96
|
+
echo
|
|
97
|
+
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
98
|
+
rm -rf "$TEST_DIR"
|
|
99
|
+
echo "โ Test directory deleted"
|
|
100
|
+
else
|
|
101
|
+
echo "Test directory kept at: $TEST_DIR"
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
echo ""
|
|
105
|
+
echo "โ Restored to normal state"
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
# Set trap to cleanup on exit
|
|
109
|
+
trap cleanup EXIT INT TERM
|
|
110
|
+
|
|
111
|
+
# Show environment
|
|
112
|
+
echo ""
|
|
113
|
+
echo "๐ฏ Test Environment Ready"
|
|
114
|
+
echo " Config: Fresh (backed up to $CONFIG_BACKUP)"
|
|
115
|
+
echo " Directory: $TEST_DIR"
|
|
116
|
+
echo ""
|
|
117
|
+
echo "Starting JFL..."
|
|
118
|
+
echo ""
|
|
119
|
+
|
|
120
|
+
# Launch JFL
|
|
121
|
+
jfl
|