@appsforgood/next-supabase-kit 0.1.3 → 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,8 +1,8 @@
1
1
  {
2
2
  "packageName": "@appsforgood/next-supabase-kit",
3
- "packageVersion": "0.1.3",
3
+ "packageVersion": "0.1.5",
4
4
  "stack": "next-supabase",
5
- "installedAt": "2026-06-14T04:35:38.435Z",
5
+ "installedAt": "2026-06-17T11:49:38.732Z",
6
6
  "docs": [
7
7
  "AGENTS.md",
8
8
  "AGENT_ROSTER.md",
@@ -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
  ],
@@ -40,19 +41,20 @@
40
41
  "templateHashes": {
41
42
  "AGENTS.md": "c7f3e7360938a1ed804d2110e9af96e6f09d50c49138063bef0db1642ddaf84f",
42
43
  "AGENT_ROSTER.md": "fb88198d0a5f911ec8cbaa2850c1a47e1dbd1fe2c8144f9ce633bbfc1ec414d3",
43
- "ASSISTANT_ADAPTERS.md": "7deab45792ad5724c292f99fda64ea24d84dbdf81204a8fa0371325dbc86671b",
44
+ "ASSISTANT_ADAPTERS.md": "b5fb02dbab39bab1af5122050cb86acbc726e24226e7024a3b984d5fdc12f798",
44
45
  "COUNCIL.md": "40bec9051664c9c38b8360ee16f21b5e4716030d19c493cdec67395ab06528e1",
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,9 +1,3 @@
1
1
  {
2
- "templates": {
3
- "AGENTS.md": {
4
- "reason": "Project keeps a mature custom agent roster and only imports new kit roles selectively.",
5
- "owner": "engineering",
6
- "reviewedAt": "2026-06-02"
7
- }
8
- }
2
+ "templates": {}
9
3
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "summary": {
3
- "pass": 62,
4
- "warn": 4,
3
+ "pass": 65,
4
+ "warn": 5,
5
5
  "fail": 0
6
6
  },
7
7
  "readiness": {
@@ -9,6 +9,7 @@
9
9
  "summary": "Agent kit setup is valid, but project-specific evidence still needs to replace starter placeholders.",
10
10
  "nextActions": [
11
11
  "Answer product summary, audience, workflows, auth/tenant model, UI direction, value proposition, and quality target with agent-kit setup or by editing .agent-kit/project-context.json.",
12
+ "Run agent-kit init --activate cursor to generate council subagents from the roster.",
12
13
  "Replace TBD adapter rows with date, owner, evidence, model-selection status, and known limitations for each active IDE.",
13
14
  "Replace TBD/example rows with real project evidence, or document why an item is not applicable before claiming strong or best-practice maturity.",
14
15
  "Add package.json with test, lint, and build scripts appropriate to the stack."
@@ -18,7 +19,7 @@
18
19
  {
19
20
  "level": "pass",
20
21
  "area": "install",
21
- "message": "Agent kit installed at version 0.1.3."
22
+ "message": "Agent kit installed at version 0.1.5."
22
23
  },
23
24
  {
24
25
  "level": "pass",
@@ -95,6 +96,11 @@
95
96
  "area": "templates",
96
97
  "message": "TESTING.md matches the current bundled template."
97
98
  },
99
+ {
100
+ "level": "pass",
101
+ "area": "templates",
102
+ "message": "LOOP_CODING.md matches the current bundled template."
103
+ },
98
104
  {
99
105
  "level": "pass",
100
106
  "area": "templates",
@@ -185,6 +191,11 @@
185
191
  "area": "agents",
186
192
  "message": ".agent-kit/schemas/onboarding-state.schema.json is present and parseable."
187
193
  },
194
+ {
195
+ "level": "pass",
196
+ "area": "agents",
197
+ "message": ".agent-kit/schemas/agentic-level.schema.json is present and parseable."
198
+ },
188
199
  {
189
200
  "level": "warn",
190
201
  "area": "studio",
@@ -266,6 +277,11 @@
266
277
  "area": "docs",
267
278
  "message": "TESTING.md exists."
268
279
  },
280
+ {
281
+ "level": "pass",
282
+ "area": "docs",
283
+ "message": "LOOP_CODING.md exists."
284
+ },
269
285
  {
270
286
  "level": "pass",
271
287
  "area": "docs",
@@ -291,6 +307,12 @@
291
307
  "area": "agents",
292
308
  "message": "ASSISTANT_ADAPTERS.md maps the council roster to tool-specific instruction surfaces."
293
309
  },
310
+ {
311
+ "level": "warn",
312
+ "area": "agents",
313
+ "message": "Cursor is marked Active but .cursor/agents/planner.md is missing.",
314
+ "remediation": "Run agent-kit init --activate cursor to generate council subagents from the roster."
315
+ },
294
316
  {
295
317
  "level": "warn",
296
318
  "area": "models",
@@ -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.3",
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.