Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
acfd2f0c74 | ||
|
|
931bb545ab | ||
|
|
15e33d261a |
@@ -4,8 +4,8 @@
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
$OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
$InputData = [Console]::In.ReadToEnd()
|
||||
|
||||
$PlanFile = "task_plan.md"
|
||||
@@ -15,7 +15,7 @@ if (-not (Test-Path $PlanFile)) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
$content = Get-Content $PlanFile -Raw
|
||||
$content = Get-Content $PlanFile -Raw -Encoding UTF8
|
||||
|
||||
# Count total phases
|
||||
$TOTAL = ([regex]::Matches($content, "### Phase")).Count
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
$OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
$InputData = [Console]::In.ReadToEnd()
|
||||
|
||||
$PlanFile = "task_plan.md"
|
||||
@@ -15,7 +15,7 @@ if (-not (Test-Path $PlanFile)) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
$Context = (Get-Content $PlanFile -TotalCount 30 -ErrorAction SilentlyContinue) -join "`n"
|
||||
$Context = (Get-Content $PlanFile -TotalCount 30 -Encoding UTF8 -ErrorAction SilentlyContinue) -join "`n"
|
||||
|
||||
if (-not $Context) {
|
||||
Write-Output '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
$OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
$InputData = [Console]::In.ReadToEnd()
|
||||
|
||||
$PlanFile = "task_plan.md"
|
||||
@@ -26,12 +26,12 @@ if (Test-Path $PlanFile) {
|
||||
if ($Catchup) {
|
||||
$Context = $Catchup -join "`n"
|
||||
} else {
|
||||
$Context = (Get-Content $PlanFile -TotalCount 5 -ErrorAction SilentlyContinue) -join "`n"
|
||||
$Context = (Get-Content $PlanFile -TotalCount 5 -Encoding UTF8 -ErrorAction SilentlyContinue) -join "`n"
|
||||
}
|
||||
} else {
|
||||
# No plan yet — inject SKILL.md so Copilot knows the planning workflow and templates
|
||||
if (Test-Path "$SkillDir/SKILL.md") {
|
||||
$Context = Get-Content "$SkillDir/SKILL.md" -Raw -ErrorAction SilentlyContinue
|
||||
$Context = Get-Content "$SkillDir/SKILL.md" -Raw -Encoding UTF8 -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"PreToolUse": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "cat task_plan.md 2>/dev/null | head -30 || true",
|
||||
"matcher": { "tool_name": "Write|Edit|Bash|Read|Glob|Grep" },
|
||||
"timeout": 5000,
|
||||
"description": "Read plan before tool use to keep goals in active context"
|
||||
}
|
||||
],
|
||||
"PostToolUse": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "echo '[planning-with-files] File updated. If this completes a phase, update task_plan.md status.'",
|
||||
"matcher": { "tool_name": "Write|Edit" },
|
||||
"description": "Remind agent to update plan status after file changes"
|
||||
}
|
||||
],
|
||||
"Stop": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "sh .mastracode/skills/planning-with-files/scripts/check-complete.sh 2>/dev/null || sh ~/.mastracode/skills/planning-with-files/scripts/check-complete.sh 2>/dev/null || true",
|
||||
"timeout": 10000,
|
||||
"description": "Check all phases are complete before the agent stops"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -18,7 +18,8 @@ hooks:
|
||||
- hooks:
|
||||
- type: command
|
||||
command: |
|
||||
SCRIPT_DIR="${MASTRACODE_SKILL_ROOT:-$HOME/.mastracode/skills/planning-with-files}/scripts"
|
||||
SCRIPT_DIR="${HOME}/.mastracode/skills/planning-with-files/scripts"
|
||||
[ -f "$SCRIPT_DIR/check-complete.sh" ] || SCRIPT_DIR=".mastracode/skills/planning-with-files/scripts"
|
||||
|
||||
IS_WINDOWS=0
|
||||
if [ "${OS-}" = "Windows_NT" ]; then
|
||||
@@ -43,7 +44,7 @@ hooks:
|
||||
sh "$SCRIPT_DIR/check-complete.sh"
|
||||
fi
|
||||
metadata:
|
||||
version: "2.16.1"
|
||||
version: "2.18.1"
|
||||
---
|
||||
|
||||
# Planning with Files
|
||||
|
||||
@@ -2,6 +2,36 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [2.18.2] - 2026-02-26
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Mastra Code hooks were silently doing nothing**
|
||||
- Root cause: Mastra Code reads hooks from `.mastracode/hooks.json`, not from SKILL.md frontmatter. The existing integration had hooks defined only in SKILL.md (Claude Code format), which Mastra Code ignores entirely. All three hooks (PreToolUse, PostToolUse, Stop) were non-functional.
|
||||
- Added `.mastracode/hooks.json` with proper Mastra Code format including `matcher`, `timeout`, and `description` fields
|
||||
- Fixed `MASTRACODE_SKILL_ROOT` env var in SKILL.md Stop hook (variable does not exist in Mastra Code, replaced with `$HOME` fallback to local path)
|
||||
- Bumped `.mastracode/skills/planning-with-files/SKILL.md` metadata version from 2.16.1 to 2.18.1
|
||||
- Corrected `docs/mastra.md` to accurately describe hooks.json (removed false claim that Mastra Code uses the same hook system as Claude Code)
|
||||
- Fixed personal installation instructions to include hooks.json copy step
|
||||
|
||||
---
|
||||
|
||||
## [2.18.1] - 2026-02-26
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Copilot hooks garbled characters — still broken after v2.16.1** (Issue #82, confirmed by @Hexiaopi)
|
||||
- Root cause: `Get-Content` in all PS1 scripts had no `-Encoding` parameter — PowerShell 5.x reads files using the system ANSI code page (Windows-1252) by default, corrupting any non-ASCII character in `task_plan.md` or `SKILL.md` before it reaches the output pipe. The v2.16.1 fix was correct but fixed only the output side, not the read side.
|
||||
- Secondary fix: `[System.Text.Encoding]::UTF8` returns UTF-8 with BOM — replaced with `[System.Text.UTF8Encoding]::new($false)` (UTF-8 without BOM) in all four PS1 scripts to prevent JSON parsers from receiving a stray `0xEF 0xBB 0xBF` preamble
|
||||
- Fixed files: `pre-tool-use.ps1`, `session-start.ps1`, `agent-stop.ps1`, `post-tool-use.ps1`
|
||||
- Bash scripts were already correct from v2.16.1
|
||||
|
||||
### Thanks
|
||||
|
||||
- @Hexiaopi for confirming the issue persisted after v2.16.1 (Issue #82)
|
||||
|
||||
---
|
||||
|
||||
## [2.18.0] - 2026-02-26
|
||||
|
||||
### Added
|
||||
|
||||
@@ -58,10 +58,12 @@ Everyone who made this project better — bug reports, PRs, and integrations.
|
||||
<details>
|
||||
<summary><strong>📦 Releases & Session Recovery</strong></summary>
|
||||
|
||||
### Current Version: v2.17.0
|
||||
### Current Version: v2.18.2
|
||||
|
||||
| Version | Highlights |
|
||||
|---------|------------|
|
||||
| **v2.18.2** | Mastra Code hooks fix (hooks.json + docs accuracy) |
|
||||
| **v2.18.1** | Copilot garbled characters complete fix |
|
||||
| **v2.18.0** | BoxLite sandbox runtime integration |
|
||||
| **v2.17.0** | Mastra Code support + all IDE SKILL.md spec fixes |
|
||||
| **v2.16.1** | Copilot garbled characters fix — PS1 UTF-8 encoding + bash ensure_ascii (thanks @Hexiaopi!) |
|
||||
@@ -151,7 +153,7 @@ A Claude Code plugin that transforms your workflow to use persistent markdown fi
|
||||
[](https://docs.github.com/en/copilot/reference/hooks-configuration)
|
||||
[](https://code.mastra.ai)
|
||||
[](https://boxlite.ai)
|
||||
[](https://github.com/OthmanAdi/planning-with-files/releases)
|
||||
[](https://github.com/OthmanAdi/planning-with-files/releases)
|
||||
[](https://getskillcheck.com)
|
||||
|
||||
## Quick Install
|
||||
@@ -393,4 +395,4 @@ MIT License — feel free to use, modify, and distribute.
|
||||
|
||||
## Star History
|
||||
|
||||
[](https://repostars.dev/?repos=OthmanAdi%2Fplanning-with-files&theme=copper)
|
||||
<a href="https://repostars.dev/?repos=OthmanAdi%2Fplanning-with-files&theme=copper"><img src="https://repostars.dev/api/embed?repo=OthmanAdi%2Fplanning-with-files&theme=copper" width="100%" alt="Star History Chart" /></a>
|
||||
|
||||
+25
-10
@@ -40,14 +40,20 @@ Install just for yourself:
|
||||
# Clone the repo
|
||||
git clone https://github.com/OthmanAdi/planning-with-files.git /tmp/planning-with-files
|
||||
|
||||
# Copy to your personal Mastra Code skills folder
|
||||
# Copy skill to your personal Mastra Code skills folder
|
||||
mkdir -p ~/.mastracode/skills
|
||||
cp -r /tmp/planning-with-files/.mastracode/skills/planning-with-files ~/.mastracode/skills/
|
||||
|
||||
# Copy hooks (required for plan enforcement)
|
||||
# If you already have ~/.mastracode/hooks.json, merge the entries manually
|
||||
cp /tmp/planning-with-files/.mastracode/hooks.json ~/.mastracode/hooks.json
|
||||
|
||||
# Clean up
|
||||
rm -rf /tmp/planning-with-files
|
||||
```
|
||||
|
||||
> **Note:** If you already have a `~/.mastracode/hooks.json`, do not overwrite it. Instead, merge the PreToolUse, PostToolUse, and Stop entries from the skill's hooks.json into your existing file.
|
||||
|
||||
### Verification
|
||||
|
||||
```bash
|
||||
@@ -60,15 +66,20 @@ Restart your Mastra Code session. The skill auto-activates when you work on comp
|
||||
|
||||
## How It Works
|
||||
|
||||
### Hooks (Native Support)
|
||||
### Hooks (via hooks.json)
|
||||
|
||||
Mastra Code supports the same hook system as Claude Code. This integration includes:
|
||||
Mastra Code uses a separate `hooks.json` file for lifecycle hooks. This is different from Claude Code, which defines hooks in SKILL.md frontmatter. Mastra Code reads hooks from:
|
||||
|
||||
| Hook | Trigger | What It Does |
|
||||
1. `.mastracode/hooks.json` (project-level, highest priority)
|
||||
2. `~/.mastracode/hooks.json` (global)
|
||||
|
||||
This integration includes a pre-configured `hooks.json` with all three hooks:
|
||||
|
||||
| Hook | Matcher | What It Does |
|
||||
|------|---------|--------------|
|
||||
| **PreToolUse** | Before Write, Edit, Bash, Read, Glob, Grep | Reads first 30 lines of `task_plan.md` — keeps goals in attention |
|
||||
| **PostToolUse** | After Write, Edit | Reminds you to update plan status |
|
||||
| **Stop** | When agent finishes | Runs completion check script |
|
||||
| **PreToolUse** | Write, Edit, Bash, Read, Glob, Grep | Reads first 30 lines of `task_plan.md` to keep goals in attention |
|
||||
| **PostToolUse** | Write, Edit | Reminds you to update plan status after file changes |
|
||||
| **Stop** | (all) | Runs `check-complete.sh` to verify all phases are done |
|
||||
|
||||
### Auto-Activation
|
||||
|
||||
@@ -94,8 +105,8 @@ Once activated, the skill creates:
|
||||
|
||||
Mastra Code reads from `.claude/skills/` as a fallback. If you already have planning-with-files installed for Claude Code, it will work — but the dedicated `.mastracode/` installation gives you:
|
||||
|
||||
- Native hooks integration (PreToolUse, PostToolUse, Stop)
|
||||
- Correct script path resolution
|
||||
- Native hooks via `hooks.json` (PreToolUse, PostToolUse, Stop)
|
||||
- Correct script path resolution for Mastra Code directories
|
||||
- No path conflicts with Claude Code plugin root
|
||||
|
||||
---
|
||||
@@ -147,7 +158,11 @@ With personal installation (`~/.mastracode/skills/`):
|
||||
|
||||
### Hooks Not Running?
|
||||
|
||||
Check `.mastracode/hooks.json` for conflicts. The skill's hooks are defined in SKILL.md frontmatter and should work automatically.
|
||||
Mastra Code reads hooks from `hooks.json`, not from SKILL.md frontmatter. Verify:
|
||||
|
||||
1. Check that `.mastracode/hooks.json` exists in your project root (workspace install) or `~/.mastracode/hooks.json` (personal install)
|
||||
2. Verify the file contains PreToolUse, PostToolUse, and Stop entries
|
||||
3. Restart Mastra Code after adding or modifying hooks.json
|
||||
|
||||
### Already Using Claude Code?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user