@zelari/core 0.7.12 → 1.0.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 (157) hide show
  1. package/dist/agents/councilApi.d.ts +142 -0
  2. package/dist/agents/councilApi.d.ts.map +1 -1
  3. package/dist/agents/councilApi.js +523 -8
  4. package/dist/agents/councilApi.js.map +1 -1
  5. package/dist/agents/roles.d.ts.map +1 -1
  6. package/dist/agents/roles.js +11 -3
  7. package/dist/agents/roles.js.map +1 -1
  8. package/dist/agents/toolSchemas.d.ts.map +1 -1
  9. package/dist/agents/toolSchemas.js +32 -3
  10. package/dist/agents/toolSchemas.js.map +1 -1
  11. package/dist/core/AgentHarness.d.ts +21 -0
  12. package/dist/core/AgentHarness.d.ts.map +1 -1
  13. package/dist/core/AgentHarness.js +153 -0
  14. package/dist/core/AgentHarness.js.map +1 -1
  15. package/dist/core/tools/builtin/filesystem.d.ts.map +1 -1
  16. package/dist/core/tools/builtin/filesystem.js +4 -2
  17. package/dist/core/tools/builtin/filesystem.js.map +1 -1
  18. package/dist/council/completion/buildCompletion.d.ts +23 -0
  19. package/dist/council/completion/buildCompletion.d.ts.map +1 -0
  20. package/dist/council/completion/buildCompletion.js +75 -0
  21. package/dist/council/completion/buildCompletion.js.map +1 -0
  22. package/dist/council/completion/index.d.ts +3 -0
  23. package/dist/council/completion/index.d.ts.map +1 -0
  24. package/dist/council/completion/index.js +3 -0
  25. package/dist/council/completion/index.js.map +1 -0
  26. package/dist/council/completion/types.d.ts +38 -0
  27. package/dist/council/completion/types.d.ts.map +1 -0
  28. package/dist/council/completion/types.js +2 -0
  29. package/dist/council/completion/types.js.map +1 -0
  30. package/dist/council/index.d.ts +6 -0
  31. package/dist/council/index.d.ts.map +1 -1
  32. package/dist/council/index.js +6 -0
  33. package/dist/council/index.js.map +1 -1
  34. package/dist/council/lessons/index.d.ts +7 -0
  35. package/dist/council/lessons/index.d.ts.map +1 -0
  36. package/dist/council/lessons/index.js +7 -0
  37. package/dist/council/lessons/index.js.map +1 -0
  38. package/dist/council/lessons/io.d.ts +5 -0
  39. package/dist/council/lessons/io.d.ts.map +1 -0
  40. package/dist/council/lessons/io.js +30 -0
  41. package/dist/council/lessons/io.js.map +1 -0
  42. package/dist/council/lessons/isAnswerLeak.d.ts +7 -0
  43. package/dist/council/lessons/isAnswerLeak.d.ts.map +1 -0
  44. package/dist/council/lessons/isAnswerLeak.js +26 -0
  45. package/dist/council/lessons/isAnswerLeak.js.map +1 -0
  46. package/dist/council/lessons/recallLessons.d.ts +8 -0
  47. package/dist/council/lessons/recallLessons.d.ts.map +1 -0
  48. package/dist/council/lessons/recallLessons.js +56 -0
  49. package/dist/council/lessons/recallLessons.js.map +1 -0
  50. package/dist/council/lessons/recordFailure.d.ts +7 -0
  51. package/dist/council/lessons/recordFailure.d.ts.map +1 -0
  52. package/dist/council/lessons/recordFailure.js +86 -0
  53. package/dist/council/lessons/recordFailure.js.map +1 -0
  54. package/dist/council/lessons/signatures.d.ts +6 -0
  55. package/dist/council/lessons/signatures.d.ts.map +1 -0
  56. package/dist/council/lessons/signatures.js +31 -0
  57. package/dist/council/lessons/signatures.js.map +1 -0
  58. package/dist/council/lessons/types.d.ts +27 -0
  59. package/dist/council/lessons/types.d.ts.map +1 -0
  60. package/dist/council/lessons/types.js +2 -0
  61. package/dist/council/lessons/types.js.map +1 -0
  62. package/dist/council/mission.d.ts +23 -0
  63. package/dist/council/mission.d.ts.map +1 -0
  64. package/dist/council/mission.js +32 -0
  65. package/dist/council/mission.js.map +1 -0
  66. package/dist/council/missionBrief.d.ts +49 -0
  67. package/dist/council/missionBrief.d.ts.map +1 -0
  68. package/dist/council/missionBrief.js +115 -0
  69. package/dist/council/missionBrief.js.map +1 -0
  70. package/dist/council/modeBanners.d.ts +24 -1
  71. package/dist/council/modeBanners.d.ts.map +1 -1
  72. package/dist/council/modeBanners.js +31 -4
  73. package/dist/council/modeBanners.js.map +1 -1
  74. package/dist/council/runMode.d.ts.map +1 -1
  75. package/dist/council/runMode.js +6 -3
  76. package/dist/council/runMode.js.map +1 -1
  77. package/dist/council/scope/extractTaskScope.d.ts +35 -0
  78. package/dist/council/scope/extractTaskScope.d.ts.map +1 -0
  79. package/dist/council/scope/extractTaskScope.js +174 -0
  80. package/dist/council/scope/extractTaskScope.js.map +1 -0
  81. package/dist/council/scope/index.d.ts +3 -0
  82. package/dist/council/scope/index.d.ts.map +1 -0
  83. package/dist/council/scope/index.js +3 -0
  84. package/dist/council/scope/index.js.map +1 -0
  85. package/dist/council/scope/nfrSpecWarn.d.ts +6 -0
  86. package/dist/council/scope/nfrSpecWarn.d.ts.map +1 -0
  87. package/dist/council/scope/nfrSpecWarn.js +21 -0
  88. package/dist/council/scope/nfrSpecWarn.js.map +1 -0
  89. package/dist/council/verification/autofix.d.ts +12 -0
  90. package/dist/council/verification/autofix.d.ts.map +1 -0
  91. package/dist/council/verification/autofix.js +41 -0
  92. package/dist/council/verification/autofix.js.map +1 -0
  93. package/dist/council/verification/citeVerify.d.ts +13 -0
  94. package/dist/council/verification/citeVerify.d.ts.map +1 -0
  95. package/dist/council/verification/citeVerify.js +73 -0
  96. package/dist/council/verification/citeVerify.js.map +1 -0
  97. package/dist/council/verification/completion.d.ts +19 -0
  98. package/dist/council/verification/completion.d.ts.map +1 -0
  99. package/dist/council/verification/completion.js +50 -0
  100. package/dist/council/verification/completion.js.map +1 -0
  101. package/dist/council/verification/degraded.d.ts +26 -0
  102. package/dist/council/verification/degraded.d.ts.map +1 -0
  103. package/dist/council/verification/degraded.js +35 -0
  104. package/dist/council/verification/degraded.js.map +1 -0
  105. package/dist/council/verification/honesty.d.ts +6 -0
  106. package/dist/council/verification/honesty.d.ts.map +1 -0
  107. package/dist/council/verification/honesty.js +28 -0
  108. package/dist/council/verification/honesty.js.map +1 -0
  109. package/dist/council/verification/implementationDelivery.d.ts +26 -0
  110. package/dist/council/verification/implementationDelivery.d.ts.map +1 -0
  111. package/dist/council/verification/implementationDelivery.js +70 -0
  112. package/dist/council/verification/implementationDelivery.js.map +1 -0
  113. package/dist/council/verification/index.d.ts +15 -0
  114. package/dist/council/verification/index.d.ts.map +1 -0
  115. package/dist/council/verification/index.js +15 -0
  116. package/dist/council/verification/index.js.map +1 -0
  117. package/dist/council/verification/inlineJsAutofix.d.ts +8 -0
  118. package/dist/council/verification/inlineJsAutofix.d.ts.map +1 -0
  119. package/dist/council/verification/inlineJsAutofix.js +85 -0
  120. package/dist/council/verification/inlineJsAutofix.js.map +1 -0
  121. package/dist/council/verification/microGate.d.ts +18 -0
  122. package/dist/council/verification/microGate.d.ts.map +1 -0
  123. package/dist/council/verification/microGate.js +81 -0
  124. package/dist/council/verification/microGate.js.map +1 -0
  125. package/dist/council/verification/motionAutofix.d.ts +8 -0
  126. package/dist/council/verification/motionAutofix.d.ts.map +1 -0
  127. package/dist/council/verification/motionAutofix.js +160 -0
  128. package/dist/council/verification/motionAutofix.js.map +1 -0
  129. package/dist/council/verification/parseCssMotion.d.ts +22 -0
  130. package/dist/council/verification/parseCssMotion.d.ts.map +1 -0
  131. package/dist/council/verification/parseCssMotion.js +142 -0
  132. package/dist/council/verification/parseCssMotion.js.map +1 -0
  133. package/dist/council/verification/runChecks.d.ts +10 -0
  134. package/dist/council/verification/runChecks.d.ts.map +1 -0
  135. package/dist/council/verification/runChecks.js +254 -0
  136. package/dist/council/verification/runChecks.js.map +1 -0
  137. package/dist/council/verification/synthesisAudit.d.ts +14 -0
  138. package/dist/council/verification/synthesisAudit.d.ts.map +1 -0
  139. package/dist/council/verification/synthesisAudit.js +106 -0
  140. package/dist/council/verification/synthesisAudit.js.map +1 -0
  141. package/dist/council/verification/tiers.d.ts +8 -0
  142. package/dist/council/verification/tiers.d.ts.map +1 -0
  143. package/dist/council/verification/tiers.js +46 -0
  144. package/dist/council/verification/tiers.js.map +1 -0
  145. package/dist/council/verification/types.d.ts +53 -0
  146. package/dist/council/verification/types.d.ts.map +1 -0
  147. package/dist/council/verification/types.js +5 -0
  148. package/dist/council/verification/types.js.map +1 -0
  149. package/dist/index.d.ts +1 -0
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +2 -0
  152. package/dist/index.js.map +1 -1
  153. package/dist/memory/types.d.ts +63 -0
  154. package/dist/memory/types.d.ts.map +1 -0
  155. package/dist/memory/types.js +13 -0
  156. package/dist/memory/types.js.map +1 -0
  157. package/package.json +5 -1
@@ -0,0 +1,86 @@
1
+ import { appendFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { isAnswerLeak } from './isAnswerLeak.js';
4
+ import { LESSONS_FILE, readLessonsDeduped } from './io.js';
5
+ import { jaccardSimilarity, normalizeForSignature, tokenizeForSignature } from './signatures.js';
6
+ const JACCARD_MERGE_THRESHOLD = 0.72;
7
+ const ENFORCED_AFTER_RECURRENCE = 2;
8
+ const METHODOLOGY = {
9
+ 'motion.keyframes': 'Grep @keyframes in targets before PASS; compositor budget allows only transform and opacity.',
10
+ 'motion.transitions': 'Grep transition properties before PASS; forbid layout-affecting props (grid-template-rows, box-shadow, etc.).',
11
+ 'css.dead-hook': 'Every classList.add must have a matching CSS rule; grep both script and style blocks.',
12
+ 'synthesis.tier-inflation': 'Verification status tier cannot exceed the report; never PASS a check prefix that still has FAIL in verification-report.',
13
+ 'synthesis.honesty': 'Claims like verificato/regressione require Evidence table with path:Lline or tool output — not prose alone.',
14
+ 'synthesis.cite-invalid': 'Every path:Lline citation must exist and be non-empty; grep before citing.',
15
+ 'synthesis.degraded-banner': 'Degraded runs must include DEGRADED_RUN banner; do not claim ready-to-commit.',
16
+ 'plan.reality': 'Milestone keywords in plan.json must appear in implementation targets before claiming compatibility.',
17
+ };
18
+ function methodologyFor(check) {
19
+ return (METHODOLOGY[check.id] ??
20
+ `When ${check.id} fails, fix the underlying issue and cite grep/tool evidence before claiming PASS.`);
21
+ }
22
+ function keywordsFrom(check, signature) {
23
+ const words = signature.split(' ').filter((w) => w.length >= 4);
24
+ const fromId = check.id.split(/[.-]/).filter((p) => p.length >= 4);
25
+ return [...new Set([...fromId, ...words])].slice(0, 12);
26
+ }
27
+ function writeLesson(zelariRoot, lesson) {
28
+ const path = join(zelariRoot, LESSONS_FILE);
29
+ appendFileSync(path, `${JSON.stringify(lesson)}\n`, 'utf8');
30
+ }
31
+ function findSimilar(lessons, signature) {
32
+ const sigTokens = tokenizeForSignature(signature);
33
+ let best = null;
34
+ let bestScore = 0;
35
+ for (const l of lessons) {
36
+ const score = jaccardSimilarity(sigTokens, tokenizeForSignature(l.signature));
37
+ if (score > bestScore) {
38
+ bestScore = score;
39
+ best = l;
40
+ }
41
+ }
42
+ return bestScore >= JACCARD_MERGE_THRESHOLD ? best : null;
43
+ }
44
+ /**
45
+ * Capture a verification FAIL as a methodology lesson (append-only jsonl).
46
+ */
47
+ export function captureFailure(zelariRoot, check) {
48
+ if (check.ok) {
49
+ return { captured: false, reason: 'check passed' };
50
+ }
51
+ const methodology = methodologyFor(check);
52
+ const leak = isAnswerLeak(`${methodology} ${check.message} ${check.evidence ?? ''}`);
53
+ if (leak.leak) {
54
+ return { captured: false, rejected: true, reason: leak.reason };
55
+ }
56
+ const signature = normalizeForSignature(check.id, check.message);
57
+ const existing = readLessonsDeduped(zelariRoot);
58
+ const similar = findSimilar(existing, signature);
59
+ const now = new Date().toISOString();
60
+ if (similar) {
61
+ const recurrence = similar.recurrence + 1;
62
+ const tier = recurrence >= ENFORCED_AFTER_RECURRENCE ? 'enforced' : similar.tier;
63
+ const updated = {
64
+ ...similar,
65
+ recurrence,
66
+ tier,
67
+ updatedAt: now,
68
+ };
69
+ writeLesson(zelariRoot, updated);
70
+ return { captured: true, lesson: updated };
71
+ }
72
+ const lesson = {
73
+ id: `lesson-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
74
+ signature,
75
+ checkId: check.id,
76
+ methodology,
77
+ tier: 'advisory',
78
+ keywords: keywordsFrom(check, signature),
79
+ recurrence: 1,
80
+ createdAt: now,
81
+ updatedAt: now,
82
+ };
83
+ writeLesson(zelariRoot, lesson);
84
+ return { captured: true, lesson };
85
+ }
86
+ //# sourceMappingURL=recordFailure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recordFailure.js","sourceRoot":"","sources":["../../../src/council/lessons/recordFailure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Tokenize for Jaccard similarity (lowercase words ≥3 chars). */
2
+ export declare function tokenizeForSignature(text: string): Set<string>;
3
+ export declare function jaccardSimilarity(a: Set<string>, b: Set<string>): number;
4
+ /** Normalize check message for stable signatures (strip paths, lines, numbers). */
5
+ export declare function normalizeForSignature(checkId: string, message: string): string;
6
+ //# sourceMappingURL=signatures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signatures.d.ts","sourceRoot":"","sources":["../../../src/council/lessons/signatures.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAM9D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAQxE;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ9E"}
@@ -0,0 +1,31 @@
1
+ /** Tokenize for Jaccard similarity (lowercase words ≥3 chars). */
2
+ export function tokenizeForSignature(text) {
3
+ const out = new Set();
4
+ for (const w of text.toLowerCase().split(/\W+/)) {
5
+ if (w.length >= 3)
6
+ out.add(w);
7
+ }
8
+ return out;
9
+ }
10
+ export function jaccardSimilarity(a, b) {
11
+ if (a.size === 0 && b.size === 0)
12
+ return 1;
13
+ let inter = 0;
14
+ for (const x of a) {
15
+ if (b.has(x))
16
+ inter++;
17
+ }
18
+ const union = new Set([...a, ...b]).size;
19
+ return union === 0 ? 0 : inter / union;
20
+ }
21
+ /** Normalize check message for stable signatures (strip paths, lines, numbers). */
22
+ export function normalizeForSignature(checkId, message) {
23
+ const base = `${checkId} ${message}`
24
+ .toLowerCase()
25
+ .replace(/[A-Za-z]:\\[^\s]+/g, 'path')
26
+ .replace(/\/[\w./-]+/g, 'path')
27
+ .replace(/l\d{1,6}/gi, 'line')
28
+ .replace(/\d+/g, 'n');
29
+ return [...tokenizeForSignature(base)].sort().join(' ');
30
+ }
31
+ //# sourceMappingURL=signatures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signatures.js","sourceRoot":"","sources":["../../../src/council/lessons/signatures.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAc,EAAE,CAAc;IAC9D,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,EAAE,CAAC;IACxB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;AACzC,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,OAAe;IACpE,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,OAAO,EAAE;SACjC,WAAW,EAAE;SACb,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC;SACrC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC;SAC9B,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;SAC7B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,27 @@
1
+ export type LessonTier = 'advisory' | 'enforced';
2
+ export interface LessonRecord {
3
+ id: string;
4
+ /** Normalized tokens for recurrence matching. */
5
+ signature: string;
6
+ checkId: string;
7
+ /** Methodology guidance — not task-specific answers. */
8
+ methodology: string;
9
+ tier: LessonTier;
10
+ keywords: string[];
11
+ recurrence: number;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ }
15
+ export interface CaptureFailureResult {
16
+ captured: boolean;
17
+ rejected?: boolean;
18
+ reason?: string;
19
+ lesson?: LessonRecord;
20
+ }
21
+ export interface RecallLessonsOptions {
22
+ maxLessons?: number;
23
+ maxBytes?: number;
24
+ /** User task text for keyword overlap scoring. */
25
+ taskText?: string;
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/council/lessons/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/council/lessons/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Mission classifier — what KIND of work a Zelari-mode mission is.
3
+ *
4
+ * Distinct from `resolveCouncilRunMode` (which decides design-phase vs
5
+ * implementation for a single run): the intent shapes the mission brief and
6
+ * whether the loop auto-chains design → implementation for a greenfield build.
7
+ *
8
+ * Pure and dependency-free (IT + EN keyword heuristics).
9
+ */
10
+ export type MissionIntent = 'greenfield' | 'extend' | 'fix' | 'redesign';
11
+ export interface ClassifyMissionInput {
12
+ userMessage: string;
13
+ /** True when `.zelari/plan.json` already exists with ≥1 phase. */
14
+ hasPlan?: boolean;
15
+ }
16
+ /**
17
+ * Resolve the mission intent.
18
+ *
19
+ * Precedence: extend-on-existing-plan → redesign → greenfield → fix →
20
+ * default (`extend` when a plan exists, otherwise `greenfield`).
21
+ */
22
+ export declare function classifyMission(input: ClassifyMissionInput): MissionIntent;
23
+ //# sourceMappingURL=mission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission.d.ts","sourceRoot":"","sources":["../../src/council/mission.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;AAEzE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAcD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAS1E"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Mission classifier — what KIND of work a Zelari-mode mission is.
3
+ *
4
+ * Distinct from `resolveCouncilRunMode` (which decides design-phase vs
5
+ * implementation for a single run): the intent shapes the mission brief and
6
+ * whether the loop auto-chains design → implementation for a greenfield build.
7
+ *
8
+ * Pure and dependency-free (IT + EN keyword heuristics).
9
+ */
10
+ const REDESIGN_KEYWORDS = /\b(redesign|restyle|restyling|revamp|ridisegna|ridisegnare|nuovo look|rifai la ui|rinnova (?:la )?ui)\b/i;
11
+ const FIX_KEYWORDS = /\b(fix|bug|hotfix|debug|repair|refactor|patch|correggi|correzione|rifattorizza|refactoring|migra|migrate)\b/i;
12
+ const GREENFIELD_KEYWORDS = /\b(greenfield|from scratch|scaffold|costruisci|crea|realizza|sviluppa|nuovo progetto|da zero|build (?:a|an|the)? ?(?:new )?)\b/i;
13
+ const EXTEND_KEYWORDS = /\b(continue|extend|add (?:a )?(?:new )?(?:feature|phase|module)|continua|estendi|aggiungi (?:una )?(?:fase|feature|funzionalit[àa]|modulo))\b/i;
14
+ /**
15
+ * Resolve the mission intent.
16
+ *
17
+ * Precedence: extend-on-existing-plan → redesign → greenfield → fix →
18
+ * default (`extend` when a plan exists, otherwise `greenfield`).
19
+ */
20
+ export function classifyMission(input) {
21
+ const msg = input.userMessage;
22
+ if (input.hasPlan && EXTEND_KEYWORDS.test(msg))
23
+ return 'extend';
24
+ if (REDESIGN_KEYWORDS.test(msg))
25
+ return 'redesign';
26
+ if (GREENFIELD_KEYWORDS.test(msg))
27
+ return 'greenfield';
28
+ if (FIX_KEYWORDS.test(msg))
29
+ return 'fix';
30
+ return input.hasPlan ? 'extend' : 'greenfield';
31
+ }
32
+ //# sourceMappingURL=mission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission.js","sourceRoot":"","sources":["../../src/council/mission.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,iBAAiB,GACrB,0GAA0G,CAAC;AAE7G,MAAM,YAAY,GAChB,8GAA8G,CAAC;AAEjH,MAAM,mBAAmB,GACvB,iIAAiI,CAAC;AAEpI,MAAM,eAAe,GACnB,gJAAgJ,CAAC;AAEnJ;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC;IAE9B,IAAI,KAAK,CAAC,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChE,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IACnD,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC;IACvD,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEzC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;AACjD,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Mission brief — a structured, deterministic reading of a free-form prompt.
3
+ *
4
+ * Level A (this module): rules + heuristics, pure and dependency-free, always
5
+ * runs. Level B (optional LLM polish of `deliverableThisMission`/`assumptions`)
6
+ * is layered on by the CLI driver, not here — so the brief stays testable and
7
+ * free of provider coupling.
8
+ */
9
+ import { type MissionIntent } from './mission.js';
10
+ import { type CouncilRunMode } from './runMode.js';
11
+ export interface MissionSlice {
12
+ id: string;
13
+ title: string;
14
+ /** Task ids from `.zelari/plan.json` bound to this slice (filled by the driver). */
15
+ taskIds?: string[];
16
+ /** Upper bound on tasks for the MVP slice. */
17
+ maxTasks?: number;
18
+ }
19
+ export interface MissionBrief {
20
+ intent: MissionIntent;
21
+ /** How the FIRST run should behave. Greenfield with no plan → design-phase. */
22
+ runModeHint: CouncilRunMode;
23
+ stackInferred: string[];
24
+ deliverableThisMission: string;
25
+ assumptions: string[];
26
+ outOfScope: string[];
27
+ phases: Array<{
28
+ name: string;
29
+ mode: CouncilRunMode;
30
+ }>;
31
+ /** The slice whose `completion.ok` ends the mission (stop = MVP slice). */
32
+ sliceMvp: MissionSlice;
33
+ slices: MissionSlice[];
34
+ userPromptOriginal: string;
35
+ }
36
+ export interface BuildMissionBriefInput {
37
+ userMessage: string;
38
+ hasPlan?: boolean;
39
+ /** Max tasks in the MVP slice. Default 8. */
40
+ maxSliceTasks?: number;
41
+ env?: {
42
+ ZELARI_COUNCIL_MODE?: string;
43
+ };
44
+ }
45
+ /**
46
+ * Build the deterministic (Level A) mission brief.
47
+ */
48
+ export declare function buildMissionBrief(input: BuildMissionBriefInput): MissionBrief;
49
+ //# sourceMappingURL=missionBrief.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missionBrief.d.ts","sourceRoot":"","sources":["../../src/council/missionBrief.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE1E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,+EAA+E;IAC/E,WAAW,EAAE,cAAc,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IACtD,2EAA2E;IAC3E,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAqED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,CAyC7E"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Mission brief — a structured, deterministic reading of a free-form prompt.
3
+ *
4
+ * Level A (this module): rules + heuristics, pure and dependency-free, always
5
+ * runs. Level B (optional LLM polish of `deliverableThisMission`/`assumptions`)
6
+ * is layered on by the CLI driver, not here — so the brief stays testable and
7
+ * free of provider coupling.
8
+ */
9
+ import { classifyMission } from './mission.js';
10
+ import { resolveCouncilRunMode } from './runMode.js';
11
+ /** Rough stack detection — surfaced to members, not authoritative. */
12
+ const STACK_SIGNALS = [
13
+ [/\breact\b/i, 'react'],
14
+ [/\bnext\.?js\b/i, 'nextjs'],
15
+ [/\bvue\b/i, 'vue'],
16
+ [/\bsvelte\b/i, 'svelte'],
17
+ [/\bangular\b/i, 'angular'],
18
+ [/\bnode(\.js)?\b/i, 'node'],
19
+ [/\bexpress\b/i, 'express'],
20
+ [/\blaravel\b/i, 'laravel'],
21
+ [/\bphp\b/i, 'php'],
22
+ [/\bpython\b/i, 'python'],
23
+ [/\bdjango\b/i, 'django'],
24
+ [/\bflask\b/i, 'flask'],
25
+ [/\btypescript\b|\bts\b/i, 'typescript'],
26
+ [/\btailwind\b/i, 'tailwind'],
27
+ [/\bpostgres(ql)?\b/i, 'postgres'],
28
+ [/\bmysql\b/i, 'mysql'],
29
+ [/\bsqlite\b/i, 'sqlite'],
30
+ [/\bmongo(db)?\b/i, 'mongodb'],
31
+ [/\bstripe\b/i, 'stripe'],
32
+ ];
33
+ function inferStack(msg) {
34
+ const found = new Set();
35
+ for (const [re, name] of STACK_SIGNALS) {
36
+ if (re.test(msg))
37
+ found.add(name);
38
+ }
39
+ return [...found];
40
+ }
41
+ function firstSentence(msg, max = 160) {
42
+ const oneLine = msg.replace(/\s+/g, ' ').trim();
43
+ return oneLine.length <= max ? oneLine : oneLine.slice(0, max - 1).trimEnd() + '…';
44
+ }
45
+ function deliverableFor(intent, msg) {
46
+ const s = firstSentence(msg);
47
+ switch (intent) {
48
+ case 'greenfield':
49
+ return `Design and scaffold a working MVP for: ${s}`;
50
+ case 'redesign':
51
+ return `Redesign the UI/UX while preserving behaviour for: ${s}`;
52
+ case 'extend':
53
+ return `Extend the existing project with: ${s}`;
54
+ case 'fix':
55
+ return `Diagnose and resolve: ${s}`;
56
+ }
57
+ }
58
+ function assumptionsFor(intent, stack, msg) {
59
+ const out = [];
60
+ if (intent === 'greenfield' && stack.length === 0) {
61
+ out.push('Stack not specified — a sensible default will be chosen and stated in the plan.');
62
+ }
63
+ if (/\b(pagament|payment|checkout|stripe)\b/i.test(msg)) {
64
+ out.push('Payments are stubbed (no live gateway credentials).');
65
+ }
66
+ if (/\b(auth|login|accesso|autenticazione)\b/i.test(msg)) {
67
+ out.push('Authentication uses a minimal local scheme unless specified otherwise.');
68
+ }
69
+ if (out.length === 0) {
70
+ out.push('Scope is limited to the MVP slice defined below.');
71
+ }
72
+ return out;
73
+ }
74
+ /**
75
+ * Build the deterministic (Level A) mission brief.
76
+ */
77
+ export function buildMissionBrief(input) {
78
+ const { userMessage, hasPlan = false } = input;
79
+ const maxTasks = input.maxSliceTasks ?? 8;
80
+ const intent = classifyMission({ userMessage, hasPlan });
81
+ const runModeHint = resolveCouncilRunMode({
82
+ userMessage,
83
+ hasExistingPlan: hasPlan,
84
+ env: input.env,
85
+ });
86
+ const stackInferred = inferStack(userMessage);
87
+ const isGreenfield = intent === 'greenfield' && !hasPlan;
88
+ const phases = isGreenfield
89
+ ? [
90
+ { name: 'design', mode: 'design-phase' },
91
+ { name: 'implementation', mode: 'implementation' },
92
+ ]
93
+ : [{ name: runModeHint === 'design-phase' ? 'design' : 'implementation', mode: runModeHint }];
94
+ const sliceMvp = {
95
+ id: 'slice-mvp',
96
+ title: `MVP — ${firstSentence(userMessage, 60)}`,
97
+ maxTasks,
98
+ };
99
+ return {
100
+ intent,
101
+ runModeHint,
102
+ stackInferred,
103
+ deliverableThisMission: deliverableFor(intent, userMessage),
104
+ assumptions: assumptionsFor(intent, stackInferred, userMessage),
105
+ outOfScope: [
106
+ 'Production deployment and CI/CD pipelines',
107
+ 'Real credentials, secrets, and third-party account setup',
108
+ ],
109
+ phases,
110
+ sliceMvp,
111
+ slices: [sliceMvp],
112
+ userPromptOriginal: userMessage,
113
+ };
114
+ }
115
+ //# sourceMappingURL=missionBrief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missionBrief.js","sourceRoot":"","sources":["../../src/council/missionBrief.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,28 @@
1
1
  import type { CouncilRunMode } from './runMode.js';
2
2
  export declare const DESIGN_PHASE_MODE_BANNER = "COUNCIL RUN MODE: design-phase.\nWorkspace tool emissions described in your role prompt are MANDATORY in this run \u2014 prose alone does not count as a deliverable. Persist artifacts via the workspace tools listed in your AVAILABLE TOOLS section.";
3
3
  export declare const IMPLEMENTATION_MODE_BANNER = "COUNCIL RUN MODE: implementation.\nPrefer write_file, edit_file, and bash for code changes. Design-phase mandatory workspace blocks in your role prompt are INACTIVE in this run \u2014 only call workspace tools when they add durable project value.";
4
- export declare function councilModeBanner(runMode: CouncilRunMode): string;
4
+ /**
5
+ * Implementation-mode banner for the SOLE implementer (the chairman, Lucifero).
6
+ * Only this member writes/edits project files, so the "who implemented" signal
7
+ * stays unambiguous and multiple agents never edit the same files.
8
+ */
9
+ export declare const IMPLEMENTATION_IMPLEMENTER_BANNER = "COUNCIL RUN MODE: implementation \u2014 you are the IMPLEMENTER.\nYou are the only member that writes code this run. Implement the solution with write_file / edit_file and verify with bash. Reconcile the specialists' analysis and Minosse's critique into working, verified changes. Design-phase mandatory workspace blocks in your role prompt are INACTIVE \u2014 only call workspace tools when they add durable project value.";
10
+ /**
11
+ * Implementation-mode banner for advisors (specialists + Minosse). They analyze,
12
+ * plan and critique; they must NOT modify project files (the implementer does).
13
+ * This prevents multi-writer chaos where several agents edit the same files and
14
+ * pile up conflicting changes.
15
+ */
16
+ export declare const IMPLEMENTATION_ADVISOR_BANNER = "COUNCIL RUN MODE: implementation \u2014 you are an ADVISOR.\nDo NOT write or edit project files (not via write_file/edit_file, and not via bash) \u2014 the final synthesizer (Lucifero) is the sole implementer. Your job is to inspect the codebase (read_file, grep_content, list_files) and produce analysis, a concrete plan, or critique that the implementer will execute. Design-phase mandatory workspace blocks in your role prompt are INACTIVE in this run.";
17
+ /**
18
+ * Pick the run-mode banner for a member.
19
+ *
20
+ * @param opts.isImplementer In implementation mode, `true` selects the
21
+ * implementer banner (chairman/Lucifero), `false` the advisor banner
22
+ * (specialists + Minosse). Omitted → the legacy generic banner (kept for
23
+ * backward compatibility with callers that don't distinguish roles).
24
+ */
25
+ export declare function councilModeBanner(runMode: CouncilRunMode, opts?: {
26
+ isImplementer?: boolean;
27
+ }): string;
5
28
  //# sourceMappingURL=modeBanners.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"modeBanners.d.ts","sourceRoot":"","sources":["../../src/council/modeBanners.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,eAAO,MAAM,wBAAwB,4PAC6K,CAAC;AAEnN,eAAO,MAAM,0BAA0B,2PACwK,CAAC;AAEhN,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAIjE"}
1
+ {"version":3,"file":"modeBanners.d.ts","sourceRoot":"","sources":["../../src/council/modeBanners.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,eAAO,MAAM,wBAAwB,4PAC6K,CAAC;AAEnN,eAAO,MAAM,0BAA0B,2PACwK,CAAC;AAEhN;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,4aACmT,CAAC;AAElW;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,4cAC4V,CAAC;AAEvY;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,MAAM,CAKR"}
@@ -2,9 +2,36 @@ export const DESIGN_PHASE_MODE_BANNER = `COUNCIL RUN MODE: design-phase.
2
2
  Workspace tool emissions described in your role prompt are MANDATORY in this run — prose alone does not count as a deliverable. Persist artifacts via the workspace tools listed in your AVAILABLE TOOLS section.`;
3
3
  export const IMPLEMENTATION_MODE_BANNER = `COUNCIL RUN MODE: implementation.
4
4
  Prefer write_file, edit_file, and bash for code changes. Design-phase mandatory workspace blocks in your role prompt are INACTIVE in this run — only call workspace tools when they add durable project value.`;
5
- export function councilModeBanner(runMode) {
6
- return runMode === 'design-phase'
7
- ? DESIGN_PHASE_MODE_BANNER
8
- : IMPLEMENTATION_MODE_BANNER;
5
+ /**
6
+ * Implementation-mode banner for the SOLE implementer (the chairman, Lucifero).
7
+ * Only this member writes/edits project files, so the "who implemented" signal
8
+ * stays unambiguous and multiple agents never edit the same files.
9
+ */
10
+ export const IMPLEMENTATION_IMPLEMENTER_BANNER = `COUNCIL RUN MODE: implementation — you are the IMPLEMENTER.
11
+ You are the only member that writes code this run. Implement the solution with write_file / edit_file and verify with bash. Reconcile the specialists' analysis and Minosse's critique into working, verified changes. Design-phase mandatory workspace blocks in your role prompt are INACTIVE — only call workspace tools when they add durable project value.`;
12
+ /**
13
+ * Implementation-mode banner for advisors (specialists + Minosse). They analyze,
14
+ * plan and critique; they must NOT modify project files (the implementer does).
15
+ * This prevents multi-writer chaos where several agents edit the same files and
16
+ * pile up conflicting changes.
17
+ */
18
+ export const IMPLEMENTATION_ADVISOR_BANNER = `COUNCIL RUN MODE: implementation — you are an ADVISOR.
19
+ Do NOT write or edit project files (not via write_file/edit_file, and not via bash) — the final synthesizer (Lucifero) is the sole implementer. Your job is to inspect the codebase (read_file, grep_content, list_files) and produce analysis, a concrete plan, or critique that the implementer will execute. Design-phase mandatory workspace blocks in your role prompt are INACTIVE in this run.`;
20
+ /**
21
+ * Pick the run-mode banner for a member.
22
+ *
23
+ * @param opts.isImplementer In implementation mode, `true` selects the
24
+ * implementer banner (chairman/Lucifero), `false` the advisor banner
25
+ * (specialists + Minosse). Omitted → the legacy generic banner (kept for
26
+ * backward compatibility with callers that don't distinguish roles).
27
+ */
28
+ export function councilModeBanner(runMode, opts) {
29
+ if (runMode === 'design-phase')
30
+ return DESIGN_PHASE_MODE_BANNER;
31
+ if (opts?.isImplementer === true)
32
+ return IMPLEMENTATION_IMPLEMENTER_BANNER;
33
+ if (opts?.isImplementer === false)
34
+ return IMPLEMENTATION_ADVISOR_BANNER;
35
+ return IMPLEMENTATION_MODE_BANNER;
9
36
  }
10
37
  //# sourceMappingURL=modeBanners.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modeBanners.js","sourceRoot":"","sources":["../../src/council/modeBanners.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,wBAAwB,GAAG;kNAC0K,CAAC;AAEnN,MAAM,CAAC,MAAM,0BAA0B,GAAG;+MACqK,CAAC;AAEhN,MAAM,UAAU,iBAAiB,CAAC,OAAuB;IACvD,OAAO,OAAO,KAAK,cAAc;QAC/B,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,0BAA0B,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"modeBanners.js","sourceRoot":"","sources":["../../src/council/modeBanners.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,wBAAwB,GAAG;kNAC0K,CAAC;AAEnN,MAAM,CAAC,MAAM,0BAA0B,GAAG;+MACqK,CAAC;AAEhN;;;;GAIG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG;iWACgT,CAAC;AAElW;;;;;GAKG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG;sYACyV,CAAC;AAEvY;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAuB,EACvB,IAAkC;IAElC,IAAI,OAAO,KAAK,cAAc;QAAE,OAAO,wBAAwB,CAAC;IAChE,IAAI,IAAI,EAAE,aAAa,KAAK,IAAI;QAAE,OAAO,iCAAiC,CAAC;IAC3E,IAAI,IAAI,EAAE,aAAa,KAAK,KAAK;QAAE,OAAO,6BAA6B,CAAC;IACxE,OAAO,0BAA0B,CAAC;AACpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"runMode.d.ts","sourceRoot":"","sources":["../../src/council/runMode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,GAAG,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAWD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAyBhF;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAExE"}
1
+ {"version":3,"file":"runMode.d.ts","sourceRoot":"","sources":["../../src/council/runMode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,GAAG,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAcD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAyBhF;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAExE"}
@@ -4,9 +4,12 @@
4
4
  * Drives gated tool-emission enforcement, mode banners in member prompts,
5
5
  * and the complete-design post-processor skip in implementation runs.
6
6
  */
7
- const DESIGN_KEYWORDS = /\b(design|architect|architecture|spec|blueprint|mockup|wireframe|greenfield|from scratch)\b/i;
8
- const IMPLEMENTATION_KEYWORDS = /\b(fix|refactor|bug|implement|patch|migrate|add tests|debug|repair|hotfix)\b/i;
9
- const PLAN_CONTINUE = /\b(continue|extend|update|refine)\b[\s\S]{0,40}\b(plan|phase|milestone)\b/i;
7
+ const DESIGN_KEYWORDS = /\b(design|architect|architecture|spec|blueprint|mockup|wireframe|greenfield|from scratch|costruisci|crea|progetta|progettazione|architettura|nuovo progetto|da zero|sviluppa|realizza|vetrina|pannello|gestionale)\b/i;
8
+ // NB: bare Italian "sistema" (the noun "system") is deliberately excluded —
9
+ // it collides with greenfield prompts like "costruisci un sistema gestionale".
10
+ // Only unambiguous fix verbs are listed.
11
+ const IMPLEMENTATION_KEYWORDS = /\b(fix|refactor|bug|implement|patch|migrate|add tests|debug|repair|hotfix|correggi|correzione|rifattorizza|refactoring|implementa|aggiungi test|migra)\b/i;
12
+ const PLAN_CONTINUE = /\b(continue|extend|update|refine|continua|estendi|aggiorna|rifinisci)\b[\s\S]{0,40}\b(plan|phase|milestone|piano|fase|milestone)\b/i;
10
13
  /**
11
14
  * Resolve how this council run should behave.
12
15
  *
@@ -1 +1 @@
1
- {"version":3,"file":"runMode.js","sourceRoot":"","sources":["../../src/council/runMode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,eAAe,GACnB,8FAA8F,CAAC;AAEjG,MAAM,uBAAuB,GAC3B,+EAA+E,CAAC;AAElF,MAAM,aAAa,GACjB,4EAA4E,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAA0B;IAC9D,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC;IAC9D,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QACvD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,KAAK,gBAAgB,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC;IAC9B,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAElD,IAAI,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QACrD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"runMode.js","sourceRoot":"","sources":["../../src/council/runMode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,eAAe,GACnB,uNAAuN,CAAC;AAE1N,4EAA4E;AAC5E,+EAA+E;AAC/E,yCAAyC;AACzC,MAAM,uBAAuB,GAC3B,2JAA2J,CAAC;AAE9J,MAAM,aAAa,GACjB,qIAAqI,CAAC;AAExI;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAA0B;IAC9D,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC;IAC9D,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QACvD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,KAAK,gBAAgB,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC;IAC9B,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAElD,IAAI,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QACrD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { NfrSpec } from '../verification/types.js';
2
+ /** Keywords that indicate measurable NFR constraints (motion, perf, budget). */
3
+ export declare const NFR_KEYWORDS: readonly ["motion", "animation", "animate", "keyframes", "transition", "compositor", "reduced-motion", "prefers-reduced-motion", "byte budget", "bytes", "performance", "perf budget", "nfr", "layout thrash", "box-shadow", "inline js", "inline-js"];
4
+ export interface TaskScope {
5
+ /** Project-relative file targets for this task. */
6
+ targets: string[];
7
+ /** Task theme keywords (animation, motion, …). */
8
+ keywords: string[];
9
+ /** Features explicitly deferred or out of scope for this run. */
10
+ explicitOut: string[];
11
+ /** Whether NFR-style constraints appear in the user request. */
12
+ nfrRelevant: boolean;
13
+ sources: Array<'userMessage' | 'nfr-spec'>;
14
+ }
15
+ export interface ExtractTaskScopeInput {
16
+ userMessage: string;
17
+ nfrSpec?: NfrSpec | null;
18
+ /** Optional plan text (JSON string or markdown) for backlog hints. */
19
+ planText?: string;
20
+ }
21
+ /** True when the task text mentions measurable NFR themes. */
22
+ export declare function taskMatchesNfrKeywords(userMessage: string, planText?: string): boolean;
23
+ /**
24
+ * Deterministic task scope from user message + optional nfr-spec.
25
+ * No NLP — keyword overlap, file-path regex, and nfr-spec targets only.
26
+ */
27
+ export declare function extractTaskScope(input: ExtractTaskScopeInput): TaskScope;
28
+ export interface ScopeMatchInput {
29
+ name?: string;
30
+ description?: string;
31
+ id?: string;
32
+ }
33
+ /** Classify a plan task relative to extracted scope. */
34
+ export declare function classifyTaskScope(task: ScopeMatchInput, scope: TaskScope): 'in-scope' | 'backlog' | 'neutral';
35
+ //# sourceMappingURL=extractTaskScope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractTaskScope.d.ts","sourceRoot":"","sources":["../../../src/council/scope/extractTaskScope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,gFAAgF;AAChF,eAAO,MAAM,YAAY,wPAkBf,CAAC;AAgCX,MAAM,WAAW,SAAS;IACxB,mDAAmD;IACnD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iEAAiE;IACjE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gEAAgE;IAChE,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqED,8DAA8D;AAC9D,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAGT;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,SAAS,CAiCxE;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,SAAS,GACf,UAAU,GAAG,SAAS,GAAG,SAAS,CAgCpC"}