├── manager ├── src │ ├── tests │ │ └── mod.rs │ ├── handlers │ │ ├── ai_session_handlers.rs │ │ └── mod.rs │ ├── helpers │ │ └── mod.rs │ ├── database │ │ └── mod.rs │ ├── lib.rs │ ├── git.rs │ └── error.rs ├── test-config.toml ├── prompts │ └── default.toml ├── tests │ ├── project_api.rs │ ├── auth_system.rs │ ├── permission_integration_test.rs │ └── scan_endpoint_super_admin.rs └── Cargo.toml ├── desktop-app ├── src │ ├── ui │ │ ├── mod.rs │ │ └── projects.rs │ ├── services │ │ └── mod.rs │ ├── lib.rs │ ├── components │ │ ├── mod.rs │ │ ├── project_card.rs │ │ ├── message_renderer.rs │ │ └── status_bar.rs │ ├── pages │ │ ├── mentions.rs │ │ └── mod.rs │ ├── state │ │ └── connection.rs │ └── config.rs ├── fonts │ ├── Inter-Medium.ttf │ ├── Inter-Regular.ttf │ ├── Inter-SemiBold.ttf │ ├── UbuntuSans-Light.ttf │ ├── UbuntuSans-SemiBold.ttf │ └── README.md └── Cargo.toml ├── nocodo-llm-sdk ├── src │ ├── glm │ │ ├── zen │ │ │ └── mod.rs │ │ ├── cerebras │ │ │ └── mod.rs │ │ ├── tools.rs │ │ └── mod.rs │ ├── grok │ │ ├── xai │ │ │ └── mod.rs │ │ ├── zen │ │ │ └── mod.rs │ │ ├── tools.rs │ │ └── mod.rs │ ├── openai │ │ ├── mod.rs │ │ └── tools.rs │ ├── claude │ │ ├── mod.rs │ │ └── tools.rs │ ├── client.rs │ ├── providers.rs │ ├── error.rs │ └── types.rs ├── .gitignore ├── test-config.example.toml ├── Cargo.toml ├── examples │ ├── openai_completion.rs │ ├── grok_completion.rs │ ├── glm_completion.rs │ ├── simple_completion.rs │ ├── gpt51_codex_responses.rs │ ├── zen_grok_free.rs │ ├── tool_calling_weather.rs │ └── tool_calling_agent.rs ├── TEST_RUNNER.md ├── tests │ ├── grok_integration.rs │ ├── claude_integration.rs │ ├── glm_integration.rs │ ├── zen_grok_integration.rs │ ├── zen_glm_integration.rs │ └── gpt_integration.rs ├── bin │ └── test_runner.rs └── external-docs │ └── opencode_zen_docs.md ├── website ├── src │ ├── assets │ │ ├── Warp_nocodo_ClaudeCode.png │ │ ├── nocodo_Analysing_Own_Code.png │ │ ├── nocodo_Connect_Remote_Within_LAN.png │ │ ├── nocodo_Connection_Screen_Local_Remote_SSH_Options.png │ │ ├── nocodo_Board_Writing_a_Prompt_Existing_Prompt_List_Work_Details.png │ │ ├── background.svg │ │ └── astro.svg │ ├── content │ │ ├── about │ │ │ ├── shipping-and-delivery.md │ │ │ ├── contact-us.md │ │ │ ├── cancellation-and-refund.md │ │ │ ├── terms-and-conditions.md │ │ │ └── privacy-policy.md │ │ ├── config.ts │ │ └── fundamentals │ │ │ ├── git-basics.md │ │ │ ├── cicd-intro.md │ │ │ └── testing-fundamentals.md │ ├── types │ │ └── content.ts │ ├── pages │ │ ├── contact-us.astro │ │ ├── privacy-policy.astro │ │ ├── shipping-and-delivery.astro │ │ ├── cancellation-and-refund.astro │ │ ├── terms-and-conditions.astro │ │ └── blog │ │ │ └── index.astro │ ├── components │ │ ├── theme │ │ │ ├── ContentBox.astro │ │ │ ├── PageHeader.astro │ │ │ ├── SectionHeader.astro │ │ │ ├── index.ts │ │ │ ├── Card.astro │ │ │ ├── NavLink.astro │ │ │ ├── FeatureCard.astro │ │ │ ├── Section.astro │ │ │ ├── IconBadge.astro │ │ │ └── Button.astro │ │ ├── UI │ │ │ ├── Prompt.astro │ │ │ ├── Terminal.astro │ │ │ ├── WorkflowList.astro │ │ │ ├── Button.astro │ │ │ └── Card.astro │ │ ├── Footer.astro │ │ └── Header.astro │ ├── styles │ │ └── global.css │ └── layouts │ │ ├── PolicyLayout.astro │ │ └── Layout.astro ├── tsconfig.json ├── test-ci.md ├── astro.config.mjs ├── .gitignore ├── package.json ├── public │ └── favicon.svg └── Claude.md ├── .cargo ├── config.toml └── README.md ├── nocodo-github-actions ├── bindings │ ├── Runner.ts │ ├── CronSchedule.ts │ ├── ScanWorkflowsRequest.ts │ ├── BranchConfig.ts │ ├── ExecuteCommandRequest.ts │ ├── Trigger.ts │ ├── WorkflowInfo.ts │ ├── ExecuteCommandResponse.ts │ ├── Workflow.ts │ ├── CommandExecution.ts │ ├── Step.ts │ ├── Job.ts │ ├── ScanWorkflowsResponse.ts │ ├── TriggerConfig.ts │ └── WorkflowCommand.ts ├── src │ ├── main.rs │ ├── lib.rs │ ├── error.rs │ └── executor.rs ├── test_workflows │ └── ci.yml ├── Cargo.toml └── README.md ├── deny.toml ├── manager-models └── Cargo.toml ├── .rustfmt.toml ├── manager-tools ├── src │ ├── lib.rs │ └── tool_error.rs └── Cargo.toml ├── NOTICE.md ├── .gitignore ├── clippy.toml ├── Cargo.toml ├── specs ├── IMPROVE_GREP.md ├── DESKTOP_APP_STYLING.md └── users_inputs │ └── MVP_THOUGHTS.txt ├── tasks ├── project-commands-with-llm-integration-e2e-test.md ├── store-command-discovery-as-work.md ├── project-commands-with-llm-integration-phase3-e2e-test.md └── desktop-app-display-all-tool-calls.md ├── .github └── workflows │ └── website-ci.yml └── scripts ├── release-desktop-app.sh └── release-manager.sh /manager/src/tests/mod.rs: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /desktop-app/src/ui/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod projects; 2 | -------------------------------------------------------------------------------- /manager/src/handlers/ai_session_handlers.rs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /manager/src/helpers/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod git_operations; 2 | pub mod project; -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/glm/zen/mod.rs: -------------------------------------------------------------------------------- 1 | mod client; 2 | pub use client::ZenGlmClient; -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/grok/xai/mod.rs: -------------------------------------------------------------------------------- 1 | mod client; 2 | pub use client::XaiGrokClient; -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/grok/zen/mod.rs: -------------------------------------------------------------------------------- 1 | mod client; 2 | pub use client::ZenGrokClient; -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/glm/cerebras/mod.rs: -------------------------------------------------------------------------------- 1 | mod client; 2 | pub use client::CerebrasGlmClient; -------------------------------------------------------------------------------- /manager/src/database/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod common; 2 | pub mod project_commands; 3 | 4 | pub use common::*; -------------------------------------------------------------------------------- /desktop-app/fonts/Inter-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/desktop-app/fonts/Inter-Medium.ttf -------------------------------------------------------------------------------- /desktop-app/fonts/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/desktop-app/fonts/Inter-Regular.ttf -------------------------------------------------------------------------------- /desktop-app/fonts/Inter-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/desktop-app/fonts/Inter-SemiBold.ttf -------------------------------------------------------------------------------- /desktop-app/fonts/UbuntuSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/desktop-app/fonts/UbuntuSans-Light.ttf -------------------------------------------------------------------------------- /desktop-app/fonts/UbuntuSans-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/desktop-app/fonts/UbuntuSans-SemiBold.ttf -------------------------------------------------------------------------------- /desktop-app/src/services/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod api; 2 | pub mod background_tasks; 3 | 4 | pub use api::*; 5 | pub use background_tasks::*; 6 | -------------------------------------------------------------------------------- /website/src/assets/Warp_nocodo_ClaudeCode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/website/src/assets/Warp_nocodo_ClaudeCode.png -------------------------------------------------------------------------------- /website/src/assets/nocodo_Analysing_Own_Code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/website/src/assets/nocodo_Analysing_Own_Code.png -------------------------------------------------------------------------------- /website/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "include": [".astro/types.d.ts", "**/*"], 4 | "exclude": ["dist"] 5 | } 6 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/glm/tools.rs: -------------------------------------------------------------------------------- 1 | // GLM tool format implementation (reuses OpenAI format) 2 | pub use crate::openai::tools::OpenAIToolFormat as GlmToolFormat; -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | incremental = true 3 | 4 | [target.x86_64-unknown-linux-gnu] 5 | linker = "clang" 6 | rustflags = ["-C", "link-arg=-fuse-ld=mold"] -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/grok/tools.rs: -------------------------------------------------------------------------------- 1 | // Grok tool format implementation (reuses OpenAI format) 2 | pub use crate::openai::tools::OpenAIToolFormat as GrokToolFormat; -------------------------------------------------------------------------------- /website/src/assets/nocodo_Connect_Remote_Within_LAN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/website/src/assets/nocodo_Connect_Remote_Within_LAN.png -------------------------------------------------------------------------------- /website/src/content/about/shipping-and-delivery.md: -------------------------------------------------------------------------------- 1 | # Shipping and Delivery 2 | 3 | Last updated on Sep 1 2025 4 | 5 | Shipping is not applicable for nocodo. 6 | -------------------------------------------------------------------------------- /website/src/assets/nocodo_Connection_Screen_Local_Remote_SSH_Options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/website/src/assets/nocodo_Connection_Screen_Local_Remote_SSH_Options.png -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/Runner.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export type Runner = string | Array; -------------------------------------------------------------------------------- /website/src/types/content.ts: -------------------------------------------------------------------------------- 1 | // Content frontmatter types 2 | export interface ContentFrontmatter { 3 | title?: string; 4 | description?: string; 5 | tags?: string; 6 | [key: string]: any; 7 | } -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/CronSchedule.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface CronSchedule { cron: string, } -------------------------------------------------------------------------------- /nocodo-llm-sdk/.gitignore: -------------------------------------------------------------------------------- 1 | # Test configuration with API keys (keep private) 2 | test-config.toml 3 | 4 | # Binary build outputs from test runner 5 | /bin/**/*.exe 6 | /bin/**/*.dll 7 | /bin/**/*.so 8 | /bin/**/*.dylib 9 | -------------------------------------------------------------------------------- /website/src/assets/nocodo_Board_Writing_a_Prompt_Existing_Prompt_List_Work_Details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainless/nocodo/HEAD/website/src/assets/nocodo_Board_Writing_a_Prompt_Existing_Prompt_List_Work_Details.png -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/ScanWorkflowsRequest.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface ScanWorkflowsRequest { project_id: string, } -------------------------------------------------------------------------------- /website/test-ci.md: -------------------------------------------------------------------------------- 1 | # CI Test File 2 | 3 | This is a test file to verify that the GitHub Actions CI workflow triggers correctly when changes are made to the website directory. 4 | 5 | This file can be removed after testing the CI workflow. -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/BranchConfig.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface BranchConfig { branches: Array | null, branches_ignore: Array | null, } -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/ExecuteCommandRequest.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface ExecuteCommandRequest { command_id: string, timeout_seconds: bigint | null, } -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/Trigger.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { TriggerConfig } from "./TriggerConfig"; 3 | 4 | export type Trigger = string | Array | TriggerConfig; -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/WorkflowInfo.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface WorkflowInfo { name: string, file_path: string, jobs_count: number, commands_count: number, } -------------------------------------------------------------------------------- /manager/test-config.toml: -------------------------------------------------------------------------------- 1 | [server] 2 | host = "127.0.0.1" 3 | port = 8082 4 | 5 | [database] 6 | path = "/tmp/nocodo-test.db" 7 | 8 | [socket] 9 | path = "/tmp/nocodo-manager-test.sock" 10 | 11 | # JWT secret for testing 12 | jwt_secret = "test-jwt-secret-for-development-only" -------------------------------------------------------------------------------- /website/astro.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { defineConfig } from 'astro/config'; 3 | import tailwindcss from '@tailwindcss/vite'; 4 | 5 | // https://astro.build/config 6 | export default defineConfig({ 7 | vite: { 8 | plugins: [tailwindcss()], 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/ExecuteCommandResponse.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { CommandExecution } from "./CommandExecution"; 3 | 4 | export interface ExecuteCommandResponse { execution: CommandExecution, } -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/Workflow.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { Job } from "./Job"; 3 | import type { Trigger } from "./Trigger"; 4 | 5 | export interface Workflow { name: string | null, on: Trigger, jobs: Record, } -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/CommandExecution.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface CommandExecution { command_id: string, exit_code: number | null, stdout: string, stderr: string, duration_ms: bigint, executed_at: string, success: boolean, } -------------------------------------------------------------------------------- /desktop-app/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod api_client; 2 | pub mod app; 3 | pub mod config; 4 | pub mod connection_manager; 5 | 6 | pub mod ssh; 7 | pub mod ui; 8 | pub mod ui_text; 9 | 10 | // New modular architecture 11 | pub mod components; 12 | pub mod pages; 13 | pub mod services; 14 | pub mod state; 15 | 16 | pub use app::DesktopApp; 17 | -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/Step.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface Step { id: string | null, name: string | null, uses: string | null, run: string | null, shell: string | null, "working-directory": string | null, env: Record | null, } -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/openai/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod builder; 2 | pub mod client; 3 | pub mod tools; 4 | pub mod types; 5 | 6 | pub use builder::{OpenAIMessageBuilder, OpenAIResponseBuilder}; 7 | pub use client::OpenAIClient; 8 | pub use tools::OpenAIToolFormat; 9 | pub use types::*; 10 | 11 | // Re-export OpenAI model constants 12 | pub use crate::models::openai::*; -------------------------------------------------------------------------------- /manager/prompts/default.toml: -------------------------------------------------------------------------------- 1 | [tech_stack_analysis] 2 | prompt = "What is the tech stack of this project, including programming languages, databases, frameworks? Please list files and examine config files like package.json, pyproject.toml, manage.py, requirements.txt, etc. before providing your final answer. Read each file you deem necessary. Only return a list of technologies" 3 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/claude/mod.rs: -------------------------------------------------------------------------------- 1 | //! Claude (Anthropic) LLM client implementation 2 | 3 | pub mod builder; 4 | pub mod client; 5 | pub mod tools; 6 | pub mod types; 7 | 8 | pub use builder::MessageBuilder; 9 | pub use client::ClaudeClient; 10 | pub use tools::ClaudeToolFormat; 11 | 12 | // Re-export Claude model constants 13 | pub use crate::models::claude::*; 14 | -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/Job.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { Runner } from "./Runner"; 3 | import type { Step } from "./Step"; 4 | 5 | export interface Job { "runs-on": Runner, steps: Array, needs: Array | null, environment: string | null, "working-directory": string | null, } -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/ScanWorkflowsResponse.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { WorkflowCommand } from "./WorkflowCommand"; 3 | import type { WorkflowInfo } from "./WorkflowInfo"; 4 | 5 | export interface ScanWorkflowsResponse { workflows: Array, commands: Array, } -------------------------------------------------------------------------------- /website/.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | 4 | # generated types 5 | .astro/ 6 | 7 | # dependencies 8 | node_modules/ 9 | 10 | # logs 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # environment variables 17 | .env 18 | .env.production 19 | 20 | # macOS-specific files 21 | .DS_Store 22 | 23 | # jetbrains setting folder 24 | .idea/ 25 | -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/TriggerConfig.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | import type { BranchConfig } from "./BranchConfig"; 3 | import type { CronSchedule } from "./CronSchedule"; 4 | 5 | export interface TriggerConfig { push: BranchConfig | null, pull_request: BranchConfig | null, schedule: Array | null, } -------------------------------------------------------------------------------- /nocodo-github-actions/bindings/WorkflowCommand.ts: -------------------------------------------------------------------------------- 1 | // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. 2 | 3 | export interface WorkflowCommand { id: string, workflow_name: string, job_name: string, step_name: string | null, command: string, shell: string | null, working_directory: string | null, environment: Record | null, file_path: string, } -------------------------------------------------------------------------------- /website/src/content/about/contact-us.md: -------------------------------------------------------------------------------- 1 | # Contact Us 2 | 3 | Last updated on Sep 1 2025 4 | 5 | You may contact us using the information below: 6 | 7 | Merchant Legal entity name: PIXLIE WEB SOLUTIONS PRIVATE LIMITED 8 | Registered Address: 103 Kamalapur East, Dum Dum Kolkata WEST BENGAL 700028 9 | Operational Address: 103 Kamalapur East, Dum Dum Kolkata WEST BENGAL 700028 10 | E-Mail ID: nocodo@pixlie.com 11 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/client.rs: -------------------------------------------------------------------------------- 1 | use crate::{ 2 | error::LlmError, 3 | types::{CompletionRequest, CompletionResponse}, 4 | }; 5 | 6 | /// Core trait for LLM clients 7 | #[allow(async_fn_in_trait)] 8 | pub trait LlmClient { 9 | async fn complete(&self, request: CompletionRequest) -> Result; 10 | fn provider_name(&self) -> &str; 11 | fn model_name(&self) -> &str; 12 | } 13 | -------------------------------------------------------------------------------- /deny.toml: -------------------------------------------------------------------------------- 1 | [advisories] 2 | db-path = "~/.cargo/advisory-db" 3 | db-urls = ["https://github.com/rustsec/advisory-db"] 4 | ignore = [] 5 | 6 | [licenses] 7 | allow = ["MIT", "Apache-2.0", "ISC", "BSD-3-Clause", "BSD-2-Clause", "CC0-1.0", "MPL-2.0", "Zlib", "Unicode-3.0"] 8 | 9 | [bans] 10 | multiple-versions = "warn" 11 | wildcards = "allow" 12 | 13 | [sources] 14 | unknown-registry = "warn" 15 | unknown-git = "warn" 16 | -------------------------------------------------------------------------------- /manager/tests/project_api.rs: -------------------------------------------------------------------------------- 1 | //! Project API integration tests 2 | //! 3 | //! This test file imports and runs tests from the integration/project_api module. 4 | //! Run with: cargo test --test project_api 5 | 6 | mod common; 7 | 8 | // Include the integration test module 9 | mod integration { 10 | pub mod project_api; 11 | } 12 | 13 | // Re-export tests so they can be discovered by cargo test 14 | pub use integration::*; 15 | -------------------------------------------------------------------------------- /nocodo-github-actions/src/main.rs: -------------------------------------------------------------------------------- 1 | //! Binary for nocodo-github-actions CLI 2 | 3 | #[cfg(feature = "cli")] 4 | #[tokio::main] 5 | async fn main() -> Result<(), Box> { 6 | nocodo_github_actions::cli::run().await?; 7 | Ok(()) 8 | } 9 | 10 | #[cfg(not(feature = "cli"))] 11 | fn main() { 12 | eprintln!("CLI feature not enabled. Rebuild with --features cli"); 13 | std::process::exit(1); 14 | } 15 | -------------------------------------------------------------------------------- /manager-models/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "manager-models" 3 | version.workspace = true 4 | edition.workspace = true 5 | authors.workspace = true 6 | license.workspace = true 7 | repository.workspace = true 8 | 9 | [dependencies] 10 | serde = { version = "1.0", features = ["derive"] } 11 | serde_json = "1.0" 12 | chrono = { version = "0.4", features = ["serde"] } 13 | uuid = { version = "1.0", features = ["v4", "serde"] } 14 | schemars = "0.8" -------------------------------------------------------------------------------- /manager/tests/auth_system.rs: -------------------------------------------------------------------------------- 1 | //! Authentication & Authorization System integration tests 2 | //! 3 | //! This test file imports and runs tests from the integration/auth_system module. 4 | //! Run with: cargo test --test auth_system 5 | 6 | mod common; 7 | 8 | // Include the integration test module 9 | mod integration { 10 | pub mod auth_system; 11 | } 12 | 13 | // Re-export tests so they can be discovered by cargo test 14 | pub use integration::*; -------------------------------------------------------------------------------- /manager/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod auth; 2 | pub mod command_discovery; 3 | pub mod config; 4 | pub mod database; 5 | pub mod error; 6 | pub mod git; 7 | pub mod handlers; 8 | pub mod llm_agent; 9 | pub mod llm_client; 10 | pub mod middleware; 11 | pub mod models; 12 | pub mod permissions; 13 | pub mod routes; 14 | pub mod schema_provider; 15 | pub mod socket; 16 | pub mod templates; 17 | pub mod websocket; 18 | 19 | pub mod helpers; 20 | 21 | #[cfg(test)] 22 | mod tests; 23 | -------------------------------------------------------------------------------- /manager/tests/permission_integration_test.rs: -------------------------------------------------------------------------------- 1 | //! Integration test runner for Permission System Phase 6 & 7 2 | //! 3 | //! This test file includes both API integration tests and performance tests 4 | //! for the team management and permission system. 5 | 6 | mod common; 7 | 8 | // Include the integration test modules 9 | mod integration { 10 | pub mod permission_system_api; 11 | } 12 | 13 | // Re-export tests so they can be discovered by cargo test 14 | pub use integration::*; 15 | -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | # rustfmt configuration for nocodo project 2 | # Ensures consistent code formatting across all Rust components 3 | 4 | # Use stable features only 5 | edition = "2021" 6 | 7 | # Line width and formatting 8 | max_width = 100 9 | hard_tabs = false 10 | tab_spaces = 4 11 | 12 | # Import formatting 13 | reorder_imports = true 14 | reorder_modules = true 15 | 16 | # Miscellaneous 17 | use_small_heuristics = "Default" 18 | chain_width = 60 19 | single_line_if_else_max_width = 50 20 | -------------------------------------------------------------------------------- /desktop-app/src/components/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod auth_dialog; 2 | pub mod command_card; 3 | pub mod connection_dialog; 4 | pub mod markdown_renderer; 5 | pub mod message_renderer; 6 | pub mod project_card; 7 | pub mod sidebar; 8 | pub mod status_bar; 9 | 10 | pub use auth_dialog::*; 11 | pub use command_card::*; 12 | pub use connection_dialog::*; 13 | pub use markdown_renderer::*; 14 | pub use message_renderer::*; 15 | pub use project_card::*; 16 | pub use sidebar::*; 17 | pub use status_bar::*; 18 | -------------------------------------------------------------------------------- /manager/tests/scan_endpoint_super_admin.rs: -------------------------------------------------------------------------------- 1 | //! Scan endpoint Super Admin integration tests 2 | //! 3 | //! This test file imports and runs tests from the integration/scan_endpoint_super_admin module. 4 | //! Run with: cargo test --test scan_endpoint_super_admin 5 | 6 | mod common; 7 | 8 | // Include the integration test module 9 | mod integration { 10 | pub mod scan_endpoint_super_admin; 11 | } 12 | 13 | // Re-export tests so they can be discovered by cargo test 14 | pub use integration::*; 15 | -------------------------------------------------------------------------------- /website/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "website", 3 | "type": "module", 4 | "version": "0.0.1", 5 | "scripts": { 6 | "dev": "astro dev", 7 | "build": "astro build", 8 | "preview": "astro preview", 9 | "astro": "astro" 10 | }, 11 | "dependencies": { 12 | "@astrojs/check": "^0.9.4", 13 | "@tailwindcss/typography": "^0.5.16", 14 | "@tailwindcss/vite": "^4.1.11", 15 | "astro": "^5.13.5", 16 | "tailwindcss": "^4.1.11", 17 | "typescript": "^5.8.3" 18 | } 19 | } -------------------------------------------------------------------------------- /website/src/pages/contact-us.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import PolicyLayout from '../layouts/PolicyLayout.astro'; 3 | import { getEntry } from 'astro:content'; 4 | 5 | const entry = await getEntry('about', 'contact-us'); 6 | if (!entry) throw new Error('Contact us content not found'); 7 | const { Content } = await entry.render(); 8 | --- 9 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/test-config.example.toml: -------------------------------------------------------------------------------- 1 | # Example test configuration 2 | # Copy to test-config.toml and add your API keys 3 | # 4 | # Note: Keys can be in lowercase (will be converted to uppercase env vars) 5 | 6 | [api_keys] 7 | # anthropic_api_key = "sk-ant-..." 8 | # openai_api_key = "sk-..." 9 | # xai_api_key = "xai-..." 10 | # cerebras_api_key = "csk-..." 11 | 12 | # Zen tests require no API keys (free models) 13 | 14 | # Non-string values in [api_keys] are ignored 15 | # coding_plan = true # This will be skipped 16 | -------------------------------------------------------------------------------- /website/src/pages/privacy-policy.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import PolicyLayout from '../layouts/PolicyLayout.astro'; 3 | import { getEntry } from 'astro:content'; 4 | 5 | const entry = await getEntry('about', 'privacy-policy'); 6 | if (!entry) throw new Error('Privacy policy content not found'); 7 | const { Content } = await entry.render(); 8 | --- 9 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /website/src/pages/shipping-and-delivery.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import PolicyLayout from '../layouts/PolicyLayout.astro'; 3 | import { getEntry } from 'astro:content'; 4 | 5 | const entry = await getEntry('about', 'shipping-and-delivery'); 6 | if (!entry) throw new Error('Shipping and delivery content not found'); 7 | const { Content } = await entry.render(); 8 | --- 9 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /website/src/pages/cancellation-and-refund.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import PolicyLayout from '../layouts/PolicyLayout.astro'; 3 | import { getEntry } from 'astro:content'; 4 | 5 | const entry = await getEntry('about', 'cancellation-and-refund'); 6 | if (!entry) throw new Error('Cancellation and refund content not found'); 7 | const { Content } = await entry.render(); 8 | --- 9 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/providers.rs: -------------------------------------------------------------------------------- 1 | //! Provider name constants 2 | //! 3 | //! This module defines canonical provider names used throughout the SDK 4 | 5 | /// Anthropic (Claude) provider 6 | pub const ANTHROPIC: &str = "anthropic"; 7 | 8 | /// OpenAI provider 9 | pub const OPENAI: &str = "openai"; 10 | 11 | /// xAI (Grok) provider 12 | pub const XAI: &str = "xai"; 13 | 14 | /// Cerebras provider (for Llama models) 15 | pub const CEREBRAS: &str = "cerebras"; 16 | 17 | /// Zen provider (free tier for Grok and GLM) 18 | pub const ZEN: &str = "zen"; 19 | -------------------------------------------------------------------------------- /website/src/pages/terms-and-conditions.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import PolicyLayout from '../layouts/PolicyLayout.astro'; 3 | import { getEntry } from 'astro:content'; 4 | 5 | const entry = await getEntry('about', 'terms-and-conditions'); 6 | if (!entry) throw new Error('Terms and conditions content not found'); 7 | const { Content } = await entry.render(); 8 | --- 9 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/grok/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod builder; 2 | pub mod tools; 3 | pub mod types; 4 | pub mod xai; 5 | pub mod zen; 6 | 7 | pub use builder::GrokMessageBuilder; 8 | pub use tools::GrokToolFormat; 9 | pub use types::*; 10 | 11 | // Re-export for convenience 12 | pub use xai::*; 13 | pub use zen::*; 14 | 15 | // Type alias for backwards compatibility 16 | #[deprecated(since = "0.2.0", note = "Use xai::XaiGrokClient explicitly")] 17 | pub type GrokClient = xai::XaiGrokClient; 18 | 19 | // Re-export Grok model constants 20 | pub use crate::models::grok::*; 21 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/glm/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod builder; 2 | pub mod tools; 3 | pub mod types; 4 | pub mod cerebras; 5 | pub mod zen; 6 | 7 | pub use builder::GlmMessageBuilder; 8 | pub use tools::GlmToolFormat; 9 | pub use types::*; 10 | 11 | // Re-export for convenience 12 | pub use cerebras::*; 13 | pub use zen::*; 14 | 15 | // Type alias for backwards compatibility 16 | #[deprecated(since = "0.2.0", note = "Use cerebras::CerebrasGlmClient explicitly")] 17 | pub type GlmClient = cerebras::CerebrasGlmClient; 18 | 19 | // Re-export GLM model constants 20 | pub use crate::models::glm::*; 21 | -------------------------------------------------------------------------------- /manager-tools/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod tool_error; 2 | pub mod tool_executor; 3 | pub mod list_files; 4 | pub mod read_file; 5 | pub mod write_file; 6 | pub mod grep; 7 | pub mod apply_patch; 8 | pub mod bash; 9 | pub mod bash_executor; 10 | pub mod bash_permissions; 11 | 12 | pub use tool_error::ToolError; 13 | pub use bash::{BashExecutionResult, BashExecutorTrait}; 14 | pub use tool_executor::ToolExecutor; 15 | 16 | #[cfg(test)] 17 | mod tests; 18 | // TODO: Fix and re-enable these tests after refactoring 19 | // #[cfg(test)] 20 | // mod bash_executor_tests; 21 | // #[cfg(test)] 22 | // mod bash_permissions_tests; -------------------------------------------------------------------------------- /website/src/components/theme/ContentBox.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * ContentBox - Container for main content with prose styling 4 | * Theme-aware component that adapts to light/dark mode automatically 5 | * Ideal for markdown/rich text content 6 | */ 7 | export interface Props { 8 | class?: string; 9 | } 10 | 11 | const { class: className } = Astro.props; 12 | --- 13 | 14 |
18 |
19 | 20 |
21 |
22 | -------------------------------------------------------------------------------- /desktop-app/src/pages/mentions.rs: -------------------------------------------------------------------------------- 1 | use crate::state::AppState; 2 | use egui::{Context, Ui}; 3 | 4 | pub struct MentionsPage; 5 | 6 | impl MentionsPage { 7 | pub fn new() -> Self { 8 | Self 9 | } 10 | } 11 | 12 | impl Default for MentionsPage { 13 | fn default() -> Self { 14 | Self::new() 15 | } 16 | } 17 | 18 | impl crate::pages::Page for MentionsPage { 19 | fn name(&self) -> &'static str { 20 | "Mentions" 21 | } 22 | 23 | fn ui(&mut self, _ctx: &Context, ui: &mut Ui, _state: &mut AppState) { 24 | ui.heading("Mentions"); 25 | ui.label("Dummy Mentions page"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /manager/src/handlers/mod.rs: -------------------------------------------------------------------------------- 1 | // Main handlers (system/health handlers) 2 | pub mod main_handlers; 3 | pub use main_handlers::AppState; 4 | 5 | // Project handlers module 6 | pub mod project_handlers; 7 | 8 | 9 | // Work handlers module 10 | pub mod work_handlers; 11 | 12 | 13 | // User handlers module 14 | pub mod user_handlers; 15 | 16 | 17 | // Team handlers module 18 | pub mod team_handlers; 19 | 20 | 21 | // File handlers module 22 | pub mod file_handlers; 23 | 24 | // AI session handlers module 25 | pub mod ai_session_handlers; 26 | 27 | // Project commands handlers (separate module to keep main handlers from growing too large) 28 | pub mod project_commands; 29 | -------------------------------------------------------------------------------- /website/src/components/theme/PageHeader.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * PageHeader - Main page title and subtitle 4 | * Theme-aware component that adapts to light/dark mode automatically 5 | */ 6 | export interface Props { 7 | title: string; 8 | subtitle?: string; 9 | centered?: boolean; 10 | } 11 | 12 | const { title, subtitle, centered = true } = Astro.props; 13 | --- 14 | 15 |
16 |

17 | {title} 18 |

19 | {subtitle && ( 20 |

21 | {subtitle} 22 |

23 | )} 24 |
25 | -------------------------------------------------------------------------------- /.cargo/README.md: -------------------------------------------------------------------------------- 1 | # Cargo Configuration 2 | 3 | ## sccache Setup (Optional) 4 | 5 | To enable build caching with sccache, set the `RUSTC_WRAPPER` environment variable: 6 | 7 | ### Linux/macOS 8 | ```bash 9 | export RUSTC_WRAPPER=/usr/bin/sccache 10 | ``` 11 | 12 | Add to your `~/.bashrc` or `~/.zshrc` for persistence. 13 | 14 | ### Windows (PowerShell) 15 | ```powershell 16 | $env:RUSTC_WRAPPER = "sccache" 17 | ``` 18 | 19 | Add to your PowerShell profile for persistence. 20 | 21 | ### Installation 22 | 23 | If sccache is not installed: 24 | ```bash 25 | cargo install sccache 26 | ``` 27 | 28 | This approach allows each developer to enable/disable sccache without affecting the shared repository configuration. 29 | -------------------------------------------------------------------------------- /website/src/components/theme/SectionHeader.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * SectionHeader - Section heading with optional subtitle 4 | * Theme-aware component that adapts to light/dark mode automatically 5 | */ 6 | export interface Props { 7 | title: string; 8 | subtitle?: string; 9 | centered?: boolean; 10 | } 11 | 12 | const { title, subtitle, centered = true } = Astro.props; 13 | --- 14 | 15 |
16 |

17 | {title} 18 |

19 | {subtitle && ( 20 |

21 | {subtitle} 22 |

23 | )} 24 |
25 | -------------------------------------------------------------------------------- /desktop-app/src/state/connection.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | 3 | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] 4 | pub enum ConnectionState { 5 | #[default] 6 | Disconnected, 7 | Connecting, 8 | Connected, 9 | Error(String), 10 | } 11 | 12 | /// Authentication state for tracking user login status 13 | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] 14 | pub struct AuthState { 15 | /// JWT token received from manager 16 | pub jwt_token: Option, 17 | /// User ID 18 | pub user_id: Option, 19 | /// Username 20 | pub username: Option, 21 | /// Whether this is the first user (for UI messaging) 22 | pub is_first_user: bool, 23 | } 24 | -------------------------------------------------------------------------------- /desktop-app/src/pages/mod.rs: -------------------------------------------------------------------------------- 1 | use crate::state::AppState; 2 | use egui::{Context, Ui}; 3 | 4 | pub trait Page { 5 | fn name(&self) -> &'static str; 6 | fn ui(&mut self, ctx: &Context, ui: &mut Ui, state: &mut AppState); 7 | fn on_navigate_to(&mut self) {} 8 | fn on_navigate_from(&mut self) {} 9 | } 10 | 11 | pub mod board; 12 | pub mod mentions; 13 | pub mod project_detail; 14 | pub mod projects; 15 | pub mod servers; 16 | pub mod settings; 17 | pub mod teams; 18 | pub mod ui_reference; 19 | pub mod users; 20 | 21 | pub use board::*; 22 | pub use mentions::*; 23 | pub use project_detail::*; 24 | pub use projects::*; 25 | pub use servers::*; 26 | pub use settings::*; 27 | pub use teams::*; 28 | pub use ui_reference::*; 29 | pub use users::*; 30 | -------------------------------------------------------------------------------- /website/public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /website/src/components/UI/Prompt.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { prompt, message } = Astro.props; 3 | --- 4 | 5 |
6 | {message &&

} 7 |

8 |
9 | 10 | 11 | 12 | Prompt 13 |
14 |
{prompt}
16 |
17 |
18 | -------------------------------------------------------------------------------- /nocodo-github-actions/src/lib.rs: -------------------------------------------------------------------------------- 1 | //! # nocodo-github-actions 2 | //! 3 | //! A library for parsing GitHub Actions workflows and extracting executable commands. 4 | //! 5 | //! This crate provides functionality to: 6 | //! - Parse GitHub Actions workflow YAML files 7 | //! - Extract run commands with their execution context 8 | //! - Execute commands in isolated environments 9 | //! - Integrate with nocodo manager for workflow management 10 | 11 | pub mod error; 12 | pub mod executor; 13 | pub mod models; 14 | pub mod parser; 15 | pub mod workflow_tests; 16 | 17 | #[cfg(feature = "nocodo-integration")] 18 | pub mod nocodo; 19 | 20 | #[cfg(feature = "cli")] 21 | pub mod cli; 22 | 23 | /// Re-export commonly used types 24 | pub use error::Error; 25 | pub use executor::CommandExecutor; 26 | pub use models::*; 27 | pub use parser::WorkflowParser; 28 | -------------------------------------------------------------------------------- /website/src/components/UI/Terminal.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { command, message } = Astro.props; 3 | --- 4 | 5 |
6 | {message &&

} 7 |

8 |
9 | 10 | 11 | 12 | Command 13 |
14 |
{command}
16 |
17 |
18 | -------------------------------------------------------------------------------- /website/src/components/theme/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * nocodo Theme Components 3 | * 4 | * Reusable, theme-aware components that automatically adapt to light/dark mode. 5 | * All components use semantic color tokens defined in global.css. 6 | * 7 | * To add light theme support in the future: 8 | * 1. Define :root CSS variables in global.css 9 | * 2. Add theme toggle component 10 | * 3. No changes needed to these components! 11 | */ 12 | 13 | export { default as PageHeader } from './PageHeader.astro'; 14 | export { default as SectionHeader } from './SectionHeader.astro'; 15 | export { default as ContentBox } from './ContentBox.astro'; 16 | export { default as Card } from './Card.astro'; 17 | export { default as IconBadge } from './IconBadge.astro'; 18 | export { default as Section } from './Section.astro'; 19 | export { default as FeatureCard } from './FeatureCard.astro'; 20 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "nocodo-llm-sdk" 3 | version.workspace = true 4 | edition.workspace = true 5 | authors.workspace = true 6 | license.workspace = true 7 | repository.workspace = true 8 | 9 | [dependencies] 10 | reqwest = { version = "0.11", features = ["json", "stream"] } 11 | serde = { version = "1.0", features = ["derive"] } 12 | serde_json = "1.0" 13 | async-trait = "0.1" 14 | tokio = { version = "1.0", features = ["full"] } 15 | thiserror = "1.0" 16 | anyhow = "1.0" 17 | tracing = "0.1" 18 | toml = { version = "0.8", optional = true } 19 | schemars = { version = "0.8", features = ["preserve_order"] } 20 | 21 | [dev-dependencies] 22 | mockito = "1.0" 23 | tokio-test = "0.4" 24 | 25 | [features] 26 | test-runner = ["toml"] 27 | ffi = [] 28 | 29 | [[bin]] 30 | name = "test-runner" 31 | path = "bin/test_runner.rs" 32 | required-features = ["test-runner"] 33 | -------------------------------------------------------------------------------- /NOTICE.md: -------------------------------------------------------------------------------- 1 | # Third-Party Licenses 2 | 3 | nocodo uses open source software from third parties. This document provides attribution and license information for these dependencies. 4 | 5 | ## codex-apply-patch 6 | 7 | Portions of this software use code from **Codex CLI** by OpenAI. 8 | 9 | - **Copyright**: 2025 OpenAI 10 | - **License**: Apache License 2.0 11 | - **Source**: https://github.com/openai/codex 12 | - **Component**: codex-apply-patch (Rust crate for patch parsing and application) 13 | 14 | The Apache 2.0 license text is available in `LICENSES/Apache-2.0.txt`. 15 | 16 | ### Usage 17 | 18 | The `codex-apply-patch` crate is used in the nocodo manager to provide file patching capabilities for the LLM agent tools. It enables creating, modifying, deleting, and moving files using a unified diff format. 19 | 20 | --- 21 | 22 | For the full text of the Apache License 2.0, see [LICENSES/Apache-2.0.txt](LICENSES/Apache-2.0.txt). 23 | -------------------------------------------------------------------------------- /nocodo-github-actions/test_workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout code 14 | uses: actions/checkout@v3 15 | 16 | - name: Setup Node.js 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: '18' 20 | 21 | - name: Install dependencies 22 | run: npm ci 23 | 24 | - name: Run tests 25 | run: npm test 26 | working-directory: ./some-dir 27 | 28 | - name: Build 29 | run: | 30 | echo "Building..." 31 | npm run build 32 | shell: bash 33 | 34 | lint: 35 | runs-on: ubuntu-latest 36 | steps: 37 | - name: Checkout 38 | uses: actions/checkout@v3 39 | 40 | - name: Run linter 41 | run: npm run lint 42 | env: 43 | CI: true -------------------------------------------------------------------------------- /manager-tools/src/tool_error.rs: -------------------------------------------------------------------------------- 1 | #[allow(clippy::needless_borrow)] 2 | /// Tool execution error 3 | #[derive(Debug, thiserror::Error)] 4 | pub enum ToolError { 5 | #[error("File not found: {0}")] 6 | #[allow(dead_code)] 7 | FileNotFound(String), 8 | #[error("Permission denied: {0}")] 9 | #[allow(dead_code)] 10 | PermissionDenied(String), 11 | #[error("Invalid path: {0}")] 12 | InvalidPath(String), 13 | #[error("File too large: {0} bytes (max: {1})")] 14 | #[allow(dead_code)] 15 | FileTooLarge(u64, u64), 16 | #[error("IO error: {0}")] 17 | IoError(String), 18 | #[error("Serialization error: {0}")] 19 | SerializationError(String), 20 | } 21 | 22 | impl From for ToolError { 23 | fn from(err: std::io::Error) -> Self { 24 | ToolError::IoError(err.to_string()) 25 | } 26 | } 27 | 28 | impl From for ToolError { 29 | fn from(err: serde_json::Error) -> Self { 30 | ToolError::SerializationError(err.to_string()) 31 | } 32 | } -------------------------------------------------------------------------------- /nocodo-llm-sdk/examples/openai_completion.rs: -------------------------------------------------------------------------------- 1 | use nocodo_llm_sdk::openai::OpenAIClient; 2 | 3 | #[tokio::main] 4 | async fn main() -> Result<(), Box> { 5 | // Get API key from environment variable 6 | let api_key = std::env::var("OPENAI_API_KEY") 7 | .map_err(|_| "OPENAI_API_KEY environment variable not set")?; 8 | let client = OpenAIClient::new(api_key)?; 9 | 10 | // Build and send a message 11 | let response = client 12 | .message_builder() 13 | .model("gpt-5.1") 14 | .max_completion_tokens(1024) 15 | .reasoning_effort("medium") // For GPT-5 models 16 | .user_message("Write a Python function to check if a number is prime.") 17 | .send() 18 | .await?; 19 | 20 | println!("GPT: {}", response.choices[0].message.content); 21 | println!( 22 | "Usage: {} input tokens, {} output tokens", 23 | response.usage.prompt_tokens.unwrap_or(0), response.usage.completion_tokens.unwrap_or(0) 24 | ); 25 | Ok(()) 26 | } -------------------------------------------------------------------------------- /manager-tools/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "manager-tools" 3 | version.workspace = true 4 | edition.workspace = true 5 | authors.workspace = true 6 | license.workspace = true 7 | repository.workspace = true 8 | description = "Tool execution utilities for nocodo manager" 9 | 10 | [lib] 11 | name = "manager_tools" 12 | path = "src/lib.rs" 13 | 14 | [dependencies] 15 | tokio = { workspace = true } 16 | serde = { workspace = true } 17 | serde_json = { workspace = true } 18 | anyhow = { workspace = true } 19 | base64 = "0.22" 20 | walkdir = "2.5" 21 | regex = "1.10" 22 | thiserror = { workspace = true } 23 | tracing = { workspace = true } 24 | glob = "0.3" 25 | codex-apply-patch = { git = "https://github.com/openai/codex", package = "codex-apply-patch" } 26 | codex-core = { git = "https://github.com/openai/codex", package = "codex-core" } 27 | codex-process-hardening = { git = "https://github.com/openai/codex", package = "codex-process-hardening" } 28 | manager-models = { path = "../manager-models" } 29 | 30 | [dev-dependencies] 31 | tempfile = "3.12" 32 | tokio-test = "0.4" -------------------------------------------------------------------------------- /nocodo-github-actions/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "nocodo-github-actions" 3 | version = "0.1.0" 4 | edition = "2021" 5 | description = "GitHub Actions workflow parsing and command extraction library" 6 | license = "MIT OR Apache-2.0" 7 | 8 | [[bin]] 9 | name = "nocodo-github-actions" 10 | path = "src/main.rs" 11 | required-features = ["cli"] 12 | 13 | [dependencies] 14 | serde = { workspace = true } 15 | serde_json = { workspace = true } 16 | serde_yaml = "0.9" 17 | tokio = { workspace = true } 18 | thiserror = { workspace = true } 19 | anyhow = { workspace = true } 20 | chrono = { workspace = true } 21 | ts-rs = { workspace = true } 22 | 23 | # Optional dependencies for nocodo integration 24 | rusqlite = { version = "0.37", features = ["bundled"], optional = true } 25 | actix-web = { workspace = true, optional = true } 26 | 27 | # Optional CLI dependency 28 | clap = { workspace = true, optional = true } 29 | 30 | [dev-dependencies] 31 | tempfile = "3.0" 32 | 33 | [features] 34 | default = [] 35 | nocodo-integration = ["dep:rusqlite", "dep:actix-web"] 36 | cli = ["dep:clap"] -------------------------------------------------------------------------------- /nocodo-llm-sdk/src/claude/tools.rs: -------------------------------------------------------------------------------- 1 | use crate::tools::{ProviderToolFormat, Tool, ToolChoice}; 2 | use super::types::ClaudeTool; 3 | use serde_json::{json, Value}; 4 | 5 | /// Claude tool format implementation 6 | pub struct ClaudeToolFormat; 7 | 8 | impl ProviderToolFormat for ClaudeToolFormat { 9 | type ProviderTool = ClaudeTool; 10 | 11 | fn to_provider_tool(tool: &Tool) -> Self::ProviderTool { 12 | ClaudeTool { 13 | name: tool.name().to_string(), 14 | description: tool.description().to_string(), 15 | input_schema: tool.parameters().clone(), 16 | cache_control: None, 17 | } 18 | } 19 | 20 | fn to_provider_tool_choice(choice: &ToolChoice) -> Value { 21 | match choice { 22 | ToolChoice::Auto => json!({"type": "auto"}), 23 | ToolChoice::Required => json!({"type": "any"}), 24 | ToolChoice::None => json!({"type": "none"}), 25 | ToolChoice::Specific { name } => json!({ 26 | "type": "tool", 27 | "name": name 28 | }), 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Rust build artifacts 2 | /target/ 3 | **/*.rs.bk 4 | *.pdb 5 | 6 | # Cargo lock file (controversial, but typically ignored for applications) 7 | # Cargo.lock 8 | 9 | # IDE files 10 | .vscode/ 11 | .idea/ 12 | *.swp 13 | *.swo 14 | *~ 15 | 16 | # OS files 17 | .DS_Store 18 | .DS_Store? 19 | ._* 20 | .Spotlight-V100 21 | .Trashes 22 | ehthumbs.db 23 | Thumbs.db 24 | 25 | # Logs 26 | *.log 27 | 28 | # Runtime data 29 | pids 30 | *.pid 31 | *.seed 32 | *.pid.lock 33 | 34 | # Coverage directory used by tools like istanbul 35 | coverage/ 36 | 37 | # Environment files 38 | .env 39 | .env.local 40 | .env.development.local 41 | .env.test.local 42 | .env.production.local 43 | 44 | # Temporary files 45 | *.tmp 46 | *.temp 47 | 48 | # Node.js dependencies 49 | node_modules/ 50 | npm-debug.log* 51 | yarn-debug.log* 52 | yarn-error.log* 53 | pnpm-debug.log* 54 | 55 | # Build outputs 56 | dist/ 57 | build/ 58 | out/ 59 | 60 | # Astro specific 61 | .astro/ 62 | 63 | # Logs from manual tests 64 | test-logs/ 65 | 66 | # Test results 67 | test-results/ 68 | manager-web/test-results/ 69 | playwright-report/ 70 | manager-web/playwright-report/ 71 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/examples/grok_completion.rs: -------------------------------------------------------------------------------- 1 | use nocodo_llm_sdk::XaiGrokClient; 2 | 3 | #[tokio::main] 4 | async fn main() -> Result<(), Box> { 5 | // Get API key from environment 6 | let api_key = 7 | std::env::var("XAI_API_KEY").expect("XAI_API_KEY environment variable must be set"); 8 | 9 | // Create client 10 | let client = XaiGrokClient::new(api_key)?; 11 | 12 | // Build and send request 13 | let response = client 14 | .message_builder() 15 | .model("grok-code-fast-1") 16 | .max_tokens(1024) 17 | .user_message("Write a Rust function that reverses a string in place.") 18 | .send() 19 | .await?; 20 | 21 | // Print response 22 | println!("Grok: {}", response.choices[0].message.content); 23 | if let Some(usage) = &response.usage { 24 | println!( 25 | "Usage: {} input tokens, {} output tokens (total: {})", 26 | usage.prompt_tokens, usage.completion_tokens, usage.total_tokens 27 | ); 28 | } 29 | println!("Finish reason: {:?}", response.choices[0].finish_reason); 30 | 31 | Ok(()) 32 | } 33 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/examples/glm_completion.rs: -------------------------------------------------------------------------------- 1 | use nocodo_llm_sdk::CerebrasGlmClient; 2 | 3 | #[tokio::main] 4 | async fn main() -> Result<(), Box> { 5 | // Get API key from environment 6 | let api_key = std::env::var("CEREBRAS_API_KEY") 7 | .expect("CEREBRAS_API_KEY environment variable must be set"); 8 | 9 | // Create client 10 | let client = CerebrasGlmClient::new(api_key)?; 11 | 12 | // Build and send request 13 | let response = client 14 | .message_builder() 15 | .model("zai-glm-4.6") 16 | .max_tokens(1024) 17 | .user_message("Hello, GLM! Can you tell me about yourself?") 18 | .send() 19 | .await?; 20 | 21 | // Print response 22 | println!("GLM: {}", response.choices[0].message.get_text()); 23 | if let Some(usage) = &response.usage { 24 | println!( 25 | "Usage: {} input tokens, {} output tokens (total: {})", 26 | usage.prompt_tokens, usage.completion_tokens, usage.total_tokens 27 | ); 28 | } 29 | println!("Finish reason: {:?}", response.choices[0].finish_reason); 30 | 31 | Ok(()) 32 | } 33 | -------------------------------------------------------------------------------- /website/src/components/theme/Card.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * Card - Reusable card component with variants 4 | * Theme-aware component that adapts to light/dark mode automatically 5 | * 6 | * Variants: 7 | * - default: Simple card with border 8 | * - gradient: Card with gradient background 9 | * - hover-accent: Card with accent border on hover 10 | */ 11 | export interface Props { 12 | variant?: 'default' | 'gradient' | 'hover-accent'; 13 | accentColor?: 'emerald' | 'cyan'; 14 | class?: string; 15 | } 16 | 17 | const { 18 | variant = 'default', 19 | accentColor = 'emerald', 20 | class: className 21 | } = Astro.props; 22 | 23 | const baseClasses = "rounded-lg shadow-md p-6 border"; 24 | 25 | const variantClasses = { 26 | default: "bg-bg-tertiary border-border-primary", 27 | gradient: "bg-gradient-to-br from-bg-tertiary to-bg-secondary border-border-primary", 28 | 'hover-accent': `bg-bg-tertiary border-border-primary hover:border-accent-${accentColor}/50 transition-all duration-300` 29 | }; 30 | --- 31 | 32 |
37 | 38 |
39 | -------------------------------------------------------------------------------- /nocodo-github-actions/src/error.rs: -------------------------------------------------------------------------------- 1 | use std::io; 2 | use thiserror::Error; 3 | 4 | #[derive(Error, Debug)] 5 | pub enum Error { 6 | #[error("IO error: {0}")] 7 | Io(#[from] io::Error), 8 | 9 | #[error("YAML parsing error: {0}")] 10 | Yaml(#[from] serde_yaml::Error), 11 | 12 | #[error("JSON parsing error: {0}")] 13 | Json(#[from] serde_json::Error), 14 | 15 | #[cfg(feature = "nocodo-integration")] 16 | #[error("Database error: {0}")] 17 | Database(String), 18 | 19 | #[cfg(feature = "nocodo-integration")] 20 | #[error("SQLite error: {0}")] 21 | Sqlite(#[from] rusqlite::Error), 22 | 23 | #[error("Task join error: {0}")] 24 | TaskJoin(#[from] tokio::task::JoinError), 25 | 26 | #[error("Invalid workflow: {0}")] 27 | InvalidWorkflow(String), 28 | 29 | #[error("Command execution failed: {0}")] 30 | ExecutionFailed(String), 31 | 32 | #[error("Command not found: {0}")] 33 | CommandNotFound(String), 34 | 35 | #[error("Timeout exceeded")] 36 | Timeout, 37 | 38 | #[error("Permission denied: {0}")] 39 | PermissionDenied(String), 40 | } 41 | 42 | pub type Result = std::result::Result; 43 | -------------------------------------------------------------------------------- /clippy.toml: -------------------------------------------------------------------------------- 1 | # Clippy configuration for nocodo project 2 | # Strict linting rules for code quality and best practices 3 | 4 | # Set maximum complexity allowed for functions 5 | cognitive-complexity-threshold = 25 6 | 7 | # Enforce documentation for public items 8 | missing-docs-in-crate-items = false 9 | 10 | # Set limits for various constructs 11 | too-many-arguments-threshold = 7 12 | type-complexity-threshold = 250 13 | single-char-binding-names-threshold = 4 14 | trivial-copy-size-limit = 256 15 | 16 | # Enable additional lints beyond defaults 17 | # These will be enforced in CI with --deny warnings 18 | 19 | # Naming conventions 20 | disallowed-names = ["foo", "bar", "baz", "toto", "tata", "titi"] 21 | 22 | # Performance and efficiency 23 | avoid-breaking-exported-api = false 24 | msrv = "1.70.0" # Minimum supported Rust version 25 | 26 | # Documentation and style 27 | doc-valid-idents = ["GitHub", "GitLab", "JavaScript", "TypeScript", "WebSocket", "HTML", "URL", "UUID", "API", "HTTP", "CLI", "AI", "LLM", "JSON", "SQL", "SQLite"] 28 | 29 | # Error handling 30 | large-error-threshold = 128 31 | 32 | # Security and safety 33 | allow-dbg-in-tests = true 34 | allow-print-in-tests = true 35 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | resolver = "2" 3 | members = [ 4 | "manager", 5 | "manager-models", 6 | "manager-tools", 7 | "nocodo-github-actions", 8 | "desktop-app", "nocodo-llm-sdk", 9 | ] 10 | exclude = [ 11 | "manager-web" 12 | ] 13 | 14 | [workspace.dependencies] 15 | tokio = { version = "1.0", features = ["full"] } 16 | serde = { version = "1.0", features = ["derive"] } 17 | serde_json = "1.0" 18 | actix-web = "4" 19 | sqlx = { version = "0.8.1", features = ["runtime-tokio-rustls", "postgres", "chrono", "uuid"] } 20 | chrono = { version = "0.4", features = ["serde"] } 21 | uuid = { version = "1.0", features = ["v4", "serde"] } 22 | ts-rs = "7.0" 23 | tracing = "0.1" 24 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 25 | config = "0.14" 26 | anyhow = "1.0" 27 | thiserror = "1.0" 28 | clap = { version = "4.0", features = ["derive"] } 29 | 30 | [workspace.package] 31 | version = "0.1.12" 32 | edition = "2021" 33 | authors = ["nocodo team"] 34 | license = "MIT" 35 | repository = "https://github.com/nocodo/nocodo" 36 | 37 | [profile.dev] 38 | opt-level = 1 39 | incremental = true 40 | codegen-units = 256 41 | 42 | [profile.dev.package."*"] 43 | opt-level = 2 44 | -------------------------------------------------------------------------------- /website/src/components/theme/NavLink.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * Theme-aware Navigation Link Component 4 | * 5 | * A reusable navigation link that works with the dark theme system. 6 | * Automatically highlights the active page. 7 | */ 8 | 9 | export interface Props { 10 | href: string; 11 | class?: string; 12 | active?: boolean; 13 | } 14 | 15 | const { 16 | href, 17 | class: className = '', 18 | active = false, 19 | ...rest 20 | } = Astro.props; 21 | 22 | // Check if this link is for the current page 23 | const currentPath = Astro.url.pathname; 24 | const isActive = active || currentPath === href || (href !== '/' && currentPath.startsWith(href)); 25 | 26 | // Base styles for navigation links 27 | const baseStyles = 'px-3 py-2 rounded-md text-sm font-medium transition-colors'; 28 | 29 | // Active/inactive styles using theme tokens 30 | const stateStyles = isActive 31 | ? 'text-accent-emerald bg-bg-tertiary' 32 | : 'text-text-secondary hover:text-text-primary hover:bg-bg-tertiary'; 33 | 34 | const linkStyles = [baseStyles, stateStyles, className].join(' '); 35 | --- 36 | 37 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/examples/simple_completion.rs: -------------------------------------------------------------------------------- 1 | use nocodo_llm_sdk::claude::ClaudeClient; 2 | 3 | #[tokio::main] 4 | async fn main() -> Result<(), Box> { 5 | // Get API key from environment 6 | let api_key = std::env::var("ANTHROPIC_API_KEY") 7 | .expect("ANTHROPIC_API_KEY environment variable must be set"); 8 | 9 | // Create client 10 | let client = ClaudeClient::new(api_key)?; 11 | 12 | // Build and send request 13 | let response = client 14 | .message_builder() 15 | .model("claude-sonnet-4-5-20250929") 16 | .max_tokens(1024) 17 | .user_message("Explain quantum computing in simple terms.") 18 | .send() 19 | .await?; 20 | 21 | // Print response 22 | match &response.content[0] { 23 | nocodo_llm_sdk::claude::types::ClaudeContentBlock::Text { text } => { 24 | println!("Claude: {}", text); 25 | } 26 | nocodo_llm_sdk::claude::types::ClaudeContentBlock::ToolUse { .. } => { 27 | println!("Claude: [Tool use content]"); 28 | } 29 | } 30 | println!( 31 | "Usage: {} input tokens, {} output tokens", 32 | response.usage.input_tokens, response.usage.output_tokens 33 | ); 34 | 35 | Ok(()) 36 | } 37 | -------------------------------------------------------------------------------- /website/src/components/UI/WorkflowList.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { title } = Astro.props; 3 | const items = [ 4 | "Create a new branch for each task", 5 | "Branch names should start with feature/, chore/, or fix/", 6 | "Add tests for any new features added, particularly integration or end-to-end tests", 7 | "Run formatters, linters, and tests before committing changes", 8 | "When finished, please commit and push to the new branch", 9 | "Please mention the GitHub issue if provided", 10 | "Commit small chunks", 11 | "Selectively add files to git; maintain .gitignore", 12 | "If working on a GitHub issue: create a PR, update the task in the end", 13 | "If working on a GitHub issue: do not close the issue until I manually test", 14 | ]; 15 | --- 16 | 17 |
18 |
19 |
    20 | { 21 | items.map((item, index) => ( 22 |
  • 23 | 24 | {item} 25 |
  • 26 | )) 27 | } 28 |
29 |
30 |
31 | -------------------------------------------------------------------------------- /desktop-app/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "nocodo-desktop-app" 3 | version = "0.1.17" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | # UI Framework 8 | egui = "0.33.0" 9 | egui_extras = "0.33.0" 10 | egui_flex = "0.5" 11 | egui_material_icons = "0.5" 12 | eframe = { version = "0.33.0", default-features = false, features = [ 13 | "default_fonts", 14 | "glow", 15 | "persistence", 16 | "wayland", 17 | "x11", 18 | ] } 19 | 20 | # SSH 21 | russh = "0.54" 22 | 23 | # HTTP Client 24 | reqwest = { version = "0.12", features = ["json"] } 25 | 26 | # Async Runtime 27 | tokio = { version = "1", features = ["full"] } 28 | 29 | # Shared Models 30 | manager-models = { path = "../manager-models" } 31 | 32 | # Serialization 33 | serde = { version = "1.0", features = ["derive"] } 34 | serde_json = "1.0" 35 | toml = "0.9" 36 | 37 | # Logging 38 | tracing = "0.1" 39 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 40 | 41 | # System directories 42 | dirs = "6.0" 43 | 44 | # Error handling 45 | thiserror = "2.0" 46 | 47 | # SQLite 48 | rusqlite = { version = "0.37", features = ["bundled"] } 49 | 50 | # Date/Time formatting 51 | chrono = "0.4" 52 | 53 | # Random data generation 54 | rand = "0.8" 55 | 56 | # URL encoding 57 | urlencoding = "2.1" 58 | 59 | # Cryptography for SSH fingerprint 60 | sha2 = "0.10" 61 | base64 = "0.22" 62 | 63 | 64 | -------------------------------------------------------------------------------- /website/src/content/about/cancellation-and-refund.md: -------------------------------------------------------------------------------- 1 | # Cancellation and Refund 2 | 3 | Last updated on Sep 1 2025 4 | 5 | nocodo, a product of PIXLIE WEB SOLUTIONS PRIVATE LIMITED, believes in helping its customers as far as possible, and has therefore a liberal cancellation policy. Under this policy: 6 | 7 | - Cancellations will be considered only if the request is made within 30 days of subscribing to our service. However, the cancellation request may not be entertained if service provisioning has already been initiated. 8 | 9 | - nocodo does not accept cancellation requests for services that have already been delivered or consumed. However, refund/replacement can be made if the customer establishes that the quality of service delivered is not satisfactory. 10 | 11 | - In case of service issues or defects, please report the same to our Customer Service team. The request will be reviewed and addressed appropriately. This should be reported within 30 days of experiencing the issue. 12 | 13 | - In case you feel that the service received is not as described on the site or as per your expectations, you must bring it to the notice of our customer service within 30 days. The Customer Service Team after looking into your complaint will take an appropriate decision. 14 | 15 | - In case of complaints regarding services that come with a warranty from nocodo, please contact our Customer Service team within the warranty period. 16 | -------------------------------------------------------------------------------- /nocodo-llm-sdk/examples/gpt51_codex_responses.rs: -------------------------------------------------------------------------------- 1 | use nocodo_llm_sdk::openai::OpenAIClient; 2 | 3 | #[tokio::main] 4 | async fn main() -> Result<(), Box> { 5 | // Get API key from environment variable 6 | let api_key = std::env::var("OPENAI_API_KEY") 7 | .map_err(|_| "OPENAI_API_KEY environment variable not set")?; 8 | let client = OpenAIClient::new(api_key)?; 9 | 10 | // Build and send a response using the Responses API (GPT-5.1-Codex) 11 | let response = client 12 | .response_builder() 13 | .model("gpt-5.1-codex") 14 | .input("Write a Python function to calculate fibonacci numbers recursively") 15 | .send() 16 | .await?; 17 | 18 | println!("GPT-5.1-Codex Response:"); 19 | 20 | // Extract and print the text content from the response 21 | for item in &response.output { 22 | if item.item_type == "message" { 23 | if let Some(content_blocks) = &item.content { 24 | for block in content_blocks { 25 | if block.content_type == "output_text" { 26 | println!("{}", block.text); 27 | } 28 | } 29 | } 30 | } 31 | } 32 | 33 | println!( 34 | "Usage: {} input tokens, {} output tokens", 35 | response.usage.input_tokens.unwrap_or(0), response.usage.output_tokens.unwrap_or(0) 36 | ); 37 | Ok(()) 38 | } -------------------------------------------------------------------------------- /website/src/assets/background.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/components/theme/FeatureCard.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * FeatureCard - Card with icon, title, and description 4 | * Theme-aware component that adapts to light/dark mode automatically 5 | */ 6 | export interface Props { 7 | title: string; 8 | description: string; 9 | iconColor?: 'emerald' | 'cyan'; 10 | variant?: 'default' | 'gradient'; 11 | class?: string; 12 | } 13 | 14 | const { 15 | title, 16 | description, 17 | iconColor = 'emerald', 18 | variant = 'default', 19 | class: className 20 | } = Astro.props; 21 | 22 | const bgClasses = variant === 'gradient' 23 | ? 'bg-gradient-to-br from-bg-tertiary to-bg-secondary' 24 | : 'bg-bg-tertiary'; 25 | --- 26 | 27 |
32 |
37 | 38 | 39 | 40 | 41 | 42 |
43 |

44 | {title} 45 |

46 |

47 | {description} 48 |

49 |
50 | -------------------------------------------------------------------------------- /website/src/styles/global.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | @plugin "@tailwindcss/typography"; 3 | 4 | /* nocodo Design System - Theme Variables */ 5 | /* Currently: Dark theme only. Light theme can be added to :root later without changing components. */ 6 | 7 | @theme { 8 | /* Background Colors */ 9 | --color-bg-primary: rgb(2 6 23); /* slate-950 */ 10 | --color-bg-secondary: rgb(15 23 42); /* slate-900 */ 11 | --color-bg-tertiary: rgb(30 41 59); /* slate-800 */ 12 | 13 | /* Text Colors */ 14 | --color-text-primary: rgb(241 245 249); /* slate-100 */ 15 | --color-text-secondary: rgb(203 213 225); /* slate-300 */ 16 | --color-text-tertiary: rgb(148 163 184); /* slate-400 */ 17 | --color-text-muted: rgb(100 116 139); /* slate-500 */ 18 | 19 | /* Accent Colors */ 20 | --color-accent-emerald: rgb(52 211 153); /* emerald-400 */ 21 | --color-accent-emerald-dark: rgb(16 185 129); /* emerald-500 */ 22 | --color-accent-emerald-darker: rgb(5 150 105); /* emerald-600 */ 23 | --color-accent-cyan: rgb(34 211 238); /* cyan-400 */ 24 | --color-accent-cyan-dark: rgb(6 182 212); /* cyan-500 */ 25 | --color-accent-cyan-darker: rgb(8 145 178); /* cyan-600 */ 26 | 27 | /* Border Colors */ 28 | --color-border-primary: rgb(51 65 85); /* slate-700 */ 29 | --color-border-secondary: rgb(71 85 105); /* slate-600 */ 30 | 31 | /* Surface Colors (for cards, boxes) */ 32 | --color-surface: rgb(30 41 59); /* slate-800 */ 33 | --color-surface-hover: rgb(51 65 85); /* slate-700 */ 34 | } -------------------------------------------------------------------------------- /website/src/components/theme/Section.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * Section - Full-width section wrapper with background variants 4 | * Theme-aware component that adapts to light/dark mode automatically 5 | * 6 | * Background variants: 7 | * - primary: slate-950 8 | * - secondary: slate-900 9 | * - gradient: gradient from slate-950 via slate-900 to slate-950 10 | */ 11 | export interface Props { 12 | background?: 'primary' | 'secondary' | 'gradient'; 13 | containerWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '4xl' | '5xl' | '6xl'; 14 | paddingY?: 'sm' | 'md' | 'lg'; 15 | class?: string; 16 | } 17 | 18 | const { 19 | background = 'primary', 20 | containerWidth = '6xl', 21 | paddingY = 'lg', 22 | class: className 23 | } = Astro.props; 24 | 25 | const bgClasses = { 26 | primary: 'bg-bg-primary', 27 | secondary: 'bg-bg-secondary', 28 | gradient: 'bg-gradient-to-br from-bg-primary via-bg-secondary to-bg-primary' 29 | }; 30 | 31 | const widthClasses = { 32 | sm: 'max-w-sm', 33 | md: 'max-w-md', 34 | lg: 'max-w-lg', 35 | xl: 'max-w-xl', 36 | '2xl': 'max-w-2xl', 37 | '4xl': 'max-w-4xl', 38 | '5xl': 'max-w-5xl', 39 | '6xl': 'max-w-6xl' 40 | }; 41 | 42 | const paddingClasses = { 43 | sm: 'py-12', 44 | md: 'py-16', 45 | lg: 'py-20' 46 | }; 47 | --- 48 | 49 |
54 |
58 | 59 |
60 |
61 | -------------------------------------------------------------------------------- /website/src/components/theme/IconBadge.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * IconBadge - Icon container with optional number badge 4 | * Theme-aware component that adapts to light/dark mode automatically 5 | * 6 | * Size variants: sm (w-10 h-10), md (w-12 h-12), lg (w-16 h-16) 7 | * Shape variants: square (rounded-lg), circle (rounded-full) 8 | * Color variants: emerald, cyan 9 | */ 10 | export interface Props { 11 | size?: 'sm' | 'md' | 'lg'; 12 | shape?: 'square' | 'circle'; 13 | color?: 'emerald' | 'cyan'; 14 | number?: string | number; 15 | class?: string; 16 | } 17 | 18 | const { 19 | size = 'md', 20 | shape = 'square', 21 | color = 'emerald', 22 | number, 23 | class: className 24 | } = Astro.props; 25 | 26 | const sizeClasses = { 27 | sm: 'w-10 h-10', 28 | md: 'w-12 h-12', 29 | lg: 'w-16 h-16' 30 | }; 31 | 32 | const shapeClasses = { 33 | square: 'rounded-lg', 34 | circle: 'rounded-full' 35 | }; 36 | 37 | const colorBgClasses = { 38 | emerald: 'bg-accent-emerald/10 border-accent-emerald/20', 39 | cyan: 'bg-accent-cyan/10 border-accent-cyan/20' 40 | }; 41 | 42 | const colorTextClasses = { 43 | emerald: 'text-accent-emerald', 44 | cyan: 'text-accent-cyan' 45 | }; 46 | --- 47 | 48 |
55 | {number ? ( 56 | 57 | {number} 58 | 59 | ) : ( 60 | 61 | )} 62 |
63 | -------------------------------------------------------------------------------- /website/src/layouts/PolicyLayout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from './Layout.astro'; 3 | import PageHeader from '../components/theme/PageHeader.astro'; 4 | import ContentBox from '../components/theme/ContentBox.astro'; 5 | import Card from '../components/theme/Card.astro'; 6 | 7 | export interface Props { 8 | title: string; 9 | description?: string; 10 | } 11 | 12 | const { title, description } = Astro.props; 13 | --- 14 | 15 | 16 |
17 |
18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 |

nocodo

33 |

A product of Pixlie Web Solutions Private Limited

34 |

35 | 103 Kamalapur East, Dum Dum Kolkata WEST BENGAL 700028 36 |

37 |

38 | Email: nocodo@pixlie.com 39 |

40 |
41 |
42 |
43 |
44 |
-------------------------------------------------------------------------------- /specs/IMPROVE_GREP.md: -------------------------------------------------------------------------------- 1 | # Improve Grep Tool: Migration to Ripgrep 2 | 3 | ## Current State 4 | - Custom implementation using `walkdir` + `regex` 5 | - Manual exclusion patterns (no .gitignore support) 6 | - Basic binary file filtering 7 | - Response size limiting implemented 8 | 9 | ## Available Ripgrep Dependencies 10 | ``` 11 | grep v0.4.1 12 | ├── grep-cli v0.1.12 13 | ├── grep-matcher v0.1.8 14 | ├── grep-printer v0.3.1 15 | ├── grep-regex v0.1.14 16 | └── grep-searcher v0.1.16 17 | ``` 18 | 19 | ## Migration Plan 20 | 21 | ### Phase 1: Core Integration 22 | 1. Replace `walkdir` with `grep-searcher::Searcher` 23 | 2. Use `grep-regex` for pattern matching 24 | 3. Leverage `grep-searcher`'s built-in .gitignore support 25 | 26 | ### Phase 2: Enhanced Features 27 | 1. Automatic .gitignore parsing and respect 28 | 2. Better binary file detection via `grep-searcher` 29 | 3. Improved performance with parallel search capabilities 30 | 31 | ### Phase 3: API Compatibility 32 | 1. Maintain existing `GrepRequest`/`GrepResponse` models 33 | 2. Preserve current parameter semantics 34 | 3. Add new optional parameters for ripgrep-specific features 35 | 36 | ## Implementation Steps 37 | 1. Create new `RipgrepExecutor` struct 38 | 2. Implement search using `grep-searcher::SearcherBuilder` 39 | 3. Add .gitignore support via `grep-searcher::sinks::UTF8` 40 | 4. Migrate existing exclusion logic to ripgrep patterns 41 | 5. Update tests and benchmarks 42 | 6. Replace old implementation 43 | 44 | ## Benefits 45 | - Automatic .gitignore respect 46 | - Better performance (parallel search) 47 | - Mature, battle-tested search logic 48 | - Reduced maintenance burden 49 | -------------------------------------------------------------------------------- /website/src/content/config.ts: -------------------------------------------------------------------------------- 1 | import { defineCollection, z } from 'astro:content'; 2 | 3 | const playbook = defineCollection({ 4 | type: 'content', 5 | schema: z.object({ 6 | title: z.string().optional(), 7 | description: z.string().optional(), 8 | tags: z.array(z.string()).optional(), 9 | }), 10 | }); 11 | 12 | const fundamentals = defineCollection({ 13 | type: 'content', 14 | schema: z.object({ 15 | title: z.string().optional(), 16 | description: z.string().optional(), 17 | tags: z.array(z.string()).optional(), 18 | }), 19 | }); 20 | 21 | const aiDevelopment = defineCollection({ 22 | type: 'content', 23 | schema: z.object({ 24 | title: z.string().optional(), 25 | description: z.string().optional(), 26 | tags: z.array(z.string()).optional(), 27 | }), 28 | }); 29 | 30 | const codingAgents = defineCollection({ 31 | type: 'content', 32 | schema: z.object({ 33 | title: z.string().optional(), 34 | description: z.string().optional(), 35 | tags: z.array(z.string()).optional(), 36 | }), 37 | }); 38 | 39 | const blog = defineCollection({ 40 | type: 'content', 41 | schema: z.object({ 42 | title: z.string().optional(), 43 | description: z.string().optional(), 44 | tags: z.array(z.string()).optional(), 45 | }), 46 | }); 47 | 48 | const about = defineCollection({ 49 | type: 'content', 50 | schema: z.object({ 51 | title: z.string().optional(), 52 | description: z.string().optional(), 53 | tags: z.array(z.string()).optional(), 54 | }), 55 | }); 56 | 57 | export const collections = { 58 | playbook, 59 | fundamentals, 60 | 'ai-development': aiDevelopment, 61 | 'coding-agents': codingAgents, 62 | blog, 63 | about, 64 | }; -------------------------------------------------------------------------------- /website/src/layouts/Layout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import '../styles/global.css'; 3 | import Header from '../components/Header.astro'; 4 | import Footer from '../components/Footer.astro'; 5 | 6 | export interface Props { 7 | title?: string; 8 | description?: string; 9 | } 10 | 11 | const { title = "nocodo", description = "Learn software engineering fundamentals before leveraging AI coding agents" } = Astro.props; 12 | --- 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | {title} 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 |
44 | 45 |