forgecad 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.
@@ -29242,8 +29242,8 @@ var Loader = class {
29242
29242
  */
29243
29243
  loadAsync(url, onProgress) {
29244
29244
  const scope = this;
29245
- return new Promise(function(resolve22, reject) {
29246
- scope.load(url, resolve22, onProgress, reject);
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((resolve22) => setTimeout(resolve22, 250));
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((resolve22) => setTimeout(resolve22, 150));
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((resolve22, reject) => {
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", () => resolve22(data));
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((resolve22) => {
41597
+ return new Promise((resolve23) => {
41598
41598
  const server = createServer3();
41599
- server.once("error", () => resolve22(false));
41599
+ server.once("error", () => resolve23(false));
41600
41600
  server.once("listening", () => {
41601
41601
  server.close();
41602
- resolve22(true);
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((resolve22, reject) => {
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
- resolve22();
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((resolve22, reject) => {
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
- resolve22(body ? JSON.parse(body) : {});
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((resolve22) => {
42900
+ return new Promise((resolve23) => {
42901
42901
  const s = http.createServer();
42902
- s.listen(port, host, () => s.close(() => resolve22(true)));
42903
- s.on("error", () => resolve22(false));
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((resolve22) => server.listen(port, host, resolve22));
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((resolve22) => {
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(() => resolve22());
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((resolve22, reject) => {
43133
+ return new Promise((resolve23, reject) => {
43134
43134
  child.once("error", reject);
43135
- child.once("exit", (code) => resolve22(code ?? 0));
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"],