@momentiq/dark-factory-cli 2.1.0 → 2.2.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 (103) hide show
  1. package/dist/adapters/static-schema-lint.js +1 -1
  2. package/dist/cli.js +3 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/onboard.d.ts +64 -1
  5. package/dist/commands/onboard.d.ts.map +1 -1
  6. package/dist/commands/onboard.js +265 -53
  7. package/dist/commands/onboard.js.map +1 -1
  8. package/dist/doctor.d.ts.map +1 -1
  9. package/dist/doctor.js +20 -0
  10. package/dist/doctor.js.map +1 -1
  11. package/dist/mcp/server.d.ts.map +1 -1
  12. package/dist/mcp/server.js +2 -0
  13. package/dist/mcp/server.js.map +1 -1
  14. package/dist/mcp/tools/onboard.d.ts +6 -0
  15. package/dist/mcp/tools/onboard.d.ts.map +1 -0
  16. package/dist/mcp/tools/onboard.js +115 -0
  17. package/dist/mcp/tools/onboard.js.map +1 -0
  18. package/dist/onboard/apply-plan.d.ts +29 -0
  19. package/dist/onboard/apply-plan.d.ts.map +1 -0
  20. package/dist/onboard/apply-plan.js +80 -0
  21. package/dist/onboard/apply-plan.js.map +1 -0
  22. package/dist/onboard/auto-profile.d.ts +3 -0
  23. package/dist/onboard/auto-profile.d.ts.map +1 -0
  24. package/dist/onboard/auto-profile.js +20 -0
  25. package/dist/onboard/auto-profile.js.map +1 -0
  26. package/dist/onboard/generate-plan.d.ts +18 -0
  27. package/dist/onboard/generate-plan.d.ts.map +1 -0
  28. package/dist/onboard/generate-plan.js +68 -0
  29. package/dist/onboard/generate-plan.js.map +1 -0
  30. package/dist/onboard/llm-client.d.ts +45 -0
  31. package/dist/onboard/llm-client.d.ts.map +1 -0
  32. package/dist/onboard/llm-client.js +84 -0
  33. package/dist/onboard/llm-client.js.map +1 -0
  34. package/dist/onboard/prompts/scaffold.md +93 -0
  35. package/dist/onboard/prompts.d.ts +13 -0
  36. package/dist/onboard/prompts.d.ts.map +1 -0
  37. package/dist/onboard/prompts.js +54 -0
  38. package/dist/onboard/prompts.js.map +1 -0
  39. package/dist/onboard/scaffold-schema.d.ts +194 -0
  40. package/dist/onboard/scaffold-schema.d.ts.map +1 -0
  41. package/dist/onboard/scaffold-schema.js +73 -0
  42. package/dist/onboard/scaffold-schema.js.map +1 -0
  43. package/dist/onboard/schema.d.ts.map +1 -1
  44. package/dist/onboard/schema.js +7 -1
  45. package/dist/onboard/schema.js.map +1 -1
  46. package/dist/onboard/seeders/adr.d.ts +3 -0
  47. package/dist/onboard/seeders/adr.d.ts.map +1 -0
  48. package/dist/onboard/seeders/adr.js +212 -0
  49. package/dist/onboard/seeders/adr.js.map +1 -0
  50. package/dist/onboard/seeders/agent-review-config/cloud.canonical.json +22 -0
  51. package/dist/onboard/seeders/agent-review-config/local.canonical.json +21 -0
  52. package/dist/onboard/seeders/agent-review-config.d.ts +3 -0
  53. package/dist/onboard/seeders/agent-review-config.d.ts.map +1 -0
  54. package/dist/onboard/seeders/agent-review-config.js +38 -0
  55. package/dist/onboard/seeders/agent-review-config.js.map +1 -0
  56. package/dist/onboard/seeders/cycle1-bootstrap.d.ts +3 -0
  57. package/dist/onboard/seeders/cycle1-bootstrap.d.ts.map +1 -0
  58. package/dist/onboard/seeders/cycle1-bootstrap.js +76 -0
  59. package/dist/onboard/seeders/cycle1-bootstrap.js.map +1 -0
  60. package/dist/onboard/seeders/index.d.ts +47 -0
  61. package/dist/onboard/seeders/index.d.ts.map +1 -0
  62. package/dist/onboard/seeders/index.js +37 -0
  63. package/dist/onboard/seeders/index.js.map +1 -0
  64. package/dist/onboard/seeders/runbook.d.ts +13 -0
  65. package/dist/onboard/seeders/runbook.d.ts.map +1 -0
  66. package/dist/onboard/seeders/runbook.js +85 -0
  67. package/dist/onboard/seeders/runbook.js.map +1 -0
  68. package/dist/onboard/seeders/templates/adr.md.tmpl +26 -0
  69. package/dist/onboard/seeders/templates/cycle1-bootstrap.md.tmpl +64 -0
  70. package/dist/onboard/seeders/templates/runbook.md.tmpl +26 -0
  71. package/dist/onboard/template-loader.d.ts +20 -0
  72. package/dist/onboard/template-loader.d.ts.map +1 -0
  73. package/dist/onboard/template-loader.js +143 -0
  74. package/dist/onboard/template-loader.js.map +1 -0
  75. package/dist/onboard/template-ref.d.ts +15 -0
  76. package/dist/onboard/template-ref.d.ts.map +1 -0
  77. package/dist/onboard/template-ref.js +45 -0
  78. package/dist/onboard/template-ref.js.map +1 -0
  79. package/dist/onboard/validate.d.ts +19 -0
  80. package/dist/onboard/validate.d.ts.map +1 -0
  81. package/dist/onboard/validate.js +127 -0
  82. package/dist/onboard/validate.js.map +1 -0
  83. package/dist/onboard/writers/dry-run-renderer.d.ts +6 -0
  84. package/dist/onboard/writers/dry-run-renderer.d.ts.map +1 -0
  85. package/dist/onboard/writers/dry-run-renderer.js +88 -0
  86. package/dist/onboard/writers/dry-run-renderer.js.map +1 -0
  87. package/dist/onboard/writers/emit.d.ts +6 -0
  88. package/dist/onboard/writers/emit.d.ts.map +1 -0
  89. package/dist/onboard/writers/emit.js +29 -0
  90. package/dist/onboard/writers/emit.js.map +1 -0
  91. package/dist/onboard/writers/merge.d.ts +16 -0
  92. package/dist/onboard/writers/merge.d.ts.map +1 -0
  93. package/dist/onboard/writers/merge.js +142 -0
  94. package/dist/onboard/writers/merge.js.map +1 -0
  95. package/dist/onboard/writers/pr-writer.d.ts +44 -0
  96. package/dist/onboard/writers/pr-writer.d.ts.map +1 -0
  97. package/dist/onboard/writers/pr-writer.js +104 -0
  98. package/dist/onboard/writers/pr-writer.js.map +1 -0
  99. package/dist/onboard/writers/skip.d.ts +9 -0
  100. package/dist/onboard/writers/skip.d.ts.map +1 -0
  101. package/dist/onboard/writers/skip.js +9 -0
  102. package/dist/onboard/writers/skip.js.map +1 -0
  103. package/package.json +4 -1
@@ -0,0 +1,54 @@
1
+ // packages/cli/src/onboard/prompts.ts
2
+ //
3
+ // Render the Stage B scaffold prompt by substituting the analysis + template
4
+ // into the static prompt asset. The asset path uses import.meta.url so the
5
+ // resolution works both from src/ (dev) and dist/ (npm install), matching
6
+ // the project's existing pattern in critic prompts.
7
+ import { readFile } from "node:fs/promises";
8
+ import { dirname, join } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ const HERE = dirname(fileURLToPath(import.meta.url));
11
+ const ASSET_PATH = join(HERE, "prompts", "scaffold.md");
12
+ let _cachedAsset = null;
13
+ async function loadAsset() {
14
+ if (_cachedAsset !== null)
15
+ return _cachedAsset;
16
+ _cachedAsset = await readFile(ASSET_PATH, "utf8");
17
+ return _cachedAsset;
18
+ }
19
+ function renderFileList(files) {
20
+ return files
21
+ .map((f) => `- ${f.path} (${Buffer.byteLength(f.content, "utf8")} bytes)`)
22
+ .join("\n");
23
+ }
24
+ function renderFileBodies(files) {
25
+ return files
26
+ .map((f) => `path: ${f.path}\n---\n${f.content}\n===\n`)
27
+ .join("\n");
28
+ }
29
+ export function renderScaffoldPromptSync(asset, analysis, templateFiles, opts) {
30
+ // Split the asset on a marker so the operating contract is the SYSTEM prompt
31
+ // (cached, prompt-cached on the SDK side) and the per-call payload is the
32
+ // USER message. The marker is the "## Inputs" heading.
33
+ const splitIdx = asset.indexOf("## Inputs");
34
+ if (splitIdx < 0) {
35
+ throw new Error("df onboard: scaffold.md asset missing '## Inputs' split marker — prompt-asset corruption.");
36
+ }
37
+ // {{CRITIC_PROFILE}} appears in both halves (rule 4a in the system prompt;
38
+ // the verbatim profile echo in the user payload), so replaceAll both sides.
39
+ const systemPrompt = asset.slice(0, splitIdx)
40
+ .replaceAll("{{CRITIC_PROFILE}}", opts.profile)
41
+ .trim();
42
+ const userTemplate = asset.slice(splitIdx);
43
+ const userMessage = userTemplate
44
+ .replaceAll("{{CRITIC_PROFILE}}", opts.profile)
45
+ .replace("{{ANALYSIS_JSON}}", JSON.stringify(analysis, null, 2))
46
+ .replace("{{TEMPLATE_FILE_LIST}}", renderFileList(templateFiles))
47
+ .replace("{{TEMPLATE_FILE_BODIES}}", renderFileBodies(templateFiles));
48
+ return { systemPrompt, userMessage };
49
+ }
50
+ export async function renderScaffoldPrompt(analysis, templateFiles, opts) {
51
+ const asset = await loadAsset();
52
+ return renderScaffoldPromptSync(asset, analysis, templateFiles, opts);
53
+ }
54
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/onboard/prompts.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,0EAA0E;AAC1E,oDAAoD;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKzC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAExD,IAAI,YAAY,GAAkB,IAAI,CAAC;AACvC,KAAK,UAAU,SAAS;IACtB,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAC/C,YAAY,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,YAAY,CAAC;AACtB,CAAC;AAYD,SAAS,cAAc,CAAC,KAAqB;IAC3C,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC;SACzE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAqB;IAC7C,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,OAAO,SAAS,CAAC;SACvD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAa,EACb,QAAsB,EACtB,aAA6B,EAC7B,IAAiC;IAEjC,6EAA6E;IAC7E,0EAA0E;IAC1E,uDAAuD;IACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAC;IACJ,CAAC;IACD,2EAA2E;IAC3E,4EAA4E;IAC5E,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;SAC1C,UAAU,CAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC;SAC9C,IAAI,EAAE,CAAC;IACV,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,YAAY;SAC7B,UAAU,CAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC;SAC9C,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;SAC/D,OAAO,CAAC,wBAAwB,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;SAChE,OAAO,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;IACxE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAsB,EACtB,aAA6B,EAC7B,IAAiC;IAEjC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,OAAO,wBAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,194 @@
1
+ import { z } from "zod";
2
+ export declare const SCAFFOLD_PLAN_SCHEMA_VERSION: 1;
3
+ export declare const SOURCE_ANALYSIS_SCHEMA_VERSION: 1;
4
+ export declare const SCAFFOLD_PLAN_BYTE_BUDGET = 64512;
5
+ export declare const FILE_PLAN_CONTENT_CAP = 16384;
6
+ export declare const SCAFFOLD_PLAN_FILES_CAP = 100;
7
+ export declare const SCAFFOLD_PLAN_SUMMARY_CAP = 800;
8
+ declare const EmitPlan: z.ZodObject<{
9
+ path: z.ZodString;
10
+ action: z.ZodLiteral<"emit">;
11
+ rationale: z.ZodString;
12
+ tailored_content: z.ZodString;
13
+ }, "strict", z.ZodTypeAny, {
14
+ path: string;
15
+ action: "emit";
16
+ rationale: string;
17
+ tailored_content: string;
18
+ }, {
19
+ path: string;
20
+ action: "emit";
21
+ rationale: string;
22
+ tailored_content: string;
23
+ }>;
24
+ declare const MergePlan: z.ZodObject<{
25
+ path: z.ZodString;
26
+ action: z.ZodLiteral<"merge">;
27
+ rationale: z.ZodString;
28
+ tailored_content: z.ZodString;
29
+ }, "strict", z.ZodTypeAny, {
30
+ path: string;
31
+ action: "merge";
32
+ rationale: string;
33
+ tailored_content: string;
34
+ }, {
35
+ path: string;
36
+ action: "merge";
37
+ rationale: string;
38
+ tailored_content: string;
39
+ }>;
40
+ declare const SkipPlan: z.ZodObject<{
41
+ path: z.ZodString;
42
+ action: z.ZodLiteral<"skip">;
43
+ rationale: z.ZodString;
44
+ }, "strict", z.ZodTypeAny, {
45
+ path: string;
46
+ action: "skip";
47
+ rationale: string;
48
+ }, {
49
+ path: string;
50
+ action: "skip";
51
+ rationale: string;
52
+ }>;
53
+ export declare const FilePlanSchema: z.ZodDiscriminatedUnion<"action", [z.ZodObject<{
54
+ path: z.ZodString;
55
+ action: z.ZodLiteral<"emit">;
56
+ rationale: z.ZodString;
57
+ tailored_content: z.ZodString;
58
+ }, "strict", z.ZodTypeAny, {
59
+ path: string;
60
+ action: "emit";
61
+ rationale: string;
62
+ tailored_content: string;
63
+ }, {
64
+ path: string;
65
+ action: "emit";
66
+ rationale: string;
67
+ tailored_content: string;
68
+ }>, z.ZodObject<{
69
+ path: z.ZodString;
70
+ action: z.ZodLiteral<"merge">;
71
+ rationale: z.ZodString;
72
+ tailored_content: z.ZodString;
73
+ }, "strict", z.ZodTypeAny, {
74
+ path: string;
75
+ action: "merge";
76
+ rationale: string;
77
+ tailored_content: string;
78
+ }, {
79
+ path: string;
80
+ action: "merge";
81
+ rationale: string;
82
+ tailored_content: string;
83
+ }>, z.ZodObject<{
84
+ path: z.ZodString;
85
+ action: z.ZodLiteral<"skip">;
86
+ rationale: z.ZodString;
87
+ }, "strict", z.ZodTypeAny, {
88
+ path: string;
89
+ action: "skip";
90
+ rationale: string;
91
+ }, {
92
+ path: string;
93
+ action: "skip";
94
+ rationale: string;
95
+ }>]>;
96
+ export declare const ScaffoldPlanSchema: z.ZodObject<{
97
+ schemaVersion: z.ZodLiteral<1>;
98
+ sourceAnalysisSchemaVersion: z.ZodLiteral<1>;
99
+ templateRef: z.ZodEffects<z.ZodString, string, string>;
100
+ generatedAtIso: z.ZodString;
101
+ files: z.ZodArray<z.ZodDiscriminatedUnion<"action", [z.ZodObject<{
102
+ path: z.ZodString;
103
+ action: z.ZodLiteral<"emit">;
104
+ rationale: z.ZodString;
105
+ tailored_content: z.ZodString;
106
+ }, "strict", z.ZodTypeAny, {
107
+ path: string;
108
+ action: "emit";
109
+ rationale: string;
110
+ tailored_content: string;
111
+ }, {
112
+ path: string;
113
+ action: "emit";
114
+ rationale: string;
115
+ tailored_content: string;
116
+ }>, z.ZodObject<{
117
+ path: z.ZodString;
118
+ action: z.ZodLiteral<"merge">;
119
+ rationale: z.ZodString;
120
+ tailored_content: z.ZodString;
121
+ }, "strict", z.ZodTypeAny, {
122
+ path: string;
123
+ action: "merge";
124
+ rationale: string;
125
+ tailored_content: string;
126
+ }, {
127
+ path: string;
128
+ action: "merge";
129
+ rationale: string;
130
+ tailored_content: string;
131
+ }>, z.ZodObject<{
132
+ path: z.ZodString;
133
+ action: z.ZodLiteral<"skip">;
134
+ rationale: z.ZodString;
135
+ }, "strict", z.ZodTypeAny, {
136
+ path: string;
137
+ action: "skip";
138
+ rationale: string;
139
+ }, {
140
+ path: string;
141
+ action: "skip";
142
+ rationale: string;
143
+ }>]>, "many">;
144
+ summary: z.ZodString;
145
+ }, "strict", z.ZodTypeAny, {
146
+ schemaVersion: 1;
147
+ summary: string;
148
+ files: ({
149
+ path: string;
150
+ action: "emit";
151
+ rationale: string;
152
+ tailored_content: string;
153
+ } | {
154
+ path: string;
155
+ action: "merge";
156
+ rationale: string;
157
+ tailored_content: string;
158
+ } | {
159
+ path: string;
160
+ action: "skip";
161
+ rationale: string;
162
+ })[];
163
+ sourceAnalysisSchemaVersion: 1;
164
+ templateRef: string;
165
+ generatedAtIso: string;
166
+ }, {
167
+ schemaVersion: 1;
168
+ summary: string;
169
+ files: ({
170
+ path: string;
171
+ action: "emit";
172
+ rationale: string;
173
+ tailored_content: string;
174
+ } | {
175
+ path: string;
176
+ action: "merge";
177
+ rationale: string;
178
+ tailored_content: string;
179
+ } | {
180
+ path: string;
181
+ action: "skip";
182
+ rationale: string;
183
+ })[];
184
+ sourceAnalysisSchemaVersion: 1;
185
+ templateRef: string;
186
+ generatedAtIso: string;
187
+ }>;
188
+ export type ScaffoldPlan = z.infer<typeof ScaffoldPlanSchema>;
189
+ export type FilePlan = z.infer<typeof FilePlanSchema>;
190
+ export type EmitFilePlan = z.infer<typeof EmitPlan>;
191
+ export type MergeFilePlan = z.infer<typeof MergePlan>;
192
+ export type SkipFilePlan = z.infer<typeof SkipPlan>;
193
+ export {};
194
+ //# sourceMappingURL=scaffold-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-schema.d.ts","sourceRoot":"","sources":["../../src/onboard/scaffold-schema.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,4BAA4B,EAAG,CAAU,CAAC;AACvD,eAAO,MAAM,8BAA8B,EAAG,CAAU,CAAC;AACzD,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAChD,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,QAAA,MAAM,QAAQ;;;;;;;;;;;;;;;EAKH,CAAC;AAEZ,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;EAKJ,CAAC;AAEZ,QAAA,MAAM,QAAQ;;;;;;;;;;;;EAIH,CAAC;AAEZ,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIzB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBpB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AACpD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AACtD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,73 @@
1
+ // packages/cli/src/onboard/scaffold-schema.ts
2
+ //
3
+ // ScaffoldPlan — Stage B output envelope (cycle 15 Phase B).
4
+ //
5
+ // The LLM (Stage B) consumes a RepoAnalysis (Phase A) + a sage-blueprint
6
+ // template directory and emits a ScaffoldPlan: per-file action decisions
7
+ // (emit | merge | skip) with rationale and (for emit/merge) the tailored
8
+ // body content. Discriminated union on `action` makes the LLM tool-call
9
+ // shape unambiguous and Zod-rejects mixed states.
10
+ //
11
+ // Budget contract: serialized ScaffoldPlan ≤ 64 KB; per-file tailored_content
12
+ // ≤ 16 KB; files[] ≤ 100. Per-file cap + files cap together bound the LLM
13
+ // context AND the writer cost.
14
+ import { z } from "zod";
15
+ import { parseTemplateRef, TEMPLATE_REF_SHAPE_RE } from "./template-ref.js";
16
+ export const SCAFFOLD_PLAN_SCHEMA_VERSION = 1;
17
+ export const SOURCE_ANALYSIS_SCHEMA_VERSION = 1;
18
+ export const SCAFFOLD_PLAN_BYTE_BUDGET = 64_512;
19
+ export const FILE_PLAN_CONTENT_CAP = 16_384;
20
+ export const SCAFFOLD_PLAN_FILES_CAP = 100;
21
+ export const SCAFFOLD_PLAN_SUMMARY_CAP = 800;
22
+ const EmitPlan = z.object({
23
+ path: z.string().min(1).max(512),
24
+ action: z.literal("emit"),
25
+ rationale: z.string().min(1).max(800),
26
+ tailored_content: z.string().max(FILE_PLAN_CONTENT_CAP),
27
+ }).strict();
28
+ const MergePlan = z.object({
29
+ path: z.string().min(1).max(512),
30
+ action: z.literal("merge"),
31
+ rationale: z.string().min(1).max(800),
32
+ tailored_content: z.string().max(FILE_PLAN_CONTENT_CAP),
33
+ }).strict();
34
+ const SkipPlan = z.object({
35
+ path: z.string().min(1).max(512),
36
+ action: z.literal("skip"),
37
+ rationale: z.string().min(1).max(800),
38
+ }).strict();
39
+ export const FilePlanSchema = z.discriminatedUnion("action", [
40
+ EmitPlan,
41
+ MergePlan,
42
+ SkipPlan,
43
+ ]);
44
+ export const ScaffoldPlanSchema = z.object({
45
+ schemaVersion: z.literal(SCAFFOLD_PLAN_SCHEMA_VERSION),
46
+ sourceAnalysisSchemaVersion: z.literal(SOURCE_ANALYSIS_SCHEMA_VERSION),
47
+ templateRef: z
48
+ .string()
49
+ .regex(TEMPLATE_REF_SHAPE_RE, {
50
+ message: "templateRef must match gh:<owner>/<repo>@<ref> or file:///<abs-path>@<ref>",
51
+ })
52
+ .refine((s) => {
53
+ try {
54
+ parseTemplateRef(s);
55
+ return true;
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }, (s) => {
61
+ try {
62
+ parseTemplateRef(s);
63
+ return { message: "(unreachable — refine should have passed)" };
64
+ }
65
+ catch (e) {
66
+ return { message: e instanceof Error ? e.message : String(e) };
67
+ }
68
+ }),
69
+ generatedAtIso: z.string().datetime({ offset: false }),
70
+ files: z.array(FilePlanSchema).max(SCAFFOLD_PLAN_FILES_CAP),
71
+ summary: z.string().max(SCAFFOLD_PLAN_SUMMARY_CAP),
72
+ }).strict();
73
+ //# sourceMappingURL=scaffold-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-schema.js","sourceRoot":"","sources":["../../src/onboard/scaffold-schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/onboard/schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,4BAA4B,EAAG,CAAU,CAAC;AAEvD,QAAA,MAAM,WAAW;;;;;;;;;;;;EAiBf,CAAC;AAEH,QAAA,MAAM,aAAa;;;;;;;;;;;;EAIjB,CAAC;AAEH,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;EAMlB,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;EAarB,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;EAcrB,CAAC;AAEH,QAAA,MAAM,cAAc;;;;;;;;;;;;EAWlB,CAAC;AAKH,QAAA,MAAM,eAAe;;;;;;;;;EAGnB,CAAC;AAKH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;EAIpB,CAAC;AAEH,QAAA,MAAM,mBAAmB;;;;;;;;;EAGvB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CpB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AACpD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/onboard/schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,4BAA4B,EAAG,CAAU,CAAC;AAEvD,QAAA,MAAM,WAAW;;;;;;;;;;;;EAiBf,CAAC;AAEH,QAAA,MAAM,aAAa;;;;;;;;;;;;EAIjB,CAAC;AAEH,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;EAMlB,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;EAarB,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;EAcrB,CAAC;AAEH,QAAA,MAAM,cAAc;;;;;;;;;;;;EAWlB,CAAC;AAKH,QAAA,MAAM,eAAe;;;;;;;;;EAGnB,CAAC;AAKH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;EAIpB,CAAC;AAEH,QAAA,MAAM,mBAAmB;;;;;;;;;EAGvB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgDpB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AACpD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -105,7 +105,13 @@ export const RepoAnalysisSchema = z
105
105
  services: z.array(ServiceSchema).max(30),
106
106
  dependencies: z.array(DependencySchema).max(20),
107
107
  ci: z.object({
108
- workflows: z.array(WorkflowSchema).max(20),
108
+ // Bumped 20 → 50 in cycle 15 Phase C to admit sage3c (28 workflows)
109
+ // through the schema; the 16 KB byte-budget canary on
110
+ // `RepoAnalysis` JSON still gates the absolute output size. Workflow
111
+ // entries are small (name + path + jobs + triggers), so 50 fits well
112
+ // inside the budget; the previous 20-cap was an aggressive heuristic
113
+ // that the sage3c reproduction harness empirically outgrew.
114
+ workflows: z.array(WorkflowSchema).max(50),
109
115
  deployStory: DeployStorySchema.nullable(),
110
116
  }),
111
117
  tree: z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/onboard/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/onboard/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Seeder } from "./index.js";
2
+ export declare const adrSeeder: Seeder;
3
+ //# sourceMappingURL=adr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr.d.ts","sourceRoot":"","sources":["../../../src/onboard/seeders/adr.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAY,MAAM,EAAe,MAAM,YAAY,CAAC;AAmKhE,eAAO,MAAM,SAAS,EAAE,MAkEvB,CAAC"}
@@ -0,0 +1,212 @@
1
+ // packages/cli/src/onboard/seeders/adr.ts
2
+ //
3
+ // ADR seeder — cycle 15 Phase C Task 1.
4
+ //
5
+ // Per-decision deterministic ADR renderer. Consumes the Phase A `RepoAnalysis`
6
+ // `decisions[]` array and emits one ADR markdown file per entry. Filename:
7
+ // `docs/ADR/YYYY-NN-<slug>.md` (per cycle 15 Phase C plan Decision #2):
8
+ // - YYYY: current year (from injected `now`).
9
+ // - NN: auto-incremented from the highest existing ADR with the same year
10
+ // prefix under `docs/ADR/`. Empty target → 01.
11
+ // - <slug>: kebab-cased decision title.
12
+ //
13
+ // Slug collision (same year, same slug already present) → skip entry with
14
+ // `adr_already_exists` rationale (no overwrite). Per-surface rationale +
15
+ // consequences are interpolated from typed bindings.
16
+ //
17
+ // NO LLM here — pure string templating against the Stage A facts. The maintainer
18
+ // expands each rendered ADR by hand after Phase C apply.
19
+ import { readFile } from "node:fs/promises";
20
+ import { fileURLToPath } from "node:url";
21
+ import { dirname, resolve } from "node:path";
22
+ const HERE = dirname(fileURLToPath(import.meta.url));
23
+ // Templates live under `templates/` (plan-aligned). All three prose seeders
24
+ // (adr, cycle1-bootstrap, runbook) share that convention so copy-assets needs
25
+ // to whitelist only one extension+directory pattern at publish time.
26
+ const TEMPLATE_PATH = resolve(HERE, "templates", "adr.md.tmpl");
27
+ const RATIONALE_TEMPLATES = {
28
+ "test-framework": "This repo uses {test_runner_name} (pinned at {test_runner_version} per {evidence_path}) as the test framework. " +
29
+ "New tests should be written against {test_runner_name}'s API; integration tests follow the same harness convention.",
30
+ "deploy-target": "This repo deploys via {target_name} ({command}, configured in {workflow_path}). " +
31
+ "New deploy-affecting changes update the {target_name} configuration; agents should NOT introduce parallel deploy mechanisms.",
32
+ "auth-model": "This repo authenticates users via {auth_provider_name} (per direct dependency surfaced in {evidence_path}). " +
33
+ "New auth-touching code defers to the provider's SDK; do not roll custom auth.",
34
+ stack: "This repo's stack includes {framework_name} (surfaced in {evidence_path}). " +
35
+ "New code follows {framework_name}'s conventions; framework-mismatched code is rejected by the critic.",
36
+ "ci-platform": "CI runs on GitHub Actions ({workflow_count} workflows under .github/workflows/). " +
37
+ "Changes to CI behavior land in the same workflow set; do not introduce a parallel CI substrate.",
38
+ other: "This decision was surfaced from the deterministic repo analysis. See the cited evidence file for the original signal; " +
39
+ "the ADR's prose is a starting point for the maintainer to expand.",
40
+ };
41
+ function slugify(title) {
42
+ return title
43
+ .toLowerCase()
44
+ .replace(/[^a-z0-9]+/g, "-")
45
+ .replace(/^-+|-+$/g, "")
46
+ .slice(0, 60);
47
+ }
48
+ function highestExistingNN(year, existingAdrs) {
49
+ const prefix = `${year}-`;
50
+ let max = 0;
51
+ for (const name of existingAdrs) {
52
+ if (!name.startsWith(prefix))
53
+ continue;
54
+ const nn = parseInt(name.slice(prefix.length, prefix.length + 2), 10);
55
+ if (Number.isInteger(nn) && nn > max)
56
+ max = nn;
57
+ }
58
+ return max;
59
+ }
60
+ function existingSlugs(year, existingAdrs) {
61
+ const prefix = `${year}-`;
62
+ const slugs = new Set();
63
+ for (const name of existingAdrs) {
64
+ if (!name.startsWith(prefix))
65
+ continue;
66
+ // Strip "YYYY-NN-" (8 chars) and the trailing ".md" if present.
67
+ const rest = name.slice(prefix.length + 3);
68
+ const slug = rest.endsWith(".md") ? rest.slice(0, -3) : rest;
69
+ if (slug.length > 0)
70
+ slugs.add(slug);
71
+ }
72
+ return slugs;
73
+ }
74
+ function applyTemplate(template, bindings) {
75
+ return template.replace(/\{([a-z_]+)\}/g, (full, k) => Object.prototype.hasOwnProperty.call(bindings, k) ? bindings[k] : full);
76
+ }
77
+ function bindRationale(d, analysis) {
78
+ const evidence_path = d.evidence[0] ?? "(unknown)";
79
+ switch (d.surface) {
80
+ case "test-framework": {
81
+ // Find the matching dep entry — first dep whose name appears in the title.
82
+ const dep = analysis.dependencies.find((dep) => d.title.toLowerCase().includes(dep.name.toLowerCase()));
83
+ const test_runner_name = dep?.name ?? d.title.split(" ")[0] ?? "the test framework";
84
+ const test_runner_version = dep?.version ?? "(unpinned)";
85
+ return { test_runner_name, test_runner_version, evidence_path };
86
+ }
87
+ case "deploy-target": {
88
+ const ds = analysis.ci.deployStory;
89
+ return {
90
+ target_name: ds?.target ?? "the deploy target",
91
+ command: ds?.command ?? "(see workflow)",
92
+ workflow_path: ds?.workflowPath ?? evidence_path,
93
+ };
94
+ }
95
+ case "auth-model": {
96
+ const dep = analysis.dependencies.find((dep) => d.title.toLowerCase().includes(dep.name.toLowerCase()));
97
+ return { auth_provider_name: dep?.name ?? "the auth provider", evidence_path };
98
+ }
99
+ case "stack": {
100
+ const dep = analysis.dependencies.find((dep) => d.title.toLowerCase().includes(dep.name.toLowerCase()));
101
+ return { framework_name: dep?.name ?? d.title, evidence_path };
102
+ }
103
+ case "ci-platform":
104
+ return {
105
+ workflow_count: String(analysis.ci.workflows.length),
106
+ evidence_path,
107
+ };
108
+ case "other":
109
+ return { evidence_path };
110
+ }
111
+ }
112
+ function bindConsequences(d, analysis) {
113
+ switch (d.surface) {
114
+ case "test-framework": {
115
+ const dep = analysis.dependencies.find((dep) => d.title.toLowerCase().includes(dep.name.toLowerCase()));
116
+ if (!dep)
117
+ return "Future changes to the test-framework choice require a new ADR superseding this one.";
118
+ return (`Repo is pinned to \`${dep.name}@${dep.version}\`; future ${dep.name} upgrades change test-runner semantics ` +
119
+ `(verify CI green on a representative PR before bumping). Cross-stack repos should add per-stack ADRs.`);
120
+ }
121
+ case "deploy-target":
122
+ return ("Deploys are constrained to this target. Switching to a different deploy target (e.g. moving from Helm to Cloud Run) " +
123
+ "requires a new ADR superseding this one, plus a CI workflow migration.");
124
+ case "auth-model":
125
+ return ("Auth-touching code is constrained to this provider's SDK. Changing providers requires a new ADR, a migration plan, " +
126
+ "and a security review.");
127
+ case "stack":
128
+ return ("Stack choice constrains the framework conventions new code follows. The critic enforces stack-consistent patterns; " +
129
+ "introducing a parallel stack requires an ADR and a clear boundary.");
130
+ case "ci-platform":
131
+ return ("CI substrate is fixed. New automation lands in the existing workflow set; introducing a parallel CI " +
132
+ "(e.g. Buildkite alongside Actions) requires an ADR.");
133
+ case "other":
134
+ return "The maintainer should expand this section with the concrete trade-offs and follow-up work this decision implies.";
135
+ }
136
+ }
137
+ function surfaceToScope(surface) {
138
+ switch (surface) {
139
+ case "test-framework":
140
+ return "Test framework choice";
141
+ case "deploy-target":
142
+ return "Deploy target";
143
+ case "auth-model":
144
+ return "Auth model";
145
+ case "stack":
146
+ return "Stack choice";
147
+ case "ci-platform":
148
+ return "CI platform";
149
+ case "other":
150
+ return "Repo-specific decision";
151
+ }
152
+ }
153
+ export const adrSeeder = {
154
+ name: "adr",
155
+ async seed(input) {
156
+ const { analysis, existingAdrs, now } = input;
157
+ if (analysis.decisions.length === 0)
158
+ return [];
159
+ const year = now.getUTCFullYear();
160
+ const date = now.toISOString().slice(0, 10);
161
+ const template = await readFile(TEMPLATE_PATH, "utf8");
162
+ let nn = highestExistingNN(year, existingAdrs);
163
+ const slugsTaken = existingSlugs(year, existingAdrs);
164
+ const deciders = analysis.canonicalName.includes("/")
165
+ ? `@${analysis.canonicalName.split("/")[0]}-maintainers (TBD)`
166
+ : "TBD";
167
+ const out = [];
168
+ for (const decision of analysis.decisions) {
169
+ const slug = slugify(decision.title);
170
+ if (slugsTaken.has(slug)) {
171
+ // SkipFilePlan is .strict() in scaffold-schema and rejects tailored_content
172
+ // (Phase B plan Decision: emit/merge require it, skip rejects it).
173
+ out.push({
174
+ path: `docs/ADR/${year}-${String(nn + 1).padStart(2, "0")}-${slug}.md`,
175
+ action: "skip",
176
+ rationale: `adr_already_exists: docs/ADR/<NN>-${slug}.md already present for ${year}; not overwriting.`,
177
+ });
178
+ continue;
179
+ }
180
+ nn += 1;
181
+ slugsTaken.add(slug);
182
+ const filename = `${year}-${String(nn).padStart(2, "0")}-${slug}.md`;
183
+ const rationaleTemplate = RATIONALE_TEMPLATES[decision.surface];
184
+ const rationaleBindings = bindRationale(decision, analysis);
185
+ const rationale = applyTemplate(rationaleTemplate, rationaleBindings);
186
+ const evidence_bullets = decision.evidence.length > 0
187
+ ? decision.evidence.map((p) => `- \`${p}\``).join("\n")
188
+ : "- (no evidence files recorded — see the maintainer note below)";
189
+ const scope = surfaceToScope(decision.surface);
190
+ const body = applyTemplate(template, {
191
+ year: String(year),
192
+ nn: String(nn).padStart(2, "0"),
193
+ title: decision.title,
194
+ date,
195
+ deciders,
196
+ scope,
197
+ repo_root: analysis.repoRoot,
198
+ evidence_bullets,
199
+ rationale,
200
+ consequences: bindConsequences(decision, analysis),
201
+ });
202
+ out.push({
203
+ path: `docs/ADR/${filename}`,
204
+ action: "emit",
205
+ rationale: `Seeded from RepoAnalysis.decisions[] surface=${decision.surface}`,
206
+ tailored_content: body,
207
+ });
208
+ }
209
+ return out;
210
+ },
211
+ };
212
+ //# sourceMappingURL=adr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr.js","sourceRoot":"","sources":["../../../src/onboard/seeders/adr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ {
2
+ "version": 2,
3
+ "profiles": {
4
+ "cloud": {
5
+ "criticIds": [
6
+ "cursor-local-chief-engineer",
7
+ "codex-local-chief-engineer",
8
+ "gemini-local-chief-engineer",
9
+ "grok-local-chief-engineer"
10
+ ],
11
+ "quorum": 3,
12
+ "modelParamOverrides": {
13
+ "codex-local-chief-engineer": {
14
+ "reasoning_effort": "medium"
15
+ }
16
+ },
17
+ "auth": {
18
+ "codex-local-chief-engineer": "api"
19
+ }
20
+ }
21
+ }
22
+ }