forgecad 0.1.3 → 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-cli/forgecad.js +58 -22
- package/dist-skill/CONTEXT.md +4704 -0
- package/package.json +1 -1
package/dist-cli/forgecad.js
CHANGED
|
@@ -29242,8 +29242,8 @@ var Loader = class {
|
|
|
29242
29242
|
*/
|
|
29243
29243
|
loadAsync(url, onProgress) {
|
|
29244
29244
|
const scope = this;
|
|
29245
|
-
return new Promise(function(
|
|
29246
|
-
scope.load(url,
|
|
29245
|
+
return new Promise(function(resolve23, reject) {
|
|
29246
|
+
scope.load(url, resolve23, onProgress, reject);
|
|
29247
29247
|
});
|
|
29248
29248
|
}
|
|
29249
29249
|
/**
|
|
@@ -40514,7 +40514,7 @@ async function waitForRenderHtml(port, timeoutMs) {
|
|
|
40514
40514
|
const deadline = Date.now() + timeoutMs;
|
|
40515
40515
|
while (Date.now() < deadline) {
|
|
40516
40516
|
if (await fetchRenderHtml(port)) return true;
|
|
40517
|
-
await new Promise((
|
|
40517
|
+
await new Promise((resolve23) => setTimeout(resolve23, 250));
|
|
40518
40518
|
}
|
|
40519
40519
|
return false;
|
|
40520
40520
|
}
|
|
@@ -40564,7 +40564,7 @@ ${detail}` : `Timed out waiting for Vite on port ${port}.`
|
|
|
40564
40564
|
async function stopDevServer(proc) {
|
|
40565
40565
|
if (!proc || proc.killed) return;
|
|
40566
40566
|
proc.kill("SIGTERM");
|
|
40567
|
-
await new Promise((
|
|
40567
|
+
await new Promise((resolve23) => setTimeout(resolve23, 150));
|
|
40568
40568
|
if (!proc.killed) {
|
|
40569
40569
|
proc.kill("SIGKILL");
|
|
40570
40570
|
}
|
|
@@ -41160,13 +41160,13 @@ function parseCli2(argv) {
|
|
|
41160
41160
|
};
|
|
41161
41161
|
}
|
|
41162
41162
|
function readStdin() {
|
|
41163
|
-
return new Promise((
|
|
41163
|
+
return new Promise((resolve23, reject) => {
|
|
41164
41164
|
let data = "";
|
|
41165
41165
|
input.setEncoding("utf8");
|
|
41166
41166
|
input.on("data", (chunk) => {
|
|
41167
41167
|
data += chunk;
|
|
41168
41168
|
});
|
|
41169
|
-
input.on("end", () =>
|
|
41169
|
+
input.on("end", () => resolve23(data));
|
|
41170
41170
|
input.on("error", reject);
|
|
41171
41171
|
});
|
|
41172
41172
|
}
|
|
@@ -41594,12 +41594,12 @@ function findProjectRoot2(sp) {
|
|
|
41594
41594
|
return root;
|
|
41595
41595
|
}
|
|
41596
41596
|
async function isPortOpen(port) {
|
|
41597
|
-
return new Promise((
|
|
41597
|
+
return new Promise((resolve23) => {
|
|
41598
41598
|
const server = createServer3();
|
|
41599
|
-
server.once("error", () =>
|
|
41599
|
+
server.once("error", () => resolve23(false));
|
|
41600
41600
|
server.once("listening", () => {
|
|
41601
41601
|
server.close();
|
|
41602
|
-
|
|
41602
|
+
resolve23(true);
|
|
41603
41603
|
});
|
|
41604
41604
|
server.listen(port, "127.0.0.1");
|
|
41605
41605
|
});
|
|
@@ -41614,12 +41614,12 @@ async function ensureDevServer2(port) {
|
|
|
41614
41614
|
stdio: "pipe",
|
|
41615
41615
|
detached: false
|
|
41616
41616
|
});
|
|
41617
|
-
await new Promise((
|
|
41617
|
+
await new Promise((resolve23, reject) => {
|
|
41618
41618
|
const timeout = setTimeout(() => reject(new Error("Vite startup timeout")), 15e3);
|
|
41619
41619
|
viteProcess.stdout.on("data", (data) => {
|
|
41620
41620
|
if (data.toString().includes("ready")) {
|
|
41621
41621
|
clearTimeout(timeout);
|
|
41622
|
-
|
|
41622
|
+
resolve23();
|
|
41623
41623
|
}
|
|
41624
41624
|
});
|
|
41625
41625
|
viteProcess.on("error", (e) => {
|
|
@@ -42777,14 +42777,14 @@ function sendJson(res, status, payload) {
|
|
|
42777
42777
|
res.end(JSON.stringify(payload));
|
|
42778
42778
|
}
|
|
42779
42779
|
function readJsonBody(req) {
|
|
42780
|
-
return new Promise((
|
|
42780
|
+
return new Promise((resolve23, reject) => {
|
|
42781
42781
|
let body = "";
|
|
42782
42782
|
req.on("data", (chunk) => {
|
|
42783
42783
|
body += chunk;
|
|
42784
42784
|
});
|
|
42785
42785
|
req.on("end", () => {
|
|
42786
42786
|
try {
|
|
42787
|
-
|
|
42787
|
+
resolve23(body ? JSON.parse(body) : {});
|
|
42788
42788
|
} catch (e) {
|
|
42789
42789
|
reject(e);
|
|
42790
42790
|
}
|
|
@@ -42897,10 +42897,10 @@ function serveStatic(distDir, req, res) {
|
|
|
42897
42897
|
return true;
|
|
42898
42898
|
}
|
|
42899
42899
|
function isPortAvailable(port, host) {
|
|
42900
|
-
return new Promise((
|
|
42900
|
+
return new Promise((resolve23) => {
|
|
42901
42901
|
const s = http.createServer();
|
|
42902
|
-
s.listen(port, host, () => s.close(() =>
|
|
42903
|
-
s.on("error", () =>
|
|
42902
|
+
s.listen(port, host, () => s.close(() => resolve23(true)));
|
|
42903
|
+
s.on("error", () => resolve23(false));
|
|
42904
42904
|
});
|
|
42905
42905
|
}
|
|
42906
42906
|
async function pickPort(preferred, host, strict) {
|
|
@@ -43034,11 +43034,11 @@ data: ${JSON.stringify(entries)}
|
|
|
43034
43034
|
res.end("Not found");
|
|
43035
43035
|
}
|
|
43036
43036
|
});
|
|
43037
|
-
await new Promise((
|
|
43037
|
+
await new Promise((resolve23) => server.listen(port, host, resolve23));
|
|
43038
43038
|
const displayHost = host === "0.0.0.0" ? "localhost" : host;
|
|
43039
43039
|
const url = `http://${displayHost}:${port}`;
|
|
43040
43040
|
if (open) openBrowser(url);
|
|
43041
|
-
const close4 = () => new Promise((
|
|
43041
|
+
const close4 = () => new Promise((resolve23) => {
|
|
43042
43042
|
watcher?.close();
|
|
43043
43043
|
sseClients.forEach((c) => {
|
|
43044
43044
|
try {
|
|
@@ -43047,7 +43047,7 @@ data: ${JSON.stringify(entries)}
|
|
|
43047
43047
|
}
|
|
43048
43048
|
});
|
|
43049
43049
|
sseClients.clear();
|
|
43050
|
-
server.close(() =>
|
|
43050
|
+
server.close(() => resolve23());
|
|
43051
43051
|
});
|
|
43052
43052
|
return { url, close: close4 };
|
|
43053
43053
|
}
|
|
@@ -43130,9 +43130,9 @@ function toViteArgs(options) {
|
|
|
43130
43130
|
return args;
|
|
43131
43131
|
}
|
|
43132
43132
|
function waitForExit(child) {
|
|
43133
|
-
return new Promise((
|
|
43133
|
+
return new Promise((resolve23, reject) => {
|
|
43134
43134
|
child.once("error", reject);
|
|
43135
|
-
child.once("exit", (code) =>
|
|
43135
|
+
child.once("exit", (code) => resolve23(code ?? 0));
|
|
43136
43136
|
});
|
|
43137
43137
|
}
|
|
43138
43138
|
async function runStudioCli(argv = process.argv.slice(2)) {
|
|
@@ -43860,7 +43860,7 @@ Dimension list${showAll ? "" : " (first 20)"}:`);
|
|
|
43860
43860
|
// cli/forge-skill.ts
|
|
43861
43861
|
import { cpSync, existsSync as existsSync6, mkdirSync as mkdirSync4, readFileSync as readFileSync15, writeFileSync as writeFileSync8 } from "fs";
|
|
43862
43862
|
import { homedir as homedir2 } from "os";
|
|
43863
|
-
import { join as join7 } from "path";
|
|
43863
|
+
import { join as join7, resolve as resolve22 } from "path";
|
|
43864
43864
|
async function runSkillInstallCli(_argv = []) {
|
|
43865
43865
|
const srcSkill = resolvePackagePath(import.meta.url, "dist-skill", "SKILL.md");
|
|
43866
43866
|
const srcDocs = resolvePackagePath(import.meta.url, "dist-skill", "docs");
|
|
@@ -43881,6 +43881,26 @@ If you are running from a source checkout, run: npm run build:skill:forgecad`
|
|
|
43881
43881
|
console.log(`ForgeCAD skill installed to ${dest}`);
|
|
43882
43882
|
console.log(`Reload your agent (Claude Code, Codex, OpenCode, \u2026) to activate.`);
|
|
43883
43883
|
}
|
|
43884
|
+
async function runSkillOneFileCli(argv = []) {
|
|
43885
|
+
const outputArg = argv.find((a) => !a.startsWith("-"));
|
|
43886
|
+
if (!outputArg) {
|
|
43887
|
+
throw new Error(
|
|
43888
|
+
`Usage: forgecad skill one-file <output-path>
|
|
43889
|
+
Example: forgecad skill one-file ~/Desktop/forgecad-context.md`
|
|
43890
|
+
);
|
|
43891
|
+
}
|
|
43892
|
+
const src = resolvePackagePath(import.meta.url, "dist-skill", "CONTEXT.md");
|
|
43893
|
+
if (!existsSync6(src)) {
|
|
43894
|
+
throw new Error(
|
|
43895
|
+
`Built context file not found at ${src}.
|
|
43896
|
+
If you are running from a source checkout, run: npm run build:skill:forgecad`
|
|
43897
|
+
);
|
|
43898
|
+
}
|
|
43899
|
+
const dest = resolve22(outputArg);
|
|
43900
|
+
writeFileSync8(dest, readFileSync15(src));
|
|
43901
|
+
console.log(`ForgeCAD context written to ${dest}`);
|
|
43902
|
+
console.log(`Paste the contents into any AI chat UI (Claude.ai, ChatGPT, Gemini, \u2026) to get full ForgeCAD API knowledge.`);
|
|
43903
|
+
}
|
|
43884
43904
|
|
|
43885
43905
|
// cli/forgecad.ts
|
|
43886
43906
|
var SHELL_VALUES = [
|
|
@@ -44040,6 +44060,22 @@ var commands = [
|
|
|
44040
44060
|
examples: ["forgecad skill install"],
|
|
44041
44061
|
run: runSkillInstallCli
|
|
44042
44062
|
},
|
|
44063
|
+
{
|
|
44064
|
+
group: "Shell",
|
|
44065
|
+
path: ["skill", "one-file"],
|
|
44066
|
+
summary: "Write a single self-contained context file with all ForgeCAD docs for pasting into a chat UI (Claude.ai, ChatGPT, \u2026).",
|
|
44067
|
+
usage: ["forgecad skill one-file <output-path>"],
|
|
44068
|
+
examples: [
|
|
44069
|
+
"forgecad skill one-file ~/Desktop/forgecad-context.md",
|
|
44070
|
+
"forgecad skill one-file ./forgecad-context.md"
|
|
44071
|
+
],
|
|
44072
|
+
completion: {
|
|
44073
|
+
positionals: [
|
|
44074
|
+
{ description: "output path for the context file", valueKind: "path" }
|
|
44075
|
+
]
|
|
44076
|
+
},
|
|
44077
|
+
run: runSkillOneFileCli
|
|
44078
|
+
},
|
|
44043
44079
|
{
|
|
44044
44080
|
group: "Shell",
|
|
44045
44081
|
path: ["__complete"],
|