Compare commits
72 Commits
v0.8.5
..
889b0f0cb8
| Author | SHA1 | Date | |
|---|---|---|---|
| 889b0f0cb8 | |||
| 0770da6c30 | |||
| 1bbb2dc128 | |||
| dc0c2a75df | |||
| 5594c6d21e | |||
| afe94234c8 | |||
| 34c9324b74 | |||
| eb2b9f435a | |||
| cd02fc1bd4 | |||
| 359cbc3c91 | |||
| 00fa7bf50a | |||
| ba8de6847e | |||
| 98e9f06564 | |||
| 2f5a7a271f | |||
| 2d8ccb3eb6 | |||
| a7035b6ba7 | |||
| 8ead452b73 | |||
| 4036acbe59 | |||
| c5dc938bdf | |||
| a091bec6d4 | |||
| e9954d244b | |||
| e1cea8f958 | |||
| adee92c5e9 | |||
| daeac81e84 | |||
| 8059df8330 | |||
| f199bf3979 | |||
| d32bef5020 | |||
| 9f523b448d | |||
| fade022b55 | |||
| 289092d88f | |||
| 45f97167fd | |||
| dae6486ada | |||
| 1bf32c6537 | |||
| 199c8eb448 | |||
| 641384e794 | |||
| 48a193484e | |||
| 9b05f94c4c | |||
| 759c00556e | |||
| 4808279873 | |||
| c7d6d568d3 | |||
| 0995c55a82 | |||
| 41197c667a | |||
| 7da73aa435 | |||
| 3d83cc61b6 | |||
| 334d52bd2b | |||
| 8ff1de73d4 | |||
| d37fdf8e10 | |||
| 7ff88641c0 | |||
| b8ac5622d6 | |||
| 4df3f8594c | |||
| 56e71293d6 | |||
| 2df214cad1 | |||
| f43b84a7ef | |||
| ce4a0cb7f9 | |||
| 52e9fe2a87 | |||
| a22d67c36c | |||
| 0cb98c2a3e | |||
| e6439238d2 | |||
| 967a306ea8 | |||
| 46d09d4d45 | |||
| 13e3bd00f1 | |||
| cd6d98b99f | |||
| 358f177584 | |||
| b60bb57aa4 | |||
| 7003fca873 | |||
| b5d825356e | |||
| 896eb4fc52 | |||
| f8d7438eec | |||
| f7f4e8f95b | |||
| af76910f36 | |||
| f06111f045 | |||
| c6020b7f43 |
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"enabledMcpjsonServers": [
|
"enabledMcpjsonServers": [
|
||||||
"storkit"
|
"huskies"
|
||||||
],
|
],
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"allow": [
|
"allow": [
|
||||||
"Bash(./server/target/debug/storkit:*)",
|
"Bash(./server/target/debug/huskies:*)",
|
||||||
"Bash(./target/debug/storkit:*)",
|
"Bash(./target/debug/huskies:*)",
|
||||||
"Bash(STORKIT_PORT=*)",
|
"Bash(HUSKIES_PORT=*)",
|
||||||
"Bash(cargo build:*)",
|
"Bash(cargo build:*)",
|
||||||
"Bash(cargo check:*)",
|
"Bash(cargo check:*)",
|
||||||
"Bash(cargo clippy:*)",
|
"Bash(cargo clippy:*)",
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
"WebFetch(domain:portkey.ai)",
|
"WebFetch(domain:portkey.ai)",
|
||||||
"WebFetch(domain:www.shuttle.dev)",
|
"WebFetch(domain:www.shuttle.dev)",
|
||||||
"WebSearch",
|
"WebSearch",
|
||||||
"mcp__storkit__*",
|
"mcp__huskies__*",
|
||||||
"Edit",
|
"Edit",
|
||||||
"Write",
|
"Write",
|
||||||
"Bash(find *)",
|
"Bash(find *)",
|
||||||
|
|||||||
+3
-3
@@ -2,9 +2,9 @@
|
|||||||
**/target/
|
**/target/
|
||||||
**/node_modules/
|
**/node_modules/
|
||||||
frontend/dist/
|
frontend/dist/
|
||||||
.storkit/worktrees/
|
.huskies/worktrees/
|
||||||
.storkit/logs/
|
.huskies/logs/
|
||||||
.storkit/work/6_archived/
|
.huskies/work/6_archived/
|
||||||
.git/
|
.git/
|
||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
|
|||||||
+7
-3
@@ -5,10 +5,10 @@
|
|||||||
# Local environment (secrets)
|
# Local environment (secrets)
|
||||||
.env
|
.env
|
||||||
|
|
||||||
# App specific (root-level; storkit subdirectory patterns live in .storkit/.gitignore)
|
# App specific (root-level; huskies subdirectory patterns live in .huskies/.gitignore)
|
||||||
store.json
|
store.json
|
||||||
.storkit_port
|
.huskies_port
|
||||||
.storkit/bot.toml.bak
|
.huskies/bot.toml.bak
|
||||||
|
|
||||||
# Rust stuff
|
# Rust stuff
|
||||||
target
|
target
|
||||||
@@ -45,3 +45,7 @@ server/target
|
|||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
/test-results/.last-run.json
|
/test-results/.last-run.json
|
||||||
|
|
||||||
|
# Ignore old story files until we feel like deleting them
|
||||||
|
.storkit
|
||||||
|
.storkit_port
|
||||||
|
|||||||
@@ -23,3 +23,6 @@ token_usage.jsonl
|
|||||||
|
|
||||||
# Chat service logs
|
# Chat service logs
|
||||||
whatsapp_history.json
|
whatsapp_history.json
|
||||||
|
|
||||||
|
# Timers
|
||||||
|
timers.json
|
||||||
@@ -17,14 +17,14 @@ When you start a new session with this project:
|
|||||||
- **Keep moving.** After each step is confirmed, immediately proceed to the next wizard step without waiting for the user to ask.
|
- **Keep moving.** After each step is confirmed, immediately proceed to the next wizard step without waiting for the user to ask.
|
||||||
2. **Check for MCP Tools:** Read `.mcp.json` to discover the MCP server endpoint. Then list available tools by calling:
|
2. **Check for MCP Tools:** Read `.mcp.json` to discover the MCP server endpoint. Then list available tools by calling:
|
||||||
```bash
|
```bash
|
||||||
curl -s "$(jq -r '.mcpServers["storkit"].url' .mcp.json)" \
|
curl -s "$(jq -r '.mcpServers["huskies"].url' .mcp.json)" \
|
||||||
-H 'Content-Type: application/json' \
|
-H 'Content-Type: application/json' \
|
||||||
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
|
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
|
||||||
```
|
```
|
||||||
This returns the full tool catalog (create stories, spawn agents, record tests, manage worktrees, etc.). Familiarize yourself with the available tools before proceeding. These tools allow you to directly manipulate the workflow and spawn subsidiary agents without manual file manipulation.
|
This returns the full tool catalog (create stories, spawn agents, record tests, manage worktrees, etc.). Familiarize yourself with the available tools before proceeding. These tools allow you to directly manipulate the workflow and spawn subsidiary agents without manual file manipulation.
|
||||||
3. **Read Context:** Check `.storkit/specs/00_CONTEXT.md` for high-level project goals.
|
3. **Read Context:** Check `.huskies/specs/00_CONTEXT.md` for high-level project goals.
|
||||||
4. **Read Stack:** Check `.storkit/specs/tech/STACK.md` for technical constraints and patterns.
|
4. **Read Stack:** Check `.huskies/specs/tech/STACK.md` for technical constraints and patterns.
|
||||||
5. **Check Work Items:** Look at `.storkit/work/1_backlog/` and `.storkit/work/2_current/` to see what work is pending.
|
5. **Check Work Items:** Look at `.huskies/work/1_backlog/` and `.huskies/work/2_current/` to see what work is pending.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -238,7 +238,7 @@ If a user hands you this document and says "Apply this process to my project":
|
|||||||
|
|
||||||
Story Kit includes a chat bot that can be connected to one messaging platform at a time. The bot handles commands, LLM conversations, and pipeline notifications.
|
Story Kit includes a chat bot that can be connected to one messaging platform at a time. The bot handles commands, LLM conversations, and pipeline notifications.
|
||||||
|
|
||||||
**Only one transport can be active at a time.** To configure the bot, copy the appropriate example file to `.storkit/bot.toml`:
|
**Only one transport can be active at a time.** To configure the bot, copy the appropriate example file to `.huskies/bot.toml`:
|
||||||
|
|
||||||
| Transport | Example file | Webhook endpoint |
|
| Transport | Example file | Webhook endpoint |
|
||||||
|-----------|-------------|-----------------|
|
|-----------|-------------|-----------------|
|
||||||
@@ -248,7 +248,7 @@ Story Kit includes a chat bot that can be connected to one messaging platform at
|
|||||||
| Slack | `bot.toml.slack.example` | `/webhook/slack` |
|
| Slack | `bot.toml.slack.example` | `/webhook/slack` |
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp .storkit/bot.toml.matrix.example .storkit/bot.toml
|
cp .huskies/bot.toml.matrix.example .huskies/bot.toml
|
||||||
# Edit bot.toml with your credentials
|
# Edit bot.toml with your credentials
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ Read CLAUDE.md first, then .story_kit/README.md to understand the dev process.
|
|||||||
## Your Workflow
|
## Your Workflow
|
||||||
|
|
||||||
### 0. Read the Story
|
### 0. Read the Story
|
||||||
- Read the story file at `.storkit/work/3_qa/{{story_id}}.md`
|
- Read the story file at `.huskies/work/3_qa/{{story_id}}.md`
|
||||||
- Extract every acceptance criterion (the `- [ ]` checkbox lines)
|
- Extract every acceptance criterion (the `- [ ]` checkbox lines)
|
||||||
- Keep this list in mind for Step 3
|
- Keep this list in mind for Step 3
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ An AC fails if:
|
|||||||
- URL to visit in the browser
|
- URL to visit in the browser
|
||||||
- Things to check in the UI
|
- Things to check in the UI
|
||||||
- curl commands to exercise relevant API endpoints
|
- curl commands to exercise relevant API endpoints
|
||||||
- Kill the test server when done: `pkill -f 'target.*storkit' || true` (NEVER use `pkill -f storkit` — it kills the vite dev server)
|
- Kill the test server when done: `pkill -f 'target.*huskies' || true` (NEVER use `pkill -f huskies` — it kills the vite dev server)
|
||||||
|
|
||||||
### 5. Produce Structured Report and Verdict
|
### 5. Produce Structured Report and Verdict
|
||||||
Print your QA report to stdout. Then call `approve_qa` or `reject_qa` via the MCP tool based on the overall result. Use this format:
|
Print your QA report to stdout. Then call `approve_qa` or `reject_qa` via the MCP tool based on the overall result. Use this format:
|
||||||
@@ -184,7 +184,7 @@ Read CLAUDE.md first, then .story_kit/README.md to understand the dev process.
|
|||||||
## Your Workflow
|
## Your Workflow
|
||||||
|
|
||||||
### 0. Read the Story
|
### 0. Read the Story
|
||||||
- Read the story file at `.storkit/work/3_qa/{{story_id}}.md`
|
- Read the story file at `.huskies/work/3_qa/{{story_id}}.md`
|
||||||
- Extract every acceptance criterion (the `- [ ]` checkbox lines)
|
- Extract every acceptance criterion (the `- [ ]` checkbox lines)
|
||||||
- Keep this list in mind for Step 3
|
- Keep this list in mind for Step 3
|
||||||
|
|
||||||
@@ -225,7 +225,7 @@ An AC fails if:
|
|||||||
- URL to visit in the browser
|
- URL to visit in the browser
|
||||||
- Things to check in the UI
|
- Things to check in the UI
|
||||||
- curl commands to exercise relevant API endpoints
|
- curl commands to exercise relevant API endpoints
|
||||||
- Kill the test server when done: `pkill -f 'target.*storkit' || true` (NEVER use `pkill -f storkit` — it kills the vite dev server)
|
- Kill the test server when done: `pkill -f 'target.*huskies' || true` (NEVER use `pkill -f huskies` — it kills the vite dev server)
|
||||||
|
|
||||||
### 5. Produce Structured Report and Verdict
|
### 5. Produce Structured Report and Verdict
|
||||||
Print your QA report to stdout. Then call `approve_qa` or `reject_qa` via the MCP tool based on the overall result. Use this format:
|
Print your QA report to stdout. Then call `approve_qa` or `reject_qa` via the MCP tool based on the overall result. Use this format:
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# Example project.toml — copy to .storkit/project.toml and customise.
|
# Example project.toml — copy to .huskies/project.toml and customise.
|
||||||
# This file is checked in; project.toml itself is gitignored (it may contain
|
# This file is checked in; project.toml itself is gitignored (it may contain
|
||||||
# instance-specific settings).
|
# instance-specific settings).
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ max_turns = 50
|
|||||||
max_budget_usd = 5.00
|
max_budget_usd = 5.00
|
||||||
prompt = """
|
prompt = """
|
||||||
You are working in a git worktree on story {{story_id}}.
|
You are working in a git worktree on story {{story_id}}.
|
||||||
Read CLAUDE.md first, then .storkit/README.md to understand the dev process.
|
Read CLAUDE.md first, then .huskies/README.md to understand the dev process.
|
||||||
Run: cd "{{worktree_path}}" && git difftool {{base_branch}}...HEAD
|
Run: cd "{{worktree_path}}" && git difftool {{base_branch}}...HEAD
|
||||||
Commit all your work before your process exits.
|
Commit all your work before your process exits.
|
||||||
"""
|
"""
|
||||||
@@ -6,7 +6,7 @@ Slack integration is configured via `bot.toml` in the project's `.story_kit/` di
|
|||||||
|
|
||||||
```toml
|
```toml
|
||||||
transport = "slack"
|
transport = "slack"
|
||||||
display_name = "Storkit"
|
display_name = "Huskies"
|
||||||
slack_bot_token = "xoxb-..."
|
slack_bot_token = "xoxb-..."
|
||||||
slack_signing_secret = "..."
|
slack_signing_secret = "..."
|
||||||
slack_channel_ids = ["C01ABCDEF"]
|
slack_channel_ids = ["C01ABCDEF"]
|
||||||
@@ -29,11 +29,11 @@ Slash commands provide quick access to pipeline commands without mentioning the
|
|||||||
|
|
||||||
| Command | Description |
|
| Command | Description |
|
||||||
|---------|-------------|
|
|---------|-------------|
|
||||||
| `/storkit-status` | Show pipeline status and agent availability |
|
| `/huskies-status` | Show pipeline status and agent availability |
|
||||||
| `/storkit-cost` | Show token spend: 24h total, top stories, and breakdown |
|
| `/huskies-cost` | Show token spend: 24h total, top stories, and breakdown |
|
||||||
| `/storkit-show` | Display the full text of a work item (e.g. `/storkit-show 42`) |
|
| `/huskies-show` | Display the full text of a work item (e.g. `/huskies-show 42`) |
|
||||||
| `/storkit-git` | Show git status: branch, changes, ahead/behind |
|
| `/huskies-git` | Show git status: branch, changes, ahead/behind |
|
||||||
| `/storkit-htop` | Show system and agent process dashboard |
|
| `/huskies-htop` | Show system and agent process dashboard |
|
||||||
|
|
||||||
All slash command responses are **ephemeral** — only the user who invoked the command sees the response.
|
All slash command responses are **ephemeral** — only the user who invoked the command sees the response.
|
||||||
|
|
||||||
@@ -118,8 +118,8 @@ To support both Remote and Local models, the system implements a `ModelProvider`
|
|||||||
|
|
||||||
Multiple instances can run simultaneously in different worktrees. To avoid port conflicts:
|
Multiple instances can run simultaneously in different worktrees. To avoid port conflicts:
|
||||||
|
|
||||||
- **Backend:** Set `STORKIT_PORT` to a unique port (default is 3001). Example: `STORKIT_PORT=3002 cargo run`
|
- **Backend:** Set `HUSKIES_PORT` to a unique port (default is 3001). Example: `HUSKIES_PORT=3002 cargo run`
|
||||||
- **Frontend:** Run `npm run dev` from `frontend/`. It auto-selects the next unused port. It reads `STORKIT_PORT` to know which backend to talk to, so export it before running: `export STORKIT_PORT=3002 && cd frontend && npm run dev`
|
- **Frontend:** Run `npm run dev` from `frontend/`. It auto-selects the next unused port. It reads `HUSKIES_PORT` to know which backend to talk to, so export it before running: `export HUSKIES_PORT=3002 && cd frontend && npm run dev`
|
||||||
|
|
||||||
When running in a worktree, use a port that won't conflict with the main instance (3001). Ports 3002+ are good choices.
|
When running in a worktree, use a port that won't conflict with the main instance (3001). Ports 3002+ are good choices.
|
||||||
|
|
||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
name: "Fly.io Machines API integration for multi-tenant storkit SaaS"
|
name: "Fly.io Machines API integration for multi-tenant huskies SaaS"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Spike 408: Fly.io Machines API integration for multi-tenant storkit SaaS
|
# Spike 408: Fly.io Machines API integration for multi-tenant huskies SaaS
|
||||||
|
|
||||||
## Question
|
## Question
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ A thin Rust service using `reqwest` for the Machines API and `axum` for the reve
|
|||||||
- [ ] Test attaching a persistent volume to a machine and verify it persists across stop/start
|
- [ ] Test attaching a persistent volume to a machine and verify it persists across stop/start
|
||||||
- [ ] Test secret injection — pass a dummy `credentials.json` as a Fly secret and verify it's readable inside the machine
|
- [ ] Test secret injection — pass a dummy `credentials.json` as a Fly secret and verify it's readable inside the machine
|
||||||
- [ ] Sketch the auth proxy: JWT validation → machine lookup → reverse proxy to machine's private IP; verify WebSocket proxying works
|
- [ ] Sketch the auth proxy: JWT validation → machine lookup → reverse proxy to machine's private IP; verify WebSocket proxying works
|
||||||
- [ ] Measure actual cold start time for a minimal storkit container image
|
- [ ] Measure actual cold start time for a minimal huskies container image
|
||||||
- [ ] Document any API quirks, rate limits, or sharp edges discovered during testing
|
- [ ] Document any API quirks, rate limits, or sharp edges discovered during testing
|
||||||
|
|
||||||
## Findings
|
## Findings
|
||||||
+2
-2
@@ -6,13 +6,13 @@ name: "Multi-account OAuth token rotation on rate limit"
|
|||||||
|
|
||||||
## User Story
|
## User Story
|
||||||
|
|
||||||
As a storkit user with multiple Claude Max subscriptions, I want the system to automatically rotate to a different account when one gets rate limited, so that agents and chat don't stall out waiting for limits to reset.
|
As a huskies user with multiple Claude Max subscriptions, I want the system to automatically rotate to a different account when one gets rate limited, so that agents and chat don't stall out waiting for limits to reset.
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] OAuth login flow stores credentials per-account (keyed by email), not overwriting previous accounts
|
- [ ] OAuth login flow stores credentials per-account (keyed by email), not overwriting previous accounts
|
||||||
- [ ] GET /oauth/status returns all stored accounts and their status (active, rate-limited, expired)
|
- [ ] GET /oauth/status returns all stored accounts and their status (active, rate-limited, expired)
|
||||||
- [ ] When the active account hits a rate limit, storkit automatically swaps to the next available account's refresh token, refreshes, and retries
|
- [ ] When the active account hits a rate limit, huskies automatically swaps to the next available account's refresh token, refreshes, and retries
|
||||||
- [ ] The bot sends a notification in Matrix/WhatsApp when it swaps accounts
|
- [ ] The bot sends a notification in Matrix/WhatsApp when it swaps accounts
|
||||||
- [ ] If all accounts are rate limited, the bot surfaces a clear message with the time until the earliest reset
|
- [ ] If all accounts are rate limited, the bot surfaces a clear message with the time until the earliest reset
|
||||||
- [ ] A new /oauth/authorize login adds to the account pool rather than replacing the current credentials
|
- [ ] A new /oauth/authorize login adds to the account pool rather than replacing the current credentials
|
||||||
+1
-1
@@ -10,7 +10,7 @@ The `prompt_permission` MCP tool returns plain text ("Permission granted for '..
|
|||||||
|
|
||||||
## How to Reproduce
|
## How to Reproduce
|
||||||
|
|
||||||
1. Start the storkit server and open the web UI
|
1. Start the huskies server and open the web UI
|
||||||
2. Chat with the claude-code-pty model
|
2. Chat with the claude-code-pty model
|
||||||
3. Ask it to do something that requires a tool NOT in `.claude/settings.json` allow list (e.g. `wc -l /etc/hosts`, or WebFetch to a non-allowed domain)
|
3. Ask it to do something that requires a tool NOT in `.claude/settings.json` allow list (e.g. `wc -l /etc/hosts`, or WebFetch to a non-allowed domain)
|
||||||
4. The permission dialog appears — click Approve
|
4. The permission dialog appears — click Approve
|
||||||
+1
-1
@@ -6,7 +6,7 @@ name: "Retry limit for mergemaster and pipeline restarts"
|
|||||||
|
|
||||||
## User Story
|
## User Story
|
||||||
|
|
||||||
As a developer using storkit, I want pipeline auto-restarts to have a configurable retry limit so that failing agents don't loop infinitely consuming CPU and API credits.
|
As a developer using huskies, I want pipeline auto-restarts to have a configurable retry limit so that failing agents don't loop infinitely consuming CPU and API credits.
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
+2
-2
@@ -23,7 +23,7 @@ The watcher should periodically check `5_done/` and move items older than 4 hour
|
|||||||
- All MCP tools and pipeline logic that reference `5_archived` need updating to use `5_done`
|
- All MCP tools and pipeline logic that reference `5_archived` need updating to use `5_done`
|
||||||
- Frontend pipeline display if it shows archived/done items
|
- Frontend pipeline display if it shows archived/done items
|
||||||
- `.story_kit/README.md`: update pipeline stage documentation
|
- `.story_kit/README.md`: update pipeline stage documentation
|
||||||
- Story 116's init scaffolding: `storkit init` must create `5_done/` and `6_archived/` directories
|
- Story 116's init scaffolding: `huskies init` must create `5_done/` and `6_archived/` directories
|
||||||
- Any templates or scaffold code that creates the `.story_kit/work/` directory structure
|
- Any templates or scaffold code that creates the `.story_kit/work/` directory structure
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
@@ -35,7 +35,7 @@ The watcher should periodically check `5_done/` and move items older than 4 hour
|
|||||||
- [ ] Existing items in old `5_archived/` are migrated to `6_archived/`
|
- [ ] Existing items in old `5_archived/` are migrated to `6_archived/`
|
||||||
- [ ] Frontend pipeline display updated if applicable
|
- [ ] Frontend pipeline display updated if applicable
|
||||||
- [ ] `.story_kit/README.md` updated to reflect the new pipeline stages
|
- [ ] `.story_kit/README.md` updated to reflect the new pipeline stages
|
||||||
- [ ] `storkit init` scaffolding creates `5_done/` and `6_archived/` (coordinate with story 116)
|
- [ ] `huskies init` scaffolding creates `5_done/` and `6_archived/` (coordinate with story 116)
|
||||||
|
|
||||||
## Out of Scope
|
## Out of Scope
|
||||||
|
|
||||||
+5
-5
@@ -17,21 +17,21 @@ const TEMPLATE_MARKER_CONTEXT: &str = "Agentic AI Code Assistant";
|
|||||||
const TEMPLATE_MARKER_STACK: &str = "Agentic Code Assistant";
|
const TEMPLATE_MARKER_STACK: &str = "Agentic Code Assistant";
|
||||||
```
|
```
|
||||||
|
|
||||||
These markers are phrases that appear in the scaffold templates (`server/src/io/fs.rs` lines 233 and 269). The detection logic (`is_template_or_missing` at line 59) checks if the file *contains* the marker string. But these phrases are generic enough that real project content can contain them too — especially when the project being managed IS an agentic code assistant (i.e. storkit managing itself).
|
These markers are phrases that appear in the scaffold templates (`server/src/io/fs.rs` lines 233 and 269). The detection logic (`is_template_or_missing` at line 59) checks if the file *contains* the marker string. But these phrases are generic enough that real project content can contain them too — especially when the project being managed IS an agentic code assistant (i.e. huskies managing itself).
|
||||||
|
|
||||||
## The Fix
|
## The Fix
|
||||||
|
|
||||||
Replace the content-based marker detection with a dedicated sentinel comment that only exists in untouched scaffold templates. The sentinel should be something that would never appear in real content, like an HTML comment:
|
Replace the content-based marker detection with a dedicated sentinel comment that only exists in untouched scaffold templates. The sentinel should be something that would never appear in real content, like an HTML comment:
|
||||||
|
|
||||||
```
|
```
|
||||||
<!-- storkit:scaffold-template -->
|
<!-- huskies:scaffold-template -->
|
||||||
```
|
```
|
||||||
|
|
||||||
Changes needed:
|
Changes needed:
|
||||||
|
|
||||||
1. **`server/src/io/onboarding.rs`**: Replace `TEMPLATE_MARKER_CONTEXT` and `TEMPLATE_MARKER_STACK` with a single `TEMPLATE_SENTINEL` constant set to `"<!-- storkit:scaffold-template -->"`. Update `check_onboarding_status` to use it for both context and stack checks.
|
1. **`server/src/io/onboarding.rs`**: Replace `TEMPLATE_MARKER_CONTEXT` and `TEMPLATE_MARKER_STACK` with a single `TEMPLATE_SENTINEL` constant set to `"<!-- huskies:scaffold-template -->"`. Update `check_onboarding_status` to use it for both context and stack checks.
|
||||||
|
|
||||||
2. **`server/src/io/fs.rs`**: Add `<!-- storkit:scaffold-template -->` as the first line of both `STORY_KIT_CONTEXT` and `STORY_KIT_STACK` template constants (lines 233 and 269).
|
2. **`server/src/io/fs.rs`**: Add `<!-- huskies:scaffold-template -->` as the first line of both `STORY_KIT_CONTEXT` and `STORY_KIT_STACK` template constants (lines 233 and 269).
|
||||||
|
|
||||||
3. **`server/src/io/onboarding.rs` tests**: Update the test `needs_onboarding_true_when_specs_contain_scaffold_markers` to use the sentinel instead of the old marker phrases. Also add a test confirming that content containing "Agentic AI Code Assistant" WITHOUT the sentinel does NOT trigger onboarding.
|
3. **`server/src/io/onboarding.rs` tests**: Update the test `needs_onboarding_true_when_specs_contain_scaffold_markers` to use the sentinel instead of the old marker phrases. Also add a test confirming that content containing "Agentic AI Code Assistant" WITHOUT the sentinel does NOT trigger onboarding.
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ Changes needed:
|
|||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] Scaffold templates contain the sentinel `<!-- storkit:scaffold-template -->` as first line
|
- [ ] Scaffold templates contain the sentinel `<!-- huskies:scaffold-template -->` as first line
|
||||||
- [ ] `needs_onboarding()` returns false for projects whose specs contain "Agentic AI Code Assistant" but NOT the sentinel
|
- [ ] `needs_onboarding()` returns false for projects whose specs contain "Agentic AI Code Assistant" but NOT the sentinel
|
||||||
- [ ] `needs_onboarding()` returns true for untouched scaffold content (which contains the sentinel)
|
- [ ] `needs_onboarding()` returns true for untouched scaffold content (which contains the sentinel)
|
||||||
- [ ] Existing tests updated and passing
|
- [ ] Existing tests updated and passing
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user