@codemcp/ade 0.3.0 → 0.4.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.
@@ -56,3 +56,7 @@
56
56
  {"id":"ade-4.3","title":"Fix","description":"Implement the solution based on your analysis: - If exists: Follow the design from it - Otherwise: Elaborate design options and present them to the user Before implementing, assess the approach: - How critical is this system? What is the blast radius if the fix causes issues? - Should this be a minimal fix or a more comprehensive solution? Make targeted changes that address the root cause without introducing new issues. Be careful to maintain existing functionality while fixing the bug.","status":"open","priority":3,"issue_type":"task","owner":"github@beimir.net","created_at":"2026-03-19T10:33:07.076548+01:00","created_by":"Oliver Jägle","updated_at":"2026-03-19T10:33:07.076548+01:00","dependencies":[{"issue_id":"ade-4.3","depends_on_id":"ade-4","type":"parent-child","created_at":"0001-01-01T00:00:00Z"},{"issue_id":"ade-4.3","depends_on_id":"ade-4.2","type":"blocks","created_at":"0001-01-01T00:00:00Z"}]}
57
57
  {"id":"ade-4.4","title":"Verify","description":"Test the fix thoroughly to ensure the original bug is resolved and no new issues were introduced. Run existing tests, create new ones if needed, and verify the solution is robust.","status":"open","priority":3,"issue_type":"task","owner":"github@beimir.net","created_at":"2026-03-19T10:33:07.222264+01:00","created_by":"Oliver Jägle","updated_at":"2026-03-19T10:33:07.222264+01:00","dependencies":[{"issue_id":"ade-4.4","depends_on_id":"ade-4","type":"parent-child","created_at":"0001-01-01T00:00:00Z"},{"issue_id":"ade-4.4","depends_on_id":"ade-4.3","type":"blocks","created_at":"0001-01-01T00:00:00Z"}]}
58
58
  {"id":"ade-4.5","title":"Finalize","description":"Ensure code quality and documentation accuracy through systematic cleanup and review. **STEP 1: Code Cleanup** Systematically clean up development artifacts: - Remove all temporary debug output statements used during bug investigation (console logging, print statements, debug output functions) - Address each TODO/FIXME comment by either implementing the solution or documenting why it's deferred - Remove completed TODOs and convert remaining ones to proper issue tracking if needed - Remove temporary debugging code, test code blocks, and commented-out code - Ensure proper error handling replaces temporary debug logging **STEP 2: Documentation Review** Review and update documentation to reflect the bug fix: - If exists, update it if design details were refined or changed during the fix - Compare documentation against the actual bug fix implementation - Update only the documentation sections that have functional changes - Remove references to investigation iterations, progress notes, and temporary decisions - Ensure documentation describes the final fixed state, not the debugging process - Ask the user to review document updates **STEP 3: Final Validation** - Run existing tests to ensure cleanup didn't break functionality - Verify documentation accuracy with a final review - Ensure bug fix is ready for production - Update task progress and mark completed work as you finalize the bug fix","status":"open","priority":3,"issue_type":"task","owner":"github@beimir.net","created_at":"2026-03-19T10:33:07.356694+01:00","created_by":"Oliver Jägle","updated_at":"2026-03-19T10:33:07.356694+01:00","dependencies":[{"issue_id":"ade-4.5","depends_on_id":"ade-4","type":"parent-child","created_at":"0001-01-01T00:00:00Z"},{"issue_id":"ade-4.5","depends_on_id":"ade-4.4","type":"blocks","created_at":"0001-01-01T00:00:00Z"}]}
59
+ {"id":"ade-5","title":"ade: minor (development-plan-better-in-cli-explanation.md)","description":"Responsible vibe engineering session using minor workflow for ade","status":"open","priority":2,"issue_type":"task","owner":"github@beimir.net","created_at":"2026-03-19T11:33:13.313751+01:00","created_by":"Oliver Jägle","updated_at":"2026-03-19T11:33:13.313751+01:00"}
60
+ {"id":"ade-5.1","title":"Explore","description":"Understand the problem, analyze existing patterns, and design your approach. Consider the scope and impact of the change. **STEP 1: Analyze Requirements** - If exists: Use it to understand the required changes - Otherwise: Document requirements in your task management system **STEP 2: Review Design Approach** - If exists: Respect the design approach documented in - Otherwise: Design your approach based on the problem analysis **STEP 3: Document Decisions** - Document your analysis and design decisions - Create tasks to guide implementation - Focus on analysis and design only - do not write any code yet","status":"open","priority":3,"issue_type":"task","owner":"github@beimir.net","created_at":"2026-03-19T11:33:13.459272+01:00","created_by":"Oliver Jägle","updated_at":"2026-03-19T11:33:13.459272+01:00","dependencies":[{"issue_id":"ade-5.1","depends_on_id":"ade-5","type":"parent-child","created_at":"0001-01-01T00:00:00Z"}]}
61
+ {"id":"ade-5.2","title":"Implement","description":"Write clean, focused code for the minor enhancement, test your changes, and prepare for commit. **STEP 1: Review Design and Requirements** - If exists: Follow your design from - Otherwise: Elaborate design options and present them to the user - If exists: Ensure the relevant requirements from are met - Otherwise: Ensure existing requirements are met based on your task context **STEP 2: Implement Changes** - Write clean, focused code for the minor enhancement - Test your changes to ensure they work correctly and don't break existing functionality **STEP 3: Prepare for Finalization** - Update task progress as needed - Prepare documentation and commit when ready","status":"open","priority":3,"issue_type":"task","owner":"github@beimir.net","created_at":"2026-03-19T11:33:13.597501+01:00","created_by":"Oliver Jägle","updated_at":"2026-03-19T11:33:13.597501+01:00","dependencies":[{"issue_id":"ade-5.2","depends_on_id":"ade-5","type":"parent-child","created_at":"0001-01-01T00:00:00Z"},{"issue_id":"ade-5.2","depends_on_id":"ade-5.1","type":"blocks","created_at":"0001-01-01T00:00:00Z"}]}
62
+ {"id":"ade-5.3","title":"Finalize","description":"Ensure code quality and documentation accuracy through systematic cleanup and review. **STEP 1: Code Cleanup** Systematically clean up development artifacts: - **Remove Debug Output**: Search for and remove all temporary debug output statements used during development. Look for language-specific debug output methods (console logging, print statements, debug output functions). Remove any debugging statements that were added for development purposes. - **Review TODO/FIXME Comments**: - Address each TODO/FIXME comment by either implementing the solution or documenting why it's deferred - Remove completed TODOs - Convert remaining TODOs to proper issue tracking if needed - **Remove Debugging Code Blocks**: - Remove temporary debugging code, test code blocks, and commented-out code - Clean up any experimental code that's no longer needed - Ensure proper error handling replaces temporary debug logging **STEP 2: Documentation Review** Review and update documentation to reflect final implementation: - **Update Long-Term Memory Documents**: Based on what was actually implemented: - If exists: Update if requirements changed during development - If exists: Update if design details were refined or changed - **Compare Against Implementation**: Review documentation against actual implemented functionality - **Update Changed Sections**: Only modify documentation sections that have functional changes - **Remove Development Progress**: Remove references to development iterations, progress notes, and temporary decisions - **Focus on Final State**: Ensure documentation describes the final implemented state, not the development process - **Ask User to Review Document Updates** **STEP 3: Final Validation** - Run existing tests to ensure cleanup didn't break functionality - Verify documentation accuracy with a final review - Ensure minor enhancement is ready for delivery - Update task progress and mark completed work as you finalize the minor enhancement","status":"open","priority":3,"issue_type":"task","owner":"github@beimir.net","created_at":"2026-03-19T11:33:13.733496+01:00","created_by":"Oliver Jägle","updated_at":"2026-03-19T11:33:13.733496+01:00","dependencies":[{"issue_id":"ade-5.3","depends_on_id":"ade-5","type":"parent-child","created_at":"0001-01-01T00:00:00Z"},{"issue_id":"ade-5.3","depends_on_id":"ade-5.2","type":"blocks","created_at":"0001-01-01T00:00:00Z"}]}
@@ -1 +1 @@
1
- ade-4.5
1
+ ade-5.3
@@ -0,0 +1,24 @@
1
+ {
2
+ "conversationId": "ade-better-in-cli-explanation-b8jcv3",
3
+ "projectPath": "/Users/oliverjaegle/projects/privat/codemcp/ade",
4
+ "epicId": "ade-5",
5
+ "phaseTasks": [
6
+ {
7
+ "phaseId": "explore",
8
+ "phaseName": "Explore",
9
+ "taskId": "ade-5.1"
10
+ },
11
+ {
12
+ "phaseId": "implement",
13
+ "phaseName": "Implement",
14
+ "taskId": "ade-5.2"
15
+ },
16
+ {
17
+ "phaseId": "finalize",
18
+ "phaseName": "Finalize",
19
+ "taskId": "ade-5.3"
20
+ }
21
+ ],
22
+ "createdAt": "2026-03-19T10:33:13.963Z",
23
+ "updatedAt": "2026-03-19T10:33:13.963Z"
24
+ }
@@ -0,0 +1,64 @@
1
+ # Development Plan: ade (better-in-cli-explanation branch)
2
+
3
+ *Generated on 2026-03-19 by Vibe Feature MCP*
4
+ *Workflow: [minor](https://mrsimpson.github.io/responsible-vibe-mcp/workflows/minor)*
5
+
6
+ ## Goal
7
+ Improve user guidance in the ADE CLI — add contextual introductory text to help users understand what ADE is and what each setup facet (Process, Architecture, Practices, Autonomy, Backpressure, Harnesses, Docsets) means before they make a selection.
8
+
9
+ ## Explore
10
+ <!-- beads-phase-id: ade-5.1 -->
11
+ ### Tasks
12
+ - [x] Read and understand current CLI structure (index.ts, setup.ts, install.ts)
13
+ - [x] Read all facet definitions (process, architecture, practices, autonomy, backpressure)
14
+ - [x] Identify all prompts where contextual guidance is missing
15
+
16
+ ### Findings
17
+ - The setup command starts with `clack.intro("ade setup")` — no explanation of what ADE is or what the wizard will do
18
+ - Facet prompts show only `facet.label` as the message — no educational context about what the facet means
19
+ - The harness prompt says "which coding agents should receive config?" — helpful but no context on what harnesses are
20
+ - The docset prompt says "deselect any you don't need" — no explanation of what docsets are used for
21
+ - The skill install confirm says only "Install N skill(s) now?" — no context on what skills are
22
+ - `index.ts` help text is minimal — no explanation of ADE's purpose
23
+
24
+ ### Phase Entrance Criteria for Implement:
25
+ - [x] All touchpoints where user guidance is missing have been identified
26
+ - [x] Content approach is clear (what to say at each step)
27
+ - [x] No ambiguity about scope (we're adding text/hints, not redesigning prompts)
28
+
29
+ ## Implement
30
+ <!-- beads-phase-id: ade-5.2 -->
31
+
32
+ ### Phase Entrance Criteria:
33
+ - [x] Explore phase findings are complete
34
+ - [x] All identified touchpoints for improvement are listed
35
+ - [x] Scope is clearly defined: text additions only, no structural changes
36
+
37
+ ### Tasks
38
+ *Tasks managed via `bd` CLI*
39
+
40
+ ## Finalize
41
+ <!-- beads-phase-id: ade-5.3 -->
42
+
43
+ ### Phase Entrance Criteria:
44
+ - [x] All identified touchpoints have been addressed with guidance text
45
+ - [x] Code compiles without errors
46
+ - [x] Changes look correct and consistent in tone
47
+
48
+ ### Tasks
49
+ - [ ] Squash WIP commits: `git reset --soft <first commit of this branch>`. Then, create a conventional commit. In the message, first summarize the intentions and key decisions from the development plan. Then, add a brief summary of the key changes and their side effects and dependencies
50
+
51
+ *Tasks managed via `bd` CLI*
52
+
53
+ ## Key Decisions
54
+ - Used `clack.note()` for the ADE intro (boxed, titled) to make it stand out as orientation content vs. action prompts
55
+ - Used `clack.log.info()` before each facet/section prompt — lightweight, doesn't interrupt the flow, provides context without being intrusive
56
+ - Facet descriptions from the catalog data model are reused directly (they were already well-written) rather than duplicated elsewhere
57
+ - Harness guidance explicitly calls out the 'universal' option since it's the most common default and its purpose isn't obvious from the name alone
58
+ - Skill install context placed immediately before the confirm prompt so it reads naturally in sequence
59
+
60
+ ## Notes
61
+ *Additional context and observations*
62
+
63
+ ---
64
+ *This plan is maintained by the LLM and uses beads CLI for task management. Tool responses provide guidance on which bd commands to use for task management.*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemcp/ade",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "ADE CLI — Agentic Development Environment setup and configuration tool",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -11697,6 +11697,25 @@ ${t("cyan", x2)}
11697
11697
  }
11698
11698
  } }).prompt();
11699
11699
  };
11700
+ var jt = (e) => t("dim", e);
11701
+ var kt2 = (e, r2, s) => {
11702
+ const i = { hard: true, trim: false }, a = J2(e, r2, i).split(`
11703
+ `), o2 = a.reduce((n, c) => Math.max(D2(c), n), 0), u2 = a.map(s).reduce((n, c) => Math.max(D2(c), n), 0), l = r2 - (u2 - o2);
11704
+ return J2(e, l, i);
11705
+ };
11706
+ var Vt2 = (e = "", r2 = "", s) => {
11707
+ const i = s?.output ?? N2.stdout, a = s?.withGuide ?? _.withGuide, o2 = s?.format ?? jt, u2 = ["", ...kt2(e, rt(i) - 6, o2).split(`
11708
+ `).map(o2), ""], l = D2(r2), n = Math.max(u2.reduce((g2, E) => {
11709
+ const $2 = D2(E);
11710
+ return $2 > g2 ? $2 : g2;
11711
+ }, 0), l) + 2, c = u2.map((g2) => `${t("gray", h)} ${g2}${" ".repeat(n - D2(g2))}${t("gray", h)}`).join(`
11712
+ `), p2 = a ? `${t("gray", h)}
11713
+ ` : "", f = a ? We : ge;
11714
+ i.write(`${p2}${t("green", V)} ${t("reset", r2)} ${t("gray", se.repeat(Math.max(n - l - 1, 1)) + pe)}
11715
+ ${c}
11716
+ ${t("gray", f + se.repeat(n + 2) + me)}
11717
+ `);
11718
+ };
11700
11719
  var ze = { light: I2("\u2500", "-"), heavy: I2("\u2501", "="), block: I2("\u2588", "#") };
11701
11720
  var oe = (e, r2) => e.includes(`
11702
11721
  `) ? e.split(`
@@ -11881,7 +11900,7 @@ function createDefaultRegistry() {
11881
11900
  var processFacet = {
11882
11901
  id: "process",
11883
11902
  label: "Process",
11884
- description: "How your AI agent receives and executes tasks",
11903
+ description: "How will you guide your agent",
11885
11904
  required: true,
11886
11905
  options: [
11887
11906
  {
@@ -12356,7 +12375,7 @@ var architectureFacet = {
12356
12375
  var practicesFacet = {
12357
12376
  id: "practices",
12358
12377
  label: "Practices",
12359
- description: "Composable development practices \u2014 mix and match regardless of stack",
12378
+ description: "Development practices \u2014 mix and match regardless of stack",
12360
12379
  required: false,
12361
12380
  multiSelect: true,
12362
12381
  options: [
@@ -12588,7 +12607,7 @@ var JAVA_UNIT_TEST_RECIPE = [
12588
12607
  var backpressureFacet = {
12589
12608
  id: "backpressure",
12590
12609
  label: "Backpressure",
12591
- description: "Install git hooks that enforce quality gates \u2014 silent on success, surface only relevant failures",
12610
+ description: "Which automated quality gates to put in place. Translates to git hooks",
12592
12611
  required: false,
12593
12612
  multiSelect: true,
12594
12613
  dependsOn: ["architecture"],
@@ -12647,31 +12666,31 @@ var autonomyFacet = {
12647
12666
  multiSelect: false,
12648
12667
  options: [
12649
12668
  {
12650
- id: "rigid",
12651
- label: "Rigid",
12652
- description: "Keep built-in capabilities approval-gated and require confirmation before acting",
12669
+ id: "sensible-defaults",
12670
+ label: "Sensible defaults",
12671
+ description: "Allow a curated built-in capabilities set while keeping potentially risky actions approval-gated",
12653
12672
  recipe: [
12654
12673
  {
12655
12674
  writer: "permission-policy",
12656
- config: { profile: "rigid" }
12675
+ config: { profile: "sensible-defaults" }
12657
12676
  }
12658
12677
  ]
12659
12678
  },
12660
12679
  {
12661
- id: "sensible-defaults",
12662
- label: "Sensible defaults",
12663
- description: "Allow a curated low-risk built-in capability set while keeping web access approval-gated",
12680
+ id: "rigid",
12681
+ label: "Rigid",
12682
+ description: "Keep built-in capabilities approval-gated and require confirmation before acting",
12664
12683
  recipe: [
12665
12684
  {
12666
12685
  writer: "permission-policy",
12667
- config: { profile: "sensible-defaults" }
12686
+ config: { profile: "rigid" }
12668
12687
  }
12669
12688
  ]
12670
12689
  },
12671
12690
  {
12672
12691
  id: "max-autonomy",
12673
12692
  label: "Max autonomy",
12674
- description: "Allow broad local built-in autonomy while keeping web access approval-gated",
12693
+ description: "Allow broad local built-in autonomy. Recommended for sandboxed environments only",
12675
12694
  recipe: [
12676
12695
  {
12677
12696
  writer: "permission-policy",
@@ -22681,7 +22700,35 @@ function getHarnessIds() {
22681
22700
 
22682
22701
  // src/commands/setup.ts
22683
22702
  async function runSetup(projectRoot, catalog) {
22684
- Wt2("ade setup");
22703
+ let lineIndex = 0;
22704
+ const LOGO_LINES = [
22705
+ "\n",
22706
+ " \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 ",
22707
+ "\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557",
22708
+ "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D",
22709
+ "\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u255D ",
22710
+ "\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 ",
22711
+ "\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D ",
22712
+ "\n"
22713
+ ];
22714
+ for (const line of LOGO_LINES) {
22715
+ lineIndex++;
22716
+ if (lineIndex === 1) {
22717
+ Wt2(line);
22718
+ } else {
22719
+ console.log(`\u2502 ${line}`);
22720
+ }
22721
+ }
22722
+ Vt2(
22723
+ [
22724
+ "You're about to define how your team works with coding agents.",
22725
+ "",
22726
+ "Pick your facets \u2014 architecture, practices, process \u2014 and ADE",
22727
+ "translates them into a shared information hierarchy your agents",
22728
+ "read from the repo. One setup, consistent across the whole team."
22729
+ ].join("\n"),
22730
+ "ADE \u2014 Agentic Development Environment"
22731
+ );
22685
22732
  const existingConfig = await readUserConfig(projectRoot);
22686
22733
  const existingChoices = existingConfig?.choices ?? {};
22687
22734
  for (const [facetId, value] of Object.entries(existingChoices)) {
@@ -22726,7 +22773,7 @@ async function runSetup(projectRoot, catalog) {
22726
22773
  let excludedDocsets;
22727
22774
  if (impliedDocsets.length > 0) {
22728
22775
  const selected = await Lt2({
22729
- message: "Documentation \u2014 deselect any you don't need",
22776
+ message: "Documentation sources \u2014 Those will be pulled to your local disk for browsing on demand",
22730
22777
  options: impliedDocsets.map((d3) => ({
22731
22778
  value: d3.id,
22732
22779
  label: d3.label,
@@ -22755,7 +22802,7 @@ async function runSetup(projectRoot, catalog) {
22755
22802
  (h3) => allHarnessWriters.some((w2) => w2.id === h3)
22756
22803
  );
22757
22804
  const selectedHarnesses = await Lt2({
22758
- message: "Harnesses \u2014 which coding agents should receive config?",
22805
+ message: "Which coding agents should receive config?\nADE generates config files for each agent you select.\n",
22759
22806
  options: harnessOptions,
22760
22807
  initialValues: validExistingHarnesses && validExistingHarnesses.length > 0 ? validExistingHarnesses : ["universal"],
22761
22808
  required: false
@@ -22797,8 +22844,12 @@ To use the latest defaults, remove .ade/skills/ and re-run setup.`
22797
22844
  );
22798
22845
  }
22799
22846
  if (logicalConfig.skills.length > 0) {
22847
+ const skillNames = logicalConfig.skills.map((s) => ` \u2022 ${s.name}`).join("\n");
22800
22848
  const confirmInstall = await Rt({
22801
- message: `Install ${logicalConfig.skills.length} skill(s) now?`,
22849
+ message: `Install ${logicalConfig.skills.length} skill(s) now?
22850
+ ` + skillNames + `
22851
+ You can also install them later with:
22852
+ npx @codemcp/skills experimental_install`,
22802
22853
  initialValue: true
22803
22854
  });
22804
22855
  if (typeof confirmInstall === "symbol") {
@@ -22845,7 +22896,7 @@ function promptSelect(facet, existingChoices) {
22845
22896
  }
22846
22897
  const initialValue = getValidInitialValue(facet, existingChoices);
22847
22898
  return Jt({
22848
- message: facet.label,
22899
+ message: `${facet.label} \u2014 ${facet.description}`,
22849
22900
  options: options2,
22850
22901
  ...initialValue !== void 0 && { initialValue }
22851
22902
  });
@@ -22858,7 +22909,7 @@ function promptMultiSelect(facet, existingChoices) {
22858
22909
  }));
22859
22910
  const initialValues = getValidInitialValues(facet, existingChoices);
22860
22911
  return Lt2({
22861
- message: facet.label,
22912
+ message: `${facet.label} \u2014 ${facet.description}`,
22862
22913
  options: options2,
22863
22914
  required: false,
22864
22915
  ...initialValues !== void 0 && { initialValues }
@@ -22943,7 +22994,14 @@ if (command === "setup") {
22943
22994
  console.log(version);
22944
22995
  } else {
22945
22996
  const allIds = getHarnessIds();
22946
- console.log(`ade v${version}`);
22997
+ console.log(`ade v${version} \u2014 Agentic Development Environment`);
22998
+ console.log();
22999
+ console.log(
23000
+ "Define how your team works with coding agents \u2014 pick your facets,"
23001
+ );
23002
+ console.log(
23003
+ "ADE translates them into a shared information hierarchy in your repo."
23004
+ );
22947
23005
  console.log();
22948
23006
  console.log("Usage: ade <command> [options]");
22949
23007
  console.log();
@@ -39,5 +39,5 @@
39
39
  "typescript": "catalog:",
40
40
  "vitest": "catalog:"
41
41
  },
42
- "version": "0.3.0"
42
+ "version": "0.4.0"
43
43
  }
@@ -6,6 +6,7 @@ import { join } from "node:path";
6
6
  vi.mock("@clack/prompts", () => ({
7
7
  intro: vi.fn(),
8
8
  outro: vi.fn(),
9
+ note: vi.fn(),
9
10
  select: vi.fn(),
10
11
  multiselect: vi.fn(),
11
12
  confirm: vi.fn().mockResolvedValue(true),
@@ -7,6 +7,7 @@ import { join } from "node:path";
7
7
  vi.mock("@clack/prompts", () => ({
8
8
  intro: vi.fn(),
9
9
  outro: vi.fn(),
10
+ note: vi.fn(),
10
11
  log: { info: vi.fn(), warn: vi.fn(), error: vi.fn() },
11
12
  select: vi.fn(),
12
13
  multiselect: vi.fn(),
@@ -6,6 +6,7 @@ import { join } from "node:path";
6
6
  vi.mock("@clack/prompts", () => ({
7
7
  intro: vi.fn(),
8
8
  outro: vi.fn(),
9
+ note: vi.fn(),
9
10
  select: vi.fn(),
10
11
  multiselect: vi.fn(),
11
12
  confirm: vi.fn(),
@@ -7,11 +7,13 @@ import { join } from "node:path";
7
7
  vi.mock("@clack/prompts", () => ({
8
8
  intro: vi.fn(),
9
9
  outro: vi.fn(),
10
+ note: vi.fn(),
10
11
  select: vi.fn(),
11
12
  multiselect: vi.fn(),
12
13
  confirm: vi.fn(),
13
14
  isCancel: vi.fn().mockReturnValue(false),
14
15
  cancel: vi.fn(),
16
+ log: { info: vi.fn(), warn: vi.fn() },
15
17
  spinner: vi.fn().mockReturnValue({ start: vi.fn(), stop: vi.fn() })
16
18
  }));
17
19
 
@@ -6,6 +6,7 @@ import type { Catalog, LogicalConfig } from "@codemcp/ade-core";
6
6
  vi.mock("@clack/prompts", () => ({
7
7
  intro: vi.fn(),
8
8
  outro: vi.fn(),
9
+ note: vi.fn(),
9
10
  select: vi.fn(),
10
11
  multiselect: vi.fn(),
11
12
  confirm: vi.fn(),
@@ -298,7 +299,7 @@ describe("runSetup", () => {
298
299
  expect(clack.multiselect).toHaveBeenCalledTimes(1);
299
300
  expect(clack.multiselect).toHaveBeenCalledWith(
300
301
  expect.objectContaining({
301
- message: expect.stringContaining("Harnesses")
302
+ message: expect.stringContaining("coding agents")
302
303
  })
303
304
  );
304
305
  });
@@ -26,7 +26,35 @@ export async function runSetup(
26
26
  projectRoot: string,
27
27
  catalog: Catalog
28
28
  ): Promise<void> {
29
- clack.intro("ade setup");
29
+ let lineIndex = 0;
30
+ const LOGO_LINES = [
31
+ "\n",
32
+ " █████╗ ██████╗ ███████╗ ███████╗███████╗████████╗██╗ ██╗██████╗ ",
33
+ "██╔══██╗██╔══██╗██╔════╝ ██╔════╝██╔════╝╚══██╔══╝██║ ██║██╔══██╗",
34
+ "███████║██║ ██║█████╗ ███████╗█████╗ ██║ ██║ ██║██████╔╝",
35
+ "██╔══██║██║ ██║██╔══╝ ╚════██║██╔══╝ ██║ ██║ ██║██╔═══╝ ",
36
+ "██║ ██║██████╔╝███████╗ ███████║███████╗ ██║ ╚██████╔╝██║ ",
37
+ "╚═╝ ╚═╝╚═════╝ ╚══════╝ ╚══════╝╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ",
38
+ "\n"
39
+ ];
40
+ for (const line of LOGO_LINES) {
41
+ lineIndex++;
42
+ if (lineIndex === 1) {
43
+ clack.intro(line);
44
+ } else {
45
+ console.log(`│ ${line}`);
46
+ }
47
+ }
48
+ clack.note(
49
+ [
50
+ "You're about to define how your team works with coding agents.",
51
+ "",
52
+ "Pick your facets — architecture, practices, process — and ADE",
53
+ "translates them into a shared information hierarchy your agents",
54
+ "read from the repo. One setup, consistent across the whole team."
55
+ ].join("\n"),
56
+ "ADE — Agentic Development Environment"
57
+ );
30
58
 
31
59
  const existingConfig = await readUserConfig(projectRoot);
32
60
  const existingChoices = existingConfig?.choices ?? {};
@@ -83,7 +111,8 @@ export async function runSetup(
83
111
 
84
112
  if (impliedDocsets.length > 0) {
85
113
  const selected = await clack.multiselect({
86
- message: "Documentation — deselect any you don't need",
114
+ message:
115
+ "Documentation sources — Those will be pulled to your local disk for browsing on demand",
87
116
  options: impliedDocsets.map((d) => ({
88
117
  value: d.id,
89
118
  label: d.label,
@@ -120,7 +149,9 @@ export async function runSetup(
120
149
  );
121
150
 
122
151
  const selectedHarnesses = await clack.multiselect({
123
- message: "Harnesses — which coding agents should receive config?",
152
+ message:
153
+ "Which coding agents should receive config?\n" +
154
+ "ADE generates config files for each agent you select.\n",
124
155
  options: harnessOptions,
125
156
  initialValues:
126
157
  validExistingHarnesses && validExistingHarnesses.length > 0
@@ -173,8 +204,14 @@ export async function runSetup(
173
204
  }
174
205
 
175
206
  if (logicalConfig.skills.length > 0) {
207
+ const skillNames = logicalConfig.skills
208
+ .map((s) => ` • ${s.name}`)
209
+ .join("\n");
176
210
  const confirmInstall = await clack.confirm({
177
- message: `Install ${logicalConfig.skills.length} skill(s) now?`,
211
+ message:
212
+ `Install ${logicalConfig.skills.length} skill(s) now?\n` +
213
+ skillNames +
214
+ `\nYou can also install them later with:\n npx @codemcp/skills experimental_install`,
178
215
  initialValue: true
179
216
  });
180
217
 
@@ -243,7 +280,7 @@ function promptSelect(
243
280
  const initialValue = getValidInitialValue(facet, existingChoices);
244
281
 
245
282
  return clack.select({
246
- message: facet.label,
283
+ message: `${facet.label} — ${facet.description}`,
247
284
  options,
248
285
  ...(initialValue !== undefined && { initialValue })
249
286
  });
@@ -262,7 +299,7 @@ function promptMultiSelect(
262
299
  const initialValues = getValidInitialValues(facet, existingChoices);
263
300
 
264
301
  return clack.multiselect({
265
- message: facet.label,
302
+ message: `${facet.label} — ${facet.description}`,
266
303
  options,
267
304
  required: false,
268
305
  ...(initialValues !== undefined && { initialValues })
@@ -31,7 +31,14 @@ if (command === "setup") {
31
31
  console.log(version);
32
32
  } else {
33
33
  const allIds = getHarnessIds();
34
- console.log(`ade v${version}`);
34
+ console.log(`ade v${version} — Agentic Development Environment`);
35
+ console.log();
36
+ console.log(
37
+ "Define how your team works with coding agents — pick your facets,"
38
+ );
39
+ console.log(
40
+ "ADE translates them into a shared information hierarchy in your repo."
41
+ );
35
42
  console.log();
36
43
  console.log("Usage: ade <command> [options]");
37
44
  console.log();
@@ -38,5 +38,5 @@
38
38
  "typescript": "catalog:",
39
39
  "vitest": "catalog:"
40
40
  },
41
- "version": "0.3.0"
41
+ "version": "0.4.0"
42
42
  }
@@ -470,8 +470,8 @@ describe("catalog", () => {
470
470
  expect(autonomy!.required).toBe(false);
471
471
  expect(autonomy!.multiSelect).toBe(false);
472
472
  expect(autonomy!.options.map((option) => option.id)).toEqual([
473
- "rigid",
474
473
  "sensible-defaults",
474
+ "rigid",
475
475
  "max-autonomy"
476
476
  ]);
477
477
  });
@@ -9,26 +9,26 @@ export const autonomyFacet: Facet = {
9
9
  multiSelect: false,
10
10
  options: [
11
11
  {
12
- id: "rigid",
13
- label: "Rigid",
12
+ id: "sensible-defaults",
13
+ label: "Sensible defaults",
14
14
  description:
15
- "Keep built-in capabilities approval-gated and require confirmation before acting",
15
+ "Allow a curated built-in capabilities set while keeping potentially risky actions approval-gated",
16
16
  recipe: [
17
17
  {
18
18
  writer: "permission-policy",
19
- config: { profile: "rigid" }
19
+ config: { profile: "sensible-defaults" }
20
20
  }
21
21
  ]
22
22
  },
23
23
  {
24
- id: "sensible-defaults",
25
- label: "Sensible defaults",
24
+ id: "rigid",
25
+ label: "Rigid",
26
26
  description:
27
- "Allow a curated low-risk built-in capability set while keeping web access approval-gated",
27
+ "Keep built-in capabilities approval-gated and require confirmation before acting",
28
28
  recipe: [
29
29
  {
30
30
  writer: "permission-policy",
31
- config: { profile: "sensible-defaults" }
31
+ config: { profile: "rigid" }
32
32
  }
33
33
  ]
34
34
  },
@@ -36,7 +36,7 @@ export const autonomyFacet: Facet = {
36
36
  id: "max-autonomy",
37
37
  label: "Max autonomy",
38
38
  description:
39
- "Allow broad local built-in autonomy while keeping web access approval-gated",
39
+ "Allow broad local built-in autonomy. Recommended for sandboxed environments only",
40
40
  recipe: [
41
41
  {
42
42
  writer: "permission-policy",
@@ -89,7 +89,7 @@ export const backpressureFacet: Facet = {
89
89
  id: "backpressure",
90
90
  label: "Backpressure",
91
91
  description:
92
- "Install git hooks that enforce quality gates silent on success, surface only relevant failures",
92
+ "Which automated quality gates to put in place. Translates to git hooks",
93
93
  required: false,
94
94
  multiSelect: true,
95
95
  dependsOn: ["architecture"],
@@ -3,8 +3,7 @@ import type { Facet } from "../../types.js";
3
3
  export const practicesFacet: Facet = {
4
4
  id: "practices",
5
5
  label: "Practices",
6
- description:
7
- "Composable development practices — mix and match regardless of stack",
6
+ description: "Development practices — mix and match regardless of stack",
8
7
  required: false,
9
8
  multiSelect: true,
10
9
  options: [
@@ -3,7 +3,7 @@ import type { Facet } from "../../types.js";
3
3
  export const processFacet: Facet = {
4
4
  id: "process",
5
5
  label: "Process",
6
- description: "How your AI agent receives and executes tasks",
6
+ description: "How will you guide your agent",
7
7
  required: true,
8
8
  options: [
9
9
  {
@@ -40,5 +40,5 @@
40
40
  "typescript": "catalog:",
41
41
  "vitest": "catalog:"
42
42
  },
43
- "version": "0.3.0"
43
+ "version": "0.4.0"
44
44
  }