spine-framework 0.3.124 → 0.3.126
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/agents.ts +35 -37
- package/.framework/cli/commands/auth.ts +35 -34
- package/.framework/cli/commands/create-app.ts +104 -40
- package/.framework/cli/commands/dev.ts +104 -69
- package/.framework/cli/commands/doctor.ts +179 -69
- package/.framework/cli/commands/generate.ts +83 -143
- package/.framework/cli/commands/init.ts +72 -34
- package/.framework/cli/commands/install-app.ts +260 -125
- package/.framework/cli/commands/items.ts +33 -44
- package/.framework/cli/commands/migrate.ts +122 -40
- package/.framework/cli/commands/migrations.ts +33 -40
- package/.framework/cli/commands/pipelines.ts +31 -39
- package/.framework/cli/commands/status.ts +47 -23
- package/.framework/cli/commands/system.ts +47 -37
- package/.framework/cli/commands/test.ts +112 -68
- package/.framework/cli/commands/validate-app.ts +215 -121
- package/.framework/cli/context.ts +112 -130
- package/.framework/cli/env-loader.ts +47 -18
- package/.framework/cli/index.ts +81 -42
- package/.framework/docs/runtime-types.md +1024 -0
- package/.framework/functions/_shared/agent-runner.ts +1296 -961
- package/.framework/functions/_shared/app-manifest.ts +82 -68
- package/.framework/functions/_shared/audit.ts +135 -83
- package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +224 -335
- package/.framework/functions/_shared/kb.ts +319 -0
- package/.framework/functions/_shared/llm.ts +92 -0
- package/.framework/functions/_shared/logging.ts +288 -0
- package/.framework/functions/_shared/middleware.ts +329 -365
- package/.framework/functions/_shared/outcomes.ts +36 -0
- package/.framework/functions/_shared/permissions.ts +359 -643
- package/.framework/functions/_shared/pipeline-runner.ts +243 -316
- package/.framework/functions/_shared/principal.ts +376 -468
- package/.framework/functions/_shared/resolve-credentials.ts +102 -0
- package/.framework/functions/_shared/resolve-ids.ts +188 -16
- package/.framework/functions/_shared/retry-deliveries.ts +104 -0
- package/.framework/functions/_shared/schema-utils.ts +611 -373
- package/.framework/functions/_shared/testing.ts +207 -137
- package/.framework/functions/_shared/tracing.ts +276 -0
- package/.framework/functions/_shared/trigger-engine.ts +159 -211
- package/.framework/functions/_shared/webhook-registration.ts +95 -81
- package/.framework/functions/_shared/webhook-registry.ts +153 -75
- package/.framework/functions/account-nodes.ts +31 -53
- package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
- package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
- package/.framework/functions/adapters/openai-outbound.ts +40 -0
- package/.framework/functions/admin-data.ts +685 -537
- package/.framework/functions/admin-funnel.ts +31 -20
- package/.framework/functions/admin-install-funnel.ts +47 -28
- package/.framework/functions/admin-signals.ts +47 -29
- package/.framework/functions/ai-agents.ts +122 -147
- package/.framework/functions/ai-interactions.ts +180 -90
- package/.framework/functions/api-keys.ts +250 -192
- package/.framework/functions/apps.ts +203 -197
- package/.framework/functions/auth.ts +98 -91
- package/.framework/functions/cil-agent-ingest.ts +773 -0
- package/.framework/functions/cil-agent.ts +592 -0
- package/.framework/functions/cil-callmap.ts +1227 -0
- package/.framework/functions/cil-config.ts +583 -0
- package/.framework/functions/cil-context.ts +445 -0
- package/.framework/functions/cil-doc.ts +1752 -0
- package/.framework/functions/cil-embeddings.ts +1202 -0
- package/.framework/functions/cil-graph.ts +585 -0
- package/.framework/functions/cil-ingest.ts +2416 -0
- package/.framework/functions/cil-pipeline.ts +318 -0
- package/.framework/functions/cil-project.ts +499 -0
- package/.framework/functions/cil-validate.ts +469 -0
- package/.framework/functions/debug-auth.ts +73 -53
- package/.framework/functions/deliveries.ts +117 -0
- package/.framework/functions/embeddings.ts +528 -516
- package/.framework/functions/eval-harness.ts +158 -106
- package/.framework/functions/integration-outbound.ts +311 -0
- package/.framework/functions/integration-routes.ts +240 -466
- package/.framework/functions/integrations.ts +132 -140
- package/.framework/functions/invites.ts +401 -201
- package/.framework/functions/item-progress.ts +113 -53
- package/.framework/functions/kb.ts +28 -0
- package/.framework/functions/logs.ts +239 -222
- package/.framework/functions/observability.ts +308 -259
- package/.framework/functions/pipeline-executions.ts +179 -235
- package/.framework/functions/pipelines.ts +163 -205
- package/.framework/functions/prompt-configs.ts +109 -156
- package/.framework/functions/roles.ts +97 -147
- package/.framework/functions/system-cron.ts +132 -218
- package/.framework/functions/system.ts +112 -52
- package/.framework/functions/tests.ts +32 -28
- package/.framework/functions/timers.ts +162 -210
- package/.framework/functions/triggers.ts +282 -346
- package/.framework/functions/types.ts +283 -400
- package/.framework/migrations/001_core_schema.sql +630 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
- package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
- package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
- package/.framework/migrations/005_core_observability.sql +598 -0
- package/.framework/migrations/006_security_hardening_rls.sql +97 -0
- package/.framework/migrations/007_kb_article_list.sql +237 -0
- package/.framework/migrations/008_items_target.sql +8 -0
- package/.framework/migrations/009_roles_slug_unique.sql +11 -0
- package/.framework/public/spine.config.json +91 -0
- package/.framework/scripts/app-install-cli.ts +112 -98
- package/.framework/src/App.tsx +67 -20
- package/.framework/src/apps/admin/index.tsx +97 -27
- package/.framework/src/components/AppWrapper.tsx +50 -11
- package/.framework/src/components/CustomAppLoader.tsx +131 -22
- package/.framework/src/components/admin/AdminListPage.tsx +75 -8
- package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
- package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
- package/.framework/src/components/admin/PageInstructions.tsx +49 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
- package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
- package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
- package/.framework/src/components/app-sidebar.tsx +50 -3
- package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
- package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
- package/.framework/src/components/kb/KBArticleList.tsx +557 -0
- package/.framework/src/components/layout/AppShell.tsx +54 -16
- package/.framework/src/components/layout/Header.tsx +50 -38
- package/.framework/src/components/layout/Layout.tsx +48 -32
- package/.framework/src/components/layout/Sidebar.tsx +167 -16
- package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
- package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
- package/.framework/src/components/runtime/DataFilters.tsx +78 -1
- package/.framework/src/components/runtime/DataHeader.tsx +32 -29
- package/.framework/src/components/runtime/DataListPage.tsx +161 -2
- package/.framework/src/components/runtime/DataStats.tsx +48 -1
- package/.framework/src/components/runtime/DataTable.tsx +153 -1
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
- package/.framework/src/components/runtime/index.ts +16 -9
- package/.framework/src/components/search-form.tsx +33 -1
- package/.framework/src/components/shared/AgentView.tsx +48 -51
- package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
- package/.framework/src/components/shared/InviteManager.tsx +113 -52
- package/.framework/src/components/shared/MemberList.tsx +182 -0
- package/.framework/src/components/shared/SchemaFields.tsx +96 -78
- package/.framework/src/components/ui/DataTable.tsx +86 -56
- package/.framework/src/components/ui/Form.tsx +188 -109
- package/.framework/src/components/ui/ItemCard.tsx +86 -58
- package/.framework/src/components/ui/ItemListView.tsx +88 -61
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
- package/.framework/src/components/ui/Modal.tsx +81 -4
- package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
- package/.framework/src/components/ui/accordion.tsx +97 -5
- package/.framework/src/components/ui/alert-dialog.tsx +225 -13
- package/.framework/src/components/ui/alert.tsx +113 -6
- package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
- package/.framework/src/components/ui/avatar.tsx +129 -7
- package/.framework/src/components/ui/badge.tsx +65 -3
- package/.framework/src/components/ui/breadcrumb.tsx +145 -8
- package/.framework/src/components/ui/button-group.tsx +81 -4
- package/.framework/src/components/ui/button.tsx +49 -2
- package/.framework/src/components/ui/calendar.tsx +65 -3
- package/.framework/src/components/ui/card.tsx +145 -8
- package/.framework/src/components/ui/carousel.tsx +129 -7
- package/.framework/src/components/ui/chart.tsx +161 -10
- package/.framework/src/components/ui/checkbox.tsx +49 -2
- package/.framework/src/components/ui/collapsible.tsx +81 -5
- package/.framework/src/components/ui/combobox.tsx +305 -20
- package/.framework/src/components/ui/command.tsx +177 -11
- package/.framework/src/components/ui/context-menu.tsx +273 -17
- package/.framework/src/components/ui/dialog.tsx +209 -27
- package/.framework/src/components/ui/direction.tsx +64 -4
- package/.framework/src/components/ui/drawer.tsx +193 -12
- package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
- package/.framework/src/components/ui/empty.tsx +145 -9
- package/.framework/src/components/ui/field.tsx +209 -14
- package/.framework/src/components/ui/hover-card.tsx +81 -4
- package/.framework/src/components/ui/input-group.tsx +162 -10
- package/.framework/src/components/ui/input-otp.tsx +98 -5
- package/.framework/src/components/ui/input.tsx +49 -2
- package/.framework/src/components/ui/item.tsx +225 -13
- package/.framework/src/components/ui/kbd.tsx +65 -3
- package/.framework/src/components/ui/label.tsx +49 -2
- package/.framework/src/components/ui/menubar.tsx +289 -17
- package/.framework/src/components/ui/native-select.tsx +97 -5
- package/.framework/src/components/ui/navigation-menu.tsx +177 -10
- package/.framework/src/components/ui/pagination.tsx +161 -9
- package/.framework/src/components/ui/popover.tsx +145 -8
- package/.framework/src/components/ui/progress.tsx +49 -2
- package/.framework/src/components/ui/radio-group.tsx +65 -3
- package/.framework/src/components/ui/resizable.tsx +82 -4
- package/.framework/src/components/ui/scroll-area.tsx +65 -3
- package/.framework/src/components/ui/select.tsx +193 -11
- package/.framework/src/components/ui/separator.tsx +49 -2
- package/.framework/src/components/ui/sheet.tsx +193 -11
- package/.framework/src/components/ui/sidebar.tsx +481 -38
- package/.framework/src/components/ui/skeleton.tsx +49 -2
- package/.framework/src/components/ui/slider.tsx +49 -2
- package/.framework/src/components/ui/sonner.tsx +49 -2
- package/.framework/src/components/ui/spinner.tsx +49 -2
- package/.framework/src/components/ui/switch.tsx +49 -2
- package/.framework/src/components/ui/table-primitives.tsx +160 -33
- package/.framework/src/components/ui/table.tsx +161 -9
- package/.framework/src/components/ui/tabs.tsx +113 -6
- package/.framework/src/components/ui/textarea.tsx +49 -2
- package/.framework/src/components/ui/toggle-group.tsx +81 -4
- package/.framework/src/components/ui/toggle.tsx +65 -3
- package/.framework/src/components/ui/tooltip.tsx +97 -5
- package/.framework/src/contexts/AppContext.tsx +129 -45
- package/.framework/src/contexts/AuthContext.tsx +187 -144
- package/.framework/src/hooks/use-mobile.ts +48 -2
- package/.framework/src/hooks/useApi.ts +208 -159
- package/.framework/src/hooks/useAppPath.ts +32 -23
- package/.framework/src/hooks/useApps.ts +51 -20
- package/.framework/src/hooks/useEntityList.ts +32 -78
- package/.framework/src/hooks/useEntityRecord.ts +35 -96
- package/.framework/src/hooks/useForm.ts +32 -92
- package/.framework/src/hooks/useListSchema.ts +49 -78
- package/.framework/src/hooks/useSchemaRecord.ts +114 -105
- package/.framework/src/lib/api.ts +195 -116
- package/.framework/src/lib/supabase.ts +98 -64
- package/.framework/src/lib/utils.ts +287 -151
- package/.framework/src/main.tsx +49 -3
- package/.framework/src/pages/DashboardPage.tsx +52 -29
- package/.framework/src/pages/NotFoundPage.tsx +32 -10
- package/.framework/src/pages/SetupPage.tsx +32 -12
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
- package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
- package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
- package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
- package/.framework/src/pages/admin/AppsPage.tsx +49 -2
- package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
- package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
- package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
- package/.framework/src/pages/admin/LogsPage.tsx +422 -75
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
- package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
- package/.framework/src/pages/admin/RolesPage.tsx +171 -18
- package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
- package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
- package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
- package/.framework/src/pages/admin/TimersPage.tsx +48 -20
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
- package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
- package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
- package/.framework/src/pages/admin/TypesPage.tsx +48 -20
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
- package/.framework/src/pages/auth/LoginPage.tsx +50 -23
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
- package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
- package/.framework/src/types/auth.ts +128 -71
- package/.framework/src/types/types.ts +373 -157
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
- package/docs/README.md +9 -130
- package/netlify.toml +5 -2
- package/package.json +13 -25
- package/scripts/kb-ingest-docs.ts +203 -0
- package/spine.config.json +65 -4
- package/.framework/migrations/001_schema.sql +0 -425
- package/.framework/migrations/002_rls_and_functions.sql +0 -763
- package/.framework/migrations/004_enhancements.sql +0 -43
- package/.framework/migrations/005_auth_user_trigger.sql +0 -105
- package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
- package/.framework/migrations/016_invites.sql +0 -27
- package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
- package/.framework/migrations/018_apps_required_roles.sql +0 -17
- package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
- package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
- package/.framework/migrations/021_app_domains.sql +0 -112
- package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
- package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
- package/.framework/migrations/024_messages_account_id.sql +0 -9
- package/.framework/migrations/025_retype_threads_messages.sql +0 -240
- package/.framework/migrations/026_fix_rls_policies.sql +0 -47
- package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
- package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
- package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
- package/.framework/migrations/030_messages_updated_by.sql +0 -6
- package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
- package/docs/APPS.md +0 -232
- package/docs/ARCHITECTURE.md +0 -246
- package/docs/INSTALL.md +0 -155
- package/docs/design-schema-spec.md +0 -1837
- package/docs/dev-guides/01-create-an-app.md +0 -183
- package/docs/dev-guides/02-create-a-function.md +0 -178
- package/docs/dev-guides/03-create-a-component.md +0 -178
- package/docs/dev-guides/04-webhook-handlers.md +0 -129
- package/docs/dev-guides/05-testing.md +0 -168
- package/docs/dev-guides/README.md +0 -40
- package/docs/npm-packages-plan.md +0 -288
- package/docs/spine-core--api-reference.md +0 -822
|
@@ -1,36 +1,51 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* @module scripts/app-install-cli
|
|
5
|
-
* @audience installer
|
|
6
|
-
* @layer cli
|
|
7
|
-
* @stability orphaned
|
|
8
|
-
*
|
|
9
|
-
* Spine App Installation CLI - Validates and executes app installation instruction files.
|
|
10
|
-
* **ORPHANED**: References non-existent schema and template files at `../docs/app-installation/`.
|
|
11
|
-
*
|
|
12
|
-
* **Intended Purpose**: Validate YAML instruction files against JSON schema and execute
|
|
13
|
-
* multi-step app installations (pack installation, app creation, migrations, verification).
|
|
14
|
-
*
|
|
15
|
-
* **Current State**: Cannot function - missing required schema.json and template files.
|
|
16
|
-
*
|
|
17
|
-
* **Dependencies**: commander, js-yaml, ajv for CLI operations and validation.
|
|
18
|
-
*
|
|
19
|
-
* @tags orphaned, cli, app-installation, validation
|
|
20
|
-
*/
|
|
21
3
|
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
// CIL[BEGIN chunk_id="app-install-cli_module_header_1783931090" type="module_header" identity="imports" parent="none"]
|
|
11
|
+
// CIL[DOC-MACRO purpose="Import Node.js modules for CLI app installation tool"]
|
|
12
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for CLI operations"]
|
|
13
|
+
// CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
14
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and utilities" errors="Import failures" side_effects="Module loading"]
|
|
15
|
+
// CIL[DOC-MICRO logic_summary="Imports file system, CLI, YAML validation, and ES modules utilities" notable_decisions="[]"]
|
|
16
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
17
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
18
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
19
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
20
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
21
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
22
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
23
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
24
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
22
25
|
import { readFileSync, existsSync, writeFileSync } from 'fs'
|
|
23
26
|
import { resolve, dirname } from 'path'
|
|
24
27
|
import { program } from 'commander'
|
|
25
28
|
import yaml from 'js-yaml'
|
|
26
29
|
import Ajv from 'ajv'
|
|
27
30
|
import { fileURLToPath } from 'url'
|
|
28
|
-
|
|
29
|
-
//
|
|
31
|
+
// CIL[END chunk_id="app-install-cli_module_header_1783931090"]
|
|
32
|
+
// CIL[BEGIN chunk_id="app-install-cli_setup_1783931090" type="setup" identity="setup" parent="none"]
|
|
33
|
+
// CIL[DOC-MACRO purpose="Initialize CLI environment, schema validation, and type definitions"]
|
|
34
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Set up file paths, schema validator, and installation context"]
|
|
35
|
+
// CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/db.ts\",\"\\\"]"]
|
|
36
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Schema validator, file paths, context interface" errors="Schema loading failures" side_effects="File system reads"]
|
|
37
|
+
// CIL[DOC-MICRO logic_summary="Resolves paths, loads schema, creates validator, defines context interface" notable_decisions="['schema_loading', 'ajv_validation']"]
|
|
38
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
39
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
40
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/db.ts, \."]
|
|
41
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
42
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
43
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
44
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
45
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
30
46
|
const __filename = fileURLToPath(import.meta.url)
|
|
31
47
|
const __dirname = dirname(__filename)
|
|
32
48
|
|
|
33
|
-
// Load JSON schema
|
|
34
49
|
const schemaPath = resolve(__dirname, '../docs/app-installation/schema.json')
|
|
35
50
|
const schema = JSON.parse(readFileSync(schemaPath, 'utf8'))
|
|
36
51
|
|
|
@@ -42,22 +57,21 @@ interface InstallationContext {
|
|
|
42
57
|
PACK_INSTALLATION_ID?: string
|
|
43
58
|
[key: string]: string | undefined
|
|
44
59
|
}
|
|
45
|
-
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
*/
|
|
60
|
+
// CIL[END chunk_id="app-install-cli_setup_1783931090"]
|
|
61
|
+
// CIL[BEGIN chunk_id="app-install-cli_substitutevariables_1783931090" type="function" identity="substituteVariables" parent="none"]
|
|
62
|
+
// CIL[DOC-MACRO purpose="Recursively substitute ${VAR} placeholders with context values"]
|
|
63
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Variable template substitution engine for installation configs"]
|
|
64
|
+
// CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/db.ts\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
|
|
65
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="substituted object" errors="none" side_effects="none"]
|
|
66
|
+
// CIL[DOC-MICRO logic_summary="Handles strings, arrays, and objects recursively with regex replacement" notable_decisions="['recursive_substitution', 'fallback_to_match']"]
|
|
67
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
68
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
69
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 2. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/db.ts, .framework/src/components/ui/table-primitives.tsx, \."]
|
|
70
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 2. Total affected: 2."]
|
|
71
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
72
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
73
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
74
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
61
75
|
function substituteVariables(obj: any, context: InstallationContext): any {
|
|
62
76
|
if (typeof obj === 'string') {
|
|
63
77
|
return obj.replace(/\$\{([^}]+)\}/g, (match, varName) => {
|
|
@@ -74,22 +88,21 @@ function substituteVariables(obj: any, context: InstallationContext): any {
|
|
|
74
88
|
}
|
|
75
89
|
return obj
|
|
76
90
|
}
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
*/
|
|
91
|
+
// CIL[END chunk_id="app-install-cli_substitutevariables_1783931090"]
|
|
92
|
+
// CIL[BEGIN chunk_id="app-install-cli_validateinstructionfile_1783931090" type="function" identity="validateInstructionFile" parent="none"]
|
|
93
|
+
// CIL[DOC-MACRO purpose="Validate YAML instruction files against JSON schema"]
|
|
94
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Schema validation and file existence checking"]
|
|
95
|
+
// CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
96
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="validation result" errors="File not found, validation failures" side_effects="Console output, process.exit"]
|
|
97
|
+
// CIL[DOC-MICRO logic_summary="Checks file existence, loads YAML, validates against schema, exits on failure" notable_decisions="['process_exit_on_failure', 'schema_validation']"]
|
|
98
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
99
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
100
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 1. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
101
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
|
|
102
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
103
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
104
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
105
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
93
106
|
async function validateInstructionFile(filePath: string): Promise<void> {
|
|
94
107
|
try {
|
|
95
108
|
console.log(`🔍 Validating ${filePath}...`)
|
|
@@ -102,7 +115,6 @@ async function validateInstructionFile(filePath: string): Promise<void> {
|
|
|
102
115
|
const content = readFileSync(filePath, 'utf8')
|
|
103
116
|
const data = yaml.load(content) as any
|
|
104
117
|
|
|
105
|
-
// Validate against schema
|
|
106
118
|
if (!validate(data)) {
|
|
107
119
|
console.error('❌ Validation failed:')
|
|
108
120
|
console.error(JSON.stringify(validate.errors, null, 2))
|
|
@@ -115,34 +127,30 @@ async function validateInstructionFile(filePath: string): Promise<void> {
|
|
|
115
127
|
process.exit(1)
|
|
116
128
|
}
|
|
117
129
|
}
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
* @tags orphaned, installation, orchestration, multi-step
|
|
134
|
-
*/
|
|
130
|
+
// CIL[END chunk_id="app-install-cli_validateinstructionfile_1783931090"]
|
|
131
|
+
// CIL[BEGIN chunk_id="app-install-cli_executeinstallation_1783931090" type="function" identity="executeInstallation" parent="none"]
|
|
132
|
+
// CIL[DOC-MACRO purpose="Execute multi-step app installation from instruction files"]
|
|
133
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Orchestrate complete app installation workflow"]
|
|
134
|
+
// CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
135
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="installation result" errors="Installation failures" side_effects="Console output, process.exit"]
|
|
136
|
+
// CIL[DOC-MICRO logic_summary="Validates, sets context, simulates pack install, creates apps, runs migrations, verifies" notable_decisions="['simulated_installation', 'step_by_step_execution']"]
|
|
137
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="complex_dependencies"]
|
|
138
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
139
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
140
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
141
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
142
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
143
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
144
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
135
145
|
async function executeInstallation(filePath: string, options: any): Promise<void> {
|
|
136
146
|
try {
|
|
137
147
|
console.log(`🚀 Executing installation from ${filePath}...`)
|
|
138
148
|
|
|
139
|
-
// First validate
|
|
140
149
|
await validateInstructionFile(filePath)
|
|
141
150
|
|
|
142
151
|
const content = readFileSync(filePath, 'utf8')
|
|
143
152
|
const instructions = yaml.load(content) as any
|
|
144
153
|
|
|
145
|
-
// Set up context
|
|
146
154
|
const context: InstallationContext = {
|
|
147
155
|
TARGET_ACCOUNT_ID: options.accountId,
|
|
148
156
|
...instructions.variables
|
|
@@ -153,17 +161,14 @@ async function executeInstallation(filePath: string, options: any): Promise<void
|
|
|
153
161
|
console.log(` Target Account: ${context.TARGET_ACCOUNT_ID}`)
|
|
154
162
|
console.log()
|
|
155
163
|
|
|
156
|
-
// Step 1: Pack installation
|
|
157
164
|
console.log('📦 Step 1: Installing pack...')
|
|
158
165
|
const packInstall = substituteVariables(instructions.installation.pack_installation, context)
|
|
159
166
|
console.log(' Pack installation config:', JSON.stringify(packInstall, null, 2))
|
|
160
167
|
|
|
161
|
-
// Simulate pack installation - in real implementation, this would call the API
|
|
162
168
|
const packInstallationId = 'simulated-pack-id-' + Date.now()
|
|
163
169
|
context.PACK_INSTALLATION_ID = packInstallationId
|
|
164
170
|
console.log(` ✅ Pack installed with ID: ${packInstallationId}`)
|
|
165
171
|
|
|
166
|
-
// Step 2: App creation
|
|
167
172
|
console.log('⚙️ Step 2: Creating app definitions...')
|
|
168
173
|
if (instructions.installation.app_creation) {
|
|
169
174
|
for (const appDef of instructions.installation.app_creation) {
|
|
@@ -174,7 +179,6 @@ async function executeInstallation(filePath: string, options: any): Promise<void
|
|
|
174
179
|
}
|
|
175
180
|
}
|
|
176
181
|
|
|
177
|
-
// Step 3: Migrations
|
|
178
182
|
console.log('🔄 Step 3: Running migrations...')
|
|
179
183
|
if (instructions.installation.migrations) {
|
|
180
184
|
for (const migration of instructions.installation.migrations) {
|
|
@@ -187,7 +191,6 @@ async function executeInstallation(filePath: string, options: any): Promise<void
|
|
|
187
191
|
}
|
|
188
192
|
}
|
|
189
193
|
|
|
190
|
-
// Step 4: Verification
|
|
191
194
|
console.log('✅ Step 4: Verifying installation...')
|
|
192
195
|
if (instructions.installation.verification) {
|
|
193
196
|
for (const verification of instructions.installation.verification) {
|
|
@@ -207,23 +210,21 @@ async function executeInstallation(filePath: string, options: any): Promise<void
|
|
|
207
210
|
process.exit(1)
|
|
208
211
|
}
|
|
209
212
|
}
|
|
210
|
-
//
|
|
211
|
-
|
|
212
|
-
//
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
* @tags orphaned, template-generation, yaml, cli
|
|
226
|
-
*/
|
|
213
|
+
// CIL[END chunk_id="app-install-cli_executeinstallation_1783931090"]
|
|
214
|
+
// CIL[BEGIN chunk_id="app-install-cli_generatetemplate_1783931090" type="function" identity="generateTemplate" parent="none"]
|
|
215
|
+
// CIL[DOC-MACRO purpose="Generate YAML templates for app installations or migrations"]
|
|
216
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Template generation and file output management"]
|
|
217
|
+
// CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[]"]
|
|
218
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="template content" errors="Template loading failures" side_effects="File writes, console output"]
|
|
219
|
+
// CIL[DOC-MICRO logic_summary="Resolves template paths, loads files, outputs to file or stdout" notable_decisions="['template_type_switching', 'output_option_handling']"]
|
|
220
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
221
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
222
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
223
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
224
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
225
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
226
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
227
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
227
228
|
async function generateTemplate(type: string, options: any): Promise<void> {
|
|
228
229
|
try {
|
|
229
230
|
const templateDir = resolve(__dirname, '../docs/app-installation/templates')
|
|
@@ -254,9 +255,21 @@ async function generateTemplate(type: string, options: any): Promise<void> {
|
|
|
254
255
|
process.exit(1)
|
|
255
256
|
}
|
|
256
257
|
}
|
|
257
|
-
//
|
|
258
|
-
|
|
259
|
-
// CLI
|
|
258
|
+
// CIL[END chunk_id="app-install-cli_generatetemplate_1783931090"]
|
|
259
|
+
// CIL[BEGIN chunk_id="app-install-cli_cli_setup_1783931090" type="cli_setup" identity="cli_setup" parent="none"]
|
|
260
|
+
// CIL[DOC-MACRO purpose="Define CLI commands and argument parsing"]
|
|
261
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Set up commander.js CLI interface with commands and options"]
|
|
262
|
+
// CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[]"]
|
|
263
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="CLI interface" errors="Command parsing errors" side_effects="CLI execution"]
|
|
264
|
+
// CIL[DOC-MICRO logic_summary="Configures validate, install, and template commands with arguments and options" notable_decisions="['commander_setup', 'action_binding']"]
|
|
265
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
266
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
267
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
268
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
269
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
270
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
271
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
272
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
260
273
|
program
|
|
261
274
|
.name('app-install-cli')
|
|
262
275
|
.description('Spine App Installation CLI - Validate and execute app installation instructions')
|
|
@@ -284,3 +297,4 @@ program
|
|
|
284
297
|
.action(generateTemplate)
|
|
285
298
|
|
|
286
299
|
program.parse()
|
|
300
|
+
// CIL[END chunk_id="app-install-cli_cli_setup_1783931090"]
|
package/.framework/src/App.tsx
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// CIL[BEGIN chunk_id="App_module_header_1783931090" type="module_header" identity="imports" parent="none"]
|
|
6
|
+
// CIL[DOC-MACRO purpose="Import React and routing dependencies for main app component"]
|
|
7
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports and lazy loading"]
|
|
8
|
+
// CIL[DOC-CONTEXT module="App" layer="entry-point" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
9
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and lazy components" errors="Import failures" side_effects="Module loading"]
|
|
10
|
+
// CIL[DOC-MICRO logic_summary="Imports React hooks, routing components, pages, and app shell components" notable_decisions="['lazy_load_admin_app']"]
|
|
11
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
12
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
13
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
14
|
+
// CIL[DOC-VECTOR type="context" content="Layer: entry-point. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/components/ui/dialog.tsx, \."]
|
|
15
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
16
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
17
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
18
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
20
|
import { Suspense, lazy, useEffect } from 'react'
|
|
2
21
|
import { Routes, Route, Navigate, useNavigate, useLocation } from 'react-router-dom'
|
|
3
22
|
import { useAuth } from './contexts/AuthContext'
|
|
@@ -15,9 +34,22 @@ import { CustomAppLoader } from './components/CustomAppLoader'
|
|
|
15
34
|
import { GenericAppShell } from './components/app-shell/GenericAppShell'
|
|
16
35
|
import { APIPage } from './pages/spine-framework/APIPage'
|
|
17
36
|
import { CLIPage } from './pages/spine-framework/CLIPage'
|
|
18
|
-
|
|
19
37
|
const AdminApp = lazy(() => import('./apps/admin/index'))
|
|
20
|
-
|
|
38
|
+
// CIL[END chunk_id="App_module_header_1783931090"]
|
|
39
|
+
// CIL[BEGIN chunk_id="App_app_1783931090" type="function" identity="App" parent="none"]
|
|
40
|
+
// CIL[DOC-MACRO purpose="Root app component handling authentication state and routing"]
|
|
41
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage global app state, auth flows, and route selection"]
|
|
42
|
+
// CIL[DOC-CONTEXT module="App" layer="entry-point" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
43
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX routes based on auth state" errors="Auth context failures" side_effects="Navigation, route rendering"]
|
|
44
|
+
// CIL[DOC-MICRO logic_summary="Shows loading, handles auth states, routes to appropriate components" notable_decisions="['ternary_auth_routing', 'setup_mode_check']"]
|
|
45
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
46
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
47
|
+
// CIL[DOC-VECTOR type="context" content="Layer: entry-point. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
48
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
49
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
50
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
51
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
52
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
21
53
|
function App() {
|
|
22
54
|
const { user, isLoading } = useAuth()
|
|
23
55
|
|
|
@@ -40,7 +72,6 @@ function App() {
|
|
|
40
72
|
<Route path="/register" element={<RegisterPage />} />
|
|
41
73
|
<Route path="/forgot-password" element={<ForgotPasswordPage />} />
|
|
42
74
|
<Route path="/auth/confirm" element={<AuthConfirmPage />} />
|
|
43
|
-
{/* / shows setup instructions only when VITE_SETUP_MODE=true */}
|
|
44
75
|
<Route
|
|
45
76
|
path="/"
|
|
46
77
|
element={
|
|
@@ -52,7 +83,6 @@ function App() {
|
|
|
52
83
|
<Route path="*" element={<Navigate to="/login" replace />} />
|
|
53
84
|
</Routes>
|
|
54
85
|
) : user.status === 'pending' ? (
|
|
55
|
-
// Access request submitted but not yet approved — block full app access
|
|
56
86
|
<Routes>
|
|
57
87
|
<Route path="*" element={<PendingApprovalPage />} />
|
|
58
88
|
</Routes>
|
|
@@ -62,22 +92,32 @@ function App() {
|
|
|
62
92
|
</AppsRegistryProvider>
|
|
63
93
|
)
|
|
64
94
|
}
|
|
65
|
-
|
|
95
|
+
// CIL[END chunk_id="App_app_1783931090"]
|
|
96
|
+
// CIL[BEGIN chunk_id="App_authenticatedrouter_1783931090" type="function" identity="AuthenticatedRouter" parent="none"]
|
|
97
|
+
// CIL[DOC-LEARNING topic="App:renderer_switch" content="The public.apps.renderer field switches routing: 'custom' uses CustomAppLoader and loads custom/apps/<slug>/index.tsx; 'generic' uses GenericAppShell and builds a schema-driven UI from nav_items."]
|
|
98
|
+
// CIL[DOC-MACRO purpose="Handle authenticated user routing and dynamic app loading"]
|
|
99
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage app registry, route sorting, and dynamic component rendering"]
|
|
100
|
+
// CIL[DOC-CONTEXT module="App" layer="routing" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
101
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Dynamic routes for authenticated apps" errors="App loading failures" side_effects="Navigation, lazy loading"]
|
|
102
|
+
// CIL[DOC-MICRO logic_summary="Loads apps, sorts routes, handles redirects, renders dynamic app components" notable_decisions="['route_prefix_sorting', 'renderer_type_switching']"]
|
|
103
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
104
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
105
|
+
// CIL[DOC-VECTOR type="context" content="Layer: routing. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
106
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
107
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
108
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
109
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
110
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
66
111
|
function AuthenticatedRouter() {
|
|
67
112
|
const { user } = useAuth()
|
|
68
113
|
const { routableApps: apps, loading } = useAppsRegistry()
|
|
69
114
|
const navigate = useNavigate()
|
|
70
115
|
const location = useLocation()
|
|
71
116
|
|
|
72
|
-
// Where to send an already-authenticated user who lands on /login or /register.
|
|
73
|
-
// System admins go to the framework admin namespace; everyone else goes to the
|
|
74
|
-
// first app they are allowed to access (routableApps is already role-filtered).
|
|
75
117
|
const defaultRedirect = user?.roles?.includes('system_admin')
|
|
76
118
|
? '/spine-framework/admin'
|
|
77
119
|
: (apps[0]?.route_prefix || '/')
|
|
78
120
|
|
|
79
|
-
// Redirect away from auth pages once apps have loaded.
|
|
80
|
-
// This fires reliably after loading completes, regardless of render timing.
|
|
81
121
|
useEffect(() => {
|
|
82
122
|
if (!loading && ['/login', '/register'].includes(location.pathname)) {
|
|
83
123
|
navigate(defaultRedirect, { replace: true })
|
|
@@ -95,35 +135,28 @@ function AuthenticatedRouter() {
|
|
|
95
135
|
)
|
|
96
136
|
}
|
|
97
137
|
|
|
98
|
-
// Sort: longer explicit prefixes first (most specific), root (/) last.
|
|
99
|
-
// The /spine-framework namespace is registered statically before dynamic routes
|
|
100
|
-
// so it always wins — but also filter it from dynamic registration to be safe.
|
|
101
138
|
const sorted = [...apps]
|
|
102
139
|
.filter(app => app.slug !== 'spine-framework' && !app.route_prefix?.startsWith('/spine-framework'))
|
|
103
140
|
.sort((a, b) => {
|
|
104
|
-
if (a.route_prefix === '/') return 1
|
|
141
|
+
if (a.route_prefix === '/') return 1
|
|
105
142
|
if (b.route_prefix === '/') return -1
|
|
106
143
|
return (b.route_prefix?.length || 0) - (a.route_prefix?.length || 0)
|
|
107
144
|
})
|
|
108
145
|
|
|
109
|
-
// Build a valid route path: prefix "/" must become "/*", not "//*"
|
|
110
146
|
const toRoutePath = (prefix: string) => prefix === '/' ? '/*' : `${prefix}/*`
|
|
111
147
|
|
|
112
148
|
return (
|
|
113
149
|
<Suspense fallback={<div className="min-h-screen flex items-center justify-center"><LoadingSpinner /></div>}>
|
|
114
150
|
<Routes>
|
|
115
|
-
{/* ── Spine Framework namespace — registered first, always wins over /* ── */}
|
|
116
151
|
<Route path="/spine-framework/admin/*" element={<AdminApp />} />
|
|
117
152
|
<Route path="/spine-framework/api" element={<APIPage />} />
|
|
118
153
|
<Route path="/spine-framework/cli" element={<CLIPage />} />
|
|
119
154
|
|
|
120
|
-
{/* Auth routes: redirect handled by useEffect above, but keep as fallback */}
|
|
121
155
|
<Route path="/login" element={<Navigate to={defaultRedirect} replace />} />
|
|
122
156
|
<Route path="/register" element={<RegisterPage />} />
|
|
123
157
|
<Route path="/forgot-password" element={<ForgotPasswordPage />} />
|
|
124
158
|
<Route path="/auth/confirm" element={<AuthConfirmPage />} />
|
|
125
159
|
|
|
126
|
-
{/* Dynamic app routes — no framework opinions about / or /dashboard */}
|
|
127
160
|
{sorted.map(app => {
|
|
128
161
|
const prefix = app.route_prefix!
|
|
129
162
|
|
|
@@ -158,11 +191,25 @@ function AuthenticatedRouter() {
|
|
|
158
191
|
return null
|
|
159
192
|
})}
|
|
160
193
|
|
|
161
|
-
{/* No apps claim this path */}
|
|
162
194
|
<Route path="*" element={<NotFoundPage />} />
|
|
163
195
|
</Routes>
|
|
164
196
|
</Suspense>
|
|
165
197
|
)
|
|
166
198
|
}
|
|
167
|
-
|
|
199
|
+
// CIL[END chunk_id="App_authenticatedrouter_1783931090"]
|
|
200
|
+
// CIL[BEGIN chunk_id="App_export_1783931090" type="export" identity="export_default" parent="none"]
|
|
201
|
+
// CIL[DOC-MACRO purpose="Export the main App component as default"]
|
|
202
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide the entry point for the React application"]
|
|
203
|
+
// CIL[DOC-CONTEXT module="App" layer="entry-point" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
|
|
204
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="App component" errors="none" side_effects="Application bootstrap"]
|
|
205
|
+
// CIL[DOC-MICRO logic_summary="Default export of the root App component" notable_decisions="[]"]
|
|
206
|
+
// CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
|
|
207
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
208
|
+
// CIL[DOC-VECTOR type="context" content="Layer: entry-point. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
|
|
209
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
210
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
211
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
212
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
213
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
168
214
|
export default App
|
|
215
|
+
// CIL[END chunk_id="App_export_1783931090"]
|