@evo-dev/evodev 0.0.1-alpha.14 → 0.0.1-alpha.15

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.
@@ -4,13 +4,13 @@
4
4
  "name": "EvoDev"
5
5
  },
6
6
  "description": "EvoDev Claude Code hook plugins for AI-assisted R&D workflows.",
7
- "version": "0.0.1-alpha.14",
7
+ "version": "0.0.1-alpha.15",
8
8
  "plugins": [
9
9
  {
10
10
  "name": "evodev",
11
11
  "source": "./packages/plugin",
12
12
  "description": "EvoDev hook integration for disciplined AI coding workflows.",
13
- "version": "0.0.1-alpha.14",
13
+ "version": "0.0.1-alpha.15",
14
14
  "author": {
15
15
  "name": "EvoDev"
16
16
  },
package/dist/index.js CHANGED
@@ -25675,6 +25675,7 @@ async function runInit(options = {}) {
25675
25675
  prompter: options.prompter,
25676
25676
  progress: options.progress
25677
25677
  });
25678
+ const includedProjects = await resolveInitIncludedProjects(homeDir);
25678
25679
  const doctorRan = doctorResult !== null;
25679
25680
  const warnings = collectWarnings(syncResult, hookInstallResults, projectRegistrationResults, answers.runDoctor, doctorRan);
25680
25681
  emitInitProgress(options.progress, {
@@ -25697,6 +25698,7 @@ async function runInit(options = {}) {
25697
25698
  pluginInstallResults,
25698
25699
  hookInstallResults,
25699
25700
  syncResult,
25701
+ includedProjects,
25700
25702
  projectRegistrationResults,
25701
25703
  warnings
25702
25704
  }));
@@ -25758,7 +25760,7 @@ function formatInitSummary(input) {
25758
25760
  ...result.warnings.map((warning) => ` ⚠️ ${warning}`),
25759
25761
  ...result.errors.map((error) => ` ❌ ${error}`)
25760
25762
  ]) ?? [" - skipped"];
25761
- const projectLines = formatProjectRegistrationLines(input.projectRegistrationResults);
25763
+ const projectLines = formatProjectRegistrationLines(input.projectRegistrationResults, input.includedProjects ?? []);
25762
25764
  const warningLines = formatSummaryWarningLines(input.warnings, input.syncResult);
25763
25765
  return [
25764
25766
  "EvoDev init result",
@@ -25843,13 +25845,25 @@ function formatHookInstallLines(results) {
25843
25845
  ...result.warnings.map((warning) => ` ⚠️ ${warning}`)
25844
25846
  ]);
25845
25847
  }
25846
- function formatProjectRegistrationLines(results) {
25847
- if (results.length === 0)
25848
- return [" - no new projects registered"];
25849
- return results.map((result) => {
25850
- const icon = result.status === "failed" ? "❌" : "✅";
25851
- return ` ${icon} ${result.displayName} (${result.projectKey}): ${result.status}`;
25852
- });
25848
+ function formatProjectRegistrationLines(results, includedProjects) {
25849
+ if (includedProjects.length === 0 && results.length === 0) {
25850
+ return [" - no projects included"];
25851
+ }
25852
+ const lines = [];
25853
+ if (includedProjects.length > 0) {
25854
+ lines.push(` Included projects (${includedProjects.length}):`);
25855
+ lines.push(...includedProjects.map((project) => ` ✅ ${project.displayName} (${project.workspaceRoot})`));
25856
+ }
25857
+ if (results.length > 0) {
25858
+ lines.push(` Changes this run (${results.length}):`);
25859
+ lines.push(...results.map((result) => {
25860
+ const icon = result.status === "failed" ? "❌" : "✅";
25861
+ return ` ${icon} ${result.displayName} (${result.projectKey}): ${result.status}`;
25862
+ }));
25863
+ } else {
25864
+ lines.push(" Changes this run: none");
25865
+ }
25866
+ return lines;
25853
25867
  }
25854
25868
  function formatPluginInstallIcon(status) {
25855
25869
  switch (status) {
@@ -25938,25 +25952,26 @@ function createInteractivePrompter(promptApi = defaultPromptApi) {
25938
25952
  validate: (choices) => choices.length > 0 || "Select at least one Code Agent."
25939
25953
  }));
25940
25954
  },
25941
- async selectProjects(candidates2) {
25955
+ async selectProjects(candidates2, includedProjects = []) {
25942
25956
  const recommendedProjectKeys = candidates2.filter((candidate) => candidate.recommended).map((candidate) => candidate.projectKey);
25957
+ const includedCount = includedProjects.length;
25943
25958
  const mode = await promptApi.select({
25944
- message: "How should projects be included in EvoDev progression?",
25959
+ message: includedCount === 0 ? "How should new Git projects be added to EvoDev progression?" : `${formatIncludedProjectPromptSummary(includedProjects)}. How should new Git projects be added?`,
25945
25960
  choices: [
25946
25961
  {
25947
25962
  value: "recommended",
25948
- name: `Use all recommended projects (${recommendedProjectKeys.length})`,
25949
- description: "Git workspaces seen within 90 days, outside root, HOME, and temporary locations."
25963
+ name: `Add all recommended new projects (${recommendedProjectKeys.length})`,
25964
+ description: "Recently used Git projects discovered from Claude Code or Codex activity."
25950
25965
  },
25951
25966
  {
25952
25967
  value: "manual",
25953
- name: "Choose projects manually",
25954
- description: "Review all valid discovered workspaces and select only what you want."
25968
+ name: "Choose new Git projects manually",
25969
+ description: "Review unregistered Git projects and select only what you want to add."
25955
25970
  },
25956
25971
  {
25957
25972
  value: "skip",
25958
- name: "Skip for now",
25959
- description: "Do not register any projects during this init."
25973
+ name: "Keep current projects",
25974
+ description: "Do not add any projects during this init."
25960
25975
  }
25961
25976
  ],
25962
25977
  default: "recommended"
@@ -25968,7 +25983,7 @@ function createInteractivePrompter(promptApi = defaultPromptApi) {
25968
25983
  return [];
25969
25984
  }
25970
25985
  const selected = await promptApi.checkbox({
25971
- message: "Select projects to include in EvoDev progression",
25986
+ message: "Select new Git projects to add to EvoDev progression",
25972
25987
  choices: createInitProjectChoices(candidates2),
25973
25988
  required: false,
25974
25989
  pageSize: 15,
@@ -25979,6 +25994,12 @@ function createInteractivePrompter(promptApi = defaultPromptApi) {
25979
25994
  }
25980
25995
  };
25981
25996
  }
25997
+ function formatIncludedProjectPromptSummary(projects2) {
25998
+ const visibleNames = projects2.slice(0, 3).map((project) => project.displayName);
25999
+ const remaining = projects2.length - visibleNames.length;
26000
+ const names = `${visibleNames.join(", ")}${remaining > 0 ? `, +${remaining} more` : ""}`;
26001
+ return `${projects2.length} project${projects2.length === 1 ? " is" : "s are"} already included (${names})`;
26002
+ }
25982
26003
  var defaultPromptApi = {
25983
26004
  checkbox: dist_default4,
25984
26005
  select: dist_default5
@@ -26002,7 +26023,7 @@ function createCodeAgentChoices(defaultValue) {
26002
26023
  function createInitProjectChoices(candidates2) {
26003
26024
  return candidates2.map((candidate) => ({
26004
26025
  value: candidate.projectKey,
26005
- name: `${candidate.displayName} (${candidate.workspaceKind})`,
26026
+ name: `${candidate.displayName} (Git)`,
26006
26027
  description: `${candidate.workspaceRoot} · ${candidate.recommendationReason}`,
26007
26028
  checked: candidate.recommended
26008
26029
  }));
@@ -26046,8 +26067,11 @@ async function resolveInitProjectCandidate(input) {
26046
26067
  const recentlySeen = Number.isFinite(lastSeenAt) && lastSeenAt >= input.cutoff;
26047
26068
  const insideHome = input.homeRoot !== null && isPathWithin(input.homeRoot, workspace.workspaceRoot);
26048
26069
  const excludedLocation = workspace.workspaceRoot === parse2(workspace.workspaceRoot).root || workspace.workspaceRoot === input.homeRoot || !insideHome && input.temporaryRoots.some((root) => isPathWithin(root, workspace.workspaceRoot));
26049
- const recommended = workspace.workspaceKind === "git" && recentlySeen && !excludedLocation;
26050
- const recommendationReason = recommended ? `recommended: Git workspace seen within ${INIT_RECOMMENDED_PROJECT_MAX_AGE_DAYS} days` : workspace.workspaceKind === "directory" ? "not preselected: directory workspace" : excludedLocation ? "not preselected: root, HOME, or temporary location" : `not preselected: not seen within ${INIT_RECOMMENDED_PROJECT_MAX_AGE_DAYS} days`;
26070
+ if (workspace.workspaceKind !== "git" || excludedLocation) {
26071
+ return null;
26072
+ }
26073
+ const recommended = recentlySeen;
26074
+ const recommendationReason = recommended ? `recommended: Git workspace seen within ${INIT_RECOMMENDED_PROJECT_MAX_AGE_DAYS} days` : `not preselected: not seen within ${INIT_RECOMMENDED_PROJECT_MAX_AGE_DAYS} days`;
26051
26075
  return {
26052
26076
  projectKey: input.discovered.projectKey,
26053
26077
  displayName: input.discovered.displayName,
@@ -26073,12 +26097,13 @@ async function registerInitProjects(input) {
26073
26097
  homeDir: input.homeDir,
26074
26098
  now: input.now
26075
26099
  });
26100
+ const includedProjects = await resolveInitIncludedProjects(input.homeDir);
26076
26101
  if (candidates2.length === 0) {
26077
26102
  emitInitProgress(input.progress, {
26078
26103
  status: "skipped",
26079
26104
  current: 6,
26080
26105
  label: "Register projects",
26081
- detail: "no valid discovered workspaces"
26106
+ detail: includedProjects.length === 0 ? "no new Git projects discovered" : `${includedProjects.length} already included; no new Git projects`
26082
26107
  });
26083
26108
  return [];
26084
26109
  }
@@ -26087,7 +26112,7 @@ async function registerInitProjects(input) {
26087
26112
  selectedProjectKeys = candidates2.filter((candidate) => candidate.recommended).map((candidate) => candidate.projectKey);
26088
26113
  } else if (input.prompter?.selectProjects !== undefined) {
26089
26114
  await input.progress?.clear?.();
26090
- selectedProjectKeys = await input.prompter.selectProjects(candidates2);
26115
+ selectedProjectKeys = await input.prompter.selectProjects(candidates2, includedProjects);
26091
26116
  }
26092
26117
  const candidatesByKey = new Map(candidates2.map((candidate) => [candidate.projectKey, candidate]));
26093
26118
  const selectedCandidates = unique2(selectedProjectKeys).map((projectKey) => candidatesByKey.get(projectKey)).filter((candidate) => candidate !== undefined);
@@ -26138,6 +26163,18 @@ async function registerInitProjects(input) {
26138
26163
  });
26139
26164
  return results;
26140
26165
  }
26166
+ async function resolveInitIncludedProjects(homeDir) {
26167
+ const projects2 = await listRegisteredProjects({ homeDir });
26168
+ return projects2.map(toInitIncludedProject);
26169
+ }
26170
+ function toInitIncludedProject(project) {
26171
+ return {
26172
+ projectKey: project.projectKey,
26173
+ displayName: project.displayName,
26174
+ workspaceRoot: project.workspaceRoot,
26175
+ workspaceKind: project.workspaceKind
26176
+ };
26177
+ }
26141
26178
  async function resolveTemporaryRoots() {
26142
26179
  const roots = await Promise.all([tmpdir(), "/tmp", "/private/tmp", "/var/tmp"].map(canonicalExistingPath));
26143
26180
  return unique2(roots.filter((root) => root !== null));
@@ -39593,7 +39630,7 @@ function getHelpText() {
39593
39630
  ].join(`
39594
39631
  `);
39595
39632
  }
39596
- var CLI_VERSION = "0.0.1-alpha.14";
39633
+ var CLI_VERSION = "0.0.1-alpha.15";
39597
39634
  function getVersionText() {
39598
39635
  return `evodev ${CLI_VERSION}`;
39599
39636
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "evodev",
3
3
  "description": "EvoDev hook, skill, and Teams MCP integration for disciplined AI coding workflows.",
4
- "version": "0.0.1-alpha.14",
4
+ "version": "0.0.1-alpha.15",
5
5
  "author": {
6
6
  "name": "EvoDev"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evodev",
3
- "version": "0.0.1-alpha.14",
3
+ "version": "0.0.1-alpha.15",
4
4
  "description": "EvoDev hook, skill, and Teams MCP integration for disciplined AI coding workflows.",
5
5
  "author": {
6
6
  "name": "EvoDev"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evo-dev/plugin",
3
- "version": "0.0.1-alpha.14",
3
+ "version": "0.0.1-alpha.15",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./hooks/index.ts"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evo-dev/evodev",
3
- "version": "0.0.1-alpha.14",
3
+ "version": "0.0.1-alpha.15",
4
4
  "description": "AI Coding infrastructure CLI for real R&D workflows.",
5
5
  "type": "module",
6
6
  "repository": {