@proappstore/cli 0.1.0 → 2.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/dist/create.d.ts +9 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +202 -0
- package/dist/create.js.map +1 -0
- package/dist/index.js +15 -11
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/create.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiGD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0GtF"}
|
package/dist/create.js
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { mkdirSync, writeFileSync, existsSync, cpSync } from 'node:fs';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
const PAS_API = 'https://api.proappstore.online';
|
|
5
|
+
const TEMPLATE_FILES = {
|
|
6
|
+
'package.json': `{
|
|
7
|
+
"name": "__APP_ID__",
|
|
8
|
+
"private": true,
|
|
9
|
+
"packageManager": "pnpm@10.30.3",
|
|
10
|
+
"engines": { "node": ">=22" },
|
|
11
|
+
"repository": { "type": "git", "url": "git+https://github.com/proappstore-online/__APP_ID__.git" },
|
|
12
|
+
"scripts": {
|
|
13
|
+
"dev": "pnpm --filter @__APP_ID__/web dev",
|
|
14
|
+
"build": "pnpm --filter @__APP_ID__/web build",
|
|
15
|
+
"preview": "pnpm --filter @__APP_ID__/web preview",
|
|
16
|
+
"typecheck": "pnpm --filter @__APP_ID__/web exec tsc -b",
|
|
17
|
+
"test": "pnpm --filter @__APP_ID__/web exec tsc -b"
|
|
18
|
+
}
|
|
19
|
+
}`,
|
|
20
|
+
'pnpm-workspace.yaml': `packages:\n - web`,
|
|
21
|
+
'tsconfig.json': `{ "references": [{ "path": "./web" }], "files": [] }`,
|
|
22
|
+
'LICENSE': `MIT License\n\nCopyright (c) ${new Date().getFullYear()} ProAppStore\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.`,
|
|
23
|
+
'CLAUDE.md': `# __APP_ID__\n\n__APP_DESCRIPTION__\n\n- Subdomain: \`__APP_ID__.proappstore.online\`\n- Dev: \`pnpm install && pnpm dev\`\n- Build: \`pnpm build\`\n- Deploy: \`git push origin main\` (auto-deploys via Cloudflare Pages)\n\nFor platform conventions, read\nhttps://proappstore.online/skills.md\nbefore writing or changing anything.`,
|
|
24
|
+
'.gitignore': `node_modules/\ndist/\n.DS_Store\n*.log\n.env\n.env.local`,
|
|
25
|
+
'web/package.json': `{
|
|
26
|
+
"name": "@__APP_ID__/web",
|
|
27
|
+
"private": true,
|
|
28
|
+
"version": "0.1.0",
|
|
29
|
+
"type": "module",
|
|
30
|
+
"scripts": {
|
|
31
|
+
"dev": "vite",
|
|
32
|
+
"build": "tsc -b && vite build",
|
|
33
|
+
"preview": "vite preview"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@proappstore/sdk": "^1.5.0",
|
|
37
|
+
"react": "^19.2.5",
|
|
38
|
+
"react-dom": "^19.2.5"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@tailwindcss/vite": "^4.2.4",
|
|
42
|
+
"@types/react": "^19.2.14",
|
|
43
|
+
"@types/react-dom": "^19.2.3",
|
|
44
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
45
|
+
"tailwindcss": "^4.2.4",
|
|
46
|
+
"typescript": "~6.0.2",
|
|
47
|
+
"vite": "^8.0.10"
|
|
48
|
+
}
|
|
49
|
+
}`,
|
|
50
|
+
'web/tsconfig.json': `{\n "files": [],\n "references": [\n { "path": "./tsconfig.app.json" },\n { "path": "./tsconfig.node.json" }\n ]\n}`,
|
|
51
|
+
'web/tsconfig.app.json': `{
|
|
52
|
+
"compilerOptions": {
|
|
53
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
|
54
|
+
"target": "es2023",
|
|
55
|
+
"lib": ["ES2023", "DOM", "DOM.Iterable"],
|
|
56
|
+
"module": "esnext",
|
|
57
|
+
"types": ["vite/client"],
|
|
58
|
+
"skipLibCheck": true,
|
|
59
|
+
"moduleResolution": "bundler",
|
|
60
|
+
"allowImportingTsExtensions": true,
|
|
61
|
+
"verbatimModuleSyntax": true,
|
|
62
|
+
"moduleDetection": "force",
|
|
63
|
+
"noEmit": true,
|
|
64
|
+
"jsx": "react-jsx",
|
|
65
|
+
"noUnusedLocals": true,
|
|
66
|
+
"noUnusedParameters": true,
|
|
67
|
+
"erasableSyntaxOnly": true,
|
|
68
|
+
"noFallthroughCasesInSwitch": true
|
|
69
|
+
},
|
|
70
|
+
"include": ["src"]
|
|
71
|
+
}`,
|
|
72
|
+
'web/tsconfig.node.json': `{
|
|
73
|
+
"compilerOptions": {
|
|
74
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
|
75
|
+
"target": "es2023",
|
|
76
|
+
"lib": ["ES2023"],
|
|
77
|
+
"module": "esnext",
|
|
78
|
+
"skipLibCheck": true,
|
|
79
|
+
"moduleResolution": "bundler",
|
|
80
|
+
"allowImportingTsExtensions": true,
|
|
81
|
+
"verbatimModuleSyntax": true,
|
|
82
|
+
"moduleDetection": "force",
|
|
83
|
+
"noEmit": true
|
|
84
|
+
},
|
|
85
|
+
"include": ["vite.config.ts"]
|
|
86
|
+
}`,
|
|
87
|
+
'web/vite.config.ts': `import { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\nimport tailwindcss from '@tailwindcss/vite'\n\nexport default defineConfig({\n plugins: [react(), tailwindcss()],\n server: { host: true },\n})`,
|
|
88
|
+
'web/index.html': `<!doctype html>\n<html lang="en">\n <head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, user-scalable=no" />\n <meta name="theme-color" content="#7c3aed" />\n <link rel="preconnect" href="https://fonts.googleapis.com" />\n <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />\n <link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,600;9..144,700&family=Manrope:wght@400;500;600;700;800&display=swap" rel="stylesheet" />\n <title>__APP_NAME__ — ProAppStore</title>\n </head>\n <body>\n <div id="root"></div>\n <script type="module" src="/src/main.tsx"></script>\n </body>\n</html>`,
|
|
89
|
+
'web/src/main.tsx': `import { StrictMode } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport './index.css'\nimport App from './App.tsx'\n\ncreateRoot(document.getElementById('root')!).render(\n <StrictMode>\n <App />\n </StrictMode>,\n)`,
|
|
90
|
+
'web/src/index.css': `@import "tailwindcss";\n\n@layer base {\n:root {\n color-scheme: light;\n --paper: #ffffff;\n --ink: #111111;\n --muted: #666666;\n --accent: #7c3aed;\n --accent-soft: #f5f3ff;\n --line: rgba(0,0,0,0.08);\n --glass: rgba(255,255,255,0.72);\n --glass-hover: rgba(255,255,255,0.85);\n --error: #c74f43;\n --success: #2f8f57;\n}\n\n:root[data-theme='dark'] {\n color-scheme: dark;\n --paper: #000000;\n --ink: #f0f0f0;\n --muted: #888888;\n --accent: #a78bfa;\n --accent-soft: #1e1533;\n --line: rgba(255,255,255,0.08);\n --glass: rgba(26,26,26,0.8);\n --glass-hover: rgba(38,38,38,0.9);\n --error: #ff7a72;\n --success: #74d49a;\n}\n\nhtml { min-height: 100%; }\nbody {\n min-height: 100dvh;\n background: var(--paper);\n color: var(--ink);\n font-family: 'Manrope', -apple-system, sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n#root { min-height: 100dvh; }\n.display-font { font-family: 'Fraunces', Georgia, serif; letter-spacing: -0.04em; }\n} /* end @layer base */`,
|
|
91
|
+
'web/src/App.tsx': `import { initPro } from '@proappstore/sdk'\nimport { useProGate } from '@proappstore/sdk/hooks'\n\nconst app = initPro({ appId: '__APP_ID__' })\n\nexport default function App() {\n const { gate, user, signIn, upgrade } = useProGate(app, { allowFree: true })\n\n if (gate === 'loading') {\n return (\n <div className="flex min-h-[100dvh] items-center justify-center">\n <p className="text-[var(--muted)]">Loading...</p>\n </div>\n )\n }\n\n if (gate === 'signed-out') {\n return (\n <div className="flex min-h-[100dvh] flex-col items-center justify-center gap-4 px-4">\n <h1 className="display-font text-3xl font-bold text-[var(--ink)]">__APP_NAME__</h1>\n <p className="text-[var(--muted)]">Sign in to get started.</p>\n <button onClick={signIn} className="rounded-2xl bg-[var(--accent)] px-6 py-2.5 text-sm font-semibold text-white">Sign in with GitHub</button>\n </div>\n )\n }\n\n return (\n <div className="mx-auto max-w-2xl px-4 py-8">\n <h1 className="display-font text-2xl font-bold text-[var(--ink)]">__APP_NAME__</h1>\n <p className="mt-2 text-[var(--muted)]">Welcome, {user?.login}! Edit web/src/App.tsx to start building.</p>\n </div>\n )\n}`,
|
|
92
|
+
};
|
|
93
|
+
function toTitleCase(id) {
|
|
94
|
+
return id.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
|
|
95
|
+
}
|
|
96
|
+
export async function createApp(appId, opts = {}) {
|
|
97
|
+
// Validate app ID
|
|
98
|
+
if (!/^[a-z][a-z0-9-]*$/.test(appId) || appId.length > 58) {
|
|
99
|
+
process.stderr.write(`Invalid app ID "${appId}". Use lowercase letters, numbers, hyphens. Max 58 chars.\n`);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
const targetDir = resolve(appId);
|
|
103
|
+
if (existsSync(targetDir)) {
|
|
104
|
+
process.stderr.write(`Directory "${appId}" already exists.\n`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
const appName = toTitleCase(appId);
|
|
108
|
+
process.stdout.write(`\n Creating ${appName}...\n\n`);
|
|
109
|
+
// Step 1: Scaffold
|
|
110
|
+
process.stdout.write(` [1/3] Scaffolding from template...\n`);
|
|
111
|
+
for (const [path, content] of Object.entries(TEMPLATE_FILES)) {
|
|
112
|
+
const fullPath = join(targetDir, path);
|
|
113
|
+
const dir = join(fullPath, '..');
|
|
114
|
+
mkdirSync(dir, { recursive: true });
|
|
115
|
+
const processed = content
|
|
116
|
+
.replace(/__APP_ID__/g, appId)
|
|
117
|
+
.replace(/__APP_NAME__/g, appName)
|
|
118
|
+
.replace(/__APP_DESCRIPTION__/g, `A pro app on ProAppStore.`);
|
|
119
|
+
writeFileSync(fullPath, processed);
|
|
120
|
+
}
|
|
121
|
+
// Step 2: Install
|
|
122
|
+
if (!opts.skipInstall) {
|
|
123
|
+
process.stdout.write(` [2/3] Installing dependencies...\n`);
|
|
124
|
+
try {
|
|
125
|
+
execSync('pnpm install', { cwd: targetDir, stdio: 'pipe' });
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
process.stdout.write(` [2/3] pnpm install failed. Run it manually.\n`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
process.stdout.write(` [2/3] Skipping install (--skip-install)\n`);
|
|
133
|
+
}
|
|
134
|
+
// Step 3: Init git
|
|
135
|
+
if (!opts.skipGit) {
|
|
136
|
+
process.stdout.write(` [3/3] Initializing git...\n`);
|
|
137
|
+
try {
|
|
138
|
+
execSync('git init && git add -A && git commit -m "Initial scaffold from pas create"', {
|
|
139
|
+
cwd: targetDir,
|
|
140
|
+
stdio: 'pipe',
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
process.stdout.write(` [3/3] Git init failed. Run it manually.\n`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
process.stdout.write(` [3/3] Skipping git init (--skip-git)\n`);
|
|
149
|
+
}
|
|
150
|
+
// Step 4: Provision platform resources (D1 + Data Worker)
|
|
151
|
+
if (!opts.skipProvision) {
|
|
152
|
+
const token = opts.token || process.env.FAS_SESSION_TOKEN;
|
|
153
|
+
if (token) {
|
|
154
|
+
process.stdout.write(` [4/4] Provisioning platform resources...\n`);
|
|
155
|
+
try {
|
|
156
|
+
const res = await fetch(`${PAS_API}/v1/provision`, {
|
|
157
|
+
method: 'POST',
|
|
158
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
|
|
159
|
+
body: JSON.stringify({ appId }),
|
|
160
|
+
});
|
|
161
|
+
const data = (await res.json());
|
|
162
|
+
for (const step of data.steps) {
|
|
163
|
+
const icon = step.status === 'ok' ? '+' : step.status === 'skip' ? '-' : '!';
|
|
164
|
+
process.stdout.write(` [${icon}] ${step.name}: ${step.detail}\n`);
|
|
165
|
+
}
|
|
166
|
+
// Write the Data Worker URL into the app's config
|
|
167
|
+
const dbStep = data.steps.find(s => s.name === 'create_d1' && s.status === 'ok');
|
|
168
|
+
if (dbStep) {
|
|
169
|
+
const configPath = join(targetDir, '.pas.json');
|
|
170
|
+
writeFileSync(configPath, JSON.stringify({
|
|
171
|
+
appId,
|
|
172
|
+
dataApiBase: `https://pas-data-${appId}.serge-the-dev.workers.dev`,
|
|
173
|
+
d1DatabaseId: dbStep.detail.match(/\(([^)]+)\)/)?.[1] || '',
|
|
174
|
+
}, null, 2));
|
|
175
|
+
process.stdout.write(` Config written to .pas.json\n`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
process.stdout.write(` Provisioning failed: ${e}. You can provision later.\n`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
process.stdout.write(` [4/4] Skipping provision (no auth token). Set FAS_SESSION_TOKEN or use --token.\n`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
process.stdout.write(` [4/4] Skipping provision (--skip-provision)\n`);
|
|
188
|
+
}
|
|
189
|
+
process.stdout.write(`
|
|
190
|
+
Done! Your app is ready.
|
|
191
|
+
|
|
192
|
+
Next steps:
|
|
193
|
+
cd ${appId}
|
|
194
|
+
pnpm dev
|
|
195
|
+
|
|
196
|
+
SDK docs: https://proappstore.online/skills.md
|
|
197
|
+
Console: https://console.proappstore.online
|
|
198
|
+
Dashboard: https://dashboard.proappstore.online
|
|
199
|
+
|
|
200
|
+
`);
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,30 +1,34 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
+
import { createApp } from './create.js';
|
|
3
4
|
const program = new Command();
|
|
4
5
|
program
|
|
5
6
|
.name('pas')
|
|
6
|
-
.description('ProAppStore CLI —
|
|
7
|
-
.version('
|
|
7
|
+
.description('ProAppStore CLI — create, develop, and publish pro apps.')
|
|
8
|
+
.version('1.0.0');
|
|
9
|
+
program
|
|
10
|
+
.command('create <app-id>')
|
|
11
|
+
.description('Scaffold + provision a new pro app. Creates D1 database and configures platform resources.')
|
|
12
|
+
.option('--skip-install', 'Skip pnpm install')
|
|
13
|
+
.option('--skip-git', 'Skip git init')
|
|
14
|
+
.option('--skip-provision', 'Skip D1 + platform provisioning')
|
|
15
|
+
.option('--token <token>', 'FAS session token (or set FAS_SESSION_TOKEN env var)')
|
|
16
|
+
.action(async (appId, opts) => {
|
|
17
|
+
await createApp(appId, opts);
|
|
18
|
+
});
|
|
8
19
|
program
|
|
9
20
|
.command('login')
|
|
10
21
|
.description('Sign in with GitHub (shared identity with `fas`).')
|
|
11
22
|
.action(() => {
|
|
12
|
-
process.stdout.write('pas login is not yet implemented
|
|
23
|
+
process.stdout.write('pas login is not yet implemented.\n' +
|
|
13
24
|
'For now: run `fas login` (from @freeappstore/cli) — pro shares the same identity.\n');
|
|
14
25
|
process.exit(2);
|
|
15
26
|
});
|
|
16
|
-
program
|
|
17
|
-
.command('init <app-id>')
|
|
18
|
-
.description('Scaffold a new pro app from a template.')
|
|
19
|
-
.action(() => {
|
|
20
|
-
process.stdout.write('pas init: not yet implemented (skeleton).\n');
|
|
21
|
-
process.exit(2);
|
|
22
|
-
});
|
|
23
27
|
program
|
|
24
28
|
.command('publish')
|
|
25
29
|
.description('Open the ProAppStore publisher portal for the current repo.')
|
|
26
30
|
.action(() => {
|
|
27
|
-
process.stdout.write('pas publish:
|
|
31
|
+
process.stdout.write('pas publish: coming soon.\n');
|
|
28
32
|
process.exit(2);
|
|
29
33
|
});
|
|
30
34
|
program.parseAsync().catch((err) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,4FAA4F,CAAC;KACzG,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;KAC7C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC;KACrC,MAAM,CAAC,kBAAkB,EAAE,iCAAiC,CAAC;KAC7D,MAAM,CAAC,iBAAiB,EAAE,sDAAsD,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAA2F,EAAE,EAAE;IAC3H,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCAAqC;QACnC,qFAAqF,CACxF,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC1C,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proappstore/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "pas — CLI for publishing paid apps to proappstore.online",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"pas": "./dist/index.js"
|
|
9
9
|
},
|
|
10
|
+
"repository": { "type": "git", "url": "git+https://github.com/proappstore-online/platform.git", "directory": "packages/cli" },
|
|
10
11
|
"files": ["dist", "README.md"],
|
|
11
12
|
"engines": {
|
|
12
13
|
"node": ">=22"
|