Add GSP init and AI usage tooling

This commit is contained in:
2026-05-06 19:40:55 +08:00
parent 67a1bf2600
commit 1478972e53
17 changed files with 870 additions and 8 deletions

View File

@@ -105,6 +105,125 @@ resolution: L2
}
}
func TestValidateUnsupportedGSPVersion(t *testing.T) {
root := t.TempDir()
design := filepath.Join(root, "design")
if err := os.MkdirAll(design, 0755); err != nil {
t.Fatal(err)
}
writeTestFile(t, root, "gsp.manifest", `gspVersion: 9.9
scan:
- design
`)
writeTestFile(t, design, "entry.gsp", `id: project.entry
`)
project, err := LoadProject(root)
if err != nil {
t.Fatal(err)
}
report := project.Validate("")
if report.OK {
t.Fatal("expected unsupported version failure")
}
if report.Errors[0].Code != "unsupported_gsp_version" {
t.Fatalf("expected unsupported_gsp_version, got %+v", report.Errors)
}
}
func TestInitProjectCreatesManifestAndEntry(t *testing.T) {
root := filepath.Join(t.TempDir(), "sample-project")
result, err := InitProject(root, InitOptions{
Name: "sample",
Entry: "page.sample.main",
GSPVersion: "0.1",
ToolkitVersion: "0.1.0",
})
if err != nil {
t.Fatal(err)
}
if len(result.Created) == 0 {
t.Fatal("expected created paths")
}
project, err := LoadProject(root)
if err != nil {
t.Fatal(err)
}
if project.Manifest == nil {
t.Fatal("expected manifest")
}
if project.Manifest.Entry[0] != "page.sample.main" {
t.Fatalf("manifest entry = %v", project.Manifest.Entry)
}
if _, ok := project.ByID["page.sample.main"]; !ok {
t.Fatal("expected initialized entry GSP")
}
report := project.Validate("")
if !report.OK {
t.Fatalf("expected valid initialized project, got %+v", report.Errors)
}
}
func TestInitProjectRefusesOverwrite(t *testing.T) {
root := t.TempDir()
if _, err := InitProject(root, InitOptions{}); err != nil {
t.Fatal(err)
}
if _, err := InitProject(root, InitOptions{}); err == nil {
t.Fatal("expected overwrite refusal")
}
}
func TestInitAIUsageCreatesCoreFiles(t *testing.T) {
root := t.TempDir()
if _, err := InitProject(root, InitOptions{
Name: "sample",
Entry: "page.sample.main",
GSPVersion: "0.1",
}); err != nil {
t.Fatal(err)
}
result, err := InitAIUsage(root, AIInitOptions{})
if err != nil {
t.Fatal(err)
}
if !sameStrings(result.Created, []string{"README.md", "AI_USAGE.md"}) {
t.Fatalf("created = %v", result.Created)
}
if _, err := os.Stat(filepath.Join(root, "README.md")); err != nil {
t.Fatal(err)
}
if _, err := os.Stat(filepath.Join(root, "AI_USAGE.md")); err != nil {
t.Fatal(err)
}
}
func TestInitAIUsageOptionalAdapters(t *testing.T) {
root := t.TempDir()
if _, err := InitProject(root, InitOptions{}); err != nil {
t.Fatal(err)
}
if _, err := InitAIUsage(root, AIInitOptions{
Agents: true,
Skill: "generic",
}); err != nil {
t.Fatal(err)
}
if _, err := os.Stat(filepath.Join(root, "AGENTS.md")); err != nil {
t.Fatal(err)
}
if _, err := os.Stat(filepath.Join(root, "skills", "gsp", "SKILL.md")); err != nil {
t.Fatal(err)
}
}
func TestInitAIUsageRequiresManifest(t *testing.T) {
root := t.TempDir()
if _, err := InitAIUsage(root, AIInitOptions{}); err == nil {
t.Fatal("expected missing manifest error")
}
}
func writeTestFile(t *testing.T, root, name, content string) {
t.Helper()
path := filepath.Join(root, name)