4.8 KiB
ADDED Requirements
Requirement: Domain-first folder layout
The monorepo SHALL organise packages into domain folders that map 1:1 to plugins in the suaveplan-skills marketplace. The layout is packages/<plugin>/<package>/ where <plugin> is the marketplace plugin name without the suaveplan- prefix and <package> is the npm name without the @suaveplan/ prefix. Tier (universal / browser / react / r3f / server / python) is NOT a directory — it is determined per-package by package.json deps, the "browser" field, peer deps, and engines.
Scenario: Every package lives under a plugin folder
- WHEN any package directory is inspected
- THEN its path is
packages/<plugin>/<package>/AND<plugin>matches a plugin defined in the marketplace assignment manifest
Scenario: No tier-named top-level folders
- WHEN the repository root is listed
- THEN there are no
universal/,browser/,react/,r3f/,api/,server/,finance/,mcp/,python/, orgaming/directories
Scenario: Cross-tier domain co-location
- WHEN a domain has packages spanning multiple tiers (e.g.
drivewith universal core, browser P2P plugin, react UI, and api plugin) - THEN all of those packages live under the same plugin folder (
packages/drive/)
Requirement: Plugin → package assignment uniqueness
Every package SHALL appear in exactly one plugin folder. No package may be present in two plugins.
Scenario: Assignment manifest has unique entries
- WHEN
scripts/folder-reorg/assignment.ymlis parsed - THEN the union of all packages across all plugins contains no duplicates
Requirement: Generated MANIFEST.md replaces @suaveplan/overview
The repository SHALL contain a generated MANIFEST.md at the root that lists every plugin, every package, the inferred tier per package, the dependency graph, and a tier-overlay view. The manifest is regenerated by bun scripts/generate-manifest.ts and a --check mode validates that the committed file is up-to-date.
Scenario: MANIFEST.md is up to date
- WHEN
bun scripts/generate-manifest.ts --checkis run - THEN it exits with status 0 AND the committed
MANIFEST.mdmatches the regenerated output byte-for-byte
Scenario: @suaveplan/overview is absent
- WHEN the repository is searched for
@suaveplan/overview - THEN no
package.jsondeclares it as a dep AND no source file imports it AND no folder namedoverview/exists underpackages/
Requirement: FOLDERS.yml is removed
FOLDERS.yml SHALL NOT exist at the repository root. The folder layout is self-describing via the packages/ tree and the per-tier overlay lives in MANIFEST.md.
Scenario: FOLDERS.yml absent
- WHEN the repository root is listed
- THEN no file named
FOLDERS.ymlis present
Requirement: Tier inference from package.json
scripts/generate-manifest.ts SHALL infer each package's tier deterministically from its package.json and source layout, in this priority order: python → r3f → react → browser → server → universal.
- python: package directory name has prefix
python-ORpackage.jsonhas a top-level"python"field. - r3f:
peerDependenciesincludes@react-three/fiberORthree. - react:
peerDependenciesincludesreact(and tier is not r3f). - browser:
package.jsonhas a"browser"field ORengineslacksnode. - server:
binfield is set OR direct dependencies includebun:sqlite,node:fs,node:net,node:cluster,pg,ioredis, or similar Node-only modules. - universal: none of the above match.
Scenario: Tier inference is deterministic
- WHEN
scripts/generate-manifest.ts --checkis run twice without source changes - THEN both runs produce identical tier classifications for every package
Requirement: Path references in CLAUDE.md and openspec/AGENTS.md updated
CLAUDE.md and openspec/AGENTS.md SHALL reference packages via packages/<plugin>/<pkg>/ paths. References to legacy universal/<domain>/<pkg>/ or packages/<tier>/<pkg>/ paths SHALL NOT exist in either file.
Scenario: No legacy path references
- WHEN
CLAUDE.mdandopenspec/AGENTS.mdare searched for the regex(^|[^a-z])(universal|browser|react|r3f|server|finance|mcp|python|gaming)/[a-z] - THEN zero matches are found in either file
Requirement: Migration is reversible until merged
The folder migration SHALL execute via git mv (preserving file history) in a single commit, allowing git revert to restore the legacy layout if a regression is found before merge.
Scenario: File history preserved
- WHEN
git log --follow packages/<any-plugin>/<any-existing-pkg>/src/<any-file>.tsis run after migration - THEN the log shows commits from before the migration (i.e.
git mvpreserved history, notrm+add)