Add GSP init and AI usage tooling
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user