cue-ai 0.9.1 → 0.9.2

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.
Files changed (27) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +38 -0
  3. package/bin/cue-review-progress +107 -0
  4. package/bin/cue-review-watch +98 -0
  5. package/package.json +2 -1
  6. package/profiles/career/profile.yaml +13 -2
  7. package/profiles/core/profile.yaml +8 -0
  8. package/profiles/eu-tender-research/README.md +48 -0
  9. package/profiles/eu-tender-research/logo.png +0 -0
  10. package/profiles/eu-tender-research/profile.yaml +108 -0
  11. package/profiles/gstack/profile.yaml +2 -0
  12. package/profiles/skill-writer/profile.yaml +4 -0
  13. package/profiles/x-growth-bot/profile.yaml +0 -2
  14. package/resources/icons/generate-icons.py +128 -2
  15. package/resources/mcps/configs/claude.sanitized.json +17 -0
  16. package/resources/skills/skills/career/resume-version-manager/SKILL.md +351 -0
  17. package/resources/skills/skills/career/salary-negotiation-prep/SKILL.md +378 -0
  18. package/resources/skills/skills/eu-funding/grant-outreach/SKILL.md +70 -0
  19. package/resources/skills/skills/eu-funding/hu-grant-finder/SKILL.md +114 -0
  20. package/resources/skills/skills/eu-funding/hu-grant-finder/evals.md +26 -0
  21. package/resources/skills/skills/eu-funding/ted-tender-search/SKILL.md +80 -0
  22. package/resources/skills/skills/eu-funding/ted-tender-search/evals.md +26 -0
  23. package/resources/skills/skills/eu-funding/ted-tender-search/scripts/ted-search.sh +46 -0
  24. package/resources/skills/skills/github/gx-agents/SKILL.md +96 -0
  25. package/resources/skills/skills/meta/focus/SKILL.md +62 -0
  26. package/resources/skills/skills/tools/portless/SKILL.md +186 -0
  27. package/src/lib/analytics.ts +13 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,40 @@
1
+ # Changelog
2
+
3
+ All notable changes to cue (`cue-ai`) are documented here.
4
+ The format follows [Keep a Changelog](https://keepachangelog.com/), and the project
5
+ adheres to [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [0.9.2] — 2026-06-05
8
+
9
+ ### Added
10
+
11
+ - **Live code-review visibility.** Watch an independent review move file-by-file in
12
+ real time instead of staring at an opaque "Precipitating…" spinner.
13
+ - `bin/cue-review-watch` — live renderer; run it in a second pane to follow the
14
+ latest review (`--id <id>` for a specific one, `--once` for a snapshot).
15
+ - `bin/cue-review-progress` — append-only progress events to
16
+ `~/.config/cue/review-progress/<id>.jsonl` (the shared schema every reviewer writes).
17
+ - `/code-review` now emits per-file / per-dimension / per-finding progress events.
18
+ - The `auto-review` Stop-hook gate streams its review to the same log, so the
19
+ independent merge-gate review is watchable live too (invariants unchanged:
20
+ recursion guard, fail-open, binary verdict).
21
+ - Docs: [`docs/review-visibility.md`](./docs/review-visibility.md).
22
+ - **Self-learner (experimental · opt-in · default-OFF).** Profiles capture where their
23
+ skills fell short during a task and feed gated improvements back over time.
24
+ - `resources/hooks/profile-self-improve.sh` — friction-signal capture plus an optional
25
+ live critic agent. Recursion-guarded, never blocks Stop, runs the critic at most once
26
+ per session, fully fail-open.
27
+ - New `skill_gap` analytics event (`src/lib/analytics.ts`), inert to existing readers.
28
+ - Piloted on the `skill-writer` profile. Enable with
29
+ `touch ~/.config/cue/.auto-improve-enabled`. Docs: [`docs/self-learner.md`](./docs/self-learner.md).
30
+
31
+ ### Documentation
32
+
33
+ - **README — "what you'll see during a run — the reviewer".** Explains the independent
34
+ review gate that runs during a Claude Code session: why a red "Stop hook error" means
35
+ the gate is working (not a failure), how to suppress or disable it, and how to watch a
36
+ review live with `cue-review-watch`. Includes a real catch (a `weight` kg/g unit
37
+ ambiguity that would have rendered per-kg prices as `€0.00`).
38
+
39
+ [0.9.2]: https://github.com/opencue/cuecards/compare/v0.9.1...v0.9.2
40
+ [0.9.1]: https://github.com/opencue/cuecards/releases/tag/v0.9.1
package/README.md CHANGED
@@ -220,6 +220,44 @@ Full system + when each tag fires: **[`resources/skills/skills/meta/integrity-ta
220
220
 
221
221
  ---
222
222
 
223
+ ## what you'll see during a run — the reviewer.
224
+
225
+ cuecards can ship an **independent review gate**. When the agent finishes a
226
+ code-producing turn in a cuecard that enables it, cue spawns a *fresh, separate*
227
+ reviewer agent over the working-tree diff **before the turn is allowed to finish**.
228
+ It runs as a normal step of a Claude Code run — so expect to see a reviewer agent
229
+ think for a while (a deep pass can run many minutes and tens of thousands of tokens).
230
+ This is by design, and it earns its keep.
231
+
232
+ A real catch from a live session: the reviewer flagged a **load-bearing unit bug** —
233
+ a product's `weight` was treated as kilograms in one place but grams in two others
234
+ (`weight >= 1000 ? kg : g`). Left in, the per-kg price renders as `€0.00` and a cart
235
+ reads `20000 kg`. The gate held the merge until it was fixed.
236
+
237
+ Two things so the behavior isn't surprising:
238
+
239
+ - **A red "Stop hook error" is the gate working, not a failure.** Claude Code renders
240
+ any *blocking* hook that way. It means the reviewer found a CRITICAL/HIGH issue and is
241
+ holding the turn until you address it. It caps at 2 rounds, then releases. Suppress it
242
+ for one turn with `[skip-auto-review]` in your message; turn it off entirely with
243
+ `rm ~/.config/cue/auto-review-enabled`.
244
+ - **You can watch the review live.** A long review otherwise shows only a spinner. Run
245
+ `cue-review-watch` in a second pane to see it move file-by-file with findings as they land:
246
+
247
+ ```
248
+ 16:42:03 📄 setup-plate-variants.ts
249
+ 16:42:03 → unit convention
250
+ 16:42:09 🔴 CRITICAL weight kg/g ambiguity → per-kg price shows €0.00
251
+ 16:45:30 ✅ review complete 1 CRITICAL
252
+ ```
253
+
254
+ Enable the gate with `touch ~/.config/cue/auto-review-enabled`. Full details:
255
+ [`docs/review-visibility.md`](./docs/review-visibility.md).
256
+
257
+ <br>
258
+
259
+ ---
260
+
223
261
  ## the catalog.
224
262
 
225
263
  > One repo. 69 pre-built expert agents. Pin one with `cue use <name>` and `claude` launches with that cuecard's skills, MCPs, hooks, and commands materialized.
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env bash
2
+ # cue-review-progress — emit live code-review progress events to a tail-able JSONL
3
+ # so `cue-review-watch` (or a dashboard panel) can show what a reviewer is doing
4
+ # in REAL TIME instead of an opaque spinner. No external deps.
5
+ #
6
+ # Any reviewer (the auto-review Stop hook, a code-reviewer subagent, /ship Step 9,
7
+ # a review workflow) appends one event per file / dimension / finding. The shared
8
+ # schema is the contract — see docs/review-visibility.md.
9
+ #
10
+ # Storage: ~/.config/cue/review-progress/<id>.jsonl (append-only)
11
+ # ~/.config/cue/review-progress/latest (pointer file holding <id>)
12
+ #
13
+ # Event schema (one JSON object per line):
14
+ # ts ISO-8601 UTC (auto)
15
+ # id review id
16
+ # kind start | file | dim | finding | note | end
17
+ # file path under review (file/dim/finding)
18
+ # dim dimension/lens being checked (dim/finding)
19
+ # severity CRITICAL|HIGH|MEDIUM|LOW (finding)
20
+ # title short text (finding/note/start/end)
21
+ # detail longer text (optional)
22
+ #
23
+ # Usage:
24
+ # cue-review-progress start [--id <id>] [--label <text>] [--files <n>] # prints id
25
+ # cue-review-progress emit [--id <id>] --kind <file|dim|finding|note> \
26
+ # [--file <p>] [--dim <d>] [--severity <S>] \
27
+ # [--title <t>] [--detail <x>]
28
+ # cue-review-progress end [--id <id>] [--summary <text>]
29
+ # cue-review-progress path [--id <id>] # print the jsonl path
30
+ # cue-review-progress latest # print current latest id
31
+ set -euo pipefail
32
+
33
+ DIR="${XDG_CONFIG_HOME:-$HOME/.config}/cue/review-progress"
34
+ mkdir -p "$DIR"
35
+
36
+ # JSON string escape: drop C0 control chars (a raw tab/newline breaks the line),
37
+ # then escape backslash and double-quote.
38
+ esc() { printf '%s' "${1:-}" | tr -d '\000-\037' | sed 's/\\/\\\\/g; s/"/\\"/g'; }
39
+ now() { date -u +%Y-%m-%dT%H:%M:%S.000Z; }
40
+
41
+ resolve_id() { # $1 = explicit id (may be empty)
42
+ if [[ -n "${1:-}" ]]; then printf '%s' "$1"; return; fi
43
+ if [[ -r "$DIR/latest" ]]; then head -1 "$DIR/latest"; return; fi
44
+ printf ''
45
+ }
46
+
47
+ cmd="${1:-}"; shift || true
48
+ ID="" KIND="" FILE="" DIM="" SEV="" TITLE="" DETAIL="" LABEL="" FILES="" SUMMARY=""
49
+ while [[ $# -gt 0 ]]; do
50
+ case "$1" in
51
+ --id) ID="$2"; shift 2 ;;
52
+ --kind) KIND="$2"; shift 2 ;;
53
+ --file) FILE="$2"; shift 2 ;;
54
+ --dim) DIM="$2"; shift 2 ;;
55
+ --severity) SEV="$2"; shift 2 ;;
56
+ --title) TITLE="$2"; shift 2 ;;
57
+ --detail) DETAIL="$2"; shift 2 ;;
58
+ --label) LABEL="$2"; shift 2 ;;
59
+ --files) FILES="$2"; shift 2 ;;
60
+ --summary) SUMMARY="$2"; shift 2 ;;
61
+ *) echo "cue-review-progress: unknown flag $1" >&2; exit 1 ;;
62
+ esac
63
+ done
64
+
65
+ append() { # $1 = full json object (without trailing newline)
66
+ printf '%s\n' "$1" >> "$DIR/$RID.jsonl"
67
+ }
68
+
69
+ case "$cmd" in
70
+ start)
71
+ RID="${ID:-rev-$(date -u +%Y%m%dT%H%M%SZ)-$$}"
72
+ printf '%s' "$RID" > "$DIR/latest"
73
+ : > "$DIR/$RID.jsonl"
74
+ append "$(printf '{"ts":"%s","id":"%s","kind":"start","title":"%s","detail":"%s"}' \
75
+ "$(now)" "$(esc "$RID")" "$(esc "$LABEL")" "$(esc "$FILES")")"
76
+ printf '%s\n' "$RID"
77
+ ;;
78
+ emit)
79
+ RID="$(resolve_id "$ID")"
80
+ [[ -z "$RID" ]] && { echo "cue-review-progress emit: no review id (run 'start' first or pass --id)" >&2; exit 1; }
81
+ case "$KIND" in
82
+ file|dim|finding|note) ;;
83
+ "") echo "cue-review-progress emit: --kind required (file|dim|finding|note)" >&2; exit 1 ;;
84
+ *) echo "cue-review-progress emit: invalid --kind '$KIND'" >&2; exit 1 ;;
85
+ esac
86
+ append "$(printf '{"ts":"%s","id":"%s","kind":"%s","file":"%s","dim":"%s","severity":"%s","title":"%s","detail":"%s"}' \
87
+ "$(now)" "$(esc "$RID")" "$KIND" "$(esc "$FILE")" "$(esc "$DIM")" "$(esc "$SEV")" "$(esc "$TITLE")" "$(esc "$DETAIL")")"
88
+ ;;
89
+ end)
90
+ RID="$(resolve_id "$ID")"
91
+ [[ -z "$RID" ]] && exit 0
92
+ append "$(printf '{"ts":"%s","id":"%s","kind":"end","title":"%s"}' \
93
+ "$(now)" "$(esc "$RID")" "$(esc "$SUMMARY")")"
94
+ ;;
95
+ path)
96
+ RID="$(resolve_id "$ID")"; [[ -z "$RID" ]] && { echo "no review yet" >&2; exit 1; }
97
+ printf '%s\n' "$DIR/$RID.jsonl"
98
+ ;;
99
+ latest)
100
+ [[ -r "$DIR/latest" ]] && head -1 "$DIR/latest" || { echo "no review yet" >&2; exit 1; }
101
+ ;;
102
+ ""|-h|--help|help)
103
+ sed -n '2,/^set -e/p' "$0" | sed 's/^# \{0,1\}//; s/^set -.*//'
104
+ ;;
105
+ *)
106
+ echo "cue-review-progress: unknown subcommand '$cmd' (start|emit|end|path|latest)" >&2; exit 1 ;;
107
+ esac
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env bash
2
+ # cue-review-watch — live view of a code review in progress. Run it in a second
3
+ # pane and watch the reviewer move file-by-file, dimension-by-dimension, with
4
+ # findings as they land — instead of an opaque "Precipitating…" spinner.
5
+ #
6
+ # Reads the JSONL written by cue-review-progress (and the auto-review Stop hook).
7
+ #
8
+ # Usage:
9
+ # cue-review-watch # follow the latest review, live
10
+ # cue-review-watch --id <id> # follow a specific review
11
+ # cue-review-watch --once # print what's there so far and exit (no follow)
12
+ set -euo pipefail
13
+
14
+ DIR="${XDG_CONFIG_HOME:-$HOME/.config}/cue/review-progress"
15
+ ID="" ONCE=0
16
+ while [[ $# -gt 0 ]]; do
17
+ case "$1" in
18
+ --id) ID="$2"; shift 2 ;;
19
+ --once) ONCE=1; shift ;;
20
+ -h|--help) grep '^#' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
21
+ *) echo "cue-review-watch: unknown flag $1" >&2; exit 1 ;;
22
+ esac
23
+ done
24
+
25
+ # Colors only on a tty.
26
+ if [[ -t 1 ]]; then
27
+ B=$'\033[1m'; D=$'\033[2m'; R=$'\033[31m'; Y=$'\033[33m'; G=$'\033[32m'; C=$'\033[36m'; M=$'\033[35m'; Z=$'\033[0m'
28
+ else
29
+ B="" D="" R="" Y="" G="" C="" M="" Z=""
30
+ fi
31
+
32
+ have_jq=0; command -v jq >/dev/null 2>&1 && have_jq=1
33
+
34
+ get() { # $1=field (reads $line); jq if present, grep fallback
35
+ if [[ $have_jq -eq 1 ]]; then
36
+ printf '%s' "$line" | jq -r --arg f "$1" '.[$f] // ""' 2>/dev/null
37
+ else
38
+ printf '%s' "$line" | grep -oE "\"$1\"[[:space:]]*:[[:space:]]*\"[^\"]*\"" | head -1 \
39
+ | sed -E "s/.*\"$1\"[[:space:]]*:[[:space:]]*\"([^\"]*)\".*/\1/"
40
+ fi
41
+ }
42
+
43
+ hhmmss() { printf '%s' "${1:-}" | sed -E 's/.*T([0-9:]{8}).*/\1/'; }
44
+
45
+ render() { # reads $line
46
+ local kind ts t file dim sev title detail
47
+ kind="$(get kind)"; [[ -z "$kind" ]] && return 0
48
+ ts="$(get ts)"; t="$(hhmmss "$ts")"
49
+ file="$(get file)"; dim="$(get dim)"; sev="$(get severity)"; title="$(get title)"; detail="$(get detail)"
50
+ case "$kind" in
51
+ start) printf '%s%s▶ review started%s %s%s%s\n' "$D$t $Z" "$B$C" "$Z" "$D" "${detail:+($detail files) }${title}" "$Z" ;;
52
+ file) printf '%s%s📄 %s%s\n' "$D$t $Z" "$B" "$file" "$Z" ;;
53
+ dim) printf '%s %s→ %s%s\n' "$D$t $Z" "$C" "$dim" "$Z" ;;
54
+ finding)
55
+ local col gl
56
+ case "$sev" in
57
+ CRITICAL) col="$R$B"; gl="🔴" ;;
58
+ HIGH) col="$R"; gl="🟠" ;;
59
+ MEDIUM) col="$Y"; gl="🟡" ;;
60
+ *) col="$D"; gl="⚪" ;;
61
+ esac
62
+ printf '%s %s%s %s%s %s%s\n' "$D$t $Z" "$col" "$gl" "${sev:-NOTE}" "$Z" "${file:+$file${dim:+ · $dim} }" "$title"
63
+ [[ -n "$detail" ]] && printf ' %s%s%s\n' "$D" "$detail" "$Z"
64
+ ;;
65
+ note) printf '%s %s· %s%s\n' "$D$t $Z" "$D" "${title}${detail:+: $detail}" "$Z" ;;
66
+ end) printf '%s%s✅ review complete%s %s%s%s\n' "$D$t $Z" "$B$G" "$Z" "$D" "$title" "$Z" ;;
67
+ esac
68
+ }
69
+
70
+ # Resolve the review id / file.
71
+ [[ -z "$ID" && -r "$DIR/latest" ]] && ID="$(head -1 "$DIR/latest")"
72
+ if [[ -z "$ID" ]]; then
73
+ echo "${D}cue-review-watch: no review yet. Start one, or a reviewer will.${Z}" >&2
74
+ fi
75
+
76
+ # Wait for the file to appear (a reviewer may not have started yet).
77
+ file_path="$DIR/${ID:-__none__}.jsonl"
78
+ if [[ ! -e "$file_path" ]]; then
79
+ printf '%swaiting for a review to start (%s)…%s\n' "$D" "$DIR" "$Z"
80
+ while [[ ! -e "$file_path" ]]; do
81
+ # latest may update to a new id while we wait
82
+ [[ -r "$DIR/latest" ]] && ID="$(head -1 "$DIR/latest")" && file_path="$DIR/$ID.jsonl"
83
+ sleep 1
84
+ done
85
+ fi
86
+
87
+ printf '%swatching %s%s\n\n' "$D" "$file_path" "$Z"
88
+
89
+ if [[ $ONCE -eq 1 ]]; then
90
+ while IFS= read -r line; do render; done < "$file_path"
91
+ exit 0
92
+ fi
93
+
94
+ # Follow live. -F keeps following across truncation/rotation.
95
+ tail -n +1 -F "$file_path" 2>/dev/null | while IFS= read -r line; do
96
+ render
97
+ printf '%s' "$(get kind)" | grep -q '^end$' && break || true
98
+ done
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cue-ai",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
4
4
  "description": "cue — Agent Profile Manager for Claude Code & Codex. Pick a profile, launch with the right skills, MCPs, and plugins.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -68,6 +68,7 @@
68
68
  "install.sh",
69
69
  "get.sh",
70
70
  "README.md",
71
+ "CHANGELOG.md",
71
72
  "LICENSE"
72
73
  ],
73
74
  "dependencies": {
@@ -18,7 +18,11 @@ persona: |
18
18
  - **Story > list.** Interview answers follow STAR (Situation, Task, Action,
19
19
  Result) with the Result quantified.
20
20
  skills:
21
- local: []
21
+ local:
22
+ # Coverage not in the npx entries below: comp-band research + resume
23
+ # version tracking. Materialized from .claude/skills into the submodule.
24
+ - career/salary-negotiation-prep
25
+ - career/resume-version-manager
22
26
  npx:
23
27
  # Top community skills surfaced via `cue sources search resume/career`.
24
28
  # Install counts (as of 2026-05-29) reflect community validation.
@@ -28,4 +32,11 @@ skills:
28
32
  skills: [resume-builder] # 223 installs — Reactive Resume integration
29
33
  - repo: santifer/career-ops
30
34
  skills: [career-ops] # 151 installs — broader career management
31
- mcps: []
35
+ # Proficiently — integrated job-search suite (setup → search → tailor →
36
+ # cover → apply → network → telegram). Shares ~/.proficiently/ state.
37
+ - repo: proficientlyjobs/proficiently-claude-skills
38
+ skills: [setup, job-search, tailor-resume, cover-letter, network-scan, apply, jobsearch-telegram]
39
+ mcps:
40
+ # Browser automation — powers the Proficiently suite: apply fills
41
+ # Greenhouse/Lever/Workday forms, job-search/network-scan scrape boards.
42
+ - playwright
@@ -82,6 +82,7 @@ persona: |
82
82
  (sprint, ship-feature, triage-bug), read it first.
83
83
  skills:
84
84
  local:
85
+ - meta/focus
85
86
  # ── Built-in essentials: shared by every cue profile via inheritance ──
86
87
  - meta/analyze # investigation: "analyze", "why does", "what's causing"
87
88
  - meta/cue-usage # cue CLI guidance
@@ -129,6 +130,7 @@ mcps:
129
130
  - cue-tty-watch # Claude's eyes inside X displays / tmux panes (screenshot, capture-pane, send-keys)
130
131
  - lightpanda # Fast headless browser MCP — fetch/render/scrape URLs without Chromium. Pairs with browser/lightpanda skill.
131
132
  - context7 # Up-to-date, version-specific library docs (Upstash @upstash/context7-mcp). No API key needed; set CONTEXT7_API_KEY for higher limits. Pairs with tools/context7 skill.
133
+ - codegraph # CodeGraph MCP (`codegraph serve --mcp`): structural code search — callers, callees, impact, definitions, signatures. No-op in repos without a `.codegraph/` index (run `codegraph init -i`). Fans out to every core-inheriting profile.
132
134
  plugins:
133
135
  - claude-mem@thedotmack
134
136
  # Disabled 2026-05-30: OMC's PreToolUse auto-mode classifier was intermittently
@@ -172,6 +174,12 @@ hooks:
172
174
  # Universal analytics: append one line per session-end to ~/.config/cue/session-log.jsonl
173
175
  # so `cue eval` sees real usage data for every profile, not just gstack.
174
176
  - session-summary.json
177
+ # SessionStart hook: inject this project's most recent cue-learnings entries
178
+ # as context, so a fresh session inherits captured lessons instead of
179
+ # repeating past mistakes — the read side of the bin/cue-learnings loop
180
+ # (capture side is the skill-evolution persona). Fail-open; no-op when the
181
+ # project has no learnings.jsonl. Opt out with CUE_LEARNINGS_CONTEXT=0.
182
+ - learnings-context.json
175
183
  # Refuse writes to .env, id_rsa, credentials.json, .pem/.key, ~/.ssh, ~/.aws, etc.
176
184
  - secrets-guard.json
177
185
  # Reject low-effort `git commit -m "wip"` / "fix" / "update" messages.
@@ -0,0 +1,48 @@
1
+ # 🏛️ eu-tender-research
2
+
3
+ EU funding research for **agentic AI companies in Slovakia or Hungary**. Two jobs in one
4
+ profile: find public-procurement **tenders** to bid on, and map the **grants, cheap loans,
5
+ and venture capital** a company can apply for. Built so the second run is faster, cheaper,
6
+ and more accurate than the first.
7
+
8
+ ## Two channels, two skills
9
+
10
+ | You want to... | Skill | Source |
11
+ |---|---|---|
12
+ | Find EU tenders to bid on | `eu-funding/ted-tender-search` | Official TED API (free, no key) |
13
+ | Find grants / loans / VC for a company | `eu-funding/hu-grant-finder` | palyazat.gov.hu, NKFIH, MFB, Hiventures, EIC |
14
+
15
+ Both skills carry the **verified recipes** so the agent doesn't rediscover them:
16
+ the TED API endpoint + Expert-Search query language, the Hungarian funding ladder,
17
+ the canonical sources, and the eligibility gotchas that disqualify fastest.
18
+
19
+ ## The funding channels (the #1 thing users confuse)
20
+
21
+ - **Tender / közbeszerzés** — TED procurement: you *sell* services to the state.
22
+ - **Grant / támogatás** — GINOP/DIMOP: non-repayable project money.
23
+ - **Loan / hitel** — MFB / GINOP 1.4.x: cheap (often 0%) but you repay.
24
+ - **VC / kockázati tőke** — Hiventures (GINOP 2.5.1), EIC: equity investment.
25
+
26
+ ## Gotchas baked into the persona
27
+
28
+ - **Closed-year wall** — most KKV grants/loans need ≥1 closed business year. An egyéni
29
+ vállalkozó's closed tax year counts; don't found a fresh Kft and reset the clock.
30
+ - **Region split** — DIMOP/GINOP: Budapest (`/C`) vs every other county (`/B`, favoured).
31
+ - **Timing** — frames close on *forráskimerülés*, often before the deadline; re-check live.
32
+ - **VC is not free** — equity + TRL6 product; GINOP 2.5.1 excludes "only software" firms.
33
+ - **Deep-tech ≠ SaaS** — an LLM-wrapper won't win EIC; Hungary's route is EIC Pre-Accelerator.
34
+
35
+ ## MCPs
36
+
37
+ `ted-eu` (free single-notice fetch), `lightpanda` (page render), `gbrain` (track
38
+ shortlisted opportunities across sessions). No paid scraper, no API token. Apify is
39
+ re-addable if ever wanted: `cue mcps add apify-ted-eu` (needs `APIFY_API_TOKEN`).
40
+
41
+ ## Use it
42
+
43
+ ```bash
44
+ cue use eu-tender-research
45
+ ```
46
+
47
+ Then ask things like *"find open IT tenders from Hungarian buyers"* or *"what grants can a
48
+ new Hungarian AI company apply for?"* — the matching skill activates and runs the verified flow.
@@ -0,0 +1,108 @@
1
+ name: eu-tender-research
2
+ icon: "🏛️"
3
+ iconImage: "logo.png"
4
+ description: "EU funding research for agentic AI companies in Slovakia or Hungary: TED tenders + grants/loans/VC (GINOP, DIMOP, Hiventures, EIC). Find, filter, assess eligibility, draft briefs."
5
+ agents: [claude-code]
6
+ inherits: core
7
+ skills:
8
+ local:
9
+ - eu-funding/ted-tender-search
10
+ - eu-funding/hu-grant-finder
11
+ - eu-funding/grant-outreach
12
+ - research/find-skills
13
+ - research/defuddle
14
+ - research/trendradar
15
+ - gstack/scrape
16
+ - gstack/document-generate
17
+ - gstack/make-pdf
18
+ - content/article-writer
19
+ mcps:
20
+ - lightpanda
21
+ - gbrain
22
+ - trendradar
23
+ env:
24
+ EU_TENDER_HQ_COUNTRIES: "SK,HU"
25
+ TED_API_BASE: "https://api.ted.europa.eu/v3"
26
+ persona: |
27
+ You run EU funding research for agentic AI companies headquartered in
28
+ Slovakia (SK) or Hungary (HU). Two jobs: (1) surface TED procurement
29
+ tenders these firms can bid on, and (2) map the grants, cheap loans, and
30
+ venture capital they can apply for. Rank by fit and eligibility, then turn
31
+ winners into a clean brief.
32
+
33
+ ## Funding channels (DON'T conflate them, this is the #1 user confusion)
34
+
35
+ | Channel | What it is | Lead skill |
36
+ |---|---|---|
37
+ | Tender / közbeszerzés | TED procurement, you *sell* to the state | `eu-funding/ted-tender-search` |
38
+ | Grant / támogatás | GINOP/DIMOP, non-repayable | `eu-funding/hu-grant-finder` |
39
+ | Cheap loan / hitel | MFB / GINOP 1.4.x, 0% but repay | `eu-funding/hu-grant-finder` |
40
+ | Venture capital | Hiventures (GINOP 2.5.1), EIC, equity | `eu-funding/hu-grant-finder` |
41
+
42
+ The two `eu-funding/*` skills carry the verified recipes (TED API query
43
+ language, the Hungarian funding ladder, the sources, the eligibility
44
+ gotchas). Read the matching skill first, don't rediscover the endpoint or
45
+ the gotchas from scratch.
46
+
47
+ ## Gotchas that gate everything (check before detailing amounts)
48
+
49
+ - **Closed-year wall** — most KKV grants/loans need >=1 closed business
50
+ year + 1 employee; a brand-new company can't apply day one. An egyeni
51
+ vallalkozo's closed tax year counts, so don't found a fresh Kft and
52
+ reset that clock.
53
+ - **Region split** — DIMOP/GINOP is Budapest (`/C`) vs every other county
54
+ (`/B`, "less developed"); wealthy counties are in the favoured `/B`.
55
+ - **Timing** — frames close on forraskimerules, often before the deadline;
56
+ re-check the live active list at palyazat.gov.hu the same day.
57
+ - **VC is not free** — Hiventures/EIC take equity, need a TRL6 working
58
+ product, and GINOP 2.5.1 excludes "only software" firms.
59
+ - **Deep-tech vs SaaS** — an LLM-wrapper is SaaS, not deep tech; EIC wants
60
+ breakthrough. Hungary is a "widening" country, so EIC Pre-Accelerator is
61
+ the realistic stepping stone.
62
+
63
+ ## Data sources (route by need)
64
+
65
+ | Need | Tool |
66
+ |-------------------------------------------------------------------|-------------------------------|
67
+ | Search TED notices (CPV, country, deadline, value) — free, no key | Official TED API, `${TED_API_BASE}/notices/search` (POST) |
68
+ | Fetch one notice in full by publication number | Same TED API: `query: "publication-number IN (123456-2025)"` |
69
+ | Render a TED portal page that the API can't reach | `lightpanda` MCP, gstack/scrape |
70
+ | Strip a notice page to clean text | research/defuddle |
71
+ | Track shortlisted tenders + buyer contacts across sessions | `gbrain` MCP |
72
+ | Spot which procurement themes are heating up | research/trendradar |
73
+ | Draft a bid summary / capability statement | content/article-writer |
74
+ | Export the brief as a shareable doc/PDF | gstack/document-generate, gstack/make-pdf |
75
+
76
+ ## Defaults
77
+
78
+ - **Fit before volume.** A relevant notice an SK/HU agentic-AI firm can win
79
+ beats ten generic IT tenders. Filter hard on CPV codes for software, AI,
80
+ data, and consulting services (72xxxxxx, 48xxxxxx, 73xxxxxx), buyer
81
+ country, deadline still open, and eligibility (no incumbent lock-in).
82
+ - **Source every notice.** Each tender in a brief carries its TED
83
+ publication number (e.g. `123456-2025`), buyer, country, value, deadline,
84
+ and the live notice URL. No number, not in the brief.
85
+ - **Rank, don't dump.** When you produce a list of tenders (3+), run
86
+ `/roi-estimator` so each row carries a fit/value tag the user can sort by.
87
+ - **Both bid angles.** A notice can fit either as the prime bidder or as a
88
+ subcontractor to a local integrator — flag which when it's not obvious.
89
+ - **Verify before claiming done.** Confirm a notice is still open and the
90
+ publication number resolves before putting it in front of the user.
91
+
92
+ ## Free stack, no credentials
93
+
94
+ Everything here runs without an API key or paid scraper:
95
+
96
+ - **Search** is the official EU TED API at `${TED_API_BASE}/notices/search`
97
+ (POST JSON `{query, fields, limit, scope:"ACTIVE"}`). The Expert Search
98
+ query language filters on `classification-cpv`, `place-of-performance`,
99
+ `deadline-date`, `notice-type`, etc. No key needed.
100
+ Example: `classification-cpv IN (72000000) AND place-of-performance IN (SVK HUN)`.
101
+ - **Single-notice detail** comes from the same API:
102
+ `query: "publication-number IN (123456-2025)"`, `scope: "ALL"`. No MCP needed.
103
+ - **Page scraping** uses `lightpanda` + `defuddle` locally — no cloud
104
+ scraper (Apify, Firecrawl, etc.) required.
105
+ - **Why no TED MCP:** the `ted-eu` gateway exposes 22 tools for 2 useful
106
+ ones, and its search is an NL-router black box. The API above is precise,
107
+ verified, and zero-bloat. Re-add it only if you want NL queries:
108
+ `cue mcps add ted-eu` (or `apify-ted-eu`, needs `APIFY_API_TOKEN`).
@@ -74,6 +74,8 @@ skills:
74
74
  - gstack/health
75
75
  # gitguardex (gx) — worktree/lock/PR safety + the gated auto-ship flow
76
76
  - github/gitguardex
77
+ # gx mcp agent radar — see who's on which branch/PR/file, avoid collisions
78
+ - github/gx-agents
77
79
  # MCPs: cue-tty-watch + lightpanda inherited from core. gbrain dropped along
78
80
  # with the setup-gbrain / sync-gbrain skills.
79
81
  rules:
@@ -118,6 +118,10 @@ commands:
118
118
 
119
119
  hooks:
120
120
  - skill-frontmatter-guard.json
121
+ # cue self-learner (pilot) — captures where this profile's skills fall short
122
+ # and (with the live critic) judges the gap, feeding `cue profile self-improve`.
123
+ # OFF until `touch ~/.config/cue/.auto-improve-enabled`. See docs/self-learner.md.
124
+ - profile-self-improve.json
121
125
 
122
126
  mcps:
123
127
  - gbrain
@@ -9,13 +9,11 @@ skills:
9
9
  local:
10
10
  # The operator surface: routes each request to the xbot MCP / botctl / cli
11
11
  # and enforces the loop-vs-MCP live-write safety rule.
12
- - xbot/operate
13
12
 
14
13
  # The bot's MCP control surface (~27 tools: xbot_status, xbot_think, xbot_reply,
15
14
  # xbot_dm, xbot_cycle, xbot_pause, xbot_control, ...). core already contributes
16
15
  # cue-tty-watch + lightpanda.
17
16
  mcps:
18
- - xbot
19
17
 
20
18
  # Quality rules read on-demand (indexed in CLAUDE.md, not inlined).
21
19
  rules: