skills-manager-cli 2026.8.26-1

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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/README.zh-CN.md +103 -0
  4. package/dist/cli/main.js +261 -0
  5. package/dist/cli/main.js.map +1 -0
  6. package/dist/cli.js +3 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/core/catalog/agent-catalog.json +1134 -0
  9. package/dist/core/catalog/evaluate-detection.js +41 -0
  10. package/dist/core/catalog/evaluate-detection.js.map +1 -0
  11. package/dist/core/catalog/extract.js +388 -0
  12. package/dist/core/catalog/extract.js.map +1 -0
  13. package/dist/core/catalog/resolve-path.js +29 -0
  14. package/dist/core/catalog/resolve-path.js.map +1 -0
  15. package/dist/core/catalog/validate-snapshot.js +117 -0
  16. package/dist/core/catalog/validate-snapshot.js.map +1 -0
  17. package/dist/core/index.js +6 -0
  18. package/dist/core/index.js.map +1 -0
  19. package/dist/core/model/catalog.js +7 -0
  20. package/dist/core/model/catalog.js.map +1 -0
  21. package/dist/core/model/index.js +7 -0
  22. package/dist/core/model/index.js.map +1 -0
  23. package/dist/core/ports/filesystem.js +2 -0
  24. package/dist/core/ports/filesystem.js.map +1 -0
  25. package/dist/core/ports/git.js +2 -0
  26. package/dist/core/ports/git.js.map +1 -0
  27. package/dist/core/ports/process-runner.js +2 -0
  28. package/dist/core/ports/process-runner.js.map +1 -0
  29. package/dist/core/services/activity-service.js +36 -0
  30. package/dist/core/services/activity-service.js.map +1 -0
  31. package/dist/core/services/adopt-service.js +7 -0
  32. package/dist/core/services/adopt-service.js.map +1 -0
  33. package/dist/core/services/archive-service.js +35 -0
  34. package/dist/core/services/archive-service.js.map +1 -0
  35. package/dist/core/services/backup-service.js +94 -0
  36. package/dist/core/services/backup-service.js.map +1 -0
  37. package/dist/core/services/catalog-service.js +123 -0
  38. package/dist/core/services/catalog-service.js.map +1 -0
  39. package/dist/core/services/distribute-service.js +474 -0
  40. package/dist/core/services/distribute-service.js.map +1 -0
  41. package/dist/core/services/doctor-service.js +75 -0
  42. package/dist/core/services/doctor-service.js.map +1 -0
  43. package/dist/core/services/index.js +54 -0
  44. package/dist/core/services/index.js.map +1 -0
  45. package/dist/core/services/init-service.js +234 -0
  46. package/dist/core/services/init-service.js.map +1 -0
  47. package/dist/core/services/install-service.js +73 -0
  48. package/dist/core/services/install-service.js.map +1 -0
  49. package/dist/core/services/migration-service.js +102 -0
  50. package/dist/core/services/migration-service.js.map +1 -0
  51. package/dist/core/services/package-service.js +33 -0
  52. package/dist/core/services/package-service.js.map +1 -0
  53. package/dist/core/services/registry-service.js +133 -0
  54. package/dist/core/services/registry-service.js.map +1 -0
  55. package/dist/core/services/skill-home-resolver.js +33 -0
  56. package/dist/core/services/skill-home-resolver.js.map +1 -0
  57. package/dist/core/services/skill-home-service.js +35 -0
  58. package/dist/core/services/skill-home-service.js.map +1 -0
  59. package/dist/core/services/source-service.js +109 -0
  60. package/dist/core/services/source-service.js.map +1 -0
  61. package/dist/core/services/update-service.js +93 -0
  62. package/dist/core/services/update-service.js.map +1 -0
  63. package/dist/core/services/view-service.js +45 -0
  64. package/dist/core/services/view-service.js.map +1 -0
  65. package/dist/dashboard/server/main.js +427 -0
  66. package/dist/dashboard/server/main.js.map +1 -0
  67. package/dist/dashboard/server/render-markdown.js +75 -0
  68. package/dist/dashboard/server/render-markdown.js.map +1 -0
  69. package/dist/dashboard/server/skill-file.js +129 -0
  70. package/dist/dashboard/server/skill-file.js.map +1 -0
  71. package/dist/dashboard-web/assets/index-B43GPIpA.js +13 -0
  72. package/dist/dashboard-web/assets/index-CzbkHV2A.css +1 -0
  73. package/dist/dashboard-web/index.html +13 -0
  74. package/dist/infra/fs-skill-home.js +87 -0
  75. package/dist/infra/fs-skill-home.js.map +1 -0
  76. package/dist/infra/git-cli.js +36 -0
  77. package/dist/infra/git-cli.js.map +1 -0
  78. package/dist/infra/index.js +5 -0
  79. package/dist/infra/index.js.map +1 -0
  80. package/dist/infra/runtime.js +23 -0
  81. package/dist/infra/runtime.js.map +1 -0
  82. package/dist/infra/shell-runner.js +18 -0
  83. package/dist/infra/shell-runner.js.map +1 -0
  84. package/dist/shared/errors.js +17 -0
  85. package/dist/shared/errors.js.map +1 -0
  86. package/dist/shared/result.js +17 -0
  87. package/dist/shared/result.js.map +1 -0
  88. package/dist/shared/validation.js +92 -0
  89. package/dist/shared/validation.js.map +1 -0
  90. package/docs/CLI.md +75 -0
  91. package/package.json +73 -0
@@ -0,0 +1,129 @@
1
+ import { readFileSync, realpathSync, statSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { NodeFileSystem } from '../../infra/fs-skill-home.js';
4
+ import { errorMessage, SkillsManagerError } from '../../shared/errors.js';
5
+ import { assertPathInside, assertSafeSkillName } from '../../shared/validation.js';
6
+ import { highlightSource, renderMarkdown, stripFrontmatter } from './render-markdown.js';
7
+ export const PREVIEW_MAX_BYTES = 512 * 1024;
8
+ /** Whitelisted source-language extensions → shiki grammar (spec §渲染管线). */
9
+ const SOURCE_EXTENSIONS = {
10
+ js: 'javascript', mjs: 'javascript', cjs: 'javascript',
11
+ ts: 'typescript',
12
+ py: 'python',
13
+ vue: 'vue',
14
+ sh: 'shellscript', bash: 'shellscript',
15
+ json: 'json',
16
+ yaml: 'yaml', yml: 'yaml',
17
+ toml: 'toml',
18
+ html: 'html',
19
+ css: 'css',
20
+ xml: 'xml',
21
+ sql: 'sql',
22
+ };
23
+ /** Binary by content, not by name: a NUL byte or undecodable UTF-8. */
24
+ function isBinary(buffer) {
25
+ if (buffer.includes(0))
26
+ return true;
27
+ try {
28
+ new TextDecoder('utf-8', { fatal: true }).decode(buffer);
29
+ return false;
30
+ }
31
+ catch {
32
+ return true;
33
+ }
34
+ }
35
+ function extensionOf(relativePath) {
36
+ const base = relativePath.split('/').pop() ?? '';
37
+ const dot = base.lastIndexOf('.');
38
+ return dot > 0 ? base.slice(dot + 1).toLowerCase() : '';
39
+ }
40
+ const fs = new NodeFileSystem();
41
+ function forbidden(code, message) {
42
+ return Object.assign(new SkillsManagerError(code, message), { statusCode: 403 });
43
+ }
44
+ function notFound(code, message) {
45
+ return Object.assign(new SkillsManagerError(code, message), { statusCode: 404 });
46
+ }
47
+ /** Shared safety gate for both preview endpoints: valid name + existing skill.
48
+ * 403 invalid_skill_name / 404 skill_not_found, mirroring the hub's posture. */
49
+ export function previewSkillDir(home, name) {
50
+ try {
51
+ assertSafeSkillName(name);
52
+ }
53
+ catch (error) {
54
+ throw forbidden('invalid_skill_name', errorMessage(error));
55
+ }
56
+ const skillDir = path.join(path.resolve(home, 'skills'), name);
57
+ if (fs.kind(path.join(skillDir, 'SKILL.md')) !== 'file') {
58
+ throw notFound('skill_not_found', `Skill not found: ${name}`);
59
+ }
60
+ return skillDir;
61
+ }
62
+ /** File entries for the preview tree: sorted relative paths + sizes. Broken
63
+ * symlinks report size 0 — the tree reflects the directory as it stands. */
64
+ export function previewFileEntries(skillDir, paths) {
65
+ return paths.map((relative) => {
66
+ let size = 0;
67
+ try {
68
+ size = statSync(path.join(skillDir, relative)).size;
69
+ }
70
+ catch {
71
+ size = 0;
72
+ }
73
+ return { path: relative, size };
74
+ });
75
+ }
76
+ /** Read one file of a hub skill for the preview Sheet (read-only).
77
+ * Security: skill name validation + path containment on both the lexical and
78
+ * the real (symlink-resolved) path — same posture as the rest of the hub. */
79
+ export async function readSkillFile(home, name, relativePath) {
80
+ const skillDir = previewSkillDir(home, name);
81
+ const absolute = path.resolve(skillDir, relativePath);
82
+ try {
83
+ assertPathInside(absolute, skillDir);
84
+ }
85
+ catch (error) {
86
+ throw forbidden('path_escape', errorMessage(error));
87
+ }
88
+ let realFile;
89
+ try {
90
+ realFile = realpathSync(absolute);
91
+ }
92
+ catch {
93
+ throw notFound('file_not_found', `File not found: ${name}/${relativePath}`);
94
+ }
95
+ try {
96
+ assertPathInside(realFile, realpathSync(skillDir));
97
+ }
98
+ catch {
99
+ throw forbidden('path_escape', `Symlink escape blocked: ${name}/${relativePath}`);
100
+ }
101
+ if (fs.targetKind(realFile) !== 'file') {
102
+ throw notFound('file_not_found', `File not found: ${name}/${relativePath}`);
103
+ }
104
+ const buffer = readFileSync(realFile);
105
+ if (isBinary(buffer)) {
106
+ return { kind: 'binary', size: buffer.length };
107
+ }
108
+ const truncated = buffer.length > PREVIEW_MAX_BYTES;
109
+ const content = (truncated ? buffer.subarray(0, PREVIEW_MAX_BYTES) : buffer).toString('utf8');
110
+ const extension = extensionOf(relativePath);
111
+ if (extension === 'md') {
112
+ return {
113
+ kind: 'markdown',
114
+ html: await renderMarkdown(stripFrontmatter(content)),
115
+ raw: content,
116
+ truncated,
117
+ };
118
+ }
119
+ const sourceLang = SOURCE_EXTENSIONS[extension];
120
+ if (sourceLang) {
121
+ return {
122
+ kind: 'source',
123
+ html: await highlightSource(content, sourceLang),
124
+ truncated,
125
+ };
126
+ }
127
+ return { kind: 'text', raw: content, truncated };
128
+ }
129
+ //# sourceMappingURL=skill-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-file.js","sourceRoot":"","sources":["../../../src/dashboard/server/skill-file.ts"],"names":[],"mappings":"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"}