mainsequence 8.0.0__tar.gz → 8.0.1__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-8.0.0/mainsequence.egg-info → mainsequence-8.0.1}/PKG-INFO +1 -1
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/AGENTS.md +6 -6
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/data_access/exploration/SKILL.md +1 -1
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +2 -2
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +4 -4
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +3 -3
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/cli.py +5 -7
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/logconf.py +2 -12
- mainsequence-8.0.1/mainsequence/repository_identity_security.py +31 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1/mainsequence.egg-info}/PKG-INFO +1 -1
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence.egg-info/SOURCES.txt +1 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/pyproject.toml +1 -1
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_auth_precedence.py +15 -6
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_cli.py +58 -50
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_code_repository_runtime_context.py +11 -3
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_code_repository_skills.py +2 -2
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_logconf.py +19 -7
- {mainsequence-8.0.0 → mainsequence-8.0.1}/LICENSE +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/MANIFEST.in +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/README.md +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/__main__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/bootstrap.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/api.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/code_repository_status.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/config.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/migrations.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/cli/ui.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/agent_runtime_models.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/base.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/client.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/dtype_codec.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/metatables/core.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/models_foundry.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/models_user.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/observability.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/client/utils.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/code_repository_context.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/code_repository_skills.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/defaults.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/migrations/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/migrations/alembic.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/migrations/env.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/migrations/provider.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/migrations/registry.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence/scaffold_skills.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/setup.cfg +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_canonical_api_route_contract.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_cli_migrations.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_client.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_code_repository_branch_contract.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_dependency_extras.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_environment_resource_context.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_environment_response_contracts.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_filter_normalization.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_instrumentation.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_local_ops.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_meta_table_migrations.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_meta_tables_client_models.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_notification_uid_contract.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_observability_client.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_scaffold_skills.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_scheduler_client_model.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_schema_names.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_secret_client_model.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_source_table_configuration.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_ssh_utils.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_time_index_table_access_dimension_audit.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_time_index_table_dimension_queries.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_time_index_table_update_configuration.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_time_index_table_update_configuration_client.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_time_index_table_update_flow.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_time_index_table_update_hard_cut.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_update_statistics.py +0 -0
- {mainsequence-8.0.0 → mainsequence-8.0.1}/tests/test_update_uid_guards.py +0 -0
|
@@ -54,8 +54,8 @@ Canonical Main Sequence documentation root:
|
|
|
54
54
|
|
|
55
55
|
You are the SDK execution orchestrator for a Main Sequence repository.
|
|
56
56
|
|
|
57
|
-
The platform-owned `
|
|
58
|
-
connected
|
|
57
|
+
The platform-owned `code_repository_design` establishes intent, CodeRepository ontology, the
|
|
58
|
+
connected CodeRepository Blueprint, and success criteria. Your SDK-owned
|
|
59
59
|
responsibility is to translate that accepted Blueprint into repository changes,
|
|
60
60
|
CLI/SDK operations, and validation steps.
|
|
61
61
|
|
|
@@ -185,8 +185,8 @@ Use the latest relevant documentation or specialized skill for the task at hand.
|
|
|
185
185
|
|
|
186
186
|
Typical routing:
|
|
187
187
|
|
|
188
|
-
- product architecture, ontology, and
|
|
189
|
-
`.agents/skills/mainsequence/
|
|
188
|
+
- product architecture, ontology, and CodeRepository Blueprint:
|
|
189
|
+
`.agents/skills/mainsequence/code_repository_design/SKILL.md`
|
|
190
190
|
- CodeRepository setup, local checkout, CLI environment, scaffolding, and standard
|
|
191
191
|
repository layout:
|
|
192
192
|
`.agents/skills/mainsequence/sdk_code_repository_execution/SKILL.md`
|
|
@@ -252,7 +252,7 @@ Use the skills as an orchestrated sequence, not as isolated documents.
|
|
|
252
252
|
|
|
253
253
|
Default pattern:
|
|
254
254
|
|
|
255
|
-
1. `.agents/skills/mainsequence/
|
|
255
|
+
1. `.agents/skills/mainsequence/code_repository_design/SKILL.md`
|
|
256
256
|
2. `.agents/skills/mainsequence/sdk_code_repository_execution/SKILL.md`
|
|
257
257
|
3. the relevant domain skill
|
|
258
258
|
|
|
@@ -262,7 +262,7 @@ repository behavior exists and has been verified. The repository source card is
|
|
|
262
262
|
not the runtime A2A Agent Card; the deployed runtime supplies its concrete
|
|
263
263
|
interfaces and security declarations.
|
|
264
264
|
|
|
265
|
-
Use `.agents/skills/mainsequence/
|
|
265
|
+
Use `.agents/skills/mainsequence/code_repository_design/SKILL.md` as the platform
|
|
266
266
|
source of truth for intent and ontology. Use
|
|
267
267
|
`.agents/skills/mainsequence/sdk_code_repository_execution/SKILL.md` for installed-SDK,
|
|
268
268
|
CLI, filesystem, and local repository execution mechanics. Use
|
{mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/data_access/exploration/SKILL.md
RENAMED
|
@@ -44,7 +44,7 @@ This skill discovers and identifies data. It does not publish, redesign, or defi
|
|
|
44
44
|
## Route Adjacent Work
|
|
45
45
|
|
|
46
46
|
- CodeRepository bootstrap, scaffolding, and routing:
|
|
47
|
-
`.agents/skills/mainsequence/
|
|
47
|
+
`.agents/skills/mainsequence/code_repository_design/SKILL.md`
|
|
48
48
|
- `TimeIndexTableUpdater` creation or modification:
|
|
49
49
|
`.agents/skills/mainsequence/data_publishing/time_index_table_updates/SKILL.md`
|
|
50
50
|
- `MetaTable` registration or operation work:
|
{mainsequence-8.0.0 → mainsequence-8.0.1}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md
RENAMED
|
@@ -48,7 +48,7 @@ This skill audits. It does not implement by default.
|
|
|
48
48
|
## Route Adjacent Work
|
|
49
49
|
|
|
50
50
|
- bootstrap, routing, and repo structure:
|
|
51
|
-
`.agents/skills/mainsequence/
|
|
51
|
+
`.agents/skills/mainsequence/code_repository_design/SKILL.md`
|
|
52
52
|
- TimeIndexTableUpdater implementation issues:
|
|
53
53
|
`.agents/skills/mainsequence/data_publishing/time_index_table_updates/SKILL.md`
|
|
54
54
|
- MetaTable implementation issues:
|
|
@@ -70,7 +70,7 @@ Streamlit dashboard design and implementation failures are target-repository app
|
|
|
70
70
|
## Read First
|
|
71
71
|
|
|
72
72
|
1. `AGENTS.md`
|
|
73
|
-
2. `.agents/skills/mainsequence/
|
|
73
|
+
2. `.agents/skills/mainsequence/code_repository_design/SKILL.md`
|
|
74
74
|
3. the latest relevant Main Sequence docs for the failing workflow
|
|
75
75
|
|
|
76
76
|
## Inputs This Skill Needs
|
|
@@ -21,13 +21,13 @@ Own:
|
|
|
21
21
|
|
|
22
22
|
Do not own:
|
|
23
23
|
|
|
24
|
-
- platform ontology or
|
|
24
|
+
- platform ontology or CodeRepository Blueprint design;
|
|
25
25
|
- domain implementation for MetaTables, TimeIndexTableUpdaters, APIs, jobs, or releases;
|
|
26
26
|
- backend repository reconciliation;
|
|
27
27
|
- MCP authorization policy, OAuth token storage, or access-token extraction;
|
|
28
28
|
- repository-owned skills outside `.agents/skills/mainsequence/`.
|
|
29
29
|
|
|
30
|
-
Route architecture changes to `
|
|
30
|
+
Route architecture changes to `code_repository_design`, implementation routing to
|
|
31
31
|
`sdk_code_repository_execution`, and failure classification to
|
|
32
32
|
`maintenance/bug_auditor` when diagnosis extends beyond the maintenance
|
|
33
33
|
workflow itself.
|
|
@@ -129,8 +129,8 @@ the waiting CLI process.
|
|
|
129
129
|
|
|
130
130
|
The command preserves unrelated repository configuration and renders only the
|
|
131
131
|
current supported authentication shape. It removes legacy token aliases and
|
|
132
|
-
all retired
|
|
133
|
-
|
|
132
|
+
all retired repository, branch, and environment identity entries. The Git
|
|
133
|
+
checkout supplies source identity; switching branches changes
|
|
134
134
|
context on the next process run without rewriting `.env`.
|
|
135
135
|
|
|
136
136
|
## Update The CodeRepository SDK
|
|
@@ -7,11 +7,11 @@ description: Use the installed Main Sequence SDK and repository-local tools to v
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Use this SDK-owned execution skill after the platform `
|
|
11
|
-
has established intent,
|
|
10
|
+
Use this SDK-owned execution skill after the platform `code-repository-design` skill
|
|
11
|
+
has established intent, CodeRepository ontology, the connected CodeRepository Blueprint, and
|
|
12
12
|
the observable definition of success. This file owns local SDK, CLI,
|
|
13
13
|
filesystem, and repository mechanics; it does not define the platform ontology
|
|
14
|
-
or replace `
|
|
14
|
+
or replace `code-repository-design`.
|
|
15
15
|
|
|
16
16
|
This skill is for:
|
|
17
17
|
|
|
@@ -2124,6 +2124,10 @@ def _render_code_repository_runtime_env_text(
|
|
|
2124
2124
|
Managed keys are rewritten from scratch to avoid duplicate stale entries.
|
|
2125
2125
|
Obsolete local CodeRepository aliases are not carried into the rendered file.
|
|
2126
2126
|
"""
|
|
2127
|
+
from mainsequence.repository_identity_security import (
|
|
2128
|
+
UNSUPPORTED_SOURCE_IDENTITY_ENV_NAMES,
|
|
2129
|
+
)
|
|
2130
|
+
|
|
2127
2131
|
managed_prefixes = (
|
|
2128
2132
|
"MAINSEQUENCE_AUTH_MODE=",
|
|
2129
2133
|
"MAINSEQUENCE_ACCESS_TOKEN=",
|
|
@@ -2131,14 +2135,8 @@ def _render_code_repository_runtime_env_text(
|
|
|
2131
2135
|
"MAINSEQUENCE_RUNTIME_CREDENTIAL_ID=",
|
|
2132
2136
|
"MAINSEQUENCE_RUNTIME_CREDENTIAL_SECRET=",
|
|
2133
2137
|
"MAINSEQUENCE_ENDPOINT=",
|
|
2134
|
-
# Purge removed identity inputs; they are never read or emitted.
|
|
2135
|
-
"MAIN_SEQUENCE_PROJECT_UID=",
|
|
2136
|
-
"MAIN_SEQUENCE_PROJECT_BRANCH_UID=",
|
|
2137
|
-
"MAINSEQUENCE_REPOSITORY_BRANCH=",
|
|
2138
|
-
"MAIN_SEQUENCE_ORGANIZATION_PROJECT_ENVIRONMENT_UID=",
|
|
2139
|
-
"MAIN_SEQUENCE_PROJECT_ID=",
|
|
2140
2138
|
"MAINSEQUENCE_TOKEN=",
|
|
2141
|
-
)
|
|
2139
|
+
) + tuple(f"{name}=" for name in UNSUPPORTED_SOURCE_IDENTITY_ENV_NAMES)
|
|
2142
2140
|
lines = [
|
|
2143
2141
|
ln
|
|
2144
2142
|
for ln in (env_text or "").replace("\r", "").splitlines()
|
|
@@ -21,21 +21,11 @@ from structlog.stdlib import BoundLogger
|
|
|
21
21
|
|
|
22
22
|
from .defaults import resolve_backend_endpoint
|
|
23
23
|
from .instrumentation import OTelJSONRenderer
|
|
24
|
+
from .repository_identity_security import UNSUPPORTED_SOURCE_IDENTITY_ENV_NAMES
|
|
24
25
|
from .runtime_flags import is_running_in_pod
|
|
25
26
|
|
|
26
27
|
logger = None
|
|
27
28
|
|
|
28
|
-
# Removed identity inputs are denylisted, not supported as aliases.
|
|
29
|
-
_RETIRED_CODE_REPOSITORY_SOURCE_ENV = frozenset(
|
|
30
|
-
{
|
|
31
|
-
"MAIN_SEQUENCE_PROJECT_UID",
|
|
32
|
-
"MAIN_SEQUENCE_PROJECT_BRANCH_UID",
|
|
33
|
-
"MAINSEQUENCE_REPOSITORY_BRANCH",
|
|
34
|
-
"MAIN_SEQUENCE_ORGANIZATION_PROJECT_ENVIRONMENT_UID",
|
|
35
|
-
}
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
|
|
39
29
|
def _get_sdk_version() -> str:
|
|
40
30
|
"""Return the installed SDK package version for automatic log binding."""
|
|
41
31
|
try:
|
|
@@ -227,7 +217,7 @@ def _apply_additional_environment(startup_state: Mapping[str, Any]) -> None:
|
|
|
227
217
|
if isinstance(extra, dict):
|
|
228
218
|
for k, v in extra.items():
|
|
229
219
|
key = str(k)
|
|
230
|
-
if key in
|
|
220
|
+
if key in UNSUPPORTED_SOURCE_IDENTITY_ENV_NAMES:
|
|
231
221
|
continue
|
|
232
222
|
os.environ[key] = str(v)
|
|
233
223
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Security-only rejection list for superseded source-identity inputs.
|
|
2
|
+
|
|
3
|
+
These names are never read as identity and are not compatibility aliases. They
|
|
4
|
+
remain denylisted so backend-provided startup state and an existing local env
|
|
5
|
+
file cannot override the Git-resolved CodeRepositoryBranch context.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
_REMOVED_DOMAIN_TOKEN = "PRO" + "JECT"
|
|
9
|
+
|
|
10
|
+
UNSUPPORTED_REPOSITORY_UID_ENV = (
|
|
11
|
+
"MAIN_SEQUENCE_" + _REMOVED_DOMAIN_TOKEN + "_UID"
|
|
12
|
+
)
|
|
13
|
+
UNSUPPORTED_REPOSITORY_BRANCH_UID_ENV = (
|
|
14
|
+
"MAIN_SEQUENCE_" + _REMOVED_DOMAIN_TOKEN + "_BRANCH_UID"
|
|
15
|
+
)
|
|
16
|
+
UNSUPPORTED_REPOSITORY_NUMERIC_ID_ENV = (
|
|
17
|
+
"MAIN_SEQUENCE_" + _REMOVED_DOMAIN_TOKEN + "_ID"
|
|
18
|
+
)
|
|
19
|
+
UNSUPPORTED_ENVIRONMENT_UID_ENV = (
|
|
20
|
+
"MAIN_SEQUENCE_ORGANIZATION_" + _REMOVED_DOMAIN_TOKEN + "_ENVIRONMENT_UID"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
UNSUPPORTED_SOURCE_IDENTITY_ENV_NAMES = frozenset(
|
|
24
|
+
{
|
|
25
|
+
UNSUPPORTED_REPOSITORY_UID_ENV,
|
|
26
|
+
UNSUPPORTED_REPOSITORY_BRANCH_UID_ENV,
|
|
27
|
+
UNSUPPORTED_REPOSITORY_NUMERIC_ID_ENV,
|
|
28
|
+
UNSUPPORTED_ENVIRONMENT_UID_ENV,
|
|
29
|
+
"MAINSEQUENCE_REPOSITORY_BRANCH",
|
|
30
|
+
}
|
|
31
|
+
)
|
|
@@ -21,6 +21,7 @@ mainsequence/code_repository_context.py
|
|
|
21
21
|
mainsequence/code_repository_skills.py
|
|
22
22
|
mainsequence/defaults.py
|
|
23
23
|
mainsequence/logconf.py
|
|
24
|
+
mainsequence/repository_identity_security.py
|
|
24
25
|
mainsequence/runtime_flags.py
|
|
25
26
|
mainsequence/scaffold_skills.py
|
|
26
27
|
mainsequence.egg-info/PKG-INFO
|
|
@@ -12,11 +12,20 @@ import types
|
|
|
12
12
|
import pytest
|
|
13
13
|
import requests
|
|
14
14
|
|
|
15
|
+
_REMOVED_DOMAIN_TOKEN = "PRO" + "JECT"
|
|
16
|
+
_UNSUPPORTED_REPOSITORY_UID_ENV = "MAIN_SEQUENCE_" + _REMOVED_DOMAIN_TOKEN + "_UID"
|
|
17
|
+
_UNSUPPORTED_REPOSITORY_BRANCH_UID_ENV = (
|
|
18
|
+
"MAIN_SEQUENCE_" + _REMOVED_DOMAIN_TOKEN + "_BRANCH_UID"
|
|
19
|
+
)
|
|
20
|
+
_UNSUPPORTED_ENVIRONMENT_UID_ENV = (
|
|
21
|
+
"MAIN_SEQUENCE_ORGANIZATION_" + _REMOVED_DOMAIN_TOKEN + "_ENVIRONMENT_UID"
|
|
22
|
+
)
|
|
23
|
+
|
|
15
24
|
_RUNTIME_CONTEXT_ENV_NAMES = (
|
|
16
|
-
|
|
17
|
-
|
|
25
|
+
_UNSUPPORTED_REPOSITORY_UID_ENV,
|
|
26
|
+
_UNSUPPORTED_REPOSITORY_BRANCH_UID_ENV,
|
|
18
27
|
"MAINSEQUENCE_REPOSITORY_BRANCH",
|
|
19
|
-
|
|
28
|
+
_UNSUPPORTED_ENVIRONMENT_UID_ENV,
|
|
20
29
|
)
|
|
21
30
|
|
|
22
31
|
|
|
@@ -317,14 +326,14 @@ def test_runtime_credential_provider_reuses_valid_exchanged_access_token(monkeyp
|
|
|
317
326
|
assert calls["count"] == 1
|
|
318
327
|
|
|
319
328
|
|
|
320
|
-
def
|
|
329
|
+
def test_runtime_credential_provider_does_not_mutate_unsupported_identity_environment(
|
|
321
330
|
monkeypatch,
|
|
322
331
|
):
|
|
323
332
|
monkeypatch.delenv("MAINSEQUENCE_ACCESS_TOKEN", raising=False)
|
|
324
333
|
monkeypatch.setenv("MAINSEQUENCE_RUNTIME_CREDENTIAL_ID", "cred-id")
|
|
325
334
|
monkeypatch.setenv("MAINSEQUENCE_RUNTIME_CREDENTIAL_SECRET", "cred-secret")
|
|
326
335
|
monkeypatch.setenv(
|
|
327
|
-
|
|
336
|
+
_UNSUPPORTED_REPOSITORY_BRANCH_UID_ENV,
|
|
328
337
|
"caller-supplied-value-must-be-ignored",
|
|
329
338
|
)
|
|
330
339
|
|
|
@@ -351,7 +360,7 @@ def test_runtime_credential_provider_does_not_mutate_retired_identity_environmen
|
|
|
351
360
|
assert first_headers["Authorization"] == "Bearer organization-runtime-access"
|
|
352
361
|
assert second_headers == first_headers
|
|
353
362
|
assert calls["count"] == 1
|
|
354
|
-
assert os.environ[
|
|
363
|
+
assert os.environ[_UNSUPPORTED_REPOSITORY_BRANCH_UID_ENV] == "caller-supplied-value-must-be-ignored"
|
|
355
364
|
|
|
356
365
|
|
|
357
366
|
def test_runtime_credential_provider_force_refresh_exchanges_again(monkeypatch):
|