@puzzmo/cli 1.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/README.md +75 -0
- package/lib/commands/game/create.d.ts +2 -0
- package/lib/commands/game/create.js +145 -0
- package/lib/commands/game/create.js.map +1 -0
- package/lib/commands/login.d.ts +2 -0
- package/lib/commands/login.js +13 -0
- package/lib/commands/login.js.map +1 -0
- package/lib/commands/upload.d.ts +2 -0
- package/lib/commands/upload.js +87 -0
- package/lib/commands/upload.js.map +1 -0
- package/lib/download/page-downloader.d.ts +2 -0
- package/lib/download/page-downloader.js +94 -0
- package/lib/download/page-downloader.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +53 -0
- package/lib/index.js.map +1 -0
- package/lib/lib/api.d.ts +10 -0
- package/lib/lib/api.js +53 -0
- package/lib/lib/api.js.map +1 -0
- package/lib/lib/config.d.ts +13 -0
- package/lib/lib/config.js +29 -0
- package/lib/lib/config.js.map +1 -0
- package/lib/lib/exec.d.ts +15 -0
- package/lib/lib/exec.js +34 -0
- package/lib/lib/exec.js.map +1 -0
- package/lib/lib/package-manager.d.ts +2 -0
- package/lib/lib/package-manager.js +15 -0
- package/lib/lib/package-manager.js.map +1 -0
- package/lib/skills/registry.d.ts +13 -0
- package/lib/skills/registry.js +49 -0
- package/lib/skills/registry.js.map +1 -0
- package/lib/skills/runner.d.ts +4 -0
- package/lib/skills/runner.js +80 -0
- package/lib/skills/runner.js.map +1 -0
- package/lib/tui/pipeline.d.ts +2 -0
- package/lib/tui/pipeline.js +426 -0
- package/lib/tui/pipeline.js.map +1 -0
- package/lib/wizard/agent-detect.d.ts +4 -0
- package/lib/wizard/agent-detect.js +4 -0
- package/lib/wizard/agent-detect.js.map +1 -0
- package/package.json +20 -0
- package/src/commands/game/create.ts +171 -0
- package/src/commands/login.ts +15 -0
- package/src/commands/upload.ts +94 -0
- package/src/download/page-downloader.ts +104 -0
- package/src/index.ts +56 -0
- package/src/lib/api.ts +75 -0
- package/src/lib/config.ts +37 -0
- package/src/lib/exec.ts +38 -0
- package/src/skills/registry.ts +57 -0
- package/src/skills/runner.ts +91 -0
- package/src/tui/pipeline.ts +460 -0
- package/src/wizard/agent-detect.ts +6 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/tui/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-detect.js","sourceRoot":"","sources":["../../src/wizard/agent-detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,0BAA0B,CAAA;AAIjF,qDAAqD;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAuB,EAAE,CAAC,eAAe,EAAE,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@puzzmo/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"puzzmo": "./lib/index.js"
|
|
7
|
+
},
|
|
8
|
+
"main": "./lib/index.js",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"type-check": "tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@puzzmo/agent-cli-detect": "workspace:*"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@types/node": "^20.1.0",
|
|
18
|
+
"typescript": "catalog:"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import fs from "node:fs"
|
|
2
|
+
import path from "node:path"
|
|
3
|
+
|
|
4
|
+
import { detectAgent } from "../../wizard/agent-detect.js"
|
|
5
|
+
import { downloadPage } from "../../download/page-downloader.js"
|
|
6
|
+
import { runCommand, gitCommit } from "../../lib/exec.js"
|
|
7
|
+
import { runSkillsPipelineTUI } from "../../skills/runner.js"
|
|
8
|
+
import { installSkills } from "../../skills/registry.js"
|
|
9
|
+
import { login } from "../login.js"
|
|
10
|
+
|
|
11
|
+
type CreateOptions = {
|
|
12
|
+
name?: string
|
|
13
|
+
url?: string
|
|
14
|
+
agent?: string
|
|
15
|
+
accessToken?: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Parses CLI args into CreateOptions */
|
|
19
|
+
const parseArgs = (args: string[]): CreateOptions => {
|
|
20
|
+
const opts: CreateOptions = {}
|
|
21
|
+
let i = 0
|
|
22
|
+
|
|
23
|
+
// First positional arg could be access token
|
|
24
|
+
if (args[0] && !args[0].startsWith("--")) {
|
|
25
|
+
opts.accessToken = args[0]
|
|
26
|
+
i = 1
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
while (i < args.length) {
|
|
30
|
+
const arg = args[i]
|
|
31
|
+
if (arg === "--name" && args[i + 1]) {
|
|
32
|
+
opts.name = args[++i]
|
|
33
|
+
} else if (arg === "--url" && args[i + 1]) {
|
|
34
|
+
opts.url = args[++i]
|
|
35
|
+
} else if (arg === "--agent" && args[i + 1]) {
|
|
36
|
+
opts.agent = args[++i]
|
|
37
|
+
}
|
|
38
|
+
i++
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return opts
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Interactive text prompt (simple readline-based fallback) */
|
|
45
|
+
const askText = async (message: string, defaultValue?: string): Promise<string> => {
|
|
46
|
+
const { createInterface } = await import("node:readline")
|
|
47
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout })
|
|
48
|
+
const prompt = defaultValue ? `${message} (${defaultValue}): ` : `${message}: `
|
|
49
|
+
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
rl.question(prompt, (answer) => {
|
|
52
|
+
rl.close()
|
|
53
|
+
resolve(answer.trim() || defaultValue || "")
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Interactive select prompt */
|
|
59
|
+
const askSelect = async (message: string, options: { value: string; label: string; disabled?: boolean }[]): Promise<string> => {
|
|
60
|
+
console.log(`\n${message}`)
|
|
61
|
+
const enabled = options.filter((o) => !o.disabled)
|
|
62
|
+
options.forEach((opt) => {
|
|
63
|
+
const prefix = opt.disabled ? " " : ` ${enabled.indexOf(opt) + 1}.`
|
|
64
|
+
const suffix = opt.disabled ? " (Coming soon)" : ""
|
|
65
|
+
console.log(`${prefix} ${opt.label}${suffix}`)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
const { createInterface } = await import("node:readline")
|
|
69
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout })
|
|
70
|
+
|
|
71
|
+
return new Promise((resolve) => {
|
|
72
|
+
rl.question(`\nChoice (1-${enabled.length}): `, (answer) => {
|
|
73
|
+
rl.close()
|
|
74
|
+
const idx = parseInt(answer.trim(), 10) - 1
|
|
75
|
+
resolve(enabled[idx]?.value ?? enabled[0].value)
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Main game create wizard */
|
|
81
|
+
export const gameCreate = async (args: string[]) => {
|
|
82
|
+
const opts = parseArgs(args)
|
|
83
|
+
|
|
84
|
+
console.log("\n Puzzmo Game Creator\n")
|
|
85
|
+
|
|
86
|
+
// Step 1: Game name
|
|
87
|
+
const name = opts.name || (await askText("Game name"))
|
|
88
|
+
if (!name) {
|
|
89
|
+
console.error("Game name is required")
|
|
90
|
+
process.exit(1)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Step 2: Mode selection
|
|
94
|
+
const mode = await askSelect("How would you like to create your game?", [
|
|
95
|
+
{ value: "import", label: "Import an HTML game from a web page" },
|
|
96
|
+
{ value: "new-repo", label: "Create game in a new repo", disabled: true },
|
|
97
|
+
{ value: "add-to-repo", label: "Add a game to this repo", disabled: true },
|
|
98
|
+
])
|
|
99
|
+
|
|
100
|
+
if (mode !== "import") {
|
|
101
|
+
console.log("This mode is not yet supported.")
|
|
102
|
+
process.exit(0)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Step 3: Source URL
|
|
106
|
+
const url = opts.url || (await askText("Source URL to import"))
|
|
107
|
+
if (!url) {
|
|
108
|
+
console.error("Source URL is required for import mode")
|
|
109
|
+
process.exit(1)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Step 4: Download page
|
|
113
|
+
const gameDir = path.resolve(name)
|
|
114
|
+
console.log(`\nDownloading ${url} into ./${name}/...`)
|
|
115
|
+
await downloadPage(url, gameDir)
|
|
116
|
+
console.log("Download complete.")
|
|
117
|
+
|
|
118
|
+
// Step 5: Detect agents
|
|
119
|
+
const agents = detectAgent()
|
|
120
|
+
const agentChoices = [
|
|
121
|
+
...agents.map((a) => ({ value: a.binary, label: `${a.displayName} (${a.path})` })),
|
|
122
|
+
{ value: "none", label: "None - I'll run the skills manually" },
|
|
123
|
+
]
|
|
124
|
+
|
|
125
|
+
// Step 6: Ask about agent
|
|
126
|
+
let selectedAgent: string
|
|
127
|
+
if (opts.agent) {
|
|
128
|
+
selectedAgent = opts.agent
|
|
129
|
+
} else if (agents.length > 0) {
|
|
130
|
+
selectedAgent = await askSelect("Which LLM agent do you use?", agentChoices)
|
|
131
|
+
} else {
|
|
132
|
+
console.log("\nNo LLM agents detected (checked: claude, codex)")
|
|
133
|
+
selectedAgent = "none"
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Step 7: Login if token provided
|
|
137
|
+
if (opts.accessToken) {
|
|
138
|
+
console.log("\nLogging in...")
|
|
139
|
+
login(opts.accessToken)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Step 8: Install skills into the game directory
|
|
143
|
+
if (selectedAgent !== "none") {
|
|
144
|
+
console.log("\nInstalling Puzzmo skills...")
|
|
145
|
+
const count = installSkills(selectedAgent, gameDir)
|
|
146
|
+
console.log(`Installed ${count} skill(s).`)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Step 9: Initialize git
|
|
150
|
+
if (!fs.existsSync(path.join(gameDir, ".git"))) {
|
|
151
|
+
runCommand("git init", { cwd: gameDir })
|
|
152
|
+
runCommand("git add -A", { cwd: gameDir })
|
|
153
|
+
gitCommit("Initial game import", { cwd: gameDir })
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Step 10: Run skills pipeline
|
|
157
|
+
if (selectedAgent !== "none") {
|
|
158
|
+
console.log("\nStarting migration pipeline...\n")
|
|
159
|
+
await runSkillsPipelineTUI(selectedAgent, gameDir)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Done
|
|
163
|
+
console.log(`\nDone! Your game is in ./${name}/`)
|
|
164
|
+
console.log(`\nNext steps:`)
|
|
165
|
+
console.log(` cd ${name}`)
|
|
166
|
+
console.log(` npx vite # Start development server`)
|
|
167
|
+
console.log(` npx vite build # Build for production`)
|
|
168
|
+
if (selectedAgent === "none") {
|
|
169
|
+
console.log(`\nTo run migration skills manually, see packages/skills/ for SKILL.md files.`)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { writeConfig, readConfig } from "../lib/config.js"
|
|
2
|
+
|
|
3
|
+
/** Saves a CLI token to ~/.puzzmo/config.json */
|
|
4
|
+
export const login = (token: string) => {
|
|
5
|
+
if (!token.startsWith("pzt-")) {
|
|
6
|
+
console.error("Invalid CLI token. Generate one from studio.puzzmo.com.")
|
|
7
|
+
process.exit(1)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const config = readConfig()
|
|
11
|
+
config.token = token
|
|
12
|
+
writeConfig(config)
|
|
13
|
+
|
|
14
|
+
console.log("Logged in successfully. Token saved to ~/.puzzmo/config.json")
|
|
15
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { execSync } from "node:child_process"
|
|
2
|
+
import crypto from "node:crypto"
|
|
3
|
+
import fs from "node:fs"
|
|
4
|
+
import path from "node:path"
|
|
5
|
+
|
|
6
|
+
import { uploadFiles } from "../lib/api.js"
|
|
7
|
+
import { getAPIURL, getToken } from "../lib/config.js"
|
|
8
|
+
|
|
9
|
+
/** Collects all files in a directory recursively */
|
|
10
|
+
const collectFiles = (dir: string): string[] => {
|
|
11
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true })
|
|
12
|
+
const files: string[] = []
|
|
13
|
+
for (const entry of entries) {
|
|
14
|
+
const full = path.join(dir, entry.name)
|
|
15
|
+
if (entry.isDirectory()) files.push(...collectFiles(full))
|
|
16
|
+
else files.push(full)
|
|
17
|
+
}
|
|
18
|
+
return files
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Tries to get the current git SHA, returns null if not in a git repo */
|
|
22
|
+
const getGitSHA = (): string | null => {
|
|
23
|
+
try {
|
|
24
|
+
return execSync("git rev-parse HEAD", { encoding: "utf-8" }).trim()
|
|
25
|
+
} catch {
|
|
26
|
+
return null
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Hashes all file contents to produce a deterministic SHA */
|
|
31
|
+
const hashFiles = (filePaths: string[]): string => {
|
|
32
|
+
const hash = crypto.createHash("sha256")
|
|
33
|
+
for (const fp of filePaths.sort()) {
|
|
34
|
+
hash.update(fs.readFileSync(fp))
|
|
35
|
+
}
|
|
36
|
+
return hash.digest("hex").slice(0, 12)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Formats a byte count as a human-readable string */
|
|
40
|
+
const formatBytes = (bytes: number): string => {
|
|
41
|
+
if (bytes < 1024) return `${bytes} B`
|
|
42
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`
|
|
43
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Uploads game build artifacts to Puzzmo */
|
|
47
|
+
export const upload = async (gameSlug: string, dir: string) => {
|
|
48
|
+
const token = getToken()
|
|
49
|
+
if (!token) {
|
|
50
|
+
console.error("Not logged in. Run `puzzmo login <token>` or set PUZZMO_TOKEN.")
|
|
51
|
+
process.exit(1)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const distDir = path.resolve(dir)
|
|
55
|
+
if (!fs.existsSync(distDir)) {
|
|
56
|
+
console.error(`Directory not found: ${dir}`)
|
|
57
|
+
process.exit(1)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const files = collectFiles(distDir)
|
|
61
|
+
if (!files.length) {
|
|
62
|
+
console.error(`Directory is empty: ${dir}`)
|
|
63
|
+
process.exit(1)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Determine SHA
|
|
67
|
+
const sha = getGitSHA() || hashFiles(files)
|
|
68
|
+
|
|
69
|
+
console.log(`\nUploading ${gameSlug} (${sha.slice(0, 8)})`)
|
|
70
|
+
console.log(`Directory: ${distDir}`)
|
|
71
|
+
console.log("")
|
|
72
|
+
|
|
73
|
+
let totalBytes = 0
|
|
74
|
+
for (const file of files) {
|
|
75
|
+
const size = fs.statSync(file).size
|
|
76
|
+
totalBytes += size
|
|
77
|
+
const rel = path.relative(distDir, file)
|
|
78
|
+
console.log(` ${rel} (${formatBytes(size)})`)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const apiURL = getAPIURL()
|
|
82
|
+
const defaultURL = "https://api.puzzmo.com"
|
|
83
|
+
|
|
84
|
+
console.log(`\n${files.length} file(s), ${formatBytes(totalBytes)} total`)
|
|
85
|
+
if (apiURL !== defaultURL) console.log(`Uploading to ${apiURL}...`)
|
|
86
|
+
else console.log("Uploading...")
|
|
87
|
+
|
|
88
|
+
const result = await uploadFiles(token, gameSlug, sha, files, distDir, (batch, totalBatches, uploaded) => {
|
|
89
|
+
console.log(` Batch ${batch}/${totalBatches} done (${uploaded} file(s) uploaded)`)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
console.log(`\nDone - ${result.versionID}`)
|
|
93
|
+
console.log(`CDN: ${result.cdnBase}`)
|
|
94
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import fs from "node:fs"
|
|
2
|
+
import path from "node:path"
|
|
3
|
+
import https from "node:https"
|
|
4
|
+
import http from "node:http"
|
|
5
|
+
|
|
6
|
+
/** Fetch that tolerates expired/self-signed SSL certificates */
|
|
7
|
+
const fetchPage = async (url: string): Promise<{ ok: boolean; status: number; text: () => Promise<string>; arrayBuffer: () => Promise<ArrayBuffer> }> => {
|
|
8
|
+
const parsed = new URL(url)
|
|
9
|
+
const isHttps = parsed.protocol === "https:"
|
|
10
|
+
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const mod = isHttps ? https : http
|
|
13
|
+
const opts = isHttps ? { rejectUnauthorized: false } : {}
|
|
14
|
+
|
|
15
|
+
const req = mod.get(url, opts, (res) => {
|
|
16
|
+
const chunks: Uint8Array[] = []
|
|
17
|
+
res.on("data", (chunk: Uint8Array) => chunks.push(chunk))
|
|
18
|
+
res.on("end", () => {
|
|
19
|
+
const buffer = Buffer.concat(chunks)
|
|
20
|
+
const ab = new ArrayBuffer(buffer.byteLength)
|
|
21
|
+
const view = new Uint8Array(ab)
|
|
22
|
+
view.set(buffer)
|
|
23
|
+
resolve({
|
|
24
|
+
ok: (res.statusCode ?? 0) >= 200 && (res.statusCode ?? 0) < 300,
|
|
25
|
+
status: res.statusCode ?? 0,
|
|
26
|
+
text: async () => buffer.toString("utf-8"),
|
|
27
|
+
arrayBuffer: async () => ab,
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
req.on("error", reject)
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Downloads an HTML page and its referenced assets into a src/ directory */
|
|
36
|
+
export const downloadPage = async (url: string, outputDir: string) => {
|
|
37
|
+
const srcDir = path.join(outputDir, "src")
|
|
38
|
+
fs.mkdirSync(srcDir, { recursive: true })
|
|
39
|
+
|
|
40
|
+
// Download the HTML
|
|
41
|
+
const response = await fetchPage(url)
|
|
42
|
+
if (!response.ok) throw new Error(`Failed to fetch ${url}: ${response.status}`)
|
|
43
|
+
let html = await response.text()
|
|
44
|
+
|
|
45
|
+
const baseURL = new URL(url)
|
|
46
|
+
const downloaded = new Set<string>()
|
|
47
|
+
|
|
48
|
+
// Find referenced assets (src, href, url())
|
|
49
|
+
const assetRefs = extractAssetRefs(html)
|
|
50
|
+
|
|
51
|
+
for (const ref of assetRefs) {
|
|
52
|
+
if (downloaded.has(ref)) continue
|
|
53
|
+
if (ref.startsWith("data:") || ref.startsWith("#") || ref.startsWith("javascript:")) continue
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
const assetURL = new URL(ref, baseURL)
|
|
57
|
+
// Only download same-origin assets
|
|
58
|
+
if (assetURL.origin !== baseURL.origin) continue
|
|
59
|
+
|
|
60
|
+
const assetPath = assetURL.pathname.replace(/^\//, "")
|
|
61
|
+
if (!assetPath) continue
|
|
62
|
+
const localPath = path.join(srcDir, assetPath)
|
|
63
|
+
|
|
64
|
+
fs.mkdirSync(path.dirname(localPath), { recursive: true })
|
|
65
|
+
|
|
66
|
+
const assetResponse = await fetchPage(assetURL.href)
|
|
67
|
+
if (!assetResponse.ok) continue
|
|
68
|
+
|
|
69
|
+
const ab = await assetResponse.arrayBuffer()
|
|
70
|
+
fs.writeFileSync(localPath, new Uint8Array(ab))
|
|
71
|
+
|
|
72
|
+
// Rewrite reference in HTML to local path
|
|
73
|
+
html = html.replaceAll(ref, assetPath)
|
|
74
|
+
downloaded.add(ref)
|
|
75
|
+
} catch {
|
|
76
|
+
// Skip assets that fail to download
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Write the HTML file
|
|
81
|
+
fs.writeFileSync(path.join(srcDir, "index.html"), html)
|
|
82
|
+
|
|
83
|
+
console.log(` Saved index.html + ${downloaded.size} asset(s) to ${path.relative(process.cwd(), srcDir)}/`)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Extracts asset references from HTML using regex */
|
|
87
|
+
const extractAssetRefs = (html: string): string[] => {
|
|
88
|
+
const refs: string[] = []
|
|
89
|
+
|
|
90
|
+
// src="..." and href="..."
|
|
91
|
+
const attrRegex = /(?:src|href)=["']([^"']+)["']/gi
|
|
92
|
+
let match
|
|
93
|
+
while ((match = attrRegex.exec(html)) !== null) {
|
|
94
|
+
if (match[1]) refs.push(match[1])
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// url("...") in CSS
|
|
98
|
+
const urlRegex = /url\(["']?([^"')]+)["']?\)/gi
|
|
99
|
+
while ((match = urlRegex.exec(html)) !== null) {
|
|
100
|
+
if (match[1]) refs.push(match[1])
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return [...new Set(refs)]
|
|
104
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { login } from "./commands/login.js"
|
|
4
|
+
import { upload } from "./commands/upload.js"
|
|
5
|
+
import { gameCreate } from "./commands/game/create.js"
|
|
6
|
+
|
|
7
|
+
const [command, ...args] = process.argv.slice(2)
|
|
8
|
+
|
|
9
|
+
const printUsage = () => {
|
|
10
|
+
console.log(`Usage:
|
|
11
|
+
puzzmo login <token> Save a CLI auth token
|
|
12
|
+
puzzmo upload <slug> <dir> Upload game build from <dir>
|
|
13
|
+
puzzmo game create [token] Create a new Puzzmo game project`)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const run = async () => {
|
|
17
|
+
switch (command) {
|
|
18
|
+
case "login": {
|
|
19
|
+
const token = args[0]
|
|
20
|
+
if (!token) {
|
|
21
|
+
console.error("Usage: puzzmo login <token>")
|
|
22
|
+
process.exit(1)
|
|
23
|
+
}
|
|
24
|
+
login(token)
|
|
25
|
+
break
|
|
26
|
+
}
|
|
27
|
+
case "upload": {
|
|
28
|
+
const gameSlug = args[0]
|
|
29
|
+
const dir = args[1]
|
|
30
|
+
if (!gameSlug || !dir) {
|
|
31
|
+
console.error("Usage: puzzmo upload <gameSlug> <dir>")
|
|
32
|
+
process.exit(1)
|
|
33
|
+
}
|
|
34
|
+
await upload(gameSlug, dir)
|
|
35
|
+
break
|
|
36
|
+
}
|
|
37
|
+
case "game": {
|
|
38
|
+
const [subcommand, ...subArgs] = args
|
|
39
|
+
if (subcommand === "create") {
|
|
40
|
+
await gameCreate(subArgs)
|
|
41
|
+
} else {
|
|
42
|
+
console.error("Usage: puzzmo game create [token] [--name <name>] [--url <url>] [--agent <agent>]")
|
|
43
|
+
process.exit(1)
|
|
44
|
+
}
|
|
45
|
+
break
|
|
46
|
+
}
|
|
47
|
+
default:
|
|
48
|
+
printUsage()
|
|
49
|
+
break
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
run().catch((err) => {
|
|
54
|
+
console.error(err.message || err)
|
|
55
|
+
process.exit(1)
|
|
56
|
+
})
|
package/src/lib/api.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import fs from "node:fs"
|
|
2
|
+
import path from "node:path"
|
|
3
|
+
|
|
4
|
+
import { getAPIURL } from "./config.js"
|
|
5
|
+
|
|
6
|
+
const BATCH_SIZE = 10
|
|
7
|
+
|
|
8
|
+
type InitResponse = { sessionID: string; basePath: string; error?: string }
|
|
9
|
+
type FileResponse = { path: string; error?: string }
|
|
10
|
+
type CompleteResponse = { cdnBase: string; versionID: string; error?: string }
|
|
11
|
+
|
|
12
|
+
/** Callback for reporting batch upload progress */
|
|
13
|
+
export type UploadProgress = (batch: number, totalBatches: number, uploaded: number) => void
|
|
14
|
+
|
|
15
|
+
/** Sends a JSON POST request */
|
|
16
|
+
const jsonPost = async (url: string, token: string, body: object) => {
|
|
17
|
+
const res = await fetch(url, {
|
|
18
|
+
method: "POST",
|
|
19
|
+
headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
|
|
20
|
+
body: JSON.stringify(body),
|
|
21
|
+
})
|
|
22
|
+
const json = await res.json()
|
|
23
|
+
if (!res.ok) throw new Error(`Server error (${res.status}): ${(json as any).error || "Unknown error"}`)
|
|
24
|
+
return json
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Uploads a single file as raw binary with filename in query param */
|
|
28
|
+
const uploadFile = async (url: string, token: string, filePath: string, baseDir: string): Promise<FileResponse> => {
|
|
29
|
+
const relativePath = path.relative(baseDir, filePath)
|
|
30
|
+
const content = fs.readFileSync(filePath)
|
|
31
|
+
|
|
32
|
+
const res = await fetch(`${url}?name=${encodeURIComponent(relativePath)}`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Bearer ${token}`,
|
|
36
|
+
"Content-Type": "application/octet-stream",
|
|
37
|
+
},
|
|
38
|
+
body: content,
|
|
39
|
+
})
|
|
40
|
+
const json = await res.json()
|
|
41
|
+
if (!res.ok) throw new Error(`Server error (${res.status}): ${(json as any).error || "Unknown error"}`)
|
|
42
|
+
return json as FileResponse
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Multi-step upload: init -> batched file uploads -> complete */
|
|
46
|
+
export const uploadFiles = async (
|
|
47
|
+
token: string,
|
|
48
|
+
gameSlug: string,
|
|
49
|
+
sha: string,
|
|
50
|
+
filePaths: string[],
|
|
51
|
+
baseDir: string,
|
|
52
|
+
onProgress?: UploadProgress,
|
|
53
|
+
): Promise<CompleteResponse> => {
|
|
54
|
+
const apiURL = getAPIURL()
|
|
55
|
+
|
|
56
|
+
// Step 1: Init session
|
|
57
|
+
const init = (await jsonPost(`${apiURL}/cliUpload`, token, { gameSlug, sha })) as InitResponse
|
|
58
|
+
|
|
59
|
+
// Step 2: Upload files in concurrent batches
|
|
60
|
+
const fileURL = `${apiURL}/cliUpload/${init.sessionID}/file`
|
|
61
|
+
const totalBatches = Math.ceil(filePaths.length / BATCH_SIZE)
|
|
62
|
+
let totalUploaded = 0
|
|
63
|
+
|
|
64
|
+
for (let i = 0; i < filePaths.length; i += BATCH_SIZE) {
|
|
65
|
+
const batch = filePaths.slice(i, i + BATCH_SIZE)
|
|
66
|
+
const batchNum = Math.floor(i / BATCH_SIZE) + 1
|
|
67
|
+
await Promise.all(batch.map((fp) => uploadFile(fileURL, token, fp, baseDir)))
|
|
68
|
+
totalUploaded += batch.length
|
|
69
|
+
onProgress?.(batchNum, totalBatches, totalUploaded)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Step 3: Complete
|
|
73
|
+
return (await jsonPost(`${apiURL}/cliUpload/${init.sessionID}/complete`, token, {})) as CompleteResponse
|
|
74
|
+
}
|
|
75
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import fs from "node:fs"
|
|
2
|
+
import os from "node:os"
|
|
3
|
+
import path from "node:path"
|
|
4
|
+
|
|
5
|
+
const configDir = path.join(os.homedir(), ".puzzmo")
|
|
6
|
+
const configPath = path.join(configDir, "config.json")
|
|
7
|
+
|
|
8
|
+
type Config = {
|
|
9
|
+
token?: string
|
|
10
|
+
apiURL?: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Reads the CLI config from ~/.puzzmo/config.json */
|
|
14
|
+
export const readConfig = (): Config => {
|
|
15
|
+
try {
|
|
16
|
+
const raw = fs.readFileSync(configPath, "utf-8")
|
|
17
|
+
return JSON.parse(raw)
|
|
18
|
+
} catch {
|
|
19
|
+
return {}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Writes the CLI config to ~/.puzzmo/config.json */
|
|
24
|
+
export const writeConfig = (config: Config) => {
|
|
25
|
+
fs.mkdirSync(configDir, { recursive: true })
|
|
26
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n")
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Returns the auth token from config or PUZZMO_TOKEN env var */
|
|
30
|
+
export const getToken = (): string | undefined => {
|
|
31
|
+
return process.env.PUZZMO_TOKEN || readConfig().token
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Returns the API base URL */
|
|
35
|
+
export const getAPIURL = (): string => {
|
|
36
|
+
return process.env.PUZZMO_API_URL || readConfig().apiURL || "https://api.puzzmo.com"
|
|
37
|
+
}
|
package/src/lib/exec.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { execSync } from "node:child_process"
|
|
2
|
+
|
|
3
|
+
type ExecOptions = { cwd?: string }
|
|
4
|
+
|
|
5
|
+
/** Runs a shell command, printing output */
|
|
6
|
+
export const runCommand = (cmd: string, opts: ExecOptions = {}) => {
|
|
7
|
+
execSync(cmd, {
|
|
8
|
+
cwd: opts.cwd,
|
|
9
|
+
stdio: "inherit",
|
|
10
|
+
encoding: "utf-8",
|
|
11
|
+
})
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Runs a command and returns stdout */
|
|
15
|
+
export const runCommandOutput = (cmd: string, opts: ExecOptions = {}): string => {
|
|
16
|
+
return execSync(cmd, {
|
|
17
|
+
cwd: opts.cwd,
|
|
18
|
+
encoding: "utf-8",
|
|
19
|
+
}).trim()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Creates a git commit */
|
|
23
|
+
export const gitCommit = (message: string, opts: ExecOptions = {}) => {
|
|
24
|
+
execSync(`git commit -m "${message}"`, {
|
|
25
|
+
cwd: opts.cwd,
|
|
26
|
+
stdio: "inherit",
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Runs vite build and returns success/failure */
|
|
31
|
+
export const verifyBuild = (cwd: string): { success: boolean; error?: string } => {
|
|
32
|
+
try {
|
|
33
|
+
execSync("npx vite build", { cwd, encoding: "utf-8", stdio: "pipe" })
|
|
34
|
+
return { success: true }
|
|
35
|
+
} catch (e: any) {
|
|
36
|
+
return { success: false, error: e.stderr || e.stdout || e.message }
|
|
37
|
+
}
|
|
38
|
+
}
|