Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
371 commits
Select commit Hold shift + click to select a range
6b217d0
Merge branch 'master' of https://github.com/mintproject/mint-ensemble…
IKCAP Aug 25, 2021
db594e7
Added Thread addition functionality + Added Keycloak + Removed Fireba…
IKCAP Oct 23, 2021
a77f1ad
Remove firebase remnants
IKCAP Oct 24, 2021
d756b68
atob alternative for nodejs
IKCAP Oct 25, 2021
8b8d402
Fix for atob
IKCAP Oct 25, 2021
2e85732
Replacement for flat
IKCAP Oct 25, 2021
1af8f89
Added missing function
IKCAP Oct 25, 2021
5eeb489
Fix for keycloak based seed execution
IKCAP Oct 25, 2021
06759e4
No cache for thread query
IKCAP Oct 26, 2021
86b3b51
Login on every request
IKCAP Nov 9, 2021
b9df9e9
Login before fetching thread details
IKCAP Feb 6, 2022
8d275a8
Fixes for no input + gracefully failing from bad zip
IKCAP Mar 4, 2022
dfc8385
Fix for local cache deletion
IKCAP Mar 4, 2022
23fb4cb
Added Query for Model Deletion -- No API yet
IKCAP Mar 5, 2022
4b7ca81
Run cwltool in write mode
IKCAP Mar 9, 2022
05f2055
Check paramtype before creating cwl values file
IKCAP Mar 11, 2022
4162d4c
updates
IKCAP Mar 15, 2022
fb04c4c
Fixing login issues
IKCAP Mar 15, 2022
685ce08
Refreshing token so it doesn't expire
IKCAP Mar 24, 2022
1cbc890
Global signin
IKCAP Mar 24, 2022
0e04285
Use secret if secret is present
IKCAP Apr 5, 2022
065a824
Release 4.0.0
mosoriob Apr 6, 2022
67a50cf
Auto-addition of region geojson
IKCAP Nov 21, 2022
4fa155a
Bugfixes
IKCAP Nov 22, 2022
83d7943
Fixes for compatibility with kubernetes
IKCAP Nov 27, 2022
f05f390
Updated typescript
IKCAP Nov 27, 2022
724064c
Updated typescript
IKCAP Nov 27, 2022
b80d621
Update docker-publish.yml
IKCAP Nov 27, 2022
30fa31b
Update docker-publish.yml
IKCAP Nov 28, 2022
253184b
Updated older versions of bull-queue, bull-board
IKCAP Nov 28, 2022
6f0aa19
Update docker-publish.yml
IKCAP Nov 28, 2022
1b670f0
Update docker-publish.yml
IKCAP Nov 28, 2022
022e3c3
Test secrets access with new token
IKCAP Nov 28, 2022
26c2e37
Reverting back to login-action v1 to see if that works
IKCAP Nov 28, 2022
cd1ddc8
Updated package numbers, added explicit react-dom package
IKCAP Nov 28, 2022
20a33ca
Update to how preferences are read
IKCAP Nov 30, 2022
5d4a727
Multiplatform docker image for EM
IKCAP Dec 1, 2022
8690729
Multiplatform docker image for EM
IKCAP Dec 1, 2022
e8bad1d
Removing multiple builds in the action
IKCAP Dec 1, 2022
f87afa2
Re-push
IKCAP Dec 1, 2022
6619054
Fixes
IKCAP Dec 5, 2022
d9e65b3
use parallelism config for concurrency in queue
IKCAP Dec 5, 2022
025a5c0
Bug fixes
IKCAP Dec 10, 2022
f51b171
More EM updates for dealing with regions & New API to completely rese…
IKCAP Dec 12, 2022
f395fe7
Bugfix
IKCAP Dec 13, 2022
ed33443
Create datadir if it doesn't exist
IKCAP Dec 15, 2022
e11af54
Synchronous tempdir removal -- might be causing issues in some cases
IKCAP Dec 15, 2022
6aa84c1
tempdir removal within try block to catch errors
IKCAP Dec 15, 2022
453a1bb
Attempted fix for runs not updating after successful runs
IKCAP Dec 16, 2022
685a35d
Trying to fix issues with permissions of outputs with docker runs
IKCAP Dec 18, 2022
b3d4481
fix: improve error messages
mosoriob Feb 17, 2023
2c62acb
fix: zombie processes on ensemble manager
mosoriob Feb 17, 2023
1e1eb4b
add: update tacc
mosoriob Feb 20, 2023
53ecfce
fix: wrong name
mosoriob Feb 20, 2023
a8e78c0
Adding CKAN data registration capability
IKCAP Dec 5, 2023
1d0c8d4
feat: use prettier format (#21)
mosoriob Feb 7, 2024
10e2210
Support tapis (#31)
mosoriob Jun 25, 2024
42ccea6
fix: tapis can be optional
mosoriob Jun 25, 2024
8361b00
fix: improve configuration handle
mosoriob Jun 25, 2024
cf1822f
fix: test tapis configuration only
mosoriob Jul 1, 2024
dc820b2
fix: localex check if it is selected
mosoriob Jul 1, 2024
25d35ed
add: tapis password as config
mosoriob Jul 8, 2024
2985d06
fix: improve error logging tapis
mosoriob Jul 8, 2024
95f89e4
fix: tapis webhook communication (#32)
mosoriob Jul 9, 2024
ab588c3
merge and resolve conflicts
IKCAP Aug 26, 2024
7ae1b7b
removing keys
IKCAP Aug 26, 2024
571db1d
add: support backend (#34)
mosoriob Aug 29, 2024
a49cb79
fix: disable cwltool to speed up building
mosoriob Aug 30, 2024
eb78f56
add: examples k8s
mosoriob Aug 30, 2024
94f2499
Add kubernetes execution
IKCAP Sep 5, 2024
4ced127
add: /threads/:id (#36)
mosoriob Sep 5, 2024
d671cfb
hardcoding kubernetes usage
IKCAP Sep 11, 2024
d187490
Fix pullimage
IKCAP Sep 11, 2024
74b8880
Change symlink to copy
IKCAP Sep 11, 2024
4772c36
Updated EM kubernetes data mounting from hostpath to PVC
IKCAP Sep 12, 2024
6287100
Back to symlinking inputs
IKCAP Sep 12, 2024
43533e6
symlink still giving trouble
IKCAP Sep 12, 2024
9784b40
Added pvc mount info
IKCAP Sep 12, 2024
2daba27
dont remove temp directory.. we get permission issues
IKCAP Sep 12, 2024
36f544f
try to remove temp directory
IKCAP Sep 13, 2024
603cca3
Allowing for RWO pvcs for kubernetes with node_affinity parameter
IKCAP Sep 17, 2024
c160069
fix: base stage
mosoriob Feb 24, 2025
da6a9a9
add: OAuth2 Authentication Implementation (#39)
mosoriob Feb 25, 2025
efca1b7
feat: Add GET endpoint for retrieving Tapis job status (#41)
mosoriob Feb 25, 2025
ecdf5d9
feat: Add TapisExecutionService for job management and execution
mosoriob Feb 25, 2025
113b210
Merge branch 'master' into implementation-interface-execution
mosoriob Feb 25, 2025
510de5b
feat: Refactor execution creation and add token-based authentication
mosoriob Feb 25, 2025
6372db4
chore: Configure TypeScript and Webpack path aliases
mosoriob Feb 26, 2025
8e4aca9
feat: Enhance Tapis Execution Service and Job Management
mosoriob Feb 26, 2025
4b70e59
feat: Integrate Tapis Execution Submission with Configuration
mosoriob Feb 26, 2025
3eb662d
refactor: Improve Tapis Job Webhook and Authentication Handling
mosoriob Feb 27, 2025
43b002a
feat: Add Tapis Job Submission Endpoint and API Documentation
mosoriob Feb 27, 2025
4ae9f7d
refactor: Separate Job Submission into Dedicated Endpoint
mosoriob Feb 27, 2025
afa3cd2
fix: debug tapis wrapper
mosoriob Feb 27, 2025
b859a06
feat: Add Job Subscription to Tapis Execution Service
mosoriob Feb 27, 2025
d8f7b4f
feat: Add example response for Tapis thread model endpoint
mosoriob Feb 27, 2025
d5a0b2e
refactor: Rename job submission method and add logging
mosoriob Feb 27, 2025
6b9e1a2
docs: Add comprehensive example for Tapis job submission request
mosoriob Feb 27, 2025
74dc39c
refactor: Simplify Tapis Job Subscription Service
mosoriob Feb 27, 2025
f289119
Merge pull request #43 from mintproject/42-tapis-add-path-submit-job-2
mosoriob Feb 27, 2025
eedad38
feat: Enhance Tapis Execution Service with Status Mapping and Result …
mosoriob Feb 27, 2025
97835b8
refactor: Remove deprecated Tapis execution-related modules
mosoriob Feb 27, 2025
6f0c4d6
feat: Add authorization header to webhook job status change
mosoriob Feb 27, 2025
b1752a2
feat: Add job sharing functionality to Tapis Execution Service
mosoriob Feb 27, 2025
5e09daf
refactor: Remove security configuration from Tapis webhook endpoint
mosoriob Feb 27, 2025
b14e314
refactor: Centralize authentication configuration and remove deprecat…
mosoriob Feb 27, 2025
6bd42e0
Merge pull request #44 from mintproject/implementation-interface-exec…
mosoriob Feb 27, 2025
df1bf95
feat: Improve job submission response and job subscription handling
mosoriob Mar 3, 2025
a17f785
fix: release any tag
mosoriob Mar 3, 2025
7b16b62
feat: Split Docker build workflow to support AMD64 and ARM64 platforms
mosoriob Mar 3, 2025
b7cf471
feat: separate arm64 and amd64 - speedup (#45)
mosoriob Mar 3, 2025
d81fb45
feat: Add configurable OpenAPI servers in configuration
mosoriob Mar 3, 2025
cac9d60
feat: add sha as tag
mosoriob Mar 3, 2025
235f1a6
refactor: Simplify Tapis job webhook and execution status handling
mosoriob Mar 4, 2025
6cd7867
feat: Add endpoint and service for updating thread execution status
mosoriob Mar 4, 2025
ca1451c
feat: add tapis execution output registration (#49)
mosoriob Mar 5, 2025
dc47b3d
fix: rename path threadId executionId
mosoriob Mar 5, 2025
97005bd
fix: use ls6 as archiveSystemId (#47)
mosoriob Mar 5, 2025
a7e0099
Add: model ensemble id to webhook (#50)
mosoriob Mar 5, 2025
14f7069
feat: implement validation framework for batch execution testing tapi…
mosoriob Mar 12, 2025
3e49830
refactor: streamline TapisExecutionService error handling and enhance…
mosoriob Mar 18, 2025
79e2eec
add: test parameter collection
mosoriob Apr 16, 2025
d94f5d9
fix: nodemon (#61)
mosoriob May 5, 2025
12127cc
fix: load tapis app from url (#62)
mosoriob May 5, 2025
0a22108
feat: enhance logsService to support Tapis job history retrieval (#63)
mosoriob May 19, 2025
f27d502
fix: import Path Standardization (#64)
mosoriob Jun 5, 2025
72af619
fix: remove openapi-express package (#65)
mosoriob Jun 9, 2025
c306c53
add: problem statements (#68)
mosoriob Jun 9, 2025
cbd2446
feat: mount tasks router in problem statements API
mosoriob Jun 9, 2025
241b21c
feat: enhance API documentation with new schemas
mosoriob Jun 10, 2025
de3bb9f
feat: enhance problem statements API with TypeScript types
mosoriob Jun 10, 2025
7a2317b
feat: enhance API with new task creation endpoint and improve documen…
mosoriob Jun 10, 2025
841e326
Revert changes back to 0a22108
mosoriob Jun 10, 2025
5c291f6
Revert "Revert changes back to 0a22108"
mosoriob Jun 10, 2025
d05a31c
hotfix: parameters tapis (#71)
mosoriob Jun 13, 2025
f541671
feat: implement job name generation logic in TapisExecutionService (#73)
mosoriob Jun 13, 2025
e85cf8f
fix: improve tapis failed executions (#75)
mosoriob Jun 13, 2025
f1c65b7
fix: verify component then create executions (#76)
mosoriob Jun 16, 2025
0d8e9ae
add: tapis show logs (#78)
mosoriob Jun 16, 2025
35c85a9
add creation using of subtask (#79)
mosoriob Jun 16, 2025
15dbf44
add: set model thread
mosoriob Jun 17, 2025
457b416
add: endpoint set data (#84)
mosoriob Jun 18, 2025
ba194d7
feat: add SubmitSubtaskRequest schema and submit subtask endpoint (#87)
mosoriob Jun 18, 2025
36e33ff
feat: add modelBindings endpoint and data bindings retrieval for subt…
mosoriob Jun 18, 2025
1d674ed
add: setup parameters of thread (#88)
mosoriob Jun 19, 2025
1fa0827
feat: add endpoint for adding parameters and data to subtasks (#90)
mosoriob Jun 19, 2025
31896d3
refactor: rename and enhance request schema for subtask setup
mosoriob Jun 19, 2025
6cb82f9
feat: add endpoint for creating task and subtask together (#93)
mosoriob Jun 19, 2025
a2815e2
add: openapi validator (#94)
mosoriob Jun 19, 2025
2adc9c1
add: graphql type (#95)
mosoriob Jun 20, 2025
09314d1
fix: /ps/id/tasks (#97)
mosoriob Jun 20, 2025
323d690
feat: add example data to ProblemStatementSchema in API documentation
mosoriob Jun 20, 2025
0fdd26e
feat: enhance API documentation with examples and response structures
mosoriob Jun 20, 2025
ba7795a
fix: update schema types in swagger.json and api-doc.ts
mosoriob Jun 20, 2025
7e0aeeb
refactor: update API documentation for error responses
mosoriob Jun 20, 2025
e01dd72
fix: update job submission and status response structure in tests
mosoriob Jun 20, 2025
623e292
feat: enhance task and subtask creation with event logging
mosoriob Jun 23, 2025
2a9381e
fix: improve input and parameter handling in model services
mosoriob Jun 23, 2025
6a6e39e
fix: update required fields and schema types in API documentation
mosoriob Jun 23, 2025
4573863
fix: enhance model handling and API documentation
mosoriob Jun 23, 2025
f926862
refactor: update subtask submission handling and execution summary
mosoriob Jun 23, 2025
d94aed5
fix: simplify required fields in TaskSchema for clarity
mosoriob Jun 24, 2025
a81c72a
feat: enhance execution summary mutation with conflict resolution
mosoriob Jun 24, 2025
19fef2c
fix: simplify required fields in SubtaskSchema for clarity
mosoriob Jun 24, 2025
56b51bd
fix: update subtask creation and retrieval logic
mosoriob Jun 24, 2025
a0abc94
fix: enhance GraphQL task handling with null checks
mosoriob Jun 24, 2025
664e80d
feat: enhance problem statement and task services with event logging …
mosoriob Jun 24, 2025
fbc6e4c
fix: update GraphQL execution query to prevent caching
mosoriob Jun 24, 2025
6f94eb2
fix: improve file retrieval error handling in TapisExecutionService
mosoriob Jun 24, 2025
7cd2e65
feat: add comprehensive API documentation for MINT Ensemble Manager
mosoriob Jun 26, 2025
cf18d82
docs: update README.md with production and local development URLs
mosoriob Jun 26, 2025
2a1165e
docs: update README.md to reflect API endpoint changes
mosoriob Jun 26, 2025
c0973c9
docs: update README.md to mark deprecated API endpoints
mosoriob Jun 26, 2025
7b6ba3d
refactor: remove deprecated model ensemble outputs API
mosoriob Jun 27, 2025
2efb409
add: TapisCkan (#99)
mosoriob Jun 30, 2025
bfb2028
fix: handle if all the runs are already done (#100)
mosoriob Jul 1, 2025
70188ff
feat: add dataset_id property to subtask schema and GraphQL types
mosoriob Jul 1, 2025
dfb4b86
feat: add executions to subtask submit response
mosoriob Jul 2, 2025
7025c73
feat: new endpoint {subtask}/executions
mosoriob Jul 2, 2025
5fb4579
allow: execution.runid null
mosoriob Jul 2, 2025
af457c8
feat: update execution schema to allow nullable fields and improve de…
mosoriob Jul 2, 2025
4aaf405
feat: enhance API documentation and schemas for model input/output an…
mosoriob Jul 3, 2025
ee43351
add: thread.dataset_id on mutation
mosoriob Jul 3, 2025
6de0f10
feat: add dataset_id to subtask and execution handling
mosoriob Jul 3, 2025
06cee6b
fix: remove console.log
mosoriob Jul 3, 2025
95f240a
fix: hack 60 minutes
mosoriob Jul 4, 2025
c6980ae
fix: obtain the thread_model.id (#104)
mosoriob Jul 10, 2025
0efc24a
refactor: simplify schema definition for subtasks in API documentation
mosoriob Jul 10, 2025
7ea965a
refactor: update subtask execution output endpoint in API documentation
mosoriob Jul 11, 2025
c0a2faf
feat: add endpoint to publish all executions for a subtask
mosoriob Jul 11, 2025
0e624e9
fix: enhance logging for TAPIS and MINT outputs in execution service
mosoriob Jul 11, 2025
15a212f
refactor: streamline output file retrieval in TapisExecutionService
mosoriob Jul 11, 2025
7930326
fix: update execution status on failure in TapisExecutionService
mosoriob Jul 11, 2025
1f451c2
refactor: improve execution submission handling in TapisExecutionService
mosoriob Jul 11, 2025
4b09fb1
refactor: update execution response handling in TapisExecutionService
mosoriob Jul 11, 2025
b414911
refactor: update job response handling in TapisExecutionService
mosoriob Jul 11, 2025
938fea8
refactor: enhance execution submission response handling
mosoriob Jul 12, 2025
232efa7
feat: add SubmissionResult schema for execution submissions
mosoriob Jul 12, 2025
54f55c5
feat: enhance execution submission response with detailed metrics
mosoriob Jul 12, 2025
b9c437a
refactor: streamline execution submission response structure
mosoriob Jul 12, 2025
1c1744b
fix: correct API documentation for SubmissionResult schema reference
mosoriob Jul 12, 2025
6b66f62
fix: update API documentation for SubmissionResult schema reference
mosoriob Jul 12, 2025
abf334d
refactor: update error handling in TapisExecutionService submission r…
mosoriob Jul 12, 2025
d85b96c
Revert "refactor: update error handling in TapisExecutionService subm…
mosoriob Jul 12, 2025
31a4186
Add Variable and Region Validation for Subtask Parameters (#107)
mosoriob Jul 15, 2025
5207472
refactor: improve error handling and logging in TapisExecutionService
mosoriob Jul 12, 2025
49e3a37
Enhance README with dataset ID support for subtasks
mosoriob Jul 15, 2025
6cb9af7
improve message error (#112)
mosoriob Feb 15, 2026
1954ddc
chore(03-02): remove model_catalog_api from local config files
mosoriob Feb 21, 2026
b69c686
feat(03-03): remove SDK dependency and create direct Hasura GraphQL q…
mosoriob Feb 21, 2026
9fa65db
feat(03-03): rewrite adapter and remove all SDK imports from service …
mosoriob Feb 21, 2026
03cf3e8
fix(04-01): type has_accepted_values as string[] | null with [] fallback
mosoriob Mar 15, 2026
53cd5cf
fix: types
mosoriob Apr 4, 2026
4cf9598
ci: remove arm64 build job from docker workflow
mosoriob Apr 4, 2026
ae14faa
fix(ci): add retry logic for npm install in Dockerfile
mosoriob Apr 4, 2026
c91056b
feat(09-04): update GraphQL queries to use modelcatalog_configuration
mosoriob Apr 5, 2026
9e2bba7
feat(09-04): remove legacy adapter functions and update service layer
mosoriob Apr 5, 2026
19cd9e8
feat(09-04): regenerate GraphQL types and fix TypeScript compilation …
mosoriob Apr 5, 2026
1e03bec
fix(09): update test mocks to use unified modelcatalog_configuration_…
mosoriob Apr 5, 2026
2ce79b9
fix(260405-nrv): use modelcatalog_configuration_id for thread model l…
mosoriob Apr 5, 2026
810a7fe
feat(10-01): update execution GraphQL queries to use modelcatalog_con…
mosoriob Apr 8, 2026
b728324
feat(10-01): update executionToGQL and executionFromGQL to use modelc…
mosoriob Apr 8, 2026
c82a1b0
refactor(10-02): remove dead code and consolidate duplicate GraphQL f…
mosoriob Apr 8, 2026
e33e6e2
test(10-02): add unit tests for executionToGQL and executionFromGQL
mosoriob Apr 8, 2026
2a473cd
fix(test): update thread mock to match modelcatalog_configuration schema
mosoriob Apr 8, 2026
906f04f
fix(graphql): rename thread_model_parameter.model_parameter to modelc…
mosoriob Apr 26, 2026
5394889
fix(graphql): select modelcatalog_parameter.label instead of dropped …
mosoriob Apr 26, 2026
500005a
fix: add position on modelcatalog_configuration
mosoriob Apr 26, 2026
382c36a
fix(execution-engines): log tapis submission failures before responding
mosoriob Apr 26, 2026
03fcbec
fix(tapis): surface tapis subscribe error body on submission failure
mosoriob Apr 26, 2026
456503a
fix(tapis): preserve thread_model_execution junction on submission fa…
mosoriob Apr 26, 2026
cb1c795
feat(tapis): support overriding webhook base URL for dev clusters
mosoriob Apr 26, 2026
23af644
Merge pull request #113 from mintproject/model-catalog-migration
mosoriob Apr 26, 2026
3d30af9
ci: tag docker image as latest on master push
mosoriob Apr 27, 2026
b80ea8e
fix(graphql): alias modelcatalog_dataset_specification as model_io
mosoriob Apr 27, 2026
ff8c36c
fix(graphql): map dataset_specification label/has_format to name/format
mosoriob Apr 27, 2026
a6198f0
Merge pull request #114 from mintproject/gsd/phase-12-is-optional
mosoriob May 1, 2026
ffa4a84
fix(tapis): tolerate empty-string parameter bindings (#115)
mosoriob May 1, 2026
39da5d6
fix(tapis): tolerate empty-string parameter bindings (#117)
mosoriob May 3, 2026
bac0578
fix(tapis): skip FIXED inputs in job submission (#116)
mosoriob May 3, 2026
3d01ff0
fix(tapis): map Hasura output shape in getModelOutputsByModelId (#118)
mosoriob May 3, 2026
7e12ab6
fix(tapis): skip optional inputs without bindings in ExecutionCreatio…
mosoriob May 4, 2026
341a3b4
build: commit the lockfile and set skipLibCheck (#120)
mosoriob Aug 30, 2026
737a7f1
chore: drop the mint-ensemble-manager gitlink
Aug 30, 2026
419e398
Merge mint-ensemble-manager history into the single repository
Aug 30, 2026
4473cb3
ci: add the mint-ensemble-manager workflow
Aug 30, 2026
f7f00ec
chore(mint-ensemble-manager): remove the tooling that cannot run here
Aug 30, 2026
4618e0a
chore(skills): add the merged bump skill and rewrite test-on-k8s-dev
Aug 30, 2026
881c399
ci: add dependabot and the release workflows
Aug 30, 2026
5c6e32e
fix(skills): branch the bump from the pull request base
Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .claude/skills/bump-image-tag/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
---
name: bump-image-tag
description: Pin a MINT deployment to one commit of `mintproject/monorepo` by writing `global.imageTag` in a helm values file. Use when asked to deploy a monorepo branch or release, bump helm image tags, or refresh a values file to the latest images.
---

# bump-image-tag

One single-repo commit builds all four services, so **one tag names the whole system state**. This skill writes that one tag.

```bash
.claude/skills/bump-image-tag/bump.sh --values <path> [--branch NAME | --tag TAG] [--pr] [--dry-run]
```

`--help` lists every flag. Start with `--dry-run`.

## What it writes

| | |
|---|---|
| `.global.imageTag` | the resolved tag |
| `.components.<key>.image.tag` | emptied, for the four services below |

The chart resolves `.image.tag | default .Values.global.imageTag | default .Chart.AppVersion`, so **a per-service tag wins over the global**. The chart's own defaults pin all four, which is why the script clears them. Leaving one set is the silent failure this skill exists to remove: the deploy reports success and runs the old image.

The four services that come from `mintproject/monorepo`:

| Component key | Image |
|---|---|
| `hasura` | `ghcr.io/mintproject/graphql-engine` |
| `model_catalog_api` | `ghcr.io/mintproject/model-catalog-api` |
| `ui_react` | `ghcr.io/mintproject/mint-ui-react` |
| `ensemble_manager` | `ghcr.io/mintproject/ensemble-manager` |

`ui` (mint-ui-lit) is still its own repository. The script never touches it, nor `cromo`, `mic_*`, `data_catalog*`, `model_catalog_endpoint`, `hasura_db` or the auth webhook.

## Where globals live

Helm reads globals only from the **root** `global` key, even when MINT is a subchart. Components move with the subchart; globals do not. So a values file that wraps the chart holds `MINT.components.*` beside a root-level `global.imageTag`. The script detects which root applies and prints it.

## Two aborts, both deliberate

- **A repository that is not the GHCR one.** A tag from `mintproject/monorepo` does not exist on Docker Hub. Fix the chart before pinning.
- **An image missing at that tag.** Every one of the four must be in GHCR before the pin is real. Wait for CI. `--skip-image-check` overrides, for a tag you know is still building.

Chart `9.0.0-beta.7` or newer. Earlier charts have no `global.imageTag`, so the write is inert.

## Where this fits

1. Push the branch, wait for CI (`gh pr checks <n>`).
2. Verify the change is live on the dev cluster — the `test-on-k8s-dev` skill.
3. Pin the tag and open the PR (this skill).
188 changes: 188 additions & 0 deletions .claude/skills/bump-image-tag/bump.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
#!/usr/bin/env bash
# Pin one MINT release to a values file by writing global.imageTag.
# See SKILL.md.
set -euo pipefail

SOURCE_REPO="mintproject/monorepo"

# chart component key|GHCR repository
SERVICES=(
"hasura|ghcr.io/mintproject/graphql-engine"
"model_catalog_api|ghcr.io/mintproject/model-catalog-api"
"ui_react|ghcr.io/mintproject/mint-ui-react"
"ensemble_manager|ghcr.io/mintproject/ensemble-manager"
)

usage() {
cat <<EOF
Usage: $(basename "$0") --values PATH [options]

Required:
--values PATH Values file to edit.

Tag selection (pick one; default is the current branch of this working tree):
--branch NAME Resolve the head SHA of NAME in ${SOURCE_REPO}.
--tag TAG Use TAG verbatim. For a release version, e.g. v9.1.0.

Options:
--base NAME Pull request base. Default: main
--pr Commit, push and open a pull request.
--skip-image-check Write the tag before the images exist.
--dry-run Print the plan and exit.
-h, --help
EOF
}

VALUES=""
BRANCH=""
TAG=""
BASE="main"
OPEN_PR=0
SKIP_IMAGE_CHECK=0
DRY_RUN=0

while [[ $# -gt 0 ]]; do
case "$1" in
--values) VALUES="$2"; shift 2 ;;
--branch) BRANCH="$2"; shift 2 ;;
--tag) TAG="$2"; shift 2 ;;
--base) BASE="$2"; shift 2 ;;
--pr) OPEN_PR=1; shift ;;
--skip-image-check) SKIP_IMAGE_CHECK=1; shift ;;
--dry-run) DRY_RUN=1; shift ;;
-h|--help) usage; exit 0 ;;
*) echo "unknown arg: $1" >&2; usage >&2; exit 2 ;;
esac
done

[[ -n "$VALUES" ]] || { echo "ERROR: --values is required" >&2; usage >&2; exit 2; }
[[ -f "$VALUES" ]] || { echo "ERROR: no such file: $VALUES" >&2; exit 1; }
[[ -n "$BRANCH" && -n "$TAG" ]] && { echo "ERROR: --branch and --tag are exclusive" >&2; exit 2; }

command -v yq >/dev/null || { echo "yq not found (mikefarah v4)" >&2; exit 1; }
command -v curl >/dev/null || { echo "curl not found" >&2; exit 1; }

# ---------------------------------------------------------------- resolve tag
if [[ -z "$TAG" ]]; then
[[ -n "$BRANCH" ]] || BRANCH="$(git rev-parse --abbrev-ref HEAD)"
TAG="$(git ls-remote "https://github.com/${SOURCE_REPO}.git" "refs/heads/${BRANCH}" | cut -f1)"
[[ -n "$TAG" ]] || { echo "ERROR: ${SOURCE_REPO} has no branch ${BRANCH}" >&2; exit 1; }
echo "resolved ${SOURCE_REPO}@${BRANCH} -> ${TAG}"
else
echo "using tag ${TAG} verbatim"
fi

# --------------------------------------------------- locate the components root
# Helm reads globals only from the root `global` key, even when the chart is a
# subchart. Components move with the subchart; globals do not.
if [[ "$(yq '.MINT.components // "null"' "$VALUES")" != "null" ]]; then
COMPONENTS=".MINT.components"
elif [[ "$(yq '.components // "null"' "$VALUES")" != "null" ]]; then
COMPONENTS=".components"
else
echo "ERROR: ${VALUES} has neither .components nor .MINT.components" >&2
exit 1
fi
echo "components root: ${COMPONENTS}"

# ------------------------------------------------------- check the repositories
FAIL=0
for entry in "${SERVICES[@]}"; do
key="${entry%%|*}"
want="${entry##*|}"
have="$(yq "${COMPONENTS}.${key}.image.repository // \"\"" "$VALUES")"
[[ -z "$have" ]] && continue
if [[ "$have" != "$want" ]]; then
echo "ERROR: ${COMPONENTS}.${key}.image.repository is ${have}, not ${want}" >&2
echo " A tag from ${SOURCE_REPO} does not exist there." >&2
FAIL=1
fi
done
[[ $FAIL -eq 0 ]] || { echo "Fix the repositories in the chart first." >&2; exit 1; }

# ------------------------------------------------------------- check the images
if [[ $SKIP_IMAGE_CHECK -eq 0 ]]; then
for entry in "${SERVICES[@]}"; do
repo="${entry##*|}"
path="${repo#ghcr.io/}"
# A package that does not exist yet refuses the token. Report that as a
# missing image, rather than aborting on curl's exit status.
token="$(curl -sS "https://ghcr.io/token?scope=repository:${path}:pull&service=ghcr.io" \
| yq -p json '.token // ""' 2>/dev/null || true)"
if [[ -z "$token" ]]; then
echo "MISSING ${repo}:${TAG} (no anonymous pull token; the package is private or absent)" >&2
FAIL=1
continue
fi
code="$(curl -s -o /dev/null -w '%{http_code}' \
-H "Authorization: Bearer ${token}" \
-H 'Accept: application/vnd.oci.image.index.v1+json' \
-H 'Accept: application/vnd.docker.distribution.manifest.v2+json' \
"https://ghcr.io/v2/${path}/manifests/${TAG}")"
if [[ "$code" == "200" ]]; then
echo "ok ${repo}:${TAG}"
else
echo "MISSING ${repo}:${TAG} (HTTP ${code})" >&2
FAIL=1
fi
done
[[ $FAIL -eq 0 ]] || {
echo "Wait for CI, or pass --skip-image-check." >&2
exit 1
}
fi

# ---------------------------------------------------------------------- the plan
OLD="$(yq '.global.imageTag // ""' "$VALUES")"
echo
echo "plan for ${VALUES}:"
echo " .global.imageTag: '${OLD}' -> '${TAG}'"
PINNED=()
for entry in "${SERVICES[@]}"; do
key="${entry%%|*}"
have="$(yq "${COMPONENTS}.${key}.image.tag // \"\"" "$VALUES")"
if [[ -n "$have" ]]; then
PINNED+=("$key")
echo " ${COMPONENTS}.${key}.image.tag: '${have}' -> '' (a per-service tag wins over the global)"
fi
done

[[ $DRY_RUN -eq 1 ]] && { echo; echo "dry run: nothing written"; exit 0; }

# ---------------------------------------------------------------------- write
yq -i ".global.imageTag = \"${TAG}\"" "$VALUES"
for key in "${PINNED[@]:-}"; do
[[ -n "$key" ]] || continue
yq -i "${COMPONENTS}.${key}.image.tag = \"\"" "$VALUES"
done
echo
echo "wrote ${VALUES}"

[[ $OPEN_PR -eq 1 ]] || { echo "Review with: git -C \"\$(dirname ${VALUES})\" diff"; exit 0; }

# ------------------------------------------------------------- commit, push, PR
command -v gh >/dev/null || { echo "gh not found; the file is written, open the PR by hand" >&2; exit 1; }
TOP="$(git -C "$(dirname "$VALUES")" rev-parse --show-toplevel)"
SHORT="${TAG:0:12}"
PR_BRANCH="bump/imagetag-${SHORT}"
SUBJECT="chore: pin global.imageTag to ${SHORT}"
BODY="Pins every image the chart takes from \`${SOURCE_REPO}\` to \`${TAG}\`.

One single-repo commit builds all four services, so one tag names the whole
system state. Per-service tags are cleared, because they win over the global."

# Branch off the base the pull request targets, or the diff carries whatever
# else the current branch holds.
ON="$(git -C "$TOP" rev-parse --abbrev-ref HEAD)"
if [[ "$ON" != "$BASE" ]]; then
echo "ERROR: $(basename "$TOP") is on '${ON}', not '${BASE}'." >&2
echo " The file is written. Check it out on ${BASE} and rerun, or commit by hand." >&2
exit 1
fi

ABS="$(cd "$(dirname "$VALUES")" && pwd)/$(basename "$VALUES")"
git -C "$TOP" checkout -B "$PR_BRANCH" >/dev/null
git -C "$TOP" add "$ABS"
git -C "$TOP" commit -m "$SUBJECT" -m "$BODY"
git -C "$TOP" push -u origin "$PR_BRANCH"
( cd "$TOP" && gh pr create --base "$BASE" --head "$PR_BRANCH" --title "$SUBJECT" --body "$BODY" )
44 changes: 26 additions & 18 deletions .claude/skills/test-on-k8s-dev/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,36 +1,40 @@
---
name: test-on-k8s-dev
description: Deploy and test a submodule branch build on the shared MicroK8s development cluster (release `mint`, namespace `mint`) before opening a helm PR. Use when asked to test a change on Kubernetes, verify a fix on the dev instance, check whether a deployed image actually contains a change, or reach Hasura / the model catalog API running in-cluster.
description: Deploy and test a `mintproject/monorepo` branch build on the shared MicroK8s development cluster (release `mint`, namespace `mint`) before pinning a tag. Use when asked to test a change on Kubernetes, verify a fix on the dev instance, check whether a deployed image actually contains a change, or reach Hasura / the model catalog API running in-cluster.
---

# test-on-k8s-dev

How to exercise a change on the shared MicroK8s dev cluster. This is the gap between "CI is green" and "open a helm PR": CI proves the image builds, this proves it works against real data.
How to exercise a change on the shared MicroK8s dev cluster. This is the gap between "CI is green" and "pin the tag": CI proves the image builds, this proves it works against real data.

For local-only work use the `run-e2e-hasura` skill in `model-catalog-api/` instead. That runs against a local Hasura and needs no cluster.

## The cluster

Verified 2026-08-27:
Verified 2026-08-30:

| | |
|---|---|
| kubectl context | `microk8s` (cluster `microk8s-cluster`, node `pop-os`, k8s v1.31.14) |
| Namespace | `mint` (already the context default) |
| Helm release | `mint`, chart `MINT-9.0.0-beta.2` |
| Helm release | `mint`, chart `MINT-9.0.0-beta.6` |

The cluster is remote, not on the laptop. `kubectl get nodes` is the fastest liveness check.

**Two stale names to ignore.** `helm-charts/README.md` documents installing the release as `testing-mint`, and `model-catalog-api/src/hasura/client.ts` defaults `HASURA_GRAPHQL_URL` to `http://testing-mint-hasura.mint.svc.cluster.local/v1/graphql`. Neither matches this cluster, where the release is `mint` and the in-cluster URL is `http://mint-hasura/v1/graphql`. Resource names are `mint-*`, not `testing-mint-*`.

## Component map

| Submodule | Deployment | Container | Service | Ingress host | Chart values key |
|---|---|---|---|---|---|
| `model-catalog-api` | `mint-model-catalog` | `model-catalog` | `mint-model-catalog:80` | `api.models.mint.local` | `components.model_catalog_api.image.tag` |
| `graphql_engine` | `mint-hasura` | | `mint-hasura:80` | `graphql.mint.local` | `components.hasura.image.tag` |
| `mint-ensemble-manager` | `mint-ensemble-manager` | | | `ensemble-manager.mint.local` | `components.ensemble_manager.image.tag` |
| `ui` (mint-ui-lit) | `mint-ui` | | | `mint.local` | `components.ui.image.tag` |
The four services that ship from `mintproject/monorepo`:

| Directory | Deployment | Container | Ingress host | Image |
|---|---|---|---|---|
| `model-catalog-api` | `mint-model-catalog` | `model-catalog` | `api.models.mint.local` | `ghcr.io/mintproject/model-catalog-api` |
| `graphql_engine` | `mint-hasura` | `hasura` | `graphql.mint.local` | `ghcr.io/mintproject/graphql-engine` |
| `mint-ensemble-manager` | `mint-ensemble-manager` | `head` | `ensemble-manager.mint.local` | `ghcr.io/mintproject/ensemble-manager` |
| `ui-react` | `mint-ui-react` | `ui-react` | `mint.local` | `ghcr.io/mintproject/mint-ui-react` |

`ui` (mint-ui-lit) is still its own repository: deployment `mint-ui`, host `legacy.mint.local`.

The `*.mint.local` hosts only resolve if the node IP is in your `/etc/hosts`. Port-forwarding avoids that entirely and is the better default for a quick check.

Expand All @@ -47,23 +51,25 @@ Read-only, safe on a shared cluster, and enough to characterise current behaviou

## Deploying a branch build

CI in `model-catalog-api` pushes on **every branch push**, so a branch image exists as soon as `build-and-push` is green — you do not need to merge to test:
CI in `mintproject/monorepo` builds **all four services on every branch push**, with no path filter, so one commit gives you a whole consistent system. A branch image exists as soon as its `publish` job is green — you do not need to merge to test:

- `ghcr.io/mintproject/model-catalog-api:<full-commit-sha>`
- `ghcr.io/mintproject/model-catalog-api:<branch-name-with-slashes-as-dashes>`
- `:latest` is only republished on `main`.
- `ghcr.io/mintproject/<image>:<full-commit-sha>`
- `ghcr.io/mintproject/<image>:<branch-name-with-slashes-as-dashes>`
- `:latest` is only republished on the default branch.

Confirm the image is really in the registry before deploying it:

```bash
TOKEN=$(curl -s "https://ghcr.io/token?scope=repository:mintproject/model-catalog-api:pull&service=ghcr.io" \
IMAGE=model-catalog-api
SHA=<full-sha>
TOKEN=$(curl -s "https://ghcr.io/token?scope=repository:mintproject/${IMAGE}:pull&service=ghcr.io" \
| python3 -c "import sys,json;print(json.load(sys.stdin)['token'])")
curl -s -o /dev/null -w "%{http_code}\n" -H "Authorization: Bearer $TOKEN" \
-H "Accept: application/vnd.oci.image.index.v1+json" \
"https://ghcr.io/v2/mintproject/model-catalog-api/manifests/<sha>"
"https://ghcr.io/v2/mintproject/${IMAGE}/manifests/${SHA}"
```

`200` means present.
`200` means present. Brace the variable as `${IMAGE}`. In zsh, `"$IMAGE:latest"` applies the `:l` lowercase modifier instead of appending a tag, and the probe silently reports the wrong thing.

Then point the deployment at it. **This mutates a shared cluster — ask the user first.**

Expand All @@ -85,6 +91,8 @@ kubectl rollout undo -n mint deploy/mint-model-catalog

Helm will also overwrite this on its next `helm upgrade`, so a forgotten `set image` is not permanent — but do not leave the shared instance on a branch build.

**A helm upgrade does not run Hasura migrations.** The migration job is a post-install hook only, so a `graphql_engine` schema change needs a hand-run step ([#117](https://github.com/mintproject/monorepo/issues/117)).

## Verifying the change is actually live

**A 200 with plausible data does not mean your change deployed.** `model-catalog-api` is a Fastify + `fastify-openapi-glue` service: AJV validates the querystring against the OpenAPI spec and **silently strips any query param the spec does not declare**. An unrecognised filter is dropped, the endpoint returns an unfiltered page, and the response looks fine.
Expand Down Expand Up @@ -124,4 +132,4 @@ Two corollaries when adding a query param to this API:
1. Push the branch, wait for CI (`gh pr checks <n>`).
2. Confirm the image is in GHCR.
3. Deploy it here and verify differentially (this skill).
4. Only then pin the SHA in helm and open the PR — via the `update-helm-image-tags` or `dynamo-bump-from-branch` skill.
4. Only then pin the tag and open the PR — the `bump-image-tag` skill.
41 changes: 41 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Monthly, and every entry grouped. Dependabot groups within one ecosystem and
# one directory, so this is four pull requests a month, not four per dependency.
# Ungrouped weekly updates are what produced 8 open and 0 merged on mint-ui-lit.
version: 2
updates:
# The case for this file. mint-ensemble-manager arrived pinned to
# actions/checkout@v2 and docker/login-action@v1.
- package-ecosystem: github-actions
directory: /
schedule:
interval: monthly
groups:
github-actions:
patterns: ['*']

- package-ecosystem: npm
directory: /model-catalog-api
schedule:
interval: monthly
groups:
model-catalog-api:
patterns: ['*']

- package-ecosystem: npm
directory: /mint-ensemble-manager
schedule:
interval: monthly
groups:
mint-ensemble-manager:
patterns: ['*']

- package-ecosystem: npm
directory: /ui-react
schedule:
interval: monthly
groups:
ui-react:
patterns: ['*']

# graphql_engine has no package manifest. Its Dockerfile pins the Hasura
# base image by hand.
Loading
Loading