perf-skill 0.0.1 → 0.2.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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +414 -0
  3. package/SKILL.md +238 -0
  4. package/dist/cli/main.d.ts +6 -0
  5. package/dist/cli/main.d.ts.map +1 -0
  6. package/dist/cli/main.js +353 -0
  7. package/dist/cli/main.js.map +1 -0
  8. package/dist/cli/options.d.ts +37 -0
  9. package/dist/cli/options.d.ts.map +1 -0
  10. package/dist/cli/options.js +54 -0
  11. package/dist/cli/options.js.map +1 -0
  12. package/dist/convert/converter.d.ts +39 -0
  13. package/dist/convert/converter.d.ts.map +1 -0
  14. package/dist/convert/converter.js +99 -0
  15. package/dist/convert/converter.js.map +1 -0
  16. package/dist/convert/extract.d.ts +32 -0
  17. package/dist/convert/extract.d.ts.map +1 -0
  18. package/dist/convert/extract.js +235 -0
  19. package/dist/convert/extract.js.map +1 -0
  20. package/dist/convert/index.d.ts +7 -0
  21. package/dist/convert/index.d.ts.map +1 -0
  22. package/dist/convert/index.js +7 -0
  23. package/dist/convert/index.js.map +1 -0
  24. package/dist/convert/sanitize.d.ts +60 -0
  25. package/dist/convert/sanitize.d.ts.map +1 -0
  26. package/dist/convert/sanitize.js +169 -0
  27. package/dist/convert/sanitize.js.map +1 -0
  28. package/dist/diff/engine.d.ts +76 -0
  29. package/dist/diff/engine.d.ts.map +1 -0
  30. package/dist/diff/engine.js +386 -0
  31. package/dist/diff/engine.js.map +1 -0
  32. package/dist/diff/index.d.ts +6 -0
  33. package/dist/diff/index.d.ts.map +1 -0
  34. package/dist/diff/index.js +6 -0
  35. package/dist/diff/index.js.map +1 -0
  36. package/dist/diff/markdown.d.ts +16 -0
  37. package/dist/diff/markdown.d.ts.map +1 -0
  38. package/dist/diff/markdown.js +342 -0
  39. package/dist/diff/markdown.js.map +1 -0
  40. package/dist/index.d.ts +52 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +247 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/llm/client.d.ts +39 -0
  45. package/dist/llm/client.d.ts.map +1 -0
  46. package/dist/llm/client.js +270 -0
  47. package/dist/llm/client.js.map +1 -0
  48. package/dist/llm/index.d.ts +8 -0
  49. package/dist/llm/index.d.ts.map +1 -0
  50. package/dist/llm/index.js +8 -0
  51. package/dist/llm/index.js.map +1 -0
  52. package/dist/llm/prompt.d.ts +32 -0
  53. package/dist/llm/prompt.d.ts.map +1 -0
  54. package/dist/llm/prompt.js +146 -0
  55. package/dist/llm/prompt.js.map +1 -0
  56. package/dist/llm/schema.d.ts +150 -0
  57. package/dist/llm/schema.d.ts.map +1 -0
  58. package/dist/llm/schema.js +131 -0
  59. package/dist/llm/schema.js.map +1 -0
  60. package/dist/llm/validate.d.ts +33 -0
  61. package/dist/llm/validate.d.ts.map +1 -0
  62. package/dist/llm/validate.js +241 -0
  63. package/dist/llm/validate.js.map +1 -0
  64. package/dist/profile/duration.d.ts +2 -0
  65. package/dist/profile/duration.d.ts.map +1 -0
  66. package/dist/profile/duration.js +24 -0
  67. package/dist/profile/duration.js.map +1 -0
  68. package/dist/profile/preload.d.ts +2 -0
  69. package/dist/profile/preload.d.ts.map +1 -0
  70. package/dist/profile/preload.js +100 -0
  71. package/dist/profile/preload.js.map +1 -0
  72. package/dist/profile/runner.d.ts +22 -0
  73. package/dist/profile/runner.d.ts.map +1 -0
  74. package/dist/profile/runner.js +88 -0
  75. package/dist/profile/runner.js.map +1 -0
  76. package/dist/server/http.d.ts +27 -0
  77. package/dist/server/http.d.ts.map +1 -0
  78. package/dist/server/http.js +285 -0
  79. package/dist/server/http.js.map +1 -0
  80. package/dist/server/utils.d.ts +15 -0
  81. package/dist/server/utils.d.ts.map +1 -0
  82. package/dist/server/utils.js +71 -0
  83. package/dist/server/utils.js.map +1 -0
  84. package/dist/skill/handler.d.ts +77 -0
  85. package/dist/skill/handler.d.ts.map +1 -0
  86. package/dist/skill/handler.js +91 -0
  87. package/dist/skill/handler.js.map +1 -0
  88. package/dist/skill/index.d.ts +6 -0
  89. package/dist/skill/index.d.ts.map +1 -0
  90. package/dist/skill/index.js +6 -0
  91. package/dist/skill/index.js.map +1 -0
  92. package/dist/skill/manifest.d.ts +17 -0
  93. package/dist/skill/manifest.d.ts.map +1 -0
  94. package/dist/skill/manifest.js +231 -0
  95. package/dist/skill/manifest.js.map +1 -0
  96. package/dist/types.d.ts +260 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +5 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/utils/fs.d.ts +52 -0
  101. package/dist/utils/fs.d.ts.map +1 -0
  102. package/dist/utils/fs.js +106 -0
  103. package/dist/utils/fs.js.map +1 -0
  104. package/dist/utils/index.d.ts +7 -0
  105. package/dist/utils/index.d.ts.map +1 -0
  106. package/dist/utils/index.js +7 -0
  107. package/dist/utils/index.js.map +1 -0
  108. package/dist/utils/limits.d.ts +38 -0
  109. package/dist/utils/limits.d.ts.map +1 -0
  110. package/dist/utils/limits.js +86 -0
  111. package/dist/utils/limits.js.map +1 -0
  112. package/dist/utils/logger.d.ts +21 -0
  113. package/dist/utils/logger.d.ts.map +1 -0
  114. package/dist/utils/logger.js +82 -0
  115. package/dist/utils/logger.js.map +1 -0
  116. package/package.json +70 -6
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Simple structured logger for observability
3
+ */
4
+ const LOG_LEVELS = {
5
+ debug: 0,
6
+ info: 1,
7
+ warn: 2,
8
+ error: 3,
9
+ };
10
+ let currentLevel = process.env.LOG_LEVEL || "info";
11
+ export function setLogLevel(level) {
12
+ currentLevel = level;
13
+ }
14
+ function shouldLog(level) {
15
+ return LOG_LEVELS[level] >= LOG_LEVELS[currentLevel];
16
+ }
17
+ function formatLog(entry) {
18
+ if (process.env.LOG_FORMAT === "json") {
19
+ return JSON.stringify(entry);
20
+ }
21
+ const { level, message, timestamp, ...rest } = entry;
22
+ const extras = Object.keys(rest).length > 0
23
+ ? ` ${JSON.stringify(rest)}`
24
+ : "";
25
+ return `[${timestamp}] ${level.toUpperCase()}: ${message}${extras}`;
26
+ }
27
+ function log(level, message, meta) {
28
+ if (!shouldLog(level))
29
+ return;
30
+ const entry = {
31
+ level,
32
+ message,
33
+ timestamp: new Date().toISOString(),
34
+ ...meta,
35
+ };
36
+ const output = formatLog(entry);
37
+ if (level === "error") {
38
+ console.error(output);
39
+ }
40
+ else if (level === "warn") {
41
+ console.warn(output);
42
+ }
43
+ else {
44
+ console.log(output);
45
+ }
46
+ }
47
+ export const logger = {
48
+ debug: (message, meta) => log("debug", message, meta),
49
+ info: (message, meta) => log("info", message, meta),
50
+ warn: (message, meta) => log("warn", message, meta),
51
+ error: (message, meta) => log("error", message, meta),
52
+ /** Log with timing measurement */
53
+ time: (label, fn) => {
54
+ const start = performance.now();
55
+ try {
56
+ const result = fn();
57
+ if (result instanceof Promise) {
58
+ return result.then((r) => {
59
+ log("debug", `${label} completed`, { durationMs: Math.round(performance.now() - start) });
60
+ return r;
61
+ }).catch((e) => {
62
+ log("error", `${label} failed`, { durationMs: Math.round(performance.now() - start), error: String(e) });
63
+ throw e;
64
+ });
65
+ }
66
+ log("debug", `${label} completed`, { durationMs: Math.round(performance.now() - start) });
67
+ return result;
68
+ }
69
+ catch (e) {
70
+ log("error", `${label} failed`, { durationMs: Math.round(performance.now() - start), error: String(e) });
71
+ throw e;
72
+ }
73
+ },
74
+ /** Create a child logger with default metadata */
75
+ child: (defaultMeta) => ({
76
+ debug: (message, meta) => log("debug", message, { ...defaultMeta, ...meta }),
77
+ info: (message, meta) => log("info", message, { ...defaultMeta, ...meta }),
78
+ warn: (message, meta) => log("warn", message, { ...defaultMeta, ...meta }),
79
+ error: (message, meta) => log("error", message, { ...defaultMeta, ...meta }),
80
+ }),
81
+ };
82
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,75 @@
1
1
  {
2
2
  "name": "perf-skill",
3
- "version": "0.0.1",
4
- "description": "",
5
- "main": "index.js",
3
+ "version": "0.2.0",
4
+ "description": "AI Skill for pprof profile analysis - convert .pb.gz to Markdown and generate structured performance recommendations",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "perf-skill": "dist/cli/main.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "engines": {
18
+ "node": ">=20"
19
+ },
6
20
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
21
+ "build": "tsc",
22
+ "dev": "tsc --watch",
23
+ "start": "node dist/server/http.js",
24
+ "cli": "node --import tsx src/cli/main.ts",
25
+ "test": "node --test --import tsx 'test/**/*.test.ts'",
26
+ "lint": "eslint src --ext .ts",
27
+ "clean": "rm -rf dist",
28
+ "update-prompts": "node --import tsx scripts/update-prompt-fixtures.ts",
29
+ "prepublishOnly": "npm run build"
30
+ },
31
+ "keywords": [
32
+ "pprof",
33
+ "profiling",
34
+ "performance",
35
+ "ai",
36
+ "llm",
37
+ "markdown",
38
+ "cpu",
39
+ "memory",
40
+ "heap",
41
+ "analysis"
42
+ ],
43
+ "author": "unadlib",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/skillsland/perf-skill.git"
47
+ },
48
+ "license": "MIT",
49
+ "dependencies": {
50
+ "@datadog/pprof": "^5.13.2",
51
+ "@fastify/cors": "^11.2.0",
52
+ "@fastify/helmet": "^13.0.2",
53
+ "@fastify/multipart": "^9.4.0",
54
+ "@fastify/rate-limit": "^10.3.0",
55
+ "commander": "^14.0.3",
56
+ "fastify": "^5.7.3",
57
+ "openai": "^6.17.0",
58
+ "pprof-format": "^2.2.1",
59
+ "pprof-to-md": "^0.2.0",
60
+ "zod": "^4.3.6"
61
+ },
62
+ "devDependencies": {
63
+ "@types/node": "^25.2.0",
64
+ "@typescript-eslint/eslint-plugin": "^8.54.0",
65
+ "@typescript-eslint/parser": "^8.54.0",
66
+ "eslint": "^9.39.2",
67
+ "tsx": "^4.21.0",
68
+ "typescript": "^5.9.3"
8
69
  },
9
- "author": "",
10
- "license": "ISC"
70
+ "files": [
71
+ "dist",
72
+ "SKILL.md",
73
+ "README.md"
74
+ ]
11
75
  }