@framed-dev/cli 0.1.2 ā 0.1.4
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/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -30,7 +30,9 @@ async function detectProject(cwd) {
|
|
|
30
30
|
// src/templates/index.ts
|
|
31
31
|
function getTemplates(type) {
|
|
32
32
|
return {
|
|
33
|
-
dashboard: `
|
|
33
|
+
dashboard: `"use client";
|
|
34
|
+
|
|
35
|
+
import { FramedProvider, FramedDashboard } from '@framed-dev/react';
|
|
34
36
|
|
|
35
37
|
export default function FramedPage() {
|
|
36
38
|
return (
|
|
@@ -40,7 +42,9 @@ export default function FramedPage() {
|
|
|
40
42
|
);
|
|
41
43
|
}
|
|
42
44
|
`,
|
|
43
|
-
review: `
|
|
45
|
+
review: `"use client";
|
|
46
|
+
|
|
47
|
+
import { FramedProvider, FramedReview } from '@framed-dev/react';
|
|
44
48
|
|
|
45
49
|
export default function ReviewPage() {
|
|
46
50
|
return (
|
|
@@ -50,7 +54,9 @@ export default function ReviewPage() {
|
|
|
50
54
|
);
|
|
51
55
|
}
|
|
52
56
|
`,
|
|
53
|
-
build: `
|
|
57
|
+
build: `"use client";
|
|
58
|
+
|
|
59
|
+
import { FramedProvider, FramedBuild } from '@framed-dev/react';
|
|
54
60
|
|
|
55
61
|
export default function BuildPage() {
|
|
56
62
|
return (
|
|
@@ -60,7 +66,9 @@ export default function BuildPage() {
|
|
|
60
66
|
);
|
|
61
67
|
}
|
|
62
68
|
`,
|
|
63
|
-
manage: `
|
|
69
|
+
manage: `"use client";
|
|
70
|
+
|
|
71
|
+
import { FramedProvider, FramedManage } from '@framed-dev/react';
|
|
64
72
|
|
|
65
73
|
export default function ManagePage() {
|
|
66
74
|
return (
|
|
@@ -180,7 +188,7 @@ function formatType(type) {
|
|
|
180
188
|
|
|
181
189
|
// src/index.ts
|
|
182
190
|
var program = new Command();
|
|
183
|
-
program.name("framed").description("CLI for setting up Framed in your project").version("0.1.
|
|
191
|
+
program.name("framed").description("CLI for setting up Framed in your project").version("0.1.4");
|
|
184
192
|
program.command("init").description("Initialize Framed in your project").option("--force", "Overwrite existing files").action(init);
|
|
185
193
|
program.parse();
|
|
186
194
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/detect.ts","../src/templates/index.ts","../src/init.ts","../src/index.ts"],"names":["path","fs"],"mappings":"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","file":"index.js","sourcesContent":["import fs from 'fs-extra';\nimport path from 'path';\n\nexport type ProjectType = 'next-app' | 'next-pages' | 'vite' | 'unknown';\n\nexport async function detectProject(cwd: string): Promise<{\n type: ProjectType;\n srcDir: boolean;\n}> {\n const packageJsonPath = path.join(cwd, 'package.json');\n\n if (!await fs.pathExists(packageJsonPath)) {\n return { type: 'unknown', srcDir: false };\n }\n\n const pkg = await fs.readJson(packageJsonPath);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Check for Next.js\n if (deps['next']) {\n const hasAppDir = await fs.pathExists(path.join(cwd, 'app')) ||\n await fs.pathExists(path.join(cwd, 'src/app'));\n const srcDir = await fs.pathExists(path.join(cwd, 'src'));\n\n return {\n type: hasAppDir ? 'next-app' : 'next-pages',\n srcDir\n };\n }\n\n // Check for Vite\n if (deps['vite']) {\n return { type: 'vite', srcDir: await fs.pathExists(path.join(cwd, 'src')) };\n }\n\n return { type: 'unknown', srcDir: false };\n}\n","export function getTemplates(type: 'next-app') {\n return {\n dashboard: `import { FramedProvider, FramedDashboard } from '@framed-dev/react';\n\nexport default function FramedPage() {\n return (\n <FramedProvider config={{ mode: 'local' }}>\n <FramedDashboard />\n </FramedProvider>\n );\n}\n`,\n review: `import { FramedProvider, FramedReview } from '@framed-dev/react';\n\nexport default function ReviewPage() {\n return (\n <FramedProvider config={{ mode: 'local' }}>\n <FramedReview />\n </FramedProvider>\n );\n}\n`,\n build: `import { FramedProvider, FramedBuild } from '@framed-dev/react';\n\nexport default function BuildPage() {\n return (\n <FramedProvider config={{ mode: 'local' }}>\n <FramedBuild />\n </FramedProvider>\n );\n}\n`,\n manage: `import { FramedProvider, FramedManage } from '@framed-dev/react';\n\nexport default function ManagePage() {\n return (\n <FramedProvider config={{ mode: 'local' }}>\n <FramedManage />\n </FramedProvider>\n );\n}\n`,\n env: `# Framed Configuration\n# Get your license key at https://framed.dev/dashboard\n\n# Optional: For AI features (task parsing, SEO analysis)\nNEXT_PUBLIC_FRAMED_LICENSE_KEY=\n\n# Optional: Connect your own Supabase for data persistence\nNEXT_PUBLIC_SUPABASE_URL=\nNEXT_PUBLIC_SUPABASE_ANON_KEY=\n`,\n layoutSnippet: `\n// app/layout.tsx\nimport { FramedProvider, FeedbackWidget } from '@framed-dev/react';\n\nexport default function RootLayout({ children }) {\n return (\n <html>\n <body>\n <FramedProvider config={{ mode: 'local' }}>\n {children}\n <FeedbackWidget />\n </FramedProvider>\n </body>\n </html>\n );\n}\n`\n };\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport prompts from 'prompts';\nimport pc from 'picocolors';\nimport { execSync } from 'child_process';\nimport { detectProject, ProjectType } from './detect';\nimport { getTemplates } from './templates';\n\nexport async function init(options: { force?: boolean }) {\n const cwd = process.cwd();\n\n console.log(pc.cyan('\\nš¼ļø Framed Setup\\n'));\n\n // Detect project\n const { type, srcDir } = await detectProject(cwd);\n\n if (type === 'unknown') {\n console.log(pc.red('Could not detect project type. Make sure you have a package.json.'));\n process.exit(1);\n }\n\n console.log(pc.green(`ā Detected: ${formatType(type)}${srcDir ? ' (src directory)' : ''}`));\n\n if (type === 'next-pages' || type === 'vite') {\n console.log(pc.yellow('\\nCurrently only Next.js App Router is supported.'));\n console.log('Support for Pages Router and Vite coming soon.\\n');\n process.exit(1);\n }\n\n // Install @framed-dev/react\n console.log(pc.cyan('\\nInstalling @framed-dev/react...'));\n\n try {\n // Detect package manager\n const useYarn = await fs.pathExists(path.join(cwd, 'yarn.lock'));\n const usePnpm = await fs.pathExists(path.join(cwd, 'pnpm-lock.yaml'));\n\n const cmd = usePnpm ? 'pnpm add' : useYarn ? 'yarn add' : 'npm install';\n execSync(`${cmd} @framed-dev/react`, { cwd, stdio: 'inherit' });\n\n console.log(pc.green('ā Installed @framed-dev/react\\n'));\n } catch (e) {\n console.log(pc.yellow('ā Could not auto-install. Run: npm install @framed-dev/react\\n'));\n }\n\n // Get base path\n const appDir = srcDir ? 'src/app' : 'app';\n const framedDir = path.join(cwd, appDir, 'framed');\n\n // Check if already exists\n if (await fs.pathExists(framedDir) && !options.force) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: '/framed directory already exists. Overwrite?',\n initial: false\n });\n\n if (!overwrite) {\n console.log(pc.yellow('Aborted.'));\n process.exit(0);\n }\n }\n\n // Create files\n const templates = getTemplates('next-app');\n\n // Create framed pages\n await fs.ensureDir(framedDir);\n await fs.writeFile(path.join(framedDir, 'page.tsx'), templates.dashboard);\n console.log(pc.green(`ā Created: ${appDir}/framed/page.tsx`));\n\n await fs.ensureDir(path.join(framedDir, 'review'));\n await fs.writeFile(path.join(framedDir, 'review/page.tsx'), templates.review);\n console.log(pc.green(`ā Created: ${appDir}/framed/review/page.tsx`));\n\n await fs.ensureDir(path.join(framedDir, 'build'));\n await fs.writeFile(path.join(framedDir, 'build/page.tsx'), templates.build);\n console.log(pc.green(`ā Created: ${appDir}/framed/build/page.tsx`));\n\n await fs.ensureDir(path.join(framedDir, 'manage'));\n await fs.writeFile(path.join(framedDir, 'manage/page.tsx'), templates.manage);\n console.log(pc.green(`ā Created: ${appDir}/framed/manage/page.tsx`));\n\n // Create .env.example\n const envPath = path.join(cwd, '.env.example');\n if (!await fs.pathExists(envPath)) {\n await fs.writeFile(envPath, templates.env);\n console.log(pc.green(`ā Created: .env.example`));\n }\n\n // Instructions\n console.log(pc.cyan('\\n⨠Framed setup complete!\\n'));\n console.log('Next steps:');\n console.log(pc.dim(' 1. Add FramedProvider to your root layout'));\n console.log(pc.dim(' 2. Copy .env.example to .env.local and fill in values'));\n console.log(pc.dim(' 3. Visit /framed to get started\\n'));\n\n console.log('Add to your layout.tsx:');\n console.log(pc.dim(templates.layoutSnippet));\n}\n\nfunction formatType(type: ProjectType): string {\n switch (type) {\n case 'next-app': return 'Next.js (App Router)';\n case 'next-pages': return 'Next.js (Pages Router)';\n case 'vite': return 'Vite';\n default: return 'Unknown';\n }\n}\n","import { Command } from 'commander';\nimport { init } from './init';\n\nconst program = new Command();\n\nprogram\n .name('framed')\n .description('CLI for setting up Framed in your project')\n .version('0.1.1');\n\nprogram\n .command('init')\n .description('Initialize Framed in your project')\n .option('--force', 'Overwrite existing files')\n .action(init);\n\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/detect.ts","../src/templates/index.ts","../src/init.ts","../src/index.ts"],"names":["path","fs"],"mappings":"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","file":"index.js","sourcesContent":["import fs from 'fs-extra';\nimport path from 'path';\n\nexport type ProjectType = 'next-app' | 'next-pages' | 'vite' | 'unknown';\n\nexport async function detectProject(cwd: string): Promise<{\n type: ProjectType;\n srcDir: boolean;\n}> {\n const packageJsonPath = path.join(cwd, 'package.json');\n\n if (!await fs.pathExists(packageJsonPath)) {\n return { type: 'unknown', srcDir: false };\n }\n\n const pkg = await fs.readJson(packageJsonPath);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Check for Next.js\n if (deps['next']) {\n const hasAppDir = await fs.pathExists(path.join(cwd, 'app')) ||\n await fs.pathExists(path.join(cwd, 'src/app'));\n const srcDir = await fs.pathExists(path.join(cwd, 'src'));\n\n return {\n type: hasAppDir ? 'next-app' : 'next-pages',\n srcDir\n };\n }\n\n // Check for Vite\n if (deps['vite']) {\n return { type: 'vite', srcDir: await fs.pathExists(path.join(cwd, 'src')) };\n }\n\n return { type: 'unknown', srcDir: false };\n}\n","export function getTemplates(type: 'next-app') {\n return {\n dashboard: `\"use client\";\n\nimport { FramedProvider, FramedDashboard } from '@framed-dev/react';\n\nexport default function FramedPage() {\n return (\n <FramedProvider config={{ mode: 'local' }}>\n <FramedDashboard />\n </FramedProvider>\n );\n}\n`,\n review: `\"use client\";\n\nimport { FramedProvider, FramedReview } from '@framed-dev/react';\n\nexport default function ReviewPage() {\n return (\n <FramedProvider config={{ mode: 'local' }}>\n <FramedReview />\n </FramedProvider>\n );\n}\n`,\n build: `\"use client\";\n\nimport { FramedProvider, FramedBuild } from '@framed-dev/react';\n\nexport default function BuildPage() {\n return (\n <FramedProvider config={{ mode: 'local' }}>\n <FramedBuild />\n </FramedProvider>\n );\n}\n`,\n manage: `\"use client\";\n\nimport { FramedProvider, FramedManage } from '@framed-dev/react';\n\nexport default function ManagePage() {\n return (\n <FramedProvider config={{ mode: 'local' }}>\n <FramedManage />\n </FramedProvider>\n );\n}\n`,\n env: `# Framed Configuration\n# Get your license key at https://framed.dev/dashboard\n\n# Optional: For AI features (task parsing, SEO analysis)\nNEXT_PUBLIC_FRAMED_LICENSE_KEY=\n\n# Optional: Connect your own Supabase for data persistence\nNEXT_PUBLIC_SUPABASE_URL=\nNEXT_PUBLIC_SUPABASE_ANON_KEY=\n`,\n layoutSnippet: `\n// app/layout.tsx\nimport { FramedProvider, FeedbackWidget } from '@framed-dev/react';\n\nexport default function RootLayout({ children }) {\n return (\n <html>\n <body>\n <FramedProvider config={{ mode: 'local' }}>\n {children}\n <FeedbackWidget />\n </FramedProvider>\n </body>\n </html>\n );\n}\n`\n };\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport prompts from 'prompts';\nimport pc from 'picocolors';\nimport { execSync } from 'child_process';\nimport { detectProject, ProjectType } from './detect';\nimport { getTemplates } from './templates';\n\nexport async function init(options: { force?: boolean }) {\n const cwd = process.cwd();\n\n console.log(pc.cyan('\\nš¼ļø Framed Setup\\n'));\n\n // Detect project\n const { type, srcDir } = await detectProject(cwd);\n\n if (type === 'unknown') {\n console.log(pc.red('Could not detect project type. Make sure you have a package.json.'));\n process.exit(1);\n }\n\n console.log(pc.green(`ā Detected: ${formatType(type)}${srcDir ? ' (src directory)' : ''}`));\n\n if (type === 'next-pages' || type === 'vite') {\n console.log(pc.yellow('\\nCurrently only Next.js App Router is supported.'));\n console.log('Support for Pages Router and Vite coming soon.\\n');\n process.exit(1);\n }\n\n // Install @framed-dev/react\n console.log(pc.cyan('\\nInstalling @framed-dev/react...'));\n\n try {\n // Detect package manager\n const useYarn = await fs.pathExists(path.join(cwd, 'yarn.lock'));\n const usePnpm = await fs.pathExists(path.join(cwd, 'pnpm-lock.yaml'));\n\n const cmd = usePnpm ? 'pnpm add' : useYarn ? 'yarn add' : 'npm install';\n execSync(`${cmd} @framed-dev/react`, { cwd, stdio: 'inherit' });\n\n console.log(pc.green('ā Installed @framed-dev/react\\n'));\n } catch (e) {\n console.log(pc.yellow('ā Could not auto-install. Run: npm install @framed-dev/react\\n'));\n }\n\n // Get base path\n const appDir = srcDir ? 'src/app' : 'app';\n const framedDir = path.join(cwd, appDir, 'framed');\n\n // Check if already exists\n if (await fs.pathExists(framedDir) && !options.force) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: '/framed directory already exists. Overwrite?',\n initial: false\n });\n\n if (!overwrite) {\n console.log(pc.yellow('Aborted.'));\n process.exit(0);\n }\n }\n\n // Create files\n const templates = getTemplates('next-app');\n\n // Create framed pages\n await fs.ensureDir(framedDir);\n await fs.writeFile(path.join(framedDir, 'page.tsx'), templates.dashboard);\n console.log(pc.green(`ā Created: ${appDir}/framed/page.tsx`));\n\n await fs.ensureDir(path.join(framedDir, 'review'));\n await fs.writeFile(path.join(framedDir, 'review/page.tsx'), templates.review);\n console.log(pc.green(`ā Created: ${appDir}/framed/review/page.tsx`));\n\n await fs.ensureDir(path.join(framedDir, 'build'));\n await fs.writeFile(path.join(framedDir, 'build/page.tsx'), templates.build);\n console.log(pc.green(`ā Created: ${appDir}/framed/build/page.tsx`));\n\n await fs.ensureDir(path.join(framedDir, 'manage'));\n await fs.writeFile(path.join(framedDir, 'manage/page.tsx'), templates.manage);\n console.log(pc.green(`ā Created: ${appDir}/framed/manage/page.tsx`));\n\n // Create .env.example\n const envPath = path.join(cwd, '.env.example');\n if (!await fs.pathExists(envPath)) {\n await fs.writeFile(envPath, templates.env);\n console.log(pc.green(`ā Created: .env.example`));\n }\n\n // Instructions\n console.log(pc.cyan('\\n⨠Framed setup complete!\\n'));\n console.log('Next steps:');\n console.log(pc.dim(' 1. Add FramedProvider to your root layout'));\n console.log(pc.dim(' 2. Copy .env.example to .env.local and fill in values'));\n console.log(pc.dim(' 3. Visit /framed to get started\\n'));\n\n console.log('Add to your layout.tsx:');\n console.log(pc.dim(templates.layoutSnippet));\n}\n\nfunction formatType(type: ProjectType): string {\n switch (type) {\n case 'next-app': return 'Next.js (App Router)';\n case 'next-pages': return 'Next.js (Pages Router)';\n case 'vite': return 'Vite';\n default: return 'Unknown';\n }\n}\n","import { Command } from 'commander';\nimport { init } from './init';\n\nconst program = new Command();\n\nprogram\n .name('framed')\n .description('CLI for setting up Framed in your project')\n .version('0.1.4');\n\nprogram\n .command('init')\n .description('Initialize Framed in your project')\n .option('--force', 'Overwrite existing files')\n .action(init);\n\nprogram.parse();\n"]}
|