@gowelle/stint-agent 1.2.35 → 1.2.36
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 +31 -4
- package/dist/{StatusDashboard-N3HF2TD3.js → StatusDashboard-VOOOQA7A.js} +104 -24
- package/dist/api-6KY43TBB.js +7 -0
- package/dist/{chunk-MISINEGG.js → chunk-BYBGWAQO.js} +254 -94
- package/dist/{chunk-RC7Z6GTK.js → chunk-E3WNZ2CK.js} +34 -3
- package/dist/{chunk-4655SBXG.js → chunk-KHLFCZRY.js} +45 -12
- package/dist/{chunk-H5GHDNXY.js → chunk-VE7Z43P7.js} +67 -20
- package/dist/daemon/runner.js +113 -51
- package/dist/index.js +714 -316
- package/package.json +1 -1
- package/dist/api-Z3HF3YU7.js +0 -7
package/README.md
CHANGED
|
@@ -141,18 +141,45 @@ stint status
|
|
|
141
141
|
|
|
142
142
|
### Desktop Notifications
|
|
143
143
|
|
|
144
|
-
The daemon sends desktop notifications for important events
|
|
144
|
+
The daemon sends desktop notifications for important events. Notifications can be controlled globally or per-category.
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
#### Notification Categories
|
|
147
|
+
|
|
148
|
+
| Category | Events | Default |
|
|
149
|
+
| ------------- | --------------------------------------------- | ------- |
|
|
150
|
+
| `commits` | Commit approved, pending, pushed, failed | ✅ On |
|
|
151
|
+
| `sync` | Sync requested, project updated | ❌ Off |
|
|
152
|
+
| `suggestions` | New AI suggestions | ✅ On |
|
|
153
|
+
|
|
154
|
+
> **Note:** `sync` is disabled by default because these events fire frequently during active development.
|
|
155
|
+
|
|
156
|
+
#### Toggle All Notifications
|
|
147
157
|
|
|
148
158
|
```bash
|
|
159
|
+
# Disable all notifications
|
|
149
160
|
stint config set notifications.enabled false
|
|
161
|
+
|
|
162
|
+
# Enable all notifications
|
|
163
|
+
stint config set notifications.enabled true
|
|
150
164
|
```
|
|
151
165
|
|
|
152
|
-
|
|
166
|
+
#### Toggle by Category
|
|
153
167
|
|
|
154
168
|
```bash
|
|
155
|
-
|
|
169
|
+
# Disable sync notifications (noisy during development)
|
|
170
|
+
stint config set notifications.sync false
|
|
171
|
+
|
|
172
|
+
# Enable commit notifications
|
|
173
|
+
stint config set notifications.commits true
|
|
174
|
+
|
|
175
|
+
# Disable suggestion notifications
|
|
176
|
+
stint config set notifications.suggestions false
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
#### View Current Settings
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
stint config list
|
|
156
183
|
```
|
|
157
184
|
|
|
158
185
|
> **Note:** Events are still logged even when notifications are disabled.
|
|
@@ -2,10 +2,10 @@ import {
|
|
|
2
2
|
gitService,
|
|
3
3
|
projectService,
|
|
4
4
|
validatePidFile
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-KHLFCZRY.js";
|
|
6
6
|
import {
|
|
7
7
|
authService
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-E3WNZ2CK.js";
|
|
9
9
|
|
|
10
10
|
// src/components/StatusDashboard.tsx
|
|
11
11
|
import { useState, useEffect } from "react";
|
|
@@ -14,7 +14,11 @@ import { Box as Box3, Text as Text3, useApp, useInput } from "ink";
|
|
|
14
14
|
// src/components/Panel.tsx
|
|
15
15
|
import { Box, Text } from "ink";
|
|
16
16
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
-
function Panel({
|
|
17
|
+
function Panel({
|
|
18
|
+
title,
|
|
19
|
+
icon,
|
|
20
|
+
children
|
|
21
|
+
}) {
|
|
18
22
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
|
|
19
23
|
/* @__PURE__ */ jsxs(Text, { color: "blue", children: [
|
|
20
24
|
icon ? `${icon} ` : "",
|
|
@@ -29,7 +33,11 @@ function Panel({ title, icon, children }) {
|
|
|
29
33
|
// src/components/StatusRow.tsx
|
|
30
34
|
import { Box as Box2, Text as Text2 } from "ink";
|
|
31
35
|
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
32
|
-
function StatusRow({
|
|
36
|
+
function StatusRow({
|
|
37
|
+
label,
|
|
38
|
+
value,
|
|
39
|
+
labelWidth = 12
|
|
40
|
+
}) {
|
|
33
41
|
return /* @__PURE__ */ jsxs2(Box2, { children: [
|
|
34
42
|
/* @__PURE__ */ jsx2(Text2, { bold: true, children: label.padEnd(labelWidth) }),
|
|
35
43
|
typeof value === "string" ? /* @__PURE__ */ jsx2(Text2, { children: value }) : value
|
|
@@ -38,7 +46,9 @@ function StatusRow({ label, value, labelWidth = 12 }) {
|
|
|
38
46
|
|
|
39
47
|
// src/components/StatusDashboard.tsx
|
|
40
48
|
import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
41
|
-
function StatusDashboard({
|
|
49
|
+
function StatusDashboard({
|
|
50
|
+
cwd
|
|
51
|
+
}) {
|
|
42
52
|
const { exit } = useApp();
|
|
43
53
|
const [state, setState] = useState({
|
|
44
54
|
linkedProject: null,
|
|
@@ -101,12 +111,22 @@ function StatusDashboard({ cwd }) {
|
|
|
101
111
|
setShowHelp((prev) => !prev);
|
|
102
112
|
}
|
|
103
113
|
});
|
|
104
|
-
const {
|
|
114
|
+
const {
|
|
115
|
+
linkedProject,
|
|
116
|
+
repoInfo,
|
|
117
|
+
user,
|
|
118
|
+
daemonRunning,
|
|
119
|
+
daemonPid,
|
|
120
|
+
isRepo,
|
|
121
|
+
loading,
|
|
122
|
+
lastRefresh,
|
|
123
|
+
error
|
|
124
|
+
} = state;
|
|
105
125
|
return /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", padding: 1, children: [
|
|
106
126
|
/* @__PURE__ */ jsx3(Box3, { marginBottom: 1, children: /* @__PURE__ */ jsx3(Text3, { bold: true, color: "cyan", children: "\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E" }) }),
|
|
107
127
|
/* @__PURE__ */ jsxs3(Box3, { marginBottom: 1, children: [
|
|
108
128
|
/* @__PURE__ */ jsx3(Text3, { bold: true, color: "cyan", children: "\u2502" }),
|
|
109
|
-
/* @__PURE__ */ jsx3(Text3, { bold: true, children: "
|
|
129
|
+
/* @__PURE__ */ jsx3(Text3, { bold: true, children: " \u{1F4CA} Stint Status Dashboard " }),
|
|
110
130
|
/* @__PURE__ */ jsx3(Text3, { bold: true, color: "cyan", children: "\u2502" })
|
|
111
131
|
] }),
|
|
112
132
|
/* @__PURE__ */ jsx3(Box3, { marginBottom: 1, children: /* @__PURE__ */ jsx3(Text3, { bold: true, color: "cyan", children: "\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F" }) }),
|
|
@@ -116,16 +136,46 @@ function StatusDashboard({ cwd }) {
|
|
|
116
136
|
] }) }),
|
|
117
137
|
loading && /* @__PURE__ */ jsx3(Box3, { marginBottom: 1, children: /* @__PURE__ */ jsx3(Text3, { color: "yellow", children: "\u27F3 Refreshing..." }) }),
|
|
118
138
|
/* @__PURE__ */ jsx3(Panel, { title: "Project Status", icon: "\u{1F4E6}", children: linkedProject ? /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
119
|
-
/* @__PURE__ */ jsx3(
|
|
139
|
+
/* @__PURE__ */ jsx3(
|
|
140
|
+
StatusRow,
|
|
141
|
+
{
|
|
142
|
+
label: "Status:",
|
|
143
|
+
value: /* @__PURE__ */ jsx3(Text3, { color: "green", children: "\u2713 Linked" })
|
|
144
|
+
}
|
|
145
|
+
),
|
|
120
146
|
/* @__PURE__ */ jsx3(StatusRow, { label: "Project ID:", value: linkedProject.projectId }),
|
|
121
|
-
/* @__PURE__ */ jsx3(
|
|
147
|
+
/* @__PURE__ */ jsx3(
|
|
148
|
+
StatusRow,
|
|
149
|
+
{
|
|
150
|
+
label: "Linked At:",
|
|
151
|
+
value: new Date(linkedProject.linkedAt).toLocaleString()
|
|
152
|
+
}
|
|
153
|
+
)
|
|
122
154
|
] }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
123
|
-
/* @__PURE__ */ jsx3(
|
|
155
|
+
/* @__PURE__ */ jsx3(
|
|
156
|
+
StatusRow,
|
|
157
|
+
{
|
|
158
|
+
label: "Status:",
|
|
159
|
+
value: /* @__PURE__ */ jsx3(Text3, { color: "yellow", children: "Not linked" })
|
|
160
|
+
}
|
|
161
|
+
),
|
|
124
162
|
/* @__PURE__ */ jsx3(Text3, { color: "gray", children: 'Run "stint link" to link this directory to a project.' })
|
|
125
163
|
] }) }),
|
|
126
164
|
/* @__PURE__ */ jsx3(Panel, { title: "Git Repository", icon: "\u{1F4C2}", children: isRepo && repoInfo ? /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
127
|
-
/* @__PURE__ */ jsx3(
|
|
128
|
-
|
|
165
|
+
/* @__PURE__ */ jsx3(
|
|
166
|
+
StatusRow,
|
|
167
|
+
{
|
|
168
|
+
label: "Branch:",
|
|
169
|
+
value: /* @__PURE__ */ jsx3(Text3, { color: "cyan", children: repoInfo.currentBranch })
|
|
170
|
+
}
|
|
171
|
+
),
|
|
172
|
+
/* @__PURE__ */ jsx3(
|
|
173
|
+
StatusRow,
|
|
174
|
+
{
|
|
175
|
+
label: "Remote:",
|
|
176
|
+
value: repoInfo.remoteUrl || /* @__PURE__ */ jsx3(Text3, { color: "gray", children: "None" })
|
|
177
|
+
}
|
|
178
|
+
),
|
|
129
179
|
/* @__PURE__ */ jsx3(
|
|
130
180
|
StatusRow,
|
|
131
181
|
{
|
|
@@ -136,18 +186,42 @@ function StatusDashboard({ cwd }) {
|
|
|
136
186
|
renderGitChanges(repoInfo)
|
|
137
187
|
] }) : /* @__PURE__ */ jsx3(Text3, { color: "yellow", children: "Not a git repository" }) }),
|
|
138
188
|
/* @__PURE__ */ jsx3(Panel, { title: "Authentication", icon: "\u{1F510}", children: user ? /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
139
|
-
/* @__PURE__ */ jsx3(
|
|
189
|
+
/* @__PURE__ */ jsx3(
|
|
190
|
+
StatusRow,
|
|
191
|
+
{
|
|
192
|
+
label: "Status:",
|
|
193
|
+
value: /* @__PURE__ */ jsx3(Text3, { color: "green", children: "\u2713 Authenticated" })
|
|
194
|
+
}
|
|
195
|
+
),
|
|
140
196
|
/* @__PURE__ */ jsx3(StatusRow, { label: "User:", value: `${user.name} (${user.email})` }),
|
|
141
197
|
/* @__PURE__ */ jsx3(StatusRow, { label: "Machine:", value: authService.getMachineName() })
|
|
142
198
|
] }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
143
|
-
/* @__PURE__ */ jsx3(
|
|
199
|
+
/* @__PURE__ */ jsx3(
|
|
200
|
+
StatusRow,
|
|
201
|
+
{
|
|
202
|
+
label: "Status:",
|
|
203
|
+
value: /* @__PURE__ */ jsx3(Text3, { color: "yellow", children: "Not logged in" })
|
|
204
|
+
}
|
|
205
|
+
),
|
|
144
206
|
/* @__PURE__ */ jsx3(Text3, { color: "gray", children: 'Run "stint login" to authenticate.' })
|
|
145
207
|
] }) }),
|
|
146
208
|
/* @__PURE__ */ jsx3(Panel, { title: "Daemon", icon: "\u2699\uFE0F", children: daemonRunning ? /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
147
|
-
/* @__PURE__ */ jsx3(
|
|
209
|
+
/* @__PURE__ */ jsx3(
|
|
210
|
+
StatusRow,
|
|
211
|
+
{
|
|
212
|
+
label: "Status:",
|
|
213
|
+
value: /* @__PURE__ */ jsx3(Text3, { color: "green", children: "\u2713 Running" })
|
|
214
|
+
}
|
|
215
|
+
),
|
|
148
216
|
/* @__PURE__ */ jsx3(StatusRow, { label: "PID:", value: String(daemonPid) })
|
|
149
217
|
] }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
150
|
-
/* @__PURE__ */ jsx3(
|
|
218
|
+
/* @__PURE__ */ jsx3(
|
|
219
|
+
StatusRow,
|
|
220
|
+
{
|
|
221
|
+
label: "Status:",
|
|
222
|
+
value: /* @__PURE__ */ jsx3(Text3, { color: "yellow", children: "Not running" })
|
|
223
|
+
}
|
|
224
|
+
),
|
|
151
225
|
/* @__PURE__ */ jsx3(Text3, { color: "gray", children: 'Run "stint daemon start" to start the background agent.' })
|
|
152
226
|
] }) }),
|
|
153
227
|
/* @__PURE__ */ jsxs3(Box3, { marginTop: 1, flexDirection: "column", children: [
|
|
@@ -161,9 +235,9 @@ function StatusDashboard({ cwd }) {
|
|
|
161
235
|
] }),
|
|
162
236
|
/* @__PURE__ */ jsxs3(Box3, { marginTop: 1, children: [
|
|
163
237
|
/* @__PURE__ */ jsx3(Text3, { color: "cyan", children: "[q]" }),
|
|
164
|
-
/* @__PURE__ */ jsx3(Text3, { children: " Quit
|
|
238
|
+
/* @__PURE__ */ jsx3(Text3, { children: " Quit " }),
|
|
165
239
|
/* @__PURE__ */ jsx3(Text3, { color: "cyan", children: "[r]" }),
|
|
166
|
-
/* @__PURE__ */ jsx3(Text3, { children: " Refresh
|
|
240
|
+
/* @__PURE__ */ jsx3(Text3, { children: " Refresh " }),
|
|
167
241
|
/* @__PURE__ */ jsx3(Text3, { color: "cyan", children: "[?]" }),
|
|
168
242
|
/* @__PURE__ */ jsx3(Text3, { children: " Help" })
|
|
169
243
|
] })
|
|
@@ -178,9 +252,9 @@ function StatusDashboard({ cwd }) {
|
|
|
178
252
|
padding: 1,
|
|
179
253
|
children: [
|
|
180
254
|
/* @__PURE__ */ jsx3(Text3, { bold: true, color: "cyan", children: "Keyboard Shortcuts" }),
|
|
181
|
-
/* @__PURE__ */ jsx3(Text3, { children: "
|
|
182
|
-
/* @__PURE__ */ jsx3(Text3, { children: "
|
|
183
|
-
/* @__PURE__ */ jsx3(Text3, { children: "
|
|
255
|
+
/* @__PURE__ */ jsx3(Text3, { children: " q, Esc - Exit dashboard" }),
|
|
256
|
+
/* @__PURE__ */ jsx3(Text3, { children: " r - Refresh status immediately" }),
|
|
257
|
+
/* @__PURE__ */ jsx3(Text3, { children: " ? - Toggle this help" })
|
|
184
258
|
]
|
|
185
259
|
}
|
|
186
260
|
)
|
|
@@ -202,18 +276,24 @@ function renderGitChanges(repoInfo) {
|
|
|
202
276
|
}
|
|
203
277
|
),
|
|
204
278
|
staged.length > 0 && /* @__PURE__ */ jsx3(Box3, { paddingLeft: 2, children: /* @__PURE__ */ jsxs3(Text3, { color: "green", children: [
|
|
205
|
-
"Staged:
|
|
279
|
+
"Staged: ",
|
|
206
280
|
staged.length
|
|
207
281
|
] }) }),
|
|
208
282
|
unstaged.length > 0 && /* @__PURE__ */ jsx3(Box3, { paddingLeft: 2, children: /* @__PURE__ */ jsxs3(Text3, { color: "yellow", children: [
|
|
209
|
-
"Unstaged:
|
|
283
|
+
"Unstaged: ",
|
|
210
284
|
unstaged.length
|
|
211
285
|
] }) }),
|
|
212
286
|
untracked.length > 0 && /* @__PURE__ */ jsx3(Box3, { paddingLeft: 2, children: /* @__PURE__ */ jsxs3(Text3, { color: "gray", children: [
|
|
213
287
|
"Untracked: ",
|
|
214
288
|
untracked.length
|
|
215
289
|
] }) })
|
|
216
|
-
] }) : /* @__PURE__ */ jsx3(
|
|
290
|
+
] }) : /* @__PURE__ */ jsx3(
|
|
291
|
+
StatusRow,
|
|
292
|
+
{
|
|
293
|
+
label: "Changes:",
|
|
294
|
+
value: /* @__PURE__ */ jsx3(Text3, { color: "green", children: "Clean working tree" })
|
|
295
|
+
}
|
|
296
|
+
),
|
|
217
297
|
(ahead > 0 || behind > 0) && /* @__PURE__ */ jsx3(
|
|
218
298
|
StatusRow,
|
|
219
299
|
{
|