spine-framework 0.1.61 → 0.2.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,56 @@
1
+ /**
2
+ * @module cli/commands/claim
3
+ * @audience installer
4
+ * @layer cli
5
+ * @stability stable
6
+ *
7
+ * `spine-framework claim` — Claim framework installation via Spine Portal.
8
+ *
9
+ * Engagement-based claim system that offers contextual prompts based on
10
+ * user activity. Tracks engagement signals and triggers claim prompts
11
+ * at value-realization moments.
12
+ *
13
+ * **Usage:**
14
+ * ```bash
15
+ * spine-framework claim # Interactive claim flow
16
+ * spine-framework claim --status # Show claim status only
17
+ * spine-framework claim --token <t> # Headless claim with token
18
+ * ```
19
+ */
20
+ import type { Command } from 'commander';
21
+ import { type EngagementData, type ClaimPrompt, type EngagementSignalType } from '../../config/signals.ts';
22
+ export interface SerialData {
23
+ serial_number: string;
24
+ salt: string;
25
+ created_at: string;
26
+ framework_version: string;
27
+ account_id: string | null;
28
+ machine_fingerprint: string;
29
+ }
30
+ export declare function ensureSerialData(): SerialData;
31
+ export declare function readEngagementData(): EngagementData | null;
32
+ export declare function writeEngagementData(data: EngagementData): void;
33
+ export declare function recordEngagementSignal(signalType: EngagementSignalType): void;
34
+ export declare function shouldOfferClaim(): ClaimPrompt | null;
35
+ export interface FrameworkInstallSignal {
36
+ signal_type: 'framework_install';
37
+ install_serial: string;
38
+ package: string;
39
+ version: string;
40
+ anonymous_id: string;
41
+ machine_fingerprint: string;
42
+ platform: string;
43
+ timestamp: string;
44
+ }
45
+ export interface AppInstallSignal {
46
+ signal_type: 'app_install';
47
+ package: string;
48
+ version: string;
49
+ framework_install_serial: string;
50
+ app_serial: string;
51
+ timestamp: string;
52
+ }
53
+ export declare function sendFrameworkInstallSignal(): Promise<void>;
54
+ export declare function sendAppInstallSignal(packageName: string, version: string): Promise<void>;
55
+ export declare function registerClaimCommands(program: Command): void;
56
+ //# sourceMappingURL=claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/claim.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,OAAO,EAAkD,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAS1J,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAiBD,wBAAgB,gBAAgB,IAAI,UAAU,CA6B7C;AAeD,wBAAgB,kBAAkB,IAAI,cAAc,GAAG,IAAI,CAO1D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAK9D;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAgC7E;AAED,wBAAgB,gBAAgB,IAAI,WAAW,GAAG,IAAI,CA8BrD;AAID,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,mBAAmB,CAAA;IAChC,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,aAAa,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,wBAAwB,EAAE,MAAM,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBhE;AAED,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB9F;AAkLD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"install-app.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/install-app.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAugBxC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,QAgB1D"}
1
+ {"version":3,"file":"install-app.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/install-app.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmkBxC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,QAgB1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/migrate.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuGxC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAevD"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/migrate.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmHxC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAevD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @module cli/commands/publish
3
+ * @audience developer
4
+ * @layer cli
5
+ * @stability stable
6
+ *
7
+ * `spine-framework publish` — Bump version, write changelog, publish to npm, commit.
8
+ *
9
+ * Run from the spine-ia coding repo. Handles both the framework package and
10
+ * individual app packages (cortex, portal, etc.).
11
+ *
12
+ * **Usage:**
13
+ * ```bash
14
+ * spine-framework publish # publish framework (patch bump)
15
+ * spine-framework publish --app cortex # publish cortex app (patch bump)
16
+ * spine-framework publish --app cortex --bump minor
17
+ * spine-framework publish --app cortex --bump patch --notes "Fix sidebar nav"
18
+ * spine-framework publish --app cortex --ci --notes "Fix sidebar nav" --bump patch
19
+ * ```
20
+ */
21
+ import type { Command } from 'commander';
22
+ export declare function registerPublishCommands(program: Command): void;
23
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/publish.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsJxC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAkBvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/status.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA2JxC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAmBtD"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/status.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkOxC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAmBtD"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @module cli/commands/update-app
3
+ * @audience installer
4
+ * @layer cli
5
+ * @stability stable
6
+ *
7
+ * `spine-framework update-app <slug>` — Check for and assist with app updates.
8
+ *
9
+ * Design principle: the agentic IDE is the merge tool. This command never
10
+ * writes to custom/apps/. It only:
11
+ * 1. Gets the new version into node_modules/ (read-only upstream reference)
12
+ * 2. Gives the agent a complete picture: versions, changelog, file diff summary
13
+ * 3. Records the new version in DB once the agent signals it is done (--accept)
14
+ *
15
+ * **Usage:**
16
+ * ```bash
17
+ * spine-framework update-app cortex # check for updates
18
+ * spine-framework update-app cortex --dry-run # full plan: changelog + file diff
19
+ * spine-framework update-app cortex --accept # record new version in DB only
20
+ * ```
21
+ */
22
+ import type { Command } from 'commander';
23
+ export declare function registerUpdateAppCommands(program: Command): void;
24
+ //# sourceMappingURL=update-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-app.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/update-app.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsWxC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,QAezD"}
@@ -20,7 +20,10 @@
20
20
  * | migrations | commands/migrations.ts |
21
21
  * | init | commands/init.ts |
22
22
  * | install-app | commands/install-app.ts |
23
+ * | update-app | commands/update-app.ts |
24
+ * | publish | commands/publish.ts |
23
25
  * | status | commands/status.ts |
26
+ * | claim | commands/claim.ts |
24
27
  * | uninstall | commands/uninstall-app.ts |
25
28
  *
26
29
  * **Usage:**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../.framework/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../.framework/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @module config/signals
3
+ * @audience installer
4
+ * @layer cli
5
+ * @stability stable
6
+ *
7
+ * Signal endpoint configuration for framework install tracking and engagement.
8
+ *
9
+ * The public framework sends anonymous signals to a configurable endpoint.
10
+ * Private Cortex instances receive and process these signals.
11
+ */
12
+ export interface SignalConfig {
13
+ endpoint: string;
14
+ timeout: number;
15
+ retryAttempts: number;
16
+ batchSize: number;
17
+ }
18
+ export declare const signalConfig: SignalConfig;
19
+ export declare const engagementSignals: {
20
+ readonly framework_installed: {
21
+ readonly score: 1;
22
+ readonly description: "Framework npm install completion";
23
+ };
24
+ readonly framework_initialized: {
25
+ readonly score: 3;
26
+ readonly description: "First successful startup";
27
+ };
28
+ readonly framework_connected_db: {
29
+ readonly score: 5;
30
+ readonly description: "Database connection success";
31
+ };
32
+ readonly app_install: {
33
+ readonly score: 4;
34
+ readonly description: "App installation";
35
+ };
36
+ readonly app_initialized: {
37
+ readonly score: 4;
38
+ readonly description: "App first load";
39
+ };
40
+ readonly app_first_action: {
41
+ readonly score: 6;
42
+ readonly description: "First feature usage";
43
+ };
44
+ readonly account_created: {
45
+ readonly score: 8;
46
+ readonly description: "Anonymous → identified migration";
47
+ };
48
+ readonly first_deploy: {
49
+ readonly score: 10;
50
+ readonly description: "Production deployment";
51
+ };
52
+ readonly team_collaboration: {
53
+ readonly score: 12;
54
+ readonly description: "Multi-user usage";
55
+ };
56
+ };
57
+ export type EngagementSignalType = keyof typeof engagementSignals;
58
+ export declare const claimTriggers: {
59
+ readonly immediate: 0;
60
+ readonly gentle_nudge: 3;
61
+ readonly value_realized: 5;
62
+ readonly ecosystem_engaged: 8;
63
+ readonly power_user: 10;
64
+ };
65
+ export interface EngagementEntry {
66
+ type: EngagementSignalType;
67
+ timestamp: string;
68
+ score: number;
69
+ }
70
+ export interface EngagementData {
71
+ framework_install_serial: string;
72
+ engagement_score: number;
73
+ signals: EngagementEntry[];
74
+ claim_status: 'anonymous' | 'claimed' | 'pending';
75
+ last_claim_prompt?: string;
76
+ account_id?: string;
77
+ }
78
+ export interface ClaimPrompt {
79
+ timing: keyof typeof claimTriggers;
80
+ message: string;
81
+ }
82
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../.framework/config/signals.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,YAAY,EAAE,YAK1B,CAAA;AAGD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAUpB,CAAA;AAEV,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,iBAAiB,CAAA;AAGjE,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,wBAAwB,EAAE,MAAM,CAAA;IAChC,gBAAgB,EAAE,MAAM,CAAA;IACxB,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,YAAY,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAA;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,OAAO,aAAa,CAAA;IAClC,OAAO,EAAE,MAAM,CAAA;CAChB"}
@@ -5,12 +5,17 @@
5
5
  "scripts": {
6
6
  "assemble": "bash node_modules/spine-framework/scripts/assemble.sh",
7
7
  "dev": "netlify dev",
8
- "build": "npm run assemble && netlify build",
8
+ "build": "npm run assemble && vite build --config node_modules/spine-framework/config/vite.config.ts",
9
9
  "preview": "netlify dev"
10
10
  },
11
11
  "dependencies": {
12
- "spine-framework": "^0.1.0",
12
+ "spine-framework": "^0.2.0",
13
13
  "@tanstack/react-query": "^5.0.0",
14
+ "react": "^18.3.0",
15
+ "react-dom": "^18.3.0",
16
+ "react-router-dom": "^6.28.0",
17
+ "@netlify/functions": "^2.0.0",
18
+ "react-is": "^18.3.0",
14
19
  "lucide-react": "^0.400.0",
15
20
  "clsx": "^2.0.0",
16
21
  "tailwind-merge": "^2.0.0",
@@ -54,6 +59,8 @@
54
59
  "highlight.js": "^11.11.1"
55
60
  },
56
61
  "devDependencies": {
62
+ "@types/react": "^18.3.0",
63
+ "@types/react-dom": "^18.3.0",
57
64
  "vite": "^6.4.3",
58
65
  "@vitejs/plugin-react": "^4.0.0",
59
66
  "tailwindcss": "^3.4.0",
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "spine-framework",
3
- "version": "0.1.61",
3
+ "version": "0.2.2",
4
4
  "private": false,
5
5
  "description": "Spine — enterprise application framework built on Supabase + Netlify + React",
6
6
  "type": "module",
7
- "license": "MIT",
7
+ "license": "SEE LICENSE IN LICENSE.md",
8
8
  "keywords": [
9
9
  "spine",
10
10
  "framework",
@@ -14,19 +14,20 @@
14
14
  "enterprise",
15
15
  "agentic"
16
16
  ],
17
- "homepage": "https://github.com/art-mojo-admin/spine#readme",
17
+ "homepage": "https://github.com/spine-framework/spine-framework#readme",
18
18
  "bugs": {
19
- "url": "https://github.com/art-mojo-admin/spine/issues"
19
+ "url": "https://github.com/spine-framework/spine-framework/issues"
20
20
  },
21
21
  "repository": {
22
22
  "type": "git",
23
- "url": "https://github.com/art-mojo-admin/spine"
23
+ "url": "https://github.com/spine-framework/spine-framework"
24
24
  },
25
25
  "engines": {
26
26
  "node": ">=18.0.0"
27
27
  },
28
28
  "bin": {
29
- "spine-framework": "./bin/spine-framework.cjs"
29
+ "spine-framework": "./bin/spine-framework.js",
30
+ "spine": "./bin/spine-framework.js"
30
31
  },
31
32
  "exports": {
32
33
  ".": {
@@ -61,7 +62,8 @@
61
62
  "index.html",
62
63
  "package-project.json",
63
64
  "STRUCTURE.md",
64
- "README.md"
65
+ "README.md",
66
+ "LICENSE.md"
65
67
  ],
66
68
  "scripts": {
67
69
  "spine-framework": "tsx .framework/cli/index.ts",
@@ -85,7 +87,7 @@
85
87
  "test:integration": "vitest run .framework/tests/integration",
86
88
  "test:boundary": "bash scripts/boundary-check.sh",
87
89
  "test:custom": "vitest run custom/tests",
88
- "postinstall": "node bin/welcome.cjs || true",
90
+ "postinstall": "node bin/welcome.js || true",
89
91
  "docs": "typedoc --config config/typedoc.json"
90
92
  },
91
93
  "dependencies": {
@@ -61,14 +61,11 @@ if [ -f "$PROJECT_ROOT/.framework/public/_redirects" ]; then
61
61
  echo " ✓ Core: _redirects copied to Vite-served directory for Netlify dev"
62
62
  fi
63
63
 
64
- # 6. Overlay custom src (overrides + additions)
64
+ # 6. Copy custom/apps/ → .assembled/custom/apps/ (preserves path for CustomAppLoader glob)
65
+ ASSEMBLED_CUSTOM_DIR="$PROJECT_ROOT/.assembled/custom/apps"
65
66
  if [ -d "$CUSTOM_SRC_DIR" ]; then
66
- # Copy files and subdirectories
67
- cp -r "$CUSTOM_SRC_DIR"/* "$TARGET_SRC_DIR"/ 2>/dev/null || true
68
-
69
- # Handle subdirectories properly
70
- find "$CUSTOM_SRC_DIR" -mindepth 1 -type d -exec sh -c 'dir="$1"; base=$(basename "$dir"); mkdir -p "'"$TARGET_SRC_DIR"'/$base" && cp -r "$dir"/* "'"$TARGET_SRC_DIR"'/$base/"' _ {} \; 2>/dev/null || true
71
-
67
+ mkdir -p "$ASSEMBLED_CUSTOM_DIR"
68
+ cp -r "$CUSTOM_SRC_DIR"/* "$ASSEMBLED_CUSTOM_DIR"/ 2>/dev/null || true
72
69
  CUSTOM_COUNT=$(find "$CUSTOM_SRC_DIR" -name '*.tsx' -o -name '*.ts' -o -name '*.css' 2>/dev/null | wc -l | tr -d ' ')
73
70
  echo " ✓ Custom: $CUSTOM_COUNT files"
74
71
  else
package/bin/ws-shim.cjs DELETED
@@ -1,8 +0,0 @@
1
- // Polyfill globalThis.WebSocket with the 'ws' package for Node < 22.
2
- // Required by supabase-js Realtime client which checks for WebSocket at construction time.
3
- if (typeof globalThis.WebSocket === 'undefined') {
4
- try {
5
- const { WebSocket } = require('ws')
6
- globalThis.WebSocket = WebSocket
7
- } catch {}
8
- }