@neobiotechlabs/neobiotech-dev-agent 0.1.39 → 0.1.41

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.
@@ -10,7 +10,7 @@
10
10
  "source": "npm",
11
11
  "package": "@neobiotechlabs/neobiotech-dev-agent",
12
12
  "registry": "https://registry.npmjs.org",
13
- "version": "0.1.39"
13
+ "version": "0.1.41"
14
14
  },
15
15
  "description": "의료기기 SW 규제 개발 자동화 (Jira·Confluence·Risk·CVSS·Xray·IEC 62304/62366·MDR·문서 렌더)",
16
16
  "category": "medical-device",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neobiotech-dev-agent",
3
- "version": "0.1.39",
3
+ "version": "0.1.41",
4
4
  "displayName": "NeoBiotech Dev Agent (MedDev)",
5
5
  "description": "의료기기 SW 규제 개발 자동화 — Jira·Confluence·Risk·CVSS·Xray·IEC 62304/62366·MDR·문서 렌더",
6
6
  "author": {
package/dist/doctor.js CHANGED
@@ -7698,7 +7698,7 @@ var require_cross_spawn = __commonJS({
7698
7698
 
7699
7699
  // src/cli/doctor.ts
7700
7700
  import { execFile } from "child_process";
7701
- import { existsSync, readdirSync } from "fs";
7701
+ import { existsSync, readFileSync, readdirSync } from "fs";
7702
7702
  import path from "path";
7703
7703
  import { promisify } from "util";
7704
7704
  import { fileURLToPath } from "url";
@@ -15054,10 +15054,37 @@ function inspectAssets(pluginRoot) {
15054
15054
  [
15055
15055
  "data/review-criteria.md",
15056
15056
  existsSync(path.join(pluginRoot, "data", "review-criteria.md"))
15057
+ ],
15058
+ [
15059
+ "skills/gate-parallel-review/SKILL.md",
15060
+ existsSync(path.join(pluginRoot, "skills", "gate-parallel-review", "SKILL.md"))
15061
+ ],
15062
+ [
15063
+ "codex-agents/*.toml",
15064
+ directoryHasFiles(path.join(pluginRoot, "codex-agents"), (name) => name.endsWith(".toml"))
15057
15065
  ]
15058
15066
  ];
15059
15067
  return checks.map(([name, available]) => ({ name, required: true, available }));
15060
15068
  }
15069
+ function inspectCodexAgents(pluginRoot, projectDir) {
15070
+ const templatesDir = path.join(pluginRoot, "codex-agents");
15071
+ const targetDir = path.join(projectDir, ".codex", "agents");
15072
+ const expected = existsSync(templatesDir) ? readdirSync(templatesDir).filter((name) => name.endsWith(".toml")).sort() : [];
15073
+ const installed = [];
15074
+ const missing = [];
15075
+ const conflicts = [];
15076
+ for (const name of expected) {
15077
+ const targetPath = path.join(targetDir, name);
15078
+ if (!existsSync(targetPath)) {
15079
+ missing.push(name);
15080
+ } else if (readFileSync(targetPath, "utf8") === readFileSync(path.join(templatesDir, name), "utf8")) {
15081
+ installed.push(name);
15082
+ } else {
15083
+ conflicts.push(name);
15084
+ }
15085
+ }
15086
+ return { expected, installed, missing, conflicts };
15087
+ }
15061
15088
  async function probeJava() {
15062
15089
  try {
15063
15090
  await execFileAsync("java", ["-version"]);
@@ -15069,6 +15096,7 @@ async function probeJava() {
15069
15096
  async function runDoctor(options) {
15070
15097
  const environment = inspectEnvironment(options.env);
15071
15098
  const assets = inspectAssets(options.pluginRoot);
15099
+ const codexAgents = inspectCodexAgents(options.pluginRoot, options.projectDir ?? process.cwd());
15072
15100
  const java = await (options.javaProbe ?? probeJava)();
15073
15101
  const mcp = {};
15074
15102
  try {
@@ -15084,21 +15112,23 @@ async function runDoctor(options) {
15084
15112
  mcp.error = error2 instanceof Error ? error2.message : String(error2);
15085
15113
  }
15086
15114
  return {
15087
- ok: environment.filter((item) => item.required).every((item) => item.configured) && assets.filter((item) => item.required).every((item) => item.available) && !mcp.error,
15115
+ ok: environment.filter((item) => item.required).every((item) => item.configured) && assets.filter((item) => item.required).every((item) => item.available) && codexAgents.expected.length === 5 && codexAgents.missing.length === 0 && codexAgents.conflicts.length === 0 && !mcp.error,
15088
15116
  environment,
15089
15117
  assets,
15090
15118
  java,
15119
+ codexAgents,
15091
15120
  mcp
15092
15121
  };
15093
15122
  }
15094
15123
  if (process.argv[1] === fileURLToPath(import.meta.url)) {
15095
15124
  const pluginRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
15096
- const report = await runDoctor({ pluginRoot, env: process.env });
15125
+ const report = await runDoctor({ pluginRoot, projectDir: process.cwd(), env: process.env });
15097
15126
  process.stdout.write(`${JSON.stringify(report, null, 2)}
15098
15127
  `);
15099
15128
  if (!report.ok) process.exitCode = 1;
15100
15129
  }
15101
15130
  export {
15131
+ inspectCodexAgents,
15102
15132
  inspectEnvironment,
15103
15133
  runDoctor,
15104
15134
  smokeMcpServer