@bvdm/delano 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HANDBOOK.md +1511 -0
- package/README.md +122 -0
- package/assets/install-manifest.json +102 -0
- package/assets/payload/.agents/README.md +12 -0
- package/assets/payload/.agents/adapters/claude/README.md +5 -0
- package/assets/payload/.agents/adapters/codex/README.md +5 -0
- package/assets/payload/.agents/adapters/opencode/README.md +5 -0
- package/assets/payload/.agents/adapters/pi/README.md +5 -0
- package/assets/payload/.agents/common/README.md +3 -0
- package/assets/payload/.agents/hooks/README.md +11 -0
- package/assets/payload/.agents/hooks/bash-worktree-fix.sh +7 -0
- package/assets/payload/.agents/hooks/post-tool-logger.js +18 -0
- package/assets/payload/.agents/hooks/session-tracker.js +17 -0
- package/assets/payload/.agents/hooks/user-prompt-logger.js +18 -0
- package/assets/payload/.agents/logs/.gitkeep +0 -0
- package/assets/payload/.agents/logs/schema.md +42 -0
- package/assets/payload/.agents/rules/README.md +12 -0
- package/assets/payload/.agents/rules/agent-coordination.md +5 -0
- package/assets/payload/.agents/rules/datetime.md +5 -0
- package/assets/payload/.agents/rules/frontmatter-operations.md +6 -0
- package/assets/payload/.agents/rules/github-operations.md +5 -0
- package/assets/payload/.agents/rules/path-standards.md +5 -0
- package/assets/payload/.agents/rules/test-execution.md +5 -0
- package/assets/payload/.agents/rules/worktree-operations.md +5 -0
- package/assets/payload/.agents/scripts/README.md +31 -0
- package/assets/payload/.agents/scripts/check-path-standards.sh +26 -0
- package/assets/payload/.agents/scripts/fix-path-standards.sh +14 -0
- package/assets/payload/.agents/scripts/git-sparse-download.sh +162 -0
- package/assets/payload/.agents/scripts/log-event.js +33 -0
- package/assets/payload/.agents/scripts/log-event.sh +5 -0
- package/assets/payload/.agents/scripts/pm/blocked.sh +36 -0
- package/assets/payload/.agents/scripts/pm/epic-list.sh +34 -0
- package/assets/payload/.agents/scripts/pm/in-progress.sh +36 -0
- package/assets/payload/.agents/scripts/pm/init.sh +139 -0
- package/assets/payload/.agents/scripts/pm/next.sh +110 -0
- package/assets/payload/.agents/scripts/pm/prd-list.sh +34 -0
- package/assets/payload/.agents/scripts/pm/search.sh +13 -0
- package/assets/payload/.agents/scripts/pm/standup.sh +19 -0
- package/assets/payload/.agents/scripts/pm/status.sh +61 -0
- package/assets/payload/.agents/scripts/pm/validate.sh +309 -0
- package/assets/payload/.agents/scripts/query-log.sh +57 -0
- package/assets/payload/.agents/scripts/test-and-log.sh +28 -0
- package/assets/payload/.agents/skills/.gitkeep +0 -0
- package/assets/payload/.agents/skills/README.md +23 -0
- package/assets/payload/.agents/skills/breakdown-skill/SKILL.md +40 -0
- package/assets/payload/.agents/skills/breakdown-skill/references/runbook.md +16 -0
- package/assets/payload/.agents/skills/breakdown-skill/templates/ambiguity-report.md +11 -0
- package/assets/payload/.agents/skills/breakdown-skill/templates/task-batch-summary.md +11 -0
- package/assets/payload/.agents/skills/closeout-skill/SKILL.md +42 -0
- package/assets/payload/.agents/skills/closeout-skill/references/runbook.md +16 -0
- package/assets/payload/.agents/skills/closeout-skill/templates/closure-checklist.md +7 -0
- package/assets/payload/.agents/skills/closeout-skill/templates/outcome-review.md +11 -0
- package/assets/payload/.agents/skills/discovery-skill/SKILL.md +44 -0
- package/assets/payload/.agents/skills/discovery-skill/references/runbook.md +14 -0
- package/assets/payload/.agents/skills/discovery-skill/templates/clarification-questions.md +18 -0
- package/assets/payload/.agents/skills/discovery-skill/templates/discovery-summary.md +14 -0
- package/assets/payload/.agents/skills/execution-skill/SKILL.md +42 -0
- package/assets/payload/.agents/skills/execution-skill/references/runbook.md +16 -0
- package/assets/payload/.agents/skills/execution-skill/templates/blocker-update.md +13 -0
- package/assets/payload/.agents/skills/execution-skill/templates/stream-update.md +9 -0
- package/assets/payload/.agents/skills/learning-skill/SKILL.md +41 -0
- package/assets/payload/.agents/skills/learning-skill/references/runbook.md +13 -0
- package/assets/payload/.agents/skills/learning-skill/templates/improvement-backlog.md +10 -0
- package/assets/payload/.agents/skills/learning-skill/templates/retrospective.md +11 -0
- package/assets/payload/.agents/skills/planning-skill/SKILL.md +40 -0
- package/assets/payload/.agents/skills/planning-skill/references/runbook.md +15 -0
- package/assets/payload/.agents/skills/planning-skill/templates/architecture-decision.md +15 -0
- package/assets/payload/.agents/skills/planning-skill/templates/workstream-definition.md +13 -0
- package/assets/payload/.agents/skills/quality-skill/SKILL.md +40 -0
- package/assets/payload/.agents/skills/quality-skill/references/runbook.md +14 -0
- package/assets/payload/.agents/skills/quality-skill/templates/gate-decision.md +10 -0
- package/assets/payload/.agents/skills/quality-skill/templates/quality-evidence.md +16 -0
- package/assets/payload/.agents/skills/sync-skill/SKILL.md +41 -0
- package/assets/payload/.agents/skills/sync-skill/references/runbook.md +17 -0
- package/assets/payload/.agents/skills/sync-skill/templates/conflict-resolution-actions.md +10 -0
- package/assets/payload/.agents/skills/sync-skill/templates/drift-report.md +14 -0
- package/assets/payload/.delano/README.md +7 -0
- package/assets/payload/.gitattributes +14 -0
- package/assets/payload/.project/context/README.md +15 -0
- package/assets/payload/.project/context/gui-testing.md +20 -0
- package/assets/payload/.project/context/product-context.md +17 -0
- package/assets/payload/.project/context/progress.md +23 -0
- package/assets/payload/.project/context/project-brief.md +13 -0
- package/assets/payload/.project/context/project-overview.md +14 -0
- package/assets/payload/.project/context/project-structure.md +24 -0
- package/assets/payload/.project/context/project-style-guide.md +17 -0
- package/assets/payload/.project/context/system-patterns.md +22 -0
- package/assets/payload/.project/context/tech-context.md +19 -0
- package/assets/payload/.project/projects/.gitkeep +0 -0
- package/assets/payload/.project/registry/linear-map.json +6 -0
- package/assets/payload/.project/registry/migration-map.json +5 -0
- package/assets/payload/.project/templates/completion-summary.md +16 -0
- package/assets/payload/.project/templates/plan.md +30 -0
- package/assets/payload/.project/templates/progress-update.md +20 -0
- package/assets/payload/.project/templates/spec.md +42 -0
- package/assets/payload/.project/templates/task.md +33 -0
- package/assets/payload/.project/templates/workstream.md +19 -0
- package/assets/payload/HANDBOOK.md +1511 -0
- package/assets/payload/install-delano.sh +311 -0
- package/bin/delano.js +13 -0
- package/install-delano.sh +311 -0
- package/package.json +26 -0
- package/src/cli/commands/install.js +57 -0
- package/src/cli/commands/wrapper.js +26 -0
- package/src/cli/index.js +97 -0
- package/src/cli/lib/errors.js +11 -0
- package/src/cli/lib/install.js +261 -0
- package/src/cli/lib/pm.js +29 -0
- package/src/cli/lib/runtime.js +122 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
|
|
5
|
+
cd "$root"
|
|
6
|
+
|
|
7
|
+
errors=0
|
|
8
|
+
warnings=0
|
|
9
|
+
|
|
10
|
+
check_required_path() {
|
|
11
|
+
local path="$1"
|
|
12
|
+
if [[ -e "$path" ]]; then
|
|
13
|
+
echo "✅ $path"
|
|
14
|
+
else
|
|
15
|
+
echo "❌ Missing: $path"
|
|
16
|
+
errors=$((errors + 1))
|
|
17
|
+
fi
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
fm_get() {
|
|
21
|
+
local file="$1"
|
|
22
|
+
local key="$2"
|
|
23
|
+
awk -v key="$key" '
|
|
24
|
+
BEGIN {in_fm=0}
|
|
25
|
+
/^---[[:space:]]*$/ {if (in_fm==0) {in_fm=1; next} else {exit}}
|
|
26
|
+
in_fm==1 && $0 ~ "^" key ":[[:space:]]*" {
|
|
27
|
+
sub("^" key ":[[:space:]]*", "")
|
|
28
|
+
print
|
|
29
|
+
exit
|
|
30
|
+
}
|
|
31
|
+
' "$file"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
has_frontmatter() {
|
|
35
|
+
local file="$1"
|
|
36
|
+
[[ "$(awk 'NR==1 && /^---[[:space:]]*$/ {print "yes"}' "$file")" == "yes" ]]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
is_iso_utc() {
|
|
40
|
+
local ts="$1"
|
|
41
|
+
[[ "$ts" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ ]]
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
python_cmd=()
|
|
45
|
+
|
|
46
|
+
resolve_python_cmd() {
|
|
47
|
+
if command -v python3 >/dev/null 2>&1 && python3 -c "import sys" >/dev/null 2>&1; then
|
|
48
|
+
python_cmd=(python3)
|
|
49
|
+
return 0
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
if command -v py >/dev/null 2>&1 && py -3 -c "import sys" >/dev/null 2>&1; then
|
|
53
|
+
python_cmd=(py -3)
|
|
54
|
+
return 0
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
if command -v python >/dev/null 2>&1 && python -c "import sys" >/dev/null 2>&1; then
|
|
58
|
+
python_cmd=(python)
|
|
59
|
+
return 0
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
return 1
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
echo "Delano validation"
|
|
66
|
+
echo "================="
|
|
67
|
+
|
|
68
|
+
check_required_path ".project/projects"
|
|
69
|
+
check_required_path ".project/context"
|
|
70
|
+
check_required_path ".project/registry/linear-map.json"
|
|
71
|
+
check_required_path ".agents/scripts/pm"
|
|
72
|
+
check_required_path ".agents/rules"
|
|
73
|
+
check_required_path ".agents/hooks"
|
|
74
|
+
check_required_path ".agents/logs"
|
|
75
|
+
check_required_path ".agents/skills"
|
|
76
|
+
|
|
77
|
+
if [[ -e ".claude" || -L ".claude" ]]; then
|
|
78
|
+
echo "✅ Compatibility runtime present: .claude"
|
|
79
|
+
else
|
|
80
|
+
echo "⚠️ Compatibility runtime missing: .claude (canonical .agents is sufficient)"
|
|
81
|
+
warnings=$((warnings + 1))
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
if resolve_python_cmd; then
|
|
85
|
+
echo "✅ Python runtime: ${python_cmd[*]}"
|
|
86
|
+
else
|
|
87
|
+
echo "❌ Python runtime not found (tried: python3, py -3, python)"
|
|
88
|
+
errors=$((errors + 1))
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# Required skill contracts
|
|
92
|
+
required_skills=(
|
|
93
|
+
discovery-skill
|
|
94
|
+
planning-skill
|
|
95
|
+
breakdown-skill
|
|
96
|
+
sync-skill
|
|
97
|
+
execution-skill
|
|
98
|
+
quality-skill
|
|
99
|
+
closeout-skill
|
|
100
|
+
learning-skill
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
echo ""
|
|
104
|
+
echo "Required skills"
|
|
105
|
+
echo "---------------"
|
|
106
|
+
for skill in "${required_skills[@]}"; do
|
|
107
|
+
skill_dir=".agents/skills/$skill"
|
|
108
|
+
skill_file="$skill_dir/SKILL.md"
|
|
109
|
+
|
|
110
|
+
if [[ -f "$skill_file" ]]; then
|
|
111
|
+
echo "✅ $skill_file"
|
|
112
|
+
else
|
|
113
|
+
echo "❌ Missing skill contract: $skill_file"
|
|
114
|
+
errors=$((errors + 1))
|
|
115
|
+
continue
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
runbook="$skill_dir/references/runbook.md"
|
|
119
|
+
if [[ -f "$runbook" ]]; then
|
|
120
|
+
echo "✅ $runbook"
|
|
121
|
+
else
|
|
122
|
+
echo "❌ Missing skill runbook: $runbook"
|
|
123
|
+
errors=$((errors + 1))
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
template_count=0
|
|
127
|
+
if [[ -d "$skill_dir/templates" ]]; then
|
|
128
|
+
template_count=$(find "$skill_dir/templates" -maxdepth 1 -type f -name '*.md' | wc -l | tr -d ' ')
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
if [[ "$template_count" -ge 2 ]]; then
|
|
132
|
+
echo "✅ $skill_dir/templates ($template_count files)"
|
|
133
|
+
else
|
|
134
|
+
echo "❌ Skill needs at least 2 templates: $skill_dir/templates"
|
|
135
|
+
errors=$((errors + 1))
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
if grep -q '^## Execution assets' "$skill_file"; then
|
|
139
|
+
echo "✅ $skill_file includes execution assets section"
|
|
140
|
+
else
|
|
141
|
+
echo "❌ $skill_file missing execution assets section"
|
|
142
|
+
errors=$((errors + 1))
|
|
143
|
+
fi
|
|
144
|
+
done
|
|
145
|
+
|
|
146
|
+
# Project contract validation
|
|
147
|
+
for project_dir in .project/projects/*; do
|
|
148
|
+
[[ -d "$project_dir" ]] || continue
|
|
149
|
+
[[ "$(basename "$project_dir")" == ".gitkeep" ]] && continue
|
|
150
|
+
|
|
151
|
+
echo ""
|
|
152
|
+
echo "Project: $(basename "$project_dir")"
|
|
153
|
+
|
|
154
|
+
for path in spec.md plan.md decisions.md tasks workstreams updates; do
|
|
155
|
+
if [[ ! -e "$project_dir/$path" ]]; then
|
|
156
|
+
echo " ❌ Missing $path"
|
|
157
|
+
errors=$((errors + 1))
|
|
158
|
+
fi
|
|
159
|
+
done
|
|
160
|
+
|
|
161
|
+
spec="$project_dir/spec.md"
|
|
162
|
+
if [[ -f "$spec" ]]; then
|
|
163
|
+
if ! has_frontmatter "$spec"; then
|
|
164
|
+
echo " ❌ spec.md missing frontmatter"
|
|
165
|
+
errors=$((errors + 1))
|
|
166
|
+
fi
|
|
167
|
+
for key in name slug owner status created updated outcome uncertainty probe_required probe_status; do
|
|
168
|
+
val="$(fm_get "$spec" "$key")"
|
|
169
|
+
if [[ -z "$val" ]]; then
|
|
170
|
+
echo " ❌ spec.md missing key: $key"
|
|
171
|
+
errors=$((errors + 1))
|
|
172
|
+
fi
|
|
173
|
+
done
|
|
174
|
+
for key in created updated; do
|
|
175
|
+
val="$(fm_get "$spec" "$key")"
|
|
176
|
+
if [[ -n "$val" ]] && ! is_iso_utc "$val"; then
|
|
177
|
+
echo " ❌ spec.md $key must be ISO8601 UTC"
|
|
178
|
+
errors=$((errors + 1))
|
|
179
|
+
fi
|
|
180
|
+
done
|
|
181
|
+
fi
|
|
182
|
+
|
|
183
|
+
plan="$project_dir/plan.md"
|
|
184
|
+
if [[ -f "$plan" ]]; then
|
|
185
|
+
if ! has_frontmatter "$plan"; then
|
|
186
|
+
echo " ❌ plan.md missing frontmatter"
|
|
187
|
+
errors=$((errors + 1))
|
|
188
|
+
fi
|
|
189
|
+
for key in name status lead created updated linear_project_id risk_level spec_status_at_plan_time; do
|
|
190
|
+
val="$(fm_get "$plan" "$key")"
|
|
191
|
+
if [[ -z "$val" && "$key" != "linear_project_id" ]]; then
|
|
192
|
+
echo " ❌ plan.md missing key: $key"
|
|
193
|
+
errors=$((errors + 1))
|
|
194
|
+
fi
|
|
195
|
+
done
|
|
196
|
+
for key in created updated; do
|
|
197
|
+
val="$(fm_get "$plan" "$key")"
|
|
198
|
+
if [[ -n "$val" ]] && ! is_iso_utc "$val"; then
|
|
199
|
+
echo " ❌ plan.md $key must be ISO8601 UTC"
|
|
200
|
+
errors=$((errors + 1))
|
|
201
|
+
fi
|
|
202
|
+
done
|
|
203
|
+
fi
|
|
204
|
+
|
|
205
|
+
for task in "$project_dir"/tasks/*.md; do
|
|
206
|
+
[[ -f "$task" ]] || continue
|
|
207
|
+
if ! has_frontmatter "$task"; then
|
|
208
|
+
echo " ❌ $(basename "$task") missing frontmatter"
|
|
209
|
+
errors=$((errors + 1))
|
|
210
|
+
continue
|
|
211
|
+
fi
|
|
212
|
+
for key in id name status created updated linear_issue_id github_issue github_pr depends_on conflicts_with parallel priority estimate; do
|
|
213
|
+
val="$(fm_get "$task" "$key")"
|
|
214
|
+
if [[ -z "$val" && ! "$key" =~ ^(linear_issue_id|github_issue|github_pr|depends_on|conflicts_with)$ ]]; then
|
|
215
|
+
echo " ❌ $(basename "$task") missing key: $key"
|
|
216
|
+
errors=$((errors + 1))
|
|
217
|
+
fi
|
|
218
|
+
done
|
|
219
|
+
done
|
|
220
|
+
|
|
221
|
+
# dependency cycle check for this project
|
|
222
|
+
if [[ ${#python_cmd[@]} -gt 0 ]]; then
|
|
223
|
+
"${python_cmd[@]}" - "$project_dir" <<'PY' || errors=$((errors + 1))
|
|
224
|
+
import sys, re
|
|
225
|
+
from pathlib import Path
|
|
226
|
+
|
|
227
|
+
project = Path(sys.argv[1])
|
|
228
|
+
tasks = {}
|
|
229
|
+
|
|
230
|
+
def parse_frontmatter(path: Path):
|
|
231
|
+
text = path.read_text(encoding='utf-8')
|
|
232
|
+
m = re.match(r'^---\n(.*?)\n---\n', text, re.S)
|
|
233
|
+
if not m:
|
|
234
|
+
return {}
|
|
235
|
+
data = {}
|
|
236
|
+
for line in m.group(1).splitlines():
|
|
237
|
+
if ':' not in line:
|
|
238
|
+
continue
|
|
239
|
+
k, v = line.split(':', 1)
|
|
240
|
+
data[k.strip()] = v.strip()
|
|
241
|
+
return data
|
|
242
|
+
|
|
243
|
+
for f in sorted((project / 'tasks').glob('*.md')):
|
|
244
|
+
meta = parse_frontmatter(f)
|
|
245
|
+
tid = meta.get('id') or f.stem
|
|
246
|
+
raw = meta.get('depends_on', '[]').strip()
|
|
247
|
+
deps = []
|
|
248
|
+
if raw.startswith('[') and raw.endswith(']'):
|
|
249
|
+
inner = raw[1:-1].strip()
|
|
250
|
+
if inner:
|
|
251
|
+
deps = [x.strip().strip('"\'') for x in inner.split(',') if x.strip()]
|
|
252
|
+
tasks[tid] = deps
|
|
253
|
+
|
|
254
|
+
visited = {}
|
|
255
|
+
|
|
256
|
+
def dfs(node, stack):
|
|
257
|
+
state = visited.get(node, 0)
|
|
258
|
+
if state == 1:
|
|
259
|
+
cycle = ' -> '.join(stack + [node])
|
|
260
|
+
raise RuntimeError(f'dependency cycle: {cycle}')
|
|
261
|
+
if state == 2:
|
|
262
|
+
return
|
|
263
|
+
visited[node] = 1
|
|
264
|
+
for dep in tasks.get(node, []):
|
|
265
|
+
if dep in tasks:
|
|
266
|
+
dfs(dep, stack + [node])
|
|
267
|
+
visited[node] = 2
|
|
268
|
+
|
|
269
|
+
for t in tasks:
|
|
270
|
+
dfs(t, [])
|
|
271
|
+
print(' [ok] dependency graph acyclic')
|
|
272
|
+
PY
|
|
273
|
+
fi
|
|
274
|
+
|
|
275
|
+
done
|
|
276
|
+
|
|
277
|
+
# Absolute path leakage check (documentation and contract files only)
|
|
278
|
+
path_tmp="$(mktemp)"
|
|
279
|
+
trap 'rm -f "$path_tmp"' EXIT
|
|
280
|
+
|
|
281
|
+
compat_paths=()
|
|
282
|
+
if [[ -e .claude || -L .claude ]]; then
|
|
283
|
+
compat_paths+=(.claude)
|
|
284
|
+
fi
|
|
285
|
+
|
|
286
|
+
if find .project .agents "${compat_paths[@]}" \
|
|
287
|
+
-type f \
|
|
288
|
+
\( -name '*.md' -o -name '*.json' -o -name '*.yaml' -o -name '*.yml' \) \
|
|
289
|
+
-not -path '.agents/logs/*' \
|
|
290
|
+
-not -path '.claude/logs/*' \
|
|
291
|
+
-print0 | xargs -0 grep -nE '(/home/|/Users/|[A-Za-z]:\\)' >"$path_tmp" 2>/dev/null; then
|
|
292
|
+
echo ""
|
|
293
|
+
echo "❌ Absolute path leakage found"
|
|
294
|
+
head -n 20 "$path_tmp"
|
|
295
|
+
errors=$((errors + 1))
|
|
296
|
+
else
|
|
297
|
+
echo ""
|
|
298
|
+
echo "✅ No absolute path leakage in tracked docs and contracts"
|
|
299
|
+
fi
|
|
300
|
+
|
|
301
|
+
echo ""
|
|
302
|
+
echo "Summary"
|
|
303
|
+
echo "-------"
|
|
304
|
+
echo "Errors: $errors"
|
|
305
|
+
echo "Warnings: $warnings"
|
|
306
|
+
|
|
307
|
+
if [[ $errors -gt 0 ]]; then
|
|
308
|
+
exit 1
|
|
309
|
+
fi
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
|
|
5
|
+
cd "$root"
|
|
6
|
+
|
|
7
|
+
type_filter=""
|
|
8
|
+
actor_filter=""
|
|
9
|
+
since_filter=""
|
|
10
|
+
last_n=""
|
|
11
|
+
pretty=false
|
|
12
|
+
|
|
13
|
+
while [[ $# -gt 0 ]]; do
|
|
14
|
+
case "$1" in
|
|
15
|
+
--type) type_filter="$2"; shift 2 ;;
|
|
16
|
+
--actor) actor_filter="$2"; shift 2 ;;
|
|
17
|
+
--since) since_filter="$2"; shift 2 ;;
|
|
18
|
+
--last) last_n="$2"; shift 2 ;;
|
|
19
|
+
--pretty) pretty=true; shift ;;
|
|
20
|
+
*) echo "Unknown arg: $1"; exit 1 ;;
|
|
21
|
+
esac
|
|
22
|
+
done
|
|
23
|
+
|
|
24
|
+
LOG_FILE=".agents/logs/changes.jsonl"
|
|
25
|
+
[[ -f "$LOG_FILE" ]] || { echo "No log file: $LOG_FILE"; exit 0; }
|
|
26
|
+
|
|
27
|
+
node - "$LOG_FILE" "$type_filter" "$actor_filter" "$since_filter" "$last_n" "$pretty" <<'NODE'
|
|
28
|
+
const fs = require('fs');
|
|
29
|
+
|
|
30
|
+
const [logFile, typeFilter, actorFilter, sinceFilter, lastNRaw, prettyRaw] = process.argv.slice(2);
|
|
31
|
+
const pretty = prettyRaw === 'true';
|
|
32
|
+
const lines = fs.readFileSync(logFile, 'utf8').split('\n').filter(Boolean);
|
|
33
|
+
const parsed = [];
|
|
34
|
+
for (const line of lines) {
|
|
35
|
+
try { parsed.push(JSON.parse(line)); } catch {}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let out = parsed.filter(e => {
|
|
39
|
+
if (typeFilter && e.type !== typeFilter) return false;
|
|
40
|
+
if (actorFilter && e.actor !== actorFilter) return false;
|
|
41
|
+
if (sinceFilter && (e.timestamp || '') < sinceFilter) return false;
|
|
42
|
+
return true;
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const lastN = Number(lastNRaw || 0);
|
|
46
|
+
if (Number.isFinite(lastN) && lastN > 0) {
|
|
47
|
+
out = out.slice(-lastN);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
for (const row of out) {
|
|
51
|
+
if (pretty) {
|
|
52
|
+
console.log(JSON.stringify(row, null, 2));
|
|
53
|
+
} else {
|
|
54
|
+
console.log(JSON.stringify(row));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
NODE
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
if [[ $# -eq 0 ]]; then
|
|
5
|
+
echo "Usage: $0 <test-command...>"
|
|
6
|
+
exit 1
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
|
|
10
|
+
cd "$root"
|
|
11
|
+
|
|
12
|
+
mkdir -p .agents/logs/tests
|
|
13
|
+
run_id="$(date -u +"%Y%m%dT%H%M%SZ")"
|
|
14
|
+
log_file=".agents/logs/tests/$run_id.log"
|
|
15
|
+
|
|
16
|
+
set +e
|
|
17
|
+
"$@" 2>&1 | tee "$log_file"
|
|
18
|
+
exit_code=${PIPESTATUS[0]}
|
|
19
|
+
set -e
|
|
20
|
+
|
|
21
|
+
timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
|
22
|
+
printf '{"timestamp":"%s","command":"%s","exit_code":%s,"log_file":"%s"}\n' \
|
|
23
|
+
"$timestamp" "$*" "$exit_code" "$log_file" >> .agents/logs/test-runs.jsonl
|
|
24
|
+
|
|
25
|
+
.agents/scripts/log-event.sh test_run system --command "$*" --exit "$exit_code" --log "$log_file" >/dev/null || true
|
|
26
|
+
|
|
27
|
+
echo "Saved test log: $log_file"
|
|
28
|
+
exit $exit_code
|
|
File without changes
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Delano Skills
|
|
2
|
+
|
|
3
|
+
Handbook-aligned skill contracts.
|
|
4
|
+
|
|
5
|
+
Core workflow skills:
|
|
6
|
+
|
|
7
|
+
- `discovery-skill`
|
|
8
|
+
- `planning-skill`
|
|
9
|
+
- `breakdown-skill`
|
|
10
|
+
- `sync-skill`
|
|
11
|
+
- `execution-skill`
|
|
12
|
+
- `quality-skill`
|
|
13
|
+
- `closeout-skill`
|
|
14
|
+
- `learning-skill`
|
|
15
|
+
|
|
16
|
+
Each skill defines:
|
|
17
|
+
- intent and trigger context
|
|
18
|
+
- required inputs
|
|
19
|
+
- output schema
|
|
20
|
+
- quality checks
|
|
21
|
+
- failure behavior
|
|
22
|
+
- allowed side effects
|
|
23
|
+
- script hooks
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: breakdown-skill
|
|
3
|
+
description: Decompose an approved plan into atomic tasks with dependencies and acceptance criteria. Use when planning is complete and execution must be prepared.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# breakdown-skill
|
|
7
|
+
|
|
8
|
+
## Trigger context
|
|
9
|
+
- plan is complete and ready for decomposition
|
|
10
|
+
|
|
11
|
+
## Required inputs
|
|
12
|
+
- spec_path
|
|
13
|
+
- plan_path
|
|
14
|
+
- workstream_files
|
|
15
|
+
|
|
16
|
+
## Output schema
|
|
17
|
+
- task_files
|
|
18
|
+
- dependency_graph
|
|
19
|
+
|
|
20
|
+
## Quality checks
|
|
21
|
+
- acceptance criteria are binary
|
|
22
|
+
- estimate present per task
|
|
23
|
+
- dependency graph acyclic
|
|
24
|
+
|
|
25
|
+
## Failure behavior
|
|
26
|
+
- stop on circular dependency
|
|
27
|
+
- return ambiguity report
|
|
28
|
+
|
|
29
|
+
## Allowed side effects
|
|
30
|
+
- create/update `.project/projects/<slug>/tasks/*.md`
|
|
31
|
+
|
|
32
|
+
## Script hooks
|
|
33
|
+
- `bash .agents/scripts/pm/validate.sh`
|
|
34
|
+
- `bash .agents/scripts/pm/next.sh`
|
|
35
|
+
- `bash .agents/scripts/pm/blocked.sh`
|
|
36
|
+
|
|
37
|
+
## Execution assets
|
|
38
|
+
- `references/runbook.md`
|
|
39
|
+
- `templates/task-batch-summary.md`
|
|
40
|
+
- `templates/ambiguity-report.md`
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Breakdown Runbook
|
|
2
|
+
|
|
3
|
+
1. Read `plan.md` and `workstreams/*.md`.
|
|
4
|
+
2. Generate atomic tasks from `.project/templates/task.md`.
|
|
5
|
+
3. Add binary acceptance criteria per task.
|
|
6
|
+
4. Add dependencies and estimate/priority fields.
|
|
7
|
+
5. Run sequencing checks:
|
|
8
|
+
- `bash .agents/scripts/pm/next.sh --all`
|
|
9
|
+
- `bash .agents/scripts/pm/blocked.sh`
|
|
10
|
+
6. Validate:
|
|
11
|
+
- `bash .agents/scripts/pm/validate.sh`
|
|
12
|
+
|
|
13
|
+
Exit gate:
|
|
14
|
+
- Tasks are atomic
|
|
15
|
+
- Dependencies are acyclic
|
|
16
|
+
- Ready tasks are execution-safe
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: closeout-skill
|
|
3
|
+
description: Close the delivery loop and capture completion evidence, status updates, and handoff artifacts. Use after quality gates pass.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# closeout-skill
|
|
7
|
+
|
|
8
|
+
## Trigger context
|
|
9
|
+
- quality gates passed for closure scope
|
|
10
|
+
|
|
11
|
+
## Required inputs
|
|
12
|
+
- project_slug
|
|
13
|
+
- completed_task_ids
|
|
14
|
+
- outcome_review
|
|
15
|
+
|
|
16
|
+
## Output schema
|
|
17
|
+
- closure update
|
|
18
|
+
- completion summary
|
|
19
|
+
- updated status in contracts/registry
|
|
20
|
+
|
|
21
|
+
## Quality checks
|
|
22
|
+
- required tasks resolved
|
|
23
|
+
- evidence package complete
|
|
24
|
+
- outcome review captured
|
|
25
|
+
|
|
26
|
+
## Failure behavior
|
|
27
|
+
- block closure when evidence is incomplete
|
|
28
|
+
- return missing-evidence list
|
|
29
|
+
|
|
30
|
+
## Allowed side effects
|
|
31
|
+
- update project/task statuses
|
|
32
|
+
- append completion summary and release evidence
|
|
33
|
+
|
|
34
|
+
## Script hooks
|
|
35
|
+
- `bash .agents/scripts/pm/status.sh`
|
|
36
|
+
- `bash .agents/scripts/query-log.sh --last 50`
|
|
37
|
+
- `bash .agents/scripts/pm/validate.sh`
|
|
38
|
+
|
|
39
|
+
## Execution assets
|
|
40
|
+
- `references/runbook.md`
|
|
41
|
+
- `templates/outcome-review.md`
|
|
42
|
+
- `templates/closure-checklist.md`
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Closeout Runbook
|
|
2
|
+
|
|
3
|
+
1. Confirm all required tasks are in terminal state.
|
|
4
|
+
2. Ensure quality evidence package is complete.
|
|
5
|
+
3. Write completion summary from template.
|
|
6
|
+
4. Update project status and mapping registry.
|
|
7
|
+
5. Review event log:
|
|
8
|
+
- `bash .agents/scripts/query-log.sh --last 100`
|
|
9
|
+
6. Validate:
|
|
10
|
+
- `bash .agents/scripts/pm/status.sh`
|
|
11
|
+
- `bash .agents/scripts/pm/validate.sh`
|
|
12
|
+
|
|
13
|
+
Exit gate:
|
|
14
|
+
- Outcome review captured
|
|
15
|
+
- Evidence complete
|
|
16
|
+
- Delivery state closed cleanly
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: discovery-skill
|
|
3
|
+
description: Define and approve a measurable outcome and Spec. Use when a new delivery request has unclear scope, missing outcome, or missing owner.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# discovery-skill
|
|
7
|
+
|
|
8
|
+
## Trigger context
|
|
9
|
+
- New delivery request with undefined scope
|
|
10
|
+
- Existing scope lacks clear outcome or owner
|
|
11
|
+
|
|
12
|
+
## Required inputs
|
|
13
|
+
- project_slug
|
|
14
|
+
- project_name
|
|
15
|
+
- owner
|
|
16
|
+
- outcome_hypothesis
|
|
17
|
+
- constraints
|
|
18
|
+
|
|
19
|
+
## Output schema
|
|
20
|
+
- `.project/projects/<slug>/spec.md`
|
|
21
|
+
- clarified outcome statement
|
|
22
|
+
- open questions list
|
|
23
|
+
|
|
24
|
+
## Quality checks
|
|
25
|
+
- measurable success criteria present
|
|
26
|
+
- explicit non-goals present
|
|
27
|
+
- dependency assumptions documented
|
|
28
|
+
|
|
29
|
+
## Failure behavior
|
|
30
|
+
- stop if objective is ambiguous
|
|
31
|
+
- return a clarification question set
|
|
32
|
+
|
|
33
|
+
## Allowed side effects
|
|
34
|
+
- create project scaffold through init script
|
|
35
|
+
- update `spec.md`
|
|
36
|
+
|
|
37
|
+
## Script hooks
|
|
38
|
+
- `bash .agents/scripts/pm/init.sh <slug> "<Project Name>" <owner> <lead>`
|
|
39
|
+
- `bash .agents/scripts/pm/validate.sh`
|
|
40
|
+
|
|
41
|
+
## Execution assets
|
|
42
|
+
- `references/runbook.md`
|
|
43
|
+
- `templates/clarification-questions.md`
|
|
44
|
+
- `templates/discovery-summary.md`
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Discovery Runbook
|
|
2
|
+
|
|
3
|
+
1. Confirm project slug, owner, and measurable outcome.
|
|
4
|
+
2. If project scaffold is missing, run:
|
|
5
|
+
- `bash .agents/scripts/pm/init.sh <slug> "<Project Name>" <owner> <lead>`
|
|
6
|
+
3. Fill `spec.md` using `.project/templates/spec.md`.
|
|
7
|
+
4. Ensure non-goals and dependencies are explicit.
|
|
8
|
+
5. Validate:
|
|
9
|
+
- `bash .agents/scripts/pm/validate.sh`
|
|
10
|
+
|
|
11
|
+
Exit gate:
|
|
12
|
+
- Spec outcome is measurable
|
|
13
|
+
- Non-goals are explicit
|
|
14
|
+
- Assumptions are documented
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Discovery Clarification Questions
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
- What exact pain are we solving?
|
|
5
|
+
- Who is blocked today and how often?
|
|
6
|
+
|
|
7
|
+
## Outcome
|
|
8
|
+
- What measurable result defines success?
|
|
9
|
+
- What is the target date?
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
- What is explicitly out of scope?
|
|
13
|
+
- What is the smallest viable first delivery?
|
|
14
|
+
|
|
15
|
+
## Constraints
|
|
16
|
+
- Technical constraints?
|
|
17
|
+
- Compliance/security constraints?
|
|
18
|
+
- Team/resource constraints?
|