greprag 5.49.16 → 5.51.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.
Files changed (55) hide show
  1. package/dist/commands/doc-pointer-reminder.d.ts +18 -0
  2. package/dist/commands/doc-pointer-reminder.js +41 -0
  3. package/dist/commands/doc-pointer-reminder.js.map +1 -0
  4. package/dist/commands/enrichment-health-reminder.d.ts +23 -0
  5. package/dist/commands/enrichment-health-reminder.js +39 -0
  6. package/dist/commands/enrichment-health-reminder.js.map +1 -0
  7. package/dist/commands/init.js +20 -0
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/load.d.ts +8 -5
  10. package/dist/commands/load.js +89 -10
  11. package/dist/commands/load.js.map +1 -1
  12. package/dist/commands/memory.js +40 -12
  13. package/dist/commands/memory.js.map +1 -1
  14. package/dist/commands/opencode-interrupt.d.ts +5 -0
  15. package/dist/commands/opencode-interrupt.js +8 -2
  16. package/dist/commands/opencode-interrupt.js.map +1 -1
  17. package/dist/commands/opencode-relay.js +1 -1
  18. package/dist/commands/opencode-relay.js.map +1 -1
  19. package/dist/commands/procedure.d.ts +15 -0
  20. package/dist/commands/procedure.js +167 -0
  21. package/dist/commands/procedure.js.map +1 -0
  22. package/dist/commands/reminder-registry.js +8 -0
  23. package/dist/commands/reminder-registry.js.map +1 -1
  24. package/dist/commands/reminder-types.d.ts +35 -0
  25. package/dist/commands/skill-gain-reminder.d.ts +17 -0
  26. package/dist/commands/skill-gain-reminder.js +32 -0
  27. package/dist/commands/skill-gain-reminder.js.map +1 -0
  28. package/dist/commands/skill-mirror-reminder.d.ts +15 -0
  29. package/dist/commands/skill-mirror-reminder.js +33 -0
  30. package/dist/commands/skill-mirror-reminder.js.map +1 -0
  31. package/dist/commands/skillgain.d.ts +12 -0
  32. package/dist/commands/skillgain.js +109 -0
  33. package/dist/commands/skillgain.js.map +1 -0
  34. package/dist/hook.js +386 -2
  35. package/dist/hook.js.map +1 -1
  36. package/dist/index.js +4 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/opencode-plugin.bundle.js +92 -1
  39. package/dist/procedure-watch.d.ts +153 -0
  40. package/dist/procedure-watch.js +349 -0
  41. package/dist/procedure-watch.js.map +1 -0
  42. package/dist/procedure.d.ts +88 -0
  43. package/dist/procedure.js +269 -0
  44. package/dist/procedure.js.map +1 -0
  45. package/dist/skill-landing.d.ts +88 -0
  46. package/dist/skill-landing.js +220 -0
  47. package/dist/skill-landing.js.map +1 -0
  48. package/dist/skill-mirror-client.d.ts +37 -0
  49. package/dist/skill-mirror-client.js +172 -0
  50. package/dist/skill-mirror-client.js.map +1 -0
  51. package/package.json +1 -1
  52. package/skill/commander/SKILL.md +2 -2
  53. package/skill/greprag/SKILL.md +1 -1
  54. package/skill/greprag/docs/inbox-watch.md +5 -5
  55. package/skill/templates/chip-leader-opencode.md +98 -0
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /** skill-gain-announce — the Skill Learning Loop's SessionStart surface
3
+ * (docs/skill-learning-loop.md §fuse shape). PURELY INFORMATIONAL: the
4
+ * landing leg already wrote the briefcase (learned doc + fuse line in
5
+ * SKILL.md), and the fuse self-applies on the skill's NEXT invocation — this
6
+ * block just tells the operator their skills picked something up. Never a
7
+ * task; the voluntarism corpse stays buried.
8
+ *
9
+ * The hook does the I/O and passes env.skillGains; this module is PURE
10
+ * render. Silent when nothing landed. Startup-only. */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.skillGainAnnounceModule = void 0;
13
+ exports.buildSkillGainAnnounce = buildSkillGainAnnounce;
14
+ function buildSkillGainAnnounce(gains) {
15
+ if (!gains || gains.landed.length === 0)
16
+ return null;
17
+ return [
18
+ '[greprag skills — learned from past runs (Skill Learning Loop):]',
19
+ ...gains.landed.map((l) => `⚙ ${l.skill} packed a briefcase: ${l.oneLiner}`),
20
+ 'Each lands as a fuse line + focused doc inside the skill and SELF-APPLIES on its next'
21
+ + ' invocation (the agent folds it in, deletes the fuse). Nothing to do here.'
22
+ + ' Undo one: `greprag skillgain reject <id>`.',
23
+ ].join('\n');
24
+ }
25
+ exports.skillGainAnnounceModule = {
26
+ id: 'skill-gain-announce',
27
+ detect: (_env) => ({ tier: 'silent' }), // announce-only
28
+ announce: (env) => buildSkillGainAnnounce(env.skillGains),
29
+ reannounceOnCompact: false,
30
+ reminder: () => null,
31
+ };
32
+ //# sourceMappingURL=skill-gain-reminder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-gain-reminder.js","sourceRoot":"","sources":["../../src/commands/skill-gain-reminder.ts"],"names":[],"mappings":";AAAA;;;;;;;;wDAQwD;;;AAIxD,wDAWC;AAXD,SAAgB,sBAAsB,CACpC,KAAyE;IAEzE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO;QACL,kEAAkE;QAClE,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,wBAAwB,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5E,uFAAuF;cACrF,4EAA4E;cAC5E,6CAA6C;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAEY,QAAA,uBAAuB,GAAmB;IACrD,EAAE,EAAE,qBAAqB;IACzB,MAAM,EAAE,CAAC,IAAiB,EAAa,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,gBAAgB;IAChF,QAAQ,EAAE,CAAC,GAAgB,EAAiB,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC;IACrF,mBAAmB,EAAE,KAAK;IAC1B,QAAQ,EAAE,GAAkB,EAAE,CAAC,IAAI;CACpC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** skill-mirror-announce — the Tier-3 mirror's SessionStart pointer
2
+ * (docs/load-system.md §Tier 3). A POINTER, not a list (context economy):
3
+ * one line naming the capability + the command — the catalog lives behind
4
+ * `greprag load`. This is the "where to find skills" info the operator asked
5
+ * for, and the discovery half of trigger parity until the frontrun judge
6
+ * lands (see the spec's named gaps).
7
+ *
8
+ * The hook passes env.mirroredSkills (count + a few freshest names); this
9
+ * module is PURE render. Silent when nothing is mirrored yet. */
10
+ import { ReminderModule } from './reminder-types';
11
+ export declare function buildSkillMirrorAnnounce(m: {
12
+ count: number;
13
+ names: string[];
14
+ } | undefined): string | null;
15
+ export declare const skillMirrorAnnounceModule: ReminderModule;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ /** skill-mirror-announce — the Tier-3 mirror's SessionStart pointer
3
+ * (docs/load-system.md §Tier 3). A POINTER, not a list (context economy):
4
+ * one line naming the capability + the command — the catalog lives behind
5
+ * `greprag load`. This is the "where to find skills" info the operator asked
6
+ * for, and the discovery half of trigger parity until the frontrun judge
7
+ * lands (see the spec's named gaps).
8
+ *
9
+ * The hook passes env.mirroredSkills (count + a few freshest names); this
10
+ * module is PURE render. Silent when nothing is mirrored yet. */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.skillMirrorAnnounceModule = void 0;
13
+ exports.buildSkillMirrorAnnounce = buildSkillMirrorAnnounce;
14
+ function buildSkillMirrorAnnounce(m) {
15
+ if (!m || m.count <= 0)
16
+ return null;
17
+ const sample = m.names.slice(0, 4).join(', ');
18
+ const more = m.count > 4 ? ', …' : '';
19
+ return [
20
+ `[greprag skills — ${m.count} of your skills travel with the harness (auto-mirrored from use, always fresh): ${sample}${more}.]`,
21
+ 'Any machine or harness with the greprag CLI can use them — `greprag load` to browse, '
22
+ + '`greprag load <skill>` to read one inline. No ~/.claude/skills needed.',
23
+ ].join('\n');
24
+ }
25
+ exports.skillMirrorAnnounceModule = {
26
+ id: 'skill-mirror-announce',
27
+ source: 'prompt',
28
+ dependsOn: ['load-primer'], // references `greprag load` — the primer establishes it
29
+ detect: (_env) => ({ tier: 'silent' }), // announce-only
30
+ announce: (env) => buildSkillMirrorAnnounce(env.mirroredSkills),
31
+ reminder: () => null,
32
+ };
33
+ //# sourceMappingURL=skill-mirror-reminder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-mirror-reminder.js","sourceRoot":"","sources":["../../src/commands/skill-mirror-reminder.ts"],"names":[],"mappings":";AAAA;;;;;;;;kEAQkE;;;AAIlE,4DAWC;AAXD,SAAgB,wBAAwB,CACtC,CAAiD;IAEjD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,OAAO;QACL,qBAAqB,CAAC,CAAC,KAAK,mFAAmF,MAAM,GAAG,IAAI,IAAI;QAChI,uFAAuF;cACrF,wEAAwE;KAC3E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAEY,QAAA,yBAAyB,GAAmB;IACvD,EAAE,EAAE,uBAAuB;IAC3B,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,wDAAwD;IACpF,MAAM,EAAE,CAAC,IAAiB,EAAa,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,gBAAgB;IAChF,QAAQ,EAAE,CAAC,GAAgB,EAAiB,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,cAAc,CAAC;IAC3F,QAAQ,EAAE,GAAkB,EAAE,CAAC,IAAI;CACpC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** greprag skillgain — the Skill Learning Loop's operator/agent verbs
2
+ * (docs/skill-learning-loop.md). The landing leg auto-lands reference gains;
3
+ * rule/scope PROPOSALS park at the operator gate and are resolved here:
4
+ *
5
+ * skillgain list pending gains for this project (all types)
6
+ * skillgain done <8hex> the proposal was applied to the skill (per
7
+ * skill-fix-conventions, diff shown + accepted)
8
+ * skillgain reject <8hex> the proposal was bogus — never show it again
9
+ *
10
+ * Thin client over /v1/skillgain; project resolved from cwd like every
11
+ * other command. Self-contained dispatcher + body (the CLI command pattern). */
12
+ export declare function runSkillGain(args: string[]): Promise<void>;
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /** greprag skillgain — the Skill Learning Loop's operator/agent verbs
3
+ * (docs/skill-learning-loop.md). The landing leg auto-lands reference gains;
4
+ * rule/scope PROPOSALS park at the operator gate and are resolved here:
5
+ *
6
+ * skillgain list pending gains for this project (all types)
7
+ * skillgain done <8hex> the proposal was applied to the skill (per
8
+ * skill-fix-conventions, diff shown + accepted)
9
+ * skillgain reject <8hex> the proposal was bogus — never show it again
10
+ *
11
+ * Thin client over /v1/skillgain; project resolved from cwd like every
12
+ * other command. Self-contained dispatcher + body (the CLI command pattern). */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.runSkillGain = runSkillGain;
15
+ const project_anchor_1 = require("../project-anchor");
16
+ const skill_landing_1 = require("../skill-landing");
17
+ function getConfig() {
18
+ return {
19
+ apiUrl: process.env.GREPRAG_API_URL || 'https://api.greprag.com',
20
+ apiKey: process.env.GREPRAG_API_KEY || '',
21
+ };
22
+ }
23
+ const HELP = `greprag skillgain — Skill Learning Loop queue (docs/skill-learning-loop.md)
24
+
25
+ USAGE
26
+ greprag skillgain list Pending gains for this project (not yet landed).
27
+ greprag skillgain reject <8hex> The UNDO: mark a gain bogus AND remove its
28
+ landed artifacts (the fuse line in SKILL.md
29
+ + the docs/learned/<slug>.md doc).
30
+ greprag skillgain done <8hex> Manually mark a pending gain resolved
31
+ (rarely needed — landing is automatic and a
32
+ digested fuse needs no marking).
33
+
34
+ Gains land automatically at session start as a briefcase (fuse line + focused
35
+ doc) and SELF-APPLY on the skill's next invocation.`;
36
+ async function runSkillGain(args) {
37
+ const sub = args[0];
38
+ const cfg = getConfig();
39
+ if (!cfg.apiKey) {
40
+ console.error('GREPRAG_API_KEY not set — run `greprag init` first.');
41
+ process.exit(1);
42
+ }
43
+ const anchor = (0, project_anchor_1.readAnchor)(process.cwd());
44
+ if (sub === 'list') {
45
+ const res = await fetch(`${cfg.apiUrl}/v1/skillgain/${anchor.projectId}/pending`, {
46
+ headers: { 'Authorization': `Bearer ${cfg.apiKey}` },
47
+ });
48
+ if (!res.ok) {
49
+ console.error(`API ${res.status}`);
50
+ process.exit(1);
51
+ }
52
+ const data = await res.json();
53
+ const gains = data.gains || [];
54
+ if (gains.length === 0) {
55
+ console.log('No pending skill gains.');
56
+ return;
57
+ }
58
+ for (const g of gains) {
59
+ console.log(`[${g.nodeId}] ${g.skill} · ${g.gainType}\n ${g.text}`);
60
+ }
61
+ return;
62
+ }
63
+ if (sub === 'done' || sub === 'reject') {
64
+ const nodeId = (args[1] || '').toLowerCase();
65
+ if (!/^[0-9a-f]{8}$/.test(nodeId)) {
66
+ console.error(`Usage: greprag skillgain ${sub} <8hex>`);
67
+ process.exit(1);
68
+ }
69
+ const status = sub === 'done' ? 'landed' : 'rejected';
70
+ const res = await fetch(`${cfg.apiUrl}/v1/skillgain/${anchor.projectId}/status`, {
71
+ method: 'POST',
72
+ headers: { 'Authorization': `Bearer ${cfg.apiKey}`, 'Content-Type': 'application/json' },
73
+ body: JSON.stringify({
74
+ projectName: anchor.projectName,
75
+ updates: [{ nodeId, status }],
76
+ }),
77
+ });
78
+ if (!res.ok) {
79
+ console.error(`API ${res.status}`);
80
+ process.exit(1);
81
+ }
82
+ const data = await res.json();
83
+ if ((data.updated || 0) === 0) {
84
+ console.error(`[${nodeId}] not found in ${anchor.projectName}'s skillgain queue.`);
85
+ process.exit(1);
86
+ }
87
+ console.log(`[${nodeId}] → ${status}`);
88
+ // Reject is the UNDO: also remove any landed artifacts (the fuse line in
89
+ // SKILL.md + the docs/learned/<slug>.md doc). Skill name via the record.
90
+ if (sub === 'reject') {
91
+ try {
92
+ const gr = await fetch(`${cfg.apiUrl}/v1/skillgain/${anchor.projectId}/gain/${nodeId}`, { headers: { 'Authorization': `Bearer ${cfg.apiKey}` } });
93
+ if (gr.ok) {
94
+ const gd = await gr.json();
95
+ if (gd.gain?.skill) {
96
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
97
+ const removed = (0, skill_landing_1.removeLandedGain)(gd.gain.skill, nodeId, process.cwd(), homeDir);
98
+ if (removed)
99
+ console.log(` removed landed artifacts from ${gd.gain.skill}`);
100
+ }
101
+ }
102
+ }
103
+ catch { /* best-effort — the stamp makes manual cleanup findable */ }
104
+ }
105
+ return;
106
+ }
107
+ console.log(HELP);
108
+ }
109
+ //# sourceMappingURL=skillgain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillgain.js","sourceRoot":"","sources":["../../src/commands/skillgain.ts"],"names":[],"mappings":"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"}