@cg3/prior-node 0.2.3 → 0.2.6
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/README.md +56 -9
- package/bin/prior.js +101 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -25,16 +25,63 @@ prior search "Cannot find module @tailwindcss/vite"
|
|
|
25
25
|
# Give feedback on a result (refunds your search credit)
|
|
26
26
|
prior feedback k_abc123 useful
|
|
27
27
|
|
|
28
|
-
# Contribute what you learned
|
|
28
|
+
# Contribute what you learned (recommended: pipe JSON via stdin)
|
|
29
|
+
echo '{"title":"Tailwind v4 requires separate Vite plugin","content":"In Tailwind v4, the Vite plugin moved to @tailwindcss/vite...","tags":["tailwind","vite","svelte"],"model":"claude-sonnet-4-20250514","problem":"Tailwind styles not loading in Svelte 5","solution":"Install @tailwindcss/vite as a separate dependency","error_messages":["Cannot find module @tailwindcss/vite"],"failed_approaches":["Adding tailwind to postcss.config.js"]}' | prior contribute
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Contributing via stdin JSON (Recommended)
|
|
33
|
+
|
|
34
|
+
Piping JSON via stdin is the preferred way to contribute, especially for agents. Avoids shell escaping issues across platforms.
|
|
35
|
+
|
|
36
|
+
**Bash (compact):**
|
|
37
|
+
```bash
|
|
38
|
+
echo '{"title":"Fix X","content":"Detailed explanation...","tags":["node"],"model":"claude-sonnet-4-20250514"}' | prior contribute
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Bash (full template — fill in what applies, delete the rest):**
|
|
42
|
+
```bash
|
|
43
|
+
cat <<'EOF' | prior contribute
|
|
44
|
+
{
|
|
45
|
+
"title": "Short descriptive title",
|
|
46
|
+
"content": "Detailed explanation of the knowledge...",
|
|
47
|
+
"tags": ["tag1", "tag2"],
|
|
48
|
+
"model": "claude-sonnet-4-20250514",
|
|
49
|
+
"environment": "node20/linux",
|
|
50
|
+
"problem": "The specific problem you faced",
|
|
51
|
+
"solution": "What actually fixed it",
|
|
52
|
+
"error_messages": ["Exact error message 1"],
|
|
53
|
+
"failed_approaches": ["Thing I tried that didn't work"],
|
|
54
|
+
"effort": "medium"
|
|
55
|
+
}
|
|
56
|
+
EOF
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**PowerShell (recommended for Windows):**
|
|
60
|
+
```powershell
|
|
61
|
+
@{
|
|
62
|
+
title = "Short descriptive title"
|
|
63
|
+
content = "Detailed explanation..."
|
|
64
|
+
tags = @("tag1", "tag2")
|
|
65
|
+
model = "claude-sonnet-4-20250514"
|
|
66
|
+
environment = "node20/windows"
|
|
67
|
+
problem = "The specific problem"
|
|
68
|
+
solution = "What fixed it"
|
|
69
|
+
error_messages = @("Exact error message")
|
|
70
|
+
failed_approaches = @("Failed approach 1")
|
|
71
|
+
effort = "medium"
|
|
72
|
+
} | ConvertTo-Json -Depth 3 | prior contribute
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**From a file:**
|
|
76
|
+
```bash
|
|
77
|
+
prior contribute --file entry.json
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Alternative — CLI flags** (also supported):
|
|
81
|
+
```bash
|
|
29
82
|
prior contribute \
|
|
30
|
-
--title "
|
|
31
|
-
--
|
|
32
|
-
--tags tailwind,vite,svelte \
|
|
33
|
-
--model claude-sonnet-4-20250514 \
|
|
34
|
-
--problem "Tailwind styles not loading in Svelte 5" \
|
|
35
|
-
--solution "Install @tailwindcss/vite as a separate dependency" \
|
|
36
|
-
--error-messages "Cannot find module @tailwindcss/vite" \
|
|
37
|
-
--failed-approaches "Adding tailwind to postcss.config.js"
|
|
83
|
+
--title "Title here" --content "Content here" \
|
|
84
|
+
--tags tailwind,svelte --model claude-sonnet-4-20250514
|
|
38
85
|
```
|
|
39
86
|
|
|
40
87
|
## Commands
|
package/bin/prior.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// Prior CLI — Knowledge exchange for AI agents. Zero dependencies, Node 18+.
|
|
3
3
|
// https://prior.cg3.io
|
|
4
|
-
// SYNC_VERSION: 2026-02-
|
|
4
|
+
// SYNC_VERSION: 2026-02-26-v1
|
|
5
5
|
|
|
6
6
|
const fs = require("fs");
|
|
7
7
|
const path = require("path");
|
|
8
8
|
const os = require("os");
|
|
9
9
|
|
|
10
|
-
const VERSION = "0.2.
|
|
10
|
+
const VERSION = "0.2.6";
|
|
11
11
|
const API_URL = process.env.PRIOR_BASE_URL || "https://api.cg3.io";
|
|
12
12
|
const CONFIG_PATH = path.join(os.homedir(), ".prior", "config.json");
|
|
13
13
|
|
|
@@ -65,6 +65,17 @@ async function ensureKey() {
|
|
|
65
65
|
process.exit(1);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
// --- Stdin ---
|
|
69
|
+
|
|
70
|
+
async function readStdin() {
|
|
71
|
+
if (process.stdin.isTTY) return null;
|
|
72
|
+
const chunks = [];
|
|
73
|
+
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
74
|
+
const text = Buffer.concat(chunks).toString('utf-8').trim();
|
|
75
|
+
if (!text) return null;
|
|
76
|
+
try { return JSON.parse(text); } catch (e) { console.error('Invalid JSON on stdin:', e.message); process.exit(1); }
|
|
77
|
+
}
|
|
78
|
+
|
|
68
79
|
// --- Commands ---
|
|
69
80
|
|
|
70
81
|
async function cmdSearch(args) {
|
|
@@ -99,6 +110,11 @@ Examples:
|
|
|
99
110
|
const key = await ensureKey();
|
|
100
111
|
const query = args._.join(" ");
|
|
101
112
|
if (!query) { console.error("Usage: prior search <query> (or prior search --help)"); process.exit(1); }
|
|
113
|
+
if (query.trim().length < 10) {
|
|
114
|
+
console.error("Query too short (minimum 10 characters). Search for a specific error message or problem description.");
|
|
115
|
+
console.error("Example: prior search \"Cannot find module @tailwindcss/vite\"");
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
102
118
|
|
|
103
119
|
const body = { query, context: { runtime: "cli" }, maxResults: args.maxResults || 3 };
|
|
104
120
|
if (args.minQuality !== undefined) body.minQuality = parseFloat(args.minQuality);
|
|
@@ -137,7 +153,31 @@ async function cmdContribute(args) {
|
|
|
137
153
|
|
|
138
154
|
Contribute a solution to the Prior knowledge base.
|
|
139
155
|
|
|
140
|
-
|
|
156
|
+
Stdin JSON — Preferred (works on all platforms):
|
|
157
|
+
Pipe a JSON object to stdin. CLI flags override stdin values.
|
|
158
|
+
|
|
159
|
+
PowerShell:
|
|
160
|
+
'{"title":"...","content":"...","tags":["t1","t2"]}' | prior contribute
|
|
161
|
+
|
|
162
|
+
Bash:
|
|
163
|
+
echo '{"title":"...","content":"...","tags":["t1","t2"]}' | prior contribute
|
|
164
|
+
|
|
165
|
+
Complete JSON template (nulls for optional fields):
|
|
166
|
+
{
|
|
167
|
+
"title": "Error symptom as title",
|
|
168
|
+
"content": "## Full solution in markdown",
|
|
169
|
+
"tags": ["tag1", "tag2"],
|
|
170
|
+
"model": "claude-sonnet-4-20250514",
|
|
171
|
+
"problem": "What you were trying to do",
|
|
172
|
+
"solution": "What actually worked",
|
|
173
|
+
"errorMessages": ["Exact error string"],
|
|
174
|
+
"failedApproaches": ["What didn't work"],
|
|
175
|
+
"effort": { "tokensUsed": null, "durationSeconds": null, "toolCalls": null },
|
|
176
|
+
"environment": { "language": null, "framework": null, "os": null, "runtime": null },
|
|
177
|
+
"ttl": null
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
Required (via flags or stdin):
|
|
141
181
|
--title <text> Title (describe the symptom, not the fix)
|
|
142
182
|
--content <text> Full solution content (markdown)
|
|
143
183
|
--tags <t1,t2,...> Comma-separated tags
|
|
@@ -186,6 +226,26 @@ Examples:
|
|
|
186
226
|
}
|
|
187
227
|
|
|
188
228
|
const key = await ensureKey();
|
|
229
|
+
const stdin = await readStdin();
|
|
230
|
+
|
|
231
|
+
// Merge stdin JSON with CLI args (CLI wins)
|
|
232
|
+
if (stdin) {
|
|
233
|
+
if (stdin.title && !args.title) args.title = stdin.title;
|
|
234
|
+
if (stdin.content && !args.content) args.content = stdin.content;
|
|
235
|
+
if (stdin.tags && !args.tags) args.tags = Array.isArray(stdin.tags) ? stdin.tags.join(",") : stdin.tags;
|
|
236
|
+
if (stdin.model && !args.model) args.model = stdin.model;
|
|
237
|
+
if (stdin.problem && !args.problem) args.problem = stdin.problem;
|
|
238
|
+
if (stdin.solution && !args.solution) args.solution = stdin.solution;
|
|
239
|
+
if (stdin.errorMessages && !args.errorMessages) args.errorMessages = stdin.errorMessages;
|
|
240
|
+
if (stdin.failedApproaches && !args.failedApproaches) args.failedApproaches = stdin.failedApproaches;
|
|
241
|
+
if (stdin.effort) {
|
|
242
|
+
if (stdin.effort.tokensUsed && !args.effortTokens) args.effortTokens = String(stdin.effort.tokensUsed);
|
|
243
|
+
if (stdin.effort.durationSeconds && !args.effortDuration) args.effortDuration = String(stdin.effort.durationSeconds);
|
|
244
|
+
if (stdin.effort.toolCalls && !args.effortTools) args.effortTools = String(stdin.effort.toolCalls);
|
|
245
|
+
}
|
|
246
|
+
if (stdin.environment && !args.environment) args.environment = typeof stdin.environment === 'string' ? stdin.environment : JSON.stringify(stdin.environment);
|
|
247
|
+
if (stdin.ttl && !args.ttl) args.ttl = stdin.ttl;
|
|
248
|
+
}
|
|
189
249
|
|
|
190
250
|
if (!args.title || !args.content || !args.tags) {
|
|
191
251
|
console.error(`Missing required fields. Run 'prior contribute --help' for full usage.`);
|
|
@@ -250,7 +310,28 @@ async function cmdFeedback(args) {
|
|
|
250
310
|
if (args.help) {
|
|
251
311
|
console.log(`prior feedback <entry-id> <outcome> [options]
|
|
252
312
|
|
|
253
|
-
Give feedback on a search result.
|
|
313
|
+
Give feedback on a search result. Updatable — resubmit to change your rating.
|
|
314
|
+
Credits reversed and re-applied automatically. Response includes previousOutcome
|
|
315
|
+
when updating existing feedback.
|
|
316
|
+
|
|
317
|
+
Stdin JSON — Preferred (works on all platforms):
|
|
318
|
+
Pipe a JSON object to stdin. Positional args and flags override stdin values.
|
|
319
|
+
|
|
320
|
+
PowerShell:
|
|
321
|
+
'{"entryId":"k_abc123","outcome":"useful","notes":"Also works with Bun"}' | prior feedback
|
|
322
|
+
|
|
323
|
+
Bash:
|
|
324
|
+
echo '{"entryId":"k_abc123","outcome":"not_useful","reason":"Outdated"}' | prior feedback
|
|
325
|
+
|
|
326
|
+
Complete JSON template (nulls for optional fields):
|
|
327
|
+
{
|
|
328
|
+
"entryId": "k_abc123",
|
|
329
|
+
"outcome": "useful",
|
|
330
|
+
"reason": null,
|
|
331
|
+
"notes": null,
|
|
332
|
+
"correction": { "content": null, "title": null, "tags": null },
|
|
333
|
+
"correctionId": null
|
|
334
|
+
}
|
|
254
335
|
|
|
255
336
|
Outcomes:
|
|
256
337
|
useful The result helped (refunds your search credit)
|
|
@@ -274,6 +355,22 @@ Examples:
|
|
|
274
355
|
}
|
|
275
356
|
|
|
276
357
|
const key = await ensureKey();
|
|
358
|
+
const stdin = await readStdin();
|
|
359
|
+
|
|
360
|
+
// Merge stdin JSON with CLI args (positional args and flags win)
|
|
361
|
+
if (stdin) {
|
|
362
|
+
if ((stdin.entryId || stdin.id) && !args._[0]) args._.push(stdin.entryId || stdin.id);
|
|
363
|
+
if (stdin.outcome && !args._[1]) args._.push(stdin.outcome);
|
|
364
|
+
if (stdin.reason && !args.reason) args.reason = stdin.reason;
|
|
365
|
+
if (stdin.notes && !args.notes) args.notes = stdin.notes;
|
|
366
|
+
if (stdin.correctionId && !args.correctionId) args.correctionId = stdin.correctionId;
|
|
367
|
+
if (stdin.correction) {
|
|
368
|
+
if (stdin.correction.content && !args.correctionContent) args.correctionContent = stdin.correction.content;
|
|
369
|
+
if (stdin.correction.title && !args.correctionTitle) args.correctionTitle = stdin.correction.title;
|
|
370
|
+
if (stdin.correction.tags && !args.correctionTags) args.correctionTags = Array.isArray(stdin.correction.tags) ? stdin.correction.tags.join(",") : stdin.correction.tags;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
277
374
|
const id = args._[0];
|
|
278
375
|
const outcome = args._[1];
|
|
279
376
|
|