Initial commit: Flutter 无书应用项目
This commit is contained in:
45
.trae/skills/planning-with-files/.github/hooks/planning-with-files.json
vendored
Normal file
45
.trae/skills/planning-with-files/.github/hooks/planning-with-files.json
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"version": 1,
|
||||
"hooks": {
|
||||
"sessionStart": [
|
||||
{
|
||||
"type": "command",
|
||||
"bash": ".github/hooks/scripts/session-start.sh",
|
||||
"powershell": ".github/hooks/scripts/session-start.ps1",
|
||||
"timeout": 15
|
||||
}
|
||||
],
|
||||
"preToolUse": [
|
||||
{
|
||||
"type": "command",
|
||||
"bash": ".github/hooks/scripts/pre-tool-use.sh",
|
||||
"powershell": ".github/hooks/scripts/pre-tool-use.ps1",
|
||||
"timeout": 5
|
||||
}
|
||||
],
|
||||
"postToolUse": [
|
||||
{
|
||||
"type": "command",
|
||||
"bash": ".github/hooks/scripts/post-tool-use.sh",
|
||||
"powershell": ".github/hooks/scripts/post-tool-use.ps1",
|
||||
"timeout": 5
|
||||
}
|
||||
],
|
||||
"agentStop": [
|
||||
{
|
||||
"type": "command",
|
||||
"bash": ".github/hooks/scripts/agent-stop.sh",
|
||||
"powershell": ".github/hooks/scripts/agent-stop.ps1",
|
||||
"timeout": 10
|
||||
}
|
||||
],
|
||||
"errorOccurred": [
|
||||
{
|
||||
"type": "command",
|
||||
"bash": ".github/hooks/scripts/error-occurred.sh",
|
||||
"powershell": ".github/hooks/scripts/error-occurred.ps1",
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
55
.trae/skills/planning-with-files/.github/hooks/scripts/agent-stop.ps1
vendored
Normal file
55
.trae/skills/planning-with-files/.github/hooks/scripts/agent-stop.ps1
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
# planning-with-files: Agent stop hook for GitHub Copilot (PowerShell)
|
||||
# Checks if all phases in task_plan.md are complete.
|
||||
# Injects continuation context if phases are incomplete.
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
$InputData = [Console]::In.ReadToEnd()
|
||||
|
||||
$PlanFile = "task_plan.md"
|
||||
|
||||
if (-not (Test-Path $PlanFile)) {
|
||||
Write-Output '{}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
$content = Get-Content $PlanFile -Raw -Encoding UTF8
|
||||
|
||||
# Count total phases
|
||||
$TOTAL = ([regex]::Matches($content, "### Phase")).Count
|
||||
|
||||
# Check for **Status:** format first
|
||||
$COMPLETE = ([regex]::Matches($content, "\*\*Status:\*\* complete")).Count
|
||||
$IN_PROGRESS = ([regex]::Matches($content, "\*\*Status:\*\* in_progress")).Count
|
||||
$PENDING = ([regex]::Matches($content, "\*\*Status:\*\* pending")).Count
|
||||
|
||||
# Fallback: check for [complete] inline format
|
||||
if ($COMPLETE -eq 0 -and $IN_PROGRESS -eq 0 -and $PENDING -eq 0) {
|
||||
$COMPLETE = ([regex]::Matches($content, "\[complete\]")).Count
|
||||
$IN_PROGRESS = ([regex]::Matches($content, "\[in_progress\]")).Count
|
||||
$PENDING = ([regex]::Matches($content, "\[pending\]")).Count
|
||||
}
|
||||
|
||||
if ($COMPLETE -eq $TOTAL -and $TOTAL -gt 0) {
|
||||
$msg = "[planning-with-files] ALL PHASES COMPLETE ($COMPLETE/$TOTAL). If the user has additional work, add new phases to task_plan.md before starting."
|
||||
$output = @{
|
||||
hookSpecificOutput = @{
|
||||
hookEventName = "AgentStop"
|
||||
additionalContext = $msg
|
||||
}
|
||||
}
|
||||
$output | ConvertTo-Json -Depth 3 -Compress
|
||||
exit 0
|
||||
}
|
||||
|
||||
$msg = "[planning-with-files] Task incomplete ($COMPLETE/$TOTAL phases done). Update progress.md, then read task_plan.md and continue working on the remaining phases."
|
||||
$output = @{
|
||||
hookSpecificOutput = @{
|
||||
hookEventName = "AgentStop"
|
||||
additionalContext = $msg
|
||||
}
|
||||
}
|
||||
$output | ConvertTo-Json -Depth 3 -Compress
|
||||
exit 0
|
||||
46
.trae/skills/planning-with-files/.github/hooks/scripts/agent-stop.sh
vendored
Normal file
46
.trae/skills/planning-with-files/.github/hooks/scripts/agent-stop.sh
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
# planning-with-files: Agent stop hook for GitHub Copilot
|
||||
# Checks if all phases in task_plan.md are complete.
|
||||
# Injects continuation context if phases are incomplete.
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
INPUT=$(cat)
|
||||
|
||||
PLAN_FILE="task_plan.md"
|
||||
|
||||
if [ ! -f "$PLAN_FILE" ]; then
|
||||
echo '{}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Count total phases
|
||||
TOTAL=$(grep -c "### Phase" "$PLAN_FILE" || true)
|
||||
|
||||
# Check for **Status:** format first
|
||||
COMPLETE=$(grep -cF "**Status:** complete" "$PLAN_FILE" || true)
|
||||
IN_PROGRESS=$(grep -cF "**Status:** in_progress" "$PLAN_FILE" || true)
|
||||
PENDING=$(grep -cF "**Status:** pending" "$PLAN_FILE" || true)
|
||||
|
||||
# Fallback: check for [complete] inline format
|
||||
if [ "$COMPLETE" -eq 0 ] && [ "$IN_PROGRESS" -eq 0 ] && [ "$PENDING" -eq 0 ]; then
|
||||
COMPLETE=$(grep -c "\[complete\]" "$PLAN_FILE" || true)
|
||||
IN_PROGRESS=$(grep -c "\[in_progress\]" "$PLAN_FILE" || true)
|
||||
PENDING=$(grep -c "\[pending\]" "$PLAN_FILE" || true)
|
||||
fi
|
||||
|
||||
# Default to 0 if empty
|
||||
: "${TOTAL:=0}"
|
||||
: "${COMPLETE:=0}"
|
||||
: "${IN_PROGRESS:=0}"
|
||||
: "${PENDING:=0}"
|
||||
|
||||
if [ "$COMPLETE" -eq "$TOTAL" ] && [ "$TOTAL" -gt 0 ]; then
|
||||
MSG="[planning-with-files] ALL PHASES COMPLETE ($COMPLETE/$TOTAL). If the user has additional work, add new phases to task_plan.md before starting."
|
||||
echo "{\"hookSpecificOutput\":{\"hookEventName\":\"AgentStop\",\"additionalContext\":\"$MSG\"}}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
MSG="[planning-with-files] Task incomplete ($COMPLETE/$TOTAL phases done). Update progress.md, then read task_plan.md and continue working on the remaining phases."
|
||||
echo "{\"hookSpecificOutput\":{\"hookEventName\":\"AgentStop\",\"additionalContext\":\"$MSG\"}}"
|
||||
exit 0
|
||||
35
.trae/skills/planning-with-files/.github/hooks/scripts/error-occurred.ps1
vendored
Normal file
35
.trae/skills/planning-with-files/.github/hooks/scripts/error-occurred.ps1
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
# planning-with-files: Error hook for GitHub Copilot (Windows PowerShell)
|
||||
# Logs errors to task_plan.md when the agent encounters an error.
|
||||
|
||||
$planFile = "task_plan.md"
|
||||
|
||||
if (-not (Test-Path $planFile)) {
|
||||
Write-Output '{}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Read stdin
|
||||
$input = [Console]::In.ReadToEnd()
|
||||
|
||||
try {
|
||||
$data = $input | ConvertFrom-Json
|
||||
$errorMsg = ""
|
||||
if ($data.error -is [PSCustomObject]) {
|
||||
$errorMsg = $data.error.message
|
||||
} elseif ($data.error) {
|
||||
$errorMsg = [string]$data.error
|
||||
}
|
||||
|
||||
if ($errorMsg) {
|
||||
$truncated = $errorMsg.Substring(0, [Math]::Min(200, $errorMsg.Length))
|
||||
$context = "[planning-with-files] Error detected: $truncated. Log this error in task_plan.md under Errors Encountered with the attempt number and resolution."
|
||||
$escaped = $context | ConvertTo-Json
|
||||
Write-Output "{`"hookSpecificOutput`":{`"hookEventName`":`"ErrorOccurred`",`"additionalContext`":$escaped}}"
|
||||
} else {
|
||||
Write-Output '{}'
|
||||
}
|
||||
} catch {
|
||||
Write-Output '{}'
|
||||
}
|
||||
|
||||
exit 0
|
||||
36
.trae/skills/planning-with-files/.github/hooks/scripts/error-occurred.sh
vendored
Normal file
36
.trae/skills/planning-with-files/.github/hooks/scripts/error-occurred.sh
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
#!/bin/bash
|
||||
# planning-with-files: Error hook for GitHub Copilot
|
||||
# Logs errors to task_plan.md when the agent encounters an error.
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
INPUT=$(cat)
|
||||
|
||||
PLAN_FILE="task_plan.md"
|
||||
|
||||
if [ ! -f "$PLAN_FILE" ]; then
|
||||
echo '{}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Extract error message from input JSON
|
||||
PYTHON=$(command -v python3 || command -v python)
|
||||
ERROR_MSG=$($PYTHON -c "
|
||||
import sys, json
|
||||
try:
|
||||
data = json.load(sys.stdin)
|
||||
msg = data.get('error', {}).get('message', '') if isinstance(data.get('error'), dict) else str(data.get('error', ''))
|
||||
print(msg[:200])
|
||||
except:
|
||||
print('')
|
||||
" <<< "$INPUT" 2>/dev/null || echo "")
|
||||
|
||||
if [ -n "$ERROR_MSG" ]; then
|
||||
CONTEXT="[planning-with-files] Error detected: ${ERROR_MSG}. Log this error in task_plan.md under Errors Encountered with the attempt number and resolution."
|
||||
ESCAPED=$($PYTHON -c "import sys,json; print(json.dumps(sys.stdin.read(), ensure_ascii=False))" <<< "$CONTEXT" 2>/dev/null || echo "\"\"")
|
||||
echo "{\"hookSpecificOutput\":{\"hookEventName\":\"ErrorOccurred\",\"additionalContext\":$ESCAPED}}"
|
||||
else
|
||||
echo '{}'
|
||||
fi
|
||||
|
||||
exit 0
|
||||
17
.trae/skills/planning-with-files/.github/hooks/scripts/post-tool-use.ps1
vendored
Normal file
17
.trae/skills/planning-with-files/.github/hooks/scripts/post-tool-use.ps1
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# planning-with-files: Post-tool-use hook for GitHub Copilot (PowerShell)
|
||||
# Reminds the agent to update task_plan.md after tool use.
|
||||
# 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
|
||||
$InputData = [Console]::In.ReadToEnd()
|
||||
|
||||
$output = @{
|
||||
hookSpecificOutput = @{
|
||||
hookEventName = "PostToolUse"
|
||||
additionalContext = "[planning-with-files] Update progress.md with what you just did. If a phase is now complete, update task_plan.md status."
|
||||
}
|
||||
}
|
||||
$output | ConvertTo-Json -Depth 3 -Compress
|
||||
exit 0
|
||||
10
.trae/skills/planning-with-files/.github/hooks/scripts/post-tool-use.sh
vendored
Normal file
10
.trae/skills/planning-with-files/.github/hooks/scripts/post-tool-use.sh
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
# planning-with-files: Post-tool-use hook for GitHub Copilot
|
||||
# Reminds the agent to update task_plan.md after tool use.
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
INPUT=$(cat)
|
||||
|
||||
echo '{"hookSpecificOutput":{"hookEventName":"PostToolUse","additionalContext":"[planning-with-files] Update progress.md with what you just did. If a phase is now complete, update task_plan.md status."}}'
|
||||
exit 0
|
||||
33
.trae/skills/planning-with-files/.github/hooks/scripts/pre-tool-use.ps1
vendored
Normal file
33
.trae/skills/planning-with-files/.github/hooks/scripts/pre-tool-use.ps1
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
# planning-with-files: Pre-tool-use hook for GitHub Copilot (PowerShell)
|
||||
# Reads the first 30 lines of task_plan.md to keep goals in context.
|
||||
# Always allows tool execution — this hook never blocks tools.
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
$InputData = [Console]::In.ReadToEnd()
|
||||
|
||||
$PlanFile = "task_plan.md"
|
||||
|
||||
if (-not (Test-Path $PlanFile)) {
|
||||
Write-Output '{}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
$Context = (Get-Content $PlanFile -TotalCount 30 -Encoding UTF8 -ErrorAction SilentlyContinue) -join "`n"
|
||||
|
||||
if (-not $Context) {
|
||||
Write-Output '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
$output = @{
|
||||
hookSpecificOutput = @{
|
||||
hookEventName = "PreToolUse"
|
||||
permissionDecision = "allow"
|
||||
additionalContext = $Context
|
||||
}
|
||||
}
|
||||
$output | ConvertTo-Json -Depth 3 -Compress
|
||||
exit 0
|
||||
29
.trae/skills/planning-with-files/.github/hooks/scripts/pre-tool-use.sh
vendored
Normal file
29
.trae/skills/planning-with-files/.github/hooks/scripts/pre-tool-use.sh
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
# planning-with-files: Pre-tool-use hook for GitHub Copilot
|
||||
# Reads the first 30 lines of task_plan.md to keep goals in context.
|
||||
# Always allows tool execution — this hook never blocks tools.
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
INPUT=$(cat)
|
||||
|
||||
PLAN_FILE="task_plan.md"
|
||||
|
||||
if [ ! -f "$PLAN_FILE" ]; then
|
||||
echo '{}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
CONTEXT=$(head -30 "$PLAN_FILE" 2>/dev/null || echo "")
|
||||
|
||||
if [ -z "$CONTEXT" ]; then
|
||||
echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Escape context for JSON
|
||||
PYTHON=$(command -v python3 || command -v python)
|
||||
ESCAPED=$(echo "$CONTEXT" | $PYTHON -c "import sys,json; print(json.dumps(sys.stdin.read(), ensure_ascii=False))" 2>/dev/null || echo "\"\"")
|
||||
|
||||
echo "{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"allow\",\"additionalContext\":$ESCAPED}}"
|
||||
exit 0
|
||||
50
.trae/skills/planning-with-files/.github/hooks/scripts/session-start.ps1
vendored
Normal file
50
.trae/skills/planning-with-files/.github/hooks/scripts/session-start.ps1
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
# planning-with-files: Session start hook for GitHub Copilot (PowerShell)
|
||||
# When task_plan.md exists: runs session-catchup or reads plan header.
|
||||
# When task_plan.md doesn't exist: injects SKILL.md so Copilot knows the planning workflow.
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
$InputData = [Console]::In.ReadToEnd()
|
||||
|
||||
$PlanFile = "task_plan.md"
|
||||
$SkillDir = ".github/skills/planning-with-files"
|
||||
|
||||
if (Test-Path $PlanFile) {
|
||||
# Plan exists — try session catchup, fall back to reading plan header
|
||||
$Catchup = ""
|
||||
if (Test-Path "$SkillDir/scripts/session-catchup.py") {
|
||||
try {
|
||||
$PythonCmd = if (Get-Command python3 -ErrorAction SilentlyContinue) { "python3" } else { "python" }
|
||||
$Catchup = & $PythonCmd "$SkillDir/scripts/session-catchup.py" (Get-Location).Path 2>$null
|
||||
} catch {
|
||||
$Catchup = ""
|
||||
}
|
||||
}
|
||||
|
||||
if ($Catchup) {
|
||||
$Context = $Catchup -join "`n"
|
||||
} else {
|
||||
$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 -Encoding UTF8 -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $Context) {
|
||||
Write-Output '{}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
$output = @{
|
||||
hookSpecificOutput = @{
|
||||
hookEventName = "SessionStart"
|
||||
additionalContext = $Context
|
||||
}
|
||||
}
|
||||
$output | ConvertTo-Json -Depth 3 -Compress
|
||||
exit 0
|
||||
42
.trae/skills/planning-with-files/.github/hooks/scripts/session-start.sh
vendored
Normal file
42
.trae/skills/planning-with-files/.github/hooks/scripts/session-start.sh
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
# planning-with-files: Session start hook for GitHub Copilot
|
||||
# When task_plan.md exists: runs session-catchup or reads plan header.
|
||||
# When task_plan.md doesn't exist: injects SKILL.md so Copilot knows the planning workflow.
|
||||
# Always exits 0 — outputs JSON to stdout.
|
||||
|
||||
# Read stdin (required — Copilot pipes JSON to stdin)
|
||||
INPUT=$(cat)
|
||||
|
||||
PLAN_FILE="task_plan.md"
|
||||
SKILL_DIR=".github/skills/planning-with-files"
|
||||
PYTHON=$(command -v python3 || command -v python)
|
||||
|
||||
if [ -f "$PLAN_FILE" ]; then
|
||||
# Plan exists — try session catchup, fall back to reading plan header
|
||||
CATCHUP=""
|
||||
if [ -n "$PYTHON" ] && [ -f "$SKILL_DIR/scripts/session-catchup.py" ]; then
|
||||
CATCHUP=$($PYTHON "$SKILL_DIR/scripts/session-catchup.py" "$(pwd)" 2>/dev/null)
|
||||
fi
|
||||
|
||||
if [ -n "$CATCHUP" ]; then
|
||||
CONTEXT="$CATCHUP"
|
||||
else
|
||||
CONTEXT=$(head -5 "$PLAN_FILE" 2>/dev/null || echo "")
|
||||
fi
|
||||
else
|
||||
# No plan yet — inject SKILL.md so Copilot knows the planning workflow and templates
|
||||
if [ -f "$SKILL_DIR/SKILL.md" ]; then
|
||||
CONTEXT=$(cat "$SKILL_DIR/SKILL.md" 2>/dev/null || echo "")
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$CONTEXT" ]; then
|
||||
echo '{}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Escape context for JSON
|
||||
ESCAPED=$(echo "$CONTEXT" | $PYTHON -c "import sys,json; print(json.dumps(sys.stdin.read(), ensure_ascii=False))" 2>/dev/null || echo "\"\"")
|
||||
|
||||
echo "{\"hookSpecificOutput\":{\"hookEventName\":\"SessionStart\",\"additionalContext\":$ESCAPED}}"
|
||||
exit 0
|
||||
Reference in New Issue
Block a user