Skip to content

fix: rebrand internal .aiox-core/package.json + add namespace drift gate (#739 Bug 2) - #746

Merged
rafaelscosta merged 3 commits into
mainfrom
fix/aiox-core-internal-package-json
May 17, 2026
Merged

fix: rebrand internal .aiox-core/package.json + add namespace drift gate (#739 Bug 2)#746
rafaelscosta merged 3 commits into
mainfrom
fix/aiox-core-internal-package-json

Conversation

@rafaelscosta

@rafaelscosta rafaelscosta commented May 17, 2026

Copy link
Copy Markdown
Collaborator

Closes Bug 2 from issue #739 (@gabrielolio's follow-up comment): the internal .aiox-core/package.json manifest was still declaring the legacy @aiox-fullstack/core@4.31.1 namespace while the surface package moved to @aiox-squads/core@5.x long ago.

Root cause

@aiox-fullstack/core@aiox-squads/core rebrand swept the root package.json and most surfaces but skipped the internal .aiox-core/package.json. The drift went undetected because no pre-publish check looked at this internal file, and it ships inside every release of @aiox-squads/core. Operators investigating upgrade issues saw the legacy name surface in aiox info chains and other tooling that reads this file.

Changes

.aiox-core/package.json

  • 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.15.2.6 (tracks parent surface)
  • private: true defensively prevents accidental separate publish
  • Dropped peerDependencies block (all four @aiox-fullstack/* peers referenced packages that don't exist)
  • Dropped publish-only fields irrelevant to an internal manifest (module, types, bin, files, exports, publishConfig)
  • Retained runtime dependencies consumed by .aiox-core/development/scripts/

New pre-publish gate

scripts/validate-aiox-core-namespace.js enforces five rules: file exists, name ends with -internal, private: true, version matches root, no @aiox-fullstack/* peers re-introduced.

Wired into validate:publish (which prepublishOnly chains), so future drift is blocked before release.

Why -internal suffix instead of just @aiox-squads/core

Two packages with the same name on the same npm registry — even with private: true — confuses tooling that resolves by name (the installer itself, lockfile resolution, npm ls, dependency graphs). The suffix is defensive disambiguation.

Test plan

  • node scripts/validate-aiox-core-namespace.js → PASS
  • npm run validate:publish → all 5 checks PASS (including new Check 5)
  • No drift introduced in root package.json / no version mismatch
  • After merge: students hitting the legacy namespace in .aiox-core/package.json pick up the corrected file via next aiox install --update (or any flow calling applyUpgrade(..., { includeModified: true }))

Related

  • Original issue: [Bug]: --ci --yes ignorado no prompt de merge do CLAUDE.md durante install (v5.2.5) #739 (Bug 2 in the follow-up comment)
  • Bug 1 from the same issue (--ci --yes ignored at CLAUDE.md merge prompt) is NOT addressed here — separate scope, needs markdown-merger.js refactor.
  • Companion docs: this completes the namespace migration started in 61991a35 (rebrand aios → aiox commit) — that PR rebranded surfaces but missed the internal manifest.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores

    • Internal core package re-scoped and version bumped to 5.2.6 and marked private.
    • Manifest metadata and recorded hashes updated.
    • Added a new pre-publish validation command to repository scripts.
  • Bug Fixes

    • Publish gating strengthened so namespace/version validation now blocks publishes on failure.
  • Documentation

    • Added a non-negotiable release procedure section to DevOps agent guidelines and related docs.

Review Change Stack

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>
@vercel

vercel Bot commented May 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
aiox-core Ready Ready Preview, Comment May 17, 2026 1:49pm

Request Review

@github-actions github-actions Bot added area: installer Installer and setup (packages/installer/) area: docs Documentation (docs/) labels May 17, 2026
@coderabbitai

coderabbitai Bot commented May 17, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: dd6f8a7b-4916-41eb-94d1-832ccfb7232e

📥 Commits

Reviewing files that changed from the base of the PR and between 7d4fd5e and 1f4cb2b.

📒 Files selected for processing (4)
  • .claude/skills/AIOX/agents/devops/SKILL.md
  • .codex/agents/devops.md
  • .gemini/rules/AIOX/agents/devops.md
  • .kimi/skills/aiox-devops/SKILL.md

Walkthrough

Rescopes and simplifies .aiox-core/package.json to @aiox-squads/core-internal v5.2.6 (private), updates install-manifest hashes/timestamp, adds scripts/validate-aiox-core-namespace.js to enforce name/version/peerDependency rules, and wires the validator into the publish gate and root npm scripts.

Changes

Internal Package Namespace Migration

Layer / File(s) Summary
Namespace validator script
scripts/validate-aiox-core-namespace.js
New Node CLI validator that enforces .aiox-core/package.json name starts with @aiox-squads/ and ends with -internal, private: true, version equality with root, and rejects @aiox-fullstack/* peerDependencies. Exits 0 on pass, 1 on fail.
Publish gate and npm script
bin/utils/validate-publish.js, package.json
Validator is executed from the publish gate via execFileSync('node', ...); missing or failing validator sets passed = false and blocks publish. Root package.json adds validate:aiox-core-namespace script.
Internal package restructuring
.aiox-core/package.json
Package renamed to @aiox-squads/core-internal, version set to 5.2.6, private: true added; test script replaced; peerDependencies/peerDependenciesMeta, publishConfig, and exports removed; metadata updated.
Install manifest hash updates
.aiox-core/install-manifest.yaml
Refreshes generated_at timestamp and updates recorded SHA256 hashes and sizes for data/entity-registry.yaml and the package.json entry (type remains other).
Release procedure documentation
.claude/..., .codex/..., .gemini/..., .kimi/...
Adds a non-negotiable release SOP reference to DevOps agent guideline files directing agents to docs/guides/release-procedure.md and listing SOP constraints for tagging/publishing flows.

Sequence Diagram(s)

sequenceDiagram
  participant NPM as npm publish
  participant PublishGate as bin/utils/validate-publish.js
  participant Validator as scripts/validate-aiox-core-namespace.js
  participant RootPkg as root package.json
  participant InternalPkg as .aiox-core/package.json
  NPM->>PublishGate: invoke publish validations
  PublishGate->>Validator: execFileSync('node', [validatorPath])
  Validator->>RootPkg: read version
  Validator->>InternalPkg: read name, version, private, peerDependencies
  Validator->>PublishGate: exit 0 or exit 1 (PASS/FAIL)
  PublishGate->>NPM: allow or block publish
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

area: devops, area: core

Suggested reviewers

  • oalanicolas
  • Pedrovaleriolopez
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: rebranding the internal .aiox-core/package.json and adding a namespace drift validation gate, directly matching the PR's primary objectives.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/aiox-core-internal-package-json

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented May 17, 2026

Copy link
Copy Markdown
Contributor

📊 Coverage Report

Coverage report not available

📈 Full coverage report available in Codecov


Generated by PR Automation (Story 6.1)

coderabbitai[bot]
coderabbitai Bot previously requested changes May 17, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
bin/utils/validate-publish.js (1)

141-146: ⚡ Quick win

Use execFileSync instead of shell-based execSync for both validator calls.

Lines 119 and 141 use shell string interpolation for node script paths. While these specific paths are hardcoded and low-risk, it's better practice to use execFileSync('node', [path], ...) to avoid shell parsing entirely.

Suggested change
-const { execSync } = require('child_process');
+const { execSync, execFileSync } = require('child_process');
@@
   const depValidatorPath = path.join(PROJECT_ROOT, 'scripts', 'validate-aiox-core-deps.js');
   if (fs.existsSync(depValidatorPath)) {
-    execSync(`node "${depValidatorPath}"`, {
+    execFileSync('node', [depValidatorPath], {
       encoding: 'utf8',
       cwd: PROJECT_ROOT,
       timeout: 30000,
       stdio: 'inherit',
     });
@@
   const nsValidatorPath = path.join(PROJECT_ROOT, 'scripts', 'validate-aiox-core-namespace.js');
   if (fs.existsSync(nsValidatorPath)) {
-    execSync(`node "${nsValidatorPath}"`, {
+    execFileSync('node', [nsValidatorPath], {
       encoding: 'utf8',
       cwd: PROJECT_ROOT,
       timeout: 10000,
       stdio: 'inherit',
     });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@bin/utils/validate-publish.js` around lines 141 - 146, Replace the
shell-based execSync calls that invoke node with execFileSync to avoid shell
parsing: locate the execSync invocations that pass a string like `node
"${nsValidatorPath}"` (and the earlier validator call at line ~119 that uses the
other validator path variable) and switch to calling execFileSync('node',
[nsValidatorPath], options) (and similarly for the other validator variable).
Keep the same options object (encoding, cwd, timeout, stdio) but pass them to
execFileSync; ensure you import/require execFileSync from child_process if not
already present.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@bin/utils/validate-publish.js`:
- Around line 140-149: The current guard around nsValidatorPath silently skips
the namespace validator when the file is missing; change this to fail-closed by
replacing the else branch so it aborts the publish with a non-zero exit (e.g.,
throw new Error or process.exit(1)) and a clear message that the validator
script at nsValidatorPath is required; ensure the block around execSync still
runs the validator via execSync(...) and that any thrown errors from execSync
propagate (or are caught and rethrown) so publishing cannot continue on missing
or failing namespace validation.

In `@scripts/validate-aiox-core-namespace.js`:
- Around line 57-62: The check currently only verifies
internal.name.endsWith('-internal'), allowing wrong scopes; update the
validation to require the correct npm scope as well (e.g.
internal.name.startsWith('`@aiox-core/`')) and ensure both conditions are true
before passing; modify the conditional around internal.name and the fail(...)
message to reflect and enforce that internal.name both begins with the target
scope (use the scope string used by this repo) and endsWith('-internal') so
names like '`@any-scope/foo-internal`' no longer pass.

---

Nitpick comments:
In `@bin/utils/validate-publish.js`:
- Around line 141-146: Replace the shell-based execSync calls that invoke node
with execFileSync to avoid shell parsing: locate the execSync invocations that
pass a string like `node "${nsValidatorPath}"` (and the earlier validator call
at line ~119 that uses the other validator path variable) and switch to calling
execFileSync('node', [nsValidatorPath], options) (and similarly for the other
validator variable). Keep the same options object (encoding, cwd, timeout,
stdio) but pass them to execFileSync; ensure you import/require execFileSync
from child_process if not already present.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4655faac-8451-40c5-8d8a-f43194d9dc82

📥 Commits

Reviewing files that changed from the base of the PR and between 342ef63 and edda142.

📒 Files selected for processing (5)
  • .aiox-core/install-manifest.yaml
  • .aiox-core/package.json
  • bin/utils/validate-publish.js
  • package.json
  • scripts/validate-aiox-core-namespace.js

Comment thread bin/utils/validate-publish.js Outdated
Comment thread scripts/validate-aiox-core-namespace.js
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>
@rafaelscosta
rafaelscosta dismissed coderabbitai[bot]’s stale review May 17, 2026 13:16

Addressed in 7d4fd5e. (1) Switched both validator invocations from execSync(shell-string) to execFileSync(node, [path]). (2) Fail-closed when validate-aiox-core-namespace.js is missing (was silently SKIP — exactly the pattern that allowed the original drift). (3) Added @aiox-squads/ scope startsWith check before the -internal suffix check so @any-scope/foo-internal no longer passes. Also regenerated install-manifest.yaml — CI was failing on stale hash.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
bin/utils/validate-publish.js (1)

148-160: 💤 Low value

Add a PASS message after successful namespace validation for consistency.

Check 4 (dependency completeness) prints PASS: .aiox-core dependency completeness validated after the validator succeeds (line 125), but Check 5 does not print a corresponding PASS message. This makes the gate output inconsistent and less clear when debugging successful runs.

Suggested fix
   try {
     execFileSync('node', [nsValidatorPath], {
       encoding: 'utf8',
       cwd: PROJECT_ROOT,
       timeout: 10000,
       stdio: 'inherit',
     });
+    console.log('PASS: .aiox-core/package.json namespace/version sync validated');
   } catch (_nsErr) {
     console.error('FAIL: .aiox-core/package.json namespace/version drift detected');
     console.error('  Fix: Run "node scripts/validate-aiox-core-namespace.js" to see details');
     passed = false;
   }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@bin/utils/validate-publish.js` around lines 148 - 160, The namespace/version
validator block currently only logs failure; after the successful execFileSync
call (the try branch that runs node with nsValidatorPath), add a success log
consistent with Check 4 — e.g., call console.log('PASS: .aiox-core
namespace/version validated') and ensure the existing passed variable remains
true; locate the execFileSync invocation that references nsValidatorPath and
insert the PASS message immediately after it so Check 5 prints a success line on
successful validation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@bin/utils/validate-publish.js`:
- Around line 148-160: The namespace/version validator block currently only logs
failure; after the successful execFileSync call (the try branch that runs node
with nsValidatorPath), add a success log consistent with Check 4 — e.g., call
console.log('PASS: .aiox-core namespace/version validated') and ensure the
existing passed variable remains true; locate the execFileSync invocation that
references nsValidatorPath and insert the PASS message immediately after it so
Check 5 prints a success line on successful validation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 29d96dbc-6f49-431a-90c0-f80ab541232c

📥 Commits

Reviewing files that changed from the base of the PR and between edda142 and 7d4fd5e.

📒 Files selected for processing (3)
  • .aiox-core/install-manifest.yaml
  • bin/utils/validate-publish.js
  • scripts/validate-aiox-core-namespace.js
✅ Files skipped from review due to trivial changes (1)
  • .aiox-core/install-manifest.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/validate-aiox-core-namespace.js

coderabbitai[bot]
coderabbitai Bot previously approved these changes May 17, 2026
rafaelscosta added a commit that referenced this pull request May 17, 2026
…jections

PR #745 added a "Release Procedure (NON-NEGOTIABLE Reference)" section
to .aiox-core/development/agents/devops.md but `npm run sync:ide` was
not run before that PR merged, leaving the four IDE projections
drifted from source:

- .claude/skills/AIOX/agents/devops/SKILL.md
- .codex/agents/devops.md
- .gemini/rules/AIOX/agents/devops.md
- .kimi/skills/aiox-devops/SKILL.md

This commit runs `sync:ide` and commits the resulting projections.

The CI Compatibility Parity Gate + IDE Command Sync Validation + the
overall Validation Summary were failing on this branch because they
inherit the drifted state from main. This unblocks both #747 (path
mismatch) and #746 (internal package.json rebrand).

Followup note: the SOP itself should include a step in the post-merge
checklist that says "run sync:ide after any change to
.aiox-core/development/agents/*.md and commit the resulting
projections." Will add to docs/guides/release-procedure.md in a
follow-up if it's not already there.
…jections

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
@rafaelscosta
rafaelscosta merged commit ef7a352 into main May 17, 2026
40 checks passed
@rafaelscosta
rafaelscosta deleted the fix/aiox-core-internal-package-json branch May 17, 2026 13:54
rafaelscosta added a commit that referenced this pull request May 17, 2026
#741) (#747)

* fix: align legacy path references with current directory layout (closes #741)

The framework directory layout was reorganized at some point with templates,
checklists, tasks, agents, workflows, and agent-teams moving under `.aiox-core/`
subdirectories (`product/`, `development/`), but ~70 references across docs,
tasks, and the knowledge base never followed. The result: `@po
*validate-story-draft` (and other story-flow steps) tries to load template
paths like `aiox-core/templates/story-tmpl.yaml` that no longer exist, breaking
the Story Development Cycle at the validation gate as reported by
@renatolhamas in #741.

## Mapping applied

| Legacy path | Current path |
|---|---|
| `aiox-core/templates/<X>` | `.aiox-core/product/templates/<X>` |
| `aiox-core/checklists/<X>` | `.aiox-core/product/checklists/<X>` |
| `aiox-core/agents/<X>` | `.aiox-core/development/agents/<X>` |
| `aiox-core/tasks/<X>` | `.aiox-core/development/tasks/<X>` |
| `aiox-core/workflows/<X>` | `.aiox-core/development/workflows/<X>` |
| `aiox-core/agent-teams/<X>` | `.aiox-core/development/agent-teams/<X>` |
| `aiox-core/data/<X>` | `.aiox-core/data/<X>` (data did NOT move into a subdir; only the prefix gets the dot) |

Note the leading dot: `aiox-core/` → `.aiox-core/`. The post-reorganization
codebase already uses the dotted form (`.aiox-core/...`); only the legacy
non-dotted references needed updating. A negative-lookbehind `(?<![\.])` in the
substitution script protects existing dotted references from being rewritten
twice.

## Files touched (17 — one extra came in from the pre-commit hook
regenerating `entity-registry.yaml`)

- **Runtime-affecting (story flow, agent flow):**
  - `.aiox-core/development/tasks/validate-next-story.md` (the file @renatolhamas pointed at — Line 228 was the trigger)
  - `.aiox-core/development/tasks/dev-validate-next-story.md`
  - `.aiox-core/development/tasks/create-next-story.md`
  - `.aiox-core/development/tasks/sm-create-next-story.md`
  - `.aiox-core/development/tasks/modify-agent.md`
  - `.aiox-core/development/tasks/modify-task.md`
  - `.aiox-core/development/tasks/architect-analyze-impact.md`
  - `.aiox-core/development/tasks/pr-automation.md`
- **Documentation (operator-facing):**
  - `.aiox-core/user-guide.md`
  - `.aiox-core/core/docs/component-creation-guide.md`
  - `.aiox-core/data/aiox-kb.md`
  - `docs/core-architecture.md` (+ pt/es/zh localizations)
  - `docs/guides/agents/traces/ux-design-expert-execution-trace.md`
- **Generated (regenerated by pre-commit hook, not authored):**
  - `.aiox-core/data/entity-registry.yaml`

## Method

Substitution was scripted (not freehand `sed`) with a negative-lookbehind
guard `(?<![\.])aiox-core/<subdir>/` so already-correct dotted references
stay intact. Audit verifies zero remaining matches across `.aiox-core/` and
`docs/`:

```
$ grep -rnE "['\\\`\\\"]aiox-core/(templates|tasks|checklists|agents|data|workflows|agent-teams)/" .aiox-core/ docs/ | grep -v "\\.aiox-core" | wc -l
0
```

## Out of scope (deferred)

Other legacy refs that exist in the codebase but were not part of the
reorganization that #741 reports:

- `aiox-core/core-config.yaml` (root-level config, not a subdir reorg)
- `aiox-core/tools/mcp/clickup.yaml` (only 1 occurrence in aiox-kb.md — needs separate decision on where this should live, will follow up)

These are 1-off references that don't break the story flow and need their
own decision per ref.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: regenerate install-manifest after path-ref updates

The 17 file rewrites in the previous commit changed content hashes that
the install-manifest tracks. CI Install Manifest Validation was failing
on the stale hash; regenerating brings it back in sync.

Also picks up entity-registry refresh from the IDS pre-commit hook.

* chore(sync): propagate devops.md release-procedure section to IDE projections

PR #745 added a "Release Procedure (NON-NEGOTIABLE Reference)" section
to .aiox-core/development/agents/devops.md but `npm run sync:ide` was
not run before that PR merged, leaving the four IDE projections
drifted from source:

- .claude/skills/AIOX/agents/devops/SKILL.md
- .codex/agents/devops.md
- .gemini/rules/AIOX/agents/devops.md
- .kimi/skills/aiox-devops/SKILL.md

This commit runs `sync:ide` and commits the resulting projections.

The CI Compatibility Parity Gate + IDE Command Sync Validation + the
overall Validation Summary were failing on this branch because they
inherit the drifted state from main. This unblocks both #747 (path
mismatch) and #746 (internal package.json rebrand).

Followup note: the SOP itself should include a step in the post-merge
checklist that says "run sync:ide after any change to
.aiox-core/development/agents/*.md and commit the resulting
projections." Will add to docs/guides/release-procedure.md in a
follow-up if it's not already there.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
rafaelscosta added a commit that referenced this pull request May 18, 2026
* chore(release): bump to 5.2.7 — consolidate PRs #744-#750 from 5.2.6

Consolidates 7 PRs merged after the 5.2.6 release. None of them
required an immediate hotfix on their own, but together they unblock
cohort students from a real CI/CD failure mode (#739 Bug 1) and
remove three sources of registry drift.

## What ships in 5.2.7

- **#744** (66b302a) — Pipeline hardening: `publish_legacy_aiox_core` race fix,
  smoke timeout 90s→240s with dual visibility check, structured notify summary,
  Windows path escape fix via WORKSPACE_DIR env var. Plus the canonical
  `docs/guides/release-procedure.md` SOP.
- **#745** (342ef63) — Ecosystem alignment: `installation-troubleshooting.md`
  Issue 10 (install-side recovery for the npm-hijack symptom), aiox-pro-access.md
  link, slim wrappers for publish-npm.md/release-management.md tasks pointing
  at the SOP, devops.md Release Procedure section.
- **#746** (ef7a352) — Internal `.aiox-core/package.json` rebranded
  `@aiox-fullstack/core@4.31.1` → `@aiox-squads/core-internal@5.2.7` (private,
  no phantom peerDeps). New `scripts/validate-aiox-core-namespace.js` (5-rule
  gate) wired into `validate:publish`. Closes #739 Bug 2.
- **#747** (e5cd355) — 70 substitutions across 17 files realigning legacy
  `aiox-core/{templates,checklists,agents,tasks,workflows,agent-teams}/<X>`
  references to current `.aiox-core/...` layout. Unblocks
  `@po *validate-story-draft`. Closes #741.
- **#748** (1f97f6f) — IDS `extractPurpose()` rewritten as strict priority
  chain (frontmatter → ## Purpose → ## Overview → # Title → fallback).
  Removed body-level regex that picked up example transcripts as
  purposes. New `syncSelfRegistryEntry()` writes sentinel
  `sha256:<self-reference>` checksum for the registry's own record.
- **#749** (70fa5e2) — `looksLikePlaceholder()` filter excludes 16 garbage
  purposes (`{Brief...}`, `{{TASK_TITLE}}`, `${context.componentName}`).
- **#750** (21782cc) — Installer honors `--ci` / `--yes` / `--skipPrompts`
  flags at the CLAUDE.md merge prompt. Non-interactive runs no longer block
  waiting for keyboard input. Closes #739 Bug 1.

## Version sites bumped (5 — up from 4 in the previous SOP)

- `package.json` (root): 5.2.6 → 5.2.7
- `compat/aiox-core/package.json`: version + dep["@aiox-squads/core"] 5.2.6 → 5.2.7
- `packages/installer/package.json`: 3.3.5 → 3.3.6 (#750 touched installer src)
- `.aiox-core/package.json` (internal): 5.2.6 → 5.2.7 (validate-aiox-core-namespace
  enforces lockstep with root — new in 5.2.7, first release under the gate)
- `package-lock.json` refresh
- `CHANGELOG.md`: new [5.2.7] entry
- `docs/guides/release-procedure.md`: bump the "4 sites" rule to "5 sites"
  reflecting the validate-aiox-core-namespace gate added in PR #746

## Validation

- `npm run lint` → exit 0
- `npm run test:ci` → 8510 passed (151 skipped), 344/355 suites, 229s
- `npx jest tests/installer/ --no-coverage` → 276/276 pass
- `npm run validate:publish` → PASS (12911 files; namespace sync verified)

Pro install hijack fix (#742) shipped in 5.2.6 and remains in production —
this release does not re-iterate it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: address CodeRabbit nitpick on release-procedure.md lockstep wording

PR #751 CodeRabbit review flagged that the "Bump all five version sites in
lockstep" wording was ambiguous — the table below explicitly treats
`packages/installer/package.json` as conditional ("patch bump if installer
changed; otherwise leave"). Operators reading only line 36 could over-bump
the installer.

Reworded to distinguish:
- Root + internal manifest + compat: MUST stay in lockstep at same version
- packages/installer: bumped ONLY when installer source changed (not every release)

Also explicit on the two failure-mode detection layers:
- Smoke tests (catch silent publish mismatches)
- validate-aiox-core-namespace.js wired into validate:publish (rule 4 enforces lockstep)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tuanmedeiros pushed a commit to tuanmedeiros/aios-core-synkraay that referenced this pull request Jun 2, 2026
…ate (SynkraAI#739 Bug 2) (SynkraAI#746)

* fix: rebrand internal .aiox-core/package.json + add namespace drift gate

Closes the Bug 2 follow-up from SynkraAI#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 SynkraAI#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 SynkraAI#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 SynkraAI#747. The release-procedure
section added to devops.md by PR SynkraAI#745 was not synced to the four IDE
projections before SynkraAI#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>
tuanmedeiros pushed a commit to tuanmedeiros/aios-core-synkraay that referenced this pull request Jun 2, 2026
SynkraAI#741) (SynkraAI#747)

* fix: align legacy path references with current directory layout (closes SynkraAI#741)

The framework directory layout was reorganized at some point with templates,
checklists, tasks, agents, workflows, and agent-teams moving under `.aiox-core/`
subdirectories (`product/`, `development/`), but ~70 references across docs,
tasks, and the knowledge base never followed. The result: `@po
*validate-story-draft` (and other story-flow steps) tries to load template
paths like `aiox-core/templates/story-tmpl.yaml` that no longer exist, breaking
the Story Development Cycle at the validation gate as reported by
@renatolhamas in SynkraAI#741.

## Mapping applied

| Legacy path | Current path |
|---|---|
| `aiox-core/templates/<X>` | `.aiox-core/product/templates/<X>` |
| `aiox-core/checklists/<X>` | `.aiox-core/product/checklists/<X>` |
| `aiox-core/agents/<X>` | `.aiox-core/development/agents/<X>` |
| `aiox-core/tasks/<X>` | `.aiox-core/development/tasks/<X>` |
| `aiox-core/workflows/<X>` | `.aiox-core/development/workflows/<X>` |
| `aiox-core/agent-teams/<X>` | `.aiox-core/development/agent-teams/<X>` |
| `aiox-core/data/<X>` | `.aiox-core/data/<X>` (data did NOT move into a subdir; only the prefix gets the dot) |

Note the leading dot: `aiox-core/` → `.aiox-core/`. The post-reorganization
codebase already uses the dotted form (`.aiox-core/...`); only the legacy
non-dotted references needed updating. A negative-lookbehind `(?<![\.])` in the
substitution script protects existing dotted references from being rewritten
twice.

## Files touched (17 — one extra came in from the pre-commit hook
regenerating `entity-registry.yaml`)

- **Runtime-affecting (story flow, agent flow):**
  - `.aiox-core/development/tasks/validate-next-story.md` (the file @renatolhamas pointed at — Line 228 was the trigger)
  - `.aiox-core/development/tasks/dev-validate-next-story.md`
  - `.aiox-core/development/tasks/create-next-story.md`
  - `.aiox-core/development/tasks/sm-create-next-story.md`
  - `.aiox-core/development/tasks/modify-agent.md`
  - `.aiox-core/development/tasks/modify-task.md`
  - `.aiox-core/development/tasks/architect-analyze-impact.md`
  - `.aiox-core/development/tasks/pr-automation.md`
- **Documentation (operator-facing):**
  - `.aiox-core/user-guide.md`
  - `.aiox-core/core/docs/component-creation-guide.md`
  - `.aiox-core/data/aiox-kb.md`
  - `docs/core-architecture.md` (+ pt/es/zh localizations)
  - `docs/guides/agents/traces/ux-design-expert-execution-trace.md`
- **Generated (regenerated by pre-commit hook, not authored):**
  - `.aiox-core/data/entity-registry.yaml`

## Method

Substitution was scripted (not freehand `sed`) with a negative-lookbehind
guard `(?<![\.])aiox-core/<subdir>/` so already-correct dotted references
stay intact. Audit verifies zero remaining matches across `.aiox-core/` and
`docs/`:

```
$ grep -rnE "['\\\`\\\"]aiox-core/(templates|tasks|checklists|agents|data|workflows|agent-teams)/" .aiox-core/ docs/ | grep -v "\\.aiox-core" | wc -l
0
```

## Out of scope (deferred)

Other legacy refs that exist in the codebase but were not part of the
reorganization that SynkraAI#741 reports:

- `aiox-core/core-config.yaml` (root-level config, not a subdir reorg)
- `aiox-core/tools/mcp/clickup.yaml` (only 1 occurrence in aiox-kb.md — needs separate decision on where this should live, will follow up)

These are 1-off references that don't break the story flow and need their
own decision per ref.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: regenerate install-manifest after path-ref updates

The 17 file rewrites in the previous commit changed content hashes that
the install-manifest tracks. CI Install Manifest Validation was failing
on the stale hash; regenerating brings it back in sync.

Also picks up entity-registry refresh from the IDS pre-commit hook.

* chore(sync): propagate devops.md release-procedure section to IDE projections

PR SynkraAI#745 added a "Release Procedure (NON-NEGOTIABLE Reference)" section
to .aiox-core/development/agents/devops.md but `npm run sync:ide` was
not run before that PR merged, leaving the four IDE projections
drifted from source:

- .claude/skills/AIOX/agents/devops/SKILL.md
- .codex/agents/devops.md
- .gemini/rules/AIOX/agents/devops.md
- .kimi/skills/aiox-devops/SKILL.md

This commit runs `sync:ide` and commits the resulting projections.

The CI Compatibility Parity Gate + IDE Command Sync Validation + the
overall Validation Summary were failing on this branch because they
inherit the drifted state from main. This unblocks both SynkraAI#747 (path
mismatch) and SynkraAI#746 (internal package.json rebrand).

Followup note: the SOP itself should include a step in the post-merge
checklist that says "run sync:ide after any change to
.aiox-core/development/agents/*.md and commit the resulting
projections." Will add to docs/guides/release-procedure.md in a
follow-up if it's not already there.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tuanmedeiros pushed a commit to tuanmedeiros/aios-core-synkraay that referenced this pull request Jun 2, 2026
…m 5.2.6 (SynkraAI#751)

* chore(release): bump to 5.2.7 — consolidate PRs SynkraAI#744-SynkraAI#750 from 5.2.6

Consolidates 7 PRs merged after the 5.2.6 release. None of them
required an immediate hotfix on their own, but together they unblock
cohort students from a real CI/CD failure mode (SynkraAI#739 Bug 1) and
remove three sources of registry drift.

## What ships in 5.2.7

- **SynkraAI#744** (d949918) — Pipeline hardening: `publish_legacy_aiox_core` race fix,
  smoke timeout 90s→240s with dual visibility check, structured notify summary,
  Windows path escape fix via WORKSPACE_DIR env var. Plus the canonical
  `docs/guides/release-procedure.md` SOP.
- **SynkraAI#745** (b728a39) — Ecosystem alignment: `installation-troubleshooting.md`
  Issue 10 (install-side recovery for the npm-hijack symptom), aiox-pro-access.md
  link, slim wrappers for publish-npm.md/release-management.md tasks pointing
  at the SOP, devops.md Release Procedure section.
- **SynkraAI#746** (dea939e) — Internal `.aiox-core/package.json` rebranded
  `@aiox-fullstack/core@4.31.1` → `@aiox-squads/core-internal@5.2.7` (private,
  no phantom peerDeps). New `scripts/validate-aiox-core-namespace.js` (5-rule
  gate) wired into `validate:publish`. Closes SynkraAI#739 Bug 2.
- **SynkraAI#747** (e874103) — 70 substitutions across 17 files realigning legacy
  `aiox-core/{templates,checklists,agents,tasks,workflows,agent-teams}/<X>`
  references to current `.aiox-core/...` layout. Unblocks
  `@po *validate-story-draft`. Closes SynkraAI#741.
- **SynkraAI#748** (e8f8761) — IDS `extractPurpose()` rewritten as strict priority
  chain (frontmatter → ## Purpose → ## Overview → # Title → fallback).
  Removed body-level regex that picked up example transcripts as
  purposes. New `syncSelfRegistryEntry()` writes sentinel
  `sha256:<self-reference>` checksum for the registry's own record.
- **SynkraAI#749** (6113083) — `looksLikePlaceholder()` filter excludes 16 garbage
  purposes (`{Brief...}`, `{{TASK_TITLE}}`, `${context.componentName}`).
- **SynkraAI#750** (1d16b51) — Installer honors `--ci` / `--yes` / `--skipPrompts`
  flags at the CLAUDE.md merge prompt. Non-interactive runs no longer block
  waiting for keyboard input. Closes SynkraAI#739 Bug 1.

## Version sites bumped (5 — up from 4 in the previous SOP)

- `package.json` (root): 5.2.6 → 5.2.7
- `compat/aiox-core/package.json`: version + dep["@aiox-squads/core"] 5.2.6 → 5.2.7
- `packages/installer/package.json`: 3.3.5 → 3.3.6 (SynkraAI#750 touched installer src)
- `.aiox-core/package.json` (internal): 5.2.6 → 5.2.7 (validate-aiox-core-namespace
  enforces lockstep with root — new in 5.2.7, first release under the gate)
- `package-lock.json` refresh
- `CHANGELOG.md`: new [5.2.7] entry
- `docs/guides/release-procedure.md`: bump the "4 sites" rule to "5 sites"
  reflecting the validate-aiox-core-namespace gate added in PR SynkraAI#746

## Validation

- `npm run lint` → exit 0
- `npm run test:ci` → 8510 passed (151 skipped), 344/355 suites, 229s
- `npx jest tests/installer/ --no-coverage` → 276/276 pass
- `npm run validate:publish` → PASS (12911 files; namespace sync verified)

Pro install hijack fix (SynkraAI#742) shipped in 5.2.6 and remains in production —
this release does not re-iterate it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: address CodeRabbit nitpick on release-procedure.md lockstep wording

PR SynkraAI#751 CodeRabbit review flagged that the "Bump all five version sites in
lockstep" wording was ambiguous — the table below explicitly treats
`packages/installer/package.json` as conditional ("patch bump if installer
changed; otherwise leave"). Operators reading only line 36 could over-bump
the installer.

Reworded to distinguish:
- Root + internal manifest + compat: MUST stay in lockstep at same version
- packages/installer: bumped ONLY when installer source changed (not every release)

Also explicit on the two failure-mode detection layers:
- Smoke tests (catch silent publish mismatches)
- validate-aiox-core-namespace.js wired into validate:publish (rule 4 enforces lockstep)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: docs Documentation (docs/) area: installer Installer and setup (packages/installer/)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant