@cleocode/core 2026.3.45 → 2026.3.47
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/dist/bootstrap.d.ts.map +1 -1
- package/dist/index.js +1508 -377
- package/dist/index.js.map +4 -4
- package/dist/init.d.ts.map +1 -1
- package/dist/injection.d.ts +1 -1
- package/dist/injection.d.ts.map +1 -1
- package/dist/routing/capability-matrix.d.ts +6 -4
- package/dist/routing/capability-matrix.d.ts.map +1 -1
- package/dist/scaffold.d.ts +35 -9
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/skills/agents/install.d.ts.map +1 -1
- package/dist/skills/routing-table.d.ts +17 -16
- package/dist/skills/routing-table.d.ts.map +1 -1
- package/dist/skills/skill-paths.d.ts.map +1 -1
- package/dist/system/health.d.ts.map +1 -1
- package/dist/ui/index.d.ts +0 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/package.json +9 -4
- package/schemas/adr-frontmatter.schema.json +72 -0
- package/schemas/agent-configs.schema.json +120 -0
- package/schemas/agent-registry.json +243 -0
- package/schemas/agent-registry.schema.json +132 -0
- package/schemas/archive/research-manifest.schema.json +257 -0
- package/schemas/archive.schema.json +450 -0
- package/schemas/brain-decision.schema.json +69 -0
- package/schemas/brain-learning.schema.json +57 -0
- package/schemas/brain-pattern.schema.json +72 -0
- package/schemas/config.schema.json +2606 -0
- package/schemas/context-state.schema.json +137 -0
- package/schemas/contribution.schema.json +722 -0
- package/schemas/critical-path.schema.json +246 -0
- package/schemas/deps-cache.schema.json +97 -0
- package/schemas/doctor-output.schema.json +283 -0
- package/schemas/error.schema.json +161 -0
- package/schemas/export-package.schema.json +375 -0
- package/schemas/global-config.schema.json +219 -0
- package/schemas/grade.schema.json +49 -0
- package/schemas/log.schema.json +250 -0
- package/schemas/metrics.schema.json +328 -0
- package/schemas/migrations.schema.json +150 -0
- package/schemas/nexus-registry.schema.json +90 -0
- package/schemas/operation-constitution.schema.json +438 -0
- package/schemas/output.schema.json +164 -0
- package/schemas/project-context.schema.json +164 -0
- package/schemas/project-info.schema.json +180 -0
- package/schemas/projects-registry.schema.json +107 -0
- package/schemas/protocol-frontmatter.schema.json +72 -0
- package/schemas/rcasd-consensus-report.schema.json +10 -0
- package/schemas/rcasd-evidence.schema.json +42 -0
- package/schemas/rcasd-gate-result.schema.json +46 -0
- package/schemas/rcasd-hitl-resolution.schema.json +10 -0
- package/schemas/rcasd-index.schema.json +10 -0
- package/schemas/rcasd-manifest.schema.json +10 -0
- package/schemas/rcasd-research-output.schema.json +10 -0
- package/schemas/rcasd-spec-frontmatter.schema.json +10 -0
- package/schemas/rcasd-stage-transition.schema.json +38 -0
- package/schemas/releases.schema.json +267 -0
- package/schemas/skills-manifest.schema.json +91 -0
- package/schemas/skillsmp.schema.json +208 -0
- package/schemas/spec-index.schema.json +196 -0
- package/schemas/system-flow-atlas.schema.json +125 -0
- package/src/__tests__/injection-chain.test.d.ts +4 -3
- package/src/__tests__/injection-chain.test.d.ts.map +1 -1
- package/src/__tests__/injection-chain.test.js +11 -10
- package/src/__tests__/injection-chain.test.js.map +1 -1
- package/src/__tests__/injection-chain.test.ts +11 -10
- package/src/__tests__/injection-mvi-tiers.test.js +4 -2
- package/src/__tests__/injection-mvi-tiers.test.js.map +1 -1
- package/src/__tests__/injection-mvi-tiers.test.ts +4 -2
- package/src/agents/__tests__/capacity.test.d.ts +7 -0
- package/src/agents/__tests__/capacity.test.d.ts.map +1 -0
- package/src/agents/__tests__/capacity.test.js +173 -0
- package/src/agents/__tests__/capacity.test.js.map +1 -0
- package/src/agents/__tests__/registry.test.d.ts +8 -0
- package/src/agents/__tests__/registry.test.d.ts.map +1 -0
- package/src/agents/__tests__/registry.test.js +348 -0
- package/src/agents/__tests__/registry.test.js.map +1 -0
- package/src/agents/__tests__/retry.test.d.ts +7 -0
- package/src/agents/__tests__/retry.test.d.ts.map +1 -0
- package/src/agents/__tests__/retry.test.js +225 -0
- package/src/agents/__tests__/retry.test.js.map +1 -0
- package/src/bootstrap.ts +37 -6
- package/src/init.ts +63 -18
- package/src/injection.ts +11 -5
- package/src/intelligence/__tests__/impact.test.d.ts +15 -0
- package/src/intelligence/__tests__/impact.test.d.ts.map +1 -0
- package/src/intelligence/__tests__/impact.test.js +384 -0
- package/src/intelligence/__tests__/impact.test.js.map +1 -0
- package/src/intelligence/__tests__/patterns.test.d.ts +8 -0
- package/src/intelligence/__tests__/patterns.test.d.ts.map +1 -0
- package/src/intelligence/__tests__/patterns.test.js +370 -0
- package/src/intelligence/__tests__/patterns.test.js.map +1 -0
- package/src/intelligence/__tests__/prediction.test.d.ts +8 -0
- package/src/intelligence/__tests__/prediction.test.d.ts.map +1 -0
- package/src/intelligence/__tests__/prediction.test.js +314 -0
- package/src/intelligence/__tests__/prediction.test.js.map +1 -0
- package/src/nexus/__tests__/nexus-e2e.test.d.ts +12 -0
- package/src/nexus/__tests__/nexus-e2e.test.d.ts.map +1 -0
- package/src/nexus/__tests__/nexus-e2e.test.js +1220 -0
- package/src/nexus/__tests__/nexus-e2e.test.js.map +1 -0
- package/src/nexus/__tests__/transfer.test.d.ts +8 -0
- package/src/nexus/__tests__/transfer.test.d.ts.map +1 -0
- package/src/nexus/__tests__/transfer.test.js +372 -0
- package/src/nexus/__tests__/transfer.test.js.map +1 -0
- package/src/nexus/__tests__/transfer.test.ts +1 -1
- package/src/routing/capability-matrix.ts +1435 -205
- package/src/scaffold.ts +70 -13
- package/src/sessions/__tests__/briefing.test.js +28 -2
- package/src/sessions/__tests__/briefing.test.js.map +1 -1
- package/src/skills/__tests__/routing-table.test.js +48 -31
- package/src/skills/__tests__/routing-table.test.js.map +1 -1
- package/src/skills/__tests__/routing-table.test.ts +53 -33
- package/src/skills/agents/install.ts +9 -1
- package/src/skills/orchestrator/__tests__/spawn-tier.test.js +41 -32
- package/src/skills/orchestrator/__tests__/spawn-tier.test.js.map +1 -1
- package/src/skills/routing-table.ts +39 -253
- package/src/skills/skill-paths.ts +3 -2
- package/src/store/__tests__/project-detect.test.js +1 -1
- package/src/store/__tests__/project-detect.test.js.map +1 -1
- package/src/store/__tests__/project-detect.test.ts +1 -1
- package/src/store/__tests__/test-db-helper.d.ts.map +1 -1
- package/src/store/__tests__/test-db-helper.js +0 -1
- package/src/store/__tests__/test-db-helper.js.map +1 -1
- package/src/system/health.ts +18 -7
- package/src/ui/index.ts +0 -6
- package/src/validation/operation-gate-validators.ts +2 -2
- package/templates/CLEO-INJECTION.md +120 -0
- package/templates/README.md +29 -0
- package/templates/agent-registry.json +305 -0
- package/templates/cleo-gitignore +74 -0
- package/templates/config.template.json +187 -0
- package/templates/git-hooks/commit-msg +149 -0
- package/templates/git-hooks/pre-commit +40 -0
- package/templates/git-hooks/pre-push +79 -0
- package/templates/github/ISSUE_TEMPLATE/bug_report.yml +143 -0
- package/templates/github/ISSUE_TEMPLATE/config.yml +8 -0
- package/templates/github/ISSUE_TEMPLATE/feature_request.yml +125 -0
- package/templates/github/ISSUE_TEMPLATE/help_question.yml +99 -0
- package/templates/global-config.template.json +56 -0
- package/templates/hooks/precompact-safestop.sh +89 -0
- package/templates/issue-templates/bug_report.yml +143 -0
- package/templates/issue-templates/config.yml +8 -0
- package/templates/issue-templates/feature_request.yml +125 -0
- package/templates/issue-templates/help_question.yml +99 -0
- package/templates/skillsmp.json.example +28 -0
- package/templates/skillsmp.json.example.md +214 -0
- package/dist/ui/injection-legacy.d.ts +0 -26
- package/dist/ui/injection-legacy.d.ts.map +0 -1
- package/src/ui/__tests__/injection-registry.test.d.ts +0 -11
- package/src/ui/__tests__/injection-registry.test.d.ts.map +0 -1
- package/src/ui/__tests__/injection-registry.test.js +0 -46
- package/src/ui/__tests__/injection-registry.test.js.map +0 -1
- package/src/ui/__tests__/injection-registry.test.ts +0 -57
- package/src/ui/injection-legacy.ts +0 -44
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# commit-msg - CLEO task ID enforcement hook
|
|
3
|
+
#
|
|
4
|
+
# Validates commit messages contain T#### task references.
|
|
5
|
+
# Checks task existence directly against .cleo/tasks.db (SQLite, canonical per ADR-006).
|
|
6
|
+
#
|
|
7
|
+
# Supports conventional commit scopes feat(T####): and suffix (T####) patterns.
|
|
8
|
+
#
|
|
9
|
+
# Installation: Automatically installed via `cleo init`
|
|
10
|
+
# Manual: cp templates/git-hooks/commit-msg .git/hooks/commit-msg && chmod +x .git/hooks/commit-msg
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
MSG_FILE="$1"
|
|
15
|
+
COMMIT_MSG=$(cat "$MSG_FILE")
|
|
16
|
+
|
|
17
|
+
# ============================================================================
|
|
18
|
+
# BYPASS DETECTION
|
|
19
|
+
# ============================================================================
|
|
20
|
+
|
|
21
|
+
# Auto-bypass for automated commits (merges, reverts, CI/CD)
|
|
22
|
+
if echo "$COMMIT_MSG" | grep -qE '^Merge (branch|pull request)'; then
|
|
23
|
+
exit 0
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
if echo "$COMMIT_MSG" | grep -qE '^Revert '; then
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
if [[ -n "${CI:-}" || -n "${GITHUB_ACTIONS:-}" || -n "${GITLAB_CI:-}" ]]; then
|
|
31
|
+
exit 0
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
# Auto-bypass for chore(cleo) checkpoints
|
|
35
|
+
if echo "$COMMIT_MSG" | grep -qE '^chore\(cleo\)'; then
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Auto-bypass for release pipeline commits
|
|
40
|
+
if echo "$COMMIT_MSG" | grep -qE '^release:|^chore\(release\):'; then
|
|
41
|
+
exit 0
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# ============================================================================
|
|
45
|
+
# TASK ID EXTRACTION
|
|
46
|
+
# Supports:
|
|
47
|
+
# 1. Conventional commit scope: feat(T4541): description
|
|
48
|
+
# 2. Parenthesized suffix: description (T4541)
|
|
49
|
+
# 3. Bare reference: T4541 anywhere in message
|
|
50
|
+
# ============================================================================
|
|
51
|
+
|
|
52
|
+
TASK_ID=""
|
|
53
|
+
|
|
54
|
+
# Pattern 1: Conventional commit scope - type(T####):
|
|
55
|
+
if [[ -z "$TASK_ID" ]]; then
|
|
56
|
+
TASK_ID=$(echo "$COMMIT_MSG" | grep -oE '^[a-z]+\(T[0-9]+\)' | head -1 | grep -oE 'T[0-9]+' || true)
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# Pattern 2: Parenthesized suffix - (T####) anywhere in message
|
|
60
|
+
if [[ -z "$TASK_ID" ]]; then
|
|
61
|
+
TASK_ID=$(echo "$COMMIT_MSG" | grep -oE '\(T[0-9]+\)' | head -1 | grep -oE 'T[0-9]+' || true)
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
# Pattern 3: Bare T#### reference anywhere in message (fallback)
|
|
65
|
+
if [[ -z "$TASK_ID" ]]; then
|
|
66
|
+
TASK_ID=$(echo "$COMMIT_MSG" | grep -oE '\bT[0-9]{3,}\b' | head -1 || true)
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
# ============================================================================
|
|
70
|
+
# VALIDATION
|
|
71
|
+
# ============================================================================
|
|
72
|
+
|
|
73
|
+
if [[ -z "$TASK_ID" ]]; then
|
|
74
|
+
echo "ERROR: No task ID in commit message"
|
|
75
|
+
echo ""
|
|
76
|
+
echo "Convention: Include T#### in commit message"
|
|
77
|
+
echo "Examples:"
|
|
78
|
+
echo " feat(T2692): Add protocol checks"
|
|
79
|
+
echo " fix(T1234): Resolve validation bug"
|
|
80
|
+
echo " chore: Update deps (T5678)"
|
|
81
|
+
echo ""
|
|
82
|
+
echo "Bypass with: git commit --no-verify"
|
|
83
|
+
exit 1
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# ============================================================================
|
|
87
|
+
# TASK EXISTENCE CHECK
|
|
88
|
+
# Queries .cleo/tasks.db directly (SQLite, canonical storage per ADR-006).
|
|
89
|
+
# Uses node:sqlite (Node 22+) as primary, sqlite3 CLI as fallback.
|
|
90
|
+
# ============================================================================
|
|
91
|
+
|
|
92
|
+
TASKS_DB=".cleo/tasks.db"
|
|
93
|
+
|
|
94
|
+
if [[ ! -f "$TASKS_DB" ]]; then
|
|
95
|
+
echo "WARNING: $TASKS_DB not found, skipping task existence check"
|
|
96
|
+
echo "✓ Commit linked to $TASK_ID (unverified)"
|
|
97
|
+
exit 0
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
validate_task() {
|
|
101
|
+
local task_id="$1"
|
|
102
|
+
|
|
103
|
+
# Primary: node:sqlite (available in Node 22+, same engine as CLEO core)
|
|
104
|
+
if command -v node &>/dev/null; then
|
|
105
|
+
local result
|
|
106
|
+
result=$(node -e "
|
|
107
|
+
try {
|
|
108
|
+
const { DatabaseSync } = require('node:sqlite');
|
|
109
|
+
const db = new DatabaseSync('$TASKS_DB', { open: true, readOnly: true });
|
|
110
|
+
const row = db.prepare('SELECT id FROM tasks WHERE id = ?').get('$task_id');
|
|
111
|
+
console.log(row ? 'found' : 'not_found');
|
|
112
|
+
db.close();
|
|
113
|
+
} catch { console.log('error'); }
|
|
114
|
+
" 2>/dev/null) || true
|
|
115
|
+
if [[ "$result" == "found" ]]; then
|
|
116
|
+
return 0
|
|
117
|
+
fi
|
|
118
|
+
if [[ "$result" == "not_found" ]]; then
|
|
119
|
+
return 1
|
|
120
|
+
fi
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Fallback: sqlite3 CLI
|
|
124
|
+
if command -v sqlite3 &>/dev/null; then
|
|
125
|
+
local count
|
|
126
|
+
count=$(sqlite3 "$TASKS_DB" "SELECT COUNT(*) FROM tasks WHERE id = '$task_id';" 2>/dev/null) || true
|
|
127
|
+
if [[ "$count" -gt 0 ]] 2>/dev/null; then
|
|
128
|
+
return 0
|
|
129
|
+
fi
|
|
130
|
+
if [[ "$count" == "0" ]]; then
|
|
131
|
+
return 1
|
|
132
|
+
fi
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# No SQLite reader available — warn but allow
|
|
136
|
+
echo "WARNING: Cannot read $TASKS_DB (need node 22+ or sqlite3 CLI)"
|
|
137
|
+
return 0
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if ! validate_task "$TASK_ID"; then
|
|
141
|
+
echo "ERROR: Task $TASK_ID not found in CLEO database"
|
|
142
|
+
echo ""
|
|
143
|
+
echo "Use: cleo find <query> to discover valid task IDs"
|
|
144
|
+
echo "Or bypass with: git commit --no-verify"
|
|
145
|
+
exit 1
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
echo "✓ Commit linked to $TASK_ID"
|
|
149
|
+
exit 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Pre-commit guardrails:
|
|
3
|
+
# 1. Reject SQLite WAL/SHM files (data corruption risk).
|
|
4
|
+
# 2. Block commits when core CLEO files are gitignored (data integrity).
|
|
5
|
+
#
|
|
6
|
+
# Installation: Automatically installed via `cleo init`
|
|
7
|
+
|
|
8
|
+
set -e
|
|
9
|
+
|
|
10
|
+
# ── 1. WAL/SHM/journal files ──────────────────────────────────────────
|
|
11
|
+
BAD_FILES=$(git diff --cached --name-only | grep -E '\.(db-wal|db-shm|db-journal)$' || true)
|
|
12
|
+
|
|
13
|
+
if [ -n "$BAD_FILES" ]; then
|
|
14
|
+
echo "ERROR: Refusing to commit SQLite WAL/SHM/journal files:"
|
|
15
|
+
echo "$BAD_FILES"
|
|
16
|
+
echo ""
|
|
17
|
+
echo "These are runtime files that must never be tracked in git."
|
|
18
|
+
echo "To fix: git rm --cached <file>"
|
|
19
|
+
exit 1
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
# ── 2. Core file gitignore protection ─────────────────────────────────
|
|
23
|
+
PROTECTED_FILES=".cleo/config.json .cleo/.gitignore .cleo/project-info.json .cleo/project-context.json"
|
|
24
|
+
IGNORED_CORE=""
|
|
25
|
+
|
|
26
|
+
for f in $PROTECTED_FILES; do
|
|
27
|
+
if [ -f "$f" ] && git check-ignore -q "$f" 2>/dev/null; then
|
|
28
|
+
IGNORED_CORE="$IGNORED_CORE $f"
|
|
29
|
+
fi
|
|
30
|
+
done
|
|
31
|
+
|
|
32
|
+
if [ -n "$IGNORED_CORE" ]; then
|
|
33
|
+
echo "ERROR: Critical CLEO files are being ignored by .gitignore:"
|
|
34
|
+
echo "$IGNORED_CORE"
|
|
35
|
+
echo ""
|
|
36
|
+
echo "These files MUST be tracked by git for CLEO data integrity."
|
|
37
|
+
echo "Check .gitignore and .cleo/.gitignore for rules ignoring these files."
|
|
38
|
+
echo "To fix: remove the ignore rule, then: git add <file>"
|
|
39
|
+
exit 1
|
|
40
|
+
fi
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# pre-push - CalVer guard for release tags
|
|
3
|
+
#
|
|
4
|
+
# Blocks pushing tags that do not follow project CalVer policy:
|
|
5
|
+
# - Stable: vYYYY.M.PATCH (current UTC month only)
|
|
6
|
+
# - Pre-release vYYYY.M.PATCH-suffix (current or next UTC month)
|
|
7
|
+
#
|
|
8
|
+
# Non-tag pushes are always allowed.
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
current_year=$(date -u +%Y)
|
|
13
|
+
current_month=$(date -u +%-m)
|
|
14
|
+
next_month=$(( current_month == 12 ? 1 : current_month + 1 ))
|
|
15
|
+
next_year=$(( current_month == 12 ? current_year + 1 : current_year ))
|
|
16
|
+
|
|
17
|
+
is_valid_version_shape() {
|
|
18
|
+
local version="$1"
|
|
19
|
+
[[ "$version" =~ ^[0-9]{4}\.[0-9]{1,2}\.[0-9]+(-[A-Za-z0-9.]+)?$ ]]
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
validate_calver() {
|
|
23
|
+
local version="$1"
|
|
24
|
+
|
|
25
|
+
if ! is_valid_version_shape "$version"; then
|
|
26
|
+
echo "ERROR: Invalid CalVer format '$version'"
|
|
27
|
+
echo "Expected: YYYY.M.PATCH or YYYY.M.PATCH-suffix"
|
|
28
|
+
return 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
local base="${version%%-*}"
|
|
32
|
+
local tag_year="${base%%.*}"
|
|
33
|
+
local rem="${base#*.}"
|
|
34
|
+
local tag_month="${rem%%.*}"
|
|
35
|
+
|
|
36
|
+
# Normalize month strings (e.g. "03" -> 3)
|
|
37
|
+
tag_month=$((10#$tag_month))
|
|
38
|
+
|
|
39
|
+
if [[ "$version" == *"-"* ]]; then
|
|
40
|
+
if [[ "$tag_year" != "$current_year" && "$tag_year" != "$next_year" ]] || \
|
|
41
|
+
[[ "$tag_month" != "$current_month" && "$tag_month" != "$next_month" ]]; then
|
|
42
|
+
echo "ERROR: Pre-release v$version outside allowed CalVer range"
|
|
43
|
+
echo "Allowed months: ${current_year}.${current_month} or ${next_year}.${next_month}"
|
|
44
|
+
return 1
|
|
45
|
+
fi
|
|
46
|
+
else
|
|
47
|
+
if [[ "$tag_year" != "$current_year" || "$tag_month" != "$current_month" ]]; then
|
|
48
|
+
echo "ERROR: Stable release v$version does not match current CalVer ${current_year}.${current_month}"
|
|
49
|
+
return 1
|
|
50
|
+
fi
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
return 0
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Git passes refs to pre-push via stdin:
|
|
57
|
+
# <local-ref> <local-sha> <remote-ref> <remote-sha>
|
|
58
|
+
while read -r local_ref _ remote_ref _; do
|
|
59
|
+
tag_ref=""
|
|
60
|
+
|
|
61
|
+
if [[ "$remote_ref" == refs/tags/v* ]]; then
|
|
62
|
+
tag_ref="$remote_ref"
|
|
63
|
+
elif [[ "$local_ref" == refs/tags/v* ]]; then
|
|
64
|
+
tag_ref="$local_ref"
|
|
65
|
+
else
|
|
66
|
+
continue
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
version="${tag_ref#refs/tags/v}"
|
|
70
|
+
if ! validate_calver "$version"; then
|
|
71
|
+
echo "Refusing push for tag: ${tag_ref#refs/tags/}"
|
|
72
|
+
echo "If intentional (e.g., backfill), push with: git push --no-verify"
|
|
73
|
+
exit 1
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
echo "CalVer OK for tag ${tag_ref#refs/tags/}"
|
|
77
|
+
done
|
|
78
|
+
|
|
79
|
+
exit 0
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Report a bug or unexpected behavior in CLEO
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug", "triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
## Bug Report
|
|
10
|
+
|
|
11
|
+
Thanks for reporting a bug! Please fill out the sections below so we can reproduce and fix it.
|
|
12
|
+
|
|
13
|
+
**If you're using an AI agent** (Claude Code, Cursor, etc.) to file this issue, the agent should run the diagnostic commands below and paste the output directly.
|
|
14
|
+
|
|
15
|
+
- type: textarea
|
|
16
|
+
id: description
|
|
17
|
+
attributes:
|
|
18
|
+
label: What happened?
|
|
19
|
+
description: |
|
|
20
|
+
Describe the bug clearly. What did you expect to happen vs what actually happened?
|
|
21
|
+
placeholder: |
|
|
22
|
+
When I ran `cleo add "My task"`, I expected a new task to be created, but instead I got an error...
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
|
|
26
|
+
- type: textarea
|
|
27
|
+
id: steps
|
|
28
|
+
attributes:
|
|
29
|
+
label: Steps to reproduce
|
|
30
|
+
description: |
|
|
31
|
+
Provide the exact commands you ran, in order. Include the full command with all flags.
|
|
32
|
+
placeholder: |
|
|
33
|
+
1. `cleo init my-project`
|
|
34
|
+
2. `cleo session start --scope epic:T001 --auto-focus --name "test"`
|
|
35
|
+
3. `cleo add "Test task" --parent T001`
|
|
36
|
+
4. See error below
|
|
37
|
+
validations:
|
|
38
|
+
required: true
|
|
39
|
+
|
|
40
|
+
- type: textarea
|
|
41
|
+
id: error-output
|
|
42
|
+
attributes:
|
|
43
|
+
label: Error output
|
|
44
|
+
description: |
|
|
45
|
+
Paste the full error output. If CLEO returned JSON, paste the complete JSON response.
|
|
46
|
+
Use `cleo <command> 2>&1` to capture both stdout and stderr.
|
|
47
|
+
render: shell
|
|
48
|
+
placeholder: |
|
|
49
|
+
$ cleo add "Test task" --parent T001
|
|
50
|
+
{
|
|
51
|
+
"success": false,
|
|
52
|
+
"error": {
|
|
53
|
+
"code": "E_PARENT_NOT_FOUND",
|
|
54
|
+
"message": "Parent task T001 does not exist",
|
|
55
|
+
"exit": 10
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
validations:
|
|
59
|
+
required: true
|
|
60
|
+
|
|
61
|
+
- type: textarea
|
|
62
|
+
id: expected
|
|
63
|
+
attributes:
|
|
64
|
+
label: Expected behavior
|
|
65
|
+
description: What did you expect to happen instead?
|
|
66
|
+
placeholder: |
|
|
67
|
+
I expected the task to be created as a child of T001.
|
|
68
|
+
validations:
|
|
69
|
+
required: true
|
|
70
|
+
|
|
71
|
+
- type: textarea
|
|
72
|
+
id: diagnostics
|
|
73
|
+
attributes:
|
|
74
|
+
label: Environment diagnostics
|
|
75
|
+
description: |
|
|
76
|
+
Run this command and paste the output:
|
|
77
|
+
```bash
|
|
78
|
+
echo "--- CLEO Diagnostics ---" && echo "CLEO version: $(cleo version 2>/dev/null || echo 'not installed')" && echo "Node version: $(node --version 2>/dev/null || echo 'not found')" && echo "Install location: $(which cleo 2>/dev/null || echo 'not found')" && echo "OS: $(uname -srm 2>/dev/null || echo 'unknown')" && echo "Shell: $SHELL" && echo "Initialized: $(test -f .cleo/tasks.db && echo 'yes' || echo 'no')"
|
|
79
|
+
```
|
|
80
|
+
render: shell
|
|
81
|
+
placeholder: |
|
|
82
|
+
--- CLEO Diagnostics ---
|
|
83
|
+
CLEO version: 2026.3.15
|
|
84
|
+
Node version: v24.0.0
|
|
85
|
+
Install location: /usr/local/bin/cleo
|
|
86
|
+
OS: Linux 6.5.0-44-generic x86_64
|
|
87
|
+
Shell: /bin/bash
|
|
88
|
+
Initialized: yes
|
|
89
|
+
validations:
|
|
90
|
+
required: true
|
|
91
|
+
|
|
92
|
+
- type: dropdown
|
|
93
|
+
id: install-method
|
|
94
|
+
attributes:
|
|
95
|
+
label: Installation method
|
|
96
|
+
description: How did you install CLEO?
|
|
97
|
+
options:
|
|
98
|
+
- "npm install -g @cleocode/cleo"
|
|
99
|
+
- "npx @cleocode/cleo"
|
|
100
|
+
- "Built from source (cloned monorepo)"
|
|
101
|
+
- "Other (describe below)"
|
|
102
|
+
validations:
|
|
103
|
+
required: true
|
|
104
|
+
|
|
105
|
+
- type: dropdown
|
|
106
|
+
id: severity
|
|
107
|
+
attributes:
|
|
108
|
+
label: Severity
|
|
109
|
+
description: How much does this impact your workflow?
|
|
110
|
+
options:
|
|
111
|
+
- "Blocker - Cannot use CLEO at all"
|
|
112
|
+
- "Major - Core feature broken, no workaround"
|
|
113
|
+
- "Moderate - Feature broken but workaround exists"
|
|
114
|
+
- "Minor - Cosmetic or edge case"
|
|
115
|
+
validations:
|
|
116
|
+
required: true
|
|
117
|
+
|
|
118
|
+
- type: dropdown
|
|
119
|
+
id: agent-usage
|
|
120
|
+
attributes:
|
|
121
|
+
label: Are you using an AI agent?
|
|
122
|
+
description: Are you (or your AI agent) filing this issue?
|
|
123
|
+
options:
|
|
124
|
+
- "Yes - AI agent filed this issue"
|
|
125
|
+
- "Yes - Human filing with AI agent assistance"
|
|
126
|
+
- "No - Filing manually"
|
|
127
|
+
validations:
|
|
128
|
+
required: true
|
|
129
|
+
|
|
130
|
+
- type: textarea
|
|
131
|
+
id: additional
|
|
132
|
+
attributes:
|
|
133
|
+
label: Additional context
|
|
134
|
+
description: |
|
|
135
|
+
Any other details that might help. Examples:
|
|
136
|
+
- Contents of `.cleo/config.json` (if relevant)
|
|
137
|
+
- Output of `cleo doctor`
|
|
138
|
+
- Screenshots or screen recordings
|
|
139
|
+
- Related issues or PRs
|
|
140
|
+
placeholder: |
|
|
141
|
+
This started happening after I updated from 2026.2.x to 2026.3.x...
|
|
142
|
+
validations:
|
|
143
|
+
required: false
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Documentation
|
|
4
|
+
url: https://github.com/cleocode/cleo/tree/main/docs
|
|
5
|
+
about: Read the CLEO documentation before opening an issue
|
|
6
|
+
- name: Discussions
|
|
7
|
+
url: https://github.com/cleocode/cleo/discussions
|
|
8
|
+
about: Ask questions and share ideas in GitHub Discussions
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new feature or improvement for CLEO
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement", "triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
## Feature Request
|
|
10
|
+
|
|
11
|
+
Help us improve CLEO! Describe what you'd like to see added or changed.
|
|
12
|
+
|
|
13
|
+
**If you're using an AI agent** to submit this, provide as much context as possible about the use case and workflow.
|
|
14
|
+
|
|
15
|
+
- type: textarea
|
|
16
|
+
id: problem
|
|
17
|
+
attributes:
|
|
18
|
+
label: Problem or use case
|
|
19
|
+
description: |
|
|
20
|
+
What problem does this feature solve? Describe the situation where you need this.
|
|
21
|
+
Focus on the *problem*, not the solution.
|
|
22
|
+
placeholder: |
|
|
23
|
+
When working on a large project with 50+ tasks, I need to filter tasks by multiple
|
|
24
|
+
labels at once, but `cleo list` only supports filtering by a single label...
|
|
25
|
+
validations:
|
|
26
|
+
required: true
|
|
27
|
+
|
|
28
|
+
- type: textarea
|
|
29
|
+
id: solution
|
|
30
|
+
attributes:
|
|
31
|
+
label: Proposed solution
|
|
32
|
+
description: |
|
|
33
|
+
How do you think this should work? Include example commands, expected output, or behavior.
|
|
34
|
+
placeholder: |
|
|
35
|
+
Add multi-label filtering to `cleo list`:
|
|
36
|
+
```bash
|
|
37
|
+
cleo list --labels "bug,priority-high"
|
|
38
|
+
cleo list --labels "bug" --labels "priority-high" # AND logic
|
|
39
|
+
```
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
|
|
43
|
+
- type: textarea
|
|
44
|
+
id: alternatives
|
|
45
|
+
attributes:
|
|
46
|
+
label: Alternatives considered
|
|
47
|
+
description: |
|
|
48
|
+
Have you tried any workarounds? Are there other approaches that could solve this?
|
|
49
|
+
placeholder: |
|
|
50
|
+
Currently I pipe through jq manually:
|
|
51
|
+
```bash
|
|
52
|
+
cleo list --json | jq '.[] | select(.labels | contains(["bug", "priority-high"]))'
|
|
53
|
+
```
|
|
54
|
+
This works but is cumbersome and not discoverable for new users.
|
|
55
|
+
validations:
|
|
56
|
+
required: false
|
|
57
|
+
|
|
58
|
+
- type: dropdown
|
|
59
|
+
id: area
|
|
60
|
+
attributes:
|
|
61
|
+
label: Feature area
|
|
62
|
+
description: Which part of CLEO does this relate to?
|
|
63
|
+
options:
|
|
64
|
+
- "Task management (add, update, complete, list)"
|
|
65
|
+
- "Session management (start, end, resume, scope)"
|
|
66
|
+
- "Hierarchy (epics, subtasks, dependencies)"
|
|
67
|
+
- "Search and filtering (find, list filters)"
|
|
68
|
+
- "Output and formatting (JSON, human-readable)"
|
|
69
|
+
- "Validation and data integrity"
|
|
70
|
+
- "Installation and setup"
|
|
71
|
+
- "MCP server integration"
|
|
72
|
+
- "Documentation"
|
|
73
|
+
- "AI agent workflow (skills, orchestrator, protocols)"
|
|
74
|
+
- "@cleocode/core package API"
|
|
75
|
+
- "Provider adapters (Claude Code, Cursor, OpenCode)"
|
|
76
|
+
- "Other"
|
|
77
|
+
validations:
|
|
78
|
+
required: true
|
|
79
|
+
|
|
80
|
+
- type: dropdown
|
|
81
|
+
id: scope
|
|
82
|
+
attributes:
|
|
83
|
+
label: Scope
|
|
84
|
+
description: How big is this change?
|
|
85
|
+
options:
|
|
86
|
+
- "Small - Single command or flag addition"
|
|
87
|
+
- "Medium - Multiple components, moderate complexity"
|
|
88
|
+
- "Large - Cross-cutting change, new subsystem"
|
|
89
|
+
- "Not sure"
|
|
90
|
+
validations:
|
|
91
|
+
required: true
|
|
92
|
+
|
|
93
|
+
- type: textarea
|
|
94
|
+
id: diagnostics
|
|
95
|
+
attributes:
|
|
96
|
+
label: Your environment (optional)
|
|
97
|
+
description: |
|
|
98
|
+
If this feature depends on your environment, run this and paste the output:
|
|
99
|
+
```bash
|
|
100
|
+
echo "CLEO: $(cleo version 2>/dev/null || echo 'not installed')" && echo "Node: $(node --version)" && echo "OS: $(uname -srm)" && echo "Shell: $SHELL"
|
|
101
|
+
```
|
|
102
|
+
render: shell
|
|
103
|
+
validations:
|
|
104
|
+
required: false
|
|
105
|
+
|
|
106
|
+
- type: dropdown
|
|
107
|
+
id: agent-usage
|
|
108
|
+
attributes:
|
|
109
|
+
label: Are you using an AI agent?
|
|
110
|
+
description: Are you (or your AI agent) filing this request?
|
|
111
|
+
options:
|
|
112
|
+
- "Yes - AI agent filed this request"
|
|
113
|
+
- "Yes - Human filing with AI agent assistance"
|
|
114
|
+
- "No - Filing manually"
|
|
115
|
+
validations:
|
|
116
|
+
required: true
|
|
117
|
+
|
|
118
|
+
- type: textarea
|
|
119
|
+
id: additional
|
|
120
|
+
attributes:
|
|
121
|
+
label: Additional context
|
|
122
|
+
description: |
|
|
123
|
+
Links, screenshots, references to other tools that do this well, or anything else.
|
|
124
|
+
validations:
|
|
125
|
+
required: false
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
name: Help / Question
|
|
2
|
+
description: Ask for help using CLEO or understanding a feature
|
|
3
|
+
title: "[Question]: "
|
|
4
|
+
labels: ["question", "help"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
## Help / Question
|
|
10
|
+
|
|
11
|
+
Need help with CLEO? Ask here. No question is too basic.
|
|
12
|
+
|
|
13
|
+
**Before asking**, please check:
|
|
14
|
+
- [`cleo help`](https://github.com/cleocode/cleo) - Built-in help
|
|
15
|
+
- [Documentation](https://github.com/cleocode/cleo/tree/main/docs) - User guides
|
|
16
|
+
- [Existing issues](https://github.com/cleocode/cleo/issues?q=is%3Aissue+label%3Aquestion) - Someone may have asked already
|
|
17
|
+
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: question
|
|
20
|
+
attributes:
|
|
21
|
+
label: What do you need help with?
|
|
22
|
+
description: |
|
|
23
|
+
Describe what you're trying to do and where you're stuck.
|
|
24
|
+
placeholder: |
|
|
25
|
+
I'm trying to set up CLEO for a new project, but I'm not sure how sessions
|
|
26
|
+
and scopes work together. When I run `cleo session start`, it asks for a scope...
|
|
27
|
+
validations:
|
|
28
|
+
required: true
|
|
29
|
+
|
|
30
|
+
- type: textarea
|
|
31
|
+
id: tried
|
|
32
|
+
attributes:
|
|
33
|
+
label: What have you tried?
|
|
34
|
+
description: |
|
|
35
|
+
What commands have you run or documentation have you read?
|
|
36
|
+
placeholder: |
|
|
37
|
+
I've tried:
|
|
38
|
+
1. `cleo help session`
|
|
39
|
+
2. Reading docs/guides/
|
|
40
|
+
3. Running `cleo session start --name "test"` but got an error about scope
|
|
41
|
+
validations:
|
|
42
|
+
required: true
|
|
43
|
+
|
|
44
|
+
- type: textarea
|
|
45
|
+
id: error-output
|
|
46
|
+
attributes:
|
|
47
|
+
label: Relevant output (if any)
|
|
48
|
+
description: |
|
|
49
|
+
If you're getting errors, paste the output here.
|
|
50
|
+
render: shell
|
|
51
|
+
validations:
|
|
52
|
+
required: false
|
|
53
|
+
|
|
54
|
+
- type: dropdown
|
|
55
|
+
id: topic
|
|
56
|
+
attributes:
|
|
57
|
+
label: Topic area
|
|
58
|
+
description: What area is your question about?
|
|
59
|
+
options:
|
|
60
|
+
- "Installation and setup"
|
|
61
|
+
- "Getting started / first use"
|
|
62
|
+
- "Task management (add, update, complete)"
|
|
63
|
+
- "Sessions and scopes"
|
|
64
|
+
- "Epics, subtasks, hierarchy"
|
|
65
|
+
- "Dependencies and blocking"
|
|
66
|
+
- "Search and filtering"
|
|
67
|
+
- "MCP server / AI agent integration"
|
|
68
|
+
- "Configuration"
|
|
69
|
+
- "Migration / upgrading"
|
|
70
|
+
- "@cleocode/core package API"
|
|
71
|
+
- "Provider adapters (Claude Code, Cursor, OpenCode)"
|
|
72
|
+
- "Other"
|
|
73
|
+
validations:
|
|
74
|
+
required: true
|
|
75
|
+
|
|
76
|
+
- type: textarea
|
|
77
|
+
id: diagnostics
|
|
78
|
+
attributes:
|
|
79
|
+
label: Your environment
|
|
80
|
+
description: |
|
|
81
|
+
Run this command and paste the output:
|
|
82
|
+
```bash
|
|
83
|
+
echo "CLEO: $(cleo version 2>/dev/null || echo 'not installed')" && echo "Node: $(node --version)" && echo "OS: $(uname -srm)" && echo "Shell: $SHELL"
|
|
84
|
+
```
|
|
85
|
+
render: shell
|
|
86
|
+
validations:
|
|
87
|
+
required: false
|
|
88
|
+
|
|
89
|
+
- type: dropdown
|
|
90
|
+
id: agent-usage
|
|
91
|
+
attributes:
|
|
92
|
+
label: Are you using an AI agent?
|
|
93
|
+
description: Are you (or your AI agent) asking this question?
|
|
94
|
+
options:
|
|
95
|
+
- "Yes - AI agent filed this question"
|
|
96
|
+
- "Yes - Human filing with AI agent assistance"
|
|
97
|
+
- "No - Filing manually"
|
|
98
|
+
validations:
|
|
99
|
+
required: true
|