@puzzmo/cli 1.0.14 → 1.0.15
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/lib/commands/game/create.js +29 -27
- package/lib/commands/game/create.js.map +1 -1
- package/lib/commands/login.js +3 -2
- package/lib/commands/login.js.map +1 -1
- package/lib/skills/runner.js +5 -6
- package/lib/skills/runner.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/game/create.ts +33 -31
- package/src/commands/login.ts +4 -2
- package/src/skills/runner.ts +5 -6
|
@@ -5,9 +5,9 @@ import * as p from "@clack/prompts";
|
|
|
5
5
|
import { detectAgent } from "../../wizard/agent-detect.js";
|
|
6
6
|
import { downloadPage } from "../../download/page-downloader.js";
|
|
7
7
|
import { runCommand, gitCommit } from "../../util/exec.js";
|
|
8
|
-
import {
|
|
9
|
-
import { installSkills } from "../../skills/registry.js";
|
|
8
|
+
import { runSkillsPipeline } from "../../skills/runner.js";
|
|
10
9
|
import { login } from "../login.js";
|
|
10
|
+
import { getToken } from "../../util/config.js";
|
|
11
11
|
/** Parses CLI args into CreateOptions */
|
|
12
12
|
const parseArgs = (args) => {
|
|
13
13
|
const opts = {};
|
|
@@ -89,13 +89,36 @@ export const gameCreate = async (args) => {
|
|
|
89
89
|
if (fs.existsSync(gameDir))
|
|
90
90
|
fs.rmSync(gameDir, { recursive: true });
|
|
91
91
|
fs.renameSync(tmpDir, gameDir);
|
|
92
|
-
// Step 6:
|
|
92
|
+
// Step 6: Login if token provided
|
|
93
|
+
if (opts.accessToken) {
|
|
94
|
+
p.log.step("Logging in...");
|
|
95
|
+
login(opts.accessToken);
|
|
96
|
+
}
|
|
97
|
+
// Step 7: Write .mcp.json with dev server config
|
|
98
|
+
const token = getToken();
|
|
99
|
+
const mcpConfig = {
|
|
100
|
+
mcpServers: {
|
|
101
|
+
"dev.puzzmo.com": {
|
|
102
|
+
type: "http",
|
|
103
|
+
// url: "https://dev.puzzmo.com/api/mcp",
|
|
104
|
+
url: "https://dev-dj9e.onrender.com/api/mcp",
|
|
105
|
+
headers: token ? { Authorization: `Bearer ${token}` } : undefined,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
fs.writeFileSync(path.join(gameDir, ".mcp.json"), JSON.stringify(mcpConfig, null, 2) + "\n");
|
|
110
|
+
// Step 8: Initialize git
|
|
111
|
+
if (!fs.existsSync(path.join(gameDir, ".git"))) {
|
|
112
|
+
runCommand("git init", { cwd: gameDir });
|
|
113
|
+
runCommand("git add -A", { cwd: gameDir });
|
|
114
|
+
gitCommit("Initial game import", { cwd: gameDir });
|
|
115
|
+
}
|
|
116
|
+
// Step 9: Detect agent and run skills pipeline
|
|
93
117
|
const agents = detectAgent();
|
|
94
118
|
const agentChoices = [
|
|
95
119
|
...agents.map((a) => ({ value: a.binary, label: `${a.displayName} (${a.path})` })),
|
|
96
120
|
{ value: "none", label: "None - I'll run the skills manually" },
|
|
97
121
|
];
|
|
98
|
-
// Step 7: Ask about agent
|
|
99
122
|
let selectedAgent;
|
|
100
123
|
if (opts.agent) {
|
|
101
124
|
selectedAgent = opts.agent;
|
|
@@ -109,35 +132,14 @@ export const gameCreate = async (args) => {
|
|
|
109
132
|
p.log.info("No LLM agents detected (checked: claude, codex)");
|
|
110
133
|
selectedAgent = "none";
|
|
111
134
|
}
|
|
112
|
-
// Step 8: Login if token provided
|
|
113
|
-
if (opts.accessToken) {
|
|
114
|
-
p.log.step("Logging in...");
|
|
115
|
-
login(opts.accessToken);
|
|
116
|
-
}
|
|
117
|
-
// Step 9: Install skills into the game directory
|
|
118
|
-
if (selectedAgent !== "none") {
|
|
119
|
-
p.log.step("Installing Puzzmo skills...");
|
|
120
|
-
const count = installSkills(selectedAgent, gameDir);
|
|
121
|
-
p.log.success(`Installed ${count} skill(s).`);
|
|
122
|
-
}
|
|
123
|
-
// Step 10: Initialize git
|
|
124
|
-
if (!fs.existsSync(path.join(gameDir, ".git"))) {
|
|
125
|
-
runCommand("git init", { cwd: gameDir });
|
|
126
|
-
runCommand("git add -A", { cwd: gameDir });
|
|
127
|
-
gitCommit("Initial game import", { cwd: gameDir });
|
|
128
|
-
}
|
|
129
|
-
// Step 11: Run skills pipeline
|
|
130
135
|
if (selectedAgent !== "none") {
|
|
131
|
-
p.log.step("
|
|
132
|
-
await
|
|
136
|
+
p.log.step("Running Puzzmo skills pipeline...");
|
|
137
|
+
await runSkillsPipeline(selectedAgent, gameDir);
|
|
133
138
|
}
|
|
134
139
|
// Done
|
|
135
140
|
const pm = opts.pm || "npm";
|
|
136
141
|
const runCmd = pm === "npm" ? "npx" : pm === "yarn" ? "yarn dlx" : "pnpm dlx";
|
|
137
142
|
p.note([`cd ${slug}`, `${runCmd} vite # Start development server`, `${runCmd} vite build # Build for production`].join("\n"), "Next steps");
|
|
138
|
-
if (selectedAgent === "none") {
|
|
139
|
-
p.log.info("To run migration skills manually, see packages/skills/ for SKILL.md files.");
|
|
140
|
-
}
|
|
141
143
|
p.outro(`Done! Your game is in ./${slug}/`);
|
|
142
144
|
};
|
|
143
145
|
//# sourceMappingURL=create.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/game/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/game/create.ts"],"names":[],"mappings":"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"}
|
package/lib/commands/login.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
1
2
|
import { writeConfig, readConfig } from "../util/config.js";
|
|
2
3
|
/** Saves a CLI token to ~/.puzzmo/config.json */
|
|
3
4
|
export const login = (token) => {
|
|
4
5
|
if (!token.startsWith("pzt-")) {
|
|
5
|
-
|
|
6
|
+
p.log.error("Invalid CLI token. Generate one from dev.puzzmo.com.");
|
|
6
7
|
process.exit(1);
|
|
7
8
|
}
|
|
8
9
|
const config = readConfig();
|
|
9
10
|
config.token = token;
|
|
10
11
|
writeConfig(config);
|
|
11
|
-
|
|
12
|
+
p.log.success("Logged in successfully. Token saved to ~/.puzzmo/config.json");
|
|
12
13
|
};
|
|
13
14
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE3D,iDAAiD;AACjD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE;IACrC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE3D,iDAAiD;AACjD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE;IACrC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,WAAW,CAAC,MAAM,CAAC,CAAA;IAEnB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAA;AAC/E,CAAC,CAAA"}
|
package/lib/skills/runner.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
|
-
import { skillsPipeline
|
|
2
|
+
import { skillsPipeline } from "./registry.js";
|
|
3
3
|
import { verifyBuild, runCommand, gitCommit } from "../util/exec.js";
|
|
4
|
-
/** Builds the agent prompt for a given skill */
|
|
5
|
-
const buildPrompt = (skillName
|
|
6
|
-
|
|
7
|
-
return `Run the skill ${skillName}. Follow the instructions in ${skillDir}/${skillName}/SKILL.md. The game source is in the current directory.`;
|
|
4
|
+
/** Builds the agent prompt for a given skill, referencing the MCP prompt */
|
|
5
|
+
const buildPrompt = (skillName) => {
|
|
6
|
+
return `Use the MCP prompt "${skillName}" from the dev.puzzmo.com server and follow its instructions. The game source is in the current directory.`;
|
|
8
7
|
};
|
|
9
8
|
/** Invokes an LLM agent with a prompt (plain mode, stdio inherited) */
|
|
10
9
|
const invokeAgent = (agent, prompt, cwd) => {
|
|
@@ -30,7 +29,7 @@ export const runSkillsPipeline = async (agent, gameDir) => {
|
|
|
30
29
|
const skill = skillsPipeline[i];
|
|
31
30
|
const step = i + 1;
|
|
32
31
|
console.log(`[${step}/${total}] Running skill: ${skill.name}${skill.optional ? " (optional)" : ""}`);
|
|
33
|
-
const prompt = buildPrompt(skill.name
|
|
32
|
+
const prompt = buildPrompt(skill.name);
|
|
34
33
|
let result = invokeAgent(agent, prompt, gameDir);
|
|
35
34
|
if (!result.success) {
|
|
36
35
|
if (skill.optional) {
|
package/lib/skills/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/skills/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9C,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/skills/runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,9 +6,9 @@ import * as p from "@clack/prompts"
|
|
|
6
6
|
import { detectAgent } from "../../wizard/agent-detect.js"
|
|
7
7
|
import { downloadPage } from "../../download/page-downloader.js"
|
|
8
8
|
import { runCommand, gitCommit } from "../../util/exec.js"
|
|
9
|
-
import {
|
|
10
|
-
import { installSkills } from "../../skills/registry.js"
|
|
9
|
+
import { runSkillsPipeline } from "../../skills/runner.js"
|
|
11
10
|
import { login } from "../login.js"
|
|
11
|
+
import { getToken } from "../../util/config.js"
|
|
12
12
|
|
|
13
13
|
type CreateOptions = {
|
|
14
14
|
name?: string
|
|
@@ -104,14 +104,41 @@ export const gameCreate = async (args: string[]) => {
|
|
|
104
104
|
if (fs.existsSync(gameDir)) fs.rmSync(gameDir, { recursive: true })
|
|
105
105
|
fs.renameSync(tmpDir, gameDir)
|
|
106
106
|
|
|
107
|
-
// Step 6:
|
|
107
|
+
// Step 6: Login if token provided
|
|
108
|
+
if (opts.accessToken) {
|
|
109
|
+
p.log.step("Logging in...")
|
|
110
|
+
login(opts.accessToken)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Step 7: Write .mcp.json with dev server config
|
|
114
|
+
const token = getToken()
|
|
115
|
+
const mcpConfig = {
|
|
116
|
+
mcpServers: {
|
|
117
|
+
"dev.puzzmo.com": {
|
|
118
|
+
type: "http",
|
|
119
|
+
// url: "https://dev.puzzmo.com/api/mcp",
|
|
120
|
+
url: "https://dev-dj9e.onrender.com/api/mcp",
|
|
121
|
+
headers: token ? { Authorization: `Bearer ${token}` } : undefined,
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
fs.writeFileSync(path.join(gameDir, ".mcp.json"), JSON.stringify(mcpConfig, null, 2) + "\n")
|
|
127
|
+
|
|
128
|
+
// Step 8: Initialize git
|
|
129
|
+
if (!fs.existsSync(path.join(gameDir, ".git"))) {
|
|
130
|
+
runCommand("git init", { cwd: gameDir })
|
|
131
|
+
runCommand("git add -A", { cwd: gameDir })
|
|
132
|
+
gitCommit("Initial game import", { cwd: gameDir })
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Step 9: Detect agent and run skills pipeline
|
|
108
136
|
const agents = detectAgent()
|
|
109
137
|
const agentChoices = [
|
|
110
138
|
...agents.map((a) => ({ value: a.binary, label: `${a.displayName} (${a.path})` })),
|
|
111
139
|
{ value: "none", label: "None - I'll run the skills manually" },
|
|
112
140
|
]
|
|
113
141
|
|
|
114
|
-
// Step 7: Ask about agent
|
|
115
142
|
let selectedAgent: string
|
|
116
143
|
if (opts.agent) {
|
|
117
144
|
selectedAgent = opts.agent
|
|
@@ -123,30 +150,9 @@ export const gameCreate = async (args: string[]) => {
|
|
|
123
150
|
selectedAgent = "none"
|
|
124
151
|
}
|
|
125
152
|
|
|
126
|
-
// Step 8: Login if token provided
|
|
127
|
-
if (opts.accessToken) {
|
|
128
|
-
p.log.step("Logging in...")
|
|
129
|
-
login(opts.accessToken)
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Step 9: Install skills into the game directory
|
|
133
153
|
if (selectedAgent !== "none") {
|
|
134
|
-
p.log.step("
|
|
135
|
-
|
|
136
|
-
p.log.success(`Installed ${count} skill(s).`)
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Step 10: Initialize git
|
|
140
|
-
if (!fs.existsSync(path.join(gameDir, ".git"))) {
|
|
141
|
-
runCommand("git init", { cwd: gameDir })
|
|
142
|
-
runCommand("git add -A", { cwd: gameDir })
|
|
143
|
-
gitCommit("Initial game import", { cwd: gameDir })
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Step 11: Run skills pipeline
|
|
147
|
-
if (selectedAgent !== "none") {
|
|
148
|
-
p.log.step("Starting migration pipeline...")
|
|
149
|
-
await runSkillsPipelineTUI(selectedAgent, gameDir)
|
|
154
|
+
p.log.step("Running Puzzmo skills pipeline...")
|
|
155
|
+
await runSkillsPipeline(selectedAgent, gameDir)
|
|
150
156
|
}
|
|
151
157
|
|
|
152
158
|
// Done
|
|
@@ -158,9 +164,5 @@ export const gameCreate = async (args: string[]) => {
|
|
|
158
164
|
"Next steps",
|
|
159
165
|
)
|
|
160
166
|
|
|
161
|
-
if (selectedAgent === "none") {
|
|
162
|
-
p.log.info("To run migration skills manually, see packages/skills/ for SKILL.md files.")
|
|
163
|
-
}
|
|
164
|
-
|
|
165
167
|
p.outro(`Done! Your game is in ./${slug}/`)
|
|
166
168
|
}
|
package/src/commands/login.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import * as p from "@clack/prompts"
|
|
2
|
+
|
|
1
3
|
import { writeConfig, readConfig } from "../util/config.js"
|
|
2
4
|
|
|
3
5
|
/** Saves a CLI token to ~/.puzzmo/config.json */
|
|
4
6
|
export const login = (token: string) => {
|
|
5
7
|
if (!token.startsWith("pzt-")) {
|
|
6
|
-
|
|
8
|
+
p.log.error("Invalid CLI token. Generate one from dev.puzzmo.com.")
|
|
7
9
|
process.exit(1)
|
|
8
10
|
}
|
|
9
11
|
|
|
@@ -11,5 +13,5 @@ export const login = (token: string) => {
|
|
|
11
13
|
config.token = token
|
|
12
14
|
writeConfig(config)
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
p.log.success("Logged in successfully. Token saved to ~/.puzzmo/config.json")
|
|
15
17
|
}
|
package/src/skills/runner.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process"
|
|
2
2
|
|
|
3
|
-
import { skillsPipeline
|
|
3
|
+
import { skillsPipeline } from "./registry.js"
|
|
4
4
|
import { verifyBuild, runCommand, gitCommit } from "../util/exec.js"
|
|
5
5
|
|
|
6
|
-
/** Builds the agent prompt for a given skill */
|
|
7
|
-
const buildPrompt = (skillName: string
|
|
8
|
-
|
|
9
|
-
return `Run the skill ${skillName}. Follow the instructions in ${skillDir}/${skillName}/SKILL.md. The game source is in the current directory.`
|
|
6
|
+
/** Builds the agent prompt for a given skill, referencing the MCP prompt */
|
|
7
|
+
const buildPrompt = (skillName: string): string => {
|
|
8
|
+
return `Use the MCP prompt "${skillName}" from the dev.puzzmo.com server and follow its instructions. The game source is in the current directory.`
|
|
10
9
|
}
|
|
11
10
|
|
|
12
11
|
/** Invokes an LLM agent with a prompt (plain mode, stdio inherited) */
|
|
@@ -37,7 +36,7 @@ export const runSkillsPipeline = async (agent: string, gameDir: string) => {
|
|
|
37
36
|
const step = i + 1
|
|
38
37
|
console.log(`[${step}/${total}] Running skill: ${skill.name}${skill.optional ? " (optional)" : ""}`)
|
|
39
38
|
|
|
40
|
-
const prompt = buildPrompt(skill.name
|
|
39
|
+
const prompt = buildPrompt(skill.name)
|
|
41
40
|
let result = invokeAgent(agent, prompt, gameDir)
|
|
42
41
|
|
|
43
42
|
if (!result.success) {
|