@namewta/speculo 1.0.19 → 1.0.21
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/README.md +8 -7
- package/THIRD-PARTY-NOTICES.md +33 -0
- package/dist/src/agent-files.js +2 -2
- package/dist/src/agent-files.js.map +1 -1
- package/dist/src/agent-skills.d.ts +81 -0
- package/dist/src/agent-skills.js +530 -0
- package/dist/src/agent-skills.js.map +1 -0
- package/dist/src/cli.js +11 -3
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.js +5 -3
- package/dist/src/config.js.map +1 -1
- package/dist/src/doctor.js +7 -2
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.js +23 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/manifest.d.ts +9 -0
- package/dist/src/manifest.js +45 -7
- package/dist/src/manifest.js.map +1 -1
- package/dist/src/refresh.js +40 -0
- package/dist/src/refresh.js.map +1 -1
- package/dist/src/structured.js +15 -4
- package/dist/src/structured.js.map +1 -1
- package/dist/src/transaction.d.ts +24 -3
- package/dist/src/transaction.js +191 -12
- package/dist/src/transaction.js.map +1 -1
- package/package.json +7 -4
- package/scripts/validate-skills.mjs +56 -0
- package/template/AGENTS.md +1 -1
- package/template/CLAUDE.md +1 -1
- package/template/canonical/canonical-specdev-goal-plan.md +156 -28
- package/template/canonical/canonical-specdev-grill-with-docs.md +153 -31
- package/template/canonical/canonical-specdev-spec.md +153 -27
- package/template/canonical/canonical-specdev-tickets.md +153 -27
- package/template/canonical/canonical-specdev-wayfinder.md +142 -27
- package/template/commands/retro.md +11 -9
- package/template/skills/archive-and-consolidate/SKILL.md +163 -7
- package/template/skills/archive-and-consolidate/references/cleanup-rules.md +1 -1
- package/template/skills/docs-sync/references/agents/claude-redirect.md +8 -8
- package/template/skills/docs-sync/references/agents/content-contract.md +1 -1
- package/template/skills/docs-sync/references/agents/manifest-discovery.md +7 -7
- package/template/skills/docs-sync/references/agents/role-classification.md +4 -4
- package/template/skills/docs-sync/references/agents-contract.md +1 -1
- package/template/skills/engineering-standards-builder/SKILL.md +149 -9
- package/template/skills/engineering-standards-builder/agents/openai.yaml +2 -0
- package/template/skills/engineering-standards-builder/manifest.txt +2 -1
- package/template/skills/engineering-standards-builder/references/rules/09-mechanical-guardrails.md +9 -0
- package/template/skills/engineering-standards-builder/scripts/validate-builder.mjs +4 -7
- package/template/skills/git-history-squash/SKILL.md +87 -11
- package/template/skills/git-history-squash/agents/openai.yaml +2 -0
- package/template/skills/optimize-codex-config/SKILL.md +71 -11
- package/template/skills/{speculo-retro/references/entry-procedure.md → retrospective/SKILL.md} +12 -8
- package/template/skills/{speculo-retro → retrospective}/references/friction-taxonomy.md +22 -13
- package/template/skills/{speculo-retro → retrospective}/references/issue-drafting-sop.md +10 -20
- package/template/skills/source-code-zip/SKILL.md +44 -8
- package/template/skills/source-code-zip/references/{entry-procedure.md → cli-reference.md} +0 -43
- package/template/skills/upstream-fork-sync/SKILL.md +71 -8
- package/template/skills/{writing-great-skills → writing-for-agents}/GLOSSARY.md +1 -1
- package/template/skills/writing-for-agents/SKILL.md +22 -0
- package/template/skills/writing-for-agents/agents/openai.yaml +2 -0
- package/template/skills/{writing-great-skills/references/entry-procedure.md → writing-for-agents/references/authoring-principles.md} +2 -9
- package/template/workflows/ops/D-project-deploy/D-project-deploy.md +1 -1
- package/template/workflows/ops/H-host-manage/H-host-manage.md +4 -0
- package/template/workflows/ops/H-host-manage/references/host-profiles.md +4 -0
- package/template/workflows/ops/I-initialize/I-initialize.md +1 -1
- package/template/workflows/ops/INDEX.md +2 -0
- package/template/workflows/ops/README.md +7 -3
- package/template/workflows/ops/S-server-connect/S-server-connect.md +5 -5
- package/template/workflows/ops/V-inventory-view/V-inventory-view.md +2 -0
- package/template/workflows/ops/common/CAPABILITIES.md +2 -0
- package/template/workflows/ops/common/USAGE.md +5 -5
- package/template/workflows/ops/common/WORKSPACE-USAGE.md +29 -2
- package/template/workflows/ops/common/examples/README.md +1 -1
- package/template/workflows/ops/common/examples/register.example.json +7 -3
- package/template/workflows/ops/common/examples/server-connection.example.json +11 -0
- package/template/workflows/ops/common/rules/deployment-layout.md +1 -1
- package/template/workflows/ops/common/rules/host-root-and-onboarding.md +47 -0
- package/template/workflows/ops/common/rules/persistence-and-secrets.md +1 -1
- package/template/workflows/ops/common/rules/research-and-decisions.md +8 -0
- package/template/workflows/ops/common/rules/server-onboarding.md +3 -3
- package/template/workflows/ops/common/rules/workspace-and-authorization.md +2 -2
- package/template/workflows/ops/common/schemas/fleet-view.schema.json +64 -0
- package/template/workflows/ops/common/schemas/host.schema.json +19 -0
- package/template/workflows/ops/common/schemas/plan.schema.json +57 -0
- package/template/workflows/ops/common/schemas/root-confirmation.schema.json +118 -0
- package/template/workflows/ops/common/schemas/server-connection.schema.json +67 -0
- package/template/workflows/ops/common/schemas/server-discovery.schema.json +171 -0
- package/template/workflows/ops/common/schemas/spec.schema.json +19 -0
- package/template/workflows/ops/common/schemas/status.schema.json +19 -0
- package/template/workflows/ops/common/templates/FLEET.html +1 -1
- package/template/workflows/ops/common/templates/HOST-README.md +3 -1
- package/template/workflows/ops/common/tests/test_ops.mjs +8 -11
- package/template/workflows/ops/common/tests/test_ops_bootstrap.mjs +101 -16
- package/template/workflows/ops/common/tests/test_ops_onboarding.mjs +225 -0
- package/template/workflows/ops/common/tests/test_ops_workspace.mjs +17 -8
- package/template/workflows/ops/common/tools/demo-local.mjs +4 -0
- package/template/workflows/ops/common/tools/opslib/agent.mjs +26 -0
- package/template/workflows/ops/common/tools/opslib/bootstrap.mjs +52 -26
- package/template/workflows/ops/common/tools/opslib/cli.mjs +1 -0
- package/template/workflows/ops/common/tools/opslib/core.mjs +1 -1
- package/template/workflows/ops/common/tools/opslib/docs.mjs +1 -0
- package/template/workflows/ops/common/tools/opslib/execution.mjs +4 -0
- package/template/workflows/ops/common/tools/opslib/fleet.mjs +26 -4
- package/template/workflows/ops/common/tools/opslib/host_recipes.mjs +34 -0
- package/template/workflows/ops/common/tools/opslib/model.mjs +6 -0
- package/template/workflows/ops/common/tools/opslib/onboarding.mjs +215 -0
- package/template/workflows/ops/common/tools/opslib/planner.mjs +3 -0
- package/template/workflows/ops/common/tools/opslib/transport.mjs +10 -6
- package/template/workflows/ops/common/tools/opslib/workspace_cli.mjs +20 -1
- package/template/workflows/ops/common/tools/server-discover.sh +65 -0
- package/template/workflows/ops/common/tools/validate-ops.mjs +1 -1
- package/template/workflows/ops/manifest.json +12 -5
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +3 -3
- package/template/workflows/specdev/C-code-review/C-code-review.md +1 -1
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +6 -0
- package/template/workflows/specdev/G-grill-with-docs/references/interview-procedure.md +6 -6
- package/template/workflows/specdev/I-implement/references/implementation-procedure.md +1 -1
- package/template/workflows/specdev/I-implement/tdd-rules.md +4 -0
- package/template/workflows/specdev/I-init-setup/config-template.json +5 -1
- package/template/workflows/specdev/INDEX.md +2 -2
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +1 -1
- package/template/workflows/specdev/P-prototype/P-prototype.md +7 -3
- package/template/workflows/specdev/P-prototype/logic-protocol.md +11 -0
- package/template/workflows/specdev/P-prototype/logic-template.md +27 -0
- package/template/workflows/specdev/P-prototype/project-preview-protocol.md +9 -0
- package/template/workflows/specdev/R-retro/R-retro.md +26 -0
- package/template/workflows/specdev/R-retro/retro-template.md +27 -0
- package/template/workflows/specdev/R-review-architecture/references/selected-design.md +1 -1
- package/template/workflows/specdev/README.md +13 -2
- package/template/workflows/specdev/S-spec/S-spec.md +4 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +4 -0
- package/template/workflows/specdev/T-triage/T-triage.md +31 -25
- package/template/workflows/specdev/T-triage/capture-protocol.md +1 -1
- package/template/workflows/specdev/T-triage/ci-security-protocol.md +11 -0
- package/template/workflows/specdev/T-triage/intake-protocol.md +10 -4
- package/template/workflows/specdev/T-triage/pr-delivery-protocol.md +13 -0
- package/template/workflows/specdev/T-triage/pr-record-template.md +39 -0
- package/template/workflows/specdev/T-triage/publish-protocol.md +1 -1
- package/template/workflows/specdev/T-triage/queue-protocol.md +7 -0
- package/template/workflows/specdev/T-triage/reconcile-protocol.md +1 -1
- package/template/workflows/specdev/T-triage/references/issue-pr-policy.md +23 -0
- package/template/workflows/specdev/T-triage/references/release-authentication.md +9 -0
- package/template/workflows/specdev/T-triage/references/release-notes-injection.md +21 -0
- package/template/workflows/specdev/T-triage/references/workflow-yaml-reference.md +37 -0
- package/template/workflows/specdev/T-triage/release-preflight.md +13 -0
- package/template/workflows/specdev/T-triage/release-protocol.md +12 -0
- package/template/workflows/specdev/T-triage/release-recovery.md +18 -0
- package/template/workflows/specdev/T-triage/remote-operations.md +25 -0
- package/template/workflows/specdev/T-triage/scripts/github-transport.mjs +208 -0
- package/template/workflows/specdev/T-triage/source-template.md +7 -0
- package/template/workflows/specdev/T-triage/triage-run-template.md +34 -0
- package/template/workflows/specdev/T-triage/triage-template.md +4 -1
- package/template/workflows/specdev/common/rules/artifact-contract.md +7 -0
- package/template/workflows/specdev/common/rules/change-completion.md +6 -0
- package/template/workflows/specdev/common/rules/workflow-routing.md +6 -0
- package/template/workflows/specdev/common/rules/workflow-state-and-lifecycle.md +1 -1
- package/template/workflows/specdev/common/schemas/config.schema.json +137 -26
- package/template/workflows/specdev/common/schemas/logic-prototype.schema.json +62 -0
- package/template/workflows/specdev/common/schemas/pull-request.schema.json +90 -0
- package/template/workflows/specdev/common/schemas/retrospective.schema.json +58 -0
- package/template/workflows/specdev/common/schemas/triage-run.schema.json +149 -0
- package/template/workflows/specdev/common/schemas/triage.schema.json +117 -15
- package/template/workflows/specdev/common/tools/delivery-artifacts.mjs +95 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +60 -19
- package/template/workflows/specdev/runtime-contract.json +4 -2
- package/template/skills/archive-and-consolidate/references/entry-procedure.md +0 -178
- package/template/skills/docs-sync/references/entry-procedure.md +0 -3
- package/template/skills/engineering-standards-builder/references/entry-procedure.md +0 -154
- package/template/skills/git-history-squash/references/entry-procedure.md +0 -94
- package/template/skills/github-npm-ops/SKILL.md +0 -19
- package/template/skills/github-npm-ops/references/ci-and-security-ops.md +0 -178
- package/template/skills/github-npm-ops/references/entry-procedure.md +0 -25
- package/template/skills/github-npm-ops/references/failure-recovery.md +0 -123
- package/template/skills/github-npm-ops/references/issue-pr-triage.md +0 -227
- package/template/skills/github-npm-ops/references/issue-transport.md +0 -26
- package/template/skills/github-npm-ops/references/package-json-checklist.md +0 -171
- package/template/skills/github-npm-ops/references/preflight-checklist.md +0 -39
- package/template/skills/github-npm-ops/references/publish-detection.md +0 -68
- package/template/skills/github-npm-ops/references/release-notes-injection.md +0 -238
- package/template/skills/github-npm-ops/references/release-pipeline.md +0 -108
- package/template/skills/github-npm-ops/references/setup-npm-token.md +0 -63
- package/template/skills/github-npm-ops/references/troubleshooting-playbook.md +0 -293
- package/template/skills/github-npm-ops/references/version-bump-flow.md +0 -217
- package/template/skills/github-npm-ops/references/workflow-yaml-reference.md +0 -268
- package/template/skills/github-npm-ops/scripts/issue-transport.mjs +0 -227
- package/template/skills/optimize-codex-config/references/entry-procedure.md +0 -78
- package/template/skills/speculo-retro/SKILL.md +0 -19
- package/template/skills/upstream-fork-sync/references/entry-procedure.md +0 -78
- package/template/skills/writing-great-skills/SKILL.md +0 -23
- /package/template/skills/{writing-great-skills → writing-for-agents}/references/document-contract.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → common/rules}/adr-format.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → common/rules}/context-format.md +0 -0
- /package/template/workflows/specdev/{I-implement → common/rules}/design-it-twice.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs/domain-modeling-rules.md → common/rules/domain-modeling.md} +0 -0
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readdir, readFile, readlink } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { containedPath } from "./paths.js";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
import { RefreshBlockedError } from "./refresh.js";
|
|
7
|
+
import { pathExists } from "./utils.js";
|
|
8
|
+
import { discoverWorkflowCatalog } from "./workflows.js";
|
|
9
|
+
export const MANAGED_MANIFEST = ".speculo-managed.json";
|
|
10
|
+
const WORK_DIR = /^[A-Z]-[a-z0-9][a-z0-9-]*$/;
|
|
11
|
+
const SKILL_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
12
|
+
const REQUIRED_TAIL = "选中后必须先读工作入口;选择本技能不构成执行授权。";
|
|
13
|
+
let validateSkill;
|
|
14
|
+
async function skillValidator(packageRoot) {
|
|
15
|
+
if (!validateSkill) {
|
|
16
|
+
const href = pathToFileURL(join(packageRoot, "scripts/validate-skills.mjs")).href;
|
|
17
|
+
validateSkill = (await import(href)).validateSkill;
|
|
18
|
+
}
|
|
19
|
+
return validateSkill;
|
|
20
|
+
}
|
|
21
|
+
function record(value) {
|
|
22
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
export function sha256Buffer(content) {
|
|
25
|
+
return createHash("sha256").update(content).digest("hex");
|
|
26
|
+
}
|
|
27
|
+
function frontmatter(content) {
|
|
28
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
29
|
+
const fields = {};
|
|
30
|
+
if (!match)
|
|
31
|
+
return fields;
|
|
32
|
+
for (const line of match[1].split(/\r?\n/)) {
|
|
33
|
+
const field = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
|
|
34
|
+
if (field)
|
|
35
|
+
fields[field[1]] = field[2].trim();
|
|
36
|
+
}
|
|
37
|
+
return fields;
|
|
38
|
+
}
|
|
39
|
+
function oneLine(value) {
|
|
40
|
+
return value.replace(/[\r\n|]+/g, " ").replace(/\s+/g, " ").trim();
|
|
41
|
+
}
|
|
42
|
+
function keywordsOf(raw) {
|
|
43
|
+
if (!raw)
|
|
44
|
+
return [];
|
|
45
|
+
return raw.replace(/^\[/, "").replace(/\]$/, "").split(",").map((item) => item.trim()).filter(Boolean);
|
|
46
|
+
}
|
|
47
|
+
export function buildWorkDescription(workflowName, workName, workDescription, keywords) {
|
|
48
|
+
const keyText = keywords.length ? `关键词:${keywords.join("、")}。` : "";
|
|
49
|
+
const tail = `${keyText}使用时机:用户要执行该 Work,或任务与其描述或关键词匹配。${REQUIRED_TAIL}`;
|
|
50
|
+
const head = `${oneLine(workflowName)} Work「${oneLine(workName)}」:${oneLine(workDescription)}。`;
|
|
51
|
+
const combined = `${head}${tail}`.replace(/\s+/g, " ").trim();
|
|
52
|
+
if (combined.length <= 1024)
|
|
53
|
+
return combined;
|
|
54
|
+
const budget = Math.max(0, 1024 - tail.length);
|
|
55
|
+
return `${head.slice(0, budget).trim()}${tail}`.slice(0, 1024);
|
|
56
|
+
}
|
|
57
|
+
export function renderWorkSkill(input) {
|
|
58
|
+
const id = `${input.workflowId}-${input.work.toLowerCase()}`;
|
|
59
|
+
const entry = `speculo/workflows/${input.workflowId}/${input.work}/${input.work}.md`;
|
|
60
|
+
const relative = `../../../${entry}`;
|
|
61
|
+
const description = buildWorkDescription(input.workflowName, input.title, input.workDescription, input.keywords);
|
|
62
|
+
const metadata = JSON.stringify({
|
|
63
|
+
"speculo-kind": "work-pointer",
|
|
64
|
+
"speculo-workflow": input.workflowId,
|
|
65
|
+
"speculo-work": input.work,
|
|
66
|
+
"speculo-entry": input.entryId,
|
|
67
|
+
});
|
|
68
|
+
const body = [
|
|
69
|
+
"---",
|
|
70
|
+
`name: ${id}`,
|
|
71
|
+
`description: ${description}`,
|
|
72
|
+
`metadata: ${metadata}`,
|
|
73
|
+
"---",
|
|
74
|
+
"",
|
|
75
|
+
`# ${oneLine(input.title)}`,
|
|
76
|
+
"",
|
|
77
|
+
"做任何步骤、扩读或改动之前,先读工作入口,并只以该文件为事实源。",
|
|
78
|
+
"",
|
|
79
|
+
`- 项目根路径:\`${entry}\``,
|
|
80
|
+
`- 相对本文件:[${input.work}.md](${relative})`,
|
|
81
|
+
"",
|
|
82
|
+
"接着只执行该入口的第一条读取指令。不要把 `<Path>` 当宿主标签。先读 `speculo/.speculo/workspace.json`,按 `path_base: project-root` 解析:`{roots.workflows}`=`speculo/workflows`,`{roots.state}`=`speculo/.speculo`,`{roots.skills}`=`speculo/skills`。入口内的相对链接相对于入口文件所在目录,不相对于本 SKILL.md。",
|
|
83
|
+
"",
|
|
84
|
+
"不复制入口、references、scripts 或正文。选中本技能不是执行授权。缺入口、roots 或该 Work 要求的确认时停止。",
|
|
85
|
+
"",
|
|
86
|
+
].join("\n");
|
|
87
|
+
return { id, workflow: input.workflowId, work: input.work, entry, sha256: sha256Buffer(body), body, title: oneLine(input.title) };
|
|
88
|
+
}
|
|
89
|
+
export async function discoverWorks(workflowRoot, workflowId, workflowName) {
|
|
90
|
+
const skills = [];
|
|
91
|
+
let entries;
|
|
92
|
+
try {
|
|
93
|
+
entries = await readdir(workflowRoot, { withFileTypes: true });
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
if (error.code === "ENOENT")
|
|
97
|
+
return skills;
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
if (!entry.isDirectory() || !WORK_DIR.test(entry.name))
|
|
102
|
+
continue;
|
|
103
|
+
const file = join(workflowRoot, entry.name, `${entry.name}.md`);
|
|
104
|
+
if (!(await pathExists(file)))
|
|
105
|
+
continue;
|
|
106
|
+
const fields = frontmatter(await readFile(file, "utf8"));
|
|
107
|
+
if (fields.type !== "workflow-entry" || fields.workflow !== workflowId)
|
|
108
|
+
continue;
|
|
109
|
+
skills.push(renderWorkSkill({
|
|
110
|
+
workflowId,
|
|
111
|
+
workflowName,
|
|
112
|
+
work: entry.name,
|
|
113
|
+
entryId: fields.id || `${workflowId}/${entry.name}`,
|
|
114
|
+
title: fields.name || entry.name,
|
|
115
|
+
workDescription: fields.description || fields.name || entry.name,
|
|
116
|
+
keywords: keywordsOf(fields.keywords),
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
return skills.sort((left, right) => left.id.localeCompare(right.id));
|
|
120
|
+
}
|
|
121
|
+
export async function listTemplateSkillNames(skillsRoot) {
|
|
122
|
+
const names = [];
|
|
123
|
+
for (const entry of await readdir(skillsRoot, { withFileTypes: true })) {
|
|
124
|
+
if (!entry.isDirectory() || entry.isSymbolicLink())
|
|
125
|
+
continue;
|
|
126
|
+
if (await pathExists(join(skillsRoot, entry.name, "SKILL.md")))
|
|
127
|
+
names.push(entry.name);
|
|
128
|
+
}
|
|
129
|
+
return names.sort();
|
|
130
|
+
}
|
|
131
|
+
export function templateLink(name) {
|
|
132
|
+
return `../../speculo/skills/${name}`;
|
|
133
|
+
}
|
|
134
|
+
export function parseAgentSkillSpec(spec, workflowIds) {
|
|
135
|
+
if (spec === "none")
|
|
136
|
+
return { mode: "none" };
|
|
137
|
+
if (spec === "keep")
|
|
138
|
+
return { mode: "keep" };
|
|
139
|
+
if (!/^[a-z0-9:+,-]+$/.test(spec))
|
|
140
|
+
throw new Error("--agent-skills contains an invalid token");
|
|
141
|
+
const parts = spec.split(",").filter((part) => part.length > 0);
|
|
142
|
+
if (parts.length === 0 || parts.includes("none") || parts.includes("keep"))
|
|
143
|
+
throw new Error("--agent-skills none and keep must be used alone");
|
|
144
|
+
const workflowSelection = [];
|
|
145
|
+
const templateNames = [];
|
|
146
|
+
let templateAll = false;
|
|
147
|
+
for (let index = 0; index < parts.length; index++) {
|
|
148
|
+
const part = parts[index];
|
|
149
|
+
if (part === "template") {
|
|
150
|
+
templateAll = true;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (part.startsWith("template:")) {
|
|
154
|
+
const inline = part.slice("template:".length).split("+").filter((id) => id.length > 0);
|
|
155
|
+
if (inline.length === 0 || inline.some((id) => !SKILL_ID.test(id)))
|
|
156
|
+
throw new Error("--agent-skills template id is invalid: " + part);
|
|
157
|
+
templateNames.push(...inline);
|
|
158
|
+
while (index + 1 < parts.length && !workflowIds.has(parts[index + 1]) && parts[index + 1] !== "template" && !parts[index + 1].startsWith("template:") && SKILL_ID.test(parts[index + 1])) {
|
|
159
|
+
templateNames.push(parts[++index]);
|
|
160
|
+
}
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (!workflowIds.has(part))
|
|
164
|
+
throw new Error("--agent-skills unknown workflow: " + part);
|
|
165
|
+
workflowSelection.push(part);
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
mode: "set",
|
|
169
|
+
workflowIds: [...new Set(workflowSelection)].sort(),
|
|
170
|
+
templateNames: templateAll ? "all" : [...new Set(templateNames)].sort(),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function absent() { return { kind: "absent" }; }
|
|
174
|
+
function fileNode(content) {
|
|
175
|
+
return { kind: "file", content: Buffer.from(content, "utf8").toString("base64"), mode: 0o644 };
|
|
176
|
+
}
|
|
177
|
+
function directoryNode(content) {
|
|
178
|
+
return { kind: "directory", file: "SKILL.md", content: Buffer.from(content, "utf8").toString("base64"), mode: 0o644 };
|
|
179
|
+
}
|
|
180
|
+
function symlinkNode(target) {
|
|
181
|
+
return { kind: "symlink", target };
|
|
182
|
+
}
|
|
183
|
+
export function decodeSkillText(node) {
|
|
184
|
+
if (node.kind !== "file" && node.kind !== "directory")
|
|
185
|
+
return "";
|
|
186
|
+
return Buffer.from(node.content, "base64").toString("utf8");
|
|
187
|
+
}
|
|
188
|
+
async function readManifest(target) {
|
|
189
|
+
const path = join(target, ".agents", "skills", MANAGED_MANIFEST);
|
|
190
|
+
let stat;
|
|
191
|
+
try {
|
|
192
|
+
stat = await lstat(path);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (error.code === "ENOENT")
|
|
196
|
+
return { manifest: null, raw: null, blocker: null };
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
if (stat.isSymbolicLink() || !stat.isFile()) {
|
|
200
|
+
return { manifest: null, raw: null, blocker: { code: "agent-skill-drift", path: `.agents/skills/${MANAGED_MANIFEST}`, message: "managed manifest must be a regular file" } };
|
|
201
|
+
}
|
|
202
|
+
const raw = await readFile(path, "utf8");
|
|
203
|
+
let parsed;
|
|
204
|
+
try {
|
|
205
|
+
parsed = JSON.parse(raw);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return { manifest: null, raw, blocker: { code: "agent-skill-drift", path: `.agents/skills/${MANAGED_MANIFEST}`, message: "managed manifest is not valid JSON" } };
|
|
209
|
+
}
|
|
210
|
+
if (!record(parsed) || parsed.schema_version !== 1 || typeof parsed.package_version !== "string" || !Array.isArray(parsed.works) || !Array.isArray(parsed.template_skills)) {
|
|
211
|
+
return { manifest: null, raw, blocker: { code: "agent-skill-drift", path: `.agents/skills/${MANAGED_MANIFEST}`, message: "managed manifest schema is invalid" } };
|
|
212
|
+
}
|
|
213
|
+
const works = [];
|
|
214
|
+
const templateSkills = [];
|
|
215
|
+
for (const work of parsed.works) {
|
|
216
|
+
if (!record(work) || typeof work.id !== "string" || typeof work.workflow !== "string" || typeof work.work !== "string" || typeof work.entry !== "string" || typeof work.sha256 !== "string") {
|
|
217
|
+
return { manifest: null, raw, blocker: { code: "agent-skill-drift", path: `.agents/skills/${MANAGED_MANIFEST}`, message: "managed work record is invalid" } };
|
|
218
|
+
}
|
|
219
|
+
works.push({ id: work.id, workflow: work.workflow, work: work.work, entry: work.entry, sha256: work.sha256 });
|
|
220
|
+
}
|
|
221
|
+
for (const skill of parsed.template_skills) {
|
|
222
|
+
if (!record(skill) || typeof skill.name !== "string" || typeof skill.link !== "string" || typeof skill.sha256 !== "string") {
|
|
223
|
+
return { manifest: null, raw, blocker: { code: "agent-skill-drift", path: `.agents/skills/${MANAGED_MANIFEST}`, message: "managed template record is invalid" } };
|
|
224
|
+
}
|
|
225
|
+
templateSkills.push({ name: skill.name, link: skill.link, sha256: skill.sha256 });
|
|
226
|
+
}
|
|
227
|
+
return { manifest: { schema_version: 1, package_version: parsed.package_version, works, template_skills: templateSkills }, raw, blocker: null };
|
|
228
|
+
}
|
|
229
|
+
async function parentBlocker(target) {
|
|
230
|
+
for (const relative of [".agents", ".agents/skills"]) {
|
|
231
|
+
try {
|
|
232
|
+
const stat = await lstat(join(target, relative));
|
|
233
|
+
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
234
|
+
return { code: "agent-skill-parent", path: relative, message: "expected a real directory so managed skills can be projected beside unmanaged entries" };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
if (error.code !== "ENOENT")
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
async function workNodeMatches(target, work) {
|
|
245
|
+
const dir = join(target, ".agents", "skills", work.id);
|
|
246
|
+
let stat;
|
|
247
|
+
try {
|
|
248
|
+
stat = await lstat(dir);
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
return error.code === "ENOENT" ? false : Promise.reject(error);
|
|
252
|
+
}
|
|
253
|
+
if (stat.isSymbolicLink() || !stat.isDirectory())
|
|
254
|
+
return false;
|
|
255
|
+
const entries = await readdir(dir);
|
|
256
|
+
if (entries.length !== 1 || entries[0] !== "SKILL.md")
|
|
257
|
+
return false;
|
|
258
|
+
const file = join(dir, "SKILL.md");
|
|
259
|
+
const fileStat = await lstat(file);
|
|
260
|
+
if (fileStat.isSymbolicLink() || !fileStat.isFile())
|
|
261
|
+
return false;
|
|
262
|
+
return sha256Buffer(await readFile(file)) === work.sha256;
|
|
263
|
+
}
|
|
264
|
+
async function templateNodeMatches(target, skill) {
|
|
265
|
+
const path = join(target, ".agents", "skills", skill.name);
|
|
266
|
+
let stat;
|
|
267
|
+
try {
|
|
268
|
+
stat = await lstat(path);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
return error.code === "ENOENT" ? false : Promise.reject(error);
|
|
272
|
+
}
|
|
273
|
+
if (!stat.isSymbolicLink())
|
|
274
|
+
return false;
|
|
275
|
+
return await readlink(path) === skill.link && sha256Buffer(skill.link) === skill.sha256;
|
|
276
|
+
}
|
|
277
|
+
export async function cleanProjectionSelection(target, manifest) {
|
|
278
|
+
const workflows = new Set();
|
|
279
|
+
const byWorkflow = new Map();
|
|
280
|
+
for (const work of manifest.works) {
|
|
281
|
+
const group = byWorkflow.get(work.workflow) ?? [];
|
|
282
|
+
group.push(work);
|
|
283
|
+
byWorkflow.set(work.workflow, group);
|
|
284
|
+
}
|
|
285
|
+
for (const [workflow, works] of byWorkflow) {
|
|
286
|
+
let clean = works.length > 0;
|
|
287
|
+
for (const work of works)
|
|
288
|
+
if (!(await workNodeMatches(target, work)))
|
|
289
|
+
clean = false;
|
|
290
|
+
if (clean)
|
|
291
|
+
workflows.add(workflow);
|
|
292
|
+
}
|
|
293
|
+
const template = new Set();
|
|
294
|
+
for (const skill of manifest.template_skills)
|
|
295
|
+
if (await templateNodeMatches(target, skill))
|
|
296
|
+
template.add(skill.name);
|
|
297
|
+
return { workflows, template };
|
|
298
|
+
}
|
|
299
|
+
async function promptAgentSkills(input) {
|
|
300
|
+
const { checkbox } = await import("@inquirer/prompts");
|
|
301
|
+
const workflowIds = input.workflows.length === 0 ? [] : await checkbox({
|
|
302
|
+
message: "选择要写入 .agents/skills/ 的 Work 组(供 Agents /skills;默认不写入,空格切换,回车确认):",
|
|
303
|
+
choices: input.workflows.map((workflow) => ({ name: workflow.label, value: workflow.id, checked: workflow.checked })),
|
|
304
|
+
pageSize: 12,
|
|
305
|
+
});
|
|
306
|
+
const templateNames = input.template.length === 0 ? [] : await checkbox({
|
|
307
|
+
message: "选择要链接到 .agents/skills/ 的模板 Skill(默认不链接,不影响 speculo/skills):",
|
|
308
|
+
choices: input.template.map((skill) => ({ name: skill.name, value: skill.name, checked: skill.checked })),
|
|
309
|
+
pageSize: 12,
|
|
310
|
+
});
|
|
311
|
+
return { workflowIds, templateNames };
|
|
312
|
+
}
|
|
313
|
+
export async function resolveAgentSkillRequest(options) {
|
|
314
|
+
if (options.request)
|
|
315
|
+
return options.request;
|
|
316
|
+
const existing = await readManifest(options.target);
|
|
317
|
+
if (existing.blocker)
|
|
318
|
+
throw new RefreshBlockedError([existing.blocker]);
|
|
319
|
+
if (!options.prompt)
|
|
320
|
+
return existing.manifest ? { mode: "keep" } : { mode: "skip" };
|
|
321
|
+
const prechecked = existing.manifest ? await cleanProjectionSelection(options.target, existing.manifest) : { workflows: new Set(), template: new Set() };
|
|
322
|
+
const workflows = [];
|
|
323
|
+
for (const id of options.installedWorkflowIds) {
|
|
324
|
+
const workflow = options.catalog.get(id);
|
|
325
|
+
if (!workflow)
|
|
326
|
+
continue;
|
|
327
|
+
const works = await discoverWorks(join(options.packageRoot, "template", "workflows", id), id, workflow.displayName);
|
|
328
|
+
workflows.push({ id, label: `${workflow.displayName} 的 ${works.length} 个 Work`, checked: prechecked.workflows.has(id) });
|
|
329
|
+
}
|
|
330
|
+
const template = (await listTemplateSkillNames(join(options.packageRoot, "template", "skills"))).map((name) => ({ name, checked: prechecked.template.has(name) }));
|
|
331
|
+
const picked = await promptAgentSkills({ workflows, template });
|
|
332
|
+
return { mode: "set", workflowIds: picked.workflowIds, templateNames: picked.templateNames };
|
|
333
|
+
}
|
|
334
|
+
function manifestText(manifest) {
|
|
335
|
+
return JSON.stringify(manifest, null, 2) + "\n";
|
|
336
|
+
}
|
|
337
|
+
function pushChange(records, name, before, after) {
|
|
338
|
+
if (JSON.stringify(before) === JSON.stringify(after))
|
|
339
|
+
return;
|
|
340
|
+
records.push({ name, before, after });
|
|
341
|
+
}
|
|
342
|
+
export async function planSkillProjection(options) {
|
|
343
|
+
if (options.request.mode === "skip")
|
|
344
|
+
return { records: null, blockers: [] };
|
|
345
|
+
const loaded = await readManifest(options.target);
|
|
346
|
+
if (loaded.blocker)
|
|
347
|
+
return { records: null, blockers: [loaded.blocker] };
|
|
348
|
+
const manifest = loaded.manifest;
|
|
349
|
+
if ((options.request.mode === "none" || options.request.mode === "keep") && !manifest)
|
|
350
|
+
return { records: null, blockers: [] };
|
|
351
|
+
const installed = new Set(options.installedWorkflowIds);
|
|
352
|
+
let workflowIds = [];
|
|
353
|
+
let templateNames = [];
|
|
354
|
+
if (options.request.mode === "none") {
|
|
355
|
+
workflowIds = [];
|
|
356
|
+
templateNames = [];
|
|
357
|
+
}
|
|
358
|
+
else if (options.request.mode === "keep") {
|
|
359
|
+
workflowIds = [...new Set(manifest.works.map((work) => work.workflow))].sort();
|
|
360
|
+
templateNames = manifest.template_skills.map((skill) => skill.name).sort();
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
workflowIds = [...options.request.workflowIds].sort();
|
|
364
|
+
templateNames = options.request.templateNames === "all"
|
|
365
|
+
? await listTemplateSkillNames(join(options.stagedRoot, "skills"))
|
|
366
|
+
: [...options.request.templateNames].sort();
|
|
367
|
+
}
|
|
368
|
+
const blockers = [];
|
|
369
|
+
for (const work of manifest?.works ?? []) {
|
|
370
|
+
if (!SKILL_ID.test(work.id) || !SKILL_ID.test(work.workflow) || !WORK_DIR.test(work.work) || work.entry !== `speculo/workflows/${work.workflow}/${work.work}/${work.work}.md`) {
|
|
371
|
+
blockers.push({ code: "agent-skill-drift", path: `.agents/skills/${MANAGED_MANIFEST}`, message: "managed work record is not a contained skill id" });
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
for (const skill of manifest?.template_skills ?? []) {
|
|
375
|
+
if (!SKILL_ID.test(skill.name) || skill.link !== templateLink(skill.name)) {
|
|
376
|
+
blockers.push({ code: "agent-skill-drift", path: `.agents/skills/${MANAGED_MANIFEST}`, message: "managed template record is not a contained skill id" });
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (blockers.length)
|
|
380
|
+
return { records: null, blockers };
|
|
381
|
+
for (const workflowId of workflowIds) {
|
|
382
|
+
if (!installed.has(workflowId))
|
|
383
|
+
blockers.push({ code: "agent-skill-workflow", path: workflowId, message: "workflow is not installed; select it for installation before projecting its works" });
|
|
384
|
+
}
|
|
385
|
+
const availableTemplate = new Set(await listTemplateSkillNames(join(options.stagedRoot, "skills")));
|
|
386
|
+
for (const name of templateNames) {
|
|
387
|
+
if (!availableTemplate.has(name))
|
|
388
|
+
blockers.push({ code: "agent-skill-template", path: name, message: "unknown template skill" });
|
|
389
|
+
}
|
|
390
|
+
if (blockers.length)
|
|
391
|
+
return { records: null, blockers };
|
|
392
|
+
const catalog = await discoverWorkflowCatalog(options.packageRoot);
|
|
393
|
+
const desiredWorks = [];
|
|
394
|
+
for (const workflowId of workflowIds) {
|
|
395
|
+
const workflow = catalog.get(workflowId);
|
|
396
|
+
desiredWorks.push(...await discoverWorks(join(options.stagedRoot, "workflows", workflowId), workflowId, workflow?.displayName ?? workflowId));
|
|
397
|
+
}
|
|
398
|
+
const validator = await skillValidator(options.packageRoot);
|
|
399
|
+
for (const work of desiredWorks) {
|
|
400
|
+
const errors = validator(work.body, work.id);
|
|
401
|
+
if (errors.length)
|
|
402
|
+
blockers.push({ code: "agent-skill-render", path: work.id, message: errors.join("; ") });
|
|
403
|
+
}
|
|
404
|
+
if (blockers.length)
|
|
405
|
+
return { records: null, blockers };
|
|
406
|
+
const desiredTemplates = templateNames.map((name) => {
|
|
407
|
+
const link = templateLink(name);
|
|
408
|
+
return { name, link, sha256: sha256Buffer(link) };
|
|
409
|
+
});
|
|
410
|
+
const nextManifest = {
|
|
411
|
+
schema_version: 1,
|
|
412
|
+
package_version: options.packageVersion,
|
|
413
|
+
works: desiredWorks.map(({ id, workflow, work, entry, sha256 }) => ({ id, workflow, work, entry, sha256 })),
|
|
414
|
+
template_skills: desiredTemplates,
|
|
415
|
+
};
|
|
416
|
+
const desiredNames = new Set([...desiredWorks.map((work) => work.id), ...desiredTemplates.map((skill) => skill.name)]);
|
|
417
|
+
if (manifest) {
|
|
418
|
+
for (const work of manifest.works) {
|
|
419
|
+
if (!(await workNodeMatches(options.target, work))) {
|
|
420
|
+
blockers.push({ code: "agent-skill-drift", path: `.agents/skills/${work.id}`, message: "managed work skill differs from the recorded projection; preserve the edited file and reconcile it explicitly" });
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
for (const skill of manifest.template_skills) {
|
|
424
|
+
if (!(await templateNodeMatches(options.target, skill))) {
|
|
425
|
+
blockers.push({ code: "agent-skill-drift", path: `.agents/skills/${skill.name}`, message: "managed template link differs from the recorded projection" });
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
for (const name of desiredNames) {
|
|
430
|
+
if (manifest?.works.some((work) => work.id === name) || manifest?.template_skills.some((skill) => skill.name === name))
|
|
431
|
+
continue;
|
|
432
|
+
if (await pathExists(join(options.target, ".agents", "skills", name))) {
|
|
433
|
+
blockers.push({ code: "agent-skill-unmanaged", path: `.agents/skills/${name}`, message: "path exists and is not a Speculo-managed skill" });
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (nextManifest.works.length || nextManifest.template_skills.length || manifest) {
|
|
437
|
+
const parent = await parentBlocker(options.target);
|
|
438
|
+
if (parent)
|
|
439
|
+
blockers.push(parent);
|
|
440
|
+
}
|
|
441
|
+
if (blockers.length)
|
|
442
|
+
return { records: null, blockers };
|
|
443
|
+
const records = [];
|
|
444
|
+
const previousWorks = new Map((manifest?.works ?? []).map((work) => [work.id, work]));
|
|
445
|
+
for (const work of desiredWorks) {
|
|
446
|
+
const before = previousWorks.has(work.id) ? directoryNode(await readFile(join(options.target, ".agents", "skills", work.id, "SKILL.md"), "utf8")) : absent();
|
|
447
|
+
pushChange(records, work.id, before, directoryNode(work.body));
|
|
448
|
+
}
|
|
449
|
+
for (const work of manifest?.works ?? []) {
|
|
450
|
+
if (!desiredNames.has(work.id))
|
|
451
|
+
pushChange(records, work.id, directoryNode(await readFile(join(options.target, ".agents", "skills", work.id, "SKILL.md"), "utf8")), absent());
|
|
452
|
+
}
|
|
453
|
+
const previousTemplates = new Map((manifest?.template_skills ?? []).map((skill) => [skill.name, skill]));
|
|
454
|
+
for (const skill of desiredTemplates) {
|
|
455
|
+
const before = previousTemplates.has(skill.name) ? symlinkNode(skill.link) : absent();
|
|
456
|
+
pushChange(records, skill.name, before, symlinkNode(skill.link));
|
|
457
|
+
}
|
|
458
|
+
for (const skill of manifest?.template_skills ?? []) {
|
|
459
|
+
if (!desiredNames.has(skill.name))
|
|
460
|
+
pushChange(records, skill.name, symlinkNode(skill.link), absent());
|
|
461
|
+
}
|
|
462
|
+
const nextText = nextManifest.works.length || nextManifest.template_skills.length ? manifestText(nextManifest) : null;
|
|
463
|
+
const beforeManifest = manifest && loaded.raw !== null ? fileNode(loaded.raw) : absent();
|
|
464
|
+
const afterManifest = nextText === null ? absent() : fileNode(nextText);
|
|
465
|
+
pushChange(records, MANAGED_MANIFEST, beforeManifest, afterManifest);
|
|
466
|
+
return { records: records.length ? records : null, blockers: [] };
|
|
467
|
+
}
|
|
468
|
+
export async function inspectProjectedSkills(target, installedWorkflows) {
|
|
469
|
+
const loaded = await readManifest(target);
|
|
470
|
+
if (!loaded.manifest && !loaded.blocker && !loaded.raw)
|
|
471
|
+
return [];
|
|
472
|
+
const checks = [];
|
|
473
|
+
if (loaded.blocker || !loaded.manifest) {
|
|
474
|
+
checks.push({ id: "agent-skills", ok: false, message: loaded.blocker?.message ?? "invalid managed skill manifest" });
|
|
475
|
+
return checks;
|
|
476
|
+
}
|
|
477
|
+
const manifest = loaded.manifest;
|
|
478
|
+
const skillsDir = join(target, ".agents", "skills");
|
|
479
|
+
let names = [];
|
|
480
|
+
try {
|
|
481
|
+
names = await readdir(skillsDir);
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
checks.push({ id: "agent-skills", ok: false, message: String(error) });
|
|
485
|
+
return checks;
|
|
486
|
+
}
|
|
487
|
+
for (const name of names) {
|
|
488
|
+
if (name.startsWith(".speculo-skill-"))
|
|
489
|
+
checks.push({ id: "agent-skill-residue:" + name, ok: false, message: "preserve projection residue until recovery finishes" });
|
|
490
|
+
}
|
|
491
|
+
const installed = new Set(installedWorkflows);
|
|
492
|
+
for (const work of manifest.works) {
|
|
493
|
+
const id = "agent-skill:" + work.id;
|
|
494
|
+
if (!SKILL_ID.test(work.id) || work.entry !== `speculo/workflows/${work.workflow}/${work.work}/${work.work}.md`) {
|
|
495
|
+
checks.push({ id, ok: false, message: "work projection record is not a contained entry path" });
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
if (!installed.has(work.workflow)) {
|
|
499
|
+
checks.push({ id, ok: false, message: "projected workflow is not installed" });
|
|
500
|
+
continue;
|
|
501
|
+
}
|
|
502
|
+
const matches = await workNodeMatches(target, work);
|
|
503
|
+
let entryExists = false;
|
|
504
|
+
try {
|
|
505
|
+
await readFile(await containedPath(target, work.entry));
|
|
506
|
+
entryExists = true;
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
entryExists = false;
|
|
510
|
+
}
|
|
511
|
+
checks.push({ id, ok: matches && entryExists, message: matches && entryExists ? "work pointer matches the recorded entry" : "work pointer drifted or its entry is missing" });
|
|
512
|
+
}
|
|
513
|
+
for (const skill of manifest.template_skills) {
|
|
514
|
+
const id = "agent-skill-template:" + skill.name;
|
|
515
|
+
const expected = templateLink(skill.name);
|
|
516
|
+
const matches = SKILL_ID.test(skill.name) && skill.link === expected && await templateNodeMatches(target, skill);
|
|
517
|
+
let targetExists = false;
|
|
518
|
+
try {
|
|
519
|
+
await readFile(join(target, "speculo", "skills", skill.name, "SKILL.md"));
|
|
520
|
+
targetExists = true;
|
|
521
|
+
}
|
|
522
|
+
catch {
|
|
523
|
+
targetExists = false;
|
|
524
|
+
}
|
|
525
|
+
checks.push({ id, ok: matches && targetExists, message: matches && targetExists ? "template link matches the installed skill" : "template link drifted or its target is missing" });
|
|
526
|
+
}
|
|
527
|
+
checks.push({ id: "agent-skills", ok: checks.every((check) => check.ok), message: checks.every((check) => check.ok) ? `verified ${manifest.works.length} work pointers and ${manifest.template_skills.length} template links; host invocation was not probed` : "projected skills drifted" });
|
|
528
|
+
return checks;
|
|
529
|
+
}
|
|
530
|
+
//# sourceMappingURL=agent-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-skills.js","sourceRoot":"","sources":["../../src/agent-skills.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { dirname, resolve } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { initSpeculo } from "./index.js";
|
|
5
|
+
import { parseAgentSkillSpec } from "./agent-skills.js";
|
|
6
|
+
import { discoverWorkflowCatalog, isInteractive as catalogIsInteractive } from "./workflows.js";
|
|
5
7
|
import { RefreshBlockedError } from "./refresh.js";
|
|
6
8
|
import { checkForUpdate, formatVersionBanner } from "./version.js";
|
|
7
9
|
import { doctorSpeculo } from "./doctor.js";
|
|
@@ -17,10 +19,11 @@ function usage() {
|
|
|
17
19
|
" speculo doctor [target] [--json]",
|
|
18
20
|
" speculo recover [target] --transaction <id>",
|
|
19
21
|
" speculo resolve [target] --path <reference>",
|
|
20
|
-
" speculo init [target] [--workflows <id,id> | --core-only]",
|
|
22
|
+
" speculo init [target] [--workflows <id,id> | --core-only] [--agent-skills <spec>]",
|
|
21
23
|
"",
|
|
22
24
|
"Commands:",
|
|
23
25
|
" init Install or directly refresh Speculo assets and selected workflow packages.",
|
|
26
|
+
" --agent-skills none|keep|template|template:<id>+<id>|<workflow> writes .agents/skills only.",
|
|
24
27
|
" version Print the current Speculo version and check for updates.",
|
|
25
28
|
" doctor Validate installation integrity and report recovery evidence (read-only).",
|
|
26
29
|
" recover Explicitly roll back an interrupted transaction, or finish committed cleanup.",
|
|
@@ -115,20 +118,22 @@ async function main(argv) {
|
|
|
115
118
|
console.log(await resolvePathReference(args.target, value));
|
|
116
119
|
return 0;
|
|
117
120
|
}
|
|
118
|
-
const args = parseArguments(command === "init" ? rest : argv, new Set(["--core-only"]), new Set(["--workflows"]));
|
|
121
|
+
const args = parseArguments(command === "init" ? rest : argv, new Set(["--core-only"]), new Set(["--workflows", "--agent-skills"]));
|
|
119
122
|
if (args.flags.has("--core-only") && args.values.has("--workflows"))
|
|
120
123
|
throw new Error("--core-only and --workflows are mutually exclusive");
|
|
121
124
|
const requested = args.values.get("--workflows");
|
|
122
125
|
if (requested !== undefined && !/^[a-z0-9-]+(?:,[a-z0-9-]+)*$/.test(requested))
|
|
123
126
|
throw new Error("--workflows requires comma-separated workflow ids");
|
|
124
127
|
const selection = args.flags.has("--core-only") ? { workflowIds: [] } : requested === undefined ? undefined : { workflowIds: requested.split(",") };
|
|
128
|
+
const requestedSkills = args.values.get("--agent-skills");
|
|
129
|
+
const agentSkills = requestedSkills === undefined ? undefined : parseAgentSkillSpec(requestedSkills, new Set((await discoverWorkflowCatalog(packageRoot)).keys()));
|
|
125
130
|
const targetArg = args.target;
|
|
126
131
|
await showVersionWithCheck(packageRoot, packageName);
|
|
127
132
|
if (!(await confirmContinue())) {
|
|
128
133
|
console.log("已取消。");
|
|
129
134
|
return 0;
|
|
130
135
|
}
|
|
131
|
-
const result = await initSpeculo(targetArg, { packageRoot, selection });
|
|
136
|
+
const result = await initSpeculo(targetArg, { packageRoot, selection, agentSkills, promptAgentSkills: catalogIsInteractive() && agentSkills === undefined });
|
|
132
137
|
console.log(result.mode === "init" ? "Speculo initialized in " + result.target : "Speculo refreshed in " + result.target);
|
|
133
138
|
console.log(" replaced " + result.refresh.managedFiles + " managed files");
|
|
134
139
|
console.log(" preserved " + result.refresh.preservedFiles + " runtime files");
|
|
@@ -137,6 +142,9 @@ async function main(argv) {
|
|
|
137
142
|
result.refresh.config.removed + " removed");
|
|
138
143
|
if (result.refresh.structuredUpgrades > 0)
|
|
139
144
|
console.log(" reconciled " + result.refresh.structuredUpgrades + " structured state files");
|
|
145
|
+
if (result.agentSkills.works || result.agentSkills.template) {
|
|
146
|
+
console.log(" agent skills: " + result.agentSkills.works + " work pointers, " + result.agentSkills.template + " template links");
|
|
147
|
+
}
|
|
140
148
|
if (result.refresh.backupPath)
|
|
141
149
|
console.log(" retained targeted backup " + result.refresh.backupPath);
|
|
142
150
|
for (const asset of result.assets.filter((asset) => asset.startsWith(".gitignore") || asset.startsWith("AGENTS") || asset.startsWith("CLAUDE"))) {
|