Skip to content

Commit aaec736

Browse files
tbitcsoz-agent
andcommitted
feat: expand project types (16 new) and skills catalog to 131 skills across 16 domains
Project types added (config.py, tools.py, importer.py, scaffolder.py, auditor.py): - AI/Agents: llm-app, agent-orchestration, mcp-server, rag-pipeline, mlops-platform - JVM: java-spring, java-library - Cloud/Infra: serverless, kubernetes-operator, streaming-pipeline, data-warehouse - Game dev: game-unity, game-godot - Web3: smart-contract - Desktop: desktop-electron, desktop-tauri Skills catalog expansion (5 new domains, 55 new skills): - ai-agents (14): LLM app dev, MCP server dev, agent orchestration, prompt engineering, RAG, context engineering, AI safety, LangChain, LangGraph, vector DB, model eval, fine-tuning, computer vision, MLOps - software-engineering (12): code review, TDD, debugging, refactoring, security hardening, performance optimisation, API design, database design, dependency mgmt, git workflow, PR workflow, ADRs - web-backend (11): frontend UI, web perf, accessibility, E2E testing, Next.js, REST API dev, GraphQL, PostgreSQL, Redis caching, message queues, WebSockets - data-engineering (8): ETL/ELT pipelines, dbt, data quality, stream processing, ML experiment tracking, feature engineering, data lakehouse, Apache Spark - platform-engineering (10): Helm, observability, incident response, secret management, GitOps, serverless functions, OAuth2/OIDC, API gateway, chaos engineering, service mesh _EXPLICIT_ONLY_TYPES extended with kubernetes-operator, streaming-pipeline, serverless, agent-orchestration, mcp-server, rag-pipeline, mlops-platform, game-unity, game-godot, and data-warehouse to prevent auto-detection false positives. Detection logic in importer._infer_type extended for Java (Spring Boot detection), Solidity, Godot, Unity, Electron, Tauri, dbt, Kubernetes operators, serverless configs, and Python AI dependency signals (autogen, crewai, langgraph, chromadb, mlflow, kafka, etc.). Co-Authored-By: Oz <oz-agent@warp.dev>
1 parent 594a761 commit aaec736

13 files changed

Lines changed: 6983 additions & 1 deletion

docs/LEDGER.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,3 +338,17 @@
338338
- **Status**: complete
339339
- **Epistemic status**: high
340340
- **Chain hash**: `2c2f46ee6e095aa7...`
341+
342+
## 2026-06-03T21:25 — specsmith migration: 0.11.7 → 0.12.0
343+
- **Author**: specsmith
344+
- **Type**: migration
345+
- **Status**: complete
346+
- **Chain hash**: `a73f1db336999c91...`
347+
348+
## 2026-06-03T21:25 — KILL SWITCH ACTIVATED: emergency stop
349+
- **Author**: specsmith-operator
350+
- **Type**: kill-switch
351+
- **REQs affected**: REG-005
352+
- **Status**: complete
353+
- **Epistemic status**: high
354+
- **Chain hash**: `23df42362ffb6d46...`

docs/specsmith.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ platforms:
1212
- linux
1313
- windows
1414
- macos
15-
spec_version: 0.11.7
15+
spec_version: 0.12.0
1616
aee_phase: release
1717
description: Applied Epistemic Engineering toolkit for AI-assisted development. Governance
1818
backend for the Kairos terminal (BitConcepts/kairos).

src/specsmith/auditor.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,8 @@ def check_tool_configuration(root: Path) -> list[AuditResult]:
724724
# mismatch. See GitHub issue #194.
725725
_EXPLICIT_ONLY_TYPES: frozenset[str] = frozenset(
726726
[
727+
# Hardware / vendor-specific types that cannot be auto-detected from
728+
# file extensions (Python/C tooling dominates file counts).
727729
"fpga-rtl",
728730
"fpga-rtl-amd",
729731
"fpga-rtl-intel",
@@ -733,6 +735,23 @@ def check_tool_configuration(root: Path) -> list[AuditResult]:
733735
"embedded-hardware",
734736
"pcb-hardware",
735737
"yocto-bsp",
738+
# Infrastructure types where auxiliary Python/JS glue code dominates
739+
# and a generic detection pass would misclassify the primary type.
740+
"kubernetes-operator",
741+
"streaming-pipeline",
742+
"serverless",
743+
# AI / agent types: an LLM app is indistinguishable from a regular
744+
# Python library unless dependency signals are present. Suppress
745+
# false-positive mismatches when the type is set explicitly.
746+
"agent-orchestration",
747+
"mcp-server",
748+
"rag-pipeline",
749+
"mlops-platform",
750+
# Game engines: Unity / Godot projects often have Python tooling alongside.
751+
"game-unity",
752+
"game-godot",
753+
# Data warehouse: dbt + SQL projects have no primary-language file bias.
754+
"data-warehouse",
736755
]
737756
)
738757

src/specsmith/config.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,28 @@ class ProjectType(str, Enum):
7474
SVELTEKIT_APP = "sveltekit-app" # SvelteKit app
7575
REMIX_APP = "remix-app" # Remix full-stack React app
7676
ASTRO_SITE = "astro-site" # Astro static/SSR site
77+
# AI / LLM / Agents
78+
LLM_APP = "llm-app" # LLM-powered app (LangChain / LlamaIndex / custom SDK)
79+
AGENT_ORCHESTRATION = "agent-orchestration" # Multi-agent system (AutoGen/CrewAI/LangGraph)
80+
MCP_SERVER = "mcp-server" # Model Context Protocol server
81+
RAG_PIPELINE = "rag-pipeline" # RAG + embedding pipeline
82+
MLOPS_PLATFORM = "mlops-platform" # MLOps platform (MLflow / BentoML / Ray Serve)
83+
# JVM
84+
JAVA_SPRING = "java-spring" # Spring Boot application
85+
JAVA_LIBRARY = "java-library" # Java library / SDK
86+
# Cloud / Infrastructure
87+
SERVERLESS = "serverless" # FaaS (Lambda / GCP Functions / Cloudflare Workers)
88+
KUBERNETES_OPERATOR = "kubernetes-operator" # K8s controller / operator
89+
STREAMING_PIPELINE = "streaming-pipeline" # Kafka / Flink / Beam / Spark Streaming
90+
DATA_WAREHOUSE = "data-warehouse" # dbt / Snowflake / BigQuery / Redshift
91+
# Game development
92+
GAME_UNITY = "game-unity" # Unity game project
93+
GAME_GODOT = "game-godot" # Godot game project
94+
# Web3 / blockchain
95+
SMART_CONTRACT = "smart-contract" # Solidity / EVM smart contracts
96+
# Desktop
97+
DESKTOP_ELECTRON = "desktop-electron" # Electron desktop app
98+
DESKTOP_TAURI = "desktop-tauri" # Tauri desktop app (Rust + WebView)
7799

78100

79101
class Platform(str, Enum):
@@ -548,6 +570,28 @@ def project_type_enum(self) -> ProjectType | None:
548570
ProjectType.SVELTEKIT_APP: "SvelteKit application",
549571
ProjectType.REMIX_APP: "Remix application (React + full-stack)",
550572
ProjectType.ASTRO_SITE: "Astro site (static / SSR)",
573+
# AI / LLM / Agents
574+
ProjectType.LLM_APP: "LLM-powered application (LangChain / LlamaIndex / custom)",
575+
ProjectType.AGENT_ORCHESTRATION: "Multi-agent orchestration (AutoGen / CrewAI / LangGraph)",
576+
ProjectType.MCP_SERVER: "MCP server (Model Context Protocol)",
577+
ProjectType.RAG_PIPELINE: "RAG / embedding pipeline",
578+
ProjectType.MLOPS_PLATFORM: "MLOps platform (MLflow / BentoML / Ray Serve)",
579+
# JVM
580+
ProjectType.JAVA_SPRING: "Java Spring Boot application",
581+
ProjectType.JAVA_LIBRARY: "Java library / SDK",
582+
# Cloud / Infrastructure
583+
ProjectType.SERVERLESS: "Serverless / FaaS (Lambda / GCP Functions / Cloudflare Workers)",
584+
ProjectType.KUBERNETES_OPERATOR: "Kubernetes operator / controller",
585+
ProjectType.STREAMING_PIPELINE: "Streaming data pipeline (Kafka / Flink / Beam)",
586+
ProjectType.DATA_WAREHOUSE: "Data warehouse (dbt / Snowflake / BigQuery)",
587+
# Game development
588+
ProjectType.GAME_UNITY: "Game (Unity)",
589+
ProjectType.GAME_GODOT: "Game (Godot)",
590+
# Web3
591+
ProjectType.SMART_CONTRACT: "Smart contract (Solidity / EVM)",
592+
# Desktop
593+
ProjectType.DESKTOP_ELECTRON: "Desktop application (Electron)",
594+
ProjectType.DESKTOP_TAURI: "Desktop application (Tauri — Rust + WebView)",
551595
}
552596

553597
_SECTION_REFS: dict[str, str] = {
@@ -584,4 +628,26 @@ def project_type_enum(self) -> ProjectType | None:
584628
ProjectType.EPISTEMIC_PIPELINE: "17.31",
585629
ProjectType.KNOWLEDGE_ENGINEERING: "17.32",
586630
ProjectType.AEE_RESEARCH: "17.33",
631+
# AI / LLM / Agents
632+
ProjectType.LLM_APP: "17.34",
633+
ProjectType.AGENT_ORCHESTRATION: "17.35",
634+
ProjectType.MCP_SERVER: "17.36",
635+
ProjectType.RAG_PIPELINE: "17.37",
636+
ProjectType.MLOPS_PLATFORM: "17.38",
637+
# JVM
638+
ProjectType.JAVA_SPRING: "17.39",
639+
ProjectType.JAVA_LIBRARY: "17.40",
640+
# Cloud / Infrastructure
641+
ProjectType.SERVERLESS: "17.41",
642+
ProjectType.KUBERNETES_OPERATOR: "17.42",
643+
ProjectType.STREAMING_PIPELINE: "17.43",
644+
ProjectType.DATA_WAREHOUSE: "17.44",
645+
# Game development
646+
ProjectType.GAME_UNITY: "17.45",
647+
ProjectType.GAME_GODOT: "17.46",
648+
# Web3
649+
ProjectType.SMART_CONTRACT: "17.47",
650+
# Desktop
651+
ProjectType.DESKTOP_ELECTRON: "17.48",
652+
ProjectType.DESKTOP_TAURI: "17.49",
587653
}

src/specsmith/importer.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,15 +1142,81 @@ def _infer_type(result: DetectionResult) -> ProjectType:
11421142
pkg = result.root / "package.json"
11431143
if pkg.exists():
11441144
content = pkg.read_text(encoding="utf-8")
1145+
if "electron" in content:
1146+
return ProjectType.DESKTOP_ELECTRON
1147+
if "solidity" in content or "hardhat" in content or "ethers" in content:
1148+
return ProjectType.SMART_CONTRACT
1149+
if (result.root / "serverless.yml").exists() or (
1150+
result.root / "wrangler.toml"
1151+
).exists():
1152+
return ProjectType.SERVERLESS
11451153
if "react" in content or "vue" in content or "angular" in content:
11461154
# Check if there's also a server
11471155
if (result.root / "server").exists() or "express" in content:
11481156
return ProjectType.FULLSTACK_JS
11491157
return ProjectType.WEB_FRONTEND
1158+
# Tauri: has src-tauri/
1159+
if (result.root / "src-tauri").is_dir():
1160+
return ProjectType.DESKTOP_TAURI
11501161
return ProjectType.FULLSTACK_JS
11511162

1163+
# Data warehouse: dbt_project.yml is a strong signal
1164+
if (result.root / "dbt_project.yml").exists():
1165+
return ProjectType.DATA_WAREHOUSE
1166+
# Kubernetes operator: Go + controllers/ dir
1167+
if lang == "go" and (result.root / "controllers").is_dir():
1168+
return ProjectType.KUBERNETES_OPERATOR
1169+
# Serverless: serverless.yml or SAM template.yaml or wrangler.toml
1170+
if (
1171+
(result.root / "serverless.yml").exists()
1172+
or (result.root / "serverless.yaml").exists()
1173+
or (result.root / "wrangler.toml").exists()
1174+
):
1175+
return ProjectType.SERVERLESS
11521176
# Python types
11531177
if lang == "python":
1178+
# Detect AI / agent project types from dependencies before build-system checks
1179+
_req_text = ""
1180+
for _rf in (
1181+
result.root / "requirements.txt",
1182+
result.root / "pyproject.toml",
1183+
):
1184+
if _rf.exists():
1185+
_req_text += _rf.read_text(encoding="utf-8", errors="ignore").lower()
1186+
_mcp_indicators = {"mcp", "model-context-protocol", "fastmcp", "modelcontextprotocol"}
1187+
_agent_orch_indicators = {"autogen", "crewai", "langgraph", "swarm", "ag2", "pyautogen"}
1188+
_llm_indicators = {
1189+
"langchain",
1190+
"llama-index",
1191+
"llama_index",
1192+
"haystack",
1193+
"openai",
1194+
"anthropic",
1195+
"litellm",
1196+
}
1197+
_rag_indicators = {
1198+
"chromadb",
1199+
"faiss",
1200+
"pinecone",
1201+
"weaviate",
1202+
"qdrant",
1203+
"pgvector",
1204+
"llama-index",
1205+
}
1206+
_mlops_indicators = {"mlflow", "bentoml", "ray", "kubeflow", "prefect", "airflow"}
1207+
_streaming_indicators = {"kafka", "flink", "pyflink", "apache-beam", "pyspark"}
1208+
if any(ind in _req_text for ind in _mcp_indicators):
1209+
return ProjectType.MCP_SERVER
1210+
if any(ind in _req_text for ind in _agent_orch_indicators):
1211+
return ProjectType.AGENT_ORCHESTRATION
1212+
if any(ind in _req_text for ind in _rag_indicators):
1213+
return ProjectType.RAG_PIPELINE
1214+
if any(ind in _req_text for ind in _mlops_indicators):
1215+
return ProjectType.MLOPS_PLATFORM
1216+
if any(ind in _req_text for ind in _streaming_indicators):
1217+
return ProjectType.STREAMING_PIPELINE
1218+
if any(ind in _req_text for ind in _llm_indicators):
1219+
return ProjectType.LLM_APP
11541220
if build in ("pyproject", "setuptools"):
11551221
# Check for CLI entry point
11561222
if any("cli.py" in e for e in result.entry_points):

0 commit comments

Comments
 (0)