From c4a066549958ca257563b438ca609fc07e601faa Mon Sep 17 00:00:00 2001 From: Sakshi Godspeed Date: Wed, 6 Aug 2025 18:10:54 +0530 Subject: [PATCH 1/2] marketing --- docs/marketing/Chaitanya_Product_Document.md | 80 + docs/marketing/Customer Strategy.docx | Bin 0 -> 36725 bytes .../Godspeed About and offerings.docx | Bin 0 -> 39134 bytes .../Godspeed_Framework_Product_Document.md | 75 + docs/marketing/Saarthi_Product_Document.md | 100 + .../introduction/design-principles.md | 2 +- docs/saarthi/basic-usage/using-modes.md | 6 +- docs/tutorial-videos.json | 44 + docs/tutorial-videos.mdx | 17 + package-lock.json | 5450 +++++++++++++---- package.json | 13 +- sidebars.js | 7 +- src/components/VideoGrid.tsx | 65 + src/css/video.css | 44 +- src/types/global.d.ts | 6 + tsconfig.json | 33 + 16 files changed, 4878 insertions(+), 1064 deletions(-) create mode 100644 docs/marketing/Chaitanya_Product_Document.md create mode 100644 docs/marketing/Customer Strategy.docx create mode 100644 docs/marketing/Godspeed About and offerings.docx create mode 100644 docs/marketing/Godspeed_Framework_Product_Document.md create mode 100644 docs/marketing/Saarthi_Product_Document.md create mode 100644 docs/tutorial-videos.json create mode 100644 docs/tutorial-videos.mdx create mode 100644 src/components/VideoGrid.tsx create mode 100644 src/types/global.d.ts create mode 100644 tsconfig.json diff --git a/docs/marketing/Chaitanya_Product_Document.md b/docs/marketing/Chaitanya_Product_Document.md new file mode 100644 index 0000000..348e536 --- /dev/null +++ b/docs/marketing/Chaitanya_Product_Document.md @@ -0,0 +1,80 @@ +# Chaitanya: Your Context-Aware AI Agent Platform + +## Introduction +Chaitanya is a revolutionary context-aware RAG (Retrieval Augmented Generation) and Orchestration agent designed to fundamentally transform how products and teams interact with organizational knowledge and agentic meshes. Moving beyond the limitations of generic chatbots, Chaitanya delivers grounded, private, and explainable answers or workflow executions directly from your unique, proprietary data, effectively eliminating hallucinated responses. + + +## Chaitanya: + +Designed to be an indispensable part of your organization, it acts as your intelligent assistant, knowledge expert, and workflow orchestrator, seamlessly integrating into your existing processes to enhance productivity and decision-making. Think of Chaitanya as the central nervous system for your organizational knowledge and automated workflows. + +## Benefits +Chaitanya brings transformative benefits to both your business and personal endeavors, unlocking infinite possibilities by leveraging your unique data: + +### Business Impact: +* **Enhanced Sales & Marketing:** Instantly access insights, generate customer follow-up emails, manage content as a marketing assistant, and automate outreach by leveraging your sales decks, playbooks, and CRM data. +* **Streamlined Professional Workflows:** Automate repetitive tasks, build professional workflows, and ensure consistent execution across departments. +* **Improved Organizational Knowledge Sharing:** Break down knowledge silos by providing instant, accurate answers from your internal documentation, codebases, and architectural guidelines. +* **Accelerated Customer Support:** Empower support agents (and customers) to quickly find policy details, troubleshooting steps, and product guidance directly from your latest documentation. +* **Rapid AI Assistant Embedding:** Founders and startups can quickly embed AI assistants or multi-agent meshes into their products with full control over their data and no vendor lock-in. +* **Operational Efficiency & Cost Reduction:** Automate operations, reduce manual effort, and achieve significant cost savings by operating with a leaner, more efficient team. + + +### Personal Impact: +* **Personalized Coaching & Well-being:** Train Chaitanya on your personal data to act as a well-being expert, personal coach, or life coach, providing tailored guidance and support. +* **Productivity & Learning:** Free up time and energy by automating personal tasks, enhancing learning, and assisting with administrative duties. +* **Monetization of Expertise:** Independent experts can package their knowledge into intelligent agents and monetize them through a future marketplace, building a personal brand with AI-powered offerings. +* **Career Growth & Skill Development:** Students and job seekers can leverage Chaitanya as an AI coach for learning paths, project feedback, and building a portfolio of real-world AI applications. + +## USP with Competitive Analysis +Chaitanya stands apart from generic AI solutions and chatbots by offering a unique combination of capabilities that prioritize accuracy, control, and adaptability: + +* **Grounded in Your Data, Not Hallucinations:** Unlike general-purpose LLMs or chatbots that can "hallucinate" responses, Chaitanya is explicitly designed to deliver answers and execute workflows *directly from your unique, private data*. This ensures accuracy, trustworthiness, and relevance, which is critical for business operations. +* **Context-Aware Orchestration:** Chaitanya goes beyond simple Q&A. Its orchestration capabilities allow it to understand complex requests and coordinate multiple actions or agents to achieve a desired outcome, making it a true workflow automation engine. +* **Open & Modular Architecture:** Chaitanya is not a black box. Its open and modular design allows for deep customization, integration with various data sources, and the flexibility to adapt to evolving business needs without vendor lock-in. You own the source code and usage kit, enabling rapid transformation. +* **Empowering Agent Creation:** Chaitanya is not just a pre-built agent; it's a platform for *creating and managing* your own intelligent agents. This empowers users to tailor AI solutions precisely to their domain expertise and operational requirements. + +While many tools offer AI assistance or knowledge management, Chaitanya differentiates itself by providing a **private, explainable, and actionable AI layer built directly on your organizational knowledge**, enabling true automation and intelligent interaction across all facets of your business and personal life. + +## Customer Profile Mapping +Chaitanya serves a diverse range of customers, addressing their specific pain points and enabling them to achieve their desires and fantasies: + +* **Solo Builders & Indie Founders:** + * **Pain Point:** Building and running a product + business alone, limited dev time and funds, no access to AI infrastructure or talent. + * **Chaitanya's Solution:** Provides tools to embed AI workflows in-product and smart agents for sales, onboarding, and customer support. Enables monetization of domain expertise through agents and automation of GTM and internal operations without hiring. + * **Outcome:** Launch powerful solo products, handle customers, leads, and support via AI agents, operating like a larger company. + +* **Bootstrapped Startups (Small Tech Teams):** + * **Pain Point:** Inability to scale product, operations, and GTM with a small team; low engineering bandwidth. + * **Chaitanya's Solution:** Offers plug-and-play agents for GTM, CRM, onboarding, and hiring. Automates operations and outreach. + * **Outcome:** Operate like a 10-person team with fewer developers, scale without needing to fundraise, and build/grow SaaS with minimal staff. + +* **Funded & Scaling Startups (Seed–Series B):** + * **Pain Point:** Product, operations, GTM, and support not scaling together; founders and engineers doing ops and GTM tasks. + * **Chaitanya's Solution:** Provides reusable internal agents and automation, standardizing processes with contextual information. + * **Outcome:** Streamlined, AI-leveraged operations, sustainable scaling with fewer hires, and AI copilots embedded in every team for marketing, sales, support, and fundraising. + +* **Mid-Market Businesses (50–500 Employees):** + * **Pain Point:** Siloed knowledge, inconsistent workflows, operational inefficiencies, lack of scalable employee enablement. + * **Chaitanya's Solution:** Creates a unified internal AI and knowledge layer, enabling custom agents and workflows for various business purposes. + * **Outcome:** Boosts org-wide productivity, uses AI for training, onboarding, and compliance, with internal agents knowing company SOPs and contexts. + +* **Large Enterprises:** + * **Pain Point:** Need for secure, scalable internal AI adoption; unstructured internal knowledge; compliance issues. + * **Chaitanya's Solution:** Offers on-premise deployment, RBAC, standardized infrastructure for tech, cloud, automation, and knowledge sharing. Provides secure, auditable internal agent systems and copilots for legal, HR, ops, IT. + * **Outcome:** Centralized, explainable AI support layer, departmental agents with access control, and an AI-first digital transformation with autonomous support across departments. + +* **Independent Experts (Creators / Domain Experts):** + * **Pain Point:** Difficult to scale or monetize expertise; lack of avenues for stable income. + * **Chaitanya's Solution:** Provides natural language-based agentic tools to create and deploy smart agents, along with a marketplace and community to showcase, distribute, and monetize their agents and coaching. + * **Outcome:** Package knowledge into useful tools, build a personal brand with AI-powered offerings, achieve passive income through the marketplace, and gain recognition. + +* **Everyday Users (Personal or Work Use):** + * **Pain Point:** Manual and repeating tasks; skill and information gaps; inefficient workflows. + * **Chaitanya's Solution:** Offers smart, out-of-the-box agents and tools for productivity, learning, and administration. + * **Outcome:** Free up time and energy, feel assisted and in control, meet personal goals efficiently, and have personalized AI assistants for different purposes. + +* **Students & Job Seekers:** + * **Pain Point:** Decreasing demand for freshers; lack of proper training resources, roadmap, or guidance; lack of AI experience. + * **Chaitanya's Solution:** Provides an AI that teaches, mentors and certifies, along with a marketplace to build and showcase projects. + * **Outcome:** Build a public agent or project portfolio, demonstrate learning paths with evidence, get hired via real-world applications, and have a personalized AI coach guiding career growth. \ No newline at end of file diff --git a/docs/marketing/Customer Strategy.docx b/docs/marketing/Customer Strategy.docx new file mode 100644 index 0000000000000000000000000000000000000000..a0c42773fafabd1160fe4505bddc1fcfb698d10a GIT binary patch literal 36725 zcmZUZ18`=|)~I7oYuy5aQoa6MJI?Cwm8HdP4^XIuBc$>cl>| z0S35GeX{YKmIHX(t>t8tg?{5e-^ma?nBWQrp6Zl~$CW`$YL+0@%bCRgU$C zvu7p zGTx&)Y;Q(*_P!g(3}IKcacIFUU6yiEfl1f~a~UX>4Gb1RyhBb*zl3Gwt&?%$!}7~( zBm2@5O>Bx7>flc+#nPdIm>W#0=Dha2Qu995z!X@=%l*y9{+#iG{oaz+Y3;ufl%3pZ zt_5~4eJC?~sG^8eu0+YMqSdem6Lif(w`2-2fxOX?Shj`nf7Gr*!Ser_hGfxGe}Y!{ zzjF3Q1=bD|h&k2$E9dyXaz^^!ayGViGW|!;F^PhI1&t_Li|m=VDrcFcWf>1t4+0$_ zMd&u1+fq`Gx2Bw!8v`!B4^vhk3tVr&{`~!|>3nH_5FI0Co zBTx%BO_$lX)MC3F>!m-9SsK^M{$lk*tz=jK9v_Iloj%XKFGB+ZWvQql5Koq zj1K)_eWNw{@5ky2`Ty1hE4$f`roVbH{s9Dp{8tz5_D&}BX7+Y2DuzZj|5C

Xuy= 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

1JtzrH0kbtaaR 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 literal 0 HcmV?d00001 diff --git a/docs/marketing/Godspeed About and offerings.docx b/docs/marketing/Godspeed About and offerings.docx new file mode 100644 index 0000000000000000000000000000000000000000..bde0db868715225bedb8c349457229fad138d9f3 GIT binary patch literal 39134 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 literal 0 HcmV?d00001 diff --git a/docs/marketing/Godspeed_Framework_Product_Document.md b/docs/marketing/Godspeed_Framework_Product_Document.md new file mode 100644 index 0000000..1ea61d9 --- /dev/null +++ b/docs/marketing/Godspeed_Framework_Product_Document.md @@ -0,0 +1,75 @@ +# Godspeed Microservices Framework + +## 1. Introduction +The Godspeed Microservices Framework is a 4th-generation framework optimized for scale, designed to accelerate product development by enabling fewer lines of code and faster iterations. It supports full-stack, event-driven, and distributed systems, providing a robust foundation for building production-grade software. It embodies a philosophy for building modular, scalable, and error-resilient systems with minimal boilerplate, leveraging plugins, schema-based automation, and observability through a "configure-over-code" approach. + +## 2. Features +* **4th-Generation Framework:** Optimized for scale, supporting full-stack, event-driven, and distributed systems. +* **Schema-Driven Development:** Database schema acts as the single source of truth, automatically generating API structure, validations, documentation, and workflow code. +* **Database Agnostic:** Uses Prisma ORM, allowing seamless switching between databases (Postgres, MySQL, SQLite, MongoDB, etc.) using the same schema and query syntax. +* **Auto-Generated Validations:** Request and response validations are automatically derived from the schema, eliminating the need for manual Joi/Zod/JSON Schema logic. +* **Universal Schema for All Consumers:** The same API schema generates Swagger/OpenAPI specs, Postman collections, and GraphQL schemas, ensuring consistency across all API consumers. +* **Built-in Authentication & Authorization:** Declarative AuthN/AuthZ decoupled from core workflows, encouraging secure-by-default practices. +* **Modular and Decoupled Architecture:** Functions are independent of HTTP server implementation, authentication mechanisms, and protocols (HTTP, gRPC, GraphQL), enabling easier testing, swapping, and upgrading. +* **Configure Over Code:** Replaces large codebases with small, declarative configuration files (YAML/JSON), reducing cognitive load and maintenance. OAuth2 integrations work through configuration. +* **Fine-Grained API and Workflow Definitions:** Automatically generated, strongly typed APIs with versioned Swagger/OpenAPI specs for centralized, up-to-date documentation and seamless collaboration. +* **Observability and Tracing:** Uses OpenTelemetry format and Pino logging, emitting logs, traces, and metrics with complete context (API route, function ID, user info, request ID, span ID, etc.), integrating with platforms like Grafana, Datadog, Sentry. +* **Performance and Developer Experience:** Pino logger for better performance, project scaffolding, CLI tooling, and plugin integrations for drastic time-to-production reduction. Minimal boilerplate for faster onboarding and debugging. +* **No Vendor Lock-in:** Designed to be vendor-agnostic, allowing flexibility to switch between databases, cloud providers, and third-party services. + +## 3. Benefits +* **10x Faster Development:** Accelerates the SDLC from idea to scale, enabling rapid iteration and deployment. +* **Reduced Code and Chaos (90%*):** Focus on core logic instead of boilerplate, leading to cleaner, more maintainable code. +* **Reduced Bugs and MTTR (90%*):** Standardized patterns and automated validations significantly lower bug introduction rates and mean time to issue resolution. +* **Consistent and Standardized Outcomes:** Ensures every project adheres to proven architectural patterns and security measures, delivering predictable and high-quality results. +* **Enhanced Developer Experience (Vibe Coding):** Intuitive and enjoyable development process with minimal boilerplate and robust tooling. +* **Future-Proof Architecture:** Decoupled components and vendor-agnostic design provide flexibility to adapt to evolving technology stacks. +* **Comprehensive SDLC Coverage (100%):** Built-in support for APIs, CI/CD, Auth, Logs, Docs, Monitoring, and Infra-as-Code covers all aspects of the development lifecycle. +* **Democratized Support:** Agentic SDLC support is accessible to all team members, regardless of experience level. + +## 4. USP with Competitive Analysis +Godspeed Microservices Framework differentiates itself by being a 4th-generation, AI-native, agentic SDLC platform that enforces best practices through "configure-over-code" and schema-driven development. + +* **Traditional Frameworks (e.g., Express, Spring Boot, Django):** Require significant boilerplate, manual validation, and extensive configuration. They lack built-in AI integration and opinionated guardrails for consistency. Godspeed reduces code and chaos by 90% and standardizes implementation. +* **Low-Code/No-Code Platforms:** While offering speed, they often lead to vendor lock-in, limited flexibility, and difficulty with complex, custom logic. Godspeed provides the speed of low-code with the flexibility and control of a full-code framework, ensuring no vendor lock-in. +* **Other Microservices Frameworks:** May offer some modularity but often lack the comprehensive schema-driven approach, auto-generated validations, and deep observability integrations that Godspeed provides out-of-the-box. Godspeed's focus on "Single Source of Truth" and "Configure Over Code" minimizes errors and accelerates development beyond typical microservices setups. + +**Why Godspeed Framework?** +Godspeed is more than a meta-framework; it's a philosophy for building modular, scalable, and error-resilient systems with minimal boilerplate. It turbocharges development with plugins, schema-based automation, and observability, all with a configure-over-code approach. This ensures consistency, predictability, and security by default, making it a responsible choice for modern software development. + +## 5. Customer Profile Mapping + +* **Solo Builders & Indie Founders:** + * **Pain Point:** Building and running a product + business alone; limited dev time and funds; no access to AI infrastructure or talent at budget. + * **Benefits:** Enables launching powerful products solo, building AI-native features, and automating operations with minimal effort due to reduced code and standardized patterns. + * **Decision Maker:** Solo Founder / Indie Dev + +* **Bootstrapped Startups (Small Tech Teams):** + * **Pain Point:** Can't scale product, ops, and GTM with a small team; low engineering bandwidth; GTM and support tasks overwhelm the team. + * **Benefits:** Provides engineering velocity with fewer bugs, allowing small teams to operate like larger ones by automating development and ensuring consistent, high-quality delivery. + * **Decision Maker:** Founder / CTO + +* **Funded & Scaling Startups (Seed–Series B):** + * **Pain Point:** Product, ops, GTM, and support aren’t scaling together; overshooting budget; losing quality control. + * **Benefits:** Offers strong technical infrastructure and guardrails, enabling streamlined and well-executed operations leveraging AI, building and scaling sustainably with fewer hires, and maintaining agility. + * **Decision Maker:** CTO / VP Eng / Product Lead + +* **Mid-Market Businesses (50–500 Employees):** + * **Pain Point:** Siloed knowledge, inconsistent workflows and operational inefficiencies; high costs with high inefficiencies. + * **Benefits:** Provides a strong technical infrastructure and guardrails, enabling standardized and automated processes, and boosting org-wide productivity. + * **Decision Maker:** Platform Head / CXO + +* **Large Enterprises:** + * **Pain Point:** Need for secure, scalable internal AI adoption; compliant and security issues; internal chaos from inconsistent AI use. + * **Benefits:** Provides a standardized infrastructure for tech, cloud, and business automation, ensuring secure, auditable systems and shift-left processes for compliance and best practices. + * **Decision Maker:** CIO / CTO / Head of Transformation + +* **IT Consulting Agencies:** + * **Pain Point:** Scaling delivery with high-quality, AI-native solutions across diverse client needs; high overhead for building custom AI features per client. + * **Benefits:** Enables rapid delivery of modern AI-native solutions, reuse of internal workflows and assets, and building a library of differentiating internal tools or client solutions. + * **Decision Maker:** Delivery Head / Practice Lead / Founder + +* **Students & Job Seekers:** + * **Pain Point:** Fast decreasing demand for freshers; lack of proper training resources, roadmap or guidance; lack of AI experience and training. + * **Benefits:** Provides hands-on experience with a cutting-edge 4th-generation framework, enabling them to build real-world projects and master AI-assisted development workflows, enhancing their portfolio and career prospects. + * **Decision Maker:** Student / Job Seeker \ No newline at end of file diff --git a/docs/marketing/Saarthi_Product_Document.md b/docs/marketing/Saarthi_Product_Document.md new file mode 100644 index 0000000..173da88 --- /dev/null +++ b/docs/marketing/Saarthi_Product_Document.md @@ -0,0 +1,100 @@ +# Saarthi + +## 1. Introduction +Saarthi is a VSCode extension that functions as an AI-assisted SDLC team. It comprises specialized agents designed to support the entire software development lifecycle, from planning and coding to testing, deployment, and monitoring. Saarthi is built to work alongside both LLMs and human developers, providing framework-aware intelligence and built-in guardrails to ensure consistency, maintainability, and accelerated development. + +## 2. Meet Your Team +Saarthi is your AI-Native, Multi-Agent Development Team, equipped with a powerful suite of pre-trained agents: + + * Code For general-purpose coding tasks, now with integrated support for Godspeed’s 4th-gen meta framework for backend development, enabling guard-railed 10x engineering practices—automatically. + + * Architect For planning and technical leadership + + * Ask For answering questions and providing information + + * Debug: For systematic problem diagnosis + + * Orchestrator: For managing complex tasks and delegating work + + * Code Review; Performing code reviews, identifying potential issues, and ensuring code + quality + + * DevOps: Streamlines deployment tasks for all types of projects. + + * QA Lead Engineer - Managing all QA tasks, such as setting up testing environments and + writing test files, implements test cases, handles mocking and validates test execution. + + * Product Manager- Ideal to develop product strategy, idea validation, competitive + analysis, MVP planning and market positioning. + + * Coach: An AI personal coach providing dynamic, personalized learning roadmaps, relevant resources and interactive exercises. + + * Create your own: Create unlimited specialized agents for security auditing, performance optimization, documentation, or any other task + + +## 3. Features +* **Multi-Agent Development Team:** A collection of specialized AI agents working collaboratively. +* **Full-Cycle Engineering Support:** Covers planning, coding, testing, deployment, and monitoring. +* **Supports All Modern Tech Stacks:** Adapts to various frontend, backend, and full-stack technologies. +* **Framework-Aware Intelligence:** Embeds AI intelligence within an opinionated system that understands context and adheres to architectural standards. +* **Pre-Trained Agents:** Development, Architecture, Review, and DevOps agents are ready out-of-the-box. +* **Automated Reviews:** Proactively catches issues before they reach staging environments. +* **Multi-LLM Ready:** Seamlessly integrates with OpenAI, Anthropic, and Gemini APIs. +* **Explicit Guardrails:** Follows Godspeed’s framework patterns for predictability and safety. +* **Context-Aware Intelligence via RAG Integration:** A RAG-node agent seamlessly integrated with Godspeed Mode enables advanced, documentation-aware responses. + +## 4. Benefits +* **10x Productivity:** Transforms development workflow into a true multi-agent collaboration, accelerating software delivery. +* **Reduced Bugs and Tech Debt:** By embedding AI intelligence within a framework-aware system, Saarthi ensures consistency and adherence to architectural standards, leading to reliable and sustainable development. +* **Consistent and Maintainable Code:** Ensures clean, scalable code even with entry-level engineers or LLMs, maintaining consistency across projects. +* **Proactive Issue Detection:** Automated reviews catch issues early in the development cycle. +* **Democratized Development:** Makes advanced engineering tools and AI-assisted development accessible to all team members, regardless of experience level. +* **Focus on Core Logic:** Developers and agents can concentrate on core business logic, reducing boilerplate and cognitive load. +* **Responsible AI:** Saarthi is designed to be "smart and responsible," ensuring predictable and safe outcomes through explicit guardrails. + +## 5. USP with Competitive Analysis +Saarthi stands out as the world's first multi-agent dev team with framework-based intelligence, directly tackling the challenges of unstructured AI coding. + +* **Generic AI Coding Assistants (e.g., GitHub Copilot, ChatGPT):** While powerful, they often lack context, framework awareness, and built-in guardrails, potentially leading to bugs, tech debt, and inconsistent results. Saarthi's embedded AI intelligence within an opinionated system ensures consistency and adherence to architectural standards. +* **Traditional IDEs without AI Integration:** Rely entirely on human developers for all SDLC stages, leading to slower development cycles, higher bug rates, and increased manual effort. Saarthi automates and assists across the full SDcycle. +* **Other Agentic Platforms:** May offer agents but often lack the deep integration with a 4th-generation framework and the comprehensive suite of specialized agents for full-cycle engineering that Saarthi provides. Saarthi's "responsible AI" approach with explicit guardrails ensures reliable and sustainable development. + +**Why Saarthi?** +Saarthi tackles the challenge of AI coding agents leading to bugs and tech debt by embedding AI intelligence within a framework-aware, opinionated system. This allows it to understand context, maintain consistency, and adhere strictly to architectural standards, ensuring reliable and sustainable development. It transforms AI from a co-pilot into a reliable, full-cycle team member. + +## 6. Customer Profile Mapping + +* **Solo Builders & Indie Founders:** + * **Pain Point:** Building and running a product + business alone; limited dev time and funds; no access to AI infrastructure or talent at budget. + * **Benefits:** Acts as a full AI-assisted SDLC team, enabling solo founders to launch powerful products, build AI-native features, and automate operations without needing a large team. + * **Decision Maker:** Solo Founder / Indie Dev + +* **Bootstrapped Startups (Small Tech Teams):** + * **Pain Point:** Can't scale product, ops, and GTM with a small team; low engineering bandwidth; GTM and support tasks overwhelm the team. + * **Benefits:** Provides engineering velocity with fewer bugs, allowing small teams to operate like larger ones by automating development, ensuring consistent, high-quality delivery, and freeing up bandwidth for GTM and support. + * **Decision Maker:** Founder / CTO + +* **Funded & Scaling Startups (Seed–Series B):** + * **Pain Point:** Product, ops, GTM, and support aren’t scaling together; overshooting budget; losing quality control. + * **Benefits:** Offers a multi-agent team to streamline development, automate reviews, and ensure consistent implementation, helping scale sustainably with fewer hires and maintaining agility. + * **Decision Maker:** CTO / VP Eng / Product Lead + +* **Mid-Market Businesses (50–500 Employees):** + * **Pain Point:** Siloed knowledge, inconsistent workflows and operational inefficiencies; high costs with high inefficiencies. + * **Benefits:** Provides a standardized approach to development with AI assistance, boosting org-wide productivity and ensuring consistent quality across projects. + * **Decision Maker:** Platform Head / CXO + +* **Large Enterprises:** + * **Pain Point:** Need for secure, scalable internal AI adoption; compliant and security issues; internal chaos from inconsistent AI use. + * **Benefits:** Ensures consistent AI use with explicit guardrails, supports secure and auditable internal agent systems, and helps standardize development processes across large organizations. + * **Decision Maker:** CIO / CTO / Head of Transformation + +* **IT Consulting Agencies:** + * **Pain Point:** Scaling delivery with high-quality, AI-native solutions across diverse client needs; high overhead for building custom AI features per client. + * **Benefits:** Enables rapid delivery of modern AI-native solutions, provides a library of plug-and-play agents, and helps train teams consistently across fast-changing AI tech, enhancing client delivery. + * **Decision Maker:** Delivery Head / Practice Lead / Founder + +* **Students & Job Seekers:** + * **Pain Point:** Fast decreasing demand for freshers; lack of proper training resources, roadmap or guidance; lack of AI experience and training. + * **Benefits:** Provides hands-on experience with AI-assisted development workflows, access to pre-trained agents, and a platform to build a strong developer portfolio, enhancing their career prospects in the AI era. + * **Decision Maker:** Student / Job Seeker \ No newline at end of file diff --git a/docs/microservices-framework/introduction/design-principles.md b/docs/microservices-framework/introduction/design-principles.md index 79fe310..f4eb94b 100644 --- a/docs/microservices-framework/introduction/design-principles.md +++ b/docs/microservices-framework/introduction/design-principles.md @@ -27,7 +27,7 @@ Godspeed's YAML-based DSL simplifies the expression of what is to be done. In ma ### Unified datastore model and API -The unified model configuration and CRUD API, which includes popular SQL, NoSQL stores including [Elasticgraph](/docs/microservices-framework/datasources/datasource-plugins/elasticgraph/elasticgraph.md) (a unique ORM over Elasticsearch), offer standardized interfaces to various types of datastores, whether SQL or NoSQL. Each integration adapts to the nature of the data store. The Prisma and Elasticgraph plugins provided by Godspeed expose the native functions of the client used, giving developer the freedom to use the universal syntax or native queries. +The unified model configuration and CRUD API, which offers standardized interfaces to various types of datastores, whether SQL or NoSQL. Each integration adapts to the nature of the data store. The Prisma plugin provided by Godspeed expose the native functions of the client used, giving developer the freedom to use the universal syntax or native queries. ### Schema driven data validation diff --git a/docs/saarthi/basic-usage/using-modes.md b/docs/saarthi/basic-usage/using-modes.md index e507116..d26b196 100644 --- a/docs/saarthi/basic-usage/using-modes.md +++ b/docs/saarthi/basic-usage/using-modes.md @@ -47,11 +47,11 @@ Four ways to switch modes: - [Orchestrator](/docs/saarthi/modes/orchestrator.md) -- [QA Lead Engineer](./modes/qa-modes.md) +- [QA Lead Engineer](/docs/saarthi/modes/qa-modes.md) -- [Product Manager](./modes/pm-lead.md) +- [Product Manager](/docs/saarthi/modes/pm-lead.md) -- [Coach](./modes/coach.md) +- [Coach](/docs/saarthi/modes/coach.md) @@ -40,7 +40,7 @@ http.get./greet: #The initial line depicts a fusion of the event, the employed m #Other non-swagger components (optional) authn: #custom authentication. Currently plugins support JWT. Can be customized - authz: #your custom authz workflow + authz: #your custom authz function on_request_validation_error: #when validation fails on_response_validation_error: #when validation fails log: #Open Telemetry compliant log attributes which help debug and search through logs better @@ -163,7 +163,7 @@ issuer: JWT_ISSUER After exporting the environment variable, you can access these variable anywhere in your project by using inline -scripting `<%config.issuer%>` in yaml or as `ctx.config.issuer` in js/ts workflows. +scripting `<%config.issuer%>` in yaml or as `ctx.config.issuer` in js/ts functions. :::tip Note If you do not set these environment variables mentioned above, it will result in an error while running your project. And if the token values set in header differ from those specified in the configuration, the response will be 'Unauthorized.' @@ -207,7 +207,7 @@ http.get./helloworld: ```yaml # Login with username and password http.post./login: # defines the POST request that will be triggered when a client hits /login endpoint. - fn: verifyLogin # the workflow to handle the request + fn: verifyLogin # the function to handle the request authn: false body: content: @@ -237,7 +237,7 @@ http.post./login: # defines the POST request that will be triggered when a cli type: string example: 'Invalid username or password' ``` -**Workflow (verifyLogin.ts)** +**Function (verifyLogin.ts)** ```ts import { GSCloudEvent, GSContext, PlainObject, GSStatus, logger } from "@godspeedsystems/core"; import jwt from 'jsonwebtoken'; @@ -268,9 +268,9 @@ export default function (ctx: GSContext) { ``` ### How to access JWT payload -You can access the complete JWT payload as ctx.inputs.data.user in JS/TS workflows. +You can access the complete JWT payload as ctx.inputs.data.user in JS/TS functions. -Example access from TS workflow +Example access from TS function ```ts import { GSCloudEvent, GSContext, PlainObject, GSStatus, logger } from "@godspeedsystems/core"; export default function (ctx: GSContext) { @@ -340,7 +340,7 @@ For consistency across plugins, it's recommended to use a standardized configura failure_redirect: <% process.env.GITHUB_FAILURE_REDIRECT_URL %> ``` - Let's See an example event and workflow of above provided success_redirect_url + Let's See an example event and function of above provided success_redirect_url Event src/events/helloUser.yaml ```yaml @@ -355,7 +355,7 @@ For consistency across plugins, it's recommended to use a standardized configura type: string ``` - Workflow (src/functions/helloUser.ts) + function (src/functions/helloUser.ts) ```ts import { GSCloudEvent, GSContext, PlainObject, GSStatus } from "@godspeedsystems/core"; export default function (ctx: GSContext) { @@ -402,7 +402,7 @@ Actions define the specific operations or activities that users may want to perf d. **Context** Context refers to the circumstances or conditions under which a user's request for access is evaluated. This includes factors such as time, location, or any other relevant contextual information. -Authz workflow returns JSON output then it is merged with args.data of the task for which authz is being executed. +Authz function returns JSON output then it is merged with args.data of the task for which authz is being executed. -## Authz workflows -The framework allows you to specify yaml taks to run authorization workflows, at three places - event source, event or yaml task. +## Authz functions +The framework allows you to specify yaml taks to run authorization functions, at three places - event source, event or yaml task. -**i. ** The approach for handling JWT or similar keys is to implement a task within the authorization (authz) workflow. -**ii. ** The authz workflow can include a task specifically designed to process and enrich the user object with information obtained from the JWT or other keys. +**i. ** The approach for handling JWT or similar keys is to implement a task within the authorization (authz) function. +**ii. ** The authz function can include a task specifically designed to process and enrich the user object with information obtained from the JWT or other keys. **iii. ** Finally the authz has to tell whether the user is allowed to do this action, and if yes, then what kind of data is the user allowed to retrieve in response? Hint: consider database access? Even if a user is allowed to read a table, is he allowed to read all the rows? Or is he allowed to read all the columns? -### Example authorization workflows -Developers can define the authorization workflow using the following method. +### Example authorization functions +Developers can define the authorization function using the following method. - #### Authorization tasks DSL -**-** Developers can define the authorization workflow by providing a set of tasks using the DSL provided by the core framework's workflows -**-** This approach allows for a declarative definition of tasks within the authz workflow. +**-** Developers can define the authorization function by providing a set of tasks using the DSL provided by the core framework's functions +**-** This approach allows for a declarative definition of tasks within the authz function. ```yaml # example @@ -74,13 +74,13 @@ authz: - fn: com.gs.evaluate_gre ``` -**-** Think of authz instruction as a workflow. It will accept an array of task or a single task, each of which should return GSStatus or true. +**-** Think of authz instruction as a function. It will accept an array of task or a single task, each of which should return GSStatus or true. **-** These instructions may enrich the context and user data, or load and run authorization checks, or do both. -**-** When one task fails, the whole workflow is considered to be failed. +**-** When one task fails, the whole function is considered to be failed. :::tip Note - Following Zero trust policy, when a task does not return `true` or `{success: true}` (explicitly), or in the case when `GSStatus.code === 403`, the authorization will be considered as failed. -- Next tasks in the series of tasks will not be executed. The event or workflow task at which the user's authz has failed will exit. +- Next tasks in the series of tasks will not be executed. The event or function task at which the user's authz has failed will exit. ::: ### Response code, message and data from authorization failure @@ -245,7 +245,7 @@ To better understand the folder structure of the example, review the following s --> ### A. Authorization at event source level -You can set authz workflows that apply to all events of a particular event source, unless explicitly overriden by an event definition by setting `authz: false` or `authz:` to another workflow. +You can set authz functions that apply to all events of a particular event source, unless explicitly overriden by an event definition by setting `authz: false` or `authz:` to another function. ```yaml type: express @@ -316,13 +316,13 @@ authz: # enabling authz in event level ``` Whenever an API is triggered with authorization enabled, the event source plugin parses the JWT in its request middleware and verifies user data, such as user.role in the example above. -If the condition evaluates to true, the corresponding workflow is executed. Otherwise, it proceeds to execute the else case, indicating "Authorization failed." +If the condition evaluates to true, the corresponding function is executed. Otherwise, it proceeds to execute the else case, indicating "Authorization failed." ### C. Authorization at task level ```yaml title=functions/helloworld.yaml -id: helloworld_workflow +id: helloworld_function tasks: - - id: helloworld_workflow_first_task + - id: helloworld_function_first_task fn: com.gs.transform args: code: 200 @@ -374,7 +374,7 @@ module.exports = { **1. ** Plugins can access user data through `args.meta.authzPerms` in the `GSDatasource.execute()` method. The structure of this data is defined by the plugin, following the format supported by the specific datasource plugin. **2. ** For example, it could include fields like `{can_access, no_access, where}`. -```json title='Sample output of authz workflow authz_wf.yaml' +```json title='Sample output of authz function authz_wf.yaml' data: [ //Your access policies for further finegrained datastore access, // as interpreted and used by the datastore plugin to implement restricted database access over any database. @@ -429,7 +429,7 @@ data: [ #### Example: [prisma-as-datasource plugin](../datasources/datasource-plugins/Prisma%20Datasource.md/#database-authorization)

Restricted datastore access -In the below authz workflow can_acces, no_access and where conditions are provided. These conditions will be applied while fetching author details. +In the below authz function can_acces, no_access and where conditions are provided. These conditions will be applied while fetching author details. ```yaml title=authz_wf.yaml authz: diff --git a/docs/microservices-framework/authorization/overview.md b/docs/microservices-framework/authorization/overview.md index 1bda7bb..b9cf698 100644 --- a/docs/microservices-framework/authorization/overview.md +++ b/docs/microservices-framework/authorization/overview.md @@ -1,7 +1,7 @@ --- title: About Authorization description: Overview of authorization, including RBAC, ABAC, key agents, and workflow DSL. -keywords: [authorization, RBAC, ABAC, user, resource, action, context, workflow DSL] +keywords: [authorization, RBAC, ABAC, user, resource, action, context] --- # About Authorization @@ -33,7 +33,7 @@ Context refers to the circumstances or conditions under which a user's request f + `ctx.datasources.mongoose1..` from TS/JS files. Also you will need to create a folder `datasources/mongoose1/models` and keep your models there as detailed below. - You can override the default response codes for success cases for different methods by putting them in the datasource instance's yaml file @@ -101,12 +101,12 @@ module.exports = { }; ``` -### Sample Event and workflow +### Sample Event and function -### kafka workflow for Producer ( src/functions/kafka-publish.ts ) +### kafka function for Producer ( src/functions/kafka-publish.ts ) ```ts import { GSContext, PlainObject, GSStatus } from "@godspeedsystems/core"; @@ -125,7 +125,7 @@ kafka.publish-producer1.kafka_proj: # event key schema: type: string ``` -### kafka workflow for Consumer +### kafka function for Consumer (src/functions/kafka_consume.ts) ```ts import { GSContext, PlainObject, GSStatus } from "@godspeedsystems/core"; diff --git a/docs/microservices-framework/event-sources/event-types/cron-events.md b/docs/microservices-framework/event-sources/event-types/cron-events.md index 5b89dba..4516873 100644 --- a/docs/microservices-framework/event-sources/event-types/cron-events.md +++ b/docs/microservices-framework/event-sources/event-types/cron-events.md @@ -26,10 +26,10 @@ cron.* * * * *.Asia/Kolkata: # event key - `Asia/Kolkata`: This is a timezone specification. It indicates that the event is scheduled to run in the Asia/Kolkata timezone. Kolkata is a city in India, and this timezone corresponds to the Indian Standard Time (IST). -### Cron workflow to schedule ( src/functions/every_minute.ts ) +### Cron function to schedule ( src/functions/every_minute.ts ) ```ts import { GSCloudEvent, GSContext, PlainObject } from "@godspeedsystems/core"; diff --git a/docs/microservices-framework/event-sources/event-types/graphql-events.md b/docs/microservices-framework/event-sources/event-types/graphql-events.md index 5d9b83c..f229b96 100644 --- a/docs/microservices-framework/event-sources/event-types/graphql-events.md +++ b/docs/microservices-framework/event-sources/event-types/graphql-events.md @@ -37,7 +37,7 @@ apollo.post./mongo/category: // event key having prefix apollo type: object ``` -### Graphql Workflow +### Graphql function ```ts export default function (ctx: GSContext) { diff --git a/docs/microservices-framework/event-sources/event-types/kafka-events.md b/docs/microservices-framework/event-sources/event-types/kafka-events.md index b678b2f..ebaa12f 100644 --- a/docs/microservices-framework/event-sources/event-types/kafka-events.md +++ b/docs/microservices-framework/event-sources/event-types/kafka-events.md @@ -1,7 +1,7 @@ # Kafka event > A [Kafka](https://github.com/godspeedsystems/gs-plugins/tree/main/plugins/kafka-as-datasource-as-eventsource#godspeed-plugin-kafka-as-datasource-as-eventsource) event is specified as `{datasourceName}.{topic_name}.{group_id}` in [the Kafka event specification](#example-spec-for-kafka-event). -Within the Kafka event structure, the content of the message is captured and made accessible as `inputs.body`, facilitating its integration into the handler workflow for processing. +Within the Kafka event structure, the content of the message is captured and made accessible as `inputs.body`, facilitating its integration into the handler function for processing. #### Example spec for Kafka event @@ -21,7 +21,7 @@ Kafka.publish-producer1.kafka_proj: # event key required: ['message'] ``` -#### Example workflow consuming a Kafka event +#### Example function consuming a Kafka event ```ts import { GSContext, PlainObject, GSStatus } from "@godspeedsystems/core"; diff --git a/docs/microservices-framework/event-sources/events-overview.md b/docs/microservices-framework/event-sources/events-overview.md index fef3894..b0dbdd6 100644 --- a/docs/microservices-framework/event-sources/events-overview.md +++ b/docs/microservices-framework/event-sources/events-overview.md @@ -1,13 +1,13 @@ # Introduction To Events -Events are the core of creating responsive, real-time applications in godspeed. An event serves as a trigger that initiates specific actions or workflows based on defined conditions or inputs. Whether it’s an API call, a scheduled job, or a message arriving from a queue, events provide a structured way to handle incoming requests and data changes. - +Events are the core of creating responsive, real-time applications in godspeed. An event serves as a trigger that initiates specific actions or functions based on defined conditions or inputs. Whether it’s an API call, a scheduled job, or a message arriving from a queue, events provide a structured way to handle incoming requests and data changes. + ## What are Events in Godspeed? In the meta-framework world, we call all types of sync events (apis) and async events (ex. Kafka, Socket, Cron) as **Events**. Events are entry points into your Godspeed application, determining how the system should respond to various types of inputs. Each event can be configured with a unique set of properties that define: - **The Source of the Event:** For example, HTTP requests, Kafka messages, Cron schedules, or custom-defined sources. - **The Triggering Conditions:** Conditions or methods (like GET, POST, PUT for HTTP events) that specify when an event should activate. -- **The Actions or Workflows:** Functions or workflows that are executed when an event is triggered, containing the logic for handling the request or data. +- **The Actions or functions:** Functions that are executed when an event is triggered, containing the logic for handling the request or data. - To start using events, explore the different [Event Source Plugins](/docs/microservices-framework/event-sources/event-source-plugins/Overview) available in Godspeed and choose the ones that suit your application’s needs. diff --git a/docs/microservices-framework/event-sources/overview.md b/docs/microservices-framework/event-sources/overview.md index c93a6a1..154ca7e 100644 --- a/docs/microservices-framework/event-sources/overview.md +++ b/docs/microservices-framework/event-sources/overview.md @@ -3,9 +3,9 @@ title: Eventsources --- # About Eventsources - Eventsources in Godspeed framework captures event and allows you to define entry or trigger points of application. For ex. the `type: express` eventsource will allow you to expose your application through REST API or a `type: cron` eventsource will allow to schedule a recurring call to a workflow. + Eventsources in Godspeed framework captures event and allows you to define entry or trigger points of application. For ex. the `type: express` eventsource will allow you to expose your application through REST API or a `type: cron` eventsource will allow to schedule a recurring call to a function. - The eventsources listen on the incoming events. They process incoming event as per the middleware set by you, including [authentication](../authentication/overview.md). Finally, they transform it to Godspeed's standard `GSCloudEvent` object, which is then made available to the event handlers and subsequent child workflows. + The eventsources listen on the incoming events. They process incoming event as per the middleware set by you, including [authentication](../authentication/overview.md). Finally, they transform it to Godspeed's standard `GSCloudEvent` object, which is then made available to the event handlers and subsequent child functions. To have a look at supported eventsources and understanding their implementation, refer [Godspeed's gs-plugins mono-repo](https://github.com/godspeedsystems/gs-plugins). For ex. **[Kafka](https://github.com/godspeedsystems/gs-plugins/tree/main/plugins/kafka-as-datasource-as-eventsource#godspeed-plugin-kafka-as-datasource-as-eventsource)** diff --git a/docs/microservices-framework/event-sources/validations/schema-validation.md b/docs/microservices-framework/event-sources/validations/schema-validation.md index 4d64643..ab2fb90 100644 --- a/docs/microservices-framework/event-sources/validations/schema-validation.md +++ b/docs/microservices-framework/event-sources/validations/schema-validation.md @@ -6,7 +6,7 @@ The Framework provides request and response schema validation We have the ability to define inputs and their types in our request schema, such as path parameters, query parameters, and request body. This allows the framework to validate whether the API has received the specified inputs in the expected types. -Whenever an API is triggered, AJV (Another JSON Schema Validator) verifies the request schema against the provided inputs. If the defined schema matches the inputs, it allows the workflow to execute. Otherwise, it throws an error with a status code of 400 and a descriptive message indicating where the schema validation failed. +Whenever an API is triggered, AJV (Another JSON Schema Validator) verifies the request schema against the provided inputs. If the defined schema matches the inputs, it allows the function to execute. Otherwise, it throws an error with a status code of 400 and a descriptive message indicating where the schema validation failed. ### Sample Request Schema @@ -74,12 +74,12 @@ http.post./helloworld: Just like request schema validation, there's also response schema validation in place. In this process, the framework checks the response type, validates the properties of the response, and ensures they align with the specified types. -The process of response schema validation involves storing the response schema, enabling the workflow to execute, and checking the response body along with its properties for validation. +The process of response schema validation involves storing the response schema, enabling the function to execute, and checking the response body along with its properties for validation. Response schema validation includes two cases -- Failure in Workflow Execution -- Successful Workflow Execution but Fails in Response Schema Validation +- Failure in function Execution +- Successful function Execution but Fails in Response Schema Validation ### Sample Response Schema diff --git a/docs/microservices-framework/event-sources/write-apis.md b/docs/microservices-framework/event-sources/write-apis.md index d1b60d2..e364bce 100644 --- a/docs/microservices-framework/event-sources/write-apis.md +++ b/docs/microservices-framework/event-sources/write-apis.md @@ -60,7 +60,7 @@ To define an api endpoint, first you need to write an Event Schema. This schema **It involves specifying:** - The name/topic/URL of the event -- The event handler Workflow (fn) +- The event handler function (fn) - Input and Output schema - [Validation error handling](/docs/microservices-framework/event-sources/validations/schema-validation) - [Authorization checks](/docs/microservices-framework/authorization/overview.md) @@ -91,7 +91,7 @@ http.get./greet: #The initial line depicts a fusion of the event, the employed m #Other non-swagger components (optional) authn: #custom authentication. Currently plugins support JWT. Can be customized - authz: #your custom authz workflow + authz: #your custom authz function on_request_validation_error: #when validation fails on_response_validation_error: #when validation fails log: #Open Telemetry compliant log attributes which help debug and search through logs better @@ -105,7 +105,7 @@ Lets understand the first line from the above snippet `http.get./greet`. `/helloworld`: endpoint (In case of http and graphql sources. Can be groupId in case of Kafka for ex.) -We are exposing an endpoint with a `get` method on `http` protocol. This endpoint is calling an eventhandler called `helloworld` in the second line. Event handlers can be functions written in typescript and javascript workflows. In the above example the helloworld function exists in `src/functions` directory. +We are exposing an endpoint with a `get` method on `http` protocol. This endpoint is calling an eventhandler called `helloworld` in the second line. Event handlers can be functions written in typescript and javascript functions. In the above example the helloworld function exists in `src/functions` directory. ### Key Differences between a Sync and Async Event Schema @@ -192,7 +192,7 @@ In Godspeed, your function gets input in a standard JSON format and returns outp Click the link below to explore the complete anatomy of an event handler function written in TypeScript. It illustrates how to access inputs, use the GSContext, interact with datasources, and return responses correctly. -👉 [Full Example: Understanding Godspeed Function Structure](/docs/microservices-framework/workflows/native-language-functions.md#example-typescript-function) +👉 [Full Example: Understanding Godspeed Function Structure](/docs/microservices-framework/functions/native-language-functions.md#example-typescript-function) ### Test Your API diff --git a/docs/microservices-framework/workflows/native-language-functions.md b/docs/microservices-framework/functions/native-language-functions.md similarity index 95% rename from docs/microservices-framework/workflows/native-language-functions.md rename to docs/microservices-framework/functions/native-language-functions.md index 685e83c..3104198 100644 --- a/docs/microservices-framework/workflows/native-language-functions.md +++ b/docs/microservices-framework/functions/native-language-functions.md @@ -1,6 +1,6 @@ # Writing functions in Godspeed -Since the framework currently supports Node.js, Deno and Bun.js ecosystems, the native languages currently supported are TypeScript and JavaScript. This allows users to create custom functions. A native language workflow enables us to incorporate additional features using JavaScript or TypeScript, where we have the capability to implement intricate business logic. +Since the framework currently supports Node.js, Deno and Bun.js ecosystems, the native languages currently supported are TypeScript and JavaScript. This allows users to create custom functions. A native language function enables us to incorporate additional features using JavaScript or TypeScript, where we have the capability to implement intricate business logic. :::tip In Godspeed, your function gets input in a standard JSON format and returns output in a standard JSON format, independent of the eventsource through which this function is triggered. Eventsource could be Express, Fastify, Apollo Graphql or event message bus like Kafka, RabbitMQ or socket message. This means Godspeed has a unified way to deal with all eventsources, providing a modular architecture and re-uasability of your functions. @@ -24,8 +24,8 @@ export default function (ctx: GSContext) { }, childLogger, // context specific logger. Read pino childLogger for more information logger, // Basic logger of the project, generally prefer childLogger for logging - outputs, // outputs of previously executed tasks of yaml workflows (if any) - functions, // all loaded workflows/functions from the src/functions/ folder + outputs, // outputs of previously executed tasks + functions, // all loaded functions from the src/functions/ folder datasources, //all configured datasources from src/datasources mappings //mappings from src/mappings folder. this is useful for loading key value configurations for business logic of your project }: { @@ -74,15 +74,15 @@ For seeing how framework handles data returned from a function, including calcul ### GSContext -GSContext carries the loaded components of this project and as well the inputs of the current event. Every information you need to know or store about the event and the workflow executed so far, and as well the loaded `functions`, `datasources`, `logger`, `childLogger`, `config`, `mappings` etc, is available in the `GSContext` object. +GSContext carries the loaded components of this project and as well the inputs of the current event. Every information you need to know or store about the event and the function executed so far, and as well the loaded `functions`, `datasources`, `logger`, `childLogger`, `config`, `mappings` etc, is available in the `GSContext` object. :::tip note - Every function/workflow has access to the ctx object, which is passed as an argument, and furthermore, you can access its properties by destructuring it. + Every function has access to the ctx object, which is passed as an argument, and furthermore, you can access its properties by destructuring it. ::: ### More about GSContext -Check the code of GSContext interface [here](https://github.com/godspeedsystems/gs-node-service/blob/v2/src/core/interfaces.ts). GSContext has the contextual information of your current workflow and is available to the event handlers (`functions`). It is passed to any sub workflows subsequently called by the event handler. +Check the code of GSContext interface [here](https://github.com/godspeedsystems/gs-node-service/blob/v2/src/core/interfaces.ts). GSContext has the contextual information of your current function and is available to the event handlers (`functions`). It is passed to any sub functions subsequently called by the event handler. It includes all the context specific information like tracing information, actor, environment, headers, payload etc. diff --git a/docs/microservices-framework/workflows/overview.md b/docs/microservices-framework/functions/overview.md similarity index 87% rename from docs/microservices-framework/workflows/overview.md rename to docs/microservices-framework/functions/overview.md index 4b99e94..c8efb85 100644 --- a/docs/microservices-framework/workflows/overview.md +++ b/docs/microservices-framework/functions/overview.md @@ -1,8 +1,8 @@ --- -title: Functions (Event Handler Workflows) +title: Functions (Event Handlers) --- -The Meta Framework allows you to write business logic in [Typescript and Javascript functions](/docs/microservices-framework/workflows/native-language-functions.md) +The Meta Framework allows you to write business logic in [Typescript and Javascript functions](/docs/microservices-framework/functions/native-language-functions.md) You may use any language depending on your choice. We suggest to prefer Typescript over Javascript for type check reasons. diff --git a/docs/microservices-framework/workflows/response-serialization.md b/docs/microservices-framework/functions/response-serialization.md similarity index 100% rename from docs/microservices-framework/workflows/response-serialization.md rename to docs/microservices-framework/functions/response-serialization.md diff --git a/docs/microservices-framework/guide/first-project.md b/docs/microservices-framework/guide/first-project.md index c72d475..a878f89 100644 --- a/docs/microservices-framework/guide/first-project.md +++ b/docs/microservices-framework/guide/first-project.md @@ -107,7 +107,7 @@ In the Godspeed meta-framework, every API (REST or GraphQL) and message (websock This naming convention might be new to you. While the broader developer community typically refers to only `async events` (like Kafka or websocket messages) as `events`, Godspeed considers both synchronous APIs (REST, GraphQL) and asynchronous events (Message bus, websocket, cron) as `events`. ::: -#### Testing API Input and Output Validation +### Testing API Input and Output Validation Godspeed provides built-in validation for data sent to and from your APIs, ensuring data integrity. diff --git a/docs/microservices-framework/guides.md b/docs/microservices-framework/guides.md index 521028f..1083fa1 100644 --- a/docs/microservices-framework/guides.md +++ b/docs/microservices-framework/guides.md @@ -1,15 +1,16 @@ --- sidebar_position: 1 title: Guides and FAQs -description: A collection of guides and frequently asked questions about using the Godspeed Meta-Framework, covering topics such as setting up APIs, writing workflows and functions, and accessing datasources. -keywords: [Godspeed, guides, FAQs, API setup, workflows, functions, datasources, REST API, CRUD API, Swagger UI, Postman, authentication, JWT, OAuth2, callbacks, webhooks, TypeScript, inline scripting, databases, datastores, plugins, environment variables, secrets] +description: A collection of guides and frequently asked questions about using the Godspeed Meta-Framework, covering topics such as setting up APIs, writing functions, and accessing datasources. +keywords: [Godspeed, guides, FAQs, API setup, functions, datasources, REST API, CRUD API, Swagger UI, Postman, authentication, JWT, OAuth2, callbacks, webhooks, TypeScript, inline scripting, databases, datastores, plugins, environment variables, secrets] --- -This section provides answers to common questions and step-by-step guides for using the Godspeed Meta-Framework. It covers essential topics including setting up and securing APIs (REST, CRUD, Swagger, Postman, JWT, OAuth2), writing business logic using workflows and functions (TypeScript and Javascript), and accessing various datasources like databases, APIs, and caches. +This section provides answers to common questions and step-by-step guides for using the Godspeed Meta-Framework. It covers essential topics including setting up and securing APIs (REST, CRUD, Swagger, Postman, JWT, OAuth2), writing business logic using functions (TypeScript and Javascript), and accessing various datasources like databases, APIs, and caches. ### What is Godspeed? -Godspeed is a **4th generation declarative microservice framework** for Node.js that simplifies backend development. It emphasizes **configuration-over-code**, allowing developers to build event-driven and API-based applications quickly using YAML schemas and minimal boilerplate. It supports both synchronous and asynchronous event sources like HTTP, Kafka, and Cron, and integrates with external systems via plugins. +Godspeed is industry’s first opinionated 4th generation framework for building modern APIs and event-driven systems with less effort, high quality and easy maintenance. It’s designed to reduce lines of code, prevent chaos in development, build with confidence and reliability. It follows godspeed philosophy to focus on the what, and not the how. +Currently, it fully supports the Node.js ecosystem. On the polyglot roadmap, Godspeed aims to support multiple languages (Java, Go, Python, etc.). ### [How to install godspeed ?](/docs/get-started#install-godspeed) @@ -58,7 +59,7 @@ godspeed plugin add @godspeedsystems/plugins-websocket-as-eventsource ``` Check the auto generated eventsource configuration file `src/eventsources/.yaml` to configure it as per your requirements. -Then start writing events and workflows. +Then start writing events and functions. ### How does the Godspeed CLI help developers? @@ -140,7 +141,7 @@ They are loaded dynamically via YAML configurations where you specify the `type` It asks to you select your prisma schema file and eventsource you are using, then it scans your **Prisma schema** and automatically generates: * API event definitions -* Workflows for Create, Read, Update, Delete operations +* functions for Create, Read, Update, Delete operations * That can be tested via Swagger UI immediately This command eliminates boilerplate and accelerates backend setup. @@ -177,10 +178,10 @@ Swagger JSON specs are auto-generated and stored under `src/docs/http-swagger.js ### What are the key classes and extensibility points in the Godspeed framework? -Godspeed is built around a set of core classes and interfaces that provide consistency, extensibility, and observability across workflows, plugins, and event handling. Key components include: +Godspeed is built around a set of core classes and interfaces that provide consistency, extensibility, and observability across functions, plugins, and event handling. Key components include: **GSContext** -The execution context available in every function, workflow, and plugin. +The execution context available in every function, and plugin. Contains inputs, outputs, config, datasources, functions, logger, and more. Enables full traceability, logging, and resource access during event execution. @@ -189,7 +190,7 @@ Represents the incoming request or event in a standard format (CloudEvents spec) Contains data, actor, headers, and other metadata. **GSStatus** -Standard response object used to represent the outcome of any function or workflow. +Standard response object used to represent the outcome of any function. Contains success, code, message, data, etc. **Plugin Base Classes** @@ -218,16 +219,16 @@ Eventsources are initialized — Plugins like Express or Kafka are set up from s Event definitions are loaded — Event handlers (HTTP routes, Kafka topics, etc.) are mapped to their respective functions via src/events/. -Functions and workflows are loaded — All TypeScript and YAML-based logic from src/functions/ becomes available for invocation. +Functions are loaded — All TypeScript and YAML-based logic from src/functions/ becomes available for invocation. Mappings and validations are loaded — Static key-value maps and request/response validation logic are pulled from src/mappings/ and src/functions/validations/. -App is ready — The service is now ready to process events, serve API requests, and run workflows based on triggers. +App is ready — The service is now ready to process events, serve API requests, and run functions based on triggers. ### How is authentication handled in Godspeed? -Godspeed supports robust and flexible authentication mechanisms using JWT, OAuth2, and custom auth workflows. Here's how you can secure your services: +Godspeed supports robust and flexible authentication mechanisms using JWT, OAuth2, and custom auth functions. Here's how you can secure your services: **Authentication Methods** **JWT/OAuth2:** Configure these directly in your eventsource (e.g., Express) or datasource YAML files. @@ -248,20 +249,20 @@ authn: client_secret: ``` **GSActor Support** -Godspeed provides a GSActor object in every GSCloudEvent, which captures the identity and attributes of the user or system triggering the event. This makes it easy to propagate user context across workflows. +Godspeed provides a GSActor object in every GSCloudEvent, which captures the identity and attributes of the user or system triggering the event. This makes it easy to propagate user context across functions. **Best Practices** Always validate JWT tokens and propagate the actor through the GSContext. -Use role-based checks in your workflow logic or via authz tasks. +Use role-based checks in your function logic or via authz tasks. Keep your secrets and auth config in the environment-safe config/ directory. -### How do events trigger workflows in Godspeed? -In Godspeed, events are declarative triggers that activate functions or workflows. These events are typically configured in YAML files under src/events/, and are mapped to logic defined in src/functions/. +### How do events trigger functions in Godspeed? +In Godspeed, events are declarative triggers that activate functions. These events are typically configured in YAML files under src/events/, and are mapped to logic defined in src/functions/. -**Event-to-Function/Workflow Flow** +**Event-to-Function Flow** An event occurs — For example, an HTTP request, Kafka message, or Cron schedule. -Event is mapped to a function/workflow — The fn: field in the event YAML points to a corresponding handler. -Function/Workflow executes — The handler processes the request using the provided GSContext. +Event is mapped to a function — The fn: field in the event YAML points to a corresponding handler. +Function executes — The handler processes the request using the provided GSContext. ### Setting up the APIs of your service @@ -287,18 +288,13 @@ Function/Workflow executes — The handler processes the request using the provi -### Writing your Workflows or Functions -In Godspeed, the words Workflows and Functions mean one and the same thing, i.e. your business logic. - -- **[How to write typescript workflows in godspeed?](/docs/microservices-framework/workflows/native-language-functions)** +### Writing your Functions +- **[How to write typescript functions in godspeed?](/docs/microservices-framework/functions/native-language-functions)** - **[How to use inline scripting in Godspeed YAML configurations ?](/docs/microservices-framework/inline-scripting/overview)** - - - -### Accessing other APIs, databases and datastores from workflows +### Accessing other APIs, databases and datastores from functions In Godspeed, datasource can mean any place where you send or retrieve data from. It could mean: - External APIs - Datastores @@ -317,9 +313,9 @@ In Godspeed, datasource can mean any place where you send or retrieve data from. - **[How to access any datastore by creating a custom datasource?](/docs/microservices-framework/datasources/create-custom-datasource)** -- **[How to invoke datasource clients from typescript workflows?](/docs/microservices-framework/how-to/call-datasource)** +- **[How to invoke datasource clients from typescript functions?](/docs/microservices-framework/how-to/call-datasource)** -- **[How to access the environment variables from the typescript workflows?](/docs/microservices-framework/how-to/short-faqs)** +- **[How to access the environment variables from the typescript functions?](/docs/microservices-framework/how-to/short-faqs)** - **[How to update and run the project after renaming any file?](/docs/microservices-framework/how-to/short-faqs#how-to-update-and-run-the-project-after-renaming-any-file)** diff --git a/docs/microservices-framework/how-to/axios-apis.md b/docs/microservices-framework/how-to/axios-apis.md index 53e8e7f..54dbca9 100644 --- a/docs/microservices-framework/how-to/axios-apis.md +++ b/docs/microservices-framework/how-to/axios-apis.md @@ -4,7 +4,7 @@ In Godspeed, Axios is used as a datasource plugin for making HTTP requests to ex This allows your application to communicate with third-party services or other microservices by sending requests and receiving responses in a structured way. Axios simplifies the process of making requests, handling authentication, managing headers, handling errors, -and retrying requests, which is especially useful for complex workflows or external integrations. +and retrying requests, which is especially useful for complex functions or external integrations. ## Step-by-Step Guide: @@ -36,7 +36,7 @@ In this file, you can set the base URL and any custom headers or authentication headers: # to set Common headers in all API calls Content-Type: application/json - Cookie: <%mappings.my_bank.auth_workflow_cookie%> + Cookie: <%mappings.my_bank.auth_function_cookie%> # Retry logic for failed API calls for ex on Internal server errors or request timeouts retry: @@ -57,12 +57,12 @@ In this file, you can set the base URL and any custom headers or authentication ### Step 2: Set Up an Event -1. **Create an Event to Trigger the Workflow**: Define an HTTP event to trigger the workflow and call the third-party API. +1. **Create an Event to Trigger the function**: Define an HTTP event to trigger the function and call the third-party API. Example `fetchData.yaml`: ```yaml http.get./fetch-data: - fn: fetchDataWorkflow + fn: fetchDatafunction authn: false responses: 200: @@ -73,13 +73,13 @@ http.get./fetch-data: ``` ### Explanation: - **http.get./fetch-data:**: The first line of any http event defines the (protocol.Method./end-point) - Here, /fetch-data is the end point which will send a get request to third party API by calling a workflow. - - **fn**: fn defines the workflow function to be called. here it is, fetchDataWorkflow. + Here, /fetch-data is the end point which will send a get request to third party API by calling a function. + - **fn**: fn defines the function function to be called. here it is, fetchDatafunction. -### Step 3: Set Up Workflow to Use the Axios Datasource +### Step 3: Set Up function to Use the Axios Datasource - Go to `src/functions/` and create a file (e.g., `fetchDataWorkflow.ts`).Use the Axios configuration to make the API call. You can specify the endpoint, HTTP method, and any parameters needed for the request. + Go to `src/functions/` and create a file (e.g., `fetchDatafunction.ts`).Use the Axios configuration to make the API call. You can specify the endpoint, HTTP method, and any parameters needed for the request. ```ts import { GSContext, GSDataSource, logger, PlainObject } from "@godspeedsystems/core"; @@ -100,7 +100,7 @@ export default async function (ctx: GSContext) { +## Step 1: [Install Godspeed Framework](/docs/microservices-framework/guide/get-started.md) -## Step 1: [Install Saarthi in VS Code](/docs/saarthi/getting-started/installing.mdx) +## Step 2: [Install Saarthi in VS Code](/docs/saarthi/getting-started/installing.mdx) -## Step 2: Open Saarthi & Select [Code Mode](/docs/saarthi/modes/code.md) +## Step 3: Open Saarthi & Select [Code Mode](/docs/saarthi/modes/code.md) 1. From VS Code sidebar, Open **Saarthi** -3. Choose `💻 Code` from the mode selector - -> Saarthi will now automatically connect to **RAG node MCP Server**, for context-aware coding with Godspeed framework. - ---- +2. Choose `💻 Code` from the mode selector -## Step 3: Create Your First Microservice — Just One Prompt +> Saarthi will now automatically connect to **GS MCP Server**, for context-aware coding with Godspeed framework. -In the Saarthi chat box, type: +## Step 4: Enter Prompt +In the Saarthi chat box, type what you want to build. For Example: ``` Create a godspeed microservice for product catalog with CRUD operations using Postgres database. ``` @@ -79,18 +53,8 @@ All with framework-aligned best practices and zero boilerplate. --- -## Step 4: Run Your Service Locally - -```bash -cd -godspeed serve -``` - -Test your endpoints instantly in Swagger UI. - ---- +**[Understand your first godspeed project →](/docs/microservices-framework/guide/first-project#understanding-your-first-godspeed-project)** -## Meet Your Multi-Agent Team -[Explore Saarthi Agent Modes →](/docs/saarthi/basic-usage/using-modes.md) +**[Explore Saarthi Agent Modes →](/docs/saarthi/basic-usage/using-modes.md)** diff --git a/sidebars.js b/sidebars.js index 48b39ef..63a215d 100644 --- a/sidebars.js +++ b/sidebars.js @@ -35,19 +35,14 @@ const sidebars = { }, { type: "doc", - label: "1.2. Why Godspeed?", - id: "microservices-framework/introduction/benefits", + label: "1.2. Guard Rails", + id: "microservices-framework/introduction/guard-rails", }, { type: "doc", - label: "1.3. Design Principles", + label: "1.3. Features", id: "microservices-framework/introduction/design-principles", }, - { - type: "doc", - label: "1.4. Guard Rails", - id: "microservices-framework/introduction/guard-rails", - }, ], }, { @@ -66,7 +61,7 @@ const sidebars = { }, { type: "doc", - label: "2.3. Detailed Walthrough", + label: "2.3. Detailed Walkthrough", id: "microservices-framework/guide/walkthrough", }, { @@ -211,17 +206,17 @@ const sidebars = { { type: "doc", label: "8.1. Overview", - id: "microservices-framework/workflows/overview", + id: "microservices-framework/functions/overview", }, { type: "doc", label: "8.2. Typescript and Javascript functions", - id: "microservices-framework/workflows/native-language-functions", + id: "microservices-framework/functions/native-language-functions", }, { type: "doc", label: "8.3. Response Serialization", - id: "microservices-framework/workflows/response-serialization", + id: "microservices-framework/functions/response-serialization", } ], }, @@ -450,11 +445,11 @@ const sidebars = { label: "15.6. Logs", id: "microservices-framework/telemetry/logging", }, - { - type: "doc", - label: "16.3. Custom traces, logs and metrics (BPM)", - id: "microservices-framework/telemetry/custom-metrics-logs-traces" - }, + // { + // type: "doc", + // label: "16.3. Custom traces, logs and metrics (BPM)", + // id: "microservices-framework/telemetry/custom-metrics-logs-traces" + // }, ], }, {