@appsforgood/next-supabase-kit 0.1.4 → 0.1.5

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.
@@ -79,11 +79,89 @@ body {
79
79
  border: 1px solid rgba(255, 255, 255, 0.12);
80
80
  }
81
81
 
82
+ .level-pill {
83
+ font-size: 12px;
84
+ padding: 6px 12px;
85
+ border-radius: 999px;
86
+ background: rgba(15, 118, 110, 0.35);
87
+ border: 1px solid rgba(153, 246, 228, 0.35);
88
+ font-variant-numeric: tabular-nums;
89
+ }
90
+
91
+ .iceberg-strip {
92
+ display: grid;
93
+ grid-template-columns: repeat(6, 1fr);
94
+ gap: 4px;
95
+ padding: 8px 20px 10px;
96
+ background: #0a1620;
97
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
98
+ }
99
+
100
+ .iceberg-seg {
101
+ text-align: center;
102
+ font-size: 10px;
103
+ padding: 6px 4px;
104
+ border-radius: 6px;
105
+ border: 1px solid rgba(255, 255, 255, 0.12);
106
+ color: #94a3b8;
107
+ opacity: 0.55;
108
+ }
109
+
110
+ .iceberg-seg.current {
111
+ opacity: 1;
112
+ color: #ecfdf5;
113
+ border-color: rgba(153, 246, 228, 0.55);
114
+ background: rgba(15, 118, 110, 0.35);
115
+ }
116
+
117
+ .iceberg-seg.target {
118
+ opacity: 0.85;
119
+ border-style: dashed;
120
+ }
121
+
122
+ .iceberg-seg.deferred {
123
+ opacity: 0.35;
124
+ border-style: dotted;
125
+ }
126
+
127
+ .climb-panel {
128
+ margin: 0 0 12px;
129
+ padding: 10px;
130
+ border-radius: 8px;
131
+ background: rgba(255, 255, 255, 0.04);
132
+ border: 1px solid var(--line);
133
+ }
134
+
135
+ .climb-panel h3 {
136
+ margin: 0 0 8px;
137
+ font-size: 12px;
138
+ text-transform: uppercase;
139
+ letter-spacing: 0.04em;
140
+ color: var(--muted);
141
+ }
142
+
143
+ .climb-panel ol {
144
+ margin: 0 0 10px;
145
+ padding-left: 18px;
146
+ font-size: 12px;
147
+ color: var(--ink);
148
+ }
149
+
150
+ .climb-panel li {
151
+ margin-bottom: 6px;
152
+ }
153
+
154
+ .climb-refresh {
155
+ width: 100%;
156
+ font-size: 12px;
157
+ padding: 6px 8px;
158
+ }
159
+
82
160
  .office-main {
83
161
  display: grid;
84
162
  grid-template-columns: 220px minmax(0, 1fr);
85
163
  gap: 0;
86
- min-height: calc(100vh - 64px);
164
+ min-height: calc(100vh - 96px);
87
165
  }
88
166
 
89
167
  @media (max-width: 900px) {
@@ -35,7 +35,8 @@
35
35
  handoffPulse: null,
36
36
  studioSessionId: boot.activeSessionId || "",
37
37
  studioEvents: [],
38
- speechBubbles: []
38
+ speechBubbles: [],
39
+ agenticLevel: null
39
40
  };
40
41
 
41
42
  const agentRuntime = {};
@@ -44,6 +45,11 @@
44
45
  canvas: document.getElementById("office-floor"),
45
46
  projectName: document.getElementById("project-name"),
46
47
  progressPill: document.getElementById("progress-pill"),
48
+ levelPill: document.getElementById("level-pill"),
49
+ icebergStrip: document.getElementById("iceberg-strip"),
50
+ climbPanel: document.getElementById("climb-panel"),
51
+ climbList: document.getElementById("climb-list"),
52
+ climbRefresh: document.getElementById("climb-refresh"),
47
53
  sessionPill: document.getElementById("session-pill"),
48
54
  stationList: document.getElementById("station-list"),
49
55
  status: document.getElementById("status"),
@@ -188,9 +194,11 @@
188
194
  state.progress = data.progress || {};
189
195
  state.onboarding = data.onboarding || {};
190
196
  state.depth = data.onboarding?.depth || "undecided";
197
+ state.agenticLevel = data.agenticLevel || null;
191
198
  if (Array.isArray(data.agents) && data.agents.length) state.agents = data.agents;
192
199
  els.projectName.textContent = data.projectName || "your project";
193
200
  updateProgressUi();
201
+ updateAgenticLevelUi();
194
202
  renderStationList();
195
203
  if (state.depth === "undecided") showDepthModal();
196
204
  else {
@@ -334,6 +342,69 @@
334
342
  if (els.progressPill) els.progressPill.textContent = pct + "% ready";
335
343
  }
336
344
 
345
+ function updateAgenticLevelUi() {
346
+ const level = state.agenticLevel;
347
+ if (!level || isStudio) return;
348
+ const current = level.currentLevel ?? 3;
349
+ const target = level.targetLevel ?? 5;
350
+ if (els.levelPill) {
351
+ els.levelPill.textContent = "L" + current + " → L" + target;
352
+ els.levelPill.setAttribute(
353
+ "aria-label",
354
+ "Agentic engineering level " + current + ", target level " + target
355
+ );
356
+ }
357
+ if (els.icebergStrip) {
358
+ els.icebergStrip.innerHTML = [3, 4, 5, 6, 7, 8]
359
+ .map((n) => {
360
+ let cls = "iceberg-seg";
361
+ if (n === current) cls += " current";
362
+ if (n === target && n !== current) cls += " target";
363
+ if (n >= 7) cls += " deferred";
364
+ return '<span class="' + cls + '">L' + n + "</span>";
365
+ })
366
+ .join("");
367
+ }
368
+ const steps = level.climbSteps || [];
369
+ if (els.climbPanel && els.climbList) {
370
+ if (current >= target || steps.length === 0) {
371
+ els.climbPanel.hidden = true;
372
+ } else {
373
+ els.climbPanel.hidden = false;
374
+ els.climbList.innerHTML = steps
375
+ .slice(0, 3)
376
+ .map(
377
+ (step) =>
378
+ "<li><strong>L" +
379
+ step.level +
380
+ "</strong> " +
381
+ escapeHtml(step.label) +
382
+ " — " +
383
+ escapeHtml(step.remediation) +
384
+ "</li>"
385
+ )
386
+ .join("");
387
+ }
388
+ }
389
+ if (level.maintainerNote && els.status && !els.status.textContent) {
390
+ setStatus("ok", level.maintainerNote);
391
+ }
392
+ }
393
+
394
+ if (els.climbRefresh) {
395
+ els.climbRefresh.addEventListener("click", async () => {
396
+ try {
397
+ const data = await api("/api/agentic-level/refresh", { method: "POST" });
398
+ state.agenticLevel = data.agenticLevel;
399
+ state.progress = data.progress;
400
+ updateAgenticLevelUi();
401
+ setStatus("ok", "Agentic level refreshed.");
402
+ } catch (error) {
403
+ setStatus("error", error.message);
404
+ }
405
+ });
406
+ }
407
+
337
408
  function spawnConfetti(x, y) {
338
409
  if (state.reducedMotion) return;
339
410
  for (let i = 0; i < 12; i += 1) {
@@ -131,6 +131,58 @@ body {
131
131
  color: var(--muted);
132
132
  }
133
133
 
134
+ .office-promo .btn:hover {
135
+ filter: brightness(1.05);
136
+ }
137
+
138
+ .wizard-level-pill {
139
+ margin-top: 8px;
140
+ display: inline-block;
141
+ font-size: 12px;
142
+ padding: 4px 10px;
143
+ border-radius: 999px;
144
+ background: rgba(15, 118, 110, 0.25);
145
+ border: 1px solid rgba(153, 246, 228, 0.35);
146
+ color: #99f6e4;
147
+ }
148
+
149
+ .agentic-level-card {
150
+ margin: 12px 0 16px;
151
+ padding: 12px 14px;
152
+ border-radius: 10px;
153
+ border: 1px solid #d9e2ec;
154
+ background: #f8fafc;
155
+ font-size: 14px;
156
+ }
157
+
158
+ .agentic-level-card .hint-inline {
159
+ font-size: 12px;
160
+ color: #64748b;
161
+ }
162
+
163
+ .adapter-chip {
164
+ margin-top: 10px;
165
+ padding: 8px 10px;
166
+ border-radius: 8px;
167
+ font-size: 13px;
168
+ border: 1px solid #d9e2ec;
169
+ }
170
+
171
+ .adapter-chip.ok {
172
+ background: #ecfdf5;
173
+ border-color: #6ee7b7;
174
+ }
175
+
176
+ .adapter-chip.warn {
177
+ background: #fffbeb;
178
+ border-color: #fcd34d;
179
+ }
180
+
181
+ .adapter-chip.error {
182
+ background: #fef2f2;
183
+ border-color: #fca5a5;
184
+ }
185
+
134
186
  .office-promo .btn {
135
187
  display: inline-block;
136
188
  background: var(--accent);
@@ -14,7 +14,9 @@
14
14
  designDraft: null,
15
15
  messagingDraft: null,
16
16
  ideSurfaces: boot.ideSurfaces || [],
17
- agents: boot.agents || []
17
+ agents: boot.agents || [],
18
+ agenticLevel: null,
19
+ lastAdapterValidation: null
18
20
  };
19
21
 
20
22
  const els = {
@@ -22,6 +24,7 @@
22
24
  projectName: document.getElementById("project-name"),
23
25
  ringPct: document.getElementById("ring-pct"),
24
26
  ring: document.getElementById("progress-ring"),
27
+ levelPill: document.getElementById("wizard-level-pill"),
25
28
  sectionNav: document.getElementById("section-nav"),
26
29
  card: document.getElementById("wizard-card"),
27
30
  footer: document.getElementById("wizard-footer"),
@@ -83,10 +86,16 @@
83
86
  state.designDraft = data.designDraft;
84
87
  state.messagingDraft = data.messagingDraft;
85
88
  if (Array.isArray(data.agents) && data.agents.length) state.agents = data.agents;
89
+ state.agenticLevel = data.agenticLevel || null;
86
90
  els.projectName.textContent = data.projectName || "your project";
87
91
  const pct = data.progress?.percent ?? 0;
88
92
  els.ringPct.textContent = pct + "%";
89
93
  els.ring.style.setProperty("--pct", String(pct));
94
+ if (els.levelPill && state.agenticLevel) {
95
+ els.levelPill.textContent =
96
+ "L" + state.agenticLevel.currentLevel + " → L" + state.agenticLevel.targetLevel;
97
+ els.levelPill.hidden = false;
98
+ }
90
99
  render();
91
100
  }
92
101
 
@@ -227,6 +236,7 @@
227
236
  pills +
228
237
  "</div>" +
229
238
  '<p class="why" style="margin-top:20px"><strong>Choose your path</strong></p>' +
239
+ agenticLevelHomeBlock() +
230
240
  '<div class="depth-grid">' +
231
241
  depthCard("quick", "Quick (~10 min)", "IDE setup, agent briefings, and product essentials.") +
232
242
  depthCard("standard", "Standard (~15 min)", "Quick plus visual QA tier for UI changes.") +
@@ -240,6 +250,21 @@
240
250
  );
241
251
  }
242
252
 
253
+ function agenticLevelHomeBlock() {
254
+ const level = state.agenticLevel;
255
+ if (!level) return "";
256
+ return (
257
+ '<div class="agentic-level-card">' +
258
+ "<p><strong>Agentic level</strong> L" +
259
+ level.currentLevel +
260
+ " → target L" +
261
+ level.targetLevel +
262
+ " <span class=\"hint-inline\">(setup progress is separate from audit readiness and visual QA tiers)</span></p>" +
263
+ (level.maintainerNote ? "<p class=\"hint\">" + escapeHtml(level.maintainerNote) + "</p>" : "") +
264
+ "</div>"
265
+ );
266
+ }
267
+
243
268
  function depthCard(id, title, desc) {
244
269
  const sel = state.depth === id ? " selected" : "";
245
270
  return (
@@ -374,7 +399,9 @@
374
399
  qualityTarget: () => {
375
400
  const q = state.form.qualityTarget || "baseline-setup";
376
401
  return (
377
- '<label for="qualityTarget">Quality target</label><select id="qualityTarget" name="qualityTarget">' +
402
+ '<label for="qualityTarget">Audit readiness target</label>' +
403
+ '<p class="hint">This is your <strong>audit readiness</strong> goal (agent-kit audit), not Agentic L5/L6 or visual QA tier.</p>' +
404
+ '<select id="qualityTarget" name="qualityTarget">' +
378
405
  optionQuality("baseline-setup", "baseline-setup — kit installed, filling evidence", q) +
379
406
  optionQuality("needs-improvement", "needs-improvement — active delivery", q) +
380
407
  optionQuality("best-practice-candidate", "best-practice-candidate — clean audit goal", q) +
@@ -394,11 +421,13 @@
394
421
  "</option>"
395
422
  )
396
423
  .join("");
424
+ const chip = renderAdapterChip(state.lastAdapterValidation);
397
425
  return (
398
426
  '<label for="ideSurface">Primary AI coding tool</label><select id="ideSurface" name="ideSurface" required>' +
399
427
  '<option value="">Choose your IDE…</option>' +
400
428
  opts +
401
- '</select><p class="why">We configure instructions for this path: <code id="ide-path"></code></p>'
429
+ '</select><p class="why">We configure instructions for this path: <code id="ide-path"></code></p>' +
430
+ chip
402
431
  );
403
432
  },
404
433
  visualQaTier: () => {
@@ -456,9 +485,49 @@
456
485
  );
457
486
  }
458
487
 
488
+ function renderAdapterChip(validation) {
489
+ if (!validation || !validation.target) return "";
490
+ const kind = validation.fail > 0 ? "error" : validation.warn > 0 ? "warn" : "ok";
491
+ const label =
492
+ validation.fail > 0
493
+ ? "Adapter validate: " + validation.fail + " fail"
494
+ : validation.warn > 0
495
+ ? "Adapter validate: pass with warnings"
496
+ : "Adapter validate: pass";
497
+ return (
498
+ '<p class="adapter-chip ' +
499
+ kind +
500
+ '" role="status">' +
501
+ escapeHtml(label) +
502
+ " (" +
503
+ escapeHtml(validation.target) +
504
+ ")</p>"
505
+ );
506
+ }
507
+
459
508
  function renderComplete() {
509
+ const level = state.agenticLevel;
510
+ const climb = (level?.climbSteps || [])
511
+ .slice(0, 3)
512
+ .map((step) => "<li>" + escapeHtml(step.remediation) + "</li>")
513
+ .join("");
460
514
  return (
461
- '<div class="complete-icon" aria-hidden="true">✓</div><h2>Setup saved</h2><p class="why">Agents read <code>.agent-kit/project-context.md</code> and <code>.agent-kit/agent-briefs.md</code> before meaningful work.</p><ol class="next-steps"><li>Run <code>agent-kit audit</code></li><li>Reload your IDE so it picks up instructions for your chosen tool</li><li>Return anytime with <code>agent-kit setup</code></li></ol>'
515
+ '<div class="complete-icon" aria-hidden="true">✓</div><h2>Setup saved</h2>' +
516
+ (level
517
+ ? '<p class="why">Agentic level <strong>L' +
518
+ level.currentLevel +
519
+ "</strong> (target L" +
520
+ level.targetLevel +
521
+ ").</p>"
522
+ : "") +
523
+ '<p class="why">Agents read <code>.agent-kit/project-context.md</code> and <code>.agent-kit/agent-briefs.md</code> before meaningful work.</p>' +
524
+ '<ol class="next-steps">' +
525
+ "<li>Run eval loop from <code>LOOP_CODING.md</code>: <code>npm test</code>, <code>agent-kit audit --min-readiness baseline-setup</code></li>" +
526
+ "<li>Validate IDE adapters: <code>agent-kit adapter validate cursor|codex|all</code></li>" +
527
+ "<li>Reload your IDE so it picks up council subagents and rules</li>" +
528
+ "<li>Return anytime with <code>agent-kit setup</code></li>" +
529
+ "</ol>" +
530
+ (climb ? '<h3>Next climb steps</h3><ol class="next-steps">' + climb + "</ol>" : "")
462
531
  );
463
532
  }
464
533
 
@@ -619,11 +688,13 @@
619
688
  await patchState({ currentSection: step.section, currentStep: state.stepIndex });
620
689
  }
621
690
  if (step?.section === "ide" && fieldValue("ideSurface")) {
622
- await api("/api/checklist/ide", {
691
+ const ideResult = await api("/api/checklist/ide", {
623
692
  method: "POST",
624
693
  headers: { "Content-Type": "application/json" },
625
694
  body: JSON.stringify({ ideSurface: fieldValue("ideSurface") })
626
695
  });
696
+ state.lastAdapterValidation = ideResult.adapterValidation || null;
697
+ state.agenticLevel = ideResult.agenticLevel || state.agenticLevel;
627
698
  }
628
699
  if (step?.section === "visualQa" && fieldValue("visualQaTier")) {
629
700
  await api("/api/checklist/visual-qa", {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "packageName": "@appsforgood/next-supabase-kit",
3
- "packageVersion": "0.1.4",
3
+ "packageVersion": "0.1.5",
4
4
  "stack": "next-supabase",
5
5
  "installedAt": "2026-06-17T11:49:38.732Z",
6
6
  "docs": [
@@ -19,6 +19,7 @@
19
19
  "STYLE_GUIDE.md",
20
20
  "SECURITY.md",
21
21
  "TESTING.md",
22
+ "LOOP_CODING.md",
22
23
  "DEPLOYMENT.md",
23
24
  "UPGRADE.md"
24
25
  ],
@@ -45,14 +46,15 @@
45
46
  "SKILLS.md": "3c3c2eb40438a42026479dccac7bbf084ba22e2d758c425dff59385d05eae3bd",
46
47
  "SPEC.md": "bb0406a141338b630a82026e4a2bb37f38448b3641d3b3ada62d146711a4fbfe",
47
48
  "DECISIONS.md": "0c08d1106a40f829b197d552d0397c9bcd9af7e168a55c47ff5be033c6035ec6",
48
- "DOCS.md": "4a2940e8d2526d4ad8f481c82451dd65d62f0420638795580a5f04dacec237de",
49
+ "DOCS.md": "da6a9006daf78bf410051153fe2838417b7f46459904582c2259ec1dba4bd29f",
49
50
  "DESIGN.md": "70f52e539073e7c4c1d37e63c9a21672a3221d2931d3ff284058dabf60243530",
50
51
  "MESSAGING.md": "f1f7c0f11796820b60bb44e42a65749763f7167944ba6acf092a1cf7b59e50de",
51
52
  "MODEL_ROUTING.md": "f0ca3bd12872cd5f61ff4c6bef670249c0a0188f20c049cb0d09d84219b1839c",
52
53
  "QUALITY_GATES.md": "df9a39ad301394f7f58bc3dd5bf52f9fafeefffdc240fb7ae6a9b6a74b8da0b5",
53
54
  "STYLE_GUIDE.md": "dcaed2d7885e920060d74e4ba5a8d548a08a729a3efc178434a17b5a182fb628",
54
55
  "SECURITY.md": "f046e4dc794f49700ddee4cb866e2ba1983a1b71268f2e244892d615b41714f8",
55
- "TESTING.md": "30ef3fa51a6b8e0b5ef608d7b7c448d6a7958bc87c27e15786a54f361fc7ef23",
56
+ "TESTING.md": "2889421a1a66d5a6d910e9896a7f21fe4041aa2f6c0f52c92bac8505b66ba06a",
57
+ "LOOP_CODING.md": "3d4719c7fc7c2e8465ee15aec27574adbbc5207d58123ecf4f88f3942c522812",
56
58
  "DEPLOYMENT.md": "c33d949c2b1850f8ee6c38e5ec565325c3d47f4daac13b81c75e1b35655ea174",
57
59
  "UPGRADE.md": "d4678475458744dee7c1f23b69c04e3cf82d9e896196e62455585aaae5d3a25a"
58
60
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "summary": {
3
- "pass": 62,
3
+ "pass": 65,
4
4
  "warn": 5,
5
5
  "fail": 0
6
6
  },
@@ -19,7 +19,7 @@
19
19
  {
20
20
  "level": "pass",
21
21
  "area": "install",
22
- "message": "Agent kit installed at version 0.1.4."
22
+ "message": "Agent kit installed at version 0.1.5."
23
23
  },
24
24
  {
25
25
  "level": "pass",
@@ -96,6 +96,11 @@
96
96
  "area": "templates",
97
97
  "message": "TESTING.md matches the current bundled template."
98
98
  },
99
+ {
100
+ "level": "pass",
101
+ "area": "templates",
102
+ "message": "LOOP_CODING.md matches the current bundled template."
103
+ },
99
104
  {
100
105
  "level": "pass",
101
106
  "area": "templates",
@@ -186,6 +191,11 @@
186
191
  "area": "agents",
187
192
  "message": ".agent-kit/schemas/onboarding-state.schema.json is present and parseable."
188
193
  },
194
+ {
195
+ "level": "pass",
196
+ "area": "agents",
197
+ "message": ".agent-kit/schemas/agentic-level.schema.json is present and parseable."
198
+ },
189
199
  {
190
200
  "level": "warn",
191
201
  "area": "studio",
@@ -267,6 +277,11 @@
267
277
  "area": "docs",
268
278
  "message": "TESTING.md exists."
269
279
  },
280
+ {
281
+ "level": "pass",
282
+ "area": "docs",
283
+ "message": "LOOP_CODING.md exists."
284
+ },
270
285
  {
271
286
  "level": "pass",
272
287
  "area": "docs",
@@ -14,6 +14,7 @@
14
14
  |-- STYLE_GUIDE.md
15
15
  |-- SECURITY.md
16
16
  |-- TESTING.md
17
+ |-- LOOP_CODING.md
17
18
  |-- DEPLOYMENT.md
18
19
  |-- UPGRADE.md
19
20
  |-- .github
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appsforgood/next-supabase-kit",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Open agent council, skills, prompts, checklists, and markdown templates for Next.js and Supabase projects.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -13,7 +13,8 @@
13
13
  "homepage": "https://github.com/lukey662/agentsandskills#readme",
14
14
  "publishConfig": {
15
15
  "access": "public",
16
- "registry": "https://registry.npmjs.org"
16
+ "registry": "https://registry.npmjs.org",
17
+ "provenance": true
17
18
  },
18
19
  "bin": {
19
20
  "agent-kit": "dist/index.js"
@@ -57,6 +58,8 @@
57
58
  "SUPPLY_CHAIN.md",
58
59
  "BEST_PRACTICE_EVIDENCE.md",
59
60
  "DOGFOOD.md",
61
+ "LOOP_CODING.md",
62
+ "MAINTAINER_RELEASE.md",
60
63
  "RESEARCH_CITATION_POLICY.md",
61
64
  "UPGRADE.md",
62
65
  "SECURITY.md",
@@ -85,7 +88,9 @@
85
88
  "sbom:generate": "node scripts/sbom-check.mjs --output sbom.cdx.json",
86
89
  "publish:verify": "node scripts/post-publish-verify.mjs",
87
90
  "release:check": "node scripts/release-check.mjs",
88
- "pack:check": "npm pack --dry-run"
91
+ "pack:check": "npm pack --dry-run",
92
+ "dogfood:init": "node scripts/dogfood-init.mjs",
93
+ "adapter:validate": "node dist/index.js adapter validate all"
89
94
  },
90
95
  "dependencies": {
91
96
  "@octokit/rest": "^21.1.1",
@@ -0,0 +1,54 @@
1
+ # Agentic Engineering Maturity Levels
2
+
3
+ Generated from the Agent Kit iceberg model for setup office gamification, `LOOP_CODING.md`, and maintainer climb planning.
4
+
5
+ ## Summary
6
+
7
+ Agentic engineering maturity is modeled as **levels L3–L8**. The kit **computes L3–L6** from audit, adapter, and setup signals. **L7–L8 are deferred** (never auto-awarded) because they require stronger eval gates than agent freedom.
8
+
9
+ | Level | Name | Computed? |
10
+ | --- | --- | --- |
11
+ | L3 | AI-native IDE | Yes |
12
+ | L4 | Rules, context, MCP contract | Yes |
13
+ | L5 | Subagents, skills, council specialists | Yes |
14
+ | L6 | Eval loops, hooks, CI gates | Yes (downstream or maintainer profile) |
15
+ | L7 | Overnight / unsupervised teams | No — explore only |
16
+ | L8 | Agents managing agents | No — lab only |
17
+
18
+ ## Base levels (reference)
19
+
20
+ | Lens | Level |
21
+ | --- | --- |
22
+ | What `@appsforgood/next-supabase-kit` ships | High L4 → solid L5 |
23
+ | BaseRepo maintainer day-to-day (gitignored dogfood overlay) | Mid L4 |
24
+ | BaseRepo CI (`release:check`, `adapter:validate`, audit smokes) | Partial L6 |
25
+ | Fresh downstream `init` | ~L4 capability; L3 until context complete |
26
+ | Fresh `init --activate cursor\|codex` | L5 capability when subagents exist |
27
+
28
+ ## When each level was cutting edge (approximate)
29
+
30
+ | Era | Frontier | Became baseline |
31
+ | --- | --- | --- |
32
+ | 2022–2023 | Browser chat, tab completion | Copy-paste only |
33
+ | 2023–2024 | Repo-aware IDE chat (L3) | Autocomplete-only |
34
+ | Late 2024–2025 | AGENTS.md, rules, MCP (L4) | Ad-hoc prompting |
35
+ | 2025–2026 | Subagents, skills, councils (L5) | Single chat for all roles |
36
+ | 2026 now | Eval CI, loop until green (L6) | Manual “run tests when you remember” |
37
+ | 2026 hype | Overnight agent teams (L7) | Not safe as default |
38
+ | 2026+ lab | Meta-orchestration (L8) | Not mainstream production |
39
+
40
+ ## Office and wizard integration
41
+
42
+ - `agent-kit setup` computes level via `computeAgenticLevel()` and returns it on `/api/state`.
43
+ - Agent Office shows **Lcurrent → Ltarget**, an iceberg strip (L3–L8), and top climb steps.
44
+ - Setup wizard complete screen links **`LOOP_CODING.md`**, **`agent-kit adapter validate`**, and audit gates.
45
+ - Maintainer source repos use a **maintainer profile** (release-check + dogfood docs) for L6 signals.
46
+
47
+ ## Related assets
48
+
49
+ - `LOOP_CODING.md` — kit-safe loop patterns
50
+ - `schemas/agentic-level.schema.json` — report shape
51
+ - `src/studio/agentic-level.ts` — scoring implementation
52
+ - `research/summaries/maturity-model-patterns.md` — QUALITY_GATES evidence tiers (separate from Agentic L3–L8)
53
+
54
+ Do not conflate **Agentic L3–L8** with **QUALITY_GATES Baseline/Strong/Best-Practice** or **visual QA baseline/strong/mature** — the setup UI labels these separately.
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://agent-skills.dev/schemas/agentic-level.schema.json",
4
+ "title": "Agent Kit Agentic Level Report",
5
+ "type": "object",
6
+ "required": ["currentLevel", "targetLevel", "maintainerProfile", "computedAt", "signals"],
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "currentLevel": { "type": "integer", "enum": [3, 4, 5, 6] },
10
+ "targetLevel": { "type": "integer", "enum": [3, 4, 5, 6, 7, 8] },
11
+ "maintainerProfile": { "type": "boolean" },
12
+ "computedAt": { "type": "string", "format": "date-time" },
13
+ "maintainerNote": { "type": "string" },
14
+ "signals": {
15
+ "type": "array",
16
+ "items": {
17
+ "type": "object",
18
+ "required": ["id", "level", "label", "pass", "evidence", "remediation"],
19
+ "additionalProperties": false,
20
+ "properties": {
21
+ "id": { "type": "string" },
22
+ "level": { "type": "integer", "enum": [3, 4, 5, 6] },
23
+ "label": { "type": "string" },
24
+ "pass": { "type": "boolean" },
25
+ "evidence": { "type": "string" },
26
+ "remediation": { "type": "string" }
27
+ }
28
+ }
29
+ },
30
+ "climbSteps": {
31
+ "type": "array",
32
+ "items": {
33
+ "type": "object",
34
+ "required": ["id", "level", "label", "pass", "evidence", "remediation"],
35
+ "additionalProperties": false,
36
+ "properties": {
37
+ "id": { "type": "string" },
38
+ "level": { "type": "integer", "enum": [3, 4, 5, 6] },
39
+ "label": { "type": "string" },
40
+ "pass": { "type": "boolean" },
41
+ "evidence": { "type": "string" },
42
+ "remediation": { "type": "string" }
43
+ }
44
+ }
45
+ }
46
+ }
47
+ }
@@ -28,6 +28,9 @@
28
28
  "wizardVersion": { "type": "string" },
29
29
  "ideSurface": { "type": "string", "enum": ["cursor", "copilot", "claude", "codex", "other"] },
30
30
  "ideVerifiedAt": { "type": "string", "format": "date-time" },
31
- "visualQaTier": { "type": "string", "enum": ["baseline", "strong", "mature"] }
31
+ "visualQaTier": { "type": "string", "enum": ["baseline", "strong", "mature"] },
32
+ "targetAgenticLevel": { "type": "integer", "enum": [3, 4, 5, 6, 7, 8] },
33
+ "lastAgenticLevel": { "type": "integer", "enum": [3, 4, 5, 6] },
34
+ "lastAgenticComputedAt": { "type": "string", "format": "date-time" }
32
35
  }
33
36
  }
@@ -11,6 +11,8 @@ npm run dev
11
11
 
12
12
  Add required environment variables in `.env.example`. Never place real secrets in docs.
13
13
 
14
+ Run `agent-kit setup` to open Agent Office. The office and wizard show **Agentic Engineering Level** (L3–L6 computed from audit/adapter/context signals). See `LOOP_CODING.md` and kit `DOCS.md` for climb patterns. Do not confuse Agentic L5/L6 with audit readiness or visual QA tiers.
15
+
14
16
  ## Architecture Overview
15
17
 
16
18
  Document: