Skip to content

Commit ef7a352

Browse files
rafaelscostaclaude
andauthored
fix: rebrand internal .aiox-core/package.json + add namespace drift gate (#739 Bug 2) (#746)
* fix: rebrand internal .aiox-core/package.json + add namespace drift gate Closes the Bug 2 follow-up from #739 (@gabrielolio): the internal `.aiox-core/package.json` manifest still declared the legacy `@aiox-fullstack/core@4.31.1` namespace while the surface package moved to `@aiox-squads/core@5.x` long ago. The drift went undetected because no pre-publish check was looking at this internal file, and it ships inside every release of `@aiox-squads/core`. ## Changes to `.aiox-core/package.json` Renamed and clarified its role: * `name`: `@aiox-fullstack/core` → `@aiox-squads/core-internal` (the `-internal` suffix + `private: true` make it explicit this is NOT a separately-published package — it ships inside the parent surface) * `version`: `4.31.1` → `5.2.6` (now tracks parent surface) * `private: true` added (defensively prevents accidental separate publish in case someone runs `npm publish` from `.aiox-core/`) * `description` rewritten to explain the file's actual role * Dropped `peerDependencies` block — all four `@aiox-fullstack/*` peers referenced packages that never made the namespace migration and do not exist on npm * Dropped publish-only fields that don't apply to an internal manifest: `module`, `types`, `bin`, `files`, `exports`, `publishConfig` * Repository directory hint added so anyone inspecting the file knows the SOT location * Retained the runtime `dependencies` block (consumed by scripts under `.aiox-core/development/scripts/` — validated by `scripts/validate-aiox-core-deps.js`) ## New pre-publish gate `scripts/validate-aiox-core-namespace.js` enforces five rules: 1. `.aiox-core/package.json` exists 2. `name` ends with `-internal` (forbids drifting back to a published namespace) 3. `private: true` 4. `version` matches root `package.json` version exactly (single source of truth — root drives the framework version) 5. No `@aiox-fullstack/*` peer deps re-introduced The validator is wired into `validate:publish` (which `prepublishOnly` chains), so a release that drifts again is blocked before it ships. Also exposed as `npm run validate:aiox-core-namespace` for ad-hoc runs. ## Why the `-internal` suffix instead of just using `@aiox-squads/core` Two packages with the same name on the same npm registry — even if one is `private: true` — confuses tooling that resolves by name (the installer itself, lockfile resolution, dependency graphs, `npm ls` output). The suffix is a defensive disambiguation: the internal file ships inside the parent surface but never appears in dependency graphs as a competing entry. ## Impact on existing installs Running `aiox install --update` (or any flow that calls `applyUpgrade(..., { includeModified: true })`) will pull the corrected file from the next release. Students who hit the namespace drift before this lands can also hand-patch `.aiox-core/package.json` locally — the file is not load-bearing for runtime; it informs tooling and the operator-facing `aiox info` chain. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix: address CodeRabbit feedback on PR #746 + sync install-manifest Three real issues caught: 1. **execFileSync over execSync (nitpick)** — Replaced shell-based `execSync('node "${path}"', ...)` with `execFileSync('node', [path], ...)` for the two validator invocations in `validate-publish.js`. Eliminates shell parsing entirely, defense-in-depth even though the paths are hardcoded. 2. **Fail-closed for missing namespace validator (actionable)** — The previous code SKIP'd silently if `validate-aiox-core-namespace.js` was missing. That's the exact silent-fall pattern that allowed the namespace drift to ship for several releases. Now an absent validator fails the publish gate with a clear message that the file is required and was introduced specifically for Issue #739 Bug 2. Trying to ship without the gate is now blocked. 3. **Scope check in namespace validator (actionable)** — The `-internal` suffix alone allowed names like `@any-scope/foo-internal` to pass. Added a `startsWith('@aiox-squads/')` check before the suffix check, with a message that calls out `@aiox-fullstack/*` as the legacy scope to reject. Now both conditions must hold: `@aiox-squads/<X>-internal`. Also: regenerated `.aiox-core/install-manifest.yaml` — the new validator script + the modified `validate-publish.js` changed hash, and `validate:manifest` was failing in CI because the manifest was stale relative to the working tree. After regen, manifest validation passes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(sync): propagate devops.md release-procedure section to IDE projections Mirror of the same sync commit on PR #747. The release-procedure section added to devops.md by PR #745 was not synced to the four IDE projections before #745 merged, so this branch also inherits the drift from main and fails CI's Compatibility Parity Gate. Files: - .claude/skills/AIOX/agents/devops/SKILL.md - .codex/agents/devops.md - .gemini/rules/AIOX/agents/devops.md - .kimi/skills/aiox-devops/SKILL.md --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 342ef63 commit ef7a352

9 files changed

Lines changed: 196 additions & 78 deletions

File tree

.aiox-core/install-manifest.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# - File types for categorization
99
#
1010
version: 5.2.6
11-
generated_at: "2026-05-17T12:22:51.608Z"
11+
generated_at: "2026-05-17T13:13:35.812Z"
1212
generator: scripts/generate-install-manifest.js
1313
file_count: 1128
1414
files:
@@ -1297,9 +1297,9 @@ files:
12971297
type: data
12981298
size: 9590
12991299
- path: data/entity-registry.yaml
1300-
hash: sha256:7a1dc65b0661069cdccf8babb7c3320320281f10a8e5258a3cba26b8953df5ad
1300+
hash: sha256:5dac372c022f1da390b923a2ce2c719deb2ed3916464925be788b26596f31fdf
13011301
type: data
1302-
size: 572193
1302+
size: 574327
13031303
- path: data/learned-patterns.yaml
13041304
hash: sha256:24ac0b160615583a0ff783d3da8af80b7f94191575d6db2054ec8e10a3f945dc
13051305
type: data
@@ -3697,9 +3697,9 @@ files:
36973697
type: monitor
36983698
size: 818
36993699
- path: package.json
3700-
hash: sha256:049326a853153ea930a49c1d083d5fa9a5eb5d05c3198f0322dbd831fe151b2e
3700+
hash: sha256:d1cc33f580e68ec3c3e5dfb95f152852d587472d086d55fa643e8aabd0c29f77
37013701
type: other
3702-
size: 2529
3702+
size: 1445
37033703
- path: product/checklists/accessibility-wcag-checklist.md
37043704
hash: sha256:56126182b25e9b7bdde43f75315e33167eb49b1f9a9cb0e9a37bc068af40aeab
37053705
type: checklist

.aiox-core/package.json

Lines changed: 11 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,11 @@
11
{
2-
"name": "@aiox-fullstack/core",
3-
"version": "4.31.1",
4-
"description": "AIOX-FullStack Core - Meta-agent and component generation system",
2+
"name": "@aiox-squads/core-internal",
3+
"version": "5.2.6",
4+
"description": "Internal package manifest for AIOX framework — declares runtime dependencies consumed by scripts under .aiox-core/. This is NOT published independently; it ships inside @aiox-squads/core (the top-level package). Kept name-distinct from the parent (`-internal` suffix) to avoid npm registry confusion. Version follows the parent package.",
5+
"private": true,
56
"main": "index.js",
6-
"module": "index.esm.js",
7-
"types": "index.d.ts",
8-
"bin": {
9-
"aiox-core": "bin/aiox-core.js"
10-
},
11-
"files": [
12-
"lib/",
13-
"bin/",
14-
"templates/",
15-
"utils/",
16-
"tasks/",
17-
"docs/",
18-
"elicitation/",
19-
"index.js",
20-
"index.esm.js",
21-
"index.d.ts",
22-
"README.md",
23-
"LICENSE"
24-
],
257
"scripts": {
26-
"build": "node ../tools/build-core.js",
27-
"test": "npm run test:unit && npm run test:integration",
28-
"test:unit": "jest tests/unit",
29-
"test:integration": "jest tests/integration",
30-
"lint": "eslint .",
31-
"typecheck": "tsc --noEmit"
8+
"test": "echo 'Use parent package test scripts'"
329
},
3310
"dependencies": {
3411
"ajv": "^8.17.1",
@@ -47,39 +24,19 @@
4724
"tar": "^7.5.7",
4825
"validator": "^13.15.15"
4926
},
50-
"peerDependencies": {
51-
"@aiox-fullstack/memory": "^4.31.0",
52-
"@aiox-fullstack/security": "^4.31.0",
53-
"@aiox-fullstack/performance": "^4.31.0",
54-
"@aiox-fullstack/telemetry": "^4.31.0"
55-
},
56-
"peerDependenciesMeta": {
57-
"@aiox-fullstack/memory": {
58-
"optional": true
59-
},
60-
"@aiox-fullstack/security": {
61-
"optional": true
62-
},
63-
"@aiox-fullstack/performance": {
64-
"optional": true
65-
},
66-
"@aiox-fullstack/telemetry": {
67-
"optional": true
68-
}
69-
},
7027
"keywords": [
7128
"aiox",
72-
"meta-agent",
73-
"component-generation",
29+
"aiox-squads",
30+
"framework",
7431
"ai-orchestration",
75-
"fullstack",
76-
"development-tools"
32+
"internal-manifest"
7733
],
78-
"author": "AIOX Fullstack Team",
34+
"author": "AIOX Squads",
7935
"license": "MIT",
8036
"repository": {
8137
"type": "git",
82-
"url": "git+https://github.com/SynkraAI/aiox-core.git"
38+
"url": "git+https://github.com/SynkraAI/aiox-core.git",
39+
"directory": ".aiox-core"
8340
},
8441
"bugs": {
8542
"url": "https://github.com/SynkraAI/aiox-core/issues"
@@ -88,21 +45,5 @@
8845
"engines": {
8946
"node": ">=18.0.0",
9047
"npm": ">=9.0.0"
91-
},
92-
"publishConfig": {
93-
"access": "public",
94-
"registry": "https://registry.npmjs.org/"
95-
},
96-
"exports": {
97-
".": {
98-
"types": "./index.d.ts",
99-
"import": "./index.esm.js",
100-
"require": "./index.js"
101-
},
102-
"./templates": "./templates/",
103-
"./utils": "./utils/",
104-
"./tasks": "./tasks/",
105-
"./docs": "./docs/",
106-
"./elicitation": "./elicitation/"
10748
}
10849
}

.claude/skills/AIOX/agents/devops/SKILL.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,19 @@ Type `*help` to see all commands.
589589
- ❌ Creating PR before quality gates pass
590590
- ❌ Skipping CodeRabbit CRITICAL issues
591591

592+
### Release Procedure (NON-NEGOTIABLE Reference)
593+
594+
When invoked with `*release`, `*push` followed by version-bump intent, or any task that ends with a tag push to `@aiox-squads/*`, **load and follow `docs/guides/release-procedure.md` as the canonical SOP before touching anything**. It is the authoritative playbook — the task templates `publish-npm.md` and `release-management.md` are thin wrappers around it.
595+
596+
The SOP captures lessons paid for in 11 patches across 30 days:
597+
- Two-system branch protection on `main` (modern ruleset id `13330052` + legacy `required_pull_request_reviews`); `gh pr merge --admin` bypasses neither alone — you must relax both and restore both atomically with `trap EXIT` + sanitized payloads (raw GitHub API responses include read-only fields that PUT rejects).
598+
- 4-site version bump coordination (`package.json`, `compat/aiox-core/package.json` + its dep, `packages/installer/package.json`, `package-lock.json` + `CHANGELOG.md`).
599+
- The `publish_legacy_aiox_core` job depends on `publish` completing (compat wrapper transitively depends on the scoped package — race against npm CDN propagation has bitten us).
600+
- npm propagation budget for the legacy smoke (240s with dual visibility check).
601+
- Windows path escape in workflow `node -e` interpolations of `${{ github.workspace }}` (use env vars).
602+
603+
Skipping the SOP because "it's just a patch release" is how the next 30-day patch storm starts.
604+
592605
### Related Agents
593606

594607
- **@dev (Dex)** - Delegates push operations to me

.codex/agents/devops.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,19 @@ Type `*help` to see all commands.
579579
- ❌ Creating PR before quality gates pass
580580
- ❌ Skipping CodeRabbit CRITICAL issues
581581

582+
### Release Procedure (NON-NEGOTIABLE Reference)
583+
584+
When invoked with `*release`, `*push` followed by version-bump intent, or any task that ends with a tag push to `@aiox-squads/*`, **load and follow `docs/guides/release-procedure.md` as the canonical SOP before touching anything**. It is the authoritative playbook — the task templates `publish-npm.md` and `release-management.md` are thin wrappers around it.
585+
586+
The SOP captures lessons paid for in 11 patches across 30 days:
587+
- Two-system branch protection on `main` (modern ruleset id `13330052` + legacy `required_pull_request_reviews`); `gh pr merge --admin` bypasses neither alone — you must relax both and restore both atomically with `trap EXIT` + sanitized payloads (raw GitHub API responses include read-only fields that PUT rejects).
588+
- 4-site version bump coordination (`package.json`, `compat/aiox-core/package.json` + its dep, `packages/installer/package.json`, `package-lock.json` + `CHANGELOG.md`).
589+
- The `publish_legacy_aiox_core` job depends on `publish` completing (compat wrapper transitively depends on the scoped package — race against npm CDN propagation has bitten us).
590+
- npm propagation budget for the legacy smoke (240s with dual visibility check).
591+
- Windows path escape in workflow `node -e` interpolations of `${{ github.workspace }}` (use env vars).
592+
593+
Skipping the SOP because "it's just a patch release" is how the next 30-day patch storm starts.
594+
582595
### Related Agents
583596

584597
- **@dev (Dex)** - Delegates push operations to me

.gemini/rules/AIOX/agents/devops.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,19 @@ Type `*help` to see all commands.
579579
- ❌ Creating PR before quality gates pass
580580
- ❌ Skipping CodeRabbit CRITICAL issues
581581

582+
### Release Procedure (NON-NEGOTIABLE Reference)
583+
584+
When invoked with `*release`, `*push` followed by version-bump intent, or any task that ends with a tag push to `@aiox-squads/*`, **load and follow `docs/guides/release-procedure.md` as the canonical SOP before touching anything**. It is the authoritative playbook — the task templates `publish-npm.md` and `release-management.md` are thin wrappers around it.
585+
586+
The SOP captures lessons paid for in 11 patches across 30 days:
587+
- Two-system branch protection on `main` (modern ruleset id `13330052` + legacy `required_pull_request_reviews`); `gh pr merge --admin` bypasses neither alone — you must relax both and restore both atomically with `trap EXIT` + sanitized payloads (raw GitHub API responses include read-only fields that PUT rejects).
588+
- 4-site version bump coordination (`package.json`, `compat/aiox-core/package.json` + its dep, `packages/installer/package.json`, `package-lock.json` + `CHANGELOG.md`).
589+
- The `publish_legacy_aiox_core` job depends on `publish` completing (compat wrapper transitively depends on the scoped package — race against npm CDN propagation has bitten us).
590+
- npm propagation budget for the legacy smoke (240s with dual visibility check).
591+
- Windows path escape in workflow `node -e` interpolations of `${{ github.workspace }}` (use env vars).
592+
593+
Skipping the SOP because "it's just a patch release" is how the next 30-day patch storm starts.
594+
582595
### Related Agents
583596

584597
- **@dev (Dex)** - Delegates push operations to me

.kimi/skills/aiox-devops/SKILL.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,19 @@ Type `*help` to see all commands.
663663
- ❌ Creating PR before quality gates pass
664664
- ❌ Skipping CodeRabbit CRITICAL issues
665665

666+
### Release Procedure (NON-NEGOTIABLE Reference)
667+
668+
When invoked with `*release`, `*push` followed by version-bump intent, or any task that ends with a tag push to `@aiox-squads/*`, **load and follow `docs/guides/release-procedure.md` as the canonical SOP before touching anything**. It is the authoritative playbook — the task templates `publish-npm.md` and `release-management.md` are thin wrappers around it.
669+
670+
The SOP captures lessons paid for in 11 patches across 30 days:
671+
- Two-system branch protection on `main` (modern ruleset id `13330052` + legacy `required_pull_request_reviews`); `gh pr merge --admin` bypasses neither alone — you must relax both and restore both atomically with `trap EXIT` + sanitized payloads (raw GitHub API responses include read-only fields that PUT rejects).
672+
- 4-site version bump coordination (`package.json`, `compat/aiox-core/package.json` + its dep, `packages/installer/package.json`, `package-lock.json` + `CHANGELOG.md`).
673+
- The `publish_legacy_aiox_core` job depends on `publish` completing (compat wrapper transitively depends on the scoped package — race against npm CDN propagation has bitten us).
674+
- npm propagation budget for the legacy smoke (240s with dual visibility check).
675+
- Windows path escape in workflow `node -e` interpolations of `${{ github.workspace }}` (use env vars).
676+
677+
Skipping the SOP because "it's just a patch release" is how the next 30-day patch storm starts.
678+
666679
### Related Agents
667680

668681
- **@dev (Dex)** - Delegates push operations to me

bin/utils/validate-publish.js

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
const fs = require('fs');
1818
const path = require('path');
19-
const { execSync } = require('child_process');
19+
const { execSync, execFileSync } = require('child_process');
2020

2121
const PROJECT_ROOT = path.join(__dirname, '..', '..');
2222
const MIN_FILE_COUNT = 50;
@@ -116,7 +116,7 @@ console.log('--- Dependency Completeness (INS-4.12) ---\n');
116116
try {
117117
const depValidatorPath = path.join(PROJECT_ROOT, 'scripts', 'validate-aiox-core-deps.js');
118118
if (fs.existsSync(depValidatorPath)) {
119-
execSync(`node "${depValidatorPath}"`, {
119+
execFileSync('node', [depValidatorPath], {
120120
encoding: 'utf8',
121121
cwd: PROJECT_ROOT,
122122
timeout: 30000,
@@ -132,6 +132,34 @@ try {
132132
passed = false;
133133
}
134134

135+
// Check 5 (#739 Bug 2 follow-up): .aiox-core/package.json namespace + version sync
136+
//
137+
// Fail-closed: this validator is required, not optional. If it's missing
138+
// from the working tree we ABORT the publish — historically the silent-skip
139+
// pattern is what let the namespace drift ship in the first place.
140+
console.log('');
141+
console.log('--- Internal Manifest Namespace Sync (Issue #739) ---\n');
142+
const nsValidatorPath = path.join(PROJECT_ROOT, 'scripts', 'validate-aiox-core-namespace.js');
143+
if (!fs.existsSync(nsValidatorPath)) {
144+
console.error('FAIL: scripts/validate-aiox-core-namespace.js is required but not found');
145+
console.error(' This validator was introduced for Issue #739 Bug 2 and is mandatory.');
146+
console.error(' Restore the file or revert the deletion that removed it.');
147+
passed = false;
148+
} else {
149+
try {
150+
execFileSync('node', [nsValidatorPath], {
151+
encoding: 'utf8',
152+
cwd: PROJECT_ROOT,
153+
timeout: 10000,
154+
stdio: 'inherit',
155+
});
156+
} catch (_nsErr) {
157+
console.error('FAIL: .aiox-core/package.json namespace/version drift detected');
158+
console.error(' Fix: Run "node scripts/validate-aiox-core-namespace.js" to see details');
159+
passed = false;
160+
}
161+
}
162+
135163
// Summary
136164
console.log('');
137165
if (passed) {

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@
103103
"sync:ide:cursor": "node .aiox-core/infrastructure/scripts/ide-sync/index.js sync --ide cursor",
104104
"validate:publish": "node bin/utils/validate-publish.js",
105105
"prepublishOnly": "node bin/utils/validate-publish.js && npm run generate:manifest && npm run validate:manifest",
106-
"prepare": "husky"
106+
"prepare": "husky",
107+
"validate:aiox-core-namespace": "node scripts/validate-aiox-core-namespace.js"
107108
},
108109
"dependencies": {
109110
"@clack/prompts": "^0.11.0",
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#!/usr/bin/env node
2+
/**
3+
* .aiox-core/package.json namespace + version sync validator
4+
*
5+
* Story #739 (Bug 2 follow-up): the internal `.aiox-core/package.json`
6+
* manifest drifted to the legacy `@aiox-fullstack/core@4.31.1` namespace
7+
* while the surface package moved to `@aiox-squads/core@5.x`. Several
8+
* releases shipped stale internal metadata that confused tooling and
9+
* misled operators investigating upgrade issues.
10+
*
11+
* This validator runs in the pre-publish surface to catch the drift
12+
* before it ships again.
13+
*
14+
* Validation rules:
15+
* 1. `.aiox-core/package.json` MUST exist.
16+
* 2. `name` MUST end with `-internal` (it is NOT a published package on
17+
* its own — `private: true` + suffix avoids npm registry confusion
18+
* with the parent surface).
19+
* 3. `private` MUST be true.
20+
* 4. `version` MUST equal the root `package.json` version (single source
21+
* of truth: the parent surface drives the framework version).
22+
* 5. No `peerDependencies` referencing the legacy `@aiox-fullstack/*`
23+
* namespace.
24+
*
25+
* Exit codes: 0 = PASS, 1 = FAIL
26+
* Usage: node scripts/validate-aiox-core-namespace.js
27+
*/
28+
29+
'use strict';
30+
31+
const fs = require('fs');
32+
const path = require('path');
33+
34+
const ROOT = path.resolve(__dirname, '..');
35+
const INTERNAL_PKG = path.join(ROOT, '.aiox-core', 'package.json');
36+
const ROOT_PKG = path.join(ROOT, 'package.json');
37+
38+
function fail(msg) {
39+
console.error(`FAIL: ${msg}`);
40+
process.exit(1);
41+
}
42+
43+
function main() {
44+
if (!fs.existsSync(INTERNAL_PKG)) {
45+
fail('.aiox-core/package.json not found');
46+
}
47+
if (!fs.existsSync(ROOT_PKG)) {
48+
fail('root package.json not found');
49+
}
50+
51+
const internal = JSON.parse(fs.readFileSync(INTERNAL_PKG, 'utf8'));
52+
const root = JSON.parse(fs.readFileSync(ROOT_PKG, 'utf8'));
53+
54+
if (!internal.name) {
55+
fail('.aiox-core/package.json missing `name` field');
56+
}
57+
const EXPECTED_SCOPE = '@aiox-squads/';
58+
if (!internal.name.startsWith(EXPECTED_SCOPE)) {
59+
fail(
60+
`.aiox-core/package.json name "${internal.name}" must start with "${EXPECTED_SCOPE}" ` +
61+
'(current org scope — names like `@aiox-fullstack/*` are legacy, see Story #739)',
62+
);
63+
}
64+
if (!internal.name.endsWith('-internal')) {
65+
fail(
66+
`.aiox-core/package.json name "${internal.name}" must end with "-internal" ` +
67+
'(internal manifest, not a separately-published package — see Story #739)',
68+
);
69+
}
70+
if (internal.private !== true) {
71+
fail('.aiox-core/package.json must declare `"private": true` (internal-only)');
72+
}
73+
if (internal.version !== root.version) {
74+
fail(
75+
`version drift: .aiox-core/package.json version "${internal.version}" ` +
76+
`does not match root package.json version "${root.version}". ` +
77+
'They must move in lockstep — root is SOT.',
78+
);
79+
}
80+
81+
const peerDeps = internal.peerDependencies || {};
82+
const legacyPeers = Object.keys(peerDeps).filter((d) => d.startsWith('@aiox-fullstack/'));
83+
if (legacyPeers.length > 0) {
84+
fail(
85+
`legacy @aiox-fullstack/* peerDependencies in .aiox-core/package.json: ${legacyPeers.join(', ')}. ` +
86+
'These packages do not exist; drop the peerDependencies block or rename to the current namespace.',
87+
);
88+
}
89+
90+
console.log(
91+
`PASS: .aiox-core/package.json is in sync with root (name=${internal.name}, version=${internal.version})`,
92+
);
93+
process.exit(0);
94+
}
95+
96+
main();

0 commit comments

Comments
 (0)