@mc1global/opencode-jarvis 0.12.0 → 0.13.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 (59) hide show
  1. package/dist/application/azure-sync/task-push-use-cases.d.ts.map +1 -1
  2. package/dist/application/azure-sync/task-push-use-cases.js +21 -3
  3. package/dist/application/azure-sync/task-push-use-cases.js.map +1 -1
  4. package/dist/application/config/config-service.d.ts +3 -1
  5. package/dist/application/config/config-service.d.ts.map +1 -1
  6. package/dist/application/config/config-service.js +4 -0
  7. package/dist/application/config/config-service.js.map +1 -1
  8. package/dist/application/wiki-feedback/poll-service.d.ts +56 -0
  9. package/dist/application/wiki-feedback/poll-service.d.ts.map +1 -0
  10. package/dist/application/wiki-feedback/poll-service.js +87 -0
  11. package/dist/application/wiki-feedback/poll-service.js.map +1 -0
  12. package/dist/application/wiki-feedback/use-cases.d.ts +115 -0
  13. package/dist/application/wiki-feedback/use-cases.d.ts.map +1 -0
  14. package/dist/application/wiki-feedback/use-cases.js +271 -0
  15. package/dist/application/wiki-feedback/use-cases.js.map +1 -0
  16. package/dist/domain/config/value-objects.d.ts +28 -1
  17. package/dist/domain/config/value-objects.d.ts.map +1 -1
  18. package/dist/domain/config/value-objects.js +10 -0
  19. package/dist/domain/config/value-objects.js.map +1 -1
  20. package/dist/domain/governance/policies.d.ts.map +1 -1
  21. package/dist/domain/governance/policies.js +41 -0
  22. package/dist/domain/governance/policies.js.map +1 -1
  23. package/dist/domain/wiki-feedback/entities.d.ts +101 -0
  24. package/dist/domain/wiki-feedback/entities.d.ts.map +1 -0
  25. package/dist/domain/wiki-feedback/entities.js +154 -0
  26. package/dist/domain/wiki-feedback/entities.js.map +1 -0
  27. package/dist/domain/wiki-feedback/index.d.ts +13 -0
  28. package/dist/domain/wiki-feedback/index.d.ts.map +1 -0
  29. package/dist/domain/wiki-feedback/index.js +11 -0
  30. package/dist/domain/wiki-feedback/index.js.map +1 -0
  31. package/dist/domain/wiki-feedback/ports.d.ts +47 -0
  32. package/dist/domain/wiki-feedback/ports.d.ts.map +1 -0
  33. package/dist/domain/wiki-feedback/ports.js +13 -0
  34. package/dist/domain/wiki-feedback/ports.js.map +1 -0
  35. package/dist/domain/wiki-feedback/repositories.d.ts +33 -0
  36. package/dist/domain/wiki-feedback/repositories.d.ts.map +1 -0
  37. package/dist/domain/wiki-feedback/repositories.js +12 -0
  38. package/dist/domain/wiki-feedback/repositories.js.map +1 -0
  39. package/dist/domain/wiki-feedback/value-objects.d.ts +74 -0
  40. package/dist/domain/wiki-feedback/value-objects.d.ts.map +1 -0
  41. package/dist/domain/wiki-feedback/value-objects.js +144 -0
  42. package/dist/domain/wiki-feedback/value-objects.js.map +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +46 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/infrastructure/wiki-feedback/azure-wiki-client.d.ts +36 -0
  47. package/dist/infrastructure/wiki-feedback/azure-wiki-client.d.ts.map +1 -0
  48. package/dist/infrastructure/wiki-feedback/azure-wiki-client.js +106 -0
  49. package/dist/infrastructure/wiki-feedback/azure-wiki-client.js.map +1 -0
  50. package/dist/infrastructure/wiki-feedback/sqlite-feedback-repository.d.ts +31 -0
  51. package/dist/infrastructure/wiki-feedback/sqlite-feedback-repository.d.ts.map +1 -0
  52. package/dist/infrastructure/wiki-feedback/sqlite-feedback-repository.js +149 -0
  53. package/dist/infrastructure/wiki-feedback/sqlite-feedback-repository.js.map +1 -0
  54. package/dist/tools/wiki-feedback-tools.d.ts +9 -0
  55. package/dist/tools/wiki-feedback-tools.d.ts.map +1 -0
  56. package/dist/tools/wiki-feedback-tools.js +189 -0
  57. package/dist/tools/wiki-feedback-tools.js.map +1 -0
  58. package/package.json +1 -1
  59. package/templates/agents-md.template.md +7 -2
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Wiki Feedback Tools — plugin tool definitions for wiki feedback operations.
3
+ *
4
+ * 5 tools: scan, list, triage, create-card, dismiss.
5
+ * Thin adapter layer — delegates to WikiFeedbackUseCases.
6
+ *
7
+ * SOLID: SRP — tool definitions only
8
+ * SOLID: DIP — depends on use case abstractions
9
+ */
10
+ import { tool } from "@opencode-ai/plugin";
11
+ const z = tool.schema;
12
+ // ── Result Formatting ─────────────────────────────────────────────────
13
+ function formatResult(result, formatter) {
14
+ if (!result.success)
15
+ return `ERROR: ${result.error}`;
16
+ return formatter(result.data);
17
+ }
18
+ function formatFeedbackItem(f) {
19
+ const lines = [
20
+ `Feedback: ${f.id} [${f.status}]`,
21
+ ` Comment: ${f.commentText.length > 120 ? f.commentText.substring(0, 117) + "..." : f.commentText}`,
22
+ ` Author: ${f.authorDisplayName} (${f.authorUniqueName})`,
23
+ ` Page: ${f.pagePath} (id=${f.pageId})`,
24
+ ` Comment Date: ${f.commentCreatedDate}`,
25
+ ` Detected: ${f.detectedAt}`,
26
+ ];
27
+ if (f.feedbackType !== null)
28
+ lines.push(` Type: ${f.feedbackType}`);
29
+ if (f.priority !== null)
30
+ lines.push(` Priority: ${f.priority}`);
31
+ if (f.cardId !== null)
32
+ lines.push(` Card: ${f.cardId}`);
33
+ if (f.dismissReason !== null)
34
+ lines.push(` Dismiss Reason: ${f.dismissReason}`);
35
+ if (f.triagedAt !== null)
36
+ lines.push(` Triaged: ${f.triagedAt}`);
37
+ if (f.resolvedAt !== null)
38
+ lines.push(` Resolved: ${f.resolvedAt}`);
39
+ return lines.join("\n");
40
+ }
41
+ // ── Tool Factory ──────────────────────────────────────────────────────
42
+ export function createWikiFeedbackTools(deps) {
43
+ const { useCases, pollService } = deps;
44
+ // ── wiki-feedback-scan ────────────────────────────────────────────
45
+ const feedbackScan = tool({
46
+ description: "Scan monitored wiki pages for new feedback comments. " +
47
+ "Detects new comments, filters auto-replies, and persists " +
48
+ "new WikiFeedbackItems. Also shows poll service status if running.",
49
+ args: {},
50
+ async execute() {
51
+ const result = await useCases.scan();
52
+ let output = formatResult(result, (scan) => {
53
+ const lines = [
54
+ `Scan complete:`,
55
+ ` Pages scanned: ${scan.pagesScanned}`,
56
+ ` New comments found: ${scan.newCommentsFound}`,
57
+ ` Existing skipped: ${scan.existingSkipped}`,
58
+ ` Auto-replies filtered: ${scan.autoRepliesFiltered}`,
59
+ ];
60
+ return lines.join("\n");
61
+ });
62
+ // Append poll service status if available
63
+ if (pollService) {
64
+ output += `\n\nPoll Service: ${pollService.running ? "running" : "stopped"}`;
65
+ output += ` | Polls: ${pollService.pollCount}`;
66
+ if (pollService.lastPollAt) {
67
+ output += ` | Last: ${pollService.lastPollAt}`;
68
+ }
69
+ }
70
+ return output;
71
+ },
72
+ });
73
+ // ── wiki-feedback-list ────────────────────────────────────────────
74
+ const feedbackList = tool({
75
+ description: "List wiki feedback items. Defaults to pending (untriaged) items. " +
76
+ "Optionally filter by status: pending, triaged, card_created, dismissed.",
77
+ args: {
78
+ status: z
79
+ .enum(["pending", "triaged", "card_created", "dismissed"])
80
+ .optional()
81
+ .describe("Filter by status (default: pending)"),
82
+ limit: z
83
+ .number()
84
+ .int()
85
+ .optional()
86
+ .describe("Max items to return (default: 50)"),
87
+ },
88
+ async execute(args) {
89
+ const limit = args.limit ?? 50;
90
+ if (args.status !== undefined) {
91
+ const result = await useCases.listByStatus(args.status, limit);
92
+ return formatResult(result, formatFeedbackList);
93
+ }
94
+ const result = await useCases.listPending(limit);
95
+ return formatResult(result, formatFeedbackList);
96
+ },
97
+ });
98
+ // ── wiki-feedback-triage ──────────────────────────────────────────
99
+ const feedbackTriage = tool({
100
+ description: "Triage a pending wiki feedback item: assign type and priority. " +
101
+ "Moves status from pending → triaged. " +
102
+ "Types: feature, bug, improvement, question, documentation. " +
103
+ "Priorities: high, medium, low.",
104
+ args: {
105
+ feedback_id: z.string().describe("Feedback ID (e.g., WF-001)"),
106
+ feedback_type: z
107
+ .enum(["feature", "bug", "improvement", "question", "documentation"])
108
+ .describe("Classification of the feedback"),
109
+ priority: z
110
+ .enum(["high", "medium", "low"])
111
+ .describe("Suggested priority for the resulting card"),
112
+ },
113
+ async execute(args) {
114
+ const result = await useCases.triage({
115
+ feedbackId: args.feedback_id,
116
+ feedbackType: args.feedback_type,
117
+ priority: args.priority,
118
+ });
119
+ return formatResult(result, formatFeedbackItem);
120
+ },
121
+ });
122
+ // ── wiki-feedback-create-card ─────────────────────────────────────
123
+ const feedbackCreateCard = tool({
124
+ description: "Create a kanban card from a triaged wiki feedback item. " +
125
+ "The feedback must be in triaged status. Optionally override " +
126
+ "title, description, and epic. Posts auto-reply on wiki if enabled.",
127
+ args: {
128
+ feedback_id: z.string().describe("Feedback ID (e.g., WF-001)"),
129
+ title: z
130
+ .string()
131
+ .optional()
132
+ .describe("Custom card title (auto-generated if omitted)"),
133
+ description: z
134
+ .string()
135
+ .optional()
136
+ .describe("Custom card description (auto-generated if omitted)"),
137
+ epic_id: z
138
+ .string()
139
+ .optional()
140
+ .describe("Epic ID to assign the card to (e.g., EP-001)"),
141
+ },
142
+ async execute(args) {
143
+ const result = await useCases.createCard({
144
+ feedbackId: args.feedback_id,
145
+ ...(args.title !== undefined ? { title: args.title } : {}),
146
+ ...(args.description !== undefined ? { description: args.description } : {}),
147
+ ...(args.epic_id !== undefined ? { epicId: args.epic_id } : {}),
148
+ });
149
+ return formatResult(result, (f) => {
150
+ const lines = [formatFeedbackItem(f)];
151
+ if (f.cardId) {
152
+ lines.push(`\nKanban card ${f.cardId} created successfully.`);
153
+ }
154
+ return lines.join("\n");
155
+ });
156
+ },
157
+ });
158
+ // ── wiki-feedback-dismiss ─────────────────────────────────────────
159
+ const feedbackDismiss = tool({
160
+ description: "Dismiss a wiki feedback item with a reason. " +
161
+ "Can dismiss from pending or triaged status. " +
162
+ "Use when the feedback is not actionable, duplicate, or irrelevant.",
163
+ args: {
164
+ feedback_id: z.string().describe("Feedback ID (e.g., WF-001)"),
165
+ reason: z.string().describe("Reason for dismissal"),
166
+ },
167
+ async execute(args) {
168
+ const result = await useCases.dismiss({
169
+ feedbackId: args.feedback_id,
170
+ reason: args.reason,
171
+ });
172
+ return formatResult(result, formatFeedbackItem);
173
+ },
174
+ });
175
+ return {
176
+ "wiki-feedback-scan": feedbackScan,
177
+ "wiki-feedback-list": feedbackList,
178
+ "wiki-feedback-triage": feedbackTriage,
179
+ "wiki-feedback-create-card": feedbackCreateCard,
180
+ "wiki-feedback-dismiss": feedbackDismiss,
181
+ };
182
+ }
183
+ // ─── List Formatter ───────────────────────────────────────────────────────────
184
+ function formatFeedbackList(items) {
185
+ if (items.length === 0)
186
+ return "No feedback items found.";
187
+ return items.map(formatFeedbackItem).join("\n---\n");
188
+ }
189
+ //# sourceMappingURL=wiki-feedback-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-feedback-tools.js","sourceRoot":"","sources":["../../src/tools/wiki-feedback-tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mc1global/opencode-jarvis",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "JARVIS Framework - OpenCode native plugin for multi-agent development with DDD architecture",
5
5
  "author": "Julio Fabio de O. Chagas <julio.fabio@mc1global.com>",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -57,6 +57,7 @@ snippets). The implementing agent decides those during the `doing` phase.
57
57
  - Read `.yaml/.yml` directly — use `data-yaml-get` tool
58
58
  - Read `.env`, `.pem`, `.key`, credentials files — blocked by governance
59
59
  - Run `git push --force` on main/master
60
+ - Push directly to `main`/`master` — use Epic branches (`epic/<id>-<slug>`) and merge via PR
60
61
  - Run `sqlite3` CLI — use repository methods
61
62
  - Create `TODO.md`, `PLAN.md`, or `ROADMAP.md` — use kanban tools
62
63
  - Bypass the kanban pipeline for trackable work
@@ -73,14 +74,14 @@ snippets). The implementing agent decides those during the `doing` phase.
73
74
  - Track context with sessions, TODOs, and notes
74
75
  - Meet all gate tasks before moving cards through review/tested/done
75
76
 
76
- ## Governance Policies (13 Runtime Enforced)
77
+ ## Governance Policies (14 Runtime Enforced)
77
78
 
78
79
  Governance policies are evaluated by the `tool.execute.before` hook on every
79
80
  tool invocation. Violations with `error` severity throw and block execution.
80
81
 
81
82
  Policy groups:
82
83
  - **File access** — Block direct CSV, YAML, env file reads (use specialized tools)
83
- - **Shell safety** — Block force push, direct SQLite CLI, warn on destructive ops
84
+ - **Shell safety** — Block force push, direct push to main/master, direct SQLite CLI, warn on destructive ops
84
85
  - **Security** — Block env dump, sensitive file reads, credential file access
85
86
  - **Pipeline** — Warn when running pipeline without linked card
86
87
  - **Kanban** — Require gate tasks before status transitions, warn on rapid transitions
@@ -160,6 +161,10 @@ search, table-read, table-update).
160
161
 
161
162
  ## Git Strategy
162
163
 
164
+ - **Epic branches** — Every Epic `in_progress` MUST have a dedicated branch: `epic/<epic-id>-<slug>`
165
+ - All cards within an Epic are committed to that branch
166
+ - Merge to `main` only via PR when Epic is complete
167
+ - Example: `epic/EP-012-branch-governance`
163
168
  - Work on feature branches (never commit directly to `main`)
164
169
  - Commit messages: imperative verb + summary + card reference
165
170
  - `Add feature X (CD-001)`