@jabworks/condux 0.13.1 → 0.13.3
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jabworks/condux",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.3",
|
|
4
4
|
"description": "OpenCode plugin for the condux workflow toolkit — bundles the condux skills and injects the specialist agents (coder, explorer, planner, researcher) plus an opt-in plan-review listener.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -172,6 +172,24 @@ function gitRoot() {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
+
// Write atomically. A plain writeFileSync is open(O_CREAT|O_TRUNC) then write()
|
|
176
|
+
// — two syscalls — so any reader polling for the file can win the gap and see a
|
|
177
|
+
// created, still-empty file. Writing a sibling temp and rename()-ing it into
|
|
178
|
+
// place is atomic on POSIX: readers see either the old file or the complete new
|
|
179
|
+
// one, never a truncated one. Same directory so the rename never crosses a
|
|
180
|
+
// filesystem. If rename is unavailable (some Windows AV/lock cases), fall back
|
|
181
|
+
// to the direct write rather than losing the feedback.
|
|
182
|
+
function writeFileAtomic(file, data) {
|
|
183
|
+
const tmp = file + '.' + process.pid + '.tmp';
|
|
184
|
+
try {
|
|
185
|
+
fs.writeFileSync(tmp, data);
|
|
186
|
+
fs.renameSync(tmp, file);
|
|
187
|
+
} catch (e) {
|
|
188
|
+
try { fs.rmSync(tmp, { force: true }); } catch (e2) { /* nothing to clean */ }
|
|
189
|
+
fs.writeFileSync(file, data);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
175
193
|
function feedbackMarkdown(decision, thread) {
|
|
176
194
|
const lines = ['# Plan Review Feedback', '',
|
|
177
195
|
'- **Decision:** ' + decision,
|
|
@@ -262,7 +280,7 @@ function resolveDecision(decision, thread) {
|
|
|
262
280
|
// browser tab live-reloads when the agent revises the plan on disk. On a
|
|
263
281
|
// terminal decision (Approve/Reject) the review is over, so we exit after the
|
|
264
282
|
// response flushes; on "Request Revisions" we keep serving the next round.
|
|
265
|
-
|
|
283
|
+
writeFileAtomic(feedbackFile, md);
|
|
266
284
|
const payload = { decision: decision, feedback: md, feedbackFile: feedbackFile };
|
|
267
285
|
if (decisionWaiter) {
|
|
268
286
|
try { decisionWaiter.writeHead(200, { 'Content-Type': 'application/json' }); decisionWaiter.end(JSON.stringify(payload)); } catch (e) { /* client gone */ }
|
|
@@ -276,7 +294,7 @@ function resolveDecision(decision, thread) {
|
|
|
276
294
|
setTimeout(function () { process.exit(0); }, 400);
|
|
277
295
|
}
|
|
278
296
|
} else {
|
|
279
|
-
|
|
297
|
+
writeFileAtomic(feedbackFile, md);
|
|
280
298
|
log('\n[PLAN-REVIEW FEEDBACK -> ' + feedbackFile + ']\n' + md + '\n');
|
|
281
299
|
}
|
|
282
300
|
}
|
|
@@ -39,6 +39,16 @@
|
|
|
39
39
|
--info: #70b8ff;
|
|
40
40
|
--info-muted: #0d2847;
|
|
41
41
|
--info-border: #104d87;
|
|
42
|
+
/* categorical — series identity; neither the accent nor the semantics */
|
|
43
|
+
--cat-1: #cf686e;
|
|
44
|
+
--cat-2: #897ed6;
|
|
45
|
+
--cat-3: #41a265;
|
|
46
|
+
--cat-4: #3694d4;
|
|
47
|
+
--cat-5: #94911b;
|
|
48
|
+
--cat-6: #ba6cae;
|
|
49
|
+
--cat-7: #c37827;
|
|
50
|
+
--cat-8: #00a0a4;
|
|
51
|
+
--cat-other: #686560;
|
|
42
52
|
--outline: rgba(237, 237, 236, 0.08);
|
|
43
53
|
--subtle: #686560;
|
|
44
54
|
--shadow-sm: 0 1px 2px rgba(6, 6, 5, 0.5);
|
|
@@ -112,6 +122,15 @@
|
|
|
112
122
|
--info: #3f6fa6;
|
|
113
123
|
--info-muted: #e6f1fc;
|
|
114
124
|
--info-border: #bed7ef;
|
|
125
|
+
--cat-1: #b04d54;
|
|
126
|
+
--cat-2: #6f63b8;
|
|
127
|
+
--cat-3: #1e874b;
|
|
128
|
+
--cat-4: #0a78b7;
|
|
129
|
+
--cat-5: #797600;
|
|
130
|
+
--cat-6: #9d5192;
|
|
131
|
+
--cat-7: #a45e00;
|
|
132
|
+
--cat-8: #008f93;
|
|
133
|
+
--cat-other: #a8a294;
|
|
115
134
|
--outline: rgba(54, 48, 42, 0.08);
|
|
116
135
|
--subtle: #a8a294;
|
|
117
136
|
--shadow-sm: 0 1px 2px rgba(54, 48, 42, 0.1);
|
|
@@ -148,6 +167,15 @@
|
|
|
148
167
|
--info: #3f6fa6;
|
|
149
168
|
--info-muted: #e6f1fc;
|
|
150
169
|
--info-border: #bed7ef;
|
|
170
|
+
--cat-1: #b04d54;
|
|
171
|
+
--cat-2: #6f63b8;
|
|
172
|
+
--cat-3: #1e874b;
|
|
173
|
+
--cat-4: #0a78b7;
|
|
174
|
+
--cat-5: #797600;
|
|
175
|
+
--cat-6: #9d5192;
|
|
176
|
+
--cat-7: #a45e00;
|
|
177
|
+
--cat-8: #008f93;
|
|
178
|
+
--cat-other: #a8a294;
|
|
151
179
|
--outline: rgba(54, 48, 42, 0.08);
|
|
152
180
|
--subtle: #a8a294;
|
|
153
181
|
--shadow-sm: 0 1px 2px rgba(54, 48, 42, 0.1);
|