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,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JFL GTM Clawdbot Skill
|
|
3
|
+
*
|
|
4
|
+
* Provides full JFL CLI access from Telegram/Slack with proper session isolation.
|
|
5
|
+
* Uses `jfl session create` and `jfl session exec` for worktree isolation, auto-commit, and journaling.
|
|
6
|
+
* Session state persisted to ~/.clawd/memory/jfl-sessions.json
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { exec } from "child_process"
|
|
10
|
+
import { promisify } from "util"
|
|
11
|
+
import { existsSync, readFileSync } from "fs"
|
|
12
|
+
import { join } from "path"
|
|
13
|
+
import { homedir } from "os"
|
|
14
|
+
|
|
15
|
+
const execAsync = promisify(exec)
|
|
16
|
+
|
|
17
|
+
interface Context {
|
|
18
|
+
threadId: string
|
|
19
|
+
platform: "telegram" | "slack" | "discord"
|
|
20
|
+
userId: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface GTM {
|
|
24
|
+
name: string
|
|
25
|
+
path: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Boot sequence - runs when skill first activates
|
|
30
|
+
*/
|
|
31
|
+
export async function onBoot(ctx: Context) {
|
|
32
|
+
// Check if JFL CLI is installed
|
|
33
|
+
const hasJFL = await checkJFLInstalled()
|
|
34
|
+
|
|
35
|
+
if (!hasJFL) {
|
|
36
|
+
return {
|
|
37
|
+
text: "⚠️ JFL CLI not found\n\n" +
|
|
38
|
+
"Install: npm install -g jfl\n\n" +
|
|
39
|
+
"Then run /jfl again",
|
|
40
|
+
buttons: []
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Find available GTMs
|
|
45
|
+
const gtms = await findGTMs()
|
|
46
|
+
|
|
47
|
+
if (gtms.length === 0) {
|
|
48
|
+
return {
|
|
49
|
+
text: "🚀 JFL - Just Fucking Launch\n\n" +
|
|
50
|
+
"No GTMs found.\n\n" +
|
|
51
|
+
"Create one: jfl init\n" +
|
|
52
|
+
"Then run /jfl again"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Show GTM picker (like screenshot)
|
|
57
|
+
const buttons = gtms.map(g => ({
|
|
58
|
+
text: `📂 ${g.name}`,
|
|
59
|
+
callbackData: `select:${g.path}`
|
|
60
|
+
}))
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
text: "🚀 JFL - Just Fucking Launch\n\n" +
|
|
64
|
+
"Your team's context layer. Any AI. Any task.\n\n" +
|
|
65
|
+
"Open a project:",
|
|
66
|
+
buttons
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Handle button clicks
|
|
72
|
+
*/
|
|
73
|
+
export async function onCallback(data: string, ctx: Context) {
|
|
74
|
+
const [action, value] = data.split(":")
|
|
75
|
+
|
|
76
|
+
if (action === "select") {
|
|
77
|
+
return await handleSelectGTM(value, ctx)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (action === "cmd") {
|
|
81
|
+
return await handleCommand(value, ctx)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return { text: "Unknown action" }
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Handle slash commands
|
|
89
|
+
*/
|
|
90
|
+
export async function onCommand(cmd: string, args: string[], ctx: Context) {
|
|
91
|
+
const session = getSession(ctx.threadId)
|
|
92
|
+
|
|
93
|
+
if (!session && cmd !== "gtm") {
|
|
94
|
+
return {
|
|
95
|
+
text: "⚠️ No GTM selected.\n\nRun /jfl to select a project."
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
switch (cmd) {
|
|
100
|
+
case "gtm":
|
|
101
|
+
return await onBoot(ctx)
|
|
102
|
+
|
|
103
|
+
case "hud":
|
|
104
|
+
return await runJFLCommand(session!, "hud")
|
|
105
|
+
|
|
106
|
+
case "crm":
|
|
107
|
+
if (args.length === 0) {
|
|
108
|
+
return showCRMMenu()
|
|
109
|
+
}
|
|
110
|
+
return await runCRMCommand(session!, args)
|
|
111
|
+
|
|
112
|
+
case "brand":
|
|
113
|
+
return showBrandMenu()
|
|
114
|
+
|
|
115
|
+
case "content":
|
|
116
|
+
if (args.length === 0) {
|
|
117
|
+
return showContentMenu()
|
|
118
|
+
}
|
|
119
|
+
return await runJFLCommand(session!, `content ${args.join(" ")}`)
|
|
120
|
+
|
|
121
|
+
default:
|
|
122
|
+
return { text: `Unknown command: /${cmd}` }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Check if JFL CLI is installed
|
|
128
|
+
*/
|
|
129
|
+
async function checkJFLInstalled(): Promise<boolean> {
|
|
130
|
+
try {
|
|
131
|
+
await execAsync("jfl --version")
|
|
132
|
+
return true
|
|
133
|
+
} catch {
|
|
134
|
+
return false
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Find GTMs on this machine
|
|
140
|
+
*
|
|
141
|
+
* A GTM has: .jfl/ + knowledge/ + CLAUDE.md
|
|
142
|
+
* Product repos (jfl-cli, jfl-platform) have .jfl/ but aren't GTMs
|
|
143
|
+
*/
|
|
144
|
+
async function findGTMs(): Promise<GTM[]> {
|
|
145
|
+
const gtms: GTM[] = []
|
|
146
|
+
|
|
147
|
+
// Check common locations
|
|
148
|
+
const searchPaths = [
|
|
149
|
+
join(homedir(), "CascadeProjects"),
|
|
150
|
+
join(homedir(), "Projects"),
|
|
151
|
+
join(homedir(), "code"),
|
|
152
|
+
]
|
|
153
|
+
|
|
154
|
+
for (const basePath of searchPaths) {
|
|
155
|
+
if (!existsSync(basePath)) continue
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
const { stdout } = await execAsync(`find ${basePath} -maxdepth 2 -name .jfl -type d`)
|
|
159
|
+
const dirs = stdout.trim().split("\n").filter(Boolean)
|
|
160
|
+
|
|
161
|
+
for (const dir of dirs) {
|
|
162
|
+
const gtmPath = dir.replace("/.jfl", "")
|
|
163
|
+
|
|
164
|
+
// Filter: Must have knowledge/ and CLAUDE.md to be a GTM
|
|
165
|
+
const hasKnowledge = existsSync(join(gtmPath, "knowledge"))
|
|
166
|
+
const hasClaude = existsSync(join(gtmPath, "CLAUDE.md"))
|
|
167
|
+
|
|
168
|
+
if (!hasKnowledge || !hasClaude) {
|
|
169
|
+
continue // Skip product repos
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const name = gtmPath.split("/").pop() || "unknown"
|
|
173
|
+
gtms.push({ name, path: gtmPath })
|
|
174
|
+
}
|
|
175
|
+
} catch {
|
|
176
|
+
// Skip if find fails
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return gtms
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Session storage (persisted to disk)
|
|
185
|
+
*/
|
|
186
|
+
const SESSIONS_FILE = join(homedir(), ".clawd", "memory", "jfl-sessions.json")
|
|
187
|
+
|
|
188
|
+
interface SessionData {
|
|
189
|
+
gtmPath: string
|
|
190
|
+
gtmName: string
|
|
191
|
+
sessionId: string
|
|
192
|
+
platform: string
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function loadSessions(): Map<string, SessionData> {
|
|
196
|
+
try {
|
|
197
|
+
if (existsSync(SESSIONS_FILE)) {
|
|
198
|
+
const data = JSON.parse(readFileSync(SESSIONS_FILE, "utf-8"))
|
|
199
|
+
return new Map(Object.entries(data))
|
|
200
|
+
}
|
|
201
|
+
} catch {
|
|
202
|
+
// Ignore parse errors
|
|
203
|
+
}
|
|
204
|
+
return new Map()
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function saveSessions(sessions: Map<string, SessionData>) {
|
|
208
|
+
try {
|
|
209
|
+
const data = Object.fromEntries(sessions)
|
|
210
|
+
const fs = require("fs")
|
|
211
|
+
fs.mkdirSync(join(homedir(), ".clawd", "memory"), { recursive: true })
|
|
212
|
+
fs.writeFileSync(SESSIONS_FILE, JSON.stringify(data, null, 2))
|
|
213
|
+
} catch (error) {
|
|
214
|
+
console.error("Failed to save sessions:", error)
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const sessions = loadSessions()
|
|
219
|
+
|
|
220
|
+
function getSession(threadId: string) {
|
|
221
|
+
return sessions.get(threadId)
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function setSession(threadId: string, data: SessionData) {
|
|
225
|
+
sessions.set(threadId, data)
|
|
226
|
+
saveSessions(sessions)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Handle GTM selection
|
|
231
|
+
*/
|
|
232
|
+
async function handleSelectGTM(gtmPath: string, ctx: Context) {
|
|
233
|
+
const gtmName = gtmPath.split("/").pop() || "unknown"
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
// Create or get session with proper worktree isolation
|
|
237
|
+
const { stdout } = await execAsync(
|
|
238
|
+
`cd ${gtmPath} && jfl session create --platform ${ctx.platform} --thread ${ctx.threadId}`
|
|
239
|
+
)
|
|
240
|
+
const sessionId = stdout.trim()
|
|
241
|
+
|
|
242
|
+
// Store session with ID
|
|
243
|
+
setSession(ctx.threadId, {
|
|
244
|
+
gtmPath,
|
|
245
|
+
gtmName,
|
|
246
|
+
sessionId,
|
|
247
|
+
platform: ctx.platform
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
// Show command menu
|
|
251
|
+
const commands = [
|
|
252
|
+
[
|
|
253
|
+
{ text: "📊 Dashboard", callbackData: "cmd:hud" },
|
|
254
|
+
{ text: "👥 CRM", callbackData: "cmd:crm" }
|
|
255
|
+
],
|
|
256
|
+
[
|
|
257
|
+
{ text: "🎨 Brand", callbackData: "cmd:brand" },
|
|
258
|
+
{ text: "✍️ Content", callbackData: "cmd:content" }
|
|
259
|
+
],
|
|
260
|
+
[
|
|
261
|
+
{ text: "🔄 Sync", callbackData: "cmd:sync" },
|
|
262
|
+
{ text: "📝 Status", callbackData: "cmd:status" }
|
|
263
|
+
]
|
|
264
|
+
]
|
|
265
|
+
|
|
266
|
+
return {
|
|
267
|
+
text: `✓ Session created: ${gtmName}\n\n` +
|
|
268
|
+
`Session ID: ${sessionId}\n` +
|
|
269
|
+
`Isolated worktree with auto-commit enabled.\n\n` +
|
|
270
|
+
`What do you want to do?`,
|
|
271
|
+
buttons: commands
|
|
272
|
+
}
|
|
273
|
+
} catch (error: any) {
|
|
274
|
+
return {
|
|
275
|
+
text: `❌ Failed to create session\n\n${error.message}\n\n` +
|
|
276
|
+
`Make sure you're in a JFL GTM directory.`
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Handle command button
|
|
283
|
+
*/
|
|
284
|
+
async function handleCommand(cmd: string, ctx: Context) {
|
|
285
|
+
const session = getSession(ctx.threadId)
|
|
286
|
+
|
|
287
|
+
if (!session) {
|
|
288
|
+
return { text: "⚠️ Session expired. Run /jfl to select a GTM." }
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
switch (cmd) {
|
|
292
|
+
case "hud":
|
|
293
|
+
return await runJFLCommand(session, "hud")
|
|
294
|
+
|
|
295
|
+
case "crm":
|
|
296
|
+
return showCRMMenu()
|
|
297
|
+
|
|
298
|
+
case "brand":
|
|
299
|
+
return showBrandMenu()
|
|
300
|
+
|
|
301
|
+
case "content":
|
|
302
|
+
return showContentMenu()
|
|
303
|
+
|
|
304
|
+
case "sync":
|
|
305
|
+
return await runGitSync(session)
|
|
306
|
+
|
|
307
|
+
case "status":
|
|
308
|
+
return await runGitStatus(session)
|
|
309
|
+
|
|
310
|
+
default:
|
|
311
|
+
return { text: "Unknown command" }
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Run JFL command (uses session exec for isolation)
|
|
317
|
+
*/
|
|
318
|
+
async function runJFLCommand(session: SessionData, command: string) {
|
|
319
|
+
try {
|
|
320
|
+
// Use jfl session exec to run command in isolated worktree
|
|
321
|
+
const { stdout, stderr } = await execAsync(
|
|
322
|
+
`cd ${session.gtmPath} && jfl session exec "${session.sessionId}" "${command}"`,
|
|
323
|
+
{
|
|
324
|
+
env: { ...process.env, JFL_PLATFORM: session.platform }
|
|
325
|
+
}
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
const output = stdout || stderr
|
|
329
|
+
const formatted = formatForTelegram(output)
|
|
330
|
+
|
|
331
|
+
return {
|
|
332
|
+
text: formatted,
|
|
333
|
+
parseMode: "Markdown"
|
|
334
|
+
}
|
|
335
|
+
} catch (error: any) {
|
|
336
|
+
return {
|
|
337
|
+
text: `❌ Error running jfl ${command}\n\n${error.message}`
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Run CRM command (uses session exec for isolation)
|
|
344
|
+
*/
|
|
345
|
+
async function runCRMCommand(session: SessionData, args: string[]) {
|
|
346
|
+
try {
|
|
347
|
+
// Use session exec to run CRM in isolated worktree
|
|
348
|
+
const { stdout } = await execAsync(
|
|
349
|
+
`cd ${session.gtmPath} && jfl session exec "${session.sessionId}" "./crm ${args.join(" ")}"`
|
|
350
|
+
)
|
|
351
|
+
const formatted = formatForTelegram(stdout)
|
|
352
|
+
|
|
353
|
+
return {
|
|
354
|
+
text: formatted,
|
|
355
|
+
parseMode: "Markdown"
|
|
356
|
+
}
|
|
357
|
+
} catch (error: any) {
|
|
358
|
+
return {
|
|
359
|
+
text: `❌ Error running crm\n\n${error.message}`
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Show CRM menu
|
|
366
|
+
*/
|
|
367
|
+
function showCRMMenu() {
|
|
368
|
+
return {
|
|
369
|
+
text: "👥 CRM\n\nWhat do you want to do?",
|
|
370
|
+
buttons: [
|
|
371
|
+
[
|
|
372
|
+
{ text: "📋 List Pipeline", callbackData: "crm:list" },
|
|
373
|
+
{ text: "⏰ Stale Deals", callbackData: "crm:stale" }
|
|
374
|
+
],
|
|
375
|
+
[
|
|
376
|
+
{ text: "📞 Prep Call", callbackData: "crm:prep" },
|
|
377
|
+
{ text: "✏️ Log Touch", callbackData: "crm:touch" }
|
|
378
|
+
]
|
|
379
|
+
]
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Show brand menu
|
|
385
|
+
*/
|
|
386
|
+
function showBrandMenu() {
|
|
387
|
+
return {
|
|
388
|
+
text: "🎨 Brand Architect\n\nWhat do you want to create?",
|
|
389
|
+
buttons: [
|
|
390
|
+
[
|
|
391
|
+
{ text: "Logo Marks", callbackData: "brand:marks" },
|
|
392
|
+
{ text: "Color Palette", callbackData: "brand:colors" }
|
|
393
|
+
],
|
|
394
|
+
[
|
|
395
|
+
{ text: "Typography", callbackData: "brand:typography" },
|
|
396
|
+
{ text: "Full System", callbackData: "brand:full" }
|
|
397
|
+
]
|
|
398
|
+
]
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Show content menu
|
|
404
|
+
*/
|
|
405
|
+
function showContentMenu() {
|
|
406
|
+
return {
|
|
407
|
+
text: "✍️ Content Creator\n\nWhat do you want to create?",
|
|
408
|
+
buttons: [
|
|
409
|
+
[
|
|
410
|
+
{ text: "Twitter Thread", callbackData: "content:thread" },
|
|
411
|
+
{ text: "Single Post", callbackData: "content:post" }
|
|
412
|
+
],
|
|
413
|
+
[
|
|
414
|
+
{ text: "Article", callbackData: "content:article" },
|
|
415
|
+
{ text: "One-Pager", callbackData: "content:onepager" }
|
|
416
|
+
]
|
|
417
|
+
]
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Git sync (runs in session worktree)
|
|
423
|
+
*/
|
|
424
|
+
async function runGitSync(session: SessionData) {
|
|
425
|
+
try {
|
|
426
|
+
// Session exec automatically runs session-sync.sh before command
|
|
427
|
+
const { stdout } = await execAsync(
|
|
428
|
+
`cd ${session.gtmPath} && jfl session exec "${session.sessionId}" "git status --short"`
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
return {
|
|
432
|
+
text: `✓ Synced ${session.gtmName}\n\nSession-sync runs automatically before each command.\n\n${stdout || "Working tree clean"}`
|
|
433
|
+
}
|
|
434
|
+
} catch (error: any) {
|
|
435
|
+
return {
|
|
436
|
+
text: `❌ Sync failed\n\n${error.message}`
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Git status (runs in session worktree)
|
|
443
|
+
*/
|
|
444
|
+
async function runGitStatus(session: SessionData) {
|
|
445
|
+
try {
|
|
446
|
+
// Use session exec to check status in isolated worktree
|
|
447
|
+
const { stdout } = await execAsync(
|
|
448
|
+
`cd ${session.gtmPath} && jfl session exec "${session.sessionId}" "git status --short && echo '---' && git log --oneline -5"`
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
return {
|
|
452
|
+
text: `📊 Status: ${session.gtmName}\nSession: ${session.sessionId}\n\n\`\`\`\n${stdout}\n\`\`\``,
|
|
453
|
+
parseMode: "Markdown"
|
|
454
|
+
}
|
|
455
|
+
} catch (error: any) {
|
|
456
|
+
return {
|
|
457
|
+
text: `❌ Status failed\n\n${error.message}`
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Format CLI output for Telegram
|
|
464
|
+
* Optimized for mobile viewing
|
|
465
|
+
*/
|
|
466
|
+
function formatForTelegram(output: string): string {
|
|
467
|
+
return output
|
|
468
|
+
// Strip ANSI color codes
|
|
469
|
+
.replace(/\x1b\[[0-9;]*m/g, "")
|
|
470
|
+
// Convert long separator lines to short ones (mobile-friendly)
|
|
471
|
+
.replace(/[━─]{20,}/g, "━━━━━━━━━")
|
|
472
|
+
// Keep single box-drawing characters as-is (they render fine)
|
|
473
|
+
.replace(/[┌┐└┘├┤┬┴┼]/g, "")
|
|
474
|
+
// Convert vertical bars
|
|
475
|
+
.replace(/[│┃]/g, "")
|
|
476
|
+
// Add spacing around emoji headers for readability
|
|
477
|
+
.replace(/^(📊|👥|🎨|✍️|🔄|📝)/gm, "\n$1")
|
|
478
|
+
// Preserve emoji and structure
|
|
479
|
+
.trim()
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
export default {
|
|
483
|
+
onBoot,
|
|
484
|
+
onCallback,
|
|
485
|
+
onCommand
|
|
486
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "jfl-gtm-clawdbot-skill",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Clawdbot skill for JFL GTM - access your GTMs from Telegram/Slack",
|
|
5
|
+
"main": "index.ts",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"test": "node test.js",
|
|
10
|
+
"link": "ln -sf $(pwd) ~/.clawdbot/skills/jfl-gtm"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"jfl",
|
|
14
|
+
"gtm",
|
|
15
|
+
"clawdbot",
|
|
16
|
+
"telegram",
|
|
17
|
+
"slack"
|
|
18
|
+
],
|
|
19
|
+
"author": "402goose",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"@clawdbot/sdk": "^1.0.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^20.0.0",
|
|
26
|
+
"typescript": "^5.0.0"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "jfl-gtm",
|
|
3
|
+
"version": "0.1.0-local",
|
|
4
|
+
"displayName": "JFL - Just Fucking Launch",
|
|
5
|
+
"description": "Your team's context layer. Any AI. Any task.",
|
|
6
|
+
"emoji": "🚀",
|
|
7
|
+
"author": "402goose",
|
|
8
|
+
"repository": "local-dev",
|
|
9
|
+
"category": "productivity",
|
|
10
|
+
"bootSequence": true,
|
|
11
|
+
"requirements": {
|
|
12
|
+
"cli": {
|
|
13
|
+
"name": "jfl",
|
|
14
|
+
"check": "jfl --version",
|
|
15
|
+
"minVersion": "0.1.0",
|
|
16
|
+
"install": {
|
|
17
|
+
"npm": "jfl"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"commands": {
|
|
22
|
+
"/gtm": "GTM operations (list, select, status)",
|
|
23
|
+
"/hud": "Show GTM dashboard",
|
|
24
|
+
"/crm": "CRM operations (list, touch, prep)",
|
|
25
|
+
"/brand": "Brand architect workflow",
|
|
26
|
+
"/content": "Create content (thread, post, article)"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAmBA,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,iBAyD9F"}
|