feat(install): wire react-native preset into install.sh (closes multi-stack umbrella #646) - #714
Merged
Merged
Conversation
…-stack umbrella #646) Second half of the multi-stack-install-wiring-iphase umbrella (#646 Stage 1): react-spa was wired in #713; this wires react-native, making `install.sh react-native` a fully installable stack. ts-server/react-next/react-spa paths stay byte-identical (verified via --dry-run: 0 react-native leak into the prior stacks). RN diverges from the web stacks (wired per the ACTUAL preset layout, not by blind-mirroring react-next — T13/T16): - TWO baseline eslint configs (Expo vs bare-RN), picked by detecting the consumer's deps (`"expo"` in package.json → eslint.config.expo.mjs; else eslint.config.bare-rn.mjs) → eslint.config.mjs. The shared eslint.config.rn-common.mjs (BOTH baselines import it) is ALWAYS copied so the import resolves at ESLint load. - NO custom eslint-rules (no preset barrel) → no eslint-rules copy branch. - NO playwright (native / web-less; E2E is Detox/Maestro, not wired by install). - REACT_NATIVE_DEVDEPS = RN eslint toolchain only (eslint-config-expo, @react-native/eslint-config + @eslint/eslintrc via FlatCompat, eslint-plugin-react-native(-a11y)). - eslint.config.rn-common.mjs registered in ignore_shipped_configs candidates[] — the gh-531 #531 prettier-ignore drift guard caught the new basename escaping the conditional ignore (rules-as-tests working as intended); fixed. Self-application gates extended: - principle 09 SHIPPED_DOCS↔REQUIRED_HEADER_DOCS: +3 react-native docs (count 22→25, shape sentinel 69→72, SHIPPED_DOC_PREFIXES += packages/preset-react-native/). - principle 05: react-native RULES.md is static (non-manifest-rendered) → out of the manifest-drift check's scope (scope comment generalized to both new presets). - new paired-negative test tests/install-sh/react-native-wiring.test.sh (RED→GREEN: Expo+bare-RN detect, rn-common import resolution, non-vacuity arm) wired into audit-self.yml. Prior-art: skipped — integration wiring (install.sh react-native branches + principle-test registration) for the react-native preset whose capabilities were already SSOT-cited in the #646 preset PRs (#142 Expo baseline ADOPT, #143 bare-RN baseline ADOPT); no new dependency, no new >=80-LOC file under packages/ (the test is under tests/), no new capability.
artyhoo
enabled auto-merge (squash)
June 24, 2026 10:59
This was referenced Jun 24, 2026
artyhoo
added a commit
that referenced
this pull request
Jun 26, 2026
Replace the proprietary "All Rights Reserved" LICENSE.md with the canonical Functional Source License v1.1 (Copyright 2026 Art) — each version auto-converts to Apache-2.0 on its second anniversary. Set license: "FSL-1.1-ALv2" across the root workspace package.json and all 7 workspace packages (core, lint-config, meta-factory, preset-next-15-canonical, preset-react-native, preset-react-spa, runtime-bridge), mirror the field in package-lock.json, and update the README license badge + License section. Scope note: the prepared edits covered 5 packages; preset-react-native (#714) and preset-react-spa (#713) merged after and were still UNLICENSED — included here so FSL applies consistently across every workspace package (same concern). Prior-art: skipped — license application (FSL-1.1-ALv2), no new capability or dependency.
This was referenced Jun 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Second half of the
multi-stack-install-wiring-iphaseumbrella (issue #646 Stage 1). react-spa was wired in #713; this wires react-native, makinginstall.sh react-nativea fully installable stack and closing the umbrella (both presets now installable). ts-server/react-next/react-spa paths stay byte-identical (verified--dry-run: 0 react-native leak into the prior stacks).How (RN diverges — wired per the actual preset, not by blind-mirroring react-next)
"expo"inpackage.json→eslint.config.expo.mjs; elseeslint.config.bare-rn.mjs→eslint.config.mjs. The sharedeslint.config.rn-common.mjs(which both baselinesimport) is always copied so the import resolves at ESLint load.REACT_NATIVE_DEVDEPS= RN eslint toolchain only (eslint-config-expo,@react-native/eslint-config+@eslint/eslintrcvia FlatCompat,eslint-plugin-react-native(-a11y)).eslint.config.rn-common.mjsregistered inignore_shipped_configscandidates[]— thegh-531prettier-ignore drift guard caught the new basename escaping the conditional ignore (rules-as-tests working as intended); fixed in the same change.4) react-native),--refreshauto-detect.Self-application gates extended:
22→25, shape sentinel69→72,SHIPPED_DOC_PREFIXES += packages/preset-react-native/).RULES.mdis static (non-manifest-rendered) → out of manifest-drift scope (scope comment generalized to both new presets).tests/install-sh/react-native-wiring.test.sh(RED→GREEN) + wired intoaudit-self.yml(meta-all-wiredgreen).Verification (evidence, per T3)
Umbrella closure
Writes
.claude/orchestrator-prompts/multi-stack-install-wiring-iphase/done.md(both presets wired: react-spa #713 + react-native here).§1.7 Forward-check applied
Checked against active disciplines. principle 02 (paired-negative): the new test runs a fabricated relative-import through the same resolver and asserts it is flagged unresolved (
tests/install-sh/react-native-wiring.test.sh:78), so the import-resolution green is real, not a vacuous empty-loop. principle 09 (doc-authority): the 3 newly-registered RN docs (packages/core/principles/09-doc-authority-hierarchy.ts:98) each already carry anAuthoritative-forheader (install's author-side verify loop + the principle-09 test both pass). #531 prettier-ignore guard: the new shipped basename was registered ininstall.shignore_shipped_configscandidates[]aftergh-531-shipped-prettier.test.shflagged it — the drift guard did its job. no-paid-llm-in-ci: the new test + workflow step are deterministic bash, zero API calls. capability-commit gate: no new dependency, no new ≥80-LOC file underpackages/(the test is undertests/) → not a capability commit; escape-hatchPrior-art:trailer on the commit.§1.7 Backward-check applied
Swept the complete set of artefacts under scope ("react-native is an installable stack"). install.sh touchpoint sweep: every react-spa touchpoint (
grep -nE 'STACK.*react-spa') has a mirrored react-native branch, adjusted for RN's divergences — arg/guard/menu/refresh-detect/SHIPPED_DOCS/RULES+ARCH/audit-self/templates/dev-deps; the templates branch (install.sh:1102region) detects Expo-vs-bare and always lands rn-common; no eslint-rules branch and no playwright (RN has neither).--dry-runconfirms RN lands its own files and ts-server/react-next/react-spa emit 0 react-native references (byte-identical). shipped-config completeness:gh-531-shipped-prettier.test.sh:66greps everycopy_saferoot-config target and asserts it is incandidates[];eslint.config.rn-common.mjsis now registered and that arm is green. install-sh test-wiring sweep: the new test is wired at.github/workflows/audit-self.yml:307andmeta-all-wired.test.shis green (non-vacuous). principle 05 exemption (explicit): RNRULES.mdstatic-copy carve-out documented atpackages/core/principles/05-manifest-ssot.test.ts:26.Test plan
npm --prefix packages/core run test:principles— 229/229cd packages/core && npx tsc --noEmit— cleantests/install-sh/*.test.sh— 45/45install.sh {ts-server,react-next,react-spa,react-native} --dry-run— all complete; first three byte-identical; RN Expo/bare detect verified