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.
Files changed (176) hide show
  1. {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/build-wheel.yml +3 -3
  2. {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/ci.yml +2 -2
  3. {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/deploy-prod.yml +2 -2
  4. {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/incident-dispatch.yml +2 -2
  5. {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/publish-tenant.yml +3 -3
  6. {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/pull-antibodies.yml +3 -3
  7. {shkit-1.2.0 → shkit-1.2.1}/.github/workflows/push-antibodies.yml +4 -4
  8. shkit-1.2.1/.github/workflows/release-pypi.yml +125 -0
  9. {shkit-1.2.0 → shkit-1.2.1}/PKG-INFO +1 -1
  10. {shkit-1.2.0 → shkit-1.2.1}/pyproject.toml +1 -1
  11. {shkit-1.2.0 → shkit-1.2.1}/src/iic/__init__.py +1 -1
  12. shkit-1.2.0/.github/workflows/release-pypi.yml +0 -75
  13. {shkit-1.2.0 → shkit-1.2.1}/.gitignore +0 -0
  14. {shkit-1.2.0 → shkit-1.2.1}/README.md +0 -0
  15. {shkit-1.2.0 → shkit-1.2.1}/config/dev.yml +0 -0
  16. {shkit-1.2.0 → shkit-1.2.1}/config/prod.yml +0 -0
  17. {shkit-1.2.0 → shkit-1.2.1}/config/staging.yml +0 -0
  18. {shkit-1.2.0 → shkit-1.2.1}/config/workspace.yml +0 -0
  19. {shkit-1.2.0 → shkit-1.2.1}/databricks.yml +0 -0
  20. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/.user.yml +0 -0
  21. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/dbt_project.yml +0 -0
  22. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/ai_accuracy_metrics.sql +0 -0
  23. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/healing_audit_log.sql +0 -0
  24. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/healing_config.sql +0 -0
  25. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/healing_state.sql +0 -0
  26. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/resolution_cache.sql +0 -0
  27. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/schema.yml +0 -0
  28. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/models/token_budget.sql +0 -0
  29. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/profiles.yml +0 -0
  30. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/seeds/healing_config_defaults.csv +0 -0
  31. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/tests/assert_valid_action_ids.sql +0 -0
  32. {shkit-1.2.0 → shkit-1.2.1}/dbt_project/tests/assert_valid_healing_modes.sql +0 -0
  33. {shkit-1.2.0 → shkit-1.2.1}/deploy/init_scripts/iic_agent.sh +0 -0
  34. {shkit-1.2.0 → shkit-1.2.1}/docs/ANTIBODIES.md +0 -0
  35. {shkit-1.2.0 → shkit-1.2.1}/docs/ARCHITECTURE.md +0 -0
  36. {shkit-1.2.0 → shkit-1.2.1}/docs/AUTOMATION.md +0 -0
  37. {shkit-1.2.0 → shkit-1.2.1}/docs/INSTALL.md +0 -0
  38. {shkit-1.2.0 → shkit-1.2.1}/docs/MIGRATION.md +0 -0
  39. {shkit-1.2.0 → shkit-1.2.1}/docs/SELF_ARMING.md +0 -0
  40. {shkit-1.2.0 → shkit-1.2.1}/docs/V4_ARCHITECTURE.md +0 -0
  41. {shkit-1.2.0 → shkit-1.2.1}/docs/architecture.svg +0 -0
  42. {shkit-1.2.0 → shkit-1.2.1}/iic_autoload.pth +0 -0
  43. {shkit-1.2.0 → shkit-1.2.1}/notebooks/approval_handler.py +0 -0
  44. {shkit-1.2.0 → shkit-1.2.1}/notebooks/audit_retention.py +0 -0
  45. {shkit-1.2.0 → shkit-1.2.1}/notebooks/incident_engine.py +0 -0
  46. {shkit-1.2.0 → shkit-1.2.1}/notebooks/weekly_accuracy_job.py +0 -0
  47. {shkit-1.2.0 → shkit-1.2.1}/onboarding/__init__.py +0 -0
  48. {shkit-1.2.0 → shkit-1.2.1}/onboarding/cli.py +0 -0
  49. {shkit-1.2.0 → shkit-1.2.1}/onboarding/config_schema.py +0 -0
  50. {shkit-1.2.0 → shkit-1.2.1}/onboarding/manifest.py +0 -0
  51. {shkit-1.2.0 → shkit-1.2.1}/onboarding/preflight.py +0 -0
  52. {shkit-1.2.0 → shkit-1.2.1}/onboarding/provisioner.py +0 -0
  53. {shkit-1.2.0 → shkit-1.2.1}/onboarding/rollback.py +0 -0
  54. {shkit-1.2.0 → shkit-1.2.1}/requirements.txt +0 -0
  55. {shkit-1.2.0 → shkit-1.2.1}/resources/incident_workflows.yml +0 -0
  56. {shkit-1.2.0 → shkit-1.2.1}/scripts/publish_tenant.py +0 -0
  57. {shkit-1.2.0 → shkit-1.2.1}/scripts/smoke_databricks.md +0 -0
  58. {shkit-1.2.0 → shkit-1.2.1}/scripts/smoke_local.py +0 -0
  59. {shkit-1.2.0 → shkit-1.2.1}/scripts/sync_antibodies.py +0 -0
  60. {shkit-1.2.0 → shkit-1.2.1}/setup.py +0 -0
  61. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/__init__.py +0 -0
  62. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/auth.py +0 -0
  63. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/clients/__init__.py +0 -0
  64. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/clients/databricks_client.py +0 -0
  65. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/clients/teams_client.py +0 -0
  66. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/models/__init__.py +0 -0
  67. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/models/diagnosis.py +0 -0
  68. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/models/events.py +0 -0
  69. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/models/evidence.py +0 -0
  70. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/runtime/__init__.py +0 -0
  71. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/runtime/approval.py +0 -0
  72. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/runtime/maintenance.py +0 -0
  73. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/__init__.py +0 -0
  74. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/cache_service.py +0 -0
  75. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/circuit_breaker.py +0 -0
  76. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/context_agent.py +0 -0
  77. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/dependency_graph.py +0 -0
  78. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/diagnosis_engine.py +0 -0
  79. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/identity.py +0 -0
  80. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/model_router.py +0 -0
  81. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/query_guard.py +0 -0
  82. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/resolution_verifier.py +0 -0
  83. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/services/token_budget.py +0 -0
  84. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/utils/__init__.py +0 -0
  85. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/utils/error_hash.py +0 -0
  86. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/utils/hmac_tokens.py +0 -0
  87. {shkit-1.2.0 → shkit-1.2.1}/src/healing_kit/utils/sql_safety.py +0 -0
  88. {shkit-1.2.0 → shkit-1.2.1}/src/iic/__main__.py +0 -0
  89. {shkit-1.2.0 → shkit-1.2.1}/src/iic/_console.py +0 -0
  90. {shkit-1.2.0 → shkit-1.2.1}/src/iic/_doctor.py +0 -0
  91. {shkit-1.2.0 → shkit-1.2.1}/src/iic/change/__init__.py +0 -0
  92. {shkit-1.2.0 → shkit-1.2.1}/src/iic/change/change_detector.py +0 -0
  93. {shkit-1.2.0 → shkit-1.2.1}/src/iic/context/__init__.py +0 -0
  94. {shkit-1.2.0 → shkit-1.2.1}/src/iic/context/context_builder.py +0 -0
  95. {shkit-1.2.0 → shkit-1.2.1}/src/iic/dependency/__init__.py +0 -0
  96. {shkit-1.2.0 → shkit-1.2.1}/src/iic/dependency/dependency_analyzer.py +0 -0
  97. {shkit-1.2.0 → shkit-1.2.1}/src/iic/diagnosis/__init__.py +0 -0
  98. {shkit-1.2.0 → shkit-1.2.1}/src/iic/diagnosis/diagnosis_engine.py +0 -0
  99. {shkit-1.2.0 → shkit-1.2.1}/src/iic/dna/__init__.py +0 -0
  100. {shkit-1.2.0 → shkit-1.2.1}/src/iic/dna/dna_builder.py +0 -0
  101. {shkit-1.2.0 → shkit-1.2.1}/src/iic/impact/__init__.py +0 -0
  102. {shkit-1.2.0 → shkit-1.2.1}/src/iic/impact/impact_engine.py +0 -0
  103. {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/__init__.py +0 -0
  104. {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/base.py +0 -0
  105. {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/databricks_source.py +0 -0
  106. {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/static_source.py +0 -0
  107. {shkit-1.2.0 → shkit-1.2.1}/src/iic/ingestion/webhook_source.py +0 -0
  108. {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/__init__.py +0 -0
  109. {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/change.py +0 -0
  110. {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/context.py +0 -0
  111. {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/diagnosis.py +0 -0
  112. {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/dna.py +0 -0
  113. {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/event.py +0 -0
  114. {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/impact.py +0 -0
  115. {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/report.py +0 -0
  116. {shkit-1.2.0 → shkit-1.2.1}/src/iic/models/routing.py +0 -0
  117. {shkit-1.2.0 → shkit-1.2.1}/src/iic/notify/__init__.py +0 -0
  118. {shkit-1.2.0 → shkit-1.2.1}/src/iic/notify/teams_notifier.py +0 -0
  119. {shkit-1.2.0 → shkit-1.2.1}/src/iic/report/__init__.py +0 -0
  120. {shkit-1.2.0 → shkit-1.2.1}/src/iic/report/report_generator.py +0 -0
  121. {shkit-1.2.0 → shkit-1.2.1}/src/iic/routing/__init__.py +0 -0
  122. {shkit-1.2.0 → shkit-1.2.1}/src/iic/routing/router.py +0 -0
  123. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/__init__.py +0 -0
  124. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/_sql.py +0 -0
  125. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/agent_config.py +0 -0
  126. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/agent_runtime.py +0 -0
  127. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/antibodies.py +0 -0
  128. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/bootstrap.py +0 -0
  129. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/constants.py +0 -0
  130. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/context.py +0 -0
  131. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/detective.py +0 -0
  132. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/hooks.py +0 -0
  133. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/incident_engine.py +0 -0
  134. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/inprocess.py +0 -0
  135. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/ledger.py +0 -0
  136. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/monitor.py +0 -0
  137. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/pattern_store.py +0 -0
  138. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/reconciler.py +0 -0
  139. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/scope_config.py +0 -0
  140. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/store.py +0 -0
  141. {shkit-1.2.0 → shkit-1.2.1}/src/iic/runtime/wrapper.py +0 -0
  142. {shkit-1.2.0 → shkit-1.2.1}/tests/__init__.py +0 -0
  143. {shkit-1.2.0 → shkit-1.2.1}/tests/integration/__init__.py +0 -0
  144. {shkit-1.2.0 → shkit-1.2.1}/tests/integration/check_agent_run.py +0 -0
  145. {shkit-1.2.0 → shkit-1.2.1}/tests/integration/check_job_params.py +0 -0
  146. {shkit-1.2.0 → shkit-1.2.1}/tests/integration/check_task_output.py +0 -0
  147. {shkit-1.2.0 → shkit-1.2.1}/tests/integration/deploy_consolidated_agent.py +0 -0
  148. {shkit-1.2.0 → shkit-1.2.1}/tests/integration/fix_job_add_aggregator.py +0 -0
  149. {shkit-1.2.0 → shkit-1.2.1}/tests/integration/test_v2_live_validation.py +0 -0
  150. {shkit-1.2.0 → shkit-1.2.1}/tests/property/__init__.py +0 -0
  151. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/__init__.py +0 -0
  152. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_circuit_breaker.py +0 -0
  153. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_error_hash.py +0 -0
  154. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_identity.py +0 -0
  155. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_change_detector.py +0 -0
  156. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_context_builder.py +0 -0
  157. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_dependency_analyzer.py +0 -0
  158. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_diagnosis_engine.py +0 -0
  159. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_dna_builder.py +0 -0
  160. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_engine.py +0 -0
  161. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_event.py +0 -0
  162. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_impact_engine.py +0 -0
  163. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_report_and_notify.py +0 -0
  164. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_iic_router.py +0 -0
  165. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_model_router.py +0 -0
  166. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_query_guard.py +0 -0
  167. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_resolution_verifier.py +0 -0
  168. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_sql_safety.py +0 -0
  169. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_antibodies.py +0 -0
  170. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_console_doctor.py +0 -0
  171. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_context_cache.py +0 -0
  172. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_detective.py +0 -0
  173. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_monitor.py +0 -0
  174. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_reconciler.py +0 -0
  175. {shkit-1.2.0 → shkit-1.2.1}/tests/unit/test_v4_scope_config.py +0 -0
  176. {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@v4
23
- - uses: actions/setup-python@v5
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@v4
52
+ uses: actions/upload-artifact@v7
53
53
  with:
54
54
  name: iic-wheel
55
55
  path: dist/*.whl
@@ -9,8 +9,8 @@ jobs:
9
9
  lint-and-test:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
- - uses: actions/checkout@v4
13
- - uses: actions/setup-python@v5
12
+ - uses: actions/checkout@v6
13
+ - uses: actions/setup-python@v6
14
14
  with:
15
15
  python-version: "3.11"
16
16
  - name: Install package
@@ -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@v4
15
+ - uses: actions/checkout@v6
16
16
  - uses: databricks/setup-cli@main
17
- - uses: actions/setup-python@v5
17
+ - uses: actions/setup-python@v6
18
18
  with:
19
19
  python-version: "3.11"
20
20
 
@@ -16,9 +16,9 @@ jobs:
16
16
  investigate:
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
- - uses: actions/checkout@v4
19
+ - uses: actions/checkout@v6
20
20
 
21
- - uses: actions/setup-python@v5
21
+ - uses: actions/setup-python@v6
22
22
  with:
23
23
  python-version: "3.11"
24
24
 
@@ -30,16 +30,16 @@ jobs:
30
30
  # environment: production
31
31
  steps:
32
32
  - name: Checkout code
33
- uses: actions/checkout@v4
33
+ uses: actions/checkout@v6
34
34
 
35
35
  - name: Checkout tenant config (Access-private)
36
- uses: actions/checkout@v4
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@v5
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@v4
34
+ uses: actions/checkout@v6
35
35
 
36
36
  - name: Checkout tenant config (Access-private, write scope)
37
- uses: actions/checkout@v4
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@v5
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@v4
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@v4
65
+ uses: actions/checkout@v6
66
66
 
67
67
  - name: Checkout tenant config (Access-private)
68
- uses: actions/checkout@v4
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@v5
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.0
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.0"
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.0"
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