mainsequence 4.4.8__tar.gz → 4.4.10__tar.gz
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.
- {mainsequence-4.4.8/mainsequence.egg-info → mainsequence-4.4.10}/PKG-INFO +1 -1
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/AGENTS.md +28 -11
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +14 -6
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +40 -2
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +4 -2
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/command_center/connections/SKILL.md +26 -1
- {mainsequence-4.4.8/agent_scaffold/skills/command_center → mainsequence-4.4.10/agent_scaffold/skills/command_center/widgets}/app_components/SKILL.md +9 -5
- mainsequence-4.4.10/agent_scaffold/skills/command_center/widgets/tables/SKILL.md +333 -0
- mainsequence-4.4.10/agent_scaffold/skills/command_center/widgets/tabular_transform/SKILL.md +232 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +37 -3
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +11 -2
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +1 -1
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +1 -1
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +1 -1
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/project_builder/SKILL.md +1 -1
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/command_center/__init__.py +4 -0
- mainsequence-4.4.10/mainsequence/client/command_center/contracts/__init__.py +5 -0
- mainsequence-4.4.10/mainsequence/client/command_center/contracts/adapter_from_api.py +204 -0
- mainsequence-4.4.10/mainsequence/client/command_center/contracts/response_mapping.py +79 -0
- mainsequence-4.4.10/mainsequence/client/command_center/contracts/table_visuals.py +180 -0
- mainsequence-4.4.10/mainsequence/client/command_center/contracts/tabular.py +284 -0
- mainsequence-4.4.10/mainsequence/client/command_center/contracts/ui.py +23 -0
- mainsequence-4.4.10/mainsequence/client/command_center/providers/__init__.py +1 -0
- mainsequence-4.4.10/mainsequence/client/command_center/providers/adapter_from_api.py +153 -0
- mainsequence-4.4.10/mainsequence/client/command_center/widgets/__init__.py +5 -0
- mainsequence-4.4.10/mainsequence/client/command_center/widgets/bindings.py +78 -0
- mainsequence-4.4.10/mainsequence/client/command_center/widgets/connection_query.py +120 -0
- mainsequence-4.4.10/mainsequence/client/command_center/widgets/registry.py +46 -0
- mainsequence-4.4.10/mainsequence/client/command_center/widgets/table.py +455 -0
- mainsequence-4.4.10/mainsequence/client/command_center/widgets/tabular_transform.py +410 -0
- mainsequence-4.4.10/mainsequence/client/command_center/workspaces/__init__.py +2 -0
- mainsequence-4.4.10/mainsequence/client/command_center/workspaces/documents.py +43 -0
- mainsequence-4.4.10/mainsequence/client/command_center/workspaces/mounted_widgets.py +40 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10/mainsequence.egg-info}/PKG-INFO +1 -1
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence.egg-info/SOURCES.txt +22 -1
- {mainsequence-4.4.8 → mainsequence-4.4.10}/pyproject.toml +1 -1
- mainsequence-4.4.10/tests/test_command_center_table_contracts.py +177 -0
- mainsequence-4.4.10/tests/test_command_center_tabular_transform.py +212 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/LICENSE +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/README.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/__main__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/bootstrap.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/api.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/cli.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/config.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/migrations.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/cli/ui.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/agent_runtime_models.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/base.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/client.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/command_center/connections.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/dtype_codec.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/metatables/core.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/models_foundry.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/models_user.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/client/utils.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/defaults.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/logconf.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/data_nodes/models.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/migrations/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/migrations/alembic.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/migrations/env.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/migrations/provider.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/migrations/registry.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence/scaffold_skills.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/setup.cfg +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_auth_precedence.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_cli.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_cli_migrations.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_client.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_command_center_data_models.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_command_center_models.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_data_access_mixin_dimension_audit.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_data_node_storage_dimension_queries.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_data_node_update_flow.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_dependency_extras.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_filter_normalization.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_instrumentation.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_logconf.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_meta_table_migrations.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_meta_tables_client_models.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_run_configuration.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_scaffold_skills.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_schema_names.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_secret_client_model.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_source_table_configuration.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_update_statistics.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_update_uid_guards.py +0 -0
- {mainsequence-4.4.8 → mainsequence-4.4.10}/tests/test_workspace_snapshot.py +0 -0
|
@@ -17,17 +17,25 @@ uses them to update only the Main Sequence section below.
|
|
|
17
17
|
<!-- mainsequence-agent-scaffold:start schema=1 source=agent_scaffold -->
|
|
18
18
|
## Main Sequence Instructions
|
|
19
19
|
|
|
20
|
-
Before any non-trivial Main Sequence work, update the project SDK first
|
|
21
|
-
installed
|
|
22
|
-
`.agents/skills/mainsequence/` match the installed SDK version:
|
|
20
|
+
Before any non-trivial Main Sequence work, update the project SDK first, then compare the
|
|
21
|
+
installed SDK version with the managed skills pin:
|
|
23
22
|
|
|
24
23
|
- `mainsequence project update-sdk --path .`
|
|
24
|
+
|
|
25
|
+
After the SDK update, inspect `.agents/skills/mainsequence/PINNED_FROM.txt`.
|
|
26
|
+
Its `pinned_version=...` value records the SDK version that supplied the copied
|
|
27
|
+
Main Sequence skills. Compare that value with the installed SDK version reported
|
|
28
|
+
by `mainsequence --version`.
|
|
29
|
+
|
|
30
|
+
Refresh the managed scaffold only when `PINNED_FROM.txt` is missing or its
|
|
31
|
+
`pinned_version` differs from the installed SDK version:
|
|
32
|
+
|
|
25
33
|
- `mainsequence project update AGENTS.md --path .`
|
|
26
34
|
- `mainsequence project update_agent_skills --path .`
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
36
|
+
If `pinned_version` already matches the installed SDK version, do not refresh
|
|
37
|
+
`AGENTS.md` or `.agents/skills/mainsequence/` as a startup ritual; continue with
|
|
38
|
+
the task.
|
|
31
39
|
|
|
32
40
|
Canonical Main Sequence documentation root:
|
|
33
41
|
`https://mainsequence-sdk.github.io/mainsequence-sdk/`
|
|
@@ -183,7 +191,13 @@ Typical routing:
|
|
|
183
191
|
- Command Center workspace JSON creation/update and mounted widget mutation:
|
|
184
192
|
`.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
|
|
185
193
|
- AppComponents, custom forms, and widget input or output contracts:
|
|
186
|
-
`.agents/skills/mainsequence/command_center/app_components/SKILL.md`
|
|
194
|
+
`.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
|
|
195
|
+
- Command Center table/pro-table widgets, tabular frames, table visual metadata, formulas,
|
|
196
|
+
selections, and live merge mappings:
|
|
197
|
+
`.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
|
|
198
|
+
- Command Center tabular transform widgets, projection, filtering, aggregate, pivot, unpivot,
|
|
199
|
+
computed columns, and seed/live update bindings:
|
|
200
|
+
`.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
|
|
187
201
|
- predeployment AppComponent/API contract testing through `apiTargetMode: "mock-json"`:
|
|
188
202
|
`.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md`
|
|
189
203
|
- jobs, schedules, images, project resources, releases, and Artifacts:
|
|
@@ -211,12 +225,15 @@ For any non-trivial Main Sequence task:
|
|
|
211
225
|
`mainsequence project open-signed-terminal <PROJECT_ID>`
|
|
212
226
|
11. Before proceeding with non-trivial Main Sequence work, update the project SDK:
|
|
213
227
|
`mainsequence project update-sdk --path .`
|
|
214
|
-
12. After updating the SDK,
|
|
228
|
+
12. After updating the SDK, compare `mainsequence --version` with
|
|
229
|
+
`.agents/skills/mainsequence/PINNED_FROM.txt` field `pinned_version=...`.
|
|
230
|
+
13. If `PINNED_FROM.txt` is missing or `pinned_version` differs from the installed
|
|
231
|
+
SDK version, refresh the managed scaffold files:
|
|
215
232
|
`mainsequence project update AGENTS.md --path .`
|
|
216
233
|
`mainsequence project update_agent_skills --path .`
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
234
|
+
14. If `pinned_version` already matches the installed SDK version, do not refresh
|
|
235
|
+
`AGENTS.md` or `.agents/skills/mainsequence/` as a startup ritual.
|
|
236
|
+
15. Verify platform state with the CLI or platform tooling instead of guessing.
|
|
220
237
|
|
|
221
238
|
## Orchestrator Rule
|
|
222
239
|
|
|
@@ -51,7 +51,11 @@ This skill must not claim ownership of:
|
|
|
51
51
|
- Command Center workspaces:
|
|
52
52
|
`.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
|
|
53
53
|
- AppComponents and custom forms:
|
|
54
|
-
`.agents/skills/mainsequence/command_center/app_components/SKILL.md`
|
|
54
|
+
`.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
|
|
55
|
+
- Command Center table/pro-table response contracts:
|
|
56
|
+
`.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
|
|
57
|
+
- Command Center tabular transform consumers:
|
|
58
|
+
`.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
|
|
55
59
|
- Adapter from API provider-side Command Center connection endpoints:
|
|
56
60
|
`.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md`
|
|
57
61
|
- predeployment mock API contract validation:
|
|
@@ -69,14 +73,18 @@ This skill must not claim ownership of:
|
|
|
69
73
|
4. `docs/knowledge/fastapi/index.md`
|
|
70
74
|
5. `docs/knowledge/command_center/widget_data_contracts.md`
|
|
71
75
|
6. `docs/knowledge/command_center/forms.md`
|
|
72
|
-
7. `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
|
|
76
|
+
7. `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
|
|
73
77
|
|
|
74
78
|
Also load:
|
|
75
79
|
|
|
76
80
|
8. `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md` when the API is tied to mounted widgets, workspace payloads, or workspace mutation
|
|
77
|
-
9. `.agents/skills/mainsequence/command_center/
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
9. `.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md` when the API returns
|
|
82
|
+
`core.tabular_frame@v1`, `meta.tableVisuals`, or table/pro-table widget-facing data
|
|
83
|
+
10. `.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md` when the API
|
|
84
|
+
response will be reshaped by `core__tabular-transform`
|
|
85
|
+
11. `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md` when the API must be consumed through a Command Center Adapter from API connection
|
|
86
|
+
12. `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md` when the contract should be validated in AppComponent mock mode before backend deployment
|
|
87
|
+
13. `.agents/skills/mainsequence/platform_operations/orchestration_and_releases/SKILL.md` when the API must become usable from Command Center or an AppComponent
|
|
80
88
|
|
|
81
89
|
Do not wait for the user to say "Command Center" explicitly if the API is being built as a platform UI surface. That is the default assumption in Main Sequence projects.
|
|
82
90
|
|
|
@@ -138,7 +146,7 @@ In a Main Sequence project, assume API work is for Command Center unless the use
|
|
|
138
146
|
That means:
|
|
139
147
|
|
|
140
148
|
- prefer widget-facing contracts by default
|
|
141
|
-
- load `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
|
|
149
|
+
- load `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
|
|
142
150
|
- also load `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md` when the API is coupled to mounted workspace widgets or workspace payloads
|
|
143
151
|
- load `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md` when the API will be consumed by connection-first workspace dataflow
|
|
144
152
|
- try to use the existing Command Center SDK response model before inventing a new response shape
|
|
@@ -99,6 +99,39 @@ connection/query flow directly. This avoids constant API deployments while itera
|
|
|
99
99
|
contract, operation metadata, response shape, and widget behavior. Switch to `--api-base-url` only
|
|
100
100
|
when the deployed API is ready to be the stable backend target.
|
|
101
101
|
|
|
102
|
+
## SDK Helper Modules
|
|
103
|
+
|
|
104
|
+
Provider code should use the Command Center SDK helpers instead of hand-building the well-known
|
|
105
|
+
contract when the project can depend on `mainsequence-sdk`:
|
|
106
|
+
|
|
107
|
+
```python
|
|
108
|
+
from mainsequence.client.command_center.contracts.adapter_from_api import (
|
|
109
|
+
AdapterFromApiConfigVariable,
|
|
110
|
+
AdapterFromApiParameter,
|
|
111
|
+
AdapterFromApiSecretInjection,
|
|
112
|
+
AdapterFromApiSecretVariable,
|
|
113
|
+
)
|
|
114
|
+
from mainsequence.client.command_center.contracts.response_mapping import (
|
|
115
|
+
make_tabular_response_mapping,
|
|
116
|
+
)
|
|
117
|
+
from mainsequence.client.command_center.contracts.tabular import make_tabular_frame
|
|
118
|
+
from mainsequence.client.command_center.providers.adapter_from_api import (
|
|
119
|
+
make_health_operation,
|
|
120
|
+
make_provider_contract,
|
|
121
|
+
make_query_operation,
|
|
122
|
+
)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Use:
|
|
126
|
+
|
|
127
|
+
- `contracts.adapter_from_api` for strict provider contract, operation, config variable, and secret
|
|
128
|
+
variable models
|
|
129
|
+
- `providers.adapter_from_api` for `make_health_operation`, `make_query_operation`, and
|
|
130
|
+
`make_provider_contract`
|
|
131
|
+
- `contracts.response_mapping` for optional `responseMappings` metadata
|
|
132
|
+
- `contracts.tabular` for canonical `core.tabular_frame@v1` response helpers such as
|
|
133
|
+
`make_tabular_frame`
|
|
134
|
+
|
|
102
135
|
## Scope
|
|
103
136
|
|
|
104
137
|
This skill owns:
|
|
@@ -131,8 +164,10 @@ Route those concerns to the adjacent skills below.
|
|
|
131
164
|
`.agents/skills/mainsequence/command_center/connections/SKILL.md`
|
|
132
165
|
- Workspace widgets and binding:
|
|
133
166
|
`.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
|
|
167
|
+
- Table/pro-table output contracts and `meta.tableVisuals` metadata:
|
|
168
|
+
`.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
|
|
134
169
|
- AppComponent form-driven actions:
|
|
135
|
-
`.agents/skills/mainsequence/command_center/app_components/SKILL.md`
|
|
170
|
+
`.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
|
|
136
171
|
- API mock/prototype validation before deployment:
|
|
137
172
|
`.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md`
|
|
138
173
|
- FastAPI resources, images, jobs, and releases:
|
|
@@ -330,6 +365,7 @@ For FastAPI providers in Main Sequence repos, full canonical frame endpoints mus
|
|
|
330
365
|
|
|
331
366
|
```python
|
|
332
367
|
from mainsequence.client.command_center.data_models import TabularFrameResponse
|
|
368
|
+
from mainsequence.client.command_center.contracts.tabular import make_tabular_frame
|
|
333
369
|
```
|
|
334
370
|
|
|
335
371
|
Declare `response_model=TabularFrameResponse` instead of recreating the canonical frame shape
|
|
@@ -420,7 +456,9 @@ Before implementing or revising an API for Adapter from API consumption, decide:
|
|
|
420
456
|
|
|
421
457
|
For a FastAPI provider:
|
|
422
458
|
|
|
423
|
-
-
|
|
459
|
+
- use the SDK provider helpers in `mainsequence.client.command_center.providers.adapter_from_api`
|
|
460
|
+
and strict models in `mainsequence.client.command_center.contracts.adapter_from_api` when the
|
|
461
|
+
dependency is available
|
|
424
462
|
- set explicit `operation_id` values on routes
|
|
425
463
|
- expose `GET /.well-known/command-center/connection-contract`
|
|
426
464
|
- expose a zero-argument health route
|
|
@@ -44,9 +44,11 @@ This skill must not claim ownership of:
|
|
|
44
44
|
## Route Adjacent Work
|
|
45
45
|
|
|
46
46
|
- AppComponents and custom forms:
|
|
47
|
-
`.agents/skills/mainsequence/command_center/app_components/SKILL.md`
|
|
47
|
+
`.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
|
|
48
48
|
- Command Center workspaces and widget mutation:
|
|
49
49
|
`.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
|
|
50
|
+
- Tabular transform widgets for downstream reshaping in mock validation:
|
|
51
|
+
`.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
|
|
50
52
|
- APIs and FastAPI:
|
|
51
53
|
`.agents/skills/mainsequence/application_surfaces/api_surfaces/SKILL.md`
|
|
52
54
|
- Jobs, images, resources, and releases:
|
|
@@ -61,7 +63,7 @@ This skill must not claim ownership of:
|
|
|
61
63
|
2. The SDK client models:
|
|
62
64
|
- `mainsequence/client/command_center/app_component.py`
|
|
63
65
|
- `mainsequence/client/command_center/workspace.py`
|
|
64
|
-
3. `.agents/skills/mainsequence/command_center/app_components/SKILL.md`
|
|
66
|
+
3. `.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
|
|
65
67
|
4. `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
|
|
66
68
|
|
|
67
69
|
Only after the mock contract is stable:
|
{mainsequence-4.4.8 → mainsequence-4.4.10}/agent_scaffold/skills/command_center/connections/SKILL.md
RENAMED
|
@@ -24,6 +24,11 @@ connection instance and query model are known.
|
|
|
24
24
|
## This Skill Can Do
|
|
25
25
|
|
|
26
26
|
- discover connection types and instances through `mainsequence.client.command_center.connections`
|
|
27
|
+
- use `mainsequence.client.command_center.widgets.connection_query` for connection-query source
|
|
28
|
+
widget payload drafts
|
|
29
|
+
- use `mainsequence.client.command_center.contracts.*` and
|
|
30
|
+
`mainsequence.client.command_center.providers.*` when validating Adapter from API provider
|
|
31
|
+
contracts
|
|
27
32
|
- decide whether an existing connection instance can support the requested workspace data
|
|
28
33
|
- inspect `ConnectionType.queryModels` and `usageGuidance`
|
|
29
34
|
- verify that a query model can publish the required output contract
|
|
@@ -48,10 +53,14 @@ This skill must not claim ownership of:
|
|
|
48
53
|
`.agents/skills/mainsequence/command_center/workspace_design/SKILL.md`
|
|
49
54
|
- Workspace JSON creation and widget mutation:
|
|
50
55
|
`.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
|
|
56
|
+
- Table/pro-table consumer contracts, table visual metadata, selection, and live update behavior:
|
|
57
|
+
`.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
|
|
58
|
+
- Tabular transform consumer contracts and source/live update bindings:
|
|
59
|
+
`.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
|
|
51
60
|
- Adapter from API connection workflow:
|
|
52
61
|
`.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md`
|
|
53
62
|
- AppComponent forms and action API contracts:
|
|
54
|
-
`.agents/skills/mainsequence/command_center/app_components/SKILL.md`
|
|
63
|
+
`.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
|
|
55
64
|
- API implementation:
|
|
56
65
|
`.agents/skills/mainsequence/application_surfaces/api_surfaces/SKILL.md`
|
|
57
66
|
- Jobs, images, resources, and releases:
|
|
@@ -63,6 +72,22 @@ This skill must not claim ownership of:
|
|
|
63
72
|
- `mainsequence/client/command_center/connections.py`
|
|
64
73
|
- `mainsequence/client/command_center/data_models.py` when validating `core.tabular_frame@v1`
|
|
65
74
|
output shape
|
|
75
|
+
- `mainsequence/client/command_center/contracts/adapter_from_api.py` when validating provider
|
|
76
|
+
discovery contracts
|
|
77
|
+
- `mainsequence/client/command_center/contracts/response_mapping.py` when validating
|
|
78
|
+
response-mapping metadata
|
|
79
|
+
- `mainsequence/client/command_center/contracts/tabular.py` when building or checking canonical
|
|
80
|
+
tabular frames
|
|
81
|
+
- `mainsequence/client/command_center/contracts/table_visuals.py` when table-specific visual
|
|
82
|
+
defaults travel with `meta.tableVisuals`
|
|
83
|
+
- `mainsequence/client/command_center/providers/adapter_from_api.py` when a provider should use
|
|
84
|
+
SDK contract builders
|
|
85
|
+
- `mainsequence/client/command_center/widgets/connection_query.py` when creating
|
|
86
|
+
connection-query source widget payloads
|
|
87
|
+
- `mainsequence/client/command_center/widgets/tabular_transform.py` when a connection-backed
|
|
88
|
+
flow needs a `core__tabular-transform` widget
|
|
89
|
+
- `mainsequence/client/command_center/widgets/bindings.py` when binding seed data or live updates
|
|
90
|
+
into the transform
|
|
66
91
|
2. Widget registry detail for the source and consumer widgets:
|
|
67
92
|
- `mainsequence cc registered_widget_type list --json`
|
|
68
93
|
- `mainsequence cc registered_widget_type detail <WIDGET_ID> --json`
|
|
@@ -47,6 +47,8 @@ This skill must not claim ownership of:
|
|
|
47
47
|
|
|
48
48
|
- Command Center workspaces:
|
|
49
49
|
`.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
|
|
50
|
+
- Command Center table/pro-table output contracts and table visual metadata:
|
|
51
|
+
`.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md`
|
|
50
52
|
- predeployment mock API contract validation:
|
|
51
53
|
`.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md`
|
|
52
54
|
- APIs and FastAPI:
|
|
@@ -71,17 +73,19 @@ This skill must not claim ownership of:
|
|
|
71
73
|
2. `docs/knowledge/command_center/forms.md`
|
|
72
74
|
3. `docs/knowledge/command_center/widget_data_contracts.md`
|
|
73
75
|
4. `mainsequence/client/command_center/app_component.py`
|
|
74
|
-
5. `.agents/skills/mainsequence/command_center/
|
|
75
|
-
|
|
76
|
+
5. `.agents/skills/mainsequence/command_center/widgets/tables/SKILL.md` when AppComponent output will feed
|
|
77
|
+
a table/pro-table widget or needs `core.tabular_frame@v1` plus table visual metadata
|
|
78
|
+
6. `.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md` when API-shaped data must become a connection-backed tabular dataset
|
|
79
|
+
7. `.agents/skills/mainsequence/command_center/connections/SKILL.md` when AppComponent output will be consumed by generic tabular widgets or must align with connection-first dataflow
|
|
76
80
|
|
|
77
81
|
If the AppComponent is backed by project APIs, also read:
|
|
78
82
|
|
|
79
|
-
|
|
80
|
-
|
|
83
|
+
8. `.agents/skills/mainsequence/application_surfaces/api_surfaces/SKILL.md`
|
|
84
|
+
9. `.agents/skills/mainsequence/platform_operations/orchestration_and_releases/SKILL.md`
|
|
81
85
|
|
|
82
86
|
If the task is about validating the API contract before deployment, also read:
|
|
83
87
|
|
|
84
|
-
|
|
88
|
+
10. `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md`
|
|
85
89
|
|
|
86
90
|
## Inputs This Skill Needs
|
|
87
91
|
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: command-center-tables
|
|
3
|
+
description: Use this skill when the task is about Command Center table or pro-table widgets, canonical `core.tabular_frame@v1` responses, table-specific frame visual metadata, table widget column schema, formula columns, conditional formatting, selection outputs, or live merge key mappings. This skill owns the boundary between source-owned tabular frame contracts and persisted table widget props. It does not own workspace layout, connection creation, generic API architecture, AppComponent forms, MetaTable schema design, or DataNode storage design.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Command Center Tables
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Use this skill when a Command Center table surface needs exact contract work.
|
|
11
|
+
|
|
12
|
+
There are two table-related surfaces that must stay separate:
|
|
13
|
+
|
|
14
|
+
- source-owned data contract:
|
|
15
|
+
`core.tabular_frame@v1` plus optional `meta.tableVisuals`
|
|
16
|
+
- widget-owned presentation contract:
|
|
17
|
+
`core__table` or `core__pro-table` mounted widget props
|
|
18
|
+
|
|
19
|
+
Do not mix these contracts. A data producer should return a canonical tabular frame. A workspace
|
|
20
|
+
table widget should define persisted presentation choices, bindings, formulas, selection behavior,
|
|
21
|
+
and live update mappings.
|
|
22
|
+
|
|
23
|
+
## This Skill Can Do
|
|
24
|
+
|
|
25
|
+
- design or review a `core.tabular_frame@v1` response intended for table consumption
|
|
26
|
+
- use `make_tabular_frame`, `make_tabular_field`, and related helpers
|
|
27
|
+
- add or review source-owned `meta.tableVisuals` metadata
|
|
28
|
+
- decide whether display semantics belong in `meta.tableVisuals` or table widget props
|
|
29
|
+
- build or review `core__table` mounted widget payloads
|
|
30
|
+
- build or review `core__pro-table` mounted widget payloads
|
|
31
|
+
- define `TableWidgetColumnSchema`
|
|
32
|
+
- define `TableWidgetColumnOverride`
|
|
33
|
+
- define conditional rules and value labels
|
|
34
|
+
- use formula helpers and `make_formula_column` for pro-table only
|
|
35
|
+
- define selection mode and selection key fields
|
|
36
|
+
- define live merge key mappings for incremental table updates
|
|
37
|
+
- verify table/pro-table widget registry details before mounting or mutating a table widget
|
|
38
|
+
|
|
39
|
+
## This Skill Must Not Claim
|
|
40
|
+
|
|
41
|
+
This skill must not claim ownership of:
|
|
42
|
+
|
|
43
|
+
- workspace narrative, layout, or widget selection strategy
|
|
44
|
+
- workspace JSON mutation or widget-scoped patch execution
|
|
45
|
+
- connection type selection or connection instance creation
|
|
46
|
+
- Adapter from API provider discovery contracts outside table-specific frame output decisions
|
|
47
|
+
- AppComponent request forms, editable forms, or notification responses
|
|
48
|
+
- generic FastAPI route architecture
|
|
49
|
+
- MetaTable schema, DataNode storage, migrations, or governed operations
|
|
50
|
+
- resource releases, jobs, images, RBAC, or sharing
|
|
51
|
+
|
|
52
|
+
## Route Adjacent Work
|
|
53
|
+
|
|
54
|
+
- Workspace design and deciding whether the view should be a table:
|
|
55
|
+
`.agents/skills/mainsequence/command_center/workspace_design/SKILL.md`
|
|
56
|
+
- Workspace JSON creation, table mounting, and widget mutation:
|
|
57
|
+
`.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
|
|
58
|
+
- Connection-backed source data and query model selection:
|
|
59
|
+
`.agents/skills/mainsequence/command_center/connections/SKILL.md`
|
|
60
|
+
- Adapter from API provider contracts:
|
|
61
|
+
`.agents/skills/mainsequence/command_center/adapter_from_api/SKILL.md`
|
|
62
|
+
- Tabular transform widgets that reshape data before table consumption:
|
|
63
|
+
`.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
|
|
64
|
+
- AppComponent custom forms and action contracts:
|
|
65
|
+
`.agents/skills/mainsequence/command_center/widgets/app_components/SKILL.md`
|
|
66
|
+
- APIs and FastAPI:
|
|
67
|
+
`.agents/skills/mainsequence/application_surfaces/api_surfaces/SKILL.md`
|
|
68
|
+
- MetaTables:
|
|
69
|
+
`.agents/skills/mainsequence/data_publishing/meta_tables/SKILL.md`
|
|
70
|
+
- DataNodes:
|
|
71
|
+
`.agents/skills/mainsequence/data_publishing/data_nodes/SKILL.md`
|
|
72
|
+
|
|
73
|
+
## Read First
|
|
74
|
+
|
|
75
|
+
1. Verify the table widget catalog through the CLI:
|
|
76
|
+
- `mainsequence cc registered_widget_type list --json`
|
|
77
|
+
- identify `core__table` or `core__pro-table`
|
|
78
|
+
- `mainsequence cc registered_widget_type detail <WIDGET_ID> --json`
|
|
79
|
+
2. `docs/knowledge/command_center/widget_data_contracts.md`
|
|
80
|
+
3. SDK table and tabular models:
|
|
81
|
+
- `mainsequence/client/command_center/contracts/tabular.py`
|
|
82
|
+
- `mainsequence/client/command_center/contracts/table_visuals.py`
|
|
83
|
+
- `mainsequence/client/command_center/widgets/table.py`
|
|
84
|
+
- `mainsequence/client/command_center/data_models.py`
|
|
85
|
+
4. If the table consumes connection-backed data:
|
|
86
|
+
- `.agents/skills/mainsequence/command_center/connections/SKILL.md`
|
|
87
|
+
- `mainsequence/client/command_center/widgets/connection_query.py`
|
|
88
|
+
- `mainsequence/client/command_center/widgets/bindings.py`
|
|
89
|
+
5. If the table consumes transformed data:
|
|
90
|
+
- `.agents/skills/mainsequence/command_center/widgets/tabular_transform/SKILL.md`
|
|
91
|
+
- `mainsequence/client/command_center/widgets/tabular_transform.py`
|
|
92
|
+
6. If mounting or mutating a table widget:
|
|
93
|
+
- `.agents/skills/mainsequence/command_center/workspace_builder/SKILL.md`
|
|
94
|
+
- `mainsequence/client/command_center/workspaces/mounted_widgets.py`
|
|
95
|
+
|
|
96
|
+
Use the SDK helper files above before opening frontend implementation files.
|
|
97
|
+
|
|
98
|
+
## Inputs This Skill Needs
|
|
99
|
+
|
|
100
|
+
Before changing a table contract or payload, collect or infer:
|
|
101
|
+
|
|
102
|
+
- target widget id: `core__table` or `core__pro-table`
|
|
103
|
+
- registry detail for that widget id
|
|
104
|
+
- source mode: bound, connection, connection-stream, or manual
|
|
105
|
+
- source frame shape: columns, rows, fields, source, and meta
|
|
106
|
+
- whether the source emits a full `core.tabular_frame@v1` response
|
|
107
|
+
- which fields are stable identity keys
|
|
108
|
+
- which columns should be visible, hidden, pinned, aligned, formatted, or resized
|
|
109
|
+
- which formatting is source-owned default metadata versus workspace-specific override
|
|
110
|
+
- whether formulas are needed
|
|
111
|
+
- whether row/cell selection is needed and which outputs downstream widgets consume
|
|
112
|
+
- whether live updates need merge mappings from seed fields to live-update fields
|
|
113
|
+
|
|
114
|
+
## Required Decisions
|
|
115
|
+
|
|
116
|
+
For every non-trivial table task, decide:
|
|
117
|
+
|
|
118
|
+
1. Should the data be represented as `core.tabular_frame@v1` before it reaches the table?
|
|
119
|
+
2. Does the table need `core__table` or `core__pro-table`?
|
|
120
|
+
3. Are formula columns required? If yes, use `core__pro-table`.
|
|
121
|
+
4. Which display semantics should be emitted by the source in `meta.tableVisuals`?
|
|
122
|
+
5. Which display choices should remain widget-owned props or user/workspace overrides?
|
|
123
|
+
6. Should column descriptions live in frame `fields`, table widget `schema`, or both?
|
|
124
|
+
7. Does selection need stable `selectionKeyFields` and published selection outputs?
|
|
125
|
+
8. Does incremental/live updating need `liveMergeKeyMappings`?
|
|
126
|
+
9. Is a Tabular Transform widget needed before the table?
|
|
127
|
+
10. Has the exact widget registry detail been checked before authoring payloads?
|
|
128
|
+
|
|
129
|
+
## Build Rules
|
|
130
|
+
|
|
131
|
+
### 1. Use Canonical Tabular Frames At The Consumption Boundary
|
|
132
|
+
|
|
133
|
+
Table and pro-table widgets should consume `core.tabular_frame@v1` for generic tabular data.
|
|
134
|
+
|
|
135
|
+
Use:
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
from mainsequence.client.command_center.contracts.tabular import (
|
|
139
|
+
make_tabular_field,
|
|
140
|
+
make_tabular_frame,
|
|
141
|
+
)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Do not bind raw arrays, paginated provider JSON, nested objects, or provider-native payloads
|
|
145
|
+
directly into generic table consumers unless a dedicated widget contract explicitly supports that
|
|
146
|
+
shape.
|
|
147
|
+
|
|
148
|
+
### 2. Keep Source-Owned Table Defaults In `meta.tableVisuals`
|
|
149
|
+
|
|
150
|
+
Use `meta.tableVisuals` for source-owned display metadata that should travel with the frame:
|
|
151
|
+
|
|
152
|
+
```python
|
|
153
|
+
from mainsequence.client.command_center.contracts.table_visuals import (
|
|
154
|
+
make_table_visual_column,
|
|
155
|
+
make_table_visuals,
|
|
156
|
+
)
|
|
157
|
+
from mainsequence.client.command_center.contracts.tabular import make_tabular_frame
|
|
158
|
+
|
|
159
|
+
frame = make_tabular_frame(
|
|
160
|
+
rows=[{"asset": "BTC", "price": 101.25, "change": 0.015}],
|
|
161
|
+
columns=["asset", "price", "change"],
|
|
162
|
+
table_visuals=make_table_visuals(
|
|
163
|
+
{
|
|
164
|
+
"price": make_table_visual_column(format="currency", decimals=2),
|
|
165
|
+
"change": make_table_visual_column(format="percent", decimals=2),
|
|
166
|
+
}
|
|
167
|
+
),
|
|
168
|
+
)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Use `meta.tableVisuals` for stable source semantics such as:
|
|
172
|
+
|
|
173
|
+
- source-recommended labels
|
|
174
|
+
- numeric, currency, percent, bps, or formula result format hints
|
|
175
|
+
- default decimals
|
|
176
|
+
- default heatmap, bar, gradient, gauge, or threshold hints
|
|
177
|
+
- inline series encoding hints for sparkline-like columns
|
|
178
|
+
|
|
179
|
+
Do not put user-specific layout, workspace-local overrides, credentials, connection ids, or runtime
|
|
180
|
+
view state into `meta.tableVisuals`.
|
|
181
|
+
|
|
182
|
+
### 3. Keep Widget-Owned Presentation In Table Props
|
|
183
|
+
|
|
184
|
+
Use table widget props for persisted workspace presentation:
|
|
185
|
+
|
|
186
|
+
```python
|
|
187
|
+
from mainsequence.client.command_center.widgets.table import (
|
|
188
|
+
TableWidgetColumnOverride,
|
|
189
|
+
TableWidgetColumnSchema,
|
|
190
|
+
make_table_widget_payload,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
payload = make_table_widget_payload(
|
|
194
|
+
title="Prices",
|
|
195
|
+
schema=[
|
|
196
|
+
TableWidgetColumnSchema(key="asset", label="Asset", format="text"),
|
|
197
|
+
TableWidgetColumnSchema(key="price", label="Price", format="currency"),
|
|
198
|
+
],
|
|
199
|
+
column_overrides={
|
|
200
|
+
"price": TableWidgetColumnOverride(format="currency", decimals=2, align="right")
|
|
201
|
+
},
|
|
202
|
+
)
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Use widget props for:
|
|
206
|
+
|
|
207
|
+
- table source mode
|
|
208
|
+
- column schema and persistent column overrides
|
|
209
|
+
- toolbar/search/filter/pagination options
|
|
210
|
+
- value labels and conditional rules
|
|
211
|
+
- selection mode and selection output behavior
|
|
212
|
+
- live merge key mappings
|
|
213
|
+
- workspace-specific formatting choices
|
|
214
|
+
|
|
215
|
+
### 4. Formula Columns Require Pro Table
|
|
216
|
+
|
|
217
|
+
Normal table payloads reject formula columns. If the table needs formula columns, use
|
|
218
|
+
`core__pro-table` and `make_pro_table_widget_payload`.
|
|
219
|
+
|
|
220
|
+
```python
|
|
221
|
+
from mainsequence.client.command_center.widgets.table import (
|
|
222
|
+
formula_percent_change,
|
|
223
|
+
make_formula_column,
|
|
224
|
+
make_pro_table_widget_payload,
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
payload = make_pro_table_widget_payload(
|
|
228
|
+
title="Returns",
|
|
229
|
+
schema=[
|
|
230
|
+
make_formula_column(
|
|
231
|
+
key="return_pct",
|
|
232
|
+
label="Return %",
|
|
233
|
+
expression=formula_percent_change("price", "previous_price"),
|
|
234
|
+
result_format="percent",
|
|
235
|
+
)
|
|
236
|
+
],
|
|
237
|
+
)
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Do not force formula props into `core__table`.
|
|
241
|
+
|
|
242
|
+
### 5. Do Not Confuse Frame Fields With Widget Schema
|
|
243
|
+
|
|
244
|
+
Frame `fields` describe the data contract:
|
|
245
|
+
|
|
246
|
+
- key
|
|
247
|
+
- label
|
|
248
|
+
- type
|
|
249
|
+
- nullable
|
|
250
|
+
- provenance
|
|
251
|
+
|
|
252
|
+
Table widget `schema` describes persisted table presentation and table runtime behavior:
|
|
253
|
+
|
|
254
|
+
- format
|
|
255
|
+
- formula expression
|
|
256
|
+
- min width, flex, pinning
|
|
257
|
+
- compactness
|
|
258
|
+
- heatmap eligibility
|
|
259
|
+
|
|
260
|
+
It is valid to use both, but they serve different owners. Do not replace a canonical frame field
|
|
261
|
+
description with widget props, and do not put table runtime-only props into frame fields.
|
|
262
|
+
|
|
263
|
+
### 6. Connection-Backed Tables Must Stay Connection-First
|
|
264
|
+
|
|
265
|
+
If a table consumes backend-owned data:
|
|
266
|
+
|
|
267
|
+
1. resolve the connection instance and query model
|
|
268
|
+
2. use a Connection Query source widget
|
|
269
|
+
3. bind the table input to the source widget output
|
|
270
|
+
4. use a Tabular Transform widget before the table when reshaping is needed
|
|
271
|
+
|
|
272
|
+
Do not store endpoint URLs, credentials, raw provider ids, or route fragments in table widget props.
|
|
273
|
+
|
|
274
|
+
### 7. Live Merge Keys Must Be Stable
|
|
275
|
+
|
|
276
|
+
Use `TableLiveMergeKeyMapping` only when seed-frame rows and live-update rows have stable fields
|
|
277
|
+
that identify the same logical row.
|
|
278
|
+
|
|
279
|
+
Do not configure live merge mappings from display labels, mutable names, timestamps alone, or
|
|
280
|
+
non-unique values.
|
|
281
|
+
|
|
282
|
+
### 8. Selection Outputs Need Stable Keys
|
|
283
|
+
|
|
284
|
+
When the table should drive downstream widgets, define:
|
|
285
|
+
|
|
286
|
+
- `selectionMode`
|
|
287
|
+
- `selectionKeyFields`
|
|
288
|
+
- `publishSelectionOutputs`
|
|
289
|
+
|
|
290
|
+
Selection key fields must identify rows stably enough for downstream consumers.
|
|
291
|
+
|
|
292
|
+
## Review Rules
|
|
293
|
+
|
|
294
|
+
When reviewing table work, look for:
|
|
295
|
+
|
|
296
|
+
- raw provider JSON bound into a generic table
|
|
297
|
+
- table widget props carrying credentials, endpoint URLs, or backend route fragments
|
|
298
|
+
- display defaults that should be source-owned but were hardcoded as workspace overrides
|
|
299
|
+
- workspace-local overrides pushed into `meta.tableVisuals`
|
|
300
|
+
- formula columns mounted on `core__table` instead of `core__pro-table`
|
|
301
|
+
- duplicate table schema column keys
|
|
302
|
+
- conditional rules referencing missing schema columns
|
|
303
|
+
- selection outputs without stable key fields
|
|
304
|
+
- live merge mappings based on unstable or non-unique fields
|
|
305
|
+
- frame `fields` being used as a substitute for widget runtime schema, or the reverse
|
|
306
|
+
- table payloads authored before registry detail was checked
|
|
307
|
+
|
|
308
|
+
## Validation Checklist
|
|
309
|
+
|
|
310
|
+
Do not claim the table contract is ready until:
|
|
311
|
+
|
|
312
|
+
- the target widget id was verified through registry detail
|
|
313
|
+
- data consumed by generic table widgets is `core.tabular_frame@v1`
|
|
314
|
+
- frame columns and row keys are aligned
|
|
315
|
+
- important field types are represented in `fields`
|
|
316
|
+
- source-specific runtime details live in `source.context`
|
|
317
|
+
- source-owned display defaults, if any, live under `meta.tableVisuals`
|
|
318
|
+
- table widget props serialize through `make_table_widget_payload` or `make_pro_table_widget_payload`
|
|
319
|
+
- formula columns use `core__pro-table`
|
|
320
|
+
- selection and live merge keys are stable when configured
|
|
321
|
+
- the workspace handoff identifies bindings from source outputs to table inputs
|
|
322
|
+
|
|
323
|
+
## Stop Conditions
|
|
324
|
+
|
|
325
|
+
Stop and route to the adjacent skill when:
|
|
326
|
+
|
|
327
|
+
- the task is deciding whether a table is the right widget
|
|
328
|
+
- the table needs a connection instance or query model that does not exist
|
|
329
|
+
- the API cannot emit `core.tabular_frame@v1` but the table needs generic tabular data
|
|
330
|
+
- table widget registry detail is unavailable or contradicts the SDK model
|
|
331
|
+
- formulas are required but `core__pro-table` is unavailable
|
|
332
|
+
- stable selection or live merge keys cannot be identified
|
|
333
|
+
- the task has moved into workspace JSON mutation or backend API implementation
|