@shendu-sdt/sdt-dev-agent 0.1.3-beta.9 → 0.1.3
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 +80 -21
- package/dist/catalog/index.d.ts +4 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +4 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/mcp.d.ts +12 -0
- package/dist/catalog/mcp.d.ts.map +1 -0
- package/dist/catalog/mcp.js +37 -0
- package/dist/catalog/mcp.js.map +1 -0
- package/dist/catalog/shared.d.ts +5 -0
- package/dist/catalog/shared.d.ts.map +1 -0
- package/dist/catalog/shared.js +8 -0
- package/dist/catalog/shared.js.map +1 -0
- package/dist/catalog/skills.d.ts +14 -0
- package/dist/catalog/skills.d.ts.map +1 -0
- package/dist/catalog/skills.js +55 -0
- package/dist/catalog/skills.js.map +1 -0
- package/dist/catalog/workflows.d.ts +8 -0
- package/dist/catalog/workflows.d.ts.map +1 -0
- package/dist/catalog/workflows.js +24 -0
- package/dist/catalog/workflows.js.map +1 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +158 -125
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +56 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +1 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/core/bootstrap-entry.d.ts +5 -0
- package/dist/core/bootstrap-entry.d.ts.map +1 -0
- package/dist/core/bootstrap-entry.js +9 -0
- package/dist/core/bootstrap-entry.js.map +1 -0
- package/dist/core/capability-discovery.js +1 -1
- package/dist/core/capability-discovery.js.map +1 -1
- package/dist/core/hook-config.d.ts +19 -0
- package/dist/core/hook-config.d.ts.map +1 -0
- package/dist/core/hook-config.js +162 -0
- package/dist/core/hook-config.js.map +1 -0
- package/dist/core/init-options.d.ts.map +1 -1
- package/dist/core/init-options.js +7 -5
- package/dist/core/init-options.js.map +1 -1
- package/dist/core/init-plan.d.ts +1 -1
- package/dist/core/init-plan.d.ts.map +1 -1
- package/dist/core/init-plan.js +98 -32
- package/dist/core/init-plan.js.map +1 -1
- package/dist/core/init-writer.d.ts.map +1 -1
- package/dist/core/init-writer.js +109 -4
- package/dist/core/init-writer.js.map +1 -1
- package/dist/core/manifest.d.ts.map +1 -1
- package/dist/core/manifest.js +4 -2
- package/dist/core/manifest.js.map +1 -1
- package/dist/core/mcp-config.d.ts +3 -2
- package/dist/core/mcp-config.d.ts.map +1 -1
- package/dist/core/mcp-config.js +69 -27
- package/dist/core/mcp-config.js.map +1 -1
- package/dist/core/project-inspector.d.ts.map +1 -1
- package/dist/core/project-inspector.js +2 -1
- package/dist/core/project-inspector.js.map +1 -1
- package/dist/core/tool-profile.d.ts +41 -0
- package/dist/core/tool-profile.d.ts.map +1 -0
- package/dist/core/tool-profile.js +122 -0
- package/dist/core/tool-profile.js.map +1 -0
- package/dist/core/workflow-installer.d.ts.map +1 -1
- package/dist/core/workflow-installer.js +2 -1
- package/dist/core/workflow-installer.js.map +1 -1
- package/dist/types.d.ts +19 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/init-welcome.d.ts +1 -0
- package/dist/utils/init-welcome.d.ts.map +1 -1
- package/dist/utils/init-welcome.js +33 -9
- package/dist/utils/init-welcome.js.map +1 -1
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +11 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/progress-spinner.d.ts +22 -0
- package/dist/utils/progress-spinner.d.ts.map +1 -0
- package/dist/utils/progress-spinner.js +74 -0
- package/dist/utils/progress-spinner.js.map +1 -0
- package/package.json +3 -6
- package/templates/bootstrap/project-entry.md +16 -5
- package/templates/hooks/claude-code/bootstrap-project-docs-context.mjs +38 -0
- package/templates/hooks/claude-code/settings.json +36 -0
- package/templates/hooks/codex/bootstrap-project-docs-context.mjs +38 -0
- package/templates/hooks/codex/config.toml +16 -0
- package/templates/rules/claude-code/CLAUDE.md +17 -0
- package/templates/rules/codex/AGENTS.md +17 -0
- package/templates/skills/builtin/bootstrap-project-docs/SKILL.md +25 -11
- package/templates/skills/builtin/bootstrap-project-docs/agents/openai.yaml +4 -0
- package/templates/skills/builtin/bootstrap-project-docs/references/architecture-first.md +16 -4
- package/templates/skills/builtin/bootstrap-project-docs/references/doc-state-routing.md +28 -0
- package/templates/skills/builtin/bootstrap-project-docs/references/tool-rules-follow-up.md +19 -4
- package/dist/catalog.d.ts +0 -16
- package/dist/catalog.d.ts.map +0 -1
- package/dist/catalog.js +0 -98
- package/dist/catalog.js.map +0 -1
package/dist/types.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export declare const INSTALL_MODES: readonly ["recommended", "custom"];
|
|
|
5
5
|
export declare const SKILL_SOURCE_TYPES: readonly ["builtin-local", "remote-recommended"];
|
|
6
6
|
export declare const MCP_SOURCE_TYPES: readonly ["project-template"];
|
|
7
7
|
export declare const WORKFLOW_SOURCE_TYPES: readonly ["workflow-integration"];
|
|
8
|
+
export declare const ENTRY_INSTALL_STATUSES: readonly ["installed", "manual-merge-required"];
|
|
9
|
+
export declare const HOOK_INSTALL_STATUSES: readonly ["installed", "degraded", "not-applicable"];
|
|
8
10
|
/** 选择态与安装状态。 */
|
|
9
11
|
export declare const CAPABILITY_SELECTIONS: readonly ["required", "default", "optional"];
|
|
10
12
|
export declare const CAPABILITY_STATUSES: readonly ["installed", "already-present", "failed"];
|
|
@@ -14,6 +16,8 @@ export type InstallMode = (typeof INSTALL_MODES)[number];
|
|
|
14
16
|
export type SkillSourceType = (typeof SKILL_SOURCE_TYPES)[number];
|
|
15
17
|
export type McpSourceType = (typeof MCP_SOURCE_TYPES)[number];
|
|
16
18
|
export type WorkflowSourceType = (typeof WORKFLOW_SOURCE_TYPES)[number];
|
|
19
|
+
export type EntryInstallStatus = (typeof ENTRY_INSTALL_STATUSES)[number];
|
|
20
|
+
export type HookInstallStatus = (typeof HOOK_INSTALL_STATUSES)[number];
|
|
17
21
|
export type CapabilitySelection = (typeof CAPABILITY_SELECTIONS)[number];
|
|
18
22
|
export type CapabilityStatus = (typeof CAPABILITY_STATUSES)[number];
|
|
19
23
|
export type SkipReason = (typeof SKIP_REASONS)[number];
|
|
@@ -78,7 +82,7 @@ export interface ProjectFacts {
|
|
|
78
82
|
export interface PlannedFile {
|
|
79
83
|
path: string;
|
|
80
84
|
content: string;
|
|
81
|
-
kind: 'bootstrap' | 'workflow' | 'mcp' | 'manifest';
|
|
85
|
+
kind: 'bootstrap' | 'rule' | 'hook' | 'workflow' | 'mcp' | 'manifest';
|
|
82
86
|
}
|
|
83
87
|
export interface InitPlan {
|
|
84
88
|
files: PlannedFile[];
|
|
@@ -128,6 +132,8 @@ export interface InstallManifest {
|
|
|
128
132
|
installMode: InstallMode;
|
|
129
133
|
tools: ToolId[];
|
|
130
134
|
bootstrapSkillId: SkillId;
|
|
135
|
+
bootstrapEntries: ManifestBootstrapEntryRecord[];
|
|
136
|
+
hooks: ManifestHookRecord[];
|
|
131
137
|
skills: ManifestSkillRecord[];
|
|
132
138
|
mcps: ManifestMcpRecord[];
|
|
133
139
|
workflows: ManifestWorkflowRecord[];
|
|
@@ -143,4 +149,16 @@ export interface InstallManifest {
|
|
|
143
149
|
kind: PlannedFile['kind'];
|
|
144
150
|
}>;
|
|
145
151
|
}
|
|
152
|
+
export interface ManifestBootstrapEntryRecord {
|
|
153
|
+
tool: ToolId;
|
|
154
|
+
path: string;
|
|
155
|
+
status: EntryInstallStatus;
|
|
156
|
+
}
|
|
157
|
+
export interface ManifestHookRecord {
|
|
158
|
+
tool: ToolId;
|
|
159
|
+
path: string;
|
|
160
|
+
scriptPath: string;
|
|
161
|
+
status: HookInstallStatus;
|
|
162
|
+
reason?: string;
|
|
163
|
+
}
|
|
146
164
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,eAAO,MAAM,eAAe,mCAAoC,CAAA;AAChE,eAAO,MAAM,aAAa,oCAAqC,CAAA;AAE/D,uBAAuB;AACvB,eAAO,MAAM,kBAAkB,kDAAmD,CAAA;AAClF,eAAO,MAAM,gBAAgB,+BAAgC,CAAA;AAC7D,eAAO,MAAM,qBAAqB,mCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -5,6 +5,8 @@ export const INSTALL_MODES = ['recommended', 'custom'];
|
|
|
5
5
|
export const SKILL_SOURCE_TYPES = ['builtin-local', 'remote-recommended'];
|
|
6
6
|
export const MCP_SOURCE_TYPES = ['project-template'];
|
|
7
7
|
export const WORKFLOW_SOURCE_TYPES = ['workflow-integration'];
|
|
8
|
+
export const ENTRY_INSTALL_STATUSES = ['installed', 'manual-merge-required'];
|
|
9
|
+
export const HOOK_INSTALL_STATUSES = ['installed', 'degraded', 'not-applicable'];
|
|
8
10
|
/** 选择态与安装状态。 */
|
|
9
11
|
export const CAPABILITY_SELECTIONS = ['required', 'default', 'optional'];
|
|
10
12
|
export const CAPABILITY_STATUSES = ['installed', 'already-present', 'failed'];
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,aAAa,CAAU,CAAA;AAChE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAU,CAAA;AAE/D,uBAAuB;AACvB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,eAAe,EAAE,oBAAoB,CAAU,CAAA;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,CAAU,CAAA;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,sBAAsB,CAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,aAAa,CAAU,CAAA;AAChE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAU,CAAA;AAE/D,uBAAuB;AACvB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,eAAe,EAAE,oBAAoB,CAAU,CAAA;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,CAAU,CAAA;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,sBAAsB,CAAU,CAAA;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,WAAW,EAAE,uBAAuB,CAAU,CAAA;AACrF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,gBAAgB,CAAU,CAAA;AAEzF,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAU,CAAA;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,iBAAiB,EAAE,QAAQ,CAAU,CAAA;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,iBAAiB,EAAE,gBAAgB,CAAU,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare function buildInitWelcomeLines(): string[];
|
|
2
2
|
export declare function buildInitWelcomeLogoLines(): string[];
|
|
3
3
|
export declare function formatInitWelcome(): string;
|
|
4
|
+
export declare function canAnimateInitWelcomeForColumns(columns: number): boolean;
|
|
4
5
|
export declare function showInitWelcome(): Promise<void>;
|
|
5
6
|
//# sourceMappingURL=init-welcome.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-welcome.d.ts","sourceRoot":"","sources":["../../src/utils/init-welcome.ts"],"names":[],"mappings":"AAiIA,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"init-welcome.d.ts","sourceRoot":"","sources":["../../src/utils/init-welcome.ts"],"names":[],"mappings":"AAiIA,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAqBhD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAEpD;AAmDD,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AA2BD,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOxE;AAkDD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DrD"}
|
|
@@ -123,14 +123,17 @@ export function buildInitWelcomeLines() {
|
|
|
123
123
|
'Bootstrap project-level AI collaboration into an existing repo',
|
|
124
124
|
'',
|
|
125
125
|
'This setup will install:',
|
|
126
|
-
' -
|
|
127
|
-
' - Project-level
|
|
126
|
+
' - Root bootstrap entry docs for Codex / Claude Code',
|
|
127
|
+
' - Project-level hooks as bootstrap enhancement where supported',
|
|
128
|
+
' - A required bootstrap skill that refreshes ARCHITECTURE.md and tool rules',
|
|
128
129
|
' - Recommended or custom skills / MCP selections',
|
|
129
130
|
' - .sdt-devagent/manifest.json as the install record',
|
|
130
131
|
'',
|
|
131
132
|
'Quick start after setup:',
|
|
132
|
-
' -
|
|
133
|
-
' -
|
|
133
|
+
' - Root entry docs should point the first AI turn to bootstrap-project-docs',
|
|
134
|
+
' - bootstrap-project-docs should create or refresh ARCHITECTURE.md first',
|
|
135
|
+
' - Then refresh AGENTS.md or CLAUDE.md from ARCHITECTURE.md',
|
|
136
|
+
' - Hooks are only an enhancement layer, not the only bootstrap entry',
|
|
134
137
|
' - Re-run init with --skills or --mcp if you need a different setup',
|
|
135
138
|
'',
|
|
136
139
|
'Press Enter to configure this project...',
|
|
@@ -183,14 +186,35 @@ export function formatInitWelcome() {
|
|
|
183
186
|
const logoLines = padLogoLines(buildInitWelcomeLogoLines(), textLines.length);
|
|
184
187
|
return `\n${renderFrame(logoLines, textLines, useColor)}\n\n`;
|
|
185
188
|
}
|
|
186
|
-
function
|
|
187
|
-
|
|
188
|
-
|
|
189
|
+
function getRenderedLineWidth(logoLine, textLine) {
|
|
190
|
+
return logoLine.padEnd(LOGO_COLUMN_WIDTH).length + textLine.length;
|
|
191
|
+
}
|
|
192
|
+
function getInitWelcomeFrameMetrics(columns) {
|
|
193
|
+
const textLines = buildInitWelcomeLines();
|
|
194
|
+
const logoLines = padLogoLines(buildInitWelcomeLogoLines(), textLines.length);
|
|
195
|
+
const lineCount = Math.max(logoLines.length, textLines.length);
|
|
196
|
+
let visualHeight = 0;
|
|
197
|
+
for (let index = 0; index < lineCount; index += 1) {
|
|
198
|
+
const logoLine = logoLines[index] ?? '';
|
|
199
|
+
const textLine = textLines[index] ?? '';
|
|
200
|
+
visualHeight += Math.max(1, Math.ceil(getRenderedLineWidth(logoLine, textLine) / columns));
|
|
189
201
|
}
|
|
190
|
-
|
|
202
|
+
return {
|
|
203
|
+
logicalHeight: lineCount + 1,
|
|
204
|
+
visualHeight,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
export function canAnimateInitWelcomeForColumns(columns) {
|
|
208
|
+
if (columns < MIN_WIDTH) {
|
|
191
209
|
return false;
|
|
192
210
|
}
|
|
193
|
-
|
|
211
|
+
const { logicalHeight, visualHeight } = getInitWelcomeFrameMetrics(columns);
|
|
212
|
+
return visualHeight <= logicalHeight;
|
|
213
|
+
}
|
|
214
|
+
function canAnimate() {
|
|
215
|
+
// Temporarily disable the looping welcome animation because some terminals
|
|
216
|
+
// do not preserve the redraw cursor position reliably for this layout.
|
|
217
|
+
return false;
|
|
194
218
|
}
|
|
195
219
|
function waitForEnter() {
|
|
196
220
|
return new Promise((resolve) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-welcome.js","sourceRoot":"","sources":["../../src/utils/init-welcome.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE7E,MAAM,SAAS,GAAG,EAAE,CAAA;AACpB,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAC5B,MAAM,qBAAqB,GAAG,GAAG,CAAA;AAEjC,MAAM,eAAe,GACnB,OAAO,CAAC,QAAQ,KAAK,OAAO;IAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;AAEnC,MAAM,KAAK,GAAG,eAAe;IAC3B,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IACxC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;AACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;AACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;AAErB,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,MAAM,sBAAsB,GAAG;IAC7B,QAAQ,EAAE,qBAAqB;IAC/B,MAAM,EAAE;QACN;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,aAAa,CAAC;YACvB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;KACF;CACO,CAAA;AAEV,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,yBAAyB;QACzB,gEAAgE;QAChE,EAAE;QACF,0BAA0B;QAC1B,
|
|
1
|
+
{"version":3,"file":"init-welcome.js","sourceRoot":"","sources":["../../src/utils/init-welcome.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE7E,MAAM,SAAS,GAAG,EAAE,CAAA;AACpB,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAC5B,MAAM,qBAAqB,GAAG,GAAG,CAAA;AAEjC,MAAM,eAAe,GACnB,OAAO,CAAC,QAAQ,KAAK,OAAO;IAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;AAEnC,MAAM,KAAK,GAAG,eAAe;IAC3B,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IACxC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;AACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;AACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;AAErB,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,MAAM,sBAAsB,GAAG;IAC7B,QAAQ,EAAE,qBAAqB;IAC/B,MAAM,EAAE;QACN;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,aAAa,CAAC;YACvB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,CAOnE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** 为仓库内 JSON 解析提供统一、可读的错误信息。 */
|
|
2
|
+
export function parseJsonText(raw, sourcePath) {
|
|
3
|
+
try {
|
|
4
|
+
return JSON.parse(raw);
|
|
5
|
+
}
|
|
6
|
+
catch (error) {
|
|
7
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
8
|
+
throw new Error(`Invalid JSON in ${sourcePath}: ${detail}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,UAAU,aAAa,CAAI,GAAW,EAAE,UAAkB;IAC9D,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAA;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrE,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,KAAK,MAAM,EAAE,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface SpinnerStream {
|
|
2
|
+
isTTY?: boolean;
|
|
3
|
+
write(text: string): boolean;
|
|
4
|
+
}
|
|
5
|
+
/** 为长耗时 CLI 步骤提供最小单行 spinner,非 TTY 下自动降级成普通日志。 */
|
|
6
|
+
export declare class ProgressSpinner {
|
|
7
|
+
private readonly stream;
|
|
8
|
+
private readonly useColor;
|
|
9
|
+
private readonly interactive;
|
|
10
|
+
private timer;
|
|
11
|
+
private frameIndex;
|
|
12
|
+
constructor(stream?: SpinnerStream);
|
|
13
|
+
start(text: string): void;
|
|
14
|
+
succeed(text: string): void;
|
|
15
|
+
fail(text: string): void;
|
|
16
|
+
stop(): void;
|
|
17
|
+
private finish;
|
|
18
|
+
private render;
|
|
19
|
+
private stopTimer;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=progress-spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-spinner.d.ts","sourceRoot":"","sources":["../../src/utils/progress-spinner.ts"],"names":[],"mappings":"AAaA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC7B;AAWD,kDAAkD;AAClD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,UAAU,CAAI;gBAEV,MAAM,GAAE,aAA8B;IAMlD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAezB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxB,IAAI,IAAI,IAAI;IASZ,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,SAAS;CAMlB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { supportsTerminalColor, withTerminalTone } from './terminal-theme.js';
|
|
2
|
+
const SPINNER_INTERVAL_MS = 80;
|
|
3
|
+
const supportsUnicode = process.platform !== 'win32' ||
|
|
4
|
+
Boolean(process.env.WT_SESSION) ||
|
|
5
|
+
Boolean(process.env.TERM_PROGRAM);
|
|
6
|
+
const SPINNER_FRAMES = supportsUnicode
|
|
7
|
+
? ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
|
|
8
|
+
: ['-', '\\', '|', '/'];
|
|
9
|
+
function clearSpinnerLine(stream) {
|
|
10
|
+
stream.write('\r\u001B[2K');
|
|
11
|
+
}
|
|
12
|
+
function formatSpinnerLine(frame, text, useColor) {
|
|
13
|
+
const prefix = withTerminalTone(frame, 'success', useColor);
|
|
14
|
+
return `${prefix} ${text}`;
|
|
15
|
+
}
|
|
16
|
+
/** 为长耗时 CLI 步骤提供最小单行 spinner,非 TTY 下自动降级成普通日志。 */
|
|
17
|
+
export class ProgressSpinner {
|
|
18
|
+
stream;
|
|
19
|
+
useColor;
|
|
20
|
+
interactive;
|
|
21
|
+
timer = null;
|
|
22
|
+
frameIndex = 0;
|
|
23
|
+
constructor(stream = process.stdout) {
|
|
24
|
+
this.stream = stream;
|
|
25
|
+
this.interactive = Boolean(stream.isTTY);
|
|
26
|
+
this.useColor = supportsTerminalColor();
|
|
27
|
+
}
|
|
28
|
+
start(text) {
|
|
29
|
+
if (!this.interactive) {
|
|
30
|
+
console.log(text);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.stopTimer();
|
|
34
|
+
this.frameIndex = 0;
|
|
35
|
+
this.render(text);
|
|
36
|
+
this.timer = setInterval(() => {
|
|
37
|
+
this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES.length;
|
|
38
|
+
this.render(text);
|
|
39
|
+
}, SPINNER_INTERVAL_MS);
|
|
40
|
+
}
|
|
41
|
+
succeed(text) {
|
|
42
|
+
this.finish(withTerminalTone(text, 'success', this.useColor));
|
|
43
|
+
}
|
|
44
|
+
fail(text) {
|
|
45
|
+
this.finish(withTerminalTone(text, 'failure', this.useColor));
|
|
46
|
+
}
|
|
47
|
+
stop() {
|
|
48
|
+
if (!this.interactive) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.stopTimer();
|
|
52
|
+
clearSpinnerLine(this.stream);
|
|
53
|
+
}
|
|
54
|
+
finish(text) {
|
|
55
|
+
if (!this.interactive) {
|
|
56
|
+
console.log(text);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.stopTimer();
|
|
60
|
+
clearSpinnerLine(this.stream);
|
|
61
|
+
this.stream.write(`${text}\n`);
|
|
62
|
+
}
|
|
63
|
+
render(text) {
|
|
64
|
+
clearSpinnerLine(this.stream);
|
|
65
|
+
this.stream.write(formatSpinnerLine(SPINNER_FRAMES[this.frameIndex] ?? '-', text, this.useColor));
|
|
66
|
+
}
|
|
67
|
+
stopTimer() {
|
|
68
|
+
if (this.timer) {
|
|
69
|
+
clearInterval(this.timer);
|
|
70
|
+
this.timer = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=progress-spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-spinner.js","sourceRoot":"","sources":["../../src/utils/progress-spinner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shendu-sdt/sdt-dev-agent",
|
|
3
|
-
"version": "0.1.3
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Project-level AI collaboration bootstrapper for engineering teams",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"lint": "eslint .",
|
|
14
14
|
"test": "vitest run --no-api",
|
|
15
15
|
"test:watch": "vitest --no-api",
|
|
16
|
-
"verify": "pnpm run lint && pnpm run test && pnpm run build",
|
|
16
|
+
"verify": "pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build",
|
|
17
17
|
"prepare": "husky",
|
|
18
18
|
"release": "node scripts/release.js",
|
|
19
19
|
"release:patch": "node scripts/release.js patch",
|
|
@@ -50,17 +50,14 @@
|
|
|
50
50
|
"@commitlint/cli": "^19.8.1",
|
|
51
51
|
"@commitlint/config-conventional": "^19.8.1",
|
|
52
52
|
"@eslint/js": "^9.39.2",
|
|
53
|
-
"@shendu-sdt/sdt-dev-agent": "file:/Users/admin/Desktop/works/SDT-DevAgent",
|
|
54
53
|
"@types/node": "^24.2.0",
|
|
55
54
|
"eslint": "^9.39.2",
|
|
56
55
|
"husky": "^9.1.7",
|
|
57
56
|
"lint-staged": "^16.4.0",
|
|
58
57
|
"prettier": "^3.4.2",
|
|
59
|
-
"sdt-dev-agent": "file:/Users/admin/Desktop/works/SDT-DevAgent",
|
|
60
58
|
"tsx": "^4.20.3",
|
|
61
59
|
"typescript": "^5.9.3",
|
|
62
60
|
"typescript-eslint": "^8.50.1",
|
|
63
61
|
"vitest": "^3.2.4"
|
|
64
|
-
}
|
|
65
|
-
"packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800"
|
|
62
|
+
}
|
|
66
63
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SDT DevAgent Bootstrap
|
|
1
|
+
# SDT DevAgent Bootstrap Guide
|
|
2
2
|
|
|
3
3
|
这个项目已经完成 `sdt-dev-agent init`。
|
|
4
4
|
|
|
@@ -10,8 +10,19 @@
|
|
|
10
10
|
- 源码目录:`{{sourceRoot}}`
|
|
11
11
|
- 测试目录:`{{testRoot}}`
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
这个文件是辅助说明,不是工具自动发现的主入口。
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
当前三层 bootstrap 模型:
|
|
16
|
+
|
|
17
|
+
1. 前置入口:根目录规则文档 `AGENTS.md` / `CLAUDE.md`
|
|
18
|
+
2. 增强层:工具 hooks 配置
|
|
19
|
+
3. 执行层:`bootstrap-project-docs` skill
|
|
20
|
+
|
|
21
|
+
首次 AI 协作默认顺序:
|
|
22
|
+
|
|
23
|
+
1. 先触发已安装的 `bootstrap-project-docs` skill。
|
|
24
|
+
2. 先读取项目真实结构,并创建或刷新根目录 `ARCHITECTURE.md`。
|
|
25
|
+
3. 再基于 `ARCHITECTURE.md` 创建或刷新对应工具规则文档:`AGENTS.md` / `CLAUDE.md`。
|
|
26
|
+
4. hooks 只负责增强 bootstrap 优先级,不替代根级入口文档。
|
|
27
|
+
5. 对源码里无法确认的信息,明确标记为“待确认”,不要补写成事实。
|
|
28
|
+
6. 在这两份文档补齐前,默认不要直接开始大段业务实现,除非用户明确要求跳过。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* global process */
|
|
2
|
+
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
4
|
+
import path from 'node:path'
|
|
5
|
+
import { fileURLToPath } from 'node:url'
|
|
6
|
+
|
|
7
|
+
const [, , toolId = 'claude-code', toolRulesDoc = 'CLAUDE.md'] = process.argv
|
|
8
|
+
|
|
9
|
+
const scriptPath = fileURLToPath(import.meta.url)
|
|
10
|
+
// hooks 可能从仓库任意子目录触发,不能把 `cwd` 当成项目根目录。
|
|
11
|
+
const projectRoot = path.resolve(path.dirname(scriptPath), '..', '..')
|
|
12
|
+
const architecturePath = path.join(projectRoot, 'ARCHITECTURE.md')
|
|
13
|
+
const toolRulesPath = path.join(projectRoot, toolRulesDoc)
|
|
14
|
+
const architectureExists = existsSync(architecturePath)
|
|
15
|
+
const toolRulesExists = existsSync(toolRulesPath)
|
|
16
|
+
const toolRulesContent = toolRulesExists ? readFileSync(toolRulesPath, 'utf8') : ''
|
|
17
|
+
const toolRulesStillBootstrapEntry = toolRulesContent.includes('SDT-DEVAGENT:BOOTSTRAP-ENTRY')
|
|
18
|
+
|
|
19
|
+
if (architectureExists && toolRulesExists && !toolRulesStillBootstrapEntry) {
|
|
20
|
+
process.exit(0)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const missingDocs = [
|
|
24
|
+
architectureExists ? null : 'ARCHITECTURE.md',
|
|
25
|
+
toolRulesExists && !toolRulesStillBootstrapEntry ? null : toolRulesDoc,
|
|
26
|
+
].filter(Boolean)
|
|
27
|
+
|
|
28
|
+
process.stdout.write(
|
|
29
|
+
[
|
|
30
|
+
`SDT DevAgent bootstrap check for ${toolId}:`,
|
|
31
|
+
'- This repo still needs the bootstrap doc baseline before broader implementation.',
|
|
32
|
+
'- Explicitly run the `bootstrap-project-docs` skill first.',
|
|
33
|
+
'- The required order is: real code -> ARCHITECTURE.md -> tool rules doc.',
|
|
34
|
+
missingDocs.length > 0
|
|
35
|
+
? `- Missing or still-bootstrap docs: ${missingDocs.join(', ')}`
|
|
36
|
+
: '- Refresh the tool rules doc from the latest ARCHITECTURE.md.',
|
|
37
|
+
].join('\n'),
|
|
38
|
+
)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"SessionStart": [
|
|
4
|
+
{
|
|
5
|
+
"hooks": [
|
|
6
|
+
{
|
|
7
|
+
"type": "command",
|
|
8
|
+
"command": "node",
|
|
9
|
+
"args": [
|
|
10
|
+
"${CLAUDE_PROJECT_DIR}/.claude/hooks/bootstrap-project-docs-context.mjs",
|
|
11
|
+
"claude-code",
|
|
12
|
+
"CLAUDE.md"
|
|
13
|
+
],
|
|
14
|
+
"statusMessage": "Checking bootstrap docs"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"UserPromptSubmit": [
|
|
20
|
+
{
|
|
21
|
+
"hooks": [
|
|
22
|
+
{
|
|
23
|
+
"type": "command",
|
|
24
|
+
"command": "node",
|
|
25
|
+
"args": [
|
|
26
|
+
"${CLAUDE_PROJECT_DIR}/.claude/hooks/bootstrap-project-docs-context.mjs",
|
|
27
|
+
"claude-code",
|
|
28
|
+
"CLAUDE.md"
|
|
29
|
+
],
|
|
30
|
+
"statusMessage": "Checking bootstrap docs"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* global process */
|
|
2
|
+
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
4
|
+
import path from 'node:path'
|
|
5
|
+
import { fileURLToPath } from 'node:url'
|
|
6
|
+
|
|
7
|
+
const [, , toolId = 'codex', toolRulesDoc = 'AGENTS.md'] = process.argv
|
|
8
|
+
|
|
9
|
+
const scriptPath = fileURLToPath(import.meta.url)
|
|
10
|
+
// hooks 可能从仓库任意子目录触发,不能把 `cwd` 当成项目根目录。
|
|
11
|
+
const projectRoot = path.resolve(path.dirname(scriptPath), '..', '..')
|
|
12
|
+
const architecturePath = path.join(projectRoot, 'ARCHITECTURE.md')
|
|
13
|
+
const toolRulesPath = path.join(projectRoot, toolRulesDoc)
|
|
14
|
+
const architectureExists = existsSync(architecturePath)
|
|
15
|
+
const toolRulesExists = existsSync(toolRulesPath)
|
|
16
|
+
const toolRulesContent = toolRulesExists ? readFileSync(toolRulesPath, 'utf8') : ''
|
|
17
|
+
const toolRulesStillBootstrapEntry = toolRulesContent.includes('SDT-DEVAGENT:BOOTSTRAP-ENTRY')
|
|
18
|
+
|
|
19
|
+
if (architectureExists && toolRulesExists && !toolRulesStillBootstrapEntry) {
|
|
20
|
+
process.exit(0)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const missingDocs = [
|
|
24
|
+
architectureExists ? null : 'ARCHITECTURE.md',
|
|
25
|
+
toolRulesExists && !toolRulesStillBootstrapEntry ? null : toolRulesDoc,
|
|
26
|
+
].filter(Boolean)
|
|
27
|
+
|
|
28
|
+
process.stdout.write(
|
|
29
|
+
[
|
|
30
|
+
`SDT DevAgent bootstrap check for ${toolId}:`,
|
|
31
|
+
'- This repo still needs the bootstrap doc baseline before broader implementation.',
|
|
32
|
+
'- Explicitly run the `bootstrap-project-docs` skill first.',
|
|
33
|
+
'- The required order is: real code -> ARCHITECTURE.md -> tool rules doc.',
|
|
34
|
+
missingDocs.length > 0
|
|
35
|
+
? `- Missing or still-bootstrap docs: ${missingDocs.join(', ')}`
|
|
36
|
+
: '- Refresh the tool rules doc from the latest ARCHITECTURE.md.',
|
|
37
|
+
].join('\n'),
|
|
38
|
+
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# SDT DevAgent managed hooks: begin
|
|
2
|
+
[[hooks.SessionStart]]
|
|
3
|
+
matcher = "startup|resume|clear"
|
|
4
|
+
|
|
5
|
+
[[hooks.SessionStart.hooks]]
|
|
6
|
+
type = "command"
|
|
7
|
+
command = "node -e \"const { existsSync } = require('node:fs'); const path = require('node:path'); const { spawnSync } = require('node:child_process'); let dir = process.cwd(); const root = path.parse(dir).root; while (true) { const scriptPath = path.join(dir, '.codex', 'hooks', 'bootstrap-project-docs-context.mjs'); if (existsSync(scriptPath)) { const result = spawnSync(process.execPath, [scriptPath, 'codex', 'AGENTS.md'], { stdio: 'inherit' }); process.exit(result.status ?? 0); } if (dir === root) { process.exit(0); } dir = path.dirname(dir); }\""
|
|
8
|
+
statusMessage = "Checking bootstrap docs"
|
|
9
|
+
|
|
10
|
+
[[hooks.UserPromptSubmit]]
|
|
11
|
+
|
|
12
|
+
[[hooks.UserPromptSubmit.hooks]]
|
|
13
|
+
type = "command"
|
|
14
|
+
command = "node -e \"const { existsSync } = require('node:fs'); const path = require('node:path'); const { spawnSync } = require('node:child_process'); let dir = process.cwd(); const root = path.parse(dir).root; while (true) { const scriptPath = path.join(dir, '.codex', 'hooks', 'bootstrap-project-docs-context.mjs'); if (existsSync(scriptPath)) { const result = spawnSync(process.execPath, [scriptPath, 'codex', 'AGENTS.md'], { stdio: 'inherit' }); process.exit(result.status ?? 0); } if (dir === root) { process.exit(0); } dir = path.dirname(dir); }\""
|
|
15
|
+
statusMessage = "Checking bootstrap docs"
|
|
16
|
+
# SDT DevAgent managed hooks: end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{{SDT_DEV_AGENT_BOOTSTRAP_ENTRY_MARKER}}
|
|
2
|
+
|
|
3
|
+
# CLAUDE.md
|
|
4
|
+
|
|
5
|
+
这是 SDT DevAgent 为 Claude Code 生成的最小 bootstrap 入口文档。
|
|
6
|
+
|
|
7
|
+
## 先做 Bootstrap
|
|
8
|
+
|
|
9
|
+
1. 在开始更广泛的仓库工作前,先显式运行 `bootstrap-project-docs` skill。
|
|
10
|
+
2. 先用这个 skill 基于真实代码创建或刷新 `ARCHITECTURE.md`。
|
|
11
|
+
3. 等 `ARCHITECTURE.md` 可信后,再用同一个 skill 刷新这份 `CLAUDE.md`。
|
|
12
|
+
|
|
13
|
+
## 约束
|
|
14
|
+
|
|
15
|
+
- 不要把这份 bootstrap 入口文档当成仓库事实源。
|
|
16
|
+
- 在 `ARCHITECTURE.md` 还不存在或还没刷新前,不要基于猜测直接做大范围实现。
|
|
17
|
+
- 如果用户明确要求跳过 bootstrap 文档基线,先说明这个仓库缺少已文档化的事实源。
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{{SDT_DEV_AGENT_BOOTSTRAP_ENTRY_MARKER}}
|
|
2
|
+
|
|
3
|
+
# AGENTS.md
|
|
4
|
+
|
|
5
|
+
这是 SDT DevAgent 为 Codex 生成的最小 bootstrap 入口文档。
|
|
6
|
+
|
|
7
|
+
## 先做 Bootstrap
|
|
8
|
+
|
|
9
|
+
1. 在开始更广泛的仓库工作前,先显式运行 `bootstrap-project-docs` skill。
|
|
10
|
+
2. 先用这个 skill 基于真实代码创建或刷新 `ARCHITECTURE.md`。
|
|
11
|
+
3. 等 `ARCHITECTURE.md` 可信后,再用同一个 skill 刷新这份 `AGENTS.md`。
|
|
12
|
+
|
|
13
|
+
## 约束
|
|
14
|
+
|
|
15
|
+
- 不要把这份 bootstrap 入口文档当成仓库事实源。
|
|
16
|
+
- 在 `ARCHITECTURE.md` 还不存在或还没刷新前,不要基于猜测直接做大范围实现。
|
|
17
|
+
- 如果用户明确要求跳过 bootstrap 文档基线,先说明这个仓库缺少已文档化的事实源。
|
|
@@ -1,16 +1,30 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
name: bootstrap-project-docs
|
|
3
|
+
description: Bootstrap or refresh project-level AI collaboration docs from real code. Use when a project is newly initialized, when the first AI turn should create or repair ARCHITECTURE.md, AGENTS.md, or CLAUDE.md, when only one of those docs exists, or when existing project docs may be stale or inconsistent with the current repository. Treat minimal root bootstrap entries as execution prompts to refresh, not as the repository fact source.
|
|
4
|
+
---
|
|
2
5
|
|
|
3
|
-
|
|
6
|
+
# Bootstrap Project Docs
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
Create or refresh the project document baseline before broader implementation.
|
|
6
9
|
|
|
7
|
-
|
|
8
|
-
2. 如果缺少 `ARCHITECTURE.md`,先生成或刷新它,并把无法确认的信息标记为“待确认”。
|
|
9
|
-
3. `ARCHITECTURE.md` 就绪后,再生成目标工具规则文档。
|
|
10
|
-
4. `Codex` 目标规则文档是 `AGENTS.md`;`Claude Code` 目标规则文档是 `CLAUDE.md`。
|
|
10
|
+
## Workflow
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
1. Inspect the real repository first.
|
|
13
|
+
Read source directories, build and test commands, key config files, and any existing root docs.
|
|
14
|
+
2. Route by current document state.
|
|
15
|
+
If the project is missing one or more baseline docs, or the existing docs look stale, read `references/doc-state-routing.md`.
|
|
16
|
+
3. Establish `ARCHITECTURE.md` as the fact source.
|
|
17
|
+
Read `references/architecture-first.md` and create or refresh `ARCHITECTURE.md` before touching tool rules.
|
|
18
|
+
4. Create or refresh the tool rules document.
|
|
19
|
+
After `ARCHITECTURE.md` is trustworthy, read `references/tool-rules-follow-up.md` and update `{{toolRulesDoc}}`.
|
|
20
|
+
5. Finish with a short report.
|
|
21
|
+
State which docs were written or updated, which source files anchored the work, and which items still need `待确认`.
|
|
13
22
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
23
|
+
## Guardrails
|
|
24
|
+
|
|
25
|
+
- Treat existing `{{toolRulesDoc}}` as a hint, not as the fact source.
|
|
26
|
+
- If `{{toolRulesDoc}}` is only the SDT DevAgent bootstrap entry, replace it with project-specific rules after the architecture pass.
|
|
27
|
+
- Keep `{{toolRulesDoc}}` short, executable, and free of copied architecture prose.
|
|
28
|
+
- Mark unresolved but important information as `待确认`.
|
|
29
|
+
- When baseline docs are missing, write them in the same turn unless the user explicitly asks to postpone.
|
|
30
|
+
- Do not start broad feature work before the doc baseline exists unless the user explicitly overrides that order.
|