shkit 1.2.0__tar.gz → 1.2.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.
- {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/build-wheel.yml +3 -3
- {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/ci.yml +2 -2
- {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/deploy-prod.yml +2 -2
- {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/incident-dispatch.yml +2 -2
- {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/publish-tenant.yml +3 -3
- {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/pull-antibodies.yml +3 -3
- {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/push-antibodies.yml +4 -4
- shkit-1.2.1/.github/workflows/release-pypi.yml +125 -0
- {shkit-1.2.0 → shkit-1.2.1}/PKG-INFO +1 -1
- {shkit-1.2.0 → shkit-1.2.1}/pyproject.toml +1 -1
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/__init__.py +1 -1
- shkit-1.2.0/.github/workflows/release-pypi.yml +0 -75
- {shkit-1.2.0 → shkit-1.2.1}/.gitignore +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/README.md +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/config/dev.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/config/prod.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/config/staging.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/config/workspace.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/databricks.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/.user.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/dbt_project.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/ai_accuracy_metrics.sql +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/healing_audit_log.sql +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/healing_config.sql +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/healing_state.sql +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/resolution_cache.sql +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/schema.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/token_budget.sql +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/profiles.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/seeds/healing_config_defaults.csv +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/tests/assert_valid_action_ids.sql +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/dbt_project/tests/assert_valid_healing_modes.sql +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/deploy/init_scripts/iic_agent.sh +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/docs/ANTIBODIES.md +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/docs/ARCHITECTURE.md +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/docs/AUTOMATION.md +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/docs/INSTALL.md +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/docs/MIGRATION.md +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/docs/SELF_ARMING.md +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/docs/V4_ARCHITECTURE.md +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/docs/architecture.svg +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/iic_autoload.pth +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/notebooks/approval_handler.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/notebooks/audit_retention.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/notebooks/incident_engine.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/notebooks/weekly_accuracy_job.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/onboarding/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/onboarding/cli.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/onboarding/config_schema.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/onboarding/manifest.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/onboarding/preflight.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/onboarding/provisioner.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/onboarding/rollback.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/requirements.txt +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/resources/incident_workflows.yml +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/scripts/publish_tenant.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/scripts/smoke_databricks.md +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/scripts/smoke_local.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/scripts/sync_antibodies.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/setup.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/auth.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/clients/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/clients/databricks_client.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/clients/teams_client.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/models/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/models/diagnosis.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/models/events.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/models/evidence.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/runtime/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/runtime/approval.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/runtime/maintenance.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/cache_service.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/circuit_breaker.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/context_agent.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/dependency_graph.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/diagnosis_engine.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/identity.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/model_router.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/query_guard.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/resolution_verifier.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/token_budget.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/utils/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/utils/error_hash.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/utils/hmac_tokens.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/utils/sql_safety.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/__main__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/_console.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/_doctor.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/change/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/change/change_detector.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/context/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/context/context_builder.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/dependency/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/dependency/dependency_analyzer.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/diagnosis/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/diagnosis/diagnosis_engine.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/dna/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/dna/dna_builder.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/impact/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/impact/impact_engine.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/base.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/databricks_source.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/static_source.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/webhook_source.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/change.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/context.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/diagnosis.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/dna.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/event.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/impact.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/report.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/routing.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/notify/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/notify/teams_notifier.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/report/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/report/report_generator.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/routing/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/routing/router.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/_sql.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/agent_config.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/agent_runtime.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/antibodies.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/bootstrap.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/constants.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/context.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/detective.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/hooks.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/incident_engine.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/inprocess.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/ledger.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/monitor.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/pattern_store.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/reconciler.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/scope_config.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/store.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/wrapper.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/integration/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/integration/check_agent_run.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/integration/check_job_params.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/integration/check_task_output.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/integration/deploy_consolidated_agent.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/integration/fix_job_add_aggregator.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/integration/test_v2_live_validation.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/property/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/__init__.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_circuit_breaker.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_error_hash.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_identity.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_change_detector.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_context_builder.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_dependency_analyzer.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_diagnosis_engine.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_dna_builder.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_engine.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_event.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_impact_engine.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_report_and_notify.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_router.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_model_router.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_query_guard.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_resolution_verifier.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_sql_safety.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_antibodies.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_console_doctor.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_context_cache.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_detective.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_monitor.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_reconciler.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_scope_config.py +0 -0
- {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_self_arming.py +0 -0
|
@@ -19,8 +19,8 @@ jobs:
|
|
|
19
19
|
DATABRICKS_HOST: ${{ secrets.DATABRICKS_HOST }}
|
|
20
20
|
DATABRICKS_TOKEN: ${{ secrets.DATABRICKS_TOKEN }}
|
|
21
21
|
steps:
|
|
22
|
-
- uses: actions/checkout@
|
|
23
|
-
- uses: actions/setup-python@
|
|
22
|
+
- uses: actions/checkout@v6
|
|
23
|
+
- uses: actions/setup-python@v6
|
|
24
24
|
with:
|
|
25
25
|
python-version: "3.11"
|
|
26
26
|
|
|
@@ -49,7 +49,7 @@ jobs:
|
|
|
49
49
|
python scripts/smoke_local.py "$WHEEL"
|
|
50
50
|
|
|
51
51
|
- name: Upload wheel artifact (always)
|
|
52
|
-
uses: actions/upload-artifact@
|
|
52
|
+
uses: actions/upload-artifact@v7
|
|
53
53
|
with:
|
|
54
54
|
name: iic-wheel
|
|
55
55
|
path: dist/*.whl
|
|
@@ -12,9 +12,9 @@ jobs:
|
|
|
12
12
|
if: github.event.inputs.confirm == 'deploy-prod'
|
|
13
13
|
environment: production
|
|
14
14
|
steps:
|
|
15
|
-
- uses: actions/checkout@
|
|
15
|
+
- uses: actions/checkout@v6
|
|
16
16
|
- uses: databricks/setup-cli@main
|
|
17
|
-
- uses: actions/setup-python@
|
|
17
|
+
- uses: actions/setup-python@v6
|
|
18
18
|
with:
|
|
19
19
|
python-version: "3.11"
|
|
20
20
|
|
|
@@ -30,16 +30,16 @@ jobs:
|
|
|
30
30
|
# environment: production
|
|
31
31
|
steps:
|
|
32
32
|
- name: Checkout code
|
|
33
|
-
uses: actions/checkout@
|
|
33
|
+
uses: actions/checkout@v6
|
|
34
34
|
|
|
35
35
|
- name: Checkout tenant config (Access-private)
|
|
36
|
-
uses: actions/checkout@
|
|
36
|
+
uses: actions/checkout@v6
|
|
37
37
|
with:
|
|
38
38
|
repository: yogasathyandrun/Access-private
|
|
39
39
|
path: _tenants
|
|
40
40
|
token: ${{ secrets.CONFIG_REPO_TOKEN }}
|
|
41
41
|
|
|
42
|
-
- uses: actions/setup-python@
|
|
42
|
+
- uses: actions/setup-python@v6
|
|
43
43
|
with:
|
|
44
44
|
python-version: "3.11"
|
|
45
45
|
|
|
@@ -31,16 +31,16 @@ jobs:
|
|
|
31
31
|
runs-on: ubuntu-latest
|
|
32
32
|
steps:
|
|
33
33
|
- name: Checkout code
|
|
34
|
-
uses: actions/checkout@
|
|
34
|
+
uses: actions/checkout@v6
|
|
35
35
|
|
|
36
36
|
- name: Checkout tenant config (Access-private, write scope)
|
|
37
|
-
uses: actions/checkout@
|
|
37
|
+
uses: actions/checkout@v6
|
|
38
38
|
with:
|
|
39
39
|
repository: yogasathyandrun/Access-private
|
|
40
40
|
path: _tenants
|
|
41
41
|
token: ${{ secrets.CONFIG_REPO_TOKEN }}
|
|
42
42
|
|
|
43
|
-
- uses: actions/setup-python@
|
|
43
|
+
- uses: actions/setup-python@v6
|
|
44
44
|
with:
|
|
45
45
|
python-version: "3.11"
|
|
46
46
|
|
|
@@ -26,7 +26,7 @@ name: "[DEPRECATED] Push antibodies to tenant"
|
|
|
26
26
|
# notify:
|
|
27
27
|
# runs-on: ubuntu-latest
|
|
28
28
|
# steps:
|
|
29
|
-
# - uses: actions/checkout@
|
|
29
|
+
# - uses: actions/checkout@v6
|
|
30
30
|
# - name: Fire push for each changed tenant
|
|
31
31
|
# env:
|
|
32
32
|
# GH_TOKEN: ${{ secrets.KIT_DISPATCH_TOKEN }} # repo scope on Self-healing-kit
|
|
@@ -62,16 +62,16 @@ jobs:
|
|
|
62
62
|
run: echo "tenant=${{ inputs.tenant || github.event.client_payload.tenant }}" >> "$GITHUB_OUTPUT"
|
|
63
63
|
|
|
64
64
|
- name: Checkout code
|
|
65
|
-
uses: actions/checkout@
|
|
65
|
+
uses: actions/checkout@v6
|
|
66
66
|
|
|
67
67
|
- name: Checkout tenant config (Access-private)
|
|
68
|
-
uses: actions/checkout@
|
|
68
|
+
uses: actions/checkout@v6
|
|
69
69
|
with:
|
|
70
70
|
repository: yogasathyandrun/Access-private
|
|
71
71
|
path: _tenants
|
|
72
72
|
token: ${{ secrets.CONFIG_REPO_TOKEN }}
|
|
73
73
|
|
|
74
|
-
- uses: actions/setup-python@
|
|
74
|
+
- uses: actions/setup-python@v6
|
|
75
75
|
with:
|
|
76
76
|
python-version: "3.11"
|
|
77
77
|
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
# Two ways to cut a release — BOTH publish via Trusted Publishing (OIDC); no token stored.
|
|
4
|
+
#
|
|
5
|
+
# • One-click (recommended): Actions → "Publish to PyPI" → Run workflow → type the new
|
|
6
|
+
# version (e.g. 1.2.1). It bumps pyproject.toml + iic.__version__, commits to main,
|
|
7
|
+
# tags v<version>, runs the gate, and publishes. No "forgot to bump" mistakes.
|
|
8
|
+
# • Manual: bump the version yourself, then `git tag vX.Y.Z && git push origin vX.Y.Z`.
|
|
9
|
+
#
|
|
10
|
+
# IMPORTANT: the FILENAME must stay `release-pypi.yml` — the PyPI Trusted Publisher is
|
|
11
|
+
# bound to it. (The sidebar shows the display name above, "Publish to PyPI".)
|
|
12
|
+
#
|
|
13
|
+
# The one-click path commits the bump to `main`; if `main` has branch protection that
|
|
14
|
+
# blocks the Actions bot, use the manual path (or allow the bot to push).
|
|
15
|
+
on:
|
|
16
|
+
push:
|
|
17
|
+
tags: ["v*"]
|
|
18
|
+
workflow_dispatch:
|
|
19
|
+
inputs:
|
|
20
|
+
version:
|
|
21
|
+
description: "New version, e.g. 1.2.1 (bumps pyproject + __init__, commits to main, tags v<version>)"
|
|
22
|
+
required: true
|
|
23
|
+
type: string
|
|
24
|
+
|
|
25
|
+
permissions:
|
|
26
|
+
contents: read
|
|
27
|
+
|
|
28
|
+
jobs:
|
|
29
|
+
prepare:
|
|
30
|
+
# Only the one-click path runs this; the manual `git tag` path skips straight to gate.
|
|
31
|
+
if: github.event_name == 'workflow_dispatch'
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
permissions:
|
|
34
|
+
contents: write # commit the version bump + push the tag
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v6
|
|
37
|
+
with:
|
|
38
|
+
ref: main
|
|
39
|
+
- name: Validate version, bump, commit, tag
|
|
40
|
+
run: |
|
|
41
|
+
set -e
|
|
42
|
+
V="${{ inputs.version }}"
|
|
43
|
+
echo "$V" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+([._-]?(a|b|rc|post|dev)[0-9]+)?$' \
|
|
44
|
+
|| { echo "❌ '$V' is not a valid version (expected like 1.2.1)"; exit 1; }
|
|
45
|
+
if git rev-parse "v$V" >/dev/null 2>&1; then echo "❌ tag v$V already exists"; exit 1; fi
|
|
46
|
+
python - "$V" <<'PY'
|
|
47
|
+
import re, sys, pathlib
|
|
48
|
+
v = sys.argv[1]
|
|
49
|
+
for path, key in (("pyproject.toml", "version"), ("src/iic/__init__.py", "__version__")):
|
|
50
|
+
p = pathlib.Path(path)
|
|
51
|
+
pat = rf'(?m)^{re.escape(key)} = ".*"'
|
|
52
|
+
new = p.read_text()
|
|
53
|
+
if not re.search(pat, new):
|
|
54
|
+
raise SystemExit(f"could not find {key} in {path}")
|
|
55
|
+
p.write_text(re.sub(pat, f'{key} = "{v}"', new, count=1))
|
|
56
|
+
print("bumped to", v)
|
|
57
|
+
PY
|
|
58
|
+
git config user.name "iic-release-bot"
|
|
59
|
+
git config user.email "iic-release-bot@users.noreply.github.com"
|
|
60
|
+
git commit -am "release v$V"
|
|
61
|
+
git tag "v$V"
|
|
62
|
+
git push origin HEAD:main
|
|
63
|
+
git push origin "v$V"
|
|
64
|
+
echo "✅ committed bump + pushed tag v$V"
|
|
65
|
+
|
|
66
|
+
gate:
|
|
67
|
+
needs: [prepare]
|
|
68
|
+
# Runs on a manual tag push, OR after prepare succeeds on the one-click path.
|
|
69
|
+
if: always() && (github.event_name == 'push' || needs.prepare.result == 'success')
|
|
70
|
+
runs-on: ubuntu-latest
|
|
71
|
+
steps:
|
|
72
|
+
- uses: actions/checkout@v6
|
|
73
|
+
with:
|
|
74
|
+
ref: ${{ github.event_name == 'workflow_dispatch' && format('v{0}', inputs.version) || github.ref }}
|
|
75
|
+
|
|
76
|
+
- uses: actions/setup-python@v6
|
|
77
|
+
with:
|
|
78
|
+
python-version: "3.11"
|
|
79
|
+
|
|
80
|
+
- name: Install + lint + unit tests
|
|
81
|
+
run: |
|
|
82
|
+
pip install -e ".[dev]"
|
|
83
|
+
ruff check src/ onboarding/ --ignore E501
|
|
84
|
+
pytest tests/unit/ -q
|
|
85
|
+
|
|
86
|
+
- name: Build sdist + wheel
|
|
87
|
+
run: |
|
|
88
|
+
pip install build
|
|
89
|
+
python -m build
|
|
90
|
+
ls -l dist/
|
|
91
|
+
|
|
92
|
+
- name: Gate — .pth at wheel root + arms on install
|
|
93
|
+
run: |
|
|
94
|
+
set -e
|
|
95
|
+
WHEEL=$(ls dist/*.whl | head -1)
|
|
96
|
+
python -m zipfile -l "$WHEEL" | awk '{print $1}' | grep -qxE 'iic_autoload\.pth' \
|
|
97
|
+
|| { echo "FAIL: iic_autoload.pth not at wheel root"; exit 1; }
|
|
98
|
+
python -m venv /tmp/relvenv
|
|
99
|
+
/tmp/relvenv/bin/pip install --quiet "$WHEEL"
|
|
100
|
+
/tmp/relvenv/bin/python -c "import sys; assert 'iic.runtime.bootstrap' in sys.modules, 'bootstrap not auto-imported'; print('OK: tripwire armed at startup')"
|
|
101
|
+
|
|
102
|
+
- name: Gate — self-arming smoke (failure → one card)
|
|
103
|
+
run: |
|
|
104
|
+
WHEEL=$(ls dist/*.whl | head -1)
|
|
105
|
+
python scripts/smoke_local.py "$WHEEL"
|
|
106
|
+
|
|
107
|
+
- name: Upload dist
|
|
108
|
+
uses: actions/upload-artifact@v7
|
|
109
|
+
with:
|
|
110
|
+
name: dist
|
|
111
|
+
path: dist/*
|
|
112
|
+
|
|
113
|
+
publish:
|
|
114
|
+
needs: gate
|
|
115
|
+
runs-on: ubuntu-latest
|
|
116
|
+
environment: pypi
|
|
117
|
+
permissions:
|
|
118
|
+
id-token: write # OIDC for PyPI Trusted Publishing — no API token stored
|
|
119
|
+
steps:
|
|
120
|
+
- uses: actions/download-artifact@v8
|
|
121
|
+
with:
|
|
122
|
+
name: dist
|
|
123
|
+
path: dist
|
|
124
|
+
- name: Publish to PyPI (Trusted Publishing / OIDC)
|
|
125
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: shkit
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.1
|
|
4
4
|
Summary: Deterministic + AI hybrid engine that converts Databricks pipeline failures into prioritized, explainable incident intelligence
|
|
5
5
|
Author-email: Sathya <yogasathyandrun.rajesh@zeb.co>
|
|
6
6
|
License: MIT
|
|
@@ -8,7 +8,7 @@ build-backend = "hatchling.build"
|
|
|
8
8
|
# `pip install shkit` but still `import iic`. This MUST match the PyPI Trusted
|
|
9
9
|
# Publisher's project name (see .github/workflows/release-pypi.yml + docs/INSTALL.md).
|
|
10
10
|
name = "shkit"
|
|
11
|
-
version = "1.2.
|
|
11
|
+
version = "1.2.1"
|
|
12
12
|
description = "Deterministic + AI hybrid engine that converts Databricks pipeline failures into prioritized, explainable incident intelligence"
|
|
13
13
|
readme = "README.md"
|
|
14
14
|
requires-python = ">=3.11"
|
|
@@ -17,7 +17,7 @@ The 11-stage pipeline lives in :mod:`iic.runtime.incident_engine`.
|
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
-
__version__ = "1.2.
|
|
20
|
+
__version__ = "1.2.1"
|
|
21
21
|
|
|
22
22
|
# NOTE: `import iic` is intentionally lightweight and does NOT arm anything.
|
|
23
23
|
# The self-arming tripwire is installed by `iic_autoload.pth` at interpreter
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
name: Release to PyPI
|
|
2
|
-
|
|
3
|
-
# On a version tag (v*): build sdist+wheel, run the FULL gate (lint + unit tests +
|
|
4
|
-
# the .pth-at-wheel-root assertion + the fresh-venv arms-on-install + the
|
|
5
|
-
# self-arming smoke), then publish to PyPI via TRUSTED PUBLISHING (OIDC). No PyPI
|
|
6
|
-
# API token is stored anywhere.
|
|
7
|
-
#
|
|
8
|
-
# ONE-TIME MAINTAINER SETUP (on PyPI, before the first release):
|
|
9
|
-
# 1. Claim the distribution name in pyproject.toml [project].name. `iic` may be
|
|
10
|
-
# taken — if so, change [project].name (the ONLY place the dist name lives;
|
|
11
|
-
# the import name stays `iic`) and re-run the grep check in docs/INSTALL.md.
|
|
12
|
-
# 2. Add a PyPI "Trusted Publisher": this repo, workflow `release-pypi.yml`,
|
|
13
|
-
# environment `pypi`. See https://docs.pypi.org/trusted-publishers/.
|
|
14
|
-
on:
|
|
15
|
-
push:
|
|
16
|
-
tags: ["v*"]
|
|
17
|
-
|
|
18
|
-
permissions:
|
|
19
|
-
contents: read
|
|
20
|
-
|
|
21
|
-
jobs:
|
|
22
|
-
gate:
|
|
23
|
-
runs-on: ubuntu-latest
|
|
24
|
-
steps:
|
|
25
|
-
- uses: actions/checkout@v4
|
|
26
|
-
- uses: actions/setup-python@v5
|
|
27
|
-
with:
|
|
28
|
-
python-version: "3.11"
|
|
29
|
-
|
|
30
|
-
- name: Install + lint + unit tests
|
|
31
|
-
run: |
|
|
32
|
-
pip install -e ".[dev]"
|
|
33
|
-
ruff check src/ onboarding/ --ignore E501
|
|
34
|
-
pytest tests/unit/ -q
|
|
35
|
-
|
|
36
|
-
- name: Build sdist + wheel
|
|
37
|
-
run: |
|
|
38
|
-
pip install build
|
|
39
|
-
python -m build
|
|
40
|
-
ls -l dist/
|
|
41
|
-
|
|
42
|
-
- name: Gate — .pth at wheel root + arms on install
|
|
43
|
-
run: |
|
|
44
|
-
set -e
|
|
45
|
-
WHEEL=$(ls dist/*.whl | head -1)
|
|
46
|
-
python -m zipfile -l "$WHEEL" | awk '{print $1}' | grep -qxE 'iic_autoload\.pth' \
|
|
47
|
-
|| { echo "FAIL: iic_autoload.pth not at wheel root"; exit 1; }
|
|
48
|
-
python -m venv /tmp/relvenv
|
|
49
|
-
/tmp/relvenv/bin/pip install --quiet "$WHEEL" 2>/dev/null || /tmp/relvenv/bin/pip install --quiet "$WHEEL"
|
|
50
|
-
/tmp/relvenv/bin/python -c "import sys; assert 'iic.runtime.bootstrap' in sys.modules, 'bootstrap not auto-imported'; print('OK: tripwire armed at startup')"
|
|
51
|
-
|
|
52
|
-
- name: Gate — self-arming smoke (failure → one card)
|
|
53
|
-
run: |
|
|
54
|
-
WHEEL=$(ls dist/*.whl | head -1)
|
|
55
|
-
python scripts/smoke_local.py "$WHEEL"
|
|
56
|
-
|
|
57
|
-
- name: Upload dist
|
|
58
|
-
uses: actions/upload-artifact@v4
|
|
59
|
-
with:
|
|
60
|
-
name: dist
|
|
61
|
-
path: dist/*
|
|
62
|
-
|
|
63
|
-
publish:
|
|
64
|
-
needs: gate
|
|
65
|
-
runs-on: ubuntu-latest
|
|
66
|
-
environment: pypi
|
|
67
|
-
permissions:
|
|
68
|
-
id-token: write # OIDC for PyPI Trusted Publishing — no API token stored
|
|
69
|
-
steps:
|
|
70
|
-
- uses: actions/download-artifact@v4
|
|
71
|
-
with:
|
|
72
|
-
name: dist
|
|
73
|
-
path: dist
|
|
74
|
-
- name: Publish to PyPI (Trusted Publishing / OIDC)
|
|
75
|
-
uses: pypa/gh-action-pypi-publish@release/v1
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|