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.
- package/.framework/cli/commands/claim.ts +447 -0
- package/.framework/cli/commands/install-app.ts +67 -7
- package/.framework/cli/commands/migrate.ts +13 -1
- package/.framework/cli/commands/publish.ts +191 -0
- package/.framework/cli/commands/status.ts +74 -3
- package/.framework/cli/commands/update-app.ts +397 -0
- package/.framework/cli/index.ts +12 -0
- package/.framework/migrations/000_foundation.sql +18 -4
- package/.framework/migrations/004_app_version_tracking.sql +8 -0
- package/.framework/src/App.tsx +20 -8
- package/.framework/src/components/CustomAppLoader.tsx +19 -2
- package/LICENSE.md +18 -0
- package/bin/{spine-framework.cjs → spine-framework.js} +1 -1
- package/bin/{welcome.cjs → welcome.js} +2 -2
- package/config/vite.config.ts +0 -1
- package/dist/cli/commands/claim.d.ts +56 -0
- package/dist/cli/commands/claim.d.ts.map +1 -0
- package/dist/cli/commands/install-app.d.ts.map +1 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/publish.d.ts +23 -0
- package/dist/cli/commands/publish.d.ts.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/update-app.d.ts +24 -0
- package/dist/cli/commands/update-app.d.ts.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/config/signals.d.ts +82 -0
- package/dist/config/signals.d.ts.map +1 -0
- package/package-project.json +9 -2
- package/package.json +10 -8
- package/scripts/assemble-frontend.sh +4 -7
- package/bin/ws-shim.cjs +0 -8
|
@@ -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;
|
|
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;
|
|
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;
|
|
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"}
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -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:**
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../.framework/cli/index.ts"],"names":[],"mappings":";AAEA
|
|
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"}
|
package/package-project.json
CHANGED
|
@@ -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 &&
|
|
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.
|
|
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.
|
|
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": "
|
|
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/
|
|
17
|
+
"homepage": "https://github.com/spine-framework/spine-framework#readme",
|
|
18
18
|
"bugs": {
|
|
19
|
-
"url": "https://github.com/
|
|
19
|
+
"url": "https://github.com/spine-framework/spine-framework/issues"
|
|
20
20
|
},
|
|
21
21
|
"repository": {
|
|
22
22
|
"type": "git",
|
|
23
|
-
"url": "https://github.com/
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
67
|
-
cp -r "$CUSTOM_SRC_DIR"/* "$
|
|
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
|
-
}
|