analyzthis_design 2.4.0 → 2.5.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/HOW-TO-USE.md +26 -8
- package/README.md +48 -4
- package/agents/cards/anuj.md +13 -0
- package/agents/cards/arjun.md +13 -0
- package/agents/cards/devi.md +22 -0
- package/agents/cards/kavi.md +13 -0
- package/agents/cards/meera.md +13 -0
- package/agents/cards/noor.md +13 -0
- package/agents/cards/priya.md +13 -0
- package/agents/cards/raj.md +13 -0
- package/agents/cards/zara.md +13 -0
- package/dist/HOW-TO-USE.md +26 -8
- package/dist/README.md +48 -4
- package/dist/agents/cards/anuj.md +13 -0
- package/dist/agents/cards/arjun.md +13 -0
- package/dist/agents/cards/devi.md +22 -0
- package/dist/agents/cards/kavi.md +13 -0
- package/dist/agents/cards/meera.md +13 -0
- package/dist/agents/cards/noor.md +13 -0
- package/dist/agents/cards/priya.md +13 -0
- package/dist/agents/cards/raj.md +13 -0
- package/dist/agents/cards/zara.md +13 -0
- package/dist/bin/cli.js +184 -0
- package/dist/lib/accept.js +108 -0
- package/dist/lib/evolution-metrics.js +303 -87
- package/dist/lib/evolve.js +5 -2
- package/dist/lib/feedback-submit.js +99 -17
- package/dist/lib/host-llm.js +16 -0
- package/dist/lib/install.js +7 -0
- package/dist/lib/lessons.js +48 -5
- package/dist/lib/mcp-server.js +90 -11
- package/dist/lib/receipt.js +102 -0
- package/dist/lib/session.js +52 -1
- package/dist/lib/share.js +131 -0
- package/dist/skills/accept/SKILL.md +64 -0
- package/dist/skills/devi/SKILL.md +22 -0
- package/dist/skills/evolve-check/SKILL.md +29 -13
- package/dist/skills/getting-started/SKILL.md +3 -0
- package/dist/skills/share/SKILL.md +54 -0
- package/package.json +6 -2
- package/scripts/validate-csvs.js +20 -0
- package/skills/accept/SKILL.md +64 -0
- package/skills/devi/SKILL.md +22 -0
- package/skills/evolve-check/SKILL.md +29 -13
- package/skills/getting-started/SKILL.md +3 -0
- package/skills/share/SKILL.md +54 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Designer share — send local corrections back to the published package.
|
|
5
|
+
* Slash /share talks in yes/no. HTTP submit if configured; else GitHub issue.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
var { spawnSync } = require('child_process');
|
|
9
|
+
var accept = require('./accept');
|
|
10
|
+
var submit = require('./feedback-submit');
|
|
11
|
+
|
|
12
|
+
var REPO = 'joshirishi/analyzthis_design';
|
|
13
|
+
var ISSUE_NEW = 'https://github.com/' + REPO + '/issues/new';
|
|
14
|
+
|
|
15
|
+
function preview(opts) {
|
|
16
|
+
opts = opts || {};
|
|
17
|
+
var cfg = submit.resolveSubmitConfig();
|
|
18
|
+
var entries = submit.collectUnsentEntries({
|
|
19
|
+
project: opts.project,
|
|
20
|
+
all: !!opts.all,
|
|
21
|
+
persona: opts.persona,
|
|
22
|
+
});
|
|
23
|
+
var rows = entries.map(function (e) {
|
|
24
|
+
var payload = submit.entryToSubmitPayload(e, cfg);
|
|
25
|
+
return {
|
|
26
|
+
id: e.id,
|
|
27
|
+
persona: payload.persona,
|
|
28
|
+
comment: payload.user_comment,
|
|
29
|
+
correction: payload.assistant_preferred,
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
count: rows.length,
|
|
34
|
+
rows: rows,
|
|
35
|
+
hasHttp: !!(cfg.url && cfg.anonKey),
|
|
36
|
+
endpoint: cfg.url || '',
|
|
37
|
+
consent: !!(submit.loadConsent() && submit.loadConsent().opted_in),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function formatIssueBody(rows) {
|
|
42
|
+
var lines = [
|
|
43
|
+
'Shared from `/share` (designer keep/skip). Redacted. No paths, emails, or keys.',
|
|
44
|
+
'',
|
|
45
|
+
];
|
|
46
|
+
rows.forEach(function (r, i) {
|
|
47
|
+
lines.push('### ' + (i + 1) + '. ' + r.persona);
|
|
48
|
+
if (r.comment) lines.push('**What was wrong:** ' + r.comment);
|
|
49
|
+
if (r.correction) lines.push('**What we did instead:** ' + r.correction);
|
|
50
|
+
lines.push('');
|
|
51
|
+
});
|
|
52
|
+
return lines.join('\n');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function issueWebUrl(title, body) {
|
|
56
|
+
return ISSUE_NEW
|
|
57
|
+
+ '?labels=persona-feedback'
|
|
58
|
+
+ '&title=' + encodeURIComponent(title)
|
|
59
|
+
+ '&body=' + encodeURIComponent(body);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function tryGithubIssue(title, body) {
|
|
63
|
+
var created = spawnSync(
|
|
64
|
+
'gh',
|
|
65
|
+
['issue', 'create', '--repo', REPO, '--title', title, '--label', 'persona-feedback', '--body', body],
|
|
66
|
+
{ encoding: 'utf8', timeout: 20000 }
|
|
67
|
+
);
|
|
68
|
+
if (created.status === 0 && created.stdout) {
|
|
69
|
+
return { ok: true, url: created.stdout.trim() };
|
|
70
|
+
}
|
|
71
|
+
return { ok: false, error: (created.stderr || created.stdout || 'gh failed').trim() };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function send(opts) {
|
|
75
|
+
opts = opts || {};
|
|
76
|
+
var because = String(opts.because || opts.comment || '').trim();
|
|
77
|
+
if (because) {
|
|
78
|
+
accept.fix({
|
|
79
|
+
project: opts.project,
|
|
80
|
+
persona: opts.persona,
|
|
81
|
+
because: because,
|
|
82
|
+
correction: opts.correction || because,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
var peek = preview(opts);
|
|
87
|
+
if (!peek.count) {
|
|
88
|
+
var empty = new Error('NOTHING');
|
|
89
|
+
empty.code = 'NOTHING';
|
|
90
|
+
throw empty;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (peek.hasHttp) {
|
|
94
|
+
var result = await submit.submitFeedback({
|
|
95
|
+
project: opts.project,
|
|
96
|
+
all: !!opts.all,
|
|
97
|
+
persona: opts.persona,
|
|
98
|
+
yes: true,
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
sent: result.submitted || 0,
|
|
102
|
+
via: 'http',
|
|
103
|
+
url: result.endpoint || '',
|
|
104
|
+
message: result.message,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
var title = '[feedback] ' + peek.rows[0].persona + ': ' + (peek.rows[0].comment || 'correction').slice(0, 72);
|
|
109
|
+
var body = formatIssueBody(peek.rows);
|
|
110
|
+
var gh = tryGithubIssue(title, body);
|
|
111
|
+
if (gh.ok) {
|
|
112
|
+
submit.markEntriesSubmitted(peek.rows.map(function (r) { return r.id; }));
|
|
113
|
+
return {
|
|
114
|
+
sent: peek.count,
|
|
115
|
+
via: 'github',
|
|
116
|
+
url: gh.url,
|
|
117
|
+
message: 'Opened a GitHub issue so the package can learn.',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
sent: 0,
|
|
123
|
+
via: 'github-link',
|
|
124
|
+
url: issueWebUrl(title, body),
|
|
125
|
+
title: title,
|
|
126
|
+
body: body,
|
|
127
|
+
message: 'Could not open GitHub from here. Use the link — nothing secret is in it.',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
module.exports = { preview, send, formatIssueBody, issueWebUrl, REPO };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: accept
|
|
3
|
+
description: Keep or skip the last persona note for evolution. Designer types /accept then yes or no — no CLI flags to remember.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Accept — keep or skip
|
|
8
|
+
|
|
9
|
+
You help a designer mark the last persona note (Zara, Arjun, …) so the team can evolve. They should never type `npx` flags.
|
|
10
|
+
|
|
11
|
+
## What to do
|
|
12
|
+
|
|
13
|
+
1. Read the words after `/accept` (and this chat).
|
|
14
|
+
2. Decide keep vs skip:
|
|
15
|
+
- **Keep:** yes, keep, ship, good, like, 👍
|
|
16
|
+
- **Skip:** no, skip, fix, wrong, reject, 👎
|
|
17
|
+
3. If they did not say keep or skip, ask **once** in plain language:
|
|
18
|
+
|
|
19
|
+
> Keep this note? Reply **yes** (we’re taking it) or **no** plus one sentence.
|
|
20
|
+
|
|
21
|
+
4. Infer the persona from this chat (`/zara`, `/arjun`, …). If unclear, ask **once**:
|
|
22
|
+
|
|
23
|
+
> Was this Zara, Arjun, Meera, Priya, Noor, Anuj, or Raj?
|
|
24
|
+
|
|
25
|
+
5. On **skip**, you need one sentence (what was wrong, or what they did instead). If missing, ask **once**. Then stop asking.
|
|
26
|
+
6. Record it using **whichever path this host gives you** — never ask the designer
|
|
27
|
+
to run anything:
|
|
28
|
+
|
|
29
|
+
- **Have Bash** (Claude Code, Cursor, a terminal)?
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx analyzthis_design accept --keep --persona zara
|
|
33
|
+
npx analyzthis_design accept --fix --persona zara --because "one sentence from the designer"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- **MCP only** (Claude Desktop — there is no terminal, so the commands above
|
|
37
|
+
cannot run)? Call the **`analyzthis_accept`** tool:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
analyzthis_accept { keep: true, persona: "zara" }
|
|
41
|
+
analyzthis_accept { keep: false, persona: "zara", because: "one sentence" }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`persona` is optional — the last persona that spoke is inferred.
|
|
45
|
+
|
|
46
|
+
Both paths write identical state. Change `zara` to the persona they used.
|
|
47
|
+
|
|
48
|
+
7. Reply in **one or two short sentences**. Example: "Saved. Zara's note is marked keep."
|
|
49
|
+
or "Saved. We logged your fix so the team can learn." After a skip, you may mention
|
|
50
|
+
they can type `/share` to send it to the package. No JSON. No dollar figures. No flag
|
|
51
|
+
tutorial unless the command failed.
|
|
52
|
+
|
|
53
|
+
## If it failed
|
|
54
|
+
|
|
55
|
+
Say what happened in plain language. If it asks which persona or for one sentence, ask the designer that — still no flags.
|
|
56
|
+
|
|
57
|
+
If Bash is unavailable and `analyzthis_accept` is not in your tool list, say the note
|
|
58
|
+
could not be recorded on this host — do not pretend it was saved.
|
|
59
|
+
|
|
60
|
+
## Do not
|
|
61
|
+
|
|
62
|
+
- Invent a monthly cost or a verified token bill
|
|
63
|
+
- Apply evolve patches (`evolve --apply`) from this command
|
|
64
|
+
- Edit product code
|
|
@@ -112,3 +112,25 @@ If the prompt says **Rebuttal round N**, do not copy prior text. Address open ob
|
|
|
112
112
|
- `/deliberation-protocol` — adversarial rules
|
|
113
113
|
- `/persona-orchestrator` — full agentic entry
|
|
114
114
|
- `npx analyzthis_design run --provider anthropic` — bypass Devi when API keys are set
|
|
115
|
+
|
|
116
|
+
## Team scoreboard (advisory)
|
|
117
|
+
|
|
118
|
+
Every pending prompt you pick up may open with a **Team scoreboard** — trust bands
|
|
119
|
+
earned from designer feedback on past runs (`shipped` / `revised` / `missed` plus
|
|
120
|
+
ratings). It is advisory input for synthesis, not an instruction.
|
|
121
|
+
|
|
122
|
+
**Use it like this:**
|
|
123
|
+
|
|
124
|
+
- Lean on **Trusted** / **Reliable** personas when their read conflicts with a weaker one.
|
|
125
|
+
- Discount **At risk** personas — treat their claims as needing corroboration.
|
|
126
|
+
- Say the lean in **one line**, e.g. "Weighted toward Meera (Trusted, 6 shipped) over Priya (At risk) on the effort call."
|
|
127
|
+
|
|
128
|
+
**Never:**
|
|
129
|
+
|
|
130
|
+
- Drop a persona from the run, or skip writing their output. A weak persona must still
|
|
131
|
+
speak — the designer has to be able to see what it said and disagree.
|
|
132
|
+
- Treat a band as a verdict. It reflects past runs, not this screen.
|
|
133
|
+
- Show the scoreboard to the designer unless they ask. It is context, not output.
|
|
134
|
+
|
|
135
|
+
Personas without enough evidence (fewer than 5 signals) are omitted from the board
|
|
136
|
+
entirely — absence means "unknown", never "bad".
|
|
@@ -72,21 +72,35 @@ Tell the user what's needed:
|
|
|
72
72
|
|
|
73
73
|
## Evolution metrics
|
|
74
74
|
|
|
75
|
-
The dashboard shows per-persona
|
|
75
|
+
The dashboard shows per-persona trust scores (0-100). A persona **starts at 50**
|
|
76
|
+
and moves in both directions, so a rejection genuinely costs it.
|
|
76
77
|
|
|
77
78
|
| Score | Level | Meaning |
|
|
78
79
|
|-------|-------|---------|
|
|
79
|
-
|
|
|
80
|
-
|
|
|
81
|
-
| 40-59 |
|
|
82
|
-
|
|
|
83
|
-
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
80
|
+
| 80-100 | Trusted | Consistently shipped; weight heavily |
|
|
81
|
+
| 60-79 | Reliable | More hits than misses |
|
|
82
|
+
| 40-59 | Baseline | Neutral, or not enough evidence yet |
|
|
83
|
+
| 20-39 | Developing | More rework than wins |
|
|
84
|
+
| 0-19 | At risk | Repeatedly wrong or missed |
|
|
85
|
+
|
|
86
|
+
Signed contributions:
|
|
87
|
+
|
|
88
|
+
| Signal | Points |
|
|
89
|
+
|---|---|
|
|
90
|
+
| outcome `shipped` | **+15** |
|
|
91
|
+
| outcome `blocked_correctly` | **+10** |
|
|
92
|
+
| outcome `revised` | **-5** |
|
|
93
|
+
| outcome `missed` | **-15** |
|
|
94
|
+
| each rating | `(rating - 3) x 4` → 5* = +8, 1* = -8 |
|
|
95
|
+
| each positive lesson | +10 |
|
|
96
|
+
| patch proposed / applied | +20 / +25 |
|
|
97
|
+
|
|
98
|
+
**Evidence gating:** below 5 signals a persona is reported as
|
|
99
|
+
`Baseline (insufficient evidence)` regardless of score — one bad note must not
|
|
100
|
+
brand a persona. Scores are derived on read, so changing weights re-scores history
|
|
101
|
+
with no migration.
|
|
102
|
+
|
|
103
|
+
Scope is **global per persona** by default. Pass `--project` to scope down.
|
|
90
104
|
|
|
91
105
|
## CLI reference
|
|
92
106
|
|
|
@@ -94,8 +108,10 @@ Scoring:
|
|
|
94
108
|
# Check readiness + dashboard
|
|
95
109
|
npx analyzthis_design evolve --ready
|
|
96
110
|
|
|
97
|
-
# Just the dashboard
|
|
111
|
+
# Just the dashboard (or the shorter alias)
|
|
98
112
|
npx analyzthis_design evolve --metrics
|
|
113
|
+
npx analyzthis_design scores
|
|
114
|
+
npx analyzthis_design scores --persona arjun
|
|
99
115
|
|
|
100
116
|
# Extract patches (dry-run by default)
|
|
101
117
|
npx analyzthis_design evolve --extract --dry-run
|
|
@@ -36,6 +36,9 @@ This runs **Kavi** — scans your repo, builds an Obsidian vault, and syncs a **
|
|
|
36
36
|
| Set visual direction with references + team debate | `/mood-board` | Collect web/DS references, tag, deliberate, converge |
|
|
37
37
|
| Inspect the chunked execution planner | `/chunk-planner` | See how tasks are split into model-routed chunks |
|
|
38
38
|
| Run legacy single-pass orchestrator | `/run-unchunked` | Skip planner overhead for quick single-expert tasks |
|
|
39
|
+
| Keep or skip the last persona note | `/accept` | Yes or no (plus one sentence if no). Local evolution — no CLI flags. |
|
|
40
|
+
| Send a correction to the package | `/share` | Preview, then yes. Redacted. GitHub or HTTP — no CLI flags. |
|
|
41
|
+
| See inferred tokens after a critique | `/receipt` | Not a bill. Not a monthly dollar. |
|
|
39
42
|
| Make the team learn from accepted outputs | `npx analyzthis_design evolve --extract` | Harvests lessons + proposes prompt/reference/router patches |
|
|
40
43
|
| Track whether a persona's advice actually shipped | `npx analyzthis_design outcome --confirm` | Labels outcome: shipped / revised / blocked / missed |
|
|
41
44
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: share
|
|
3
|
+
description: Send a correction back to the analyzthis_design package. Designer types /share then yes — no CLI flags. Preview first. Redacted. Not a bill.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Share — send a note back to the package
|
|
8
|
+
|
|
9
|
+
You help a designer send a correction to the **published** team (npm package / GitHub). Local `/accept` stays on their machine until they share.
|
|
10
|
+
|
|
11
|
+
They should never type `npx` flags.
|
|
12
|
+
|
|
13
|
+
## What to do
|
|
14
|
+
|
|
15
|
+
1. Read the words after `/share` (and this chat).
|
|
16
|
+
2. If they gave a sentence (what was wrong / what they did instead) and have not `/accept`’d yet, treat that as the note to share.
|
|
17
|
+
3. Always **preview first** unless they already said **yes** on a preview you just showed:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npx analyzthis_design share
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
4. Show the preview in plain language. Example:
|
|
24
|
+
|
|
25
|
+
> Ready to send **1** note to the package (Zara): “too much motion on the daily table.”
|
|
26
|
+
> This is redacted — no folder names, emails, or keys.
|
|
27
|
+
> Send it? Reply **yes** or **no**.
|
|
28
|
+
|
|
29
|
+
5. **no** / cancel / skip → stop. Say “Not sent. It stays on your machine.”
|
|
30
|
+
6. **yes** / send / share → run:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx analyzthis_design share --send
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
If they included a new sentence and a persona, add `--because "..."` and `--persona zara` (change the name). Do not ask them to type those flags.
|
|
37
|
+
|
|
38
|
+
7. Reply in **one or two short sentences**. If the command printed a GitHub URL, include that link. No JSON dump. No dollar figures.
|
|
39
|
+
|
|
40
|
+
## If nothing is waiting
|
|
41
|
+
|
|
42
|
+
Say: “Nothing to send yet. After a critique, `/accept no` plus one sentence, then `/share`.”
|
|
43
|
+
If they already typed a sentence in this `/share`, run preview with that sentence recorded (the CLI `--because` path) and continue from step 4.
|
|
44
|
+
|
|
45
|
+
## If the command failed
|
|
46
|
+
|
|
47
|
+
Plain language only. If it asks which persona or for one sentence, ask that once — still no flags.
|
|
48
|
+
|
|
49
|
+
## Do not
|
|
50
|
+
|
|
51
|
+
- Send without a yes (unless they typed `/share yes` on a preview you already showed)
|
|
52
|
+
- Invent that HTTP or GitHub succeeded
|
|
53
|
+
- Apply evolve patches
|
|
54
|
+
- Edit product code
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "analyzthis_design",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "8 AI design personas
|
|
3
|
+
"version": "2.5.0",
|
|
4
|
+
"description": "8 AI design personas \u2014 v2.2 project-scoped knowledge bank (no cross-project vault entanglement), v2.0 chunked execution with frontier planner + free/cheap chunk models, adversarial deliberation loops, opt-in community feedback, Kavi knowledge collection, DesignSpec producer path, wireframe skills, UX critique, Agent Skills for Cursor, Claude, Codex, Grok, Windsurf. Plain source \u2014 no obfuscation, no auto-install.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cursor",
|
|
7
7
|
"cursor-skill",
|
|
@@ -46,5 +46,9 @@
|
|
|
46
46
|
},
|
|
47
47
|
"engines": {
|
|
48
48
|
"node": ">=16"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@neon/config": "^1.2.0",
|
|
52
|
+
"@neon/env": "^1.2.0"
|
|
49
53
|
}
|
|
50
54
|
}
|
package/scripts/validate-csvs.js
CHANGED
|
@@ -180,6 +180,26 @@ for (var fileKey in schema.files) {
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
// ── website/system-prompt.txt drift guard ───────────────────────────────────
|
|
184
|
+
// The site deploys from website/ independently of `npm publish`, so nothing else
|
|
185
|
+
// would catch a stale prompt. Browser-only tools have no other way in, and a
|
|
186
|
+
// silently outdated prompt is worse than a missing one.
|
|
187
|
+
(function checkSystemPrompt() {
|
|
188
|
+
var promptPath = path.join(__dirname, '..', 'website', 'system-prompt.txt');
|
|
189
|
+
if (!fs.existsSync(promptPath)) {
|
|
190
|
+
errors.push('website/system-prompt.txt is missing — run: npm run build');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
var expected = require(path.join(__dirname, '..', 'lib', 'system-prompt.js')).buildPrompt({ mode: 'both' });
|
|
195
|
+
if (fs.readFileSync(promptPath, 'utf8') !== expected) {
|
|
196
|
+
errors.push('website/system-prompt.txt is out of date — run: npm run build');
|
|
197
|
+
}
|
|
198
|
+
} catch (e) {
|
|
199
|
+
errors.push('could not verify website/system-prompt.txt: ' + e.message);
|
|
200
|
+
}
|
|
201
|
+
})();
|
|
202
|
+
|
|
183
203
|
// Report
|
|
184
204
|
if (warnings.length) {
|
|
185
205
|
console.log('\n── Warnings ──');
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: accept
|
|
3
|
+
description: Keep or skip the last persona note for evolution. Designer types /accept then yes or no — no CLI flags to remember.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Accept — keep or skip
|
|
8
|
+
|
|
9
|
+
You help a designer mark the last persona note (Zara, Arjun, …) so the team can evolve. They should never type `npx` flags.
|
|
10
|
+
|
|
11
|
+
## What to do
|
|
12
|
+
|
|
13
|
+
1. Read the words after `/accept` (and this chat).
|
|
14
|
+
2. Decide keep vs skip:
|
|
15
|
+
- **Keep:** yes, keep, ship, good, like, 👍
|
|
16
|
+
- **Skip:** no, skip, fix, wrong, reject, 👎
|
|
17
|
+
3. If they did not say keep or skip, ask **once** in plain language:
|
|
18
|
+
|
|
19
|
+
> Keep this note? Reply **yes** (we’re taking it) or **no** plus one sentence.
|
|
20
|
+
|
|
21
|
+
4. Infer the persona from this chat (`/zara`, `/arjun`, …). If unclear, ask **once**:
|
|
22
|
+
|
|
23
|
+
> Was this Zara, Arjun, Meera, Priya, Noor, Anuj, or Raj?
|
|
24
|
+
|
|
25
|
+
5. On **skip**, you need one sentence (what was wrong, or what they did instead). If missing, ask **once**. Then stop asking.
|
|
26
|
+
6. Record it using **whichever path this host gives you** — never ask the designer
|
|
27
|
+
to run anything:
|
|
28
|
+
|
|
29
|
+
- **Have Bash** (Claude Code, Cursor, a terminal)?
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx analyzthis_design accept --keep --persona zara
|
|
33
|
+
npx analyzthis_design accept --fix --persona zara --because "one sentence from the designer"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- **MCP only** (Claude Desktop — there is no terminal, so the commands above
|
|
37
|
+
cannot run)? Call the **`analyzthis_accept`** tool:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
analyzthis_accept { keep: true, persona: "zara" }
|
|
41
|
+
analyzthis_accept { keep: false, persona: "zara", because: "one sentence" }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`persona` is optional — the last persona that spoke is inferred.
|
|
45
|
+
|
|
46
|
+
Both paths write identical state. Change `zara` to the persona they used.
|
|
47
|
+
|
|
48
|
+
7. Reply in **one or two short sentences**. Example: "Saved. Zara's note is marked keep."
|
|
49
|
+
or "Saved. We logged your fix so the team can learn." After a skip, you may mention
|
|
50
|
+
they can type `/share` to send it to the package. No JSON. No dollar figures. No flag
|
|
51
|
+
tutorial unless the command failed.
|
|
52
|
+
|
|
53
|
+
## If it failed
|
|
54
|
+
|
|
55
|
+
Say what happened in plain language. If it asks which persona or for one sentence, ask the designer that — still no flags.
|
|
56
|
+
|
|
57
|
+
If Bash is unavailable and `analyzthis_accept` is not in your tool list, say the note
|
|
58
|
+
could not be recorded on this host — do not pretend it was saved.
|
|
59
|
+
|
|
60
|
+
## Do not
|
|
61
|
+
|
|
62
|
+
- Invent a monthly cost or a verified token bill
|
|
63
|
+
- Apply evolve patches (`evolve --apply`) from this command
|
|
64
|
+
- Edit product code
|
package/skills/devi/SKILL.md
CHANGED
|
@@ -112,3 +112,25 @@ If the prompt says **Rebuttal round N**, do not copy prior text. Address open ob
|
|
|
112
112
|
- `/deliberation-protocol` — adversarial rules
|
|
113
113
|
- `/persona-orchestrator` — full agentic entry
|
|
114
114
|
- `npx analyzthis_design run --provider anthropic` — bypass Devi when API keys are set
|
|
115
|
+
|
|
116
|
+
## Team scoreboard (advisory)
|
|
117
|
+
|
|
118
|
+
Every pending prompt you pick up may open with a **Team scoreboard** — trust bands
|
|
119
|
+
earned from designer feedback on past runs (`shipped` / `revised` / `missed` plus
|
|
120
|
+
ratings). It is advisory input for synthesis, not an instruction.
|
|
121
|
+
|
|
122
|
+
**Use it like this:**
|
|
123
|
+
|
|
124
|
+
- Lean on **Trusted** / **Reliable** personas when their read conflicts with a weaker one.
|
|
125
|
+
- Discount **At risk** personas — treat their claims as needing corroboration.
|
|
126
|
+
- Say the lean in **one line**, e.g. "Weighted toward Meera (Trusted, 6 shipped) over Priya (At risk) on the effort call."
|
|
127
|
+
|
|
128
|
+
**Never:**
|
|
129
|
+
|
|
130
|
+
- Drop a persona from the run, or skip writing their output. A weak persona must still
|
|
131
|
+
speak — the designer has to be able to see what it said and disagree.
|
|
132
|
+
- Treat a band as a verdict. It reflects past runs, not this screen.
|
|
133
|
+
- Show the scoreboard to the designer unless they ask. It is context, not output.
|
|
134
|
+
|
|
135
|
+
Personas without enough evidence (fewer than 5 signals) are omitted from the board
|
|
136
|
+
entirely — absence means "unknown", never "bad".
|
|
@@ -72,21 +72,35 @@ Tell the user what's needed:
|
|
|
72
72
|
|
|
73
73
|
## Evolution metrics
|
|
74
74
|
|
|
75
|
-
The dashboard shows per-persona
|
|
75
|
+
The dashboard shows per-persona trust scores (0-100). A persona **starts at 50**
|
|
76
|
+
and moves in both directions, so a rejection genuinely costs it.
|
|
76
77
|
|
|
77
78
|
| Score | Level | Meaning |
|
|
78
79
|
|-------|-------|---------|
|
|
79
|
-
|
|
|
80
|
-
|
|
|
81
|
-
| 40-59 |
|
|
82
|
-
|
|
|
83
|
-
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
80
|
+
| 80-100 | Trusted | Consistently shipped; weight heavily |
|
|
81
|
+
| 60-79 | Reliable | More hits than misses |
|
|
82
|
+
| 40-59 | Baseline | Neutral, or not enough evidence yet |
|
|
83
|
+
| 20-39 | Developing | More rework than wins |
|
|
84
|
+
| 0-19 | At risk | Repeatedly wrong or missed |
|
|
85
|
+
|
|
86
|
+
Signed contributions:
|
|
87
|
+
|
|
88
|
+
| Signal | Points |
|
|
89
|
+
|---|---|
|
|
90
|
+
| outcome `shipped` | **+15** |
|
|
91
|
+
| outcome `blocked_correctly` | **+10** |
|
|
92
|
+
| outcome `revised` | **-5** |
|
|
93
|
+
| outcome `missed` | **-15** |
|
|
94
|
+
| each rating | `(rating - 3) x 4` → 5* = +8, 1* = -8 |
|
|
95
|
+
| each positive lesson | +10 |
|
|
96
|
+
| patch proposed / applied | +20 / +25 |
|
|
97
|
+
|
|
98
|
+
**Evidence gating:** below 5 signals a persona is reported as
|
|
99
|
+
`Baseline (insufficient evidence)` regardless of score — one bad note must not
|
|
100
|
+
brand a persona. Scores are derived on read, so changing weights re-scores history
|
|
101
|
+
with no migration.
|
|
102
|
+
|
|
103
|
+
Scope is **global per persona** by default. Pass `--project` to scope down.
|
|
90
104
|
|
|
91
105
|
## CLI reference
|
|
92
106
|
|
|
@@ -94,8 +108,10 @@ Scoring:
|
|
|
94
108
|
# Check readiness + dashboard
|
|
95
109
|
npx analyzthis_design evolve --ready
|
|
96
110
|
|
|
97
|
-
# Just the dashboard
|
|
111
|
+
# Just the dashboard (or the shorter alias)
|
|
98
112
|
npx analyzthis_design evolve --metrics
|
|
113
|
+
npx analyzthis_design scores
|
|
114
|
+
npx analyzthis_design scores --persona arjun
|
|
99
115
|
|
|
100
116
|
# Extract patches (dry-run by default)
|
|
101
117
|
npx analyzthis_design evolve --extract --dry-run
|
|
@@ -36,6 +36,9 @@ This runs **Kavi** — scans your repo, builds an Obsidian vault, and syncs a **
|
|
|
36
36
|
| Set visual direction with references + team debate | `/mood-board` | Collect web/DS references, tag, deliberate, converge |
|
|
37
37
|
| Inspect the chunked execution planner | `/chunk-planner` | See how tasks are split into model-routed chunks |
|
|
38
38
|
| Run legacy single-pass orchestrator | `/run-unchunked` | Skip planner overhead for quick single-expert tasks |
|
|
39
|
+
| Keep or skip the last persona note | `/accept` | Yes or no (plus one sentence if no). Local evolution — no CLI flags. |
|
|
40
|
+
| Send a correction to the package | `/share` | Preview, then yes. Redacted. GitHub or HTTP — no CLI flags. |
|
|
41
|
+
| See inferred tokens after a critique | `/receipt` | Not a bill. Not a monthly dollar. |
|
|
39
42
|
| Make the team learn from accepted outputs | `npx analyzthis_design evolve --extract` | Harvests lessons + proposes prompt/reference/router patches |
|
|
40
43
|
| Track whether a persona's advice actually shipped | `npx analyzthis_design outcome --confirm` | Labels outcome: shipped / revised / blocked / missed |
|
|
41
44
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: share
|
|
3
|
+
description: Send a correction back to the analyzthis_design package. Designer types /share then yes — no CLI flags. Preview first. Redacted. Not a bill.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Share — send a note back to the package
|
|
8
|
+
|
|
9
|
+
You help a designer send a correction to the **published** team (npm package / GitHub). Local `/accept` stays on their machine until they share.
|
|
10
|
+
|
|
11
|
+
They should never type `npx` flags.
|
|
12
|
+
|
|
13
|
+
## What to do
|
|
14
|
+
|
|
15
|
+
1. Read the words after `/share` (and this chat).
|
|
16
|
+
2. If they gave a sentence (what was wrong / what they did instead) and have not `/accept`’d yet, treat that as the note to share.
|
|
17
|
+
3. Always **preview first** unless they already said **yes** on a preview you just showed:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npx analyzthis_design share
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
4. Show the preview in plain language. Example:
|
|
24
|
+
|
|
25
|
+
> Ready to send **1** note to the package (Zara): “too much motion on the daily table.”
|
|
26
|
+
> This is redacted — no folder names, emails, or keys.
|
|
27
|
+
> Send it? Reply **yes** or **no**.
|
|
28
|
+
|
|
29
|
+
5. **no** / cancel / skip → stop. Say “Not sent. It stays on your machine.”
|
|
30
|
+
6. **yes** / send / share → run:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx analyzthis_design share --send
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
If they included a new sentence and a persona, add `--because "..."` and `--persona zara` (change the name). Do not ask them to type those flags.
|
|
37
|
+
|
|
38
|
+
7. Reply in **one or two short sentences**. If the command printed a GitHub URL, include that link. No JSON dump. No dollar figures.
|
|
39
|
+
|
|
40
|
+
## If nothing is waiting
|
|
41
|
+
|
|
42
|
+
Say: “Nothing to send yet. After a critique, `/accept no` plus one sentence, then `/share`.”
|
|
43
|
+
If they already typed a sentence in this `/share`, run preview with that sentence recorded (the CLI `--because` path) and continue from step 4.
|
|
44
|
+
|
|
45
|
+
## If the command failed
|
|
46
|
+
|
|
47
|
+
Plain language only. If it asks which persona or for one sentence, ask that once — still no flags.
|
|
48
|
+
|
|
49
|
+
## Do not
|
|
50
|
+
|
|
51
|
+
- Send without a yes (unless they typed `/share yes` on a preview you already showed)
|
|
52
|
+
- Invent that HTTP or GitHub succeeded
|
|
53
|
+
- Apply evolve patches
|
|
54
|
+
- Edit product code
|