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,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Authentication for JFL CLI
|
|
3
|
+
*
|
|
4
|
+
* Uses GitHub Device Flow for CLI-friendly OAuth:
|
|
5
|
+
* 1. Request device code
|
|
6
|
+
* 2. User enters code at github.com/login/device
|
|
7
|
+
* 3. Poll for access token
|
|
8
|
+
* 4. Use token for API calls
|
|
9
|
+
*/
|
|
10
|
+
import Conf from 'conf';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import ora from 'ora';
|
|
13
|
+
import open from 'open';
|
|
14
|
+
const config = new Conf({ projectName: 'jfl' });
|
|
15
|
+
// Register your GitHub OAuth App at:
|
|
16
|
+
// https://github.com/settings/applications/new
|
|
17
|
+
// - Application name: JFL CLI
|
|
18
|
+
// - Homepage URL: https://github.com/402goose/just-fucking-launch
|
|
19
|
+
// - Authorization callback URL: http://localhost (not used for device flow)
|
|
20
|
+
// Then paste the Client ID here:
|
|
21
|
+
const GITHUB_CLIENT_ID = process.env.JFL_GITHUB_CLIENT_ID || 'Ov23lizuLuSNqONApTVc';
|
|
22
|
+
const GITHUB_DEVICE_CODE_URL = 'https://github.com/login/device/code';
|
|
23
|
+
const GITHUB_TOKEN_URL = 'https://github.com/login/oauth/access_token';
|
|
24
|
+
const GITHUB_API_URL = 'https://api.github.com';
|
|
25
|
+
/**
|
|
26
|
+
* Check if user is authenticated with GitHub
|
|
27
|
+
*/
|
|
28
|
+
export function isGitHubAuthenticated() {
|
|
29
|
+
const token = config.get('githubToken');
|
|
30
|
+
return !!token;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get stored GitHub token
|
|
34
|
+
*/
|
|
35
|
+
export function getGitHubToken() {
|
|
36
|
+
return config.get('githubToken');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get stored GitHub username
|
|
40
|
+
*/
|
|
41
|
+
export function getGitHubUsername() {
|
|
42
|
+
return config.get('githubUsername');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Clear GitHub auth
|
|
46
|
+
*/
|
|
47
|
+
export function clearGitHubAuth() {
|
|
48
|
+
config.delete('githubToken');
|
|
49
|
+
config.delete('githubUsername');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Request a device code from GitHub
|
|
53
|
+
*/
|
|
54
|
+
async function requestDeviceCode() {
|
|
55
|
+
const response = await fetch(GITHUB_DEVICE_CODE_URL, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: {
|
|
58
|
+
Accept: 'application/json',
|
|
59
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
60
|
+
},
|
|
61
|
+
body: new URLSearchParams({
|
|
62
|
+
client_id: GITHUB_CLIENT_ID,
|
|
63
|
+
scope: 'repo read:user',
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
throw new Error(`Failed to request device code: ${response.statusText}`);
|
|
68
|
+
}
|
|
69
|
+
return response.json();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Poll GitHub for access token
|
|
73
|
+
*/
|
|
74
|
+
async function pollForToken(deviceCode, interval, expiresIn) {
|
|
75
|
+
const startTime = Date.now();
|
|
76
|
+
const expiresAt = startTime + expiresIn * 1000;
|
|
77
|
+
while (Date.now() < expiresAt) {
|
|
78
|
+
await new Promise((resolve) => setTimeout(resolve, interval * 1000));
|
|
79
|
+
const response = await fetch(GITHUB_TOKEN_URL, {
|
|
80
|
+
method: 'POST',
|
|
81
|
+
headers: {
|
|
82
|
+
Accept: 'application/json',
|
|
83
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
84
|
+
},
|
|
85
|
+
body: new URLSearchParams({
|
|
86
|
+
client_id: GITHUB_CLIENT_ID,
|
|
87
|
+
device_code: deviceCode,
|
|
88
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
89
|
+
}),
|
|
90
|
+
});
|
|
91
|
+
const data = await response.json();
|
|
92
|
+
if (data.access_token) {
|
|
93
|
+
return data.access_token;
|
|
94
|
+
}
|
|
95
|
+
if (data.error === 'authorization_pending') {
|
|
96
|
+
// User hasn't authorized yet, keep polling
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (data.error === 'slow_down') {
|
|
100
|
+
// We're polling too fast, increase interval
|
|
101
|
+
interval += 5;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (data.error === 'expired_token') {
|
|
105
|
+
throw new Error('Authorization expired. Please try again.');
|
|
106
|
+
}
|
|
107
|
+
if (data.error === 'access_denied') {
|
|
108
|
+
throw new Error('Authorization denied by user.');
|
|
109
|
+
}
|
|
110
|
+
if (data.error) {
|
|
111
|
+
throw new Error(data.error_description || data.error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
throw new Error('Authorization timed out. Please try again.');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get authenticated user info
|
|
118
|
+
*/
|
|
119
|
+
async function getUser(token) {
|
|
120
|
+
const response = await fetch(`${GITHUB_API_URL}/user`, {
|
|
121
|
+
headers: {
|
|
122
|
+
Authorization: `Bearer ${token}`,
|
|
123
|
+
Accept: 'application/vnd.github+json',
|
|
124
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
throw new Error(`Failed to get user info: ${response.statusText}`);
|
|
129
|
+
}
|
|
130
|
+
return response.json();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get user's repositories
|
|
134
|
+
*/
|
|
135
|
+
async function getUserRepos(token) {
|
|
136
|
+
const repos = [];
|
|
137
|
+
let page = 1;
|
|
138
|
+
const perPage = 100;
|
|
139
|
+
while (true) {
|
|
140
|
+
const response = await fetch(`${GITHUB_API_URL}/user/repos?per_page=${perPage}&page=${page}&sort=pushed&direction=desc`, {
|
|
141
|
+
headers: {
|
|
142
|
+
Authorization: `Bearer ${token}`,
|
|
143
|
+
Accept: 'application/vnd.github+json',
|
|
144
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
if (!response.ok) {
|
|
148
|
+
throw new Error(`Failed to get repos: ${response.statusText}`);
|
|
149
|
+
}
|
|
150
|
+
const pageRepos = await response.json();
|
|
151
|
+
repos.push(...pageRepos);
|
|
152
|
+
if (pageRepos.length < perPage) {
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
page++;
|
|
156
|
+
// Safety limit
|
|
157
|
+
if (page > 10) {
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return repos;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if a repo is a JFL GTM project (not just any repo with CLAUDE.md)
|
|
165
|
+
*
|
|
166
|
+
* A JFL GTM project has:
|
|
167
|
+
* - .jfl/config.json (definitive), OR
|
|
168
|
+
* - knowledge/ directory (GTM structure)
|
|
169
|
+
*
|
|
170
|
+
* Just having CLAUDE.md is not enough (the CLI itself has that)
|
|
171
|
+
*/
|
|
172
|
+
async function checkRepoForJfl(token, owner, repo) {
|
|
173
|
+
// Skip the JFL CLI repo itself
|
|
174
|
+
if (repo === 'just-fucking-launch' || repo === 'jfl') {
|
|
175
|
+
return { isJfl: false };
|
|
176
|
+
}
|
|
177
|
+
// Try .jfl/config.json first (definitive signal)
|
|
178
|
+
try {
|
|
179
|
+
const response = await fetch(`${GITHUB_API_URL}/repos/${owner}/${repo}/contents/.jfl/config.json`, {
|
|
180
|
+
headers: {
|
|
181
|
+
Authorization: `Bearer ${token}`,
|
|
182
|
+
Accept: 'application/vnd.github+json',
|
|
183
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
if (response.ok) {
|
|
187
|
+
const data = await response.json();
|
|
188
|
+
if (data.content) {
|
|
189
|
+
const content = Buffer.from(data.content, 'base64').toString('utf-8');
|
|
190
|
+
return { isJfl: true, config: JSON.parse(content) };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Not found or error, continue
|
|
196
|
+
}
|
|
197
|
+
// Try knowledge/ directory (GTM structure signal)
|
|
198
|
+
try {
|
|
199
|
+
const response = await fetch(`${GITHUB_API_URL}/repos/${owner}/${repo}/contents/knowledge`, {
|
|
200
|
+
headers: {
|
|
201
|
+
Authorization: `Bearer ${token}`,
|
|
202
|
+
Accept: 'application/vnd.github+json',
|
|
203
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
if (response.ok) {
|
|
207
|
+
return { isJfl: true };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// Not found
|
|
212
|
+
}
|
|
213
|
+
return { isJfl: false };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Check if user has a suggestions file in the repo
|
|
217
|
+
*/
|
|
218
|
+
async function checkUserSuggestions(token, owner, repo, username) {
|
|
219
|
+
try {
|
|
220
|
+
const response = await fetch(`${GITHUB_API_URL}/repos/${owner}/${repo}/contents/suggestions/${username}.md`, {
|
|
221
|
+
headers: {
|
|
222
|
+
Authorization: `Bearer ${token}`,
|
|
223
|
+
Accept: 'application/vnd.github+json',
|
|
224
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
return response.ok;
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Authenticate with GitHub using Device Flow
|
|
235
|
+
* Returns the username on success
|
|
236
|
+
*/
|
|
237
|
+
export async function authenticateWithGitHub() {
|
|
238
|
+
// Check if already authenticated
|
|
239
|
+
const existingToken = getGitHubToken();
|
|
240
|
+
if (existingToken) {
|
|
241
|
+
try {
|
|
242
|
+
const user = await getUser(existingToken);
|
|
243
|
+
config.set('githubUsername', user.login);
|
|
244
|
+
return user.login;
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// Token invalid, clear and re-auth
|
|
248
|
+
clearGitHubAuth();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
console.log(chalk.cyan('\nConnecting to GitHub...\n'));
|
|
252
|
+
// Request device code
|
|
253
|
+
const deviceCode = await requestDeviceCode();
|
|
254
|
+
// Show instructions
|
|
255
|
+
console.log(chalk.bold('To authorize JFL:'));
|
|
256
|
+
console.log();
|
|
257
|
+
console.log(chalk.gray(' 1. Go to: ') + chalk.cyan.underline(deviceCode.verification_uri));
|
|
258
|
+
console.log(chalk.gray(' 2. Enter code: ') + chalk.yellow.bold(deviceCode.user_code));
|
|
259
|
+
console.log();
|
|
260
|
+
// Pause so they can see the code
|
|
261
|
+
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
262
|
+
// Try to open browser
|
|
263
|
+
console.log(chalk.dim(' Opening browser...'));
|
|
264
|
+
try {
|
|
265
|
+
await open(deviceCode.verification_uri);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
console.log(chalk.dim(' (Could not open browser - go to the URL manually)'));
|
|
269
|
+
}
|
|
270
|
+
console.log();
|
|
271
|
+
// Poll for token
|
|
272
|
+
const spinner = ora('Waiting for authorization...').start();
|
|
273
|
+
try {
|
|
274
|
+
const token = await pollForToken(deviceCode.device_code, deviceCode.interval, deviceCode.expires_in);
|
|
275
|
+
// Get user info
|
|
276
|
+
const user = await getUser(token);
|
|
277
|
+
// Store token and username
|
|
278
|
+
config.set('githubToken', token);
|
|
279
|
+
config.set('githubUsername', user.login);
|
|
280
|
+
spinner.succeed(`Connected as ${chalk.green(user.login)}`);
|
|
281
|
+
return user.login;
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
spinner.fail('Authorization failed');
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Discover JFL projects the user has access to
|
|
290
|
+
*/
|
|
291
|
+
export async function discoverJflProjects() {
|
|
292
|
+
const token = getGitHubToken();
|
|
293
|
+
const username = getGitHubUsername();
|
|
294
|
+
if (!token || !username) {
|
|
295
|
+
throw new Error('Not authenticated with GitHub');
|
|
296
|
+
}
|
|
297
|
+
const spinner = ora('Looking for JFL projects...').start();
|
|
298
|
+
try {
|
|
299
|
+
const repos = await getUserRepos(token);
|
|
300
|
+
const jflProjects = [];
|
|
301
|
+
// Check each repo for JFL config (limit to recent 50 for speed)
|
|
302
|
+
const reposToCheck = repos.slice(0, 50);
|
|
303
|
+
for (const repo of reposToCheck) {
|
|
304
|
+
spinner.text = `Checking ${repo.full_name}...`;
|
|
305
|
+
const { isJfl, config: projectConfig } = await checkRepoForJfl(token, repo.owner.login, repo.name);
|
|
306
|
+
if (isJfl) {
|
|
307
|
+
const hasUserSuggestions = await checkUserSuggestions(token, repo.owner.login, repo.name, username);
|
|
308
|
+
jflProjects.push({
|
|
309
|
+
name: repo.name,
|
|
310
|
+
fullName: repo.full_name,
|
|
311
|
+
owner: repo.owner.login,
|
|
312
|
+
description: repo.description,
|
|
313
|
+
cloneUrl: repo.clone_url,
|
|
314
|
+
sshUrl: repo.ssh_url,
|
|
315
|
+
lastUpdated: repo.pushed_at,
|
|
316
|
+
hasUserSuggestions,
|
|
317
|
+
projectConfig: projectConfig,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
spinner.succeed(`Found ${jflProjects.length} JFL project${jflProjects.length === 1 ? '' : 's'}`);
|
|
322
|
+
return jflProjects;
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
spinner.fail('Failed to discover projects');
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Clone a repository
|
|
331
|
+
*/
|
|
332
|
+
export async function cloneRepository(project, targetDir) {
|
|
333
|
+
const { execSync } = await import('child_process');
|
|
334
|
+
const { homedir } = await import('os');
|
|
335
|
+
const { join, basename } = await import('path');
|
|
336
|
+
const { existsSync } = await import('fs');
|
|
337
|
+
// Determine target directory
|
|
338
|
+
const projectsDir = join(homedir(), 'Projects');
|
|
339
|
+
const defaultTarget = join(projectsDir, project.name);
|
|
340
|
+
const target = targetDir || defaultTarget;
|
|
341
|
+
// Check if already exists
|
|
342
|
+
if (existsSync(target)) {
|
|
343
|
+
console.log(chalk.yellow(`\nDirectory already exists: ${target}`));
|
|
344
|
+
return target;
|
|
345
|
+
}
|
|
346
|
+
// Ensure Projects directory exists
|
|
347
|
+
if (!existsSync(projectsDir)) {
|
|
348
|
+
execSync(`mkdir -p "${projectsDir}"`);
|
|
349
|
+
}
|
|
350
|
+
const spinner = ora(`Cloning ${project.fullName}...`).start();
|
|
351
|
+
try {
|
|
352
|
+
// Prefer SSH if available, fall back to HTTPS
|
|
353
|
+
const cloneUrl = project.sshUrl;
|
|
354
|
+
execSync(`git clone "${cloneUrl}" "${target}"`, {
|
|
355
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
356
|
+
});
|
|
357
|
+
spinner.succeed(`Cloned to ${chalk.cyan(target)}`);
|
|
358
|
+
return target;
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
// Try HTTPS if SSH failed
|
|
362
|
+
try {
|
|
363
|
+
execSync(`git clone "${project.cloneUrl}" "${target}"`, {
|
|
364
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
365
|
+
});
|
|
366
|
+
spinner.succeed(`Cloned to ${chalk.cyan(target)}`);
|
|
367
|
+
return target;
|
|
368
|
+
}
|
|
369
|
+
catch (httpsError) {
|
|
370
|
+
spinner.fail('Failed to clone repository');
|
|
371
|
+
throw httpsError;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=github-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-auth.js","sourceRoot":"","sources":["../../src/utils/github-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Repository Operations
|
|
3
|
+
*
|
|
4
|
+
* Handles GitHub repo creation and GitHub App installation
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a new GitHub repository
|
|
8
|
+
*/
|
|
9
|
+
export declare function createGitHubRepo(projectPath?: string): Promise<{
|
|
10
|
+
url: string;
|
|
11
|
+
sshUrl: string;
|
|
12
|
+
htmlUrl: string;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* Check if JFL GitHub App is installed on a repository
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkGitHubAppInstalled(owner: string, repo: string): Promise<{
|
|
18
|
+
installed: boolean;
|
|
19
|
+
installationId?: number;
|
|
20
|
+
installUrl?: string;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* Poll for GitHub App installation (wait for user to install)
|
|
24
|
+
*/
|
|
25
|
+
export declare function waitForGitHubAppInstallation(owner: string, repo: string, timeoutMs?: number): Promise<number | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Prompt user to install GitHub App
|
|
28
|
+
*/
|
|
29
|
+
export declare function promptGitHubAppInstall(owner: string, repo: string): Promise<number | null>;
|
|
30
|
+
//# sourceMappingURL=github-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-repo.d.ts","sourceRoot":"","sources":["../../src/utils/github-repo.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgF3D;AAoCD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkE/E;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAe,GACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBxB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBxB"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Repository Operations
|
|
3
|
+
*
|
|
4
|
+
* Handles GitHub repo creation and GitHub App installation
|
|
5
|
+
*/
|
|
6
|
+
import { getGitHubToken, getGitHubUsername } from './github-auth.js';
|
|
7
|
+
import { getProjectConfig } from './project-config.js';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import ora from 'ora';
|
|
10
|
+
import { basename } from 'path';
|
|
11
|
+
const GITHUB_API_URL = 'https://api.github.com';
|
|
12
|
+
/**
|
|
13
|
+
* Create a new GitHub repository
|
|
14
|
+
*/
|
|
15
|
+
export async function createGitHubRepo(projectPath = process.cwd()) {
|
|
16
|
+
const token = getGitHubToken();
|
|
17
|
+
if (!token) {
|
|
18
|
+
throw new Error('Not authenticated with GitHub. Run: jfl login');
|
|
19
|
+
}
|
|
20
|
+
// Get project name from config or directory name
|
|
21
|
+
const config = getProjectConfig();
|
|
22
|
+
const projectName = config.name || basename(projectPath);
|
|
23
|
+
const spinner = ora('Creating GitHub repository...').start();
|
|
24
|
+
try {
|
|
25
|
+
// Check if repo already exists
|
|
26
|
+
const username = getGitHubUsername();
|
|
27
|
+
if (username) {
|
|
28
|
+
const existingRepo = await checkRepoExists(token, username, projectName);
|
|
29
|
+
if (existingRepo) {
|
|
30
|
+
spinner.succeed('Repository already exists');
|
|
31
|
+
return {
|
|
32
|
+
url: existingRepo.clone_url,
|
|
33
|
+
sshUrl: existingRepo.ssh_url,
|
|
34
|
+
htmlUrl: existingRepo.html_url,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Create new repo
|
|
39
|
+
const response = await fetch(`${GITHUB_API_URL}/user/repos`, {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
headers: {
|
|
42
|
+
Authorization: `Bearer ${token}`,
|
|
43
|
+
Accept: 'application/vnd.github+json',
|
|
44
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
45
|
+
'Content-Type': 'application/json',
|
|
46
|
+
},
|
|
47
|
+
body: JSON.stringify({
|
|
48
|
+
name: projectName,
|
|
49
|
+
description: config.description || `JFL GTM workspace for ${projectName}`,
|
|
50
|
+
private: true,
|
|
51
|
+
auto_init: false, // We'll push our own code
|
|
52
|
+
has_issues: true,
|
|
53
|
+
has_wiki: false,
|
|
54
|
+
has_projects: false,
|
|
55
|
+
}),
|
|
56
|
+
});
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
const error = await response.json();
|
|
59
|
+
// Check if repo already exists
|
|
60
|
+
if (error.errors && error.errors.some((e) => e.message?.includes('already exists'))) {
|
|
61
|
+
// Repo exists, get its URL
|
|
62
|
+
const existingRepo = await getRepo(token, username, projectName);
|
|
63
|
+
if (existingRepo) {
|
|
64
|
+
spinner.succeed('Repository already exists');
|
|
65
|
+
return {
|
|
66
|
+
url: existingRepo.clone_url,
|
|
67
|
+
sshUrl: existingRepo.ssh_url,
|
|
68
|
+
htmlUrl: existingRepo.html_url,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`Failed to create repository: ${error.message || response.statusText}`);
|
|
73
|
+
}
|
|
74
|
+
const repo = await response.json();
|
|
75
|
+
spinner.succeed(`Created repository: ${chalk.cyan(repo.html_url)}`);
|
|
76
|
+
return {
|
|
77
|
+
url: repo.clone_url,
|
|
78
|
+
sshUrl: repo.ssh_url,
|
|
79
|
+
htmlUrl: repo.html_url,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
spinner.fail('Failed to create repository');
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if a repository exists
|
|
89
|
+
*/
|
|
90
|
+
async function checkRepoExists(token, owner, repo) {
|
|
91
|
+
try {
|
|
92
|
+
return await getRepo(token, owner, repo);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get repository info
|
|
100
|
+
*/
|
|
101
|
+
async function getRepo(token, owner, repo) {
|
|
102
|
+
const response = await fetch(`${GITHUB_API_URL}/repos/${owner}/${repo}`, {
|
|
103
|
+
headers: {
|
|
104
|
+
Authorization: `Bearer ${token}`,
|
|
105
|
+
Accept: 'application/vnd.github+json',
|
|
106
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
if (!response.ok) {
|
|
110
|
+
throw new Error(`Repository not found: ${owner}/${repo}`);
|
|
111
|
+
}
|
|
112
|
+
return response.json();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Check if JFL GitHub App is installed on a repository
|
|
116
|
+
*/
|
|
117
|
+
export async function checkGitHubAppInstalled(owner, repo) {
|
|
118
|
+
const token = getGitHubToken();
|
|
119
|
+
if (!token) {
|
|
120
|
+
throw new Error('Not authenticated with GitHub');
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
// Get user's installations
|
|
124
|
+
const response = await fetch(`${GITHUB_API_URL}/user/installations`, {
|
|
125
|
+
headers: {
|
|
126
|
+
Authorization: `Bearer ${token}`,
|
|
127
|
+
Accept: 'application/vnd.github+json',
|
|
128
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
if (!response.ok) {
|
|
132
|
+
return {
|
|
133
|
+
installed: false,
|
|
134
|
+
installUrl: 'https://github.com/apps/jfl-platform/installations/new',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const { installations } = await response.json();
|
|
138
|
+
// Look for JFL app installation
|
|
139
|
+
for (const installation of installations) {
|
|
140
|
+
// Check if this installation has access to the repo
|
|
141
|
+
const reposResponse = await fetch(`${GITHUB_API_URL}/user/installations/${installation.id}/repositories`, {
|
|
142
|
+
headers: {
|
|
143
|
+
Authorization: `Bearer ${token}`,
|
|
144
|
+
Accept: 'application/vnd.github+json',
|
|
145
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
if (reposResponse.ok) {
|
|
149
|
+
const { repositories } = await reposResponse.json();
|
|
150
|
+
const hasRepo = repositories.some((r) => r.name === repo && r.owner.login === owner);
|
|
151
|
+
if (hasRepo) {
|
|
152
|
+
return {
|
|
153
|
+
installed: true,
|
|
154
|
+
installationId: installation.id,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
installed: false,
|
|
161
|
+
installUrl: `https://github.com/apps/jfl-platform/installations/new/permissions?target_id=${owner}`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error(chalk.red('Error checking GitHub App installation:'), error);
|
|
166
|
+
return {
|
|
167
|
+
installed: false,
|
|
168
|
+
installUrl: 'https://github.com/apps/jfl-platform/installations/new',
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Poll for GitHub App installation (wait for user to install)
|
|
174
|
+
*/
|
|
175
|
+
export async function waitForGitHubAppInstallation(owner, repo, timeoutMs = 300000 // 5 minutes
|
|
176
|
+
) {
|
|
177
|
+
const startTime = Date.now();
|
|
178
|
+
const pollInterval = 3000; // 3 seconds
|
|
179
|
+
console.log(chalk.gray('\n Waiting for GitHub App installation...'));
|
|
180
|
+
console.log(chalk.gray(' (Press Ctrl+C to cancel)\n'));
|
|
181
|
+
const spinner = ora('Checking installation status...').start();
|
|
182
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
183
|
+
const result = await checkGitHubAppInstalled(owner, repo);
|
|
184
|
+
if (result.installed && result.installationId) {
|
|
185
|
+
spinner.succeed('GitHub App installed!');
|
|
186
|
+
return result.installationId;
|
|
187
|
+
}
|
|
188
|
+
// Wait before next check
|
|
189
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
190
|
+
}
|
|
191
|
+
spinner.fail('Installation timeout');
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Prompt user to install GitHub App
|
|
196
|
+
*/
|
|
197
|
+
export async function promptGitHubAppInstall(owner, repo) {
|
|
198
|
+
const result = await checkGitHubAppInstalled(owner, repo);
|
|
199
|
+
if (result.installed && result.installationId) {
|
|
200
|
+
console.log(chalk.gray(' ✓ GitHub App already installed'));
|
|
201
|
+
return result.installationId;
|
|
202
|
+
}
|
|
203
|
+
console.log(chalk.yellow('\n⚠️ JFL GitHub App not installed'));
|
|
204
|
+
console.log(chalk.gray('\nTo enable deployments, install the JFL GitHub App:'));
|
|
205
|
+
console.log(chalk.cyan(`\n ${result.installUrl}\n`));
|
|
206
|
+
console.log(chalk.gray('Then select the repository: ') + chalk.white(`${owner}/${repo}`));
|
|
207
|
+
// Try to open browser
|
|
208
|
+
try {
|
|
209
|
+
const open = (await import('open')).default;
|
|
210
|
+
await open(result.installUrl || 'https://github.com/apps/jfl-platform/installations/new');
|
|
211
|
+
console.log(chalk.dim('\n Browser opened...\n'));
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
console.log(chalk.dim('\n (Could not open browser - copy the URL above)\n'));
|
|
215
|
+
}
|
|
216
|
+
// Wait for installation
|
|
217
|
+
return await waitForGitHubAppInstallation(owner, repo);
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=github-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-repo.js","sourceRoot":"","sources":["../../src/utils/github-repo.ts"],"names":[],"mappings":"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"}
|