react-native-insider 8.0.1 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,172 @@
1
+ # CODE-CATALOG.md
2
+
3
+ > Generated by Orbit Init | 2026-04-16 | react-native-insider v8.0.0
4
+
5
+ ## Overview
6
+
7
+ React Native bridge SDK wrapping native Insider iOS/Android SDKs. Single npm package with JS facade, TypeScript declarations, and native bridge modules. Now includes the **App Cards** module (Promise + callback hybrid API) and **identifier-scoped Message Center**.
8
+
9
+ ---
10
+
11
+ ## Entry Points
12
+
13
+ | File | Type | Description |
14
+ |------|------|-------------|
15
+ | `index.js` | Main entry | `RNInsider` static class — primary SDK facade. Re-exports `InsiderAppCardsError`, `InsiderAppCardsErrorCode` |
16
+ | `index.d.ts` | Type declarations | TypeScript module declaration for `react-native-insider` |
17
+
18
+ ---
19
+
20
+ ## JS Source Modules (`src/`)
21
+
22
+ ### Classes
23
+
24
+ | Class | File | Pattern | Description |
25
+ |-------|------|---------|-------------|
26
+ | `RNInsider` | `index.js` | Static facade | All-static class wrapping NativeModules.RNInsider. Entry point for SDK initialization, events, products, pages, recommendations, content optimizer, push, geofence, GDPR, message center, app cards |
27
+ | `RNInsiderUser` | `src/InsiderUser.js` | Builder (fluent) | User profile management. Singleton instance returned by `getCurrentUser()`. Setters for demographics, marketing optins, custom attributes, login/logout, `logoutResettingInsiderID` |
28
+ | `RNInsiderProduct` | `src/InsiderProduct.js` | Builder (fluent) | Product model with `requiredFields`, `optionalFields`, `customParameters`. Constructed via `createNewProduct()`, enriched via chainable setters |
29
+ | `RNInsiderEvent` | `src/InsiderEvent.js` | Builder (fluent) | Event builder. Created via `tagEvent(name)`, parameters added via typed setters, dispatched via `.build()` |
30
+ | `RNInsiderIdentifier` | `src/InsiderIdentifier.js` | Builder (fluent) | Identity builder for login. Accumulates email, phone, userID, custom identifiers into an object |
31
+ | `RNInsiderAppCards` | `src/InsiderAppCards.js` | Frozen singleton object | App cards module exposing `getCampaigns/markAsRead/markAsUnread/delete/view/click/clickButton`. Each method supports both Promise and completion-callback modes via `Util.resolveWithCallback` |
32
+ | `InsiderAppCard` | `src/InsiderAppCard.js` | Domain model | Rich app card with private fields (#) — id, type, isRead, images, content, buttons, action. Provides instance methods `markAsRead/markAsUnread/delete/view/click` |
33
+ | `InsiderAppCardButton` | `src/InsiderAppCard.js` | Domain model | Button on an app card. Holds id, appCardId, text, action, raw data. `click()` delegates to `InsiderAppCards.clickButton(this)` |
34
+ | `InsiderAppCardContent` | `src/InsiderAppCard.js` | Domain model | Title + description value object |
35
+ | `InsiderAppCardImage` | `src/InsiderAppCard.js` | Domain model | Image URL value object |
36
+ | `InsiderAppCardAction` | `src/InsiderAppCard.js` | Polymorphic base | `fromData()` factory dispatches on `data.type` (`deep_link`, `feedback`, `open_settings`) |
37
+ | `InsiderAppCardDeeplinkAction` | `src/InsiderAppCard.js` | Domain model | Deep link action — `url`, `deeplinkType`, `json`, `keysAndValues` |
38
+ | `InsiderAppCardFeedbackAction` | `src/InsiderAppCard.js` | Domain model | Feedback action marker |
39
+ | `InsiderAppCardOpenSettingsAction` | `src/InsiderAppCard.js` | Domain model | Open-settings action marker |
40
+ | `InsiderAppCardsCampaignResponse` | `src/InsiderAppCard.js` | Domain model | Wraps `items` from native into `appCards: InsiderAppCard[]` |
41
+ | `InsiderAppCardsError` | `src/InsiderAppCardsError.js` | Typed Error subclass | Extends `Error` with structured `code`. Static `from(error)` parses native bridge errors `{code, message}` or strings |
42
+
43
+ ### Enums / Constants
44
+
45
+ | Module | File | Values |
46
+ |--------|------|--------|
47
+ | `InsiderGender` | `src/InsiderGender.js` | `Male=0, Female=1, Other=2` |
48
+ | `InsiderCallbackType` | `src/InsiderCallbackType.js` | `NOTIFICATION_OPEN=0, INAPP_BUTTON_CLICK=1, TEMP_STORE_PURCHASE=2, TEMP_STORE_ADDED_TO_CART=3, TEMP_STORE_CUSTOM_ACTION=4, INAPP_SEEN=5, SESSION_STARTED=6` |
49
+ | `ContentOptimizerDataType` | `src/ContentOptimizerDataType.js` | `Content=0, Element=1` |
50
+ | `CloseButtonPosition` | `src/CloseButtonPosition.js` | `LEFT, RIGHT, NONE` |
51
+ | `InsiderAppCardsErrorCode` | `src/InsiderAppCardsError.js` | `UNKNOWN, SDK_NOT_INITIALIZED, INVALID_PARAMETER, NETWORK_ERROR, SERVER_ERROR, PARSE_ERROR` (string values) |
52
+
53
+ ### Utilities (`src/Util.js`)
54
+
55
+ | Function | Description |
56
+ |----------|-------------|
57
+ | `shouldNotProceed()` | Returns true if NativeModules.RNInsider is null/undefined |
58
+ | `generateJSONErrorString(error)` | Formats error as `[JavaScript Error] {error}` |
59
+ | `checkParameters(params)` | Validates array of `{type, value}` descriptors against typeof |
60
+ | `showParameterWarningLog(fnName, params)` | Emits `console.warn` with function name and invalid parameter details |
61
+ | `resolveWithCallback(promise, completion)` | **NEW.** Bridges Promise and callback APIs. If `completion` is a function, invokes `completion(err, value)`; otherwise returns the Promise |
62
+ | `isPlainObject(value)` | Checks if value is a plain JS object (not null, array, Date, etc.) |
63
+ | `detectType(value)` | Returns type string: boolean, date, numeric_array, string_array, integer, double, string, unknown |
64
+ | `parseObjectWithTypes(parameters)` | Converts plain object to typed array `[{key, type, value}]` for native bridge. Filters unknown types. Converts Dates to epoch millis |
65
+
66
+ ---
67
+
68
+ ## Native iOS (`ios/RNInsider/`)
69
+
70
+ | File | Class | Role |
71
+ |------|-------|------|
72
+ | `RNInsider.h/.m` | `RNInsider : NSObject <RCTBridgeModule>` | Main bridge module. Exports all RCT_EXPORT_METHOD bridge methods (init, user, product, event, content optimizer, push, recommendations, message center, app cards). Delegates events to RNNotificationHandler singleton. Runs on main queue |
73
+ | `RNNotificationHandler.h/.m` | `RNNotificationHandler : RCTEventEmitter <RCTBridgeModule>` | Singleton event emitter. Declares supportedEvents, sends native events to JS via `sendEventWithName:body:` |
74
+ | `RNUtils.h/.m` | `RNUtils` | Static utility methods: `parseProductFromRequiredFields:`, `parseEventFromEventName:`, `parseCustomParameters:`. Converts bridge data to native Insider SDK objects |
75
+
76
+ ### iOS Dependencies (RNInsider.podspec)
77
+
78
+ | Pod | Version | Purpose |
79
+ |-----|---------|---------|
80
+ | InsiderMobile | 15.0.0 | Core Insider iOS SDK |
81
+ | InsiderGeofence | 1.2.4 | Geofencing support |
82
+ | InsiderHybrid | 1.7.6 | Hybrid app bridge utilities |
83
+
84
+ ---
85
+
86
+ ## Native Android (`android/src/main/java/com/useinsider/react/`)
87
+
88
+ | File | Class | Role |
89
+ |------|-------|------|
90
+ | `RNInsiderModule.java` | `RNInsiderModule extends ReactContextBaseJavaModule` | Main bridge module. All `@ReactMethod` annotated methods (~80 total). Emits events via `RCTDeviceEventEmitter`. Handles init on main looper. Now includes app card bridges and `getMessageCenterDataWithIdentifiers`, `logoutResettingInsiderID` |
91
+ | `RNInsiderPackage.java` | `RNInsiderPackage implements ReactPackage` | Package registration for React Native module system |
92
+ | `RNUtils.java` | `RNUtils` | Static utilities: `parseProduct()`, `parseEvent()`, `parseCustomParameters()`, JSON↔ReadableMap converters. Converts ReadableMap/ReadableArray to native Insider SDK objects |
93
+
94
+ ### Android Dependencies (build.gradle)
95
+
96
+ | Dependency | Version | Purpose |
97
+ |------------|---------|---------|
98
+ | com.useinsider:insider | 16.0.1 | Core Insider Android SDK |
99
+ | com.useinsider:insiderhybrid | 1.3.4 | Hybrid app bridge |
100
+ | firebase-messaging | 24.0.0 | FCM push notifications |
101
+ | play-services-location | 21.3.0 | Geofencing |
102
+ | play-review | 2.0.1 | Native app review dialog |
103
+ | security-crypto | 1.1.0-alpha06 | Encrypted storage |
104
+ | androidx.lifecycle:lifecycle-process | 2.8.3 | App lifecycle |
105
+ | androidx.work:work-runtime | 2.9.1 | Background work |
106
+ | androidx.legacy:legacy-support-v4 | 1.0.0 | Legacy support |
107
+ | huawei hms:push | 6.13.0.300 | Huawei push notifications |
108
+ | huawei hms:location | 6.16.0.302 | Huawei geofencing |
109
+ | huawei hms:ads-identifier | 3.4.62.300 | Huawei ad identifier |
110
+
111
+ Build: Android Gradle Plugin 8.4.2, compileSdk 36, minSdk 24, namespace `com.useinsider.react`
112
+
113
+ ---
114
+
115
+ ## Tests (`__tests__/` and `src/__tests__/`)
116
+
117
+ | File | Scope | Key Coverage |
118
+ |------|-------|--------------|
119
+ | `__tests__/Insider.test.js` | Custom parameters flow | itemPurchased, itemAddedToCart, cartCleared, visitHomePage, visitListingPage, visitProductDetailPage, visitCartPage, itemAddedToWishlist, etc. Tests all 7 types + unknown filtering |
120
+ | `__tests__/Util.test.js` | Top-level Util usage | parseObjectWithTypes, detectType, isPlainObject — edge cases, type detection, null handling |
121
+ | `__tests__/getMessageCenterData.test.js` | Message center | UTC timezone validation, platform response handling (iOS unwrap vs Android direct), date validation, epoch string format |
122
+ | `__tests__/getMessageCenterDataWithIdentifiers.test.js` | Message center w/ identifiers | NEW. Validates identifier-scoped variant of message center fetch |
123
+ | `__tests__/setInternalBrowserCloseButtonPosition.test.js` | Browser close button | CloseButtonPosition enum values, parameter validation, platform-specific behavior |
124
+ | `src/__tests__/Util.test.js` | Util module | NEW. Direct Util coverage (resolveWithCallback, type detection) |
125
+ | `src/__tests__/InsiderAppCard.test.js` | Domain model | NEW. App card construction, action factory dispatch (deep_link/feedback/open_settings), private field access |
126
+ | `src/__tests__/InsiderAppCards.test.js` | App cards API | NEW. getCampaigns/markAsRead/markAsUnread/delete/view/click/clickButton — Promise + callback duality, error wrapping, parameter validation |
127
+ | `src/__tests__/InsiderAppCardsError.test.js` | Typed error | NEW. Error code mapping, `from()` factory parsing structured/string errors |
128
+
129
+ ### Test Mock (`__mocks__/react-native.js`)
130
+
131
+ Global mock providing: `NativeModules.RNInsider` (all methods as jest.fn() including app card bridges), `NativeEventEmitter` (listener management), `Platform` (default iOS).
132
+
133
+ ---
134
+
135
+ ## Example App (`example/`)
136
+
137
+ | File | Description |
138
+ |------|-------------|
139
+ | `App.tsx` | Demo app with screens: InitScreen (SDK init), UserScreen, ProductScreen, EventScreen |
140
+ | `example/android/` | Android project with google-services.json, Kotlin MainActivity/MainApplication |
141
+ | `example/ios/` | iOS project with Swift AppDelegate, Notification Service/Content extensions |
142
+
143
+ ---
144
+
145
+ ## CI/CD (`.github/workflows/`)
146
+
147
+ | Workflow | Trigger | Purpose |
148
+ |----------|---------|---------|
149
+ | `check-pull-request.yml` | PR events | Title format validation (MOB-xxxxx), auto-labeling, assignee |
150
+ | `create-release.yml` | Manual dispatch | Creates release branch, JIRA integration, GPG-signed commits |
151
+ | `publish-release.yml` | PR merged to master | npm publish, GPG-signed tags, dual-track (main + -nh variant), GitHub Deployments |
152
+
153
+ ---
154
+
155
+ ## Internal Specs (`docs/`)
156
+
157
+ | Path | Purpose |
158
+ |------|---------|
159
+ | `docs/app-cards/` | Internal feature specs for App Cards |
160
+ | `docs/message-center/` | Internal feature specs for Message Center |
161
+
162
+ ---
163
+
164
+ ## Configuration
165
+
166
+ | File | Purpose |
167
+ |------|---------|
168
+ | `package.json` | npm package definition (v8.0.0), Jest config, version source of truth |
169
+ | `RNInsider.podspec` | CocoaPods spec (reads version from package.json) |
170
+ | `android/build.gradle` | Android library build config, native SDK dependencies |
171
+ | `babel.config.js` | Babel with @react-native/babel-preset |
172
+ | `.npmignore` | Excludes example/, __tests__, .github, .claude, coverage from npm package |
@@ -0,0 +1,138 @@
1
+ # Orbit Project Configuration
2
+ # Generated: 2026-04-16
3
+ # Workflow version: 3.11
4
+
5
+ project:
6
+ name: react-native-insider
7
+ version: "8.0.0"
8
+ type: library
9
+ architecture: single-service
10
+ description: "React Native bridge SDK for Insider marketing platform — wraps native iOS/Android Insider SDKs and adds the App Cards module"
11
+
12
+ languages:
13
+ main:
14
+ - name: JavaScript
15
+ version: ES6+ (with private fields)
16
+ locations: ["./", "src/", "__tests__/", "__mocks__/"]
17
+ file_count: 30
18
+ - name: TypeScript
19
+ version: declarations
20
+ locations: ["./", "src/", "example/"]
21
+ file_count: 11
22
+ - name: "Objective-C"
23
+ locations: ["ios/RNInsider/", "example/ios/"]
24
+ file_count: 10
25
+ - name: Java
26
+ locations: ["android/src/main/java/com/useinsider/react/"]
27
+ file_count: 3
28
+ - name: Kotlin
29
+ locations: ["example/android/"]
30
+ file_count: 2
31
+ - name: Swift
32
+ locations: ["example/ios/InsiderExample/"]
33
+ file_count: 1
34
+ other:
35
+ - name: YAML
36
+ purpose: configuration
37
+ - name: JSON
38
+ purpose: configuration
39
+ - name: Gradle
40
+ purpose: build
41
+ - name: Ruby
42
+ purpose: podspec
43
+
44
+ frameworks:
45
+ main:
46
+ - name: React Native
47
+ version: "0.83.0"
48
+ category: cross-platform-bridge
49
+ - name: React
50
+ version: "19.2.0"
51
+ category: react
52
+ - name: InsiderMobile
53
+ version: "15.0.0"
54
+ category: ios-native-sdk
55
+ - name: InsiderGeofence
56
+ version: "1.2.4"
57
+ category: ios-geofence
58
+ - name: InsiderHybrid
59
+ version: "1.7.6"
60
+ category: ios-hybrid
61
+ - name: Insider Android SDK
62
+ version: "16.0.1"
63
+ category: android-native-sdk
64
+ - name: insiderhybrid (Android)
65
+ version: "1.3.4"
66
+ category: android-hybrid
67
+ support:
68
+ - name: Firebase Messaging
69
+ version: "24.0.0"
70
+ category: push-notifications
71
+ - name: "Huawei HMS Push"
72
+ version: "6.13.0.300"
73
+ category: push-notifications
74
+ - name: "Huawei HMS Location"
75
+ version: "6.16.0.302"
76
+ category: location
77
+ - name: play-services-location
78
+ version: "21.3.0"
79
+ category: location
80
+ - name: play-review
81
+ version: "2.0.1"
82
+ category: review
83
+ - name: androidx.security:security-crypto
84
+ version: "1.1.0-alpha06"
85
+ category: security
86
+ - name: Jest
87
+ version: "29.7.0"
88
+ category: testing
89
+ - name: babel-jest
90
+ version: "30.2.0"
91
+ category: testing
92
+ - name: Android Gradle Plugin
93
+ version: "8.4.2"
94
+ category: build
95
+
96
+ services:
97
+ - name: react-native-insider
98
+ path: "."
99
+ type: library
100
+ primary_language: JavaScript
101
+ frameworks:
102
+ - React Native
103
+ - InsiderMobile (iOS)
104
+ - Insider (Android)
105
+ modules:
106
+ - InsiderUser (fluent builder)
107
+ - InsiderProduct (fluent builder)
108
+ - InsiderEvent (fluent builder)
109
+ - InsiderIdentifier (fluent builder)
110
+ - InsiderAppCards (frozen singleton; Promise + callback)
111
+ - InsiderAppCard (domain model with private fields)
112
+ - InsiderAppCardsError (typed Error subclass)
113
+ - Util (validation, type detection, resolveWithCallback)
114
+ description: "React Native bridge SDK wrapping native Insider iOS/Android SDKs. v8.0.0 adds the App Cards module and identifier-scoped Message Center."
115
+ description_source: code-analysis
116
+ verified: true
117
+
118
+ output:
119
+ architecture_file: ".orbit-output/config/architecture/ARCHITECTURE.md"
120
+ code_catalog: ".orbit-output/config/architecture/CODE-CATALOG.md"
121
+ api_docs: ".orbit-output/config/architecture/API_DOCS.md"
122
+ config_file: ".orbit-output/config/architecture/project.yaml"
123
+
124
+ analysis:
125
+ mode: FULL_ANALYSIS
126
+ date: "2026-04-16"
127
+ workflow_version: "3.11"
128
+ zoe_configured: false
129
+ notable_changes_since_last:
130
+ - "Bumped package version 7.1.0 → 8.0.0"
131
+ - "Bumped iOS InsiderMobile 14.3.1 → 15.0.0"
132
+ - "Bumped Android Insider SDK 15.3.0 → 16.0.1"
133
+ - "Added App Cards module (InsiderAppCards, InsiderAppCard, InsiderAppCardsError)"
134
+ - "Added getMessageCenterDataWithIdentifiers method"
135
+ - "Added RNInsiderUser.logoutResettingInsiderID method"
136
+ - "Added Util.resolveWithCallback helper for Promise/callback bridging"
137
+ - "Added per-module test suite under src/__tests__/"
138
+ - "Added docs/app-cards/ and docs/message-center/ internal specs"
@@ -0,0 +1,50 @@
1
+ # Automation Setup for react-native-insider
2
+
3
+ > Generated: 2026-04-16 | Orbit Init v3.11
4
+
5
+ ## Active Tool
6
+
7
+ **Claude Code** (detected from CLAUDE.md + .claude/ directory)
8
+
9
+ ## Automation Status
10
+
11
+ | Feature | Status |
12
+ |---------|--------|
13
+ | .orbit-output/ context | Configured via CLAUDE.md references |
14
+ | Architecture docs | Updated for v8.0.0 (ARCHITECTURE.md, CODE-CATALOG.md, API_DOCS.md) |
15
+ | MASTER.md | Updated as single source of truth |
16
+ | project.yaml | Updated with new module list and SDK versions |
17
+ | Settings | .claude/settings.json + settings.local.json (preserved) |
18
+ | Skills | .claude/skills/ (academy-doc-generator preserved) |
19
+ | Rules | .claude/rules/ (00-ENFORCE-FIRST, code-style, orbit-enforcement preserved) |
20
+
21
+ ## Context Files
22
+
23
+ Claude Code loads these for project awareness:
24
+ - `.orbit-output/config/MASTER.md` — Quick reference
25
+ - `.orbit-output/config/architecture/ARCHITECTURE.md` — Architecture overview
26
+ - `.orbit-output/config/architecture/CODE-CATALOG.md` — Code catalog
27
+ - `.orbit-output/config/architecture/API_DOCS.md` — API reference
28
+
29
+ ## Notable v8.0.0 Updates Captured
30
+
31
+ - App Cards module (InsiderAppCards, InsiderAppCard, InsiderAppCardsError) cataloged
32
+ - `getMessageCenterDataWithIdentifiers` documented
33
+ - `RNInsiderUser.logoutResettingInsiderID` documented
34
+ - `Util.resolveWithCallback` Promise/callback bridge helper documented
35
+ - iOS InsiderMobile bumped 14.3.1 → 15.0.0
36
+ - Android Insider SDK bumped 15.3.0 → 16.0.1
37
+
38
+ ## Keeping Docs Updated
39
+
40
+ Run `/orbit:sync` after significant codebase changes to regenerate architecture docs.
41
+
42
+ Run `/orbit:init` for a full re-analysis when:
43
+ - Major refactoring occurs
44
+ - New native modules are added
45
+ - Native SDK versions are bumped
46
+ - New platform-specific features are added
47
+
48
+ ---
49
+
50
+ *Auto-generated by Orbit Init v3.11 | 2026-04-16*
@@ -0,0 +1,41 @@
1
+ # ORBIT ENFORCEMENT RULES
2
+
3
+ > Generated: 2026-04-06 | Orbit Init v3.11
4
+
5
+ ## Overview
6
+
7
+ This enforcement system ensures AI tools maintain consistency between code and architecture documentation.
8
+
9
+ ## Enforcement Layers
10
+
11
+ ### Layer 0: Session Start
12
+ - `.claude/rules/00-ENFORCE-FIRST.md` — Loads architecture on every Claude Code session
13
+ - Forces reading MASTER.md before first code change
14
+
15
+ ### Layer 1: AI Tool Rules
16
+ - `.claude/rules/orbit-enforcement.md` — Enforces pattern following and doc updates
17
+ - Before changes: read relevant docs
18
+ - After changes: update affected docs
19
+
20
+ ### Layer 2: Pattern Enforcement
21
+ - All code must follow patterns documented in MASTER.md
22
+ - Parameter validation, fluent builders, product serialization patterns
23
+
24
+ ## Required Updates by Change Type
25
+
26
+ | Change Type | Files to Update |
27
+ |-------------|----------------|
28
+ | New public method on RNInsider | API_DOCS.md, CODE-CATALOG.md, index.d.ts |
29
+ | New class/module | CODE-CATALOG.md, ARCHITECTURE.md |
30
+ | New native bridge method | API_DOCS.md, corresponding .m/.java file |
31
+ | New enum/constant | CODE-CATALOG.md |
32
+ | Architecture change | ARCHITECTURE.md, MASTER.md |
33
+ | Dependency version bump | CODE-CATALOG.md, MASTER.md |
34
+
35
+ ## Keeping Docs Current
36
+
37
+ Run `/orbit:sync` after significant changes to regenerate docs automatically.
38
+
39
+ ---
40
+
41
+ *Auto-generated by Orbit Init v3.11 | 2026-04-06*
@@ -0,0 +1,49 @@
1
+ #!/bin/bash
2
+ # Orbit Enforcement Validation Script
3
+ # Checks that all required orbit files exist
4
+
5
+ ERRORS=0
6
+
7
+ check_file() {
8
+ if [ -f "$1" ]; then
9
+ echo " ✓ $1"
10
+ else
11
+ echo " ✗ $1 (MISSING)"
12
+ ERRORS=$((ERRORS + 1))
13
+ fi
14
+ }
15
+
16
+ echo "═══════════════════════════════════════════════"
17
+ echo " ORBIT ENFORCEMENT VALIDATION"
18
+ echo "═══════════════════════════════════════════════"
19
+ echo ""
20
+
21
+ echo "Architecture Documentation:"
22
+ check_file ".orbit-output/config/MASTER.md"
23
+ check_file ".orbit-output/config/architecture/ARCHITECTURE.md"
24
+ check_file ".orbit-output/config/architecture/CODE-CATALOG.md"
25
+ check_file ".orbit-output/config/architecture/API_DOCS.md"
26
+ check_file ".orbit-output/config/architecture/project.yaml"
27
+ echo ""
28
+
29
+ echo "Root Config:"
30
+ check_file "CLAUDE.md"
31
+ echo ""
32
+
33
+ echo "Enforcement Rules:"
34
+ check_file ".claude/rules/00-ENFORCE-FIRST.md"
35
+ check_file ".claude/rules/orbit-enforcement.md"
36
+ check_file ".orbit-output/config/enforcement/ENFORCEMENT-RULES.md"
37
+ echo ""
38
+
39
+ echo "═══════════════════════════════════════════════"
40
+ if [ $ERRORS -eq 0 ]; then
41
+ echo " VALIDATION PASSED: All files intact"
42
+ echo "═══════════════════════════════════════════════"
43
+ exit 0
44
+ else
45
+ echo " VALIDATION FAILED: $ERRORS issue(s) found"
46
+ echo " Run /orbit:init to repair"
47
+ echo "═══════════════════════════════════════════════"
48
+ exit 1
49
+ fi