Skip to content

Commit 631fc71

Browse files
authored
Merge pull request #28 from jpicklyk/feature/2.0.0-beta
Feature/2.0.0 beta
2 parents cbf2952 + 625b138 commit 631fc71

File tree

401 files changed

+126595
-43593
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

401 files changed

+126595
-43593
lines changed

.claude-plugin/marketplace.json

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"name": "task-orchestrator-marketplace",
3+
"owner": {
4+
"name": "Task Orchestrator",
5+
"url": "https://github.com/jpicklyk/task-orchestrator"
6+
},
7+
"metadata": {
8+
"description": "MCP Task Orchestrator - Hierarchical task management with AI workflows",
9+
"version": "2.0.0"
10+
},
11+
"plugins": [
12+
{
13+
"name": "task-orchestrator",
14+
"version": "2.0.0",
15+
"description": "Comprehensive task management with Projects → Features → Tasks hierarchy, dependency tracking, templates, and AI workflow automation",
16+
"author": {
17+
"name": "Jeff Picklyk",
18+
"url": "https://github.com/jpicklyk"
19+
},
20+
"homepage": "https://github.com/jpicklyk/task-orchestrator",
21+
"repository": "https://github.com/jpicklyk/task-orchestrator",
22+
"license": "MIT",
23+
"keywords": ["task-management", "project-management", "workflow", "mcp", "ai-orchestration"],
24+
"category": "productivity",
25+
"tags": ["tasks", "features", "projects", "dependencies", "templates", "workflows"],
26+
"source": "./claude-plugins/task-orchestrator",
27+
"strict": true
28+
}
29+
]
30+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
---
2+
description: Check the Flyway schema version of the SQLite database on a Docker volume
3+
---
4+
5+
Check the schema version of the Task Orchestrator database on a Docker volume.
6+
7+
# Instructions
8+
9+
1. Parse the volume name from the user's command, defaulting to "mcp-task-data" if not provided
10+
2. Create a temporary SQL file with the query
11+
3. Run the Docker command mounting both the volume and the project directory
12+
4. Display the results in a clear, formatted way
13+
5. Clean up the temporary SQL file
14+
15+
# Working Pattern (Windows Git Bash Compatible)
16+
17+
Due to shell escaping issues on Windows, use a mounted SQL file approach:
18+
19+
**Step 1:** Create temporary SQL file in project root:
20+
```sql
21+
-- File: .tmp_check_schema.sql (in project root directory)
22+
.mode box
23+
.headers on
24+
25+
SELECT
26+
installed_rank,
27+
version,
28+
description,
29+
type,
30+
script,
31+
installed_on,
32+
execution_time,
33+
success
34+
FROM flyway_schema_history
35+
ORDER BY installed_rank DESC
36+
LIMIT 10;
37+
```
38+
39+
**Temp File Location:** Create `.tmp_check_schema.sql` in the project root directory (D:\Projects\task-orchestrator\)
40+
41+
**Step 2:** Run via Docker with mounted SQL file:
42+
```bash
43+
powershell.exe -Command "docker run --rm -v {{VOLUME_NAME}}:/data -v '${PWD}:/work' alpine sh -c 'apk add --no-cache sqlite >/dev/null 2>&1 && sqlite3 /data/tasks.db < /work/.tmp_check_schema.sql'"
44+
```
45+
46+
**Step 3:** Clean up:
47+
```bash
48+
rm .tmp_check_schema.sql
49+
```
50+
51+
**Note:** The `alpine/sqlite` image doesn't work well with inline SQL on Windows. Use `alpine` with sqlite installed instead.
52+
53+
# Expected Output Format
54+
55+
Present the results with:
56+
- Current schema version (the most recent migration)
57+
- List of recent migrations (up to 10)
58+
- Success status for each migration
59+
- Installation timestamps
60+
61+
If the query fails:
62+
- Explain that the volume may not exist, or
63+
- The database may not have been initialized with Flyway, or
64+
- The database file doesn't exist yet
65+
66+
# Additional Helpful Commands
67+
68+
After showing the results, offer these follow-up options:
69+
70+
1. **Show all migrations:** Remove the LIMIT from the SQL query
71+
2. **Show table structure:** Create SQL file with `.schema flyway_schema_history`
72+
3. **Show all tables:** Create SQL file with `.tables`
73+
4. **Check database file:**
74+
```bash
75+
docker run --rm -v {{VOLUME_NAME}}:/data alpine ls -lh /data/
76+
```
77+
78+
# Usage Examples
79+
80+
```
81+
/check_schema_version
82+
```
83+
Checks the default `mcp-task-data` volume.
84+
85+
```
86+
/check_schema_version my-custom-volume
87+
```
88+
Checks the `my-custom-volume` Docker volume.
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
# Deploy to Docker
2+
3+
Build and deploy the MCP Task Orchestrator Docker image with the specified tag.
4+
5+
**Usage:** `/deploy_to_docker [image-tag]`
6+
7+
**Examples:**
8+
- `/deploy_to_docker` (will prompt for tag, default: task-orchestrator:dev)
9+
- `/deploy_to_docker task-orchestrator:local-test` (use specific tag)
10+
11+
---
12+
13+
## Deployment Workflow
14+
15+
Execute the following steps to build and deploy the Docker image:
16+
17+
### Step 0: Determine Image Tag (If Not Provided)
18+
19+
**If the user did not provide an image tag** (e.g., just `/deploy_to_docker` without arguments), ask them using AskUserQuestion:
20+
21+
```
22+
AskUserQuestion(
23+
questions: [{
24+
question: "Which Docker image tag would you like to use?",
25+
header: "Image Tag",
26+
multiSelect: false,
27+
options: [
28+
{
29+
label: "task-orchestrator:dev",
30+
description: "Default development tag (recommended)"
31+
}
32+
]
33+
}]
34+
)
35+
```
36+
37+
**Note:** The AskUserQuestion tool automatically provides an "Other" option where users can type a custom tag name (e.g., `task-orchestrator:local-test`, `task-orchestrator:v2.0`, etc.).
38+
39+
**Based on user choice:**
40+
- **"task-orchestrator:dev"**: Use the default tag
41+
- **"Other" with custom input**: Use the custom tag provided by the user
42+
43+
Store the selected tag and use it for the rest of the workflow as `<image-tag>`.
44+
45+
**If the user DID provide a tag** (e.g., `/deploy_to_docker task-orchestrator:local-test`), skip this step and use the provided tag.
46+
47+
### Step 1: Clean Build (Optional but Recommended)
48+
49+
Run a clean build first to ensure all changes are compiled:
50+
51+
```bash
52+
./gradlew clean build
53+
```
54+
55+
Wait for confirmation that all tests pass before proceeding.
56+
57+
### Step 2: Build Docker Image
58+
59+
Build the Docker image with the determined tag (from Step 0 if prompted, or from command arguments).
60+
61+
**Command:**
62+
```bash
63+
docker build -t <image-tag> .
64+
```
65+
66+
Where `<image-tag>` is the tag from Step 0 or provided by the user (e.g., `task-orchestrator:dev`, `task-orchestrator:local-test`).
67+
68+
### Step 3: Verify Image Built Successfully
69+
70+
After build completes, verify the image exists:
71+
72+
```bash
73+
docker images | grep <image-name>
74+
```
75+
76+
Where `<image-name>` is the base name from the tag (e.g., `task-orchestrator`).
77+
78+
### Step 4: Run Docker Container
79+
80+
**Ask the user about container status** (use AskUserQuestion):
81+
82+
```
83+
AskUserQuestion(
84+
questions: [{
85+
question: "Do you want to start a new container with the deployed image?",
86+
header: "Container",
87+
multiSelect: false,
88+
options: [
89+
{
90+
label: "Start New Container",
91+
description: "Run a new container with the deployed image"
92+
},
93+
{
94+
label: "Container Already Running",
95+
description: "Skip container startup, proceed to testing"
96+
},
97+
{
98+
label: "Skip Container Startup",
99+
description: "Just build the image, don't start a container"
100+
}
101+
]
102+
}]
103+
)
104+
```
105+
106+
**Based on user choice:**
107+
108+
- **"Start New Container"**: Continue to ask about run options below
109+
- **"Container Already Running"**: Skip to Step 5 (testing)
110+
- **"Skip Container Startup"**: End deployment workflow
111+
112+
---
113+
114+
**If starting new container**, ask which run option to use (use AskUserQuestion):
115+
116+
```
117+
AskUserQuestion(
118+
questions: [{
119+
question: "Which Docker run configuration would you like to use?",
120+
header: "Run Mode",
121+
multiSelect: false,
122+
options: [
123+
{
124+
label: "Basic Run",
125+
description: "Database only (no config file access)"
126+
},
127+
{
128+
label: "With Project Mount",
129+
description: "Recommended - Enables config reading (.taskorchestrator/)"
130+
},
131+
{
132+
label: "With Debug Logging",
133+
description: "Project mount + MCP_DEBUG=true for detailed logs"
134+
}
135+
]
136+
}]
137+
)
138+
```
139+
140+
**Based on user choice, run the appropriate command:**
141+
142+
**"Basic Run" (Database Only)**
143+
```bash
144+
docker run --rm -i -v mcp-task-data:/app/data <image-tag>
145+
```
146+
147+
**"With Project Mount" (Recommended)**
148+
```bash
149+
docker run --rm -i \
150+
-v mcp-task-data:/app/data \
151+
-v D:/Projects/task-orchestrator:/project \
152+
-e AGENT_CONFIG_DIR=/project \
153+
<image-tag>
154+
```
155+
156+
**"With Debug Logging"**
157+
```bash
158+
docker run --rm -i \
159+
-v mcp-task-data:/app/data \
160+
-v D:/Projects/task-orchestrator:/project \
161+
-e AGENT_CONFIG_DIR=/project \
162+
-e MCP_DEBUG=true \
163+
<image-tag>
164+
```
165+
166+
### Step 5: Test the Deployment
167+
168+
After the container is running, suggest testing basic functionality:
169+
170+
1. Verify server starts without errors
171+
2. Test a simple MCP tool (e.g., `list_templates`)
172+
3. Verify configuration files are accessible (if using Option 2)
173+
174+
---
175+
176+
## Important Notes
177+
178+
- **Database Persistence:** The volume `mcp-task-data` persists database between container runs
179+
- **Config Access:** Option 2 is required for reading `.taskorchestrator/config.yaml` and `agent-mapping.yaml`
180+
- **Port Mapping:** MCP servers use stdin/stdout, no port mapping needed
181+
- **Cleanup:** Use `--rm` flag to auto-remove container after stopping
182+
- **Hot Reload:** If container is already running, rebuild with same tag and restart container to load new image
183+
184+
## Troubleshooting
185+
186+
**If build fails:**
187+
- Check that `./gradlew build` completed successfully
188+
- Verify Dockerfile exists in project root
189+
- Check for sufficient disk space
190+
191+
**If container fails to start:**
192+
- Check logs with `docker logs <container-id>`
193+
- Verify volume paths are correct (Windows uses forward slashes in Docker)
194+
- Try Option 3 (debug mode) for detailed logging
195+
196+
**If config files not found:**
197+
- Ensure using Option 2 with AGENT_CONFIG_DIR set
198+
- Verify project path is correct: `D:/Projects/task-orchestrator`
199+
- Check that `.taskorchestrator/` directory exists in project
200+
201+
---
202+
203+
## Post-Deployment
204+
205+
After successful deployment:
206+
1. ✅ Confirm container is running (or already was running)
207+
2. ✅ Verify MCP tools are accessible
208+
3. ✅ Test configuration file loading (if applicable)
209+
4. ✅ Inform user of deployment success
210+
211+
Return a summary of what was deployed and how to stop/restart the container:
212+
213+
**Stop container:**
214+
```bash
215+
docker stop <container-id>
216+
```
217+
218+
**Restart container with new image:**
219+
```bash
220+
# Stop existing container first
221+
docker stop <container-id>
222+
# Then run with same command as Step 4
223+
```
224+
225+
Or simply press Ctrl+C if running in foreground with `-i` flag.
226+
227+
---
228+
229+
## Final Step: Reconnect MCP Server
230+
231+
**After deployment is complete, reconnect the MCP server to load the new image:**
232+
233+
Use the slash command:
234+
```
235+
/mcp reconnect task-orchestrator
236+
```
237+
238+
This ensures Claude Code is using the newly deployed Docker image with all the latest changes.

.github/workflows/docker-publish.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,39 @@ env:
1212
IMAGE_NAME: ${{ github.repository }}
1313

1414
jobs:
15+
test:
16+
runs-on: ubuntu-latest
17+
18+
steps:
19+
- name: Checkout repository
20+
uses: actions/checkout@v4
21+
with:
22+
fetch-depth: 0 # Needed for version calculation
23+
24+
- name: Set up JDK 23
25+
uses: actions/setup-java@v4
26+
with:
27+
java-version: '23'
28+
distribution: 'temurin'
29+
30+
- name: Setup Gradle
31+
uses: gradle/actions/setup-gradle@v3
32+
33+
- name: Make gradlew executable
34+
run: chmod +x gradlew
35+
36+
- name: Run tests
37+
run: ./gradlew test --no-daemon --tests '*' --tests '!DescriptionFieldMigrationTest'
38+
39+
- name: Publish Test Report
40+
uses: mikepenz/action-junit-report@v4
41+
if: always()
42+
with:
43+
report_paths: '**/build/test-results/test/TEST-*.xml'
44+
check_name: 'Test Results'
45+
1546
build:
47+
needs: test # Wait for tests to pass before building Docker
1648
runs-on: ubuntu-latest
1749
permissions:
1850
contents: read

0 commit comments

Comments
 (0)