peaks-loop 4.0.15 → 4.0.17
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/CHANGELOG.md +82 -0
- package/README-en.md +12 -9
- package/README.md +15 -4
- package/config/eslint/.peaks-rules.cjs +47 -27
- package/dist/cli/commands/_register.js +4 -2
- package/dist/cli/commands/audit-commands.d.ts +1 -1
- package/dist/cli/commands/code-gate-command.d.ts +25 -0
- package/dist/cli/commands/code-gate-command.js +86 -0
- package/dist/cli/commands/code-mode-gate-commands.js +3 -4
- package/dist/cli/commands/code-orchestrator-can-do.js +2 -1
- package/dist/cli/commands/code-review-commands.d.ts +2 -30
- package/dist/cli/commands/code-review-commands.js +43 -65
- package/dist/cli/commands/cron-commands.js +16 -4
- package/dist/cli/commands/dashboard-long-run.js +8 -4
- package/dist/cli/commands/dispatch-from-dag.d.ts +1 -1
- package/dist/cli/commands/hooks-commands.js +56 -3
- package/dist/cli/commands/lint-commands.d.ts +21 -0
- package/dist/cli/commands/lint-commands.js +146 -0
- package/dist/cli/commands/qa-commands.js +1 -2
- package/dist/cli/commands/security-audit-commands.d.ts +1 -1
- package/dist/cli/commands/security-audit-commands.js +1 -1
- package/dist/cli/commands/sediment-commands.d.ts +1 -1
- package/dist/cli/commands/slice-commands.js +20 -8
- package/dist/cli/commands/statusline-commands.d.ts +1 -0
- package/dist/cli/commands/statusline-commands.js +17 -3
- package/dist/cli/commands/tech-commands.d.ts +1 -1
- package/dist/services/artifacts/request-artifact-service.d.ts +2 -2
- package/dist/services/artifacts/request-artifact-service.js +10 -1
- package/dist/services/audit/enforcers/lint-reference-shape.js +18 -4
- package/dist/services/code/auto-compact-orchestrator.js +9 -1
- package/dist/services/code/batch-heartbeat-poller.js +26 -0
- package/dist/services/code/orchestrator-can-do.d.ts +24 -0
- package/dist/services/code/orchestrator-can-do.js +48 -2
- package/dist/services/code/post-compact-detector.d.ts +1 -1
- package/dist/services/code-review/ecc-bridge.d.ts +2 -7
- package/dist/services/compact-statusline/compact-statusline-service.js +19 -11
- package/dist/services/config/config-service.d.ts +2 -19
- package/dist/services/config/config-service.js +2 -56
- package/dist/services/config/config-types.d.ts +4 -24
- package/dist/services/config/config-types.js +1 -10
- package/dist/services/container/container-lease.js +21 -8
- package/dist/services/context/spillover-store.d.ts +1 -1
- package/dist/services/crystallization/crystallization-types.js +20 -8
- package/dist/services/crystallization/evidence-brief-builder.js +22 -11
- package/dist/services/dispatch/dispatch-record-writer.js +231 -141
- package/dist/services/evolution/evolution-types.js +38 -21
- package/dist/services/feedback/feedback-promotion-service.js +9 -1
- package/dist/services/hooks/pre-tool-code-gate.d.ts +46 -0
- package/dist/services/hooks/pre-tool-code-gate.js +91 -0
- package/dist/services/ide/current-model-detector.js +1 -2
- package/dist/services/lint/detect-eslint.d.ts +10 -0
- package/dist/services/lint/detect-eslint.js +62 -0
- package/dist/services/lint/detect-ocr-18.d.ts +10 -0
- package/dist/services/lint/detect-ocr-18.js +40 -0
- package/dist/services/lint/eslint-runner.d.ts +57 -0
- package/dist/services/lint/eslint-runner.js +370 -0
- package/dist/services/lint/npx-resolver.d.ts +6 -0
- package/dist/services/lint/npx-resolver.js +47 -0
- package/dist/services/lint/ocr-multilang-adapter.d.ts +34 -0
- package/dist/services/lint/ocr-multilang-adapter.js +143 -0
- package/dist/services/loop/loop-release-types.js +32 -13
- package/dist/services/loop/spec-service.d.ts +7 -1
- package/dist/services/loop/spec-service.js +218 -182
- package/dist/services/rd/rd-service.js +22 -9
- package/dist/services/scan/archetype-service.js +21 -9
- package/dist/services/session/binding-store.js +1 -2
- package/dist/services/share/bundle-reader.d.ts +6 -9
- package/dist/services/share/bundle-reader.js +297 -223
- package/dist/services/skills/hooks-settings-service.d.ts +33 -0
- package/dist/services/skills/hooks-settings-service.js +27 -1
- package/dist/services/slice/calibration-store.js +21 -8
- package/dist/services/slice/slice-check-service.js +35 -14
- package/dist/services/slice/slice-decompose-service.js +459 -223
- package/dist/services/standards/project-context.js +135 -73
- package/dist/services/verdict/envelopes.d.ts +1 -2
- package/dist/services/verdict/envelopes.js +1 -2
- package/dist/services/verdict/verdict-aggregator.d.ts +1 -2
- package/dist/services/vm/vm-lease.js +19 -8
- package/dist/services/worktree/worktree-lease.d.ts +0 -10
- package/dist/services/worktree/worktree-lease.js +19 -8
- package/dist/shared/fs-utils.d.ts +1 -1
- package/package.json +8 -12
- package/skills/bee/peaks-rd/SKILL.md +1 -1
- package/skills/bee/peaks-rd/references/jsts-eslint-gate.md +197 -0
- package/skills/bee/peaks-rd/references/ocr-multilang-1.8.md +132 -0
- package/skills/bee/peaks-rd/references/parallel-review-fanout.md +1 -1
- package/skills/peaks-code/SKILL.md +47 -1
- package/dist/services/code-review/ocr-service.d.ts +0 -129
- package/dist/services/code-review/ocr-service.js +0 -372
- package/skills/bee/peaks-rd/references/ocr-integration.md +0 -229
|
@@ -4,15 +4,6 @@ import { CLI_VERSION } from 'peaks-loop-shared/version';
|
|
|
4
4
|
* file only carries `version` + empty `ocr.llm.*` placeholders.
|
|
5
5
|
*/
|
|
6
6
|
export const DEFAULT_CONFIG = {
|
|
7
|
-
version: CLI_VERSION
|
|
8
|
-
ocr: {
|
|
9
|
-
llm: {
|
|
10
|
-
url: '',
|
|
11
|
-
authToken: '',
|
|
12
|
-
model: '',
|
|
13
|
-
useAnthropic: false,
|
|
14
|
-
authHeader: 'authorization'
|
|
15
|
-
}
|
|
16
|
-
}
|
|
7
|
+
version: CLI_VERSION
|
|
17
8
|
};
|
|
18
9
|
export { isConfigV2 } from './config-migration.js';
|
|
@@ -30,13 +30,26 @@
|
|
|
30
30
|
import { randomBytes } from 'node:crypto';
|
|
31
31
|
import { posix as path } from 'node:path';
|
|
32
32
|
import { normalizePath } from '../../shared/path-utils.js';
|
|
33
|
+
/**
|
|
34
|
+
* PRD-002b slice 2 — lease-TTL primitives extracted so the
|
|
35
|
+
* no-magic-numbers rule stops flagging the minute/ms math.
|
|
36
|
+
*/
|
|
37
|
+
const MINUTES_PER_HOUR = 60;
|
|
38
|
+
const MS_PER_MINUTE = MINUTES_PER_HOUR * 1_000;
|
|
39
|
+
const LEASE_RD_TTL_MINUTES = 30;
|
|
40
|
+
const LEASE_QA_TTL_MINUTES = 15;
|
|
41
|
+
const LEASE_UI_TTL_MINUTES = MINUTES_PER_HOUR;
|
|
42
|
+
const LEASE_SC_TTL_MINUTES = 30;
|
|
43
|
+
const LEASE_PRD_TTL_MINUTES = 15;
|
|
44
|
+
const LEASE_GENERAL_TTL_MINUTES = 30;
|
|
45
|
+
const LEASE_ID_RANDOM_BYTES = 8;
|
|
33
46
|
export const DEFAULT_TTL_BY_ROLE = Object.freeze({
|
|
34
|
-
rd:
|
|
35
|
-
qa:
|
|
36
|
-
ui:
|
|
37
|
-
sc:
|
|
38
|
-
prd:
|
|
39
|
-
general:
|
|
47
|
+
rd: LEASE_RD_TTL_MINUTES * MS_PER_MINUTE,
|
|
48
|
+
qa: LEASE_QA_TTL_MINUTES * MS_PER_MINUTE,
|
|
49
|
+
ui: LEASE_UI_TTL_MINUTES * MS_PER_MINUTE,
|
|
50
|
+
sc: LEASE_SC_TTL_MINUTES * MS_PER_MINUTE,
|
|
51
|
+
prd: LEASE_PRD_TTL_MINUTES * MS_PER_MINUTE,
|
|
52
|
+
general: LEASE_GENERAL_TTL_MINUTES * MS_PER_MINUTE
|
|
40
53
|
});
|
|
41
54
|
export const DEFAULT_TTL_MS = DEFAULT_TTL_BY_ROLE.rd;
|
|
42
55
|
export function containerLeaseStoreDir(sessionRuntimeDir) {
|
|
@@ -47,12 +60,12 @@ export function containerLeaseFilePath(sessionRuntimeDir, leaseId) {
|
|
|
47
60
|
}
|
|
48
61
|
/** Pure: generate a 16-hex lease id (8 random bytes, hex-encoded). */
|
|
49
62
|
export function generateContainerLeaseId() {
|
|
50
|
-
return randomBytes(
|
|
63
|
+
return randomBytes(LEASE_ID_RANDOM_BYTES).toString('hex');
|
|
51
64
|
}
|
|
52
65
|
export function ttlForContainerRole(role) {
|
|
53
66
|
const normalized = role.toLowerCase();
|
|
54
67
|
const candidate = DEFAULT_TTL_BY_ROLE[normalized];
|
|
55
|
-
const fallback = DEFAULT_TTL_BY_ROLE['rd'] ??
|
|
68
|
+
const fallback = DEFAULT_TTL_BY_ROLE['rd'] ?? LEASE_RD_TTL_MINUTES * MS_PER_MINUTE;
|
|
56
69
|
return candidate ?? fallback;
|
|
57
70
|
}
|
|
58
71
|
export function finalizeContainerLease(draft) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SpillId, type SpillOptions, type SpillRecord, type SpillState } from './spillover-types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Defense-in-depth: assert the given path is NOT a symbolic link.
|
|
4
4
|
*
|
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
/* ---------------------------------------------------------------------- */
|
|
3
|
+
/* PRD-002b slice 2 — schema-limit constants extracted from inline */
|
|
4
|
+
/* `.max(N)` / `.length(N)` calls so the no-magic-numbers rule stops */
|
|
5
|
+
/* flagging the constraint values. Names describe the field, not the */
|
|
6
|
+
/* number. Bytewise-identical to the original literals. */
|
|
7
|
+
/* ---------------------------------------------------------------------- */
|
|
8
|
+
const CRYS_BRIEF_SECTION_MAX = 4000;
|
|
9
|
+
const CRYS_EVIDENCE_BULLET_MAX = 1000;
|
|
10
|
+
const CRYS_TRACE_POINTER_MAX = 256;
|
|
11
|
+
const CRYS_LOOP_ID_MAX = 64;
|
|
12
|
+
const CRYS_BEE_ID_MAX_I32 = 2 ** 31 - 1;
|
|
13
|
+
const CRYS_EVENT_ID_MAX = 128;
|
|
2
14
|
/**
|
|
3
15
|
* CrystallizationEvent — spec §4.5 / §4.7 / §5.
|
|
4
16
|
*
|
|
@@ -71,7 +83,7 @@ const BriefSectionSchema = z
|
|
|
71
83
|
.string()
|
|
72
84
|
.trim()
|
|
73
85
|
.min(1, "brief section must be non-empty natural language")
|
|
74
|
-
.max(
|
|
86
|
+
.max(CRYS_BRIEF_SECTION_MAX);
|
|
75
87
|
/**
|
|
76
88
|
* EvidenceBrief — the 4-section brief (spec §4.7).
|
|
77
89
|
*
|
|
@@ -138,7 +150,7 @@ export function hasAllFourBriefSections(brief) {
|
|
|
138
150
|
const OptionalLoopId = z
|
|
139
151
|
.string()
|
|
140
152
|
.min(1)
|
|
141
|
-
.max(
|
|
153
|
+
.max(CRYS_LOOP_ID_MAX)
|
|
142
154
|
.regex(/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/, {
|
|
143
155
|
message: "loop_release_id must be kebab-case starting with a lowercase letter",
|
|
144
156
|
})
|
|
@@ -147,7 +159,7 @@ const OptionalBeeId = z
|
|
|
147
159
|
.number()
|
|
148
160
|
.int()
|
|
149
161
|
.positive()
|
|
150
|
-
.max(
|
|
162
|
+
.max(CRYS_BEE_ID_MAX_I32, "bee_release_id out of 32-bit range")
|
|
151
163
|
.optional();
|
|
152
164
|
/**
|
|
153
165
|
* Zod schema for the create payload (CrystallizationEventInput).
|
|
@@ -161,20 +173,20 @@ export const CrystallizationEventInputSchema = z.object({
|
|
|
161
173
|
trigger: CrystallizationTriggerSchema,
|
|
162
174
|
evidence_brief: EvidenceBriefSchema,
|
|
163
175
|
evidence_bullets: z
|
|
164
|
-
.array(z.string().trim().min(1).max(
|
|
176
|
+
.array(z.string().trim().min(1).max(CRYS_EVIDENCE_BULLET_MAX))
|
|
165
177
|
.default([]),
|
|
166
178
|
source_trace_pointers: z
|
|
167
|
-
.array(z.string().trim().min(1).max(
|
|
179
|
+
.array(z.string().trim().min(1).max(CRYS_TRACE_POINTER_MAX))
|
|
168
180
|
.default([]),
|
|
169
181
|
evaluator_summary: z
|
|
170
182
|
.string()
|
|
171
183
|
.trim()
|
|
172
|
-
.max(
|
|
184
|
+
.max(CRYS_BRIEF_SECTION_MAX)
|
|
173
185
|
.default(""),
|
|
174
186
|
user_decision_summary: z
|
|
175
187
|
.string()
|
|
176
188
|
.trim()
|
|
177
|
-
.max(
|
|
189
|
+
.max(CRYS_BRIEF_SECTION_MAX)
|
|
178
190
|
.default(""),
|
|
179
191
|
created_loop_release_id: OptionalLoopId,
|
|
180
192
|
updated_loop_release_id: OptionalLoopId,
|
|
@@ -195,7 +207,7 @@ export const CrystallizationEventSchema = CrystallizationEventInputSchema.extend
|
|
|
195
207
|
id: z
|
|
196
208
|
.string()
|
|
197
209
|
.min(1)
|
|
198
|
-
.max(
|
|
210
|
+
.max(CRYS_EVENT_ID_MAX)
|
|
199
211
|
.regex(/^crys-[0-9a-f]{8,}$/, {
|
|
200
212
|
message: "id must start with 'crys-' followed by a hex suffix (spec §4.5)",
|
|
201
213
|
}),
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { EvidenceBriefSchema, } from "./crystallization-types.js";
|
|
3
|
+
/* ---------------------------------------------------------------------- */
|
|
4
|
+
/* PRD-002b slice 2 — schema-limit constants extracted from inline */
|
|
5
|
+
/* `.max(N)` calls so the no-magic-numbers rule stops flagging the */
|
|
6
|
+
/* constraint values. Bytewise-identical to the original literals. */
|
|
7
|
+
/* ---------------------------------------------------------------------- */
|
|
8
|
+
const BRIEF_TRACE_ID_MAX = 256;
|
|
9
|
+
const BRIEF_SECTION_TEXT_MAX = 4000;
|
|
10
|
+
const BRIEF_BULLET_MAX = 1000;
|
|
11
|
+
const BRIEF_TRACE_POINTER_MAX = 256;
|
|
12
|
+
const BRIEF_EVALUATOR_ONE_LINER_MAX = 1000;
|
|
13
|
+
const BRIEF_EVALUATOR_RISK_TAG_MAX = 200;
|
|
3
14
|
/**
|
|
4
15
|
* EvidenceBriefBuilder — spec §4.7 / §10 RL-7.
|
|
5
16
|
*
|
|
@@ -45,40 +56,40 @@ import { EvidenceBriefSchema, } from "./crystallization-types.js";
|
|
|
45
56
|
* editing every caller.
|
|
46
57
|
*/
|
|
47
58
|
export const BriefTraceInputSchema = z.object({
|
|
48
|
-
trace_id: z.string().trim().min(1).max(
|
|
59
|
+
trace_id: z.string().trim().min(1).max(BRIEF_TRACE_ID_MAX),
|
|
49
60
|
/**
|
|
50
61
|
* The full NL recap of the run. Required for what_happened.
|
|
51
62
|
* 1-2 sentences is the spec guidance; the builder does not
|
|
52
63
|
* truncate, but tests passing multi-paragraph input will be
|
|
53
64
|
* warned at the Zod boundary (max 4000 chars per section).
|
|
54
65
|
*/
|
|
55
|
-
what_happened: z.string().trim().min(1).max(
|
|
66
|
+
what_happened: z.string().trim().min(1).max(BRIEF_SECTION_TEXT_MAX),
|
|
56
67
|
/**
|
|
57
68
|
* The "why this matters" recap. Required for why_it_matters.
|
|
58
69
|
*/
|
|
59
|
-
why_it_matters: z.string().trim().min(1).max(
|
|
70
|
+
why_it_matters: z.string().trim().min(1).max(BRIEF_SECTION_TEXT_MAX),
|
|
60
71
|
/**
|
|
61
72
|
* Failure-mode and preference-extraction recap. Required for
|
|
62
73
|
* what_learned.
|
|
63
74
|
*/
|
|
64
|
-
what_learned: z.string().trim().min(1).max(
|
|
75
|
+
what_learned: z.string().trim().min(1).max(BRIEF_SECTION_TEXT_MAX),
|
|
65
76
|
/**
|
|
66
77
|
* The recommended action. Required for what_action (1
|
|
67
78
|
* sentence per spec).
|
|
68
79
|
*/
|
|
69
|
-
what_action: z.string().trim().min(1).max(
|
|
80
|
+
what_action: z.string().trim().min(1).max(BRIEF_SECTION_TEXT_MAX),
|
|
70
81
|
/**
|
|
71
82
|
* Optional structured bullets (e.g. "4 phases, 3 gates passed,
|
|
72
83
|
* 1 evaluator verdict"). Counts are allowed at this layer; the
|
|
73
84
|
* brief section is the NL primary (RL-7).
|
|
74
85
|
*/
|
|
75
|
-
bullets: z.array(z.string().trim().min(1).max(
|
|
86
|
+
bullets: z.array(z.string().trim().min(1).max(BRIEF_BULLET_MAX)).default([]),
|
|
76
87
|
/**
|
|
77
88
|
* Source trace ids backing the brief (the column on
|
|
78
89
|
* crystallization_event spec §4.5).
|
|
79
90
|
*/
|
|
80
91
|
source_trace_pointers: z
|
|
81
|
-
.array(z.string().trim().min(1).max(
|
|
92
|
+
.array(z.string().trim().min(1).max(BRIEF_TRACE_POINTER_MAX))
|
|
82
93
|
.default([]),
|
|
83
94
|
});
|
|
84
95
|
/**
|
|
@@ -88,17 +99,17 @@ export const BriefTraceInputSchema = z.object({
|
|
|
88
99
|
* flows into the recommendation envelope.
|
|
89
100
|
*/
|
|
90
101
|
export const EvaluatorSummarySchema = z.object({
|
|
91
|
-
one_liner: z.string().trim().max(
|
|
92
|
-
risk_tags: z.array(z.string().trim().min(1).max(
|
|
102
|
+
one_liner: z.string().trim().max(BRIEF_EVALUATOR_ONE_LINER_MAX).default(""),
|
|
103
|
+
risk_tags: z.array(z.string().trim().min(1).max(BRIEF_EVALUATOR_RISK_TAG_MAX)).default([]),
|
|
93
104
|
});
|
|
94
105
|
/* ---------------------------------------------------------------------- */
|
|
95
106
|
/* Recommendation envelope — the CLI renders this. */
|
|
96
107
|
/* ---------------------------------------------------------------------- */
|
|
97
108
|
export const RecommendationPayloadSchema = z.object({
|
|
98
109
|
brief: EvidenceBriefSchema,
|
|
99
|
-
bullets: z.array(z.string().trim().min(1).max(
|
|
110
|
+
bullets: z.array(z.string().trim().min(1).max(BRIEF_BULLET_MAX)).default([]),
|
|
100
111
|
source_trace_pointers: z
|
|
101
|
-
.array(z.string().trim().min(1).max(
|
|
112
|
+
.array(z.string().trim().min(1).max(BRIEF_TRACE_POINTER_MAX))
|
|
102
113
|
.default([]),
|
|
103
114
|
evaluator_summary: EvaluatorSummarySchema.default({
|
|
104
115
|
one_liner: "",
|