Skip to content
This repository was archived by the owner on Apr 21, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
## [Unreleased]

## [1.14.1] - 2026-04-07

### Fixed
- **`forge-patterns` bin entry**: `package.json` declared `"forge-patterns": "dist/cli.js"`, but no `src/cli.ts` ever existed and `dist/cli.js` was never built, so `npx @forgespace/core forge-patterns` failed for every npm consumer of v1.4.0–v1.14.0. The bin now points at the existing `scripts/forge-patterns-cli.js` (already shipped under `pkg.files`, has a `#!/usr/bin/env node` shebang). The script was also marked executable. Added `src/bin-entries.test.js` to assert that every `pkg.bin` entry resolves to a real file, has a node shebang, and lives under a path declared in `pkg.files` — preventing this regression class going forward.

## [1.14.0] - 2026-04-04

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion etc/core.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -711,7 +711,7 @@ export interface ToggleStrategyConfig {
export function validateTenantProfile(value: unknown): value is TenantProfile;

// @public
export const VERSION = "1.14.0";
export const VERSION = "1.14.1";

// (No @packageDocumentation comment for this package)

Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@forgespace/core",
"version": "1.14.0",
"version": "1.14.1",
"description": "Shared configuration, workflows, and architectural patterns for the Forgespace ecosystem",
"main": "dist/src/index.js",
"types": "dist/src/index.d.ts",
Expand Down Expand Up @@ -78,7 +78,7 @@
"mcp-context:start": "node dist/mcp-context-server/index.js"
},
"bin": {
"forge-patterns": "dist/cli.js",
"forge-patterns": "scripts/forge-patterns-cli.js",
"forge-scorecard": "dist/patterns/idp/scorecards/cli.js",
"forge-policy": "dist/patterns/idp/policy-engine/cli.js",
"forge-features": "dist/patterns/idp/feature-toggles/cli.js",
Expand Down
Empty file modified scripts/forge-patterns-cli.js
100644 → 100755
Empty file.
30 changes: 30 additions & 0 deletions src/bin-entries.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const fs = require('node:fs');
const path = require('node:path');

const repoRoot = path.resolve(__dirname, '..');
const pkg = require('../package.json');

describe('package.json bin entries', () => {
const binEntries = Object.entries(pkg.bin || {});

it('declares at least one bin entry', () => {
expect(binEntries.length).toBeGreaterThan(0);
});

it.each(binEntries)('bin "%s" -> "%s" exists in the published files', (name, relPath) => {
const absPath = path.join(repoRoot, relPath);
expect(fs.existsSync(absPath)).toBe(true);
});

it.each(binEntries)('bin "%s" -> "%s" starts with a node shebang', (name, relPath) => {
const absPath = path.join(repoRoot, relPath);
if (!fs.existsSync(absPath)) return;
const firstLine = fs.readFileSync(absPath, 'utf8').split('\n', 1)[0];
expect(firstLine).toMatch(/^#!.*\bnode\b/);
});

it.each(binEntries)('bin "%s" -> "%s" lives under a path declared in pkg.files', (name, relPath) => {
const topDir = relPath.split('/')[0] + '/';
expect(pkg.files).toEqual(expect.arrayContaining([topDir]));
});
});
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*/

// Version information — kept in sync with package.json by scripts/release-core.sh
export const VERSION = '1.14.0';
export const VERSION = '1.14.1';

// Type definitions
export interface ProjectConfig {
Expand Down
Loading