openxiangda-skill-kit 2.0.0-alpha.14 → 2.0.0-alpha.140

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 (59) hide show
  1. package/README.md +2 -7
  2. package/dist/bin.js +0 -0
  3. package/dist/index.d.ts +5 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +159 -65
  6. package/dist/index.js.map +1 -1
  7. package/dist/internal/skill-installer.d.ts +8 -0
  8. package/dist/internal/skill-installer.d.ts.map +1 -0
  9. package/dist/internal/skill-installer.js +51 -0
  10. package/dist/internal/skill-installer.js.map +1 -0
  11. package/dist/workspace-guidance.d.ts +13 -0
  12. package/dist/workspace-guidance.d.ts.map +1 -0
  13. package/dist/workspace-guidance.js +67 -0
  14. package/dist/workspace-guidance.js.map +1 -0
  15. package/package.json +4 -7
  16. package/skills/manifest.json +2 -32
  17. package/skills/openxiangda-v2/SKILL.md +45 -24
  18. package/skills/openxiangda-v2/agents/openai.yaml +2 -2
  19. package/skills/openxiangda-v2/references/administration.md +27 -0
  20. package/skills/openxiangda-v2/references/application-foundation.md +162 -0
  21. package/skills/openxiangda-v2/references/appspec.md +92 -0
  22. package/skills/openxiangda-v2/references/architecture.md +61 -0
  23. package/skills/openxiangda-v2/references/backend.md +85 -0
  24. package/skills/openxiangda-v2/references/commands.md +26 -0
  25. package/skills/openxiangda-v2/references/data-authz.md +58 -0
  26. package/skills/openxiangda-v2/references/delivery.md +72 -0
  27. package/skills/openxiangda-v2/references/discovery.md +28 -0
  28. package/skills/openxiangda-v2/references/field-components.md +204 -0
  29. package/skills/openxiangda-v2/references/frontend.md +269 -0
  30. package/skills/openxiangda-v2/references/getting-started.md +59 -0
  31. package/skills/openxiangda-v2/references/mcp.md +548 -0
  32. package/skills/openxiangda-v2/references/public-access.md +151 -0
  33. package/skills/openxiangda-v2/references/testing.md +51 -0
  34. package/skills/openxiangda-v2/references/upgrading.md +19 -0
  35. package/skills/openxiangda-v2/references/workflow-events.md +181 -0
  36. package/docs/architecture/repository-and-release.md +0 -56
  37. package/docs/backend.md +0 -89
  38. package/docs/concepts.md +0 -34
  39. package/docs/data-authz.md +0 -100
  40. package/docs/delivery.md +0 -71
  41. package/docs/frontend.md +0 -47
  42. package/docs/getting-started.md +0 -129
  43. package/docs/index.md +0 -23
  44. package/docs/llms.txt +0 -12
  45. package/docs/reference/cli.md +0 -51
  46. package/docs/reference/mcp.md +0 -26
  47. package/docs/workflow-events.md +0 -63
  48. package/skills/openxiangda-v2-architecture/SKILL.md +0 -29
  49. package/skills/openxiangda-v2-architecture/agents/openai.yaml +0 -4
  50. package/skills/openxiangda-v2-backend/SKILL.md +0 -42
  51. package/skills/openxiangda-v2-backend/agents/openai.yaml +0 -4
  52. package/skills/openxiangda-v2-data-authz/SKILL.md +0 -44
  53. package/skills/openxiangda-v2-data-authz/agents/openai.yaml +0 -4
  54. package/skills/openxiangda-v2-delivery/SKILL.md +0 -65
  55. package/skills/openxiangda-v2-delivery/agents/openai.yaml +0 -4
  56. package/skills/openxiangda-v2-frontend/SKILL.md +0 -40
  57. package/skills/openxiangda-v2-frontend/agents/openai.yaml +0 -4
  58. package/skills/openxiangda-v2-workflow-events/SKILL.md +0 -39
  59. package/skills/openxiangda-v2-workflow-events/agents/openai.yaml +0 -4
package/README.md CHANGED
@@ -1,10 +1,5 @@
1
1
  # openxiangda-skill-kit
2
2
 
3
- Validates OpenXiangda 2.0 skill metadata, links, command references, version boundaries, and deterministic distribution manifests.
3
+ 维护单一 `openxiangda-v2` Skill 的元数据、正文链接、命令引用、版本边界和内容摘要校验。应用通过根包安装,同版本中文专题生成 Skill 内的按需参考;本包不提供公开命令。
4
4
 
5
- ```bash
6
- openxiangda-skill-kit install --dest ~/.codex/skills
7
- openxiangda-skill-kit validate ./skills
8
- ```
9
-
10
- The published package includes the shared 2.0 documentation tree. Installation copies it into a namespaced hidden reference directory beside the installed Skills and rewrites local links, so every installed `SKILL.md` remains valid outside the source repository.
5
+ 安装以事务替换同名 Skill,只清理由旧安装器标记托管的历史目录。项目模式安装到指定工作区,AGENTS.md 只替换明确标记的平台区块。没有标记的旧文件保持原样,并提供候选区块供整合。
package/dist/bin.js CHANGED
File without changes
package/dist/index.d.ts CHANGED
@@ -17,6 +17,8 @@ export interface InstallSkillsInput {
17
17
  destination: string;
18
18
  force?: boolean;
19
19
  }
20
+ export declare const OPENXIANGDA_SKILL_NAME = "openxiangda-v2";
21
+ export declare const RETIRED_OPENXIANGDA_V2_SKILL_NAMES: readonly ["openxiangda-v2-architecture", "openxiangda-v2-backend", "openxiangda-v2-data-authz", "openxiangda-v2-delivery", "openxiangda-v2-frontend", "openxiangda-v2-workflow-events"];
20
22
  export declare function resolveDefaultSkillsRoot(): string;
21
23
  export declare function validateSkills(skillsRoot: string): Promise<SkillValidationIssue[]>;
22
24
  export declare function createSkillManifest(skillsRoot: string): Promise<SkillManifest>;
@@ -24,6 +26,8 @@ export declare function writeSkillManifest(skillsRoot: string, output?: string):
24
26
  export declare function installSkills(input: InstallSkillsInput): Promise<{
25
27
  destination: string;
26
28
  installed: string[];
27
- references: string | null;
29
+ retired: string[];
30
+ references: string;
28
31
  }>;
32
+ export { refreshWorkspaceGuidance } from './workspace-guidance.js';
29
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,wBAAwB,WAKvC;AAmBD,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAoDxF;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAkBpF;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,SAAuC,0BAIzG;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB;;;;GA2C5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AACvD,eAAO,MAAM,kCAAkC,yLAOrC,CAAC;AACX,wBAAgB,wBAAwB,WAMvC;AAuBD,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAgGxF;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAepF;AAuBD,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,SAAuC,0BAIzG;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB;;;;;GAuB5D;AAwID,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -1,54 +1,104 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { existsSync } from 'node:fs';
3
- import { cp, mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
4
- import { dirname, resolve } from 'node:path';
5
- import { DEVKIT_COMMANDS } from 'openxiangda-devkit-core';
3
+ import { readdir, readFile, stat, writeFile, } from 'node:fs/promises';
4
+ import { dirname, relative, resolve } from 'node:path';
5
+ import { DEVKIT_COMMANDS, DOCUMENTATION_TOPICS, documentationReferenceFile, renderDevkitCommandReference, } from 'openxiangda-devkit-core';
6
+ import { installSkillTransaction } from './internal/skill-installer.js';
7
+ export const OPENXIANGDA_SKILL_NAME = 'openxiangda-v2';
8
+ export const RETIRED_OPENXIANGDA_V2_SKILL_NAMES = [
9
+ 'openxiangda-v2-architecture',
10
+ 'openxiangda-v2-backend',
11
+ 'openxiangda-v2-data-authz',
12
+ 'openxiangda-v2-delivery',
13
+ 'openxiangda-v2-frontend',
14
+ 'openxiangda-v2-workflow-events',
15
+ ];
6
16
  export function resolveDefaultSkillsRoot() {
17
+ const explicit = String(process.env.OPENXIANGDA_SKILLS_ROOT || '').trim();
18
+ if (explicit)
19
+ return resolve(explicit);
7
20
  const packaged = resolve(import.meta.dirname, '../skills');
8
21
  const development = resolve(import.meta.dirname, '../../../skills');
9
- const packagedDocs = resolve(packaged, '../docs');
10
- return existsSync(packaged) && existsSync(packagedDocs) ? packaged : development;
22
+ return existsSync(packaged) ? packaged : development;
11
23
  }
12
24
  const FORBIDDEN_V2_TERMS = [
13
25
  /\bApp Function\b/i,
14
26
  /\bJS_CODE\b/i,
15
27
  /\bresource publish\b/i,
16
28
  /\bworkflow v3\b/i,
29
+ /\bRoleSession\b/i,
30
+ /\bcreate-openxiangda\b/i,
31
+ /\bopenxiangda-(?:admin|compiler|field-kit|testing|user|workflow)\b/i,
17
32
  ];
18
33
  const knownCommandIds = new Set(DEVKIT_COMMANDS.map(command => command.id));
34
+ const REQUIRED_REFERENCES = DOCUMENTATION_TOPICS.map(topic => documentationReferenceFile(topic.id));
19
35
  export async function validateSkills(skillsRoot) {
20
36
  const skills = await loadSkills(skillsRoot);
21
37
  const knownSkills = new Set(skills.map(skill => skill.name));
22
38
  const issues = [];
39
+ if (skills.length !== 1 || skills[0]?.name !== OPENXIANGDA_SKILL_NAME) {
40
+ issues.push({
41
+ skill: OPENXIANGDA_SKILL_NAME,
42
+ file: skillsRoot,
43
+ message: `Skill distribution must contain only ${OPENXIANGDA_SKILL_NAME}.`,
44
+ });
45
+ }
23
46
  for (const skill of skills) {
24
47
  const add = (message, file = skill.file) => issues.push({ skill: skill.name || skill.directory, file, message });
25
48
  if (!skill.name)
26
49
  add('SKILL.md frontmatter must declare name.');
27
50
  if (skill.name !== skill.directory)
28
51
  add('Skill directory and frontmatter name must match.');
29
- if (!skill.description || !/\bUse (when|for)\b/i.test(skill.description)) {
52
+ if (!skill.description || [...skill.description.trim()].length < 12) {
30
53
  add('Description must explain when the skill should be used.');
31
54
  }
32
- if (/\bTODO\b/.test(skill.source))
33
- add('Skill contains unfinished TODO text.');
34
- for (const forbidden of FORBIDDEN_V2_TERMS) {
35
- if (forbidden.test(skill.source))
36
- add(`2.0 skill contains forbidden 1.x term: ${forbidden.source}`);
37
- }
38
- for (const command of extractCommands(skill.source)) {
39
- const commandId = toCommandId(command);
40
- if (!commandId || !knownCommandIds.has(commandId)) {
41
- add(`Unknown 2.0 CLI command reference: openxiangda ${command}`);
55
+ const referencesRoot = resolve(skillsRoot, skill.directory, 'references');
56
+ for (const name of REQUIRED_REFERENCES) {
57
+ const referenceFile = resolve(referencesRoot, name);
58
+ if (!(await isFile(referenceFile))) {
59
+ add(`Missing required nested reference: references/${name}`, referenceFile);
42
60
  }
43
61
  }
44
- for (const linkedSkill of extractSkillMentions(skill.source)) {
45
- if (!knownSkills.has(linkedSkill))
46
- add(`Unknown skill reference: $${linkedSkill}`);
62
+ const markdownFiles = [skill.file, ...(await markdownFilesBelow(referencesRoot))];
63
+ for (const markdownFile of markdownFiles) {
64
+ const source = await readFile(markdownFile, 'utf8');
65
+ if (markdownFile !== skill.file && /^---\n/.test(source)) {
66
+ add('Nested reference must not declare Skill frontmatter.', markdownFile);
67
+ }
68
+ if (/\bTODO\b/.test(source)) {
69
+ add('Skill contains unfinished TODO text.', markdownFile);
70
+ }
71
+ for (const forbidden of FORBIDDEN_V2_TERMS) {
72
+ if (forbidden.test(source)) {
73
+ add(`2.0 skill contains forbidden 1.x term: ${forbidden.source}`, markdownFile);
74
+ }
75
+ }
76
+ for (const linkedSkill of extractSkillMentions(source)) {
77
+ if (!knownSkills.has(linkedSkill)) {
78
+ add(`Unknown skill reference: $${linkedSkill}`, markdownFile);
79
+ }
80
+ }
81
+ for (const command of extractCommands(source)) {
82
+ const commandId = toCommandId(command);
83
+ if (!commandId || !knownCommandIds.has(commandId)) {
84
+ add(`Unknown 2.0 CLI command reference: openxiangda ${command}`, markdownFile);
85
+ }
86
+ }
87
+ for (const reference of extractLocalMarkdownLinks(source)) {
88
+ const target = resolve(dirname(markdownFile), reference);
89
+ if (!(await isFile(target))) {
90
+ add(`Broken local reference: ${reference}`, markdownFile);
91
+ }
92
+ }
47
93
  }
48
- for (const reference of extractLocalMarkdownLinks(skill.source)) {
49
- const target = resolve(dirname(skill.file), reference);
50
- if (!(await isFile(target)))
51
- add(`Broken local reference: ${reference}`);
94
+ const commandReference = resolve(referencesRoot, 'commands.md');
95
+ if ((await isFile(commandReference)) &&
96
+ (await readFile(commandReference, 'utf8')) !==
97
+ renderDevkitCommandReference({
98
+ title: 'CLI 命令参考',
99
+ executable: 'pnpm openxiangda',
100
+ })) {
101
+ add('Generated command reference drifted from DEVKIT_COMMANDS.', commandReference);
52
102
  }
53
103
  const agentFile = resolve(skillsRoot, skill.directory, 'agents/openai.yaml');
54
104
  if (!(await isFile(agentFile))) {
@@ -67,21 +117,38 @@ export async function validateSkills(skillsRoot) {
67
117
  }
68
118
  export async function createSkillManifest(skillsRoot) {
69
119
  const skills = await loadSkills(skillsRoot);
120
+ assertCanonicalSkillSet(skills);
70
121
  const entries = await Promise.all(skills.map(async (skill) => {
71
- const agentFile = resolve(skillsRoot, skill.directory, 'agents/openai.yaml');
72
- const agentSource = await readFile(agentFile, 'utf8');
73
122
  return {
74
123
  name: skill.name,
75
124
  description: skill.description,
76
- sha256: createHash('sha256')
77
- .update(skill.source)
78
- .update('\0')
79
- .update(agentSource)
80
- .digest('hex'),
125
+ sha256: await skillDirectoryDigest(resolve(skillsRoot, skill.directory)),
81
126
  };
82
127
  }));
83
128
  return { schemaVersion: 1, skills: entries.sort((left, right) => left.name.localeCompare(right.name)) };
84
129
  }
130
+ async function skillDirectoryDigest(root) {
131
+ const files = [];
132
+ const visit = async (directory) => {
133
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
134
+ const path = resolve(directory, entry.name);
135
+ if (entry.isDirectory())
136
+ await visit(path);
137
+ else if (entry.isFile())
138
+ files.push(path);
139
+ }
140
+ };
141
+ await visit(root);
142
+ const hash = createHash('sha256');
143
+ for (const file of files.sort()) {
144
+ hash
145
+ .update(relative(root, file).replaceAll('\\', '/'))
146
+ .update('\0')
147
+ .update(await readFile(file))
148
+ .update('\0');
149
+ }
150
+ return hash.digest('hex');
151
+ }
85
152
  export async function writeSkillManifest(skillsRoot, output = resolve(skillsRoot, 'manifest.json')) {
86
153
  const manifest = await createSkillManifest(skillsRoot);
87
154
  await writeFile(output, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
@@ -89,43 +156,45 @@ export async function writeSkillManifest(skillsRoot, output = resolve(skillsRoot
89
156
  }
90
157
  export async function installSkills(input) {
91
158
  const skills = await loadSkills(input.skillsRoot);
92
- const docsSource = resolve(input.skillsRoot, '../docs');
93
- const referencesTarget = resolve(input.destination, '.openxiangda-v2-references');
94
- const hasReferences = await isDirectory(docsSource);
95
- const targets = skills.map(skill => resolve(input.destination, skill.directory));
96
- if (hasReferences)
97
- targets.push(referencesTarget);
98
- if (!input.force) {
99
- for (const target of targets) {
100
- if (await pathExists(target))
101
- throw new Error(`SKILL_ALREADY_EXISTS: ${target}`);
102
- }
103
- }
104
- await mkdir(input.destination, { recursive: true });
105
- if (hasReferences) {
106
- await rm(referencesTarget, { recursive: true, force: true });
107
- await cp(docsSource, referencesTarget, { recursive: true });
108
- await rm(resolve(referencesTarget, '.vitepress'), { recursive: true, force: true });
109
- }
110
- const installed = [];
111
- for (const skill of skills) {
112
- const source = resolve(input.skillsRoot, skill.directory);
113
- const target = resolve(input.destination, skill.directory);
114
- await rm(target, { recursive: true, force: true });
115
- await cp(source, target, { recursive: true });
116
- if (hasReferences) {
117
- const skillFile = resolve(target, 'SKILL.md');
118
- const sourceText = await readFile(skillFile, 'utf8');
119
- await writeFile(skillFile, sourceText.replaceAll('../../docs/', '../.openxiangda-v2-references/'), 'utf8');
120
- }
121
- installed.push(skill.name);
159
+ assertCanonicalSkillSet(skills);
160
+ const skill = skills[0];
161
+ const target = resolve(input.destination, OPENXIANGDA_SKILL_NAME);
162
+ if (!input.force && (await pathExists(target))) {
163
+ throw new Error(`SKILL_ALREADY_EXISTS: ${target}`);
122
164
  }
165
+ const retired = await managedRetiredSkillNames(input.destination);
166
+ await installSkillTransaction({
167
+ source: resolve(input.skillsRoot, skill.directory),
168
+ destination: input.destination,
169
+ name: OPENXIANGDA_SKILL_NAME,
170
+ retiredNames: retired,
171
+ });
123
172
  return {
124
173
  destination: input.destination,
125
- installed,
126
- references: hasReferences ? referencesTarget : null,
174
+ installed: [OPENXIANGDA_SKILL_NAME],
175
+ retired,
176
+ references: resolve(target, 'references'),
127
177
  };
128
178
  }
179
+ async function managedRetiredSkillNames(destination) {
180
+ const retired = [];
181
+ for (const name of RETIRED_OPENXIANGDA_V2_SKILL_NAMES) {
182
+ const metadata = resolve(destination, name, '.openxiangda-skill-install.json');
183
+ if (!(await isFile(metadata)))
184
+ continue;
185
+ try {
186
+ const parsed = JSON.parse(await readFile(metadata, 'utf8'));
187
+ if (parsed?.manager === 'openxiangda' &&
188
+ /(?:^|\/)v2\/skills\/openxiangda-v2-/.test(String(parsed?.sourceRelativePath || ''))) {
189
+ retired.push(name);
190
+ }
191
+ }
192
+ catch {
193
+ // An unreadable or user-owned directory is never removed automatically.
194
+ }
195
+ }
196
+ return retired.sort();
197
+ }
129
198
  async function loadSkills(skillsRoot) {
130
199
  const entries = await readdir(skillsRoot, { withFileTypes: true });
131
200
  const directories = entries
@@ -145,6 +214,11 @@ async function loadSkills(skillsRoot) {
145
214
  };
146
215
  }));
147
216
  }
217
+ function assertCanonicalSkillSet(skills) {
218
+ if (skills.length !== 1 || skills[0]?.name !== OPENXIANGDA_SKILL_NAME) {
219
+ throw new Error(`SKILL_SET_INVALID: expected only ${OPENXIANGDA_SKILL_NAME}`);
220
+ }
221
+ }
148
222
  function parseFrontmatter(source) {
149
223
  const match = source.match(/^---\n([\s\S]*?)\n---\n/);
150
224
  if (!match?.[1])
@@ -156,15 +230,18 @@ function parseFrontmatter(source) {
156
230
  .map(line => [line[1], line[2].replace(/^['"]|['"]$/g, '')]));
157
231
  }
158
232
  function extractCommands(source) {
159
- return [...source.matchAll(/`openxiangda\s+([^`]+)`/g)].map(match => match[1].trim());
233
+ return [
234
+ ...source.matchAll(/\bopenxiangda(?:@[^\s`]+)?\s+([a-z][a-z0-9:-]*(?:\s+[a-z][a-z0-9:-]*)?)/gi),
235
+ ].map(match => match[1].trim().toLowerCase());
160
236
  }
161
237
  function extractSkillMentions(source) {
162
- return [...source.matchAll(/\$([a-z0-9-]+)/g)].map(match => match[1]);
238
+ return [...source.matchAll(/\$([a-z0-9-]+)/g)].map(match => match[1]).filter(name => !['ref', 'defs', 'schema', 'id', 'anchor'].includes(name));
163
239
  }
164
240
  function extractLocalMarkdownLinks(source) {
165
241
  return [...source.matchAll(/\]\(([^)]+)\)/g)]
166
242
  .map(match => match[1])
167
- .filter(reference => !/^(?:https?:|#)/.test(reference));
243
+ .filter(reference => !/^(?:[a-z]+:|#)/i.test(reference))
244
+ .map(reference => reference.split('#')[0]);
168
245
  }
169
246
  function toCommandId(command) {
170
247
  const tokens = command.split(/\s+/).filter(token => token && !token.startsWith('-'));
@@ -193,6 +270,22 @@ async function isDirectory(path) {
193
270
  return false;
194
271
  }
195
272
  }
273
+ async function markdownFilesBelow(root) {
274
+ if (!(await isDirectory(root)))
275
+ return [];
276
+ const files = [];
277
+ const visit = async (directory) => {
278
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
279
+ const path = resolve(directory, entry.name);
280
+ if (entry.isDirectory())
281
+ await visit(path);
282
+ else if (entry.isFile() && entry.name.endsWith('.md'))
283
+ files.push(path);
284
+ }
285
+ };
286
+ await visit(root);
287
+ return files.sort();
288
+ }
196
289
  async function pathExists(path) {
197
290
  try {
198
291
  await stat(path);
@@ -202,4 +295,5 @@ async function pathExists(path) {
202
295
  return false;
203
296
  }
204
297
  }
298
+ export { refreshWorkspaceGuidance } from './workspace-guidance.js';
205
299
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface SkillInstallTransactionInput {
2
+ source: string;
3
+ destination: string;
4
+ name: string;
5
+ retiredNames?: string[];
6
+ }
7
+ export declare function installSkillTransaction(input: SkillInstallTransactionInput): Promise<string>;
8
+ //# sourceMappingURL=skill-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installer.d.ts","sourceRoot":"","sources":["../../src/internal/skill-installer.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,4BAA4B,mBAqChF"}
@@ -0,0 +1,51 @@
1
+ import { cp, mkdir, mkdtemp, rename, rm, stat } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ export async function installSkillTransaction(input) {
4
+ await mkdir(input.destination, { recursive: true });
5
+ const target = resolve(input.destination, input.name);
6
+ const staging = await mkdtemp(resolve(input.destination, '.openxiangda-v2-install-'));
7
+ const stagedSkill = resolve(staging, input.name);
8
+ const backupRoot = resolve(staging, 'previous');
9
+ const backedUp = [];
10
+ let installedNewSkill = false;
11
+ try {
12
+ await cp(input.source, stagedSkill, { recursive: true });
13
+ await mkdir(backupRoot, { recursive: true });
14
+ for (const name of [
15
+ input.name,
16
+ ...new Set(input.retiredNames || []),
17
+ ]) {
18
+ const source = resolve(input.destination, name);
19
+ if (!(await pathExists(source)))
20
+ continue;
21
+ const backup = resolve(backupRoot, name);
22
+ await rename(source, backup);
23
+ backedUp.push({ source, backup });
24
+ }
25
+ await rename(stagedSkill, target);
26
+ installedNewSkill = true;
27
+ }
28
+ catch (error) {
29
+ if (installedNewSkill || (await pathExists(target))) {
30
+ await rm(target, { recursive: true, force: true });
31
+ }
32
+ for (const entry of backedUp.reverse()) {
33
+ await rename(entry.backup, entry.source);
34
+ }
35
+ throw error;
36
+ }
37
+ finally {
38
+ await rm(staging, { recursive: true, force: true });
39
+ }
40
+ return target;
41
+ }
42
+ async function pathExists(path) {
43
+ try {
44
+ await stat(path);
45
+ return true;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ //# sourceMappingURL=skill-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../../src/internal/skill-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAmC;IAC/E,MAAM,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,QAAQ,GAA8C,EAAE,CAAC;IAC/D,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI;YACjB,KAAK,CAAC,IAAI;YACV,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;SACrC,EAAE,CAAC;YACF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;gBAAE,SAAS;YAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClC,iBAAiB,GAAG,IAAI,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,iBAAiB,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /** 仅更新平台托管区块;旧项目没有边界时写候选文件,不猜测用户文字归属。 */
2
+ export declare function refreshWorkspaceGuidance(root: string, template: string): {
3
+ state: string;
4
+ path: string;
5
+ candidate: string;
6
+ preserved: boolean;
7
+ } | {
8
+ state: string;
9
+ path: string;
10
+ preserved: boolean;
11
+ candidate?: never;
12
+ };
13
+ //# sourceMappingURL=workspace-guidance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-guidance.d.ts","sourceRoot":"","sources":["../src/workspace-guidance.ts"],"names":[],"mappings":"AAaA,yCAAyC;AACzC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;;;;EAwCtE"}
@@ -0,0 +1,67 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { existsSync, lstatSync, mkdirSync, openSync, closeSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ const BEGIN = '<!-- OPENXIANGDA:BEGIN -->';
5
+ const END = '<!-- OPENXIANGDA:END -->';
6
+ function managedBlock(text) {
7
+ if (text.split(BEGIN).length !== 2 || text.split(END).length !== 2 || text.indexOf(END) < text.indexOf(BEGIN)) {
8
+ throw new Error('WORKSPACE_GUIDANCE_MARKERS_INVALID: 平台约定区块缺失、重复或次序错误');
9
+ }
10
+ return { start: text.indexOf(BEGIN), end: text.indexOf(END) + END.length };
11
+ }
12
+ /** 仅更新平台托管区块;旧项目没有边界时写候选文件,不猜测用户文字归属。 */
13
+ export function refreshWorkspaceGuidance(root, template) {
14
+ const markers = managedBlock(template);
15
+ const block = template.slice(markers.start, markers.end);
16
+ const directory = resolve(root, '.openxiangda');
17
+ mkdirSync(directory, { recursive: true });
18
+ const lock = resolve(directory, 'guidance.lock');
19
+ let fd;
20
+ try {
21
+ fd = openSync(lock, 'wx', 0o600);
22
+ }
23
+ catch (error) {
24
+ if (error.code === 'EEXIST')
25
+ throw new Error('WORKSPACE_GUIDANCE_BUSY: 另一个资料更新正在执行;确认其结束后重试');
26
+ throw error;
27
+ }
28
+ closeSync(fd);
29
+ const target = resolve(root, 'AGENTS.md');
30
+ let temporary;
31
+ try {
32
+ if (existsSync(target) && !lstatSync(target).isFile())
33
+ throw new Error('WORKSPACE_GUIDANCE_PATH_INVALID: AGENTS.md 必须是普通文件');
34
+ const previous = existsSync(target) ? readFileSync(target, 'utf8') : undefined;
35
+ if (previous !== undefined && !previous.includes(BEGIN) && !previous.includes(END)) {
36
+ const digest = createHash('sha256').update(block).digest('hex').slice(0, 12);
37
+ const candidate = resolve(directory, `AGENTS.platform-${digest}.md`);
38
+ // 候选本身也可能已由用户编辑,使用独占创建并保留已有内容。
39
+ try {
40
+ writeFileSync(candidate, `${block}\n`, { flag: 'wx' });
41
+ }
42
+ catch (error) {
43
+ if (error.code !== 'EEXIST')
44
+ throw error;
45
+ }
46
+ return { state: 'review-required', path: target, candidate, preserved: true };
47
+ }
48
+ const current = previous === undefined ? undefined : managedBlock(previous);
49
+ const next = current ? previous.slice(0, current.start) + block + previous.slice(current.end) : template;
50
+ if (next === previous)
51
+ return { state: 'unchanged', path: target, preserved: true };
52
+ temporary = resolve(root, `.AGENTS.openxiangda-${randomUUID()}.tmp`);
53
+ writeFileSync(temporary, next, { flag: 'wx' });
54
+ const readback = existsSync(target) ? readFileSync(target, 'utf8') : undefined;
55
+ if (previous !== readback)
56
+ throw new Error('WORKSPACE_GUIDANCE_CHANGED: AGENTS.md 在准备期间被修改,请重新读取后重试');
57
+ renameSync(temporary, target);
58
+ temporary = undefined;
59
+ return { state: previous === undefined ? 'created' : 'updated', path: target, preserved: true };
60
+ }
61
+ finally {
62
+ if (temporary && existsSync(temporary))
63
+ unlinkSync(temporary);
64
+ unlinkSync(lock);
65
+ }
66
+ }
67
+ //# sourceMappingURL=workspace-guidance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-guidance.js","sourceRoot":"","sources":["../src/workspace-guidance.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,10 @@
1
1
  {
2
2
  "name": "openxiangda-skill-kit",
3
- "version": "2.0.0-alpha.14",
4
- "description": "Validation and deterministic packaging for OpenXiangda 2.0 AI skills.",
3
+ "version": "2.0.0-alpha.140",
4
+ "description": "OpenXiangda 2.0 中文 AI 技能的校验、分发与安装。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
- "bin": {
9
- "openxiangda-skill-kit": "./dist/bin.js"
10
- },
11
8
  "exports": {
12
9
  ".": {
13
10
  "types": "./dist/index.d.ts",
@@ -17,11 +14,10 @@
17
14
  "files": [
18
15
  "dist/",
19
16
  "skills/",
20
- "docs/",
21
17
  "README.md"
22
18
  ],
23
19
  "dependencies": {
24
- "openxiangda-devkit-core": "2.0.0-alpha.12"
20
+ "openxiangda-devkit-core": "2.0.0-alpha.115"
25
21
  },
26
22
  "devDependencies": {
27
23
  "tsx": "4.23.12",
@@ -33,6 +29,7 @@
33
29
  "license": "MIT",
34
30
  "scripts": {
35
31
  "build": "tsc -p tsconfig.json",
32
+ "build:release": "node ../../scripts/prune-package-dist.mjs && pnpm build",
36
33
  "check": "tsc -p tsconfig.json --noEmit",
37
34
  "test": "tsx --test test/*.test.ts"
38
35
  }