@pareto4/pp-core 1.5.0 → 1.5.1

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pp-core",
3
3
  "displayName": "PP Core",
4
- "version": "1.5.0",
4
+ "version": "1.5.1",
5
5
  "description": "PP Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.",
6
6
  "author": {
7
7
  "name": "pareto4",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pp-core",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "PP Core — a meta-prompting, context engineering, and spec-driven development system for AI coding agents. Loads pp-core's operating context into every Gemini CLI session.",
5
5
  "contextFileName": "GEMINI.md"
6
6
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pareto4/pp-core",
3
- "version": "1.5.0",
4
- "description": "GSD Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.",
3
+ "version": "1.5.1",
4
+ "description": "Pareto pp-core — The Pareto Project's AI-assisted engineering framework: meta-prompting, context engineering, and spec-driven development for AI coding agents.",
5
5
  "bin": {
6
6
  "pp-core": "bin/install.js",
7
7
  "pp-tools": "pp-core/bin/pp-tools.cjs",
@@ -31,7 +31,7 @@
31
31
  "codex",
32
32
  "codex-cli"
33
33
  ],
34
- "author": "OpenGSD",
34
+ "author": "The Pareto Project",
35
35
  "license": "MIT",
36
36
  "repository": {
37
37
  "type": "git",
@@ -41,6 +41,16 @@ const ROOT = path.resolve(__dirname, '..');
41
41
  /** Matches any recognised OpenGSD spelling in a line of text. */
42
42
  const OPENGSD_RE = /opengsd|open-gsd/i;
43
43
 
44
+ /**
45
+ * Broader brand pattern for npm-facing manifest metadata (package.json
46
+ * `description` / `author`). Catches the upstream product name ("GSD Core")
47
+ * and the org spelling ("OpenGSD") that leaked into the published 1.5.0
48
+ * description/author. Applied ONLY to those manifest fields — not the code/docs
49
+ * surface — so legitimate `gsd-core` references in carved-out provenance files
50
+ * are unaffected.
51
+ */
52
+ const MANIFEST_BRAND_RE = /opengsd|open-gsd|gsd[\s-]?core/i;
53
+
44
54
  // ── Carve-out allowlists (all paths are absolute) ───────────────────────────
45
55
 
46
56
  /**
@@ -224,6 +234,44 @@ function collectDocsFiles() {
224
234
  return files;
225
235
  }
226
236
 
237
+ // ── Manifest metadata surface ────────────────────────────────────────────────
238
+
239
+ const PACKAGE_JSON = path.join(ROOT, 'package.json');
240
+
241
+ /**
242
+ * Scan package.json's npm-facing branding fields (`description`, `author`) for
243
+ * leftover upstream branding. npm renders these on the public package page, and
244
+ * a published version's metadata is immutable — so a leak here can only be fixed
245
+ * by a new release. Guarding it keeps the class from recurring (the 1.5.0
246
+ * description shipped "GSD Core ..." / author "OpenGSD" past the file-surface
247
+ * sweep, which never read package.json).
248
+ *
249
+ * @returns {Array<{file: string, line: number, text: string}>}
250
+ */
251
+ function scanManifestBranding() {
252
+ const hits = [];
253
+ let pkg;
254
+ try {
255
+ pkg = JSON.parse(fs.readFileSync(PACKAGE_JSON, 'utf8'));
256
+ } catch {
257
+ return hits; // no/unreadable package.json — nothing to scan
258
+ }
259
+
260
+ const fields = [
261
+ ['description', pkg.description],
262
+ // `author` may be a string or an { name, ... } object
263
+ ['author', typeof pkg.author === 'object' && pkg.author ? pkg.author.name : pkg.author],
264
+ ];
265
+
266
+ for (const [field, value] of fields) {
267
+ if (typeof value === 'string' && MANIFEST_BRAND_RE.test(value)) {
268
+ hits.push({ file: 'package.json', line: `${field} field`, text: value });
269
+ }
270
+ }
271
+
272
+ return hits;
273
+ }
274
+
227
275
  // ── Main sweep logic ─────────────────────────────────────────────────────────
228
276
 
229
277
  /**
@@ -247,7 +295,8 @@ function runSweep(opts) {
247
295
 
248
296
  const codeHits = scanFiles(codeFiles);
249
297
  const docsHits = scanFiles(docsFiles);
250
- const hits = [...codeHits, ...docsHits];
298
+ const manifestHits = scanManifestBranding();
299
+ const hits = [...codeHits, ...docsHits, ...manifestHits];
251
300
 
252
301
  return { hits, clean: hits.length === 0 };
253
302
  }
@@ -259,7 +308,7 @@ function cliMain() {
259
308
 
260
309
  if (clean) {
261
310
  process.stdout.write(
262
- '[verify-opengsd-sweep] PASS — live code+docs surface is OpenGSD-free (carve-outs intact).\n'
311
+ '[verify-opengsd-sweep] PASS — live code+docs surface and package.json branding are OpenGSD-free (carve-outs intact).\n'
263
312
  );
264
313
  return 0;
265
314
  }
@@ -281,7 +330,7 @@ function cliMain() {
281
330
 
282
331
  // ── Exports + guard ──────────────────────────────────────────────────────────
283
332
 
284
- module.exports = { runSweep, OPENGSD_RE, isCarvedOut };
333
+ module.exports = { runSweep, OPENGSD_RE, MANIFEST_BRAND_RE, isCarvedOut, scanManifestBranding };
285
334
 
286
335
  if (require.main === module) {
287
336
  runMain(cliMain);