From a59da2b7848d3086e41fb554ade614fb3e3fa318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=99=B8=EA=B3=84=EA=B3=B5=EB=A3=A1?= <56211193+chucoding@users.noreply.github.com> Date: Sun, 15 Mar 2026 14:46:45 +0900 Subject: [PATCH 1/2] [PF-25] Fix planforge model when installed via npm and remove @planforge/core dependency (#39) * fix : add copy core script (no more use monorepo) * refactor : remove dependency @planforge/core * refactor : remove dependency @planforge/core --- .gitignore | 1 + packages/cli-js/package.json | 5 ++--- packages/cli-js/pnpm-lock.yaml | 8 -------- packages/cli-js/scripts/copy-core.js | 23 +++++++++++++++++++++++ packages/cli-js/src/commands/model.ts | 2 +- packages/cli-js/src/utils/paths.ts | 21 +++++++++++---------- 6 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 packages/cli-js/scripts/copy-core.js diff --git a/.gitignore b/.gitignore index 3017d8f..9e9d696 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ node_modules dist build packages/cli-js/templates +packages/cli-js/core npm-debug.log # python diff --git a/packages/cli-js/package.json b/packages/cli-js/package.json index b051c14..6dfdbcd 100644 --- a/packages/cli-js/package.json +++ b/packages/cli-js/package.json @@ -14,20 +14,19 @@ "publishConfig": { "access": "public" }, - "files": ["dist", "templates", "README.md"], + "files": ["dist", "templates", "core", "README.md"], "bin": { "planforge": "dist/index.js" }, "scripts": { "check:templates": "node scripts/check-templates.js", - "build": "pnpm run check:templates && tsc && node scripts/copy-templates.js", + "build": "pnpm run check:templates && tsc && node scripts/copy-templates.js && node scripts/copy-core.js", "dev": "tsc --watch", "planforge": "node dist/index.js", "install:global": "pnpm run build && npm install -g .", "prepublishOnly": "pnpm run build" }, "dependencies": { - "@planforge/core": "file:../core", "@daun_jung/korean-romanizer": "^1.0.1", "commander": "^12.0.0", "fs-extra": "^11.2.0" diff --git a/packages/cli-js/pnpm-lock.yaml b/packages/cli-js/pnpm-lock.yaml index f777fb8..1f147ef 100644 --- a/packages/cli-js/pnpm-lock.yaml +++ b/packages/cli-js/pnpm-lock.yaml @@ -11,9 +11,6 @@ importers: '@daun_jung/korean-romanizer': specifier: ^1.0.1 version: 1.0.1 - '@planforge/core': - specifier: file:../core - version: file:../core commander: specifier: ^12.0.0 version: 12.1.0 @@ -37,9 +34,6 @@ packages: resolution: {integrity: sha512-V5eY5iB3kUt6u9uYcjilra9vkJ8cIdJpDYSNeaX9dle1qPPYqis+XrOn+Zf/+FsbxOLAL9WqMmkJEDwNOd+0OQ==} engines: {node: '>=14.0.0'} - '@planforge/core@file:../core': - resolution: {directory: ../core, type: directory} - '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -79,8 +73,6 @@ snapshots: '@daun_jung/korean-romanizer@1.0.1': {} - '@planforge/core@file:../core': {} - '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 diff --git a/packages/cli-js/scripts/copy-core.js b/packages/cli-js/scripts/copy-core.js new file mode 100644 index 0000000..1e84602 --- /dev/null +++ b/packages/cli-js/scripts/copy-core.js @@ -0,0 +1,23 @@ +/** + * Copy @planforge/core content (prompts, models.json) into packages/cli-js/core so the published npm package contains them. + * Run from packages/cli-js (e.g. node scripts/copy-core.js). + */ +import { cpSync, mkdirSync, existsSync } from "fs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const repoRoot = resolve(__dirname, "..", "..", ".."); +const corePkg = resolve(repoRoot, "packages", "core"); +const dest = resolve(__dirname, "..", "core"); +const promptsSrc = resolve(corePkg, "prompts"); +const modelsSrc = resolve(corePkg, "models.json"); + +if (!existsSync(promptsSrc) || !existsSync(modelsSrc)) { + console.error("copy-core: packages/core/prompts or models.json not found"); + process.exit(1); +} +mkdirSync(dest, { recursive: true }); +cpSync(promptsSrc, resolve(dest, "prompts"), { recursive: true }); +cpSync(modelsSrc, resolve(dest, "models.json")); +console.log("copy-core: copied core to", dest); diff --git a/packages/cli-js/src/commands/model.ts b/packages/cli-js/src/commands/model.ts index 30f57bb..1023db6 100644 --- a/packages/cli-js/src/commands/model.ts +++ b/packages/cli-js/src/commands/model.ts @@ -32,7 +32,7 @@ export function loadModelsCatalog(): ModelsCatalog { const filePath = existsSync(path) ? path : existsSync(fallback) ? fallback : null; if (!filePath) { throw new Error( - `models.json not found. Tried: ${path} and ${fallback}. Check @planforge/core package or run from repo root.` + `models.json not found. Tried: ${path} and ${fallback}. Run pnpm run build in cli-js or reinstall planforge.` ); } return fs.readJsonSync(filePath) as ModelsCatalog; diff --git a/packages/cli-js/src/utils/paths.ts b/packages/cli-js/src/utils/paths.ts index 85aae43..a18b57f 100644 --- a/packages/cli-js/src/utils/paths.ts +++ b/packages/cli-js/src/utils/paths.ts @@ -5,10 +5,8 @@ import { existsSync } from "fs"; import { resolve, dirname } from "path"; import { fileURLToPath } from "url"; -import { createRequire } from "module"; const __dirname = dirname(fileURLToPath(import.meta.url)); -const require = createRequire(import.meta.url); /** * Find project root by walking up from cwd until we find planforge.json or .cursor/plans or .cursor/contexts. @@ -71,19 +69,22 @@ export function getTemplatesRoot(): string { } /** - * Resolve prompts directory from @planforge/core package (for planner/implementer system prompts). + * Resolve core root (prompts, models.json). Always uses the bundled copy at package root; no @planforge/core dependency. + */ +function getCoreRoot(): string { + return resolve(__dirname, "..", "..", "core"); +} + +/** + * Resolve prompts directory (planner/implementer system prompts). Uses bundled core from build. */ export function getPromptsDir(): string { - const corePackageJson = require.resolve("@planforge/core/package.json"); - const coreRoot = dirname(corePackageJson); - return resolve(coreRoot, "prompts"); + return resolve(getCoreRoot(), "prompts"); } /** - * Resolve models.json path from @planforge/core package (for planforge model command). + * Resolve models.json path (planforge model command). Uses bundled core from build. */ export function getModelsJsonPath(): string { - const corePackageJson = require.resolve("@planforge/core/package.json"); - const coreRoot = dirname(corePackageJson); - return resolve(coreRoot, "models.json"); + return resolve(getCoreRoot(), "models.json"); } From 2d2bd9aed05d79e6522b091765721f96e6f01845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=99=B8=EA=B3=84=EA=B3=B5=EB=A3=A1?= <56211193+chucoding@users.noreply.github.com> Date: Sun, 15 Mar 2026 14:58:31 +0900 Subject: [PATCH 2/2] [PF-25] Fix planforge model when installed via npm and remove @planforge/core dependency (#40) * fix : add copy core script (no more use monorepo) * refactor : remove dependency @planforge/core * refactor : remove dependency @planforge/core * release : v0.1.7 --- packages/cli-js/package.json | 2 +- packages/cli-js/src/index.ts | 2 +- packages/cli-py/planforge/__init__.py | 2 +- packages/cli-py/planforge/cli.py | 2 +- packages/cli-py/pyproject.toml | 2 +- packages/core/package.json | 2 +- packages/core/pyproject.toml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/cli-js/package.json b/packages/cli-js/package.json index 6dfdbcd..3ee5bc8 100644 --- a/packages/cli-js/package.json +++ b/packages/cli-js/package.json @@ -1,6 +1,6 @@ { "name": "planforge", - "version": "0.1.6", + "version": "0.1.7", "type": "module", "description": "PlanForge CLI - Bring your own AI to Cursor", "keywords": ["cursor", "claude", "codex", "ai", "cli", "planning", "planforge"], diff --git a/packages/cli-js/src/index.ts b/packages/cli-js/src/index.ts index 1a88313..42e20d4 100644 --- a/packages/cli-js/src/index.ts +++ b/packages/cli-js/src/index.ts @@ -17,7 +17,7 @@ const program = new Command(); program .name("planforge") .description("Bring your own AI to Cursor. Use Claude or Codex inside Cursor Free.") - .version("0.1.6"); + .version("0.1.7"); program .command("init") diff --git a/packages/cli-py/planforge/__init__.py b/packages/cli-py/planforge/__init__.py index 70087d0..4b5f975 100644 --- a/packages/cli-py/planforge/__init__.py +++ b/packages/cli-py/planforge/__init__.py @@ -1,3 +1,3 @@ """PlanForge CLI - Bring your own AI to Cursor.""" -__version__ = "0.1.6" +__version__ = "0.1.7" diff --git a/packages/cli-py/planforge/cli.py b/packages/cli-py/planforge/cli.py index e4a35e0..4731a2b 100644 --- a/packages/cli-py/planforge/cli.py +++ b/packages/cli-py/planforge/cli.py @@ -11,7 +11,7 @@ @click.group() -@click.version_option(version="0.1.6") +@click.version_option(version="0.1.7") def main() -> None: """Bring your own AI to Cursor. Use Claude or Codex inside Cursor Free.""" diff --git a/packages/cli-py/pyproject.toml b/packages/cli-py/pyproject.toml index 5f4fab9..21d076b 100644 --- a/packages/cli-py/pyproject.toml +++ b/packages/cli-py/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "planforge" -version = "0.1.6" +version = "0.1.7" description = "PlanForge CLI - Bring your own AI to Cursor" requires-python = ">=3.10" dependencies = [ diff --git a/packages/core/package.json b/packages/core/package.json index ff43fa0..ee01a64 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@planforge/core", - "version": "0.1.6", + "version": "0.1.7", "description": "PlanForge shared prompts", "license": "MIT", "files": ["prompts", "models.json"] diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index 93ec6e1..0654239 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "planforge-core" -version = "0.1.6" +version = "0.1.7" description = "PlanForge shared prompts" requires-python = ">=3.10"