pi-skillful 0.3.0 → 0.3.2
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.
- package/CHANGELOG.md +12 -0
- package/extensions/index.ts +3 -0
- package/package.json +1 -1
- package/src/install-telemetry.ts +104 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,18 @@ This project follows the spirit of [Keep a Changelog](https://keepachangelog.com
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.2] - 2026-05-10
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Disabled install telemetry reporting when running in CI workflows.
|
|
14
|
+
|
|
15
|
+
## [0.3.1] - 2026-05-10
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- Install/update telemetry ping to `mocito.dev`, gated by Pi telemetry/offline settings and deduplicated per package version.
|
|
20
|
+
|
|
9
21
|
## [0.3.0] - 2026-05-09
|
|
10
22
|
|
|
11
23
|
### Added
|
package/extensions/index.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import inlineSkillInvocation from "../src/extensions/inline-skill-invocation.js";
|
|
3
|
+
import { reportInstallTelemetry } from "../src/install-telemetry.js";
|
|
3
4
|
import skillVisibility from "../src/extensions/skill-visibility.js";
|
|
4
5
|
import sessionSkillToggles from "../src/extensions/session-skill-toggles.js";
|
|
5
6
|
|
|
6
7
|
export default function piSkillful(pi: ExtensionAPI) {
|
|
8
|
+
reportInstallTelemetry();
|
|
9
|
+
|
|
7
10
|
inlineSkillInvocation(pi);
|
|
8
11
|
skillVisibility(pi);
|
|
9
12
|
sessionSkillToggles(pi);
|
package/package.json
CHANGED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
6
|
+
|
|
7
|
+
const PACKAGE_NAME = "pi-skillful";
|
|
8
|
+
const INSTALL_TELEMETRY_URL = "https://mocito.dev/api/report-install";
|
|
9
|
+
const INSTALL_TELEMETRY_TIMEOUT_MS = 5000;
|
|
10
|
+
const CI_ENVIRONMENT_VARIABLES = [
|
|
11
|
+
"APPVEYOR",
|
|
12
|
+
"BITBUCKET_BUILD_NUMBER",
|
|
13
|
+
"BUILDKITE",
|
|
14
|
+
"CIRCLECI",
|
|
15
|
+
"CODESPACES",
|
|
16
|
+
"DRONE",
|
|
17
|
+
"GITHUB_ACTIONS",
|
|
18
|
+
"GITLAB_CI",
|
|
19
|
+
"JENKINS_URL",
|
|
20
|
+
"NETLIFY",
|
|
21
|
+
"TEAMCITY_VERSION",
|
|
22
|
+
"TF_BUILD",
|
|
23
|
+
"TRAVIS",
|
|
24
|
+
"VERCEL",
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
interface InstallTelemetryState {
|
|
28
|
+
lastReportedVersion?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface PiSettingsDocument {
|
|
32
|
+
enableInstallTelemetry?: unknown;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function readJsonFile(path: string): unknown {
|
|
36
|
+
try {
|
|
37
|
+
return JSON.parse(readFileSync(path, "utf8")) as unknown;
|
|
38
|
+
} catch {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function isTruthyEnvFlag(value: string | undefined): boolean {
|
|
44
|
+
if (!value) return false;
|
|
45
|
+
return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function isPresentEnvFlag(value: string | undefined): boolean {
|
|
49
|
+
if (!value) return false;
|
|
50
|
+
const normalized = value.toLowerCase();
|
|
51
|
+
return normalized !== "0" && normalized !== "false" && normalized !== "no";
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function isCiEnvironment(): boolean {
|
|
55
|
+
if (isTruthyEnvFlag(process.env.CI)) return true;
|
|
56
|
+
return CI_ENVIRONMENT_VARIABLES.some((name) => isPresentEnvFlag(process.env[name]));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function isInstallTelemetryEnabled(): boolean {
|
|
60
|
+
if (isCiEnvironment()) return false;
|
|
61
|
+
if (isTruthyEnvFlag(process.env.PI_OFFLINE)) return false;
|
|
62
|
+
if (process.env.PI_TELEMETRY !== undefined) return isTruthyEnvFlag(process.env.PI_TELEMETRY);
|
|
63
|
+
|
|
64
|
+
const settings = readJsonFile(join(getAgentDir(), "settings.json")) as PiSettingsDocument;
|
|
65
|
+
return settings.enableInstallTelemetry !== false;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function getPackageVersion(): string {
|
|
69
|
+
const packageJson = readJsonFile(fileURLToPath(new URL("../package.json", import.meta.url))) as { version?: unknown };
|
|
70
|
+
return typeof packageJson.version === "string" && packageJson.version.length > 0 ? packageJson.version : "0.0.0";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function getInstallTelemetryUserAgent(version: string): string {
|
|
74
|
+
const runtimeVersions = process.versions as NodeJS.ProcessVersions & { bun?: string };
|
|
75
|
+
const runtime = runtimeVersions.bun ? `bun/${runtimeVersions.bun}` : `node/${process.version}`;
|
|
76
|
+
return `${PACKAGE_NAME}/${version} (${process.platform}; ${runtime}; ${process.arch})`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function reportInstallTelemetryAsync(): Promise<void> {
|
|
80
|
+
try {
|
|
81
|
+
if (!isInstallTelemetryEnabled()) return;
|
|
82
|
+
|
|
83
|
+
const version = getPackageVersion();
|
|
84
|
+
const extensionsDir = join(getAgentDir(), "extensions");
|
|
85
|
+
const statePath = join(extensionsDir, "skillful-install.json");
|
|
86
|
+
const state = readJsonFile(statePath) as InstallTelemetryState;
|
|
87
|
+
if (state.lastReportedVersion === version) return;
|
|
88
|
+
|
|
89
|
+
await mkdir(extensionsDir, { recursive: true });
|
|
90
|
+
await writeFile(statePath, `${JSON.stringify({ lastReportedVersion: version }, null, 2)}\n`, "utf8");
|
|
91
|
+
|
|
92
|
+
const params = new URLSearchParams({ tool: PACKAGE_NAME, version });
|
|
93
|
+
await fetch(`${INSTALL_TELEMETRY_URL}?${params.toString()}`, {
|
|
94
|
+
headers: { "User-Agent": getInstallTelemetryUserAgent(version) },
|
|
95
|
+
signal: AbortSignal.timeout(INSTALL_TELEMETRY_TIMEOUT_MS),
|
|
96
|
+
});
|
|
97
|
+
} catch {
|
|
98
|
+
// Best-effort telemetry: ignore settings, filesystem, and network failures.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function reportInstallTelemetry(): void {
|
|
103
|
+
void reportInstallTelemetryAsync();
|
|
104
|
+
}
|