@aipper/aiws 0.0.49 → 0.0.50

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.
@@ -0,0 +1,137 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { DEFAULT_MANIFEST, normalizePackageName, parseInstalledFromText, parseInstalledFromSettings, classifyPiPlugins, formatDoctorReport, installCommandFor, isForbiddenPresent, installRequiredPiPlugins, } from "./pi-plugins-doctor.js";
3
+ describe("normalizePackageName", () => {
4
+ it("strips versions for scoped and unscoped", () => {
5
+ expect(normalizePackageName("@tintinweb/pi-subagents@0.14.2")).toBe("@tintinweb/pi-subagents");
6
+ expect(normalizePackageName("pi-powerbar@1.0.0")).toBe("pi-powerbar");
7
+ expect(normalizePackageName(" npm:@tintinweb/pi-subagents@0.14.2 ")).toBe("@tintinweb/pi-subagents");
8
+ });
9
+ });
10
+ describe("parseInstalledFromText", () => {
11
+ it("parses npm: and bare package@version lines", () => {
12
+ const text = `
13
+ npm:@tintinweb/pi-subagents@0.14.2
14
+ pi-powerbar@0.2.0
15
+ @narumitw/pi-goal@1.0.0
16
+ `;
17
+ const names = parseInstalledFromText(text).map((p) => p.name).sort();
18
+ expect(names).toContain("@tintinweb/pi-subagents");
19
+ expect(names).toContain("pi-powerbar");
20
+ expect(names).toContain("@narumitw/pi-goal");
21
+ });
22
+ it("parses json name fields", () => {
23
+ const text = `{ "name": "@tintinweb/pi-subagents", "version": "0.14.2" }`;
24
+ const names = parseInstalledFromText(text).map((p) => p.name);
25
+ expect(names).toContain("@tintinweb/pi-subagents");
26
+ });
27
+ });
28
+ describe("parseInstalledFromSettings", () => {
29
+ it("reads packages array of strings and objects", () => {
30
+ const installed = parseInstalledFromSettings({
31
+ packages: ["@tintinweb/pi-subagents@0.14.2", { name: "pi-lsp", version: "1.0.0" }],
32
+ });
33
+ const names = installed.map((p) => p.name);
34
+ expect(names).toContain("@tintinweb/pi-subagents");
35
+ expect(names).toContain("pi-lsp");
36
+ });
37
+ });
38
+ describe("classifyPiPlugins", () => {
39
+ it("flags missing required", () => {
40
+ const report = classifyPiPlugins({
41
+ manifest: DEFAULT_MANIFEST,
42
+ installed: [],
43
+ piCliAvailable: true,
44
+ detectSource: "pi_list",
45
+ });
46
+ expect(report.missingRequired.map((f) => f.package)).toEqual(["@tintinweb/pi-subagents"]);
47
+ expect(report.ok).toBe(false);
48
+ expect(report.exitCode).toBe(1);
49
+ expect(report.missingRequired[0]?.installCmd).toContain("pi install npm:@tintinweb/pi-subagents@0.14.2");
50
+ });
51
+ it("ok when required present and no conflicts", () => {
52
+ const report = classifyPiPlugins({
53
+ manifest: DEFAULT_MANIFEST,
54
+ installed: [{ name: "@tintinweb/pi-subagents", version: "0.14.2" }, { name: "pi-powerbar" }],
55
+ piCliAvailable: true,
56
+ detectSource: "pi_list",
57
+ });
58
+ expect(report.missingRequired).toHaveLength(0);
59
+ expect(report.okRequired).toHaveLength(1);
60
+ expect(report.ok).toBe(true);
61
+ expect(report.exitCode).toBe(0);
62
+ expect(report.missingRecommendedA.some((f) => f.package === "pi-powerbar")).toBe(false);
63
+ });
64
+ it("detects dual runtime conflict for narumitw subagents", () => {
65
+ const report = classifyPiPlugins({
66
+ manifest: DEFAULT_MANIFEST,
67
+ installed: [
68
+ { name: "@tintinweb/pi-subagents" },
69
+ { name: "@narumitw/pi-subagents" },
70
+ ],
71
+ piCliAvailable: true,
72
+ detectSource: "pi_list",
73
+ });
74
+ expect(report.conflicts.some((c) => c.package === "@narumitw/pi-subagents")).toBe(true);
75
+ expect(report.ok).toBe(false);
76
+ expect(report.exitCode).toBe(1);
77
+ });
78
+ it("detects unscoped pi-subagents without matching tintinweb", () => {
79
+ const set = new Set(["pi-subagents"]);
80
+ expect(isForbiddenPresent(set, "pi-subagents")).toBe(true);
81
+ expect(isForbiddenPresent(new Set(["@tintinweb/pi-subagents"]), "pi-subagents")).toBe(false);
82
+ const report = classifyPiPlugins({
83
+ manifest: DEFAULT_MANIFEST,
84
+ installed: [{ name: "pi-subagents" }],
85
+ piCliAvailable: true,
86
+ detectSource: "injected",
87
+ });
88
+ expect(report.conflicts.some((c) => c.package === "pi-subagents")).toBe(true);
89
+ expect(report.missingRequired.length).toBe(1);
90
+ });
91
+ it("detects forbidden pi-goal and autoresearch", () => {
92
+ const report = classifyPiPlugins({
93
+ manifest: DEFAULT_MANIFEST,
94
+ installed: [
95
+ { name: "@tintinweb/pi-subagents" },
96
+ { name: "@narumitw/pi-goal" },
97
+ { name: "pi-autoresearch" },
98
+ ],
99
+ piCliAvailable: true,
100
+ detectSource: "settings",
101
+ });
102
+ expect(report.forbiddenPresent.map((f) => f.package).sort()).toEqual(["@narumitw/pi-goal", "pi-autoresearch"].sort());
103
+ expect(report.ok).toBe(false);
104
+ });
105
+ it("graceful when pi missing and nothing installed", () => {
106
+ const report = classifyPiPlugins({
107
+ manifest: DEFAULT_MANIFEST,
108
+ installed: [],
109
+ piCliAvailable: false,
110
+ detectSource: "none",
111
+ });
112
+ expect(report.missingRequired.length).toBe(1);
113
+ expect(report.exitCode).toBe(1); // still missing required
114
+ const text = formatDoctorReport(report);
115
+ expect(text).toContain("pi");
116
+ expect(text).toContain("missing required");
117
+ });
118
+ });
119
+ describe("installCommandFor / installRequiredPiPlugins", () => {
120
+ it("builds pin install command", () => {
121
+ expect(installCommandFor(DEFAULT_MANIFEST.required[0])).toBe("pi install npm:@tintinweb/pi-subagents@0.14.2");
122
+ });
123
+ it("installRequired only runs required packages", async () => {
124
+ const calls = [];
125
+ const { attempted, results } = await installRequiredPiPlugins({
126
+ manifest: DEFAULT_MANIFEST,
127
+ runInstall: async (args) => {
128
+ calls.push(args);
129
+ return { code: 0, stdout: "ok", stderr: "" };
130
+ },
131
+ });
132
+ expect(attempted).toHaveLength(1);
133
+ expect(calls[0]).toEqual(["install", "npm:@tintinweb/pi-subagents@0.14.2"]);
134
+ expect(results[0]?.code).toBe(0);
135
+ });
136
+ });
137
+ //# sourceMappingURL=pi-plugins-doctor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-plugins-doctor.test.js","sourceRoot":"","sources":["../../src/lib/pi-plugins-doctor.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@aipper/aiws",
3
- "version": "0.0.49",
3
+ "version": "0.0.50",
4
4
  "description": "AI Workspace CLI (init/update/validate) for Claude Code / OpenCode / Codex.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "aiws": "./bin/aiws.js"
8
8
  },
9
9
  "dependencies": {
10
- "@aipper/aiws-spec": "0.0.49",
10
+ "@aipper/aiws-spec": "0.0.50",
11
11
  "js-yaml": "^4.1.0"
12
12
  },
13
13
  "files": [