DevOps Pipeline Generator
Run ID: 69cc50228f41b62a970c28a92026-03-31Infrastructure
PantheraHive BOS
BOS Dashboard

As a professional AI assistant within PantheraHive, I am pleased to provide you with the comprehensive CI/CD pipeline configurations as part of the "DevOps Pipeline Generator" workflow. This deliverable outlines detailed setups for GitHub Actions, GitLab CI, and Jenkins, covering essential stages such as linting, testing, building, and deployment.

Our goal is to provide you with actionable, production-ready templates that can be adapted to your specific application stack and infrastructure. Each configuration emphasizes best practices for security, efficiency, and maintainability.


DevOps Pipeline Generator: Detailed CI/CD Configurations

This document provides detailed CI/CD pipeline configurations for three popular platforms: GitHub Actions, GitLab CI, and Jenkins. Each configuration is designed to be comprehensive, including stages for code quality (linting), validation (testing), artifact creation (building), and environment promotion (deployment).

Core Principles Applied

Across all generated pipeline configurations, the following core principles have been observed:


1. GitHub Actions Configuration

GitHub Actions provides a flexible and powerful CI/CD solution directly integrated with your GitHub repositories. This example uses a Node.js application that builds a Docker image and deploys it.

File Location: .github/workflows/main.yml

text • 1,403 chars
**Key Features and Customization:**

*   **`on` Triggers**: Configured for pushes to `main`, pull requests, and manual `workflow_dispatch`.
*   **`env` Variables**: Centralized environment variables for easy modification.
*   **`needs` Dependency**: Jobs run in sequence (lint -> test -> build -> deploy).
*   **Caching**: `actions/setup-node` includes caching for `npm` dependencies.
*   **Docker Build & Push**: Uses `docker/build-push-action` for efficient Docker image management.
*   **Secrets Management**: Uses GitHub Secrets (`secrets.AWS_ACCESS_KEY_ID`, `secrets.DOCKER_PASSWORD`, etc.) for sensitive information.
*   **Environment Protection**: Utilizes GitHub Environments (`Staging`, `Production`) for branch protection, required reviewers, and secret management specific to environments.
*   **Manual Approval**: The `trstringer/manual-approval` action is used for production deployments, requiring explicit approval from specified GitHub users.
*   **Deployment Commands**: Placeholder `aws` commands are provided for ECS. Adapt these to your cloud provider (AWS, Azure, GCP) and deployment strategy (Kubernetes, Serverless, VMs).

---

### 2. GitLab CI Configuration

GitLab CI is deeply integrated with GitLab repositories, offering robust CI/CD capabilities. This example also uses a Node.js application that builds a Docker image and deploys it.

**File Location**: `.gitlab-ci.yml`

Sandboxed live preview

DevOps Pipeline Generator: Infrastructure Needs Analysis

Executive Summary

This document outlines a comprehensive analysis of the infrastructure needs required to generate robust, scalable, and secure CI/CD pipelines. The goal is to identify the foundational components and strategies essential for automating the software delivery lifecycle, encompassing source code management, build, test, artifact management, and deployment.

Given the generic nature of the initial request, this analysis provides a strategic overview of common requirements, industry best practices, and actionable recommendations. The core principle is to establish a flexible and maintainable infrastructure that supports rapid development cycles while ensuring stability and security. By standardizing on modern tools and methodologies like containerization, Infrastructure as Code (IaC), and integrated security, organizations can significantly improve their DevOps maturity and accelerate time-to-market.

Current State Assessment (Inferred)

Without specific details regarding your current application landscape, technology stack, or existing infrastructure, this analysis operates under the assumption that:

  • You are aiming to automate the software delivery process for one or more applications.
  • Your source code is likely hosted on either GitHub or GitLab.
  • There's a desire to leverage modern CI/CD practices to improve efficiency, reliability, and speed of deployments.
  • The target environment could range from traditional Virtual Machines (VMs) to cloud-native container orchestration platforms (like Kubernetes) or serverless architectures.
  • There's an implicit need for a professional, scalable, and secure setup.

This analysis will provide a foundational understanding, which will be further refined with your specific inputs in the subsequent steps.

Comprehensive Infrastructure Needs Analysis

1. Source Code Management (SCM) Integration

  • Requirement: Seamless and secure integration with the chosen SCM system to trigger pipelines on code changes, manage branches, pull requests, and code reviews.
  • Key Considerations:

* Platform: GitHub or GitLab are the primary candidates as per the workflow description.

* Webhooks/API: The CI/CD system must effectively listen for SCM events (push, pull request, tag creation) and interact via API for status updates.

* Permissions: Granular access control for the CI/CD system to interact with repositories.

  • Recommendation: Leverage the native integration capabilities provided by GitHub Actions (for GitHub repositories) or GitLab CI (for GitLab repositories). This offers the tightest integration, simplified setup, and often superior performance.

2. CI/CD Orchestration Platform

  • Requirement: A robust platform to define, execute, monitor, and manage CI/CD pipelines.
  • Key Considerations:

* GitHub Actions:

* Pros: Deeply integrated with GitHub, YAML-based definitions, extensive marketplace of pre-built actions, managed runners available, strong community support.

* Cons: Less mature for complex enterprise-level self-hosted runner scenarios compared to Jenkins.

* GitLab CI:

* Pros: Fully integrated into the GitLab ecosystem (SCM, registry, security scanning, issue tracking), YAML-based, powerful AutoDevOps features, managed and self-hosted runners.

* Cons: Tightly coupled with GitLab, which might be a limitation if using other SCMs.

* Jenkins:

* Pros: Highly extensible via a vast plugin ecosystem, supports complex workflows, can be self-hosted anywhere, very mature.

* Cons: Steeper learning curve, requires significant operational overhead for maintenance and scaling, configuration can become complex (Groovy DSL).

  • Recommendation: For most modern cloud-native applications, GitHub Actions or GitLab CI are highly recommended due to their integrated nature, YAML-based configuration, and reduced operational overhead. Jenkins is suitable for highly customized, complex, or legacy environments where maximum flexibility and self-hosting are paramount. Your existing SCM choice will heavily influence this decision.

3. Build & Test Environment

  • Requirement: Consistent, isolated, and scalable environments for compiling code, managing dependencies, running unit, integration, and end-to-end tests, and performing static analysis.
  • Key Components:

* Operating System: Linux (most common), Windows, macOS (for mobile/desktop apps).

* Runtimes/SDKs: Node.js, Python, Java (JDK), .NET, Go, Ruby, PHP, specific compilers (e.g., GCC, Clang).

* Build Tools: Maven, Gradle, npm, yarn, pip, go build, MSBuild.

* Testing Frameworks: Jest, JUnit, Pytest, Cypress, Selenium, Playwright.

* Linting/Static Analysis Tools: ESLint, SonarQube, Black, Flake8, CheckStyle.

* Containerization: Docker for encapsulating build and test environments.

  • Recommendation:

* Containerized Build Agents: Utilize Docker containers for build and test environments to ensure reproducibility, isolate dependencies, and simplify environment setup. This allows pipelines to run consistently across different agents.

* Managed Runners: Leverage managed runners (GitHub-hosted runners, GitLab Shared Runners) for common technology stacks to reduce infrastructure management overhead.

* Self-Hosted Runners: Deploy self-hosted runners (on VMs or Kubernetes) for specific hardware requirements, custom environments, or enhanced security/performance needs.

4. Artifact Management

  • Requirement: Secure storage, versioning, and distribution of build outputs (binaries, Docker images, packages, deployment manifests).
  • Key Considerations:

* Docker Images:

* Cloud Registries: GitHub Container Registry, GitLab Container Registry, AWS ECR, Azure Container Registry (ACR), Google Container Registry (GCR).

* Self-Hosted: Harbor, Docker Registry.

* Language-Specific Packages:

* Maven/Gradle: Nexus Repository Manager, JFrog Artifactory, GitHub Packages.

* npm/Yarn: Nexus, Artifactory, GitHub Packages, npm registry.

* Python (PyPI): Nexus, Artifactory, GitHub Packages.

* Generic Binaries/Files: Cloud object storage (AWS S3, Azure Blob Storage, Google Cloud Storage).

  • Recommendation:

* For Docker images, use the native container registry integrated with your SCM (GitHub Container Registry, GitLab Container Registry) or a cloud-specific registry (ECR, ACR, GCR) for tight integration with deployment targets.

* For other package types, consider a universal package manager like JFrog Artifactory or Nexus, or utilize GitHub Packages for deep SCM integration. Cloud object storage is ideal for generic artifacts.

5. Deployment Targets & Strategy

  • Requirement: Reliable, automated, and repeatable deployment of applications to various environments (development, staging, production).
  • Key Options:

* Virtual Machines (VMs): AWS EC2, Azure VMs, Google Compute Engine.

* Tools: Ansible, Chef, Puppet, custom shell scripts, cloud-init.

* Container Orchestration (Kubernetes): AWS EKS, Azure AKS, Google GKE, OpenShift.

* Tools: Helm, Kustomize, Argo CD, Flux CD (for GitOps).

* Serverless: AWS Lambda, Azure Functions, Google Cloud Functions.

* Tools: Serverless Framework, AWS SAM.

* Platform as a Service (PaaS): AWS Elastic Beanstalk, Azure App Service, Google App Engine, Heroku.

  • Recommendation:

* Modern Applications: Prioritize Kubernetes for microservices and scalable applications due to its robust orchestration capabilities, self-healing, and strong ecosystem. Implement GitOps using tools like Argo CD or Flux CD for declarative, Git-driven deployments.

* Simpler Applications/Cost Optimization: Serverless or PaaS solutions can significantly reduce operational overhead for applications that fit their model.

* Infrastructure as Code (IaC): Regardless of

yaml

.gitlab-ci.yml

image: node:18-alpine # Base image for all jobs unless overridden

variables:

DOCKER_IMAGE_NAME: your-app-name

DOCKER_REGISTRY: $CI_REGISTRY # GitLab's built-in registry

AWS_REGION: us-east-1 # Specify your AWS region

# For external registries like Docker Hub:

# DOCKER_REGISTRY: docker.io/your-docker-username

stages:

- lint

- test

- build

- deploy_staging

- deploy_production

lint_job:

stage: lint

script:

- npm ci

- npm run lint # Assumes 'lint' script in package.json

cache:

key: ${CI_COMMIT_REF_SLUG}-node-modules

paths:

- node_modules/

policy: pull-push # Cache dependencies between jobs/pipelines

test_job:

stage: test

script:

- npm ci

- npm test # Assumes 'test' script in package.json

cache:

key: ${CI_COMMIT_REF_SLUG}-node-modules

paths:

- node_modules/

policy: pull # Only pull cache, don't modify it after install

# Optional: Integration with GitLab's SAST/DAST/Dependency Scanning

# artifacts:

# reports:

# sast: gl-sast-report.json

# dast: gl-dast-report.json

# dependency_scanning: gl-dependency-scanning-report.json

build_docker_image_job:

stage: build

image: docker:24.0.5-git # Use a Docker-in-Docker enabled image

services:

- docker:24.0.5-dind # Required for Docker-in-Docker

script:

- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY # Login to GitLab's registry

# For external registries:

# - docker login -u $DOCKER_USERNAME -p $DOCK

gemini Output

DevOps Pipeline Generator: Comprehensive CI/CD Pipeline Configurations

This document provides detailed and professional CI/CD pipeline configurations tailored for your project, encompassing essential stages such as linting, testing, building, and deployment. We have generated configurations for GitHub Actions, GitLab CI, and Jenkins, offering flexibility and robust automation for your development workflow.


1. Introduction to Generated CI/CD Pipelines

The generated pipelines are designed to automate the entire software delivery process, from code commit to production deployment. Each configuration leverages the best practices of its respective platform to ensure code quality, reliability, and efficient delivery. These templates serve as a strong foundation, ready for customization to fit your specific application architecture and deployment targets.

Key Benefits:

  • Automation: Reduces manual effort and potential for human error.
  • Consistency: Ensures every change goes through the same set of checks and deployments.
  • Speed: Accelerates the release cycle by streamlining processes.
  • Quality: Integrates linting and testing early to catch issues faster.
  • Visibility: Provides clear status updates throughout the pipeline.

2. Core Pipeline Stages Explained

Each generated pipeline incorporates the following critical stages, executed sequentially upon a trigger (typically a code push to a specific branch):

  • Linting (Code Quality Checks):

* Purpose: Static code analysis to identify stylistic issues, potential bugs, and adherence to coding standards.

* Tools: ESLint (JavaScript), Black/Flake8 (Python), Prettier (Formatter), etc.

* Outcome: Fails the pipeline if code does not meet defined quality standards, preventing poorly formatted or potentially problematic code from progressing.

  • Testing:

* Purpose: Verifies the functionality and correctness of the application code.

* Types: Unit tests, integration tests, end-to-end (E2E) tests.

* Tools: Jest (JavaScript), Pytest (Python), JUnit (Java), Cypress/Selenium (E2E).

* Outcome: Fails the pipeline if any tests fail, ensuring only validated code moves forward.

  • Building:

* Purpose: Compiles source code, resolves dependencies, and packages the application into a deployable artifact (e.g., Docker image, JAR file, compiled static assets).

* Tools: npm/yarn (Node.js), Maven/Gradle (Java), pip (Python), Docker.

* Outcome: Produces a ready-to-deploy artifact, versioned and stored for subsequent stages.

  • Deployment:

* Purpose: Releases the built artifact to one or more environments (e.g., Staging, Production).

* Strategies: Blue/Green, Canary, Rolling updates, Recreate.

* Targets: Cloud providers (AWS, Azure, GCP), Kubernetes clusters, virtual machines, serverless functions, static hosting.

* Outcome: Makes the new version of the application available to users in the target environment.


3. Generated Pipeline Configurations

Below are detailed configurations for GitHub Actions, GitLab CI, and Jenkins, demonstrating a common scenario (e.g., a Node.js web application) with placeholders for specific credentials and deployment targets.


3.1. GitHub Actions Configuration

GitHub Actions uses YAML files (.yml) stored in the .github/workflows/ directory of your repository.

Filename: .github/workflows/main.yml


name: CI/CD Pipeline

on:
  push:
    branches:
      - main
      - develop
  pull_request:
    branches:
      - main
      - develop

jobs:
  build_and_deploy:
    runs-on: ubuntu-latest
    env:
      NODE_VERSION: '18.x' # Specify your Node.js version
      # Add other environment variables as needed, e.g.,
      # MY_APP_ENV: production

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm' # or 'yarn', 'pnpm'

      - name: Install Dependencies
        run: npm ci # or yarn install --frozen-lockfile, pnpm install --frozen-lockfile

      - name: Run Linting
        run: npm run lint # Assumes a 'lint' script in package.json
        # Add a 'continue-on-error: true' if you want linting to be non-blocking for subsequent stages
        # For professional setups, linting should typically fail the pipeline.

      - name: Run Tests
        run: npm test # Assumes a 'test' script in package.json
        env:
          CI: true # Important for some test runners (e.g., Jest)

      - name: Build Application
        run: npm run build # Assumes a 'build' script in package.json
        env:
          # Example: Pass build-time environment variables
          REACT_APP_API_URL: ${{ secrets.REACT_APP_API_URL }}

      - name: Archive Build Artifacts (Optional)
        uses: actions/upload-artifact@v4
        with:
          name: build-artifact
          path: build/ # Adjust path to your build output directory

      - name: Deploy to Staging (Example: AWS S3/CloudFront)
        if: github.ref == 'refs/heads/develop'
        uses: jakejarvis/s3-sync-action@master
        with:
          args: --acl public-read --follow-symlinks --delete
        env:
          AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET_STAGING }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: 'us-east-1' # Adjust region
          SOURCE_DIR: 'build' # Adjust path to your build output directory

      - name: Deploy to Production (Example: AWS S3/CloudFront)
        if: github.ref == 'refs/heads/main'
        uses: jakejarvis/s3-sync-action@master
        with:
          args: --acl public-read --follow-symlinks --delete
        env:
          AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET_PRODUCTION }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: 'us-east-1' # Adjust region
          SOURCE_DIR: 'build' # Adjust path to your build output directory

      - name: Invalidate CloudFront Cache (Production)
        if: github.ref == 'refs/heads/main'
        uses: chetan/invalidate-cloudfront-action@v2
        env:
          DISTRIBUTION: ${{ secrets.AWS_CLOUDFRONT_DISTRIBUTION_ID_PRODUCTION }}
          PATHS: '/*'
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: 'us-east-1'

Integration Steps for GitHub Actions:

  1. Create Workflow File: Save the above YAML content as .github/workflows/main.yml in your repository.
  2. Configure Secrets: Go to your GitHub repository Settings > Secrets and variables > Actions. Add the necessary secrets (e.g., AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_S3_BUCKET_STAGING, AWS_S3_BUCKET_PRODUCTION, AWS_CLOUDFRONT_DISTRIBUTION_ID_PRODUCTION, REACT_APP_API_URL).
  3. Push to Branch: Push your changes to the main or develop branch to trigger the pipeline.
  4. Monitor: Check the "Actions" tab in your GitHub repository to monitor pipeline execution.

3.2. GitLab CI Configuration

GitLab CI uses a single YAML file (.gitlab-ci.yml) at the root of your repository.

Filename: .gitlab-ci.yml


image: node:18 # Use a Docker image with Node.js pre-installed

stages:
  - lint
  - test
  - build
  - deploy

cache:
  paths:
    - node_modules/

variables:
  # Define global variables or per-job variables
  # CI_DEBUG_TRACE: "true" # Uncomment for detailed job logs

lint_job:
  stage: lint
  script:
    - npm ci
    - npm run lint # Assumes a 'lint' script in package.json
  # For professional setups, linting should typically fail the pipeline.
  # allow_failure: true # Uncomment if you want linting to be non-blocking

test_job:
  stage: test
  script:
    - npm ci
    - npm test # Assumes a 'test' script in package.json
  # coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/' # Example for Jest coverage

build_job:
  stage: build
  script:
    - npm ci
    - npm run build # Assumes a 'build' script in package.json
  artifacts:
    paths:
      - build/ # Adjust path to your build output directory
    expire_in: 1 week # How long to keep the artifacts
  variables:
    # Example: Pass build-time environment variables
    REACT_APP_API_URL: $REACT_APP_API_URL # Defined as a CI/CD variable

deploy_staging_job:
  stage: deploy
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest # Use an image with AWS CLI
  script:
    - aws s3 sync build/ s3://$AWS_S3_BUCKET_STAGING --delete # Sync build directory to S3
    - aws cloudfront create-invalidation --distribution-id $AWS_CLOUDFRONT_DISTRIBUTION_ID_STAGING --paths "/*" || true # Invalidate CloudFront cache
  only:
    - develop # Only run on 'develop' branch
  environment:
    name: staging
    url: https://staging.yourdomain.com # Replace with your staging URL

deploy_production_job:
  stage: deploy
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest # Use an image with AWS CLI
  script:
    - aws s3 sync build/ s3://$AWS_S3_BUCKET_PRODUCTION --delete # Sync build directory to S3
    - aws cloudfront create-invalidation --distribution-id $AWS_CLOUDFRONT_DISTRIBUTION_ID_PRODUCTION --paths "/*" # Invalidate CloudFront cache
  only:
    - main # Only run on 'main' branch
  environment:
    name: production
    url: https://yourdomain.com # Replace with your production URL

Integration Steps for GitLab CI:

  1. Create Workflow File: Save the above YAML content as .gitlab-ci.yml at the root of your repository.
  2. Configure CI/CD Variables: Go to your GitLab project Settings > CI/CD > Variables. Add the necessary variables (e.g., AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_S3_BUCKET_STAGING, AWS_S3_BUCKET_PRODUCTION, AWS_CLOUDFRONT_DISTRIBUTION_ID_STAGING, AWS_CLOUDFRONT_DISTRIBUTION_ID_PRODUCTION, REACT_APP_API_URL). Mark sensitive variables as "Protected" and "Masked."
  3. Push to Branch: Push your changes to the main or develop branch to trigger the pipeline.
  4. Monitor: Check the "CI/CD" tab in your GitLab project to monitor pipeline execution.

3.3. Jenkins Pipeline Configuration (Groovy DSL)

Jenkins Pipelines are defined using a Jenkinsfile written in Groovy DSL, stored at the root of your repository.

Filename: Jenkinsfile


pipeline {
    agent { docker { image 'node:18' } } # Use a Docker agent with Node.js

    environment {
        # Define global environment variables
        NODE_VERSION = '18.x'
        BUILD_DIR = 'build'
        AWS_REGION = 'us-east-1'
        # Sensitive credentials should be managed via Jenkins Credentials
        # AWS_ACCESS_KEY_ID = credentials('aws-access-key-id')
        # AWS_SECRET_ACCESS_KEY = credentials('aws-secret-access-key')
    }

    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        stage('Install Dependencies') {
            steps {
                sh 'npm ci'
            }
        }

        stage('Lint') {
            steps {
                sh 'npm run lint' // Assumes a 'lint' script in package.json
            }
        }

        stage('Test') {
            steps {
                sh 'npm test' // Assumes a 'test' script in package.json
            }
        }

        stage('Build') {
            steps {
                sh 'npm run build' // Assumes a 'build' script in package.json
            }
            post {
                success {
                    archiveArtifacts artifacts: "${BUILD_DIR}/**", fingerprint: true
                }
            }
        }

        stage('Deploy to Staging') {
            when {
                branch 'develop'
            }
            steps {
                withCredentials([
                    aws(credentialsId: 'aws-dev-credentials', roleAccount: '123456789012')
                ]) {
                    sh "aws s3 sync ${env.BUILD_DIR}/ s3://${STAGING_S3_BUCKET} --delete --region ${env.AWS_REGION}"
                    sh "aws cloudfront create-invalidation --distribution-id ${STAGING_CLOUDFRONT_DISTRIBUTION_ID} --paths '/*' --region ${env.AWS_REGION} || true"
                }
            }
        }

        stage('Deploy to Production') {
            when {
                branch 'main'
            
devops_pipeline_generator.txt
Download source file
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
\n\n\n"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\nimport './index.css'\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n \n \n \n)\n"); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react'\nimport './App.css'\n\nfunction App(){\n return(\n
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n
\n )\n}\nexport default App\n"); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e}\n.app{min-height:100vh;display:flex;flex-direction:column}\n.app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px}\nh1{font-size:2.5rem;font-weight:700}\n"); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\n## Open in IDE\nOpen the project folder in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "type": "module",\n "scripts": {\n "dev": "vite",\n "build": "vue-tsc -b && vite build",\n "preview": "vite preview"\n },\n "dependencies": {\n "vue": "^3.5.13",\n "vue-router": "^4.4.5",\n "pinia": "^2.3.0",\n "axios": "^1.7.9"\n },\n "devDependencies": {\n "@vitejs/plugin-vue": "^5.2.1",\n "typescript": "~5.7.3",\n "vite": "^6.0.5",\n "vue-tsc": "^2.2.0"\n }\n}\n'); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport { resolve } from 'path'\n\nexport default defineConfig({\n plugins: [vue()],\n resolve: { alias: { '@': resolve(__dirname,'src') } }\n})\n"); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]}\n'); zip.file(folder+"tsconfig.app.json",'{\n "compilerOptions":{\n "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"],\n "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true,\n "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue",\n "strict":true,"paths":{"@/*":["./src/*"]}\n },\n "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"]\n}\n'); zip.file(folder+"env.d.ts","/// \n"); zip.file(folder+"index.html","\n\n\n \n \n "+slugTitle(pn)+"\n\n\n
\n \n\n\n"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue'\nimport { createPinia } from 'pinia'\nimport App from './App.vue'\nimport './assets/main.css'\n\nconst app = createApp(App)\napp.use(createPinia())\napp.mount('#app')\n"); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue","\n\n\n\n\n"); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547}\n"); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\nOpen in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "scripts": {\n "ng": "ng",\n "start": "ng serve",\n "build": "ng build",\n "test": "ng test"\n },\n "dependencies": {\n "@angular/animations": "^19.0.0",\n "@angular/common": "^19.0.0",\n "@angular/compiler": "^19.0.0",\n "@angular/core": "^19.0.0",\n "@angular/forms": "^19.0.0",\n "@angular/platform-browser": "^19.0.0",\n "@angular/platform-browser-dynamic": "^19.0.0",\n "@angular/router": "^19.0.0",\n "rxjs": "~7.8.0",\n "tslib": "^2.3.0",\n "zone.js": "~0.15.0"\n },\n "devDependencies": {\n "@angular-devkit/build-angular": "^19.0.0",\n "@angular/cli": "^19.0.0",\n "@angular/compiler-cli": "^19.0.0",\n "typescript": "~5.6.0"\n }\n}\n'); zip.file(folder+"angular.json",'{\n "$schema": "./node_modules/@angular/cli/lib/config/schema.json",\n "version": 1,\n "newProjectRoot": "projects",\n "projects": {\n "'+pn+'": {\n "projectType": "application",\n "root": "",\n "sourceRoot": "src",\n "prefix": "app",\n "architect": {\n "build": {\n "builder": "@angular-devkit/build-angular:application",\n "options": {\n "outputPath": "dist/'+pn+'",\n "index": "src/index.html",\n "browser": "src/main.ts",\n "tsConfig": "tsconfig.app.json",\n "styles": ["src/styles.css"],\n "scripts": []\n }\n },\n "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"}\n }\n }\n }\n}\n'); zip.file(folder+"tsconfig.json",'{\n "compileOnSave": false,\n "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]},\n "references":[{"path":"./tsconfig.app.json"}]\n}\n'); zip.file(folder+"tsconfig.app.json",'{\n "extends":"./tsconfig.json",\n "compilerOptions":{"outDir":"./dist/out-tsc","types":[]},\n "files":["src/main.ts"],\n "include":["src/**/*.d.ts"]\n}\n'); zip.file(folder+"src/index.html","\n\n\n \n "+slugTitle(pn)+"\n \n \n \n\n\n \n\n\n"); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser';\nimport { appConfig } from './app/app.config';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent, appConfig)\n .catch(err => console.error(err));\n"); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; }\nbody { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; }\n"); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [RouterOutlet],\n templateUrl: './app.component.html',\n styleUrl: './app.component.css'\n})\nexport class AppComponent {\n title = '"+pn+"';\n}\n"); zip.file(folder+"src/app/app.component.html","
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n \n
\n"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1}\n"); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n provideRouter(routes)\n ]\n};\n"); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router';\n\nexport const routes: Routes = [];\n"); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nng serve\n# or: npm start\n\`\`\`\n\n## Build\n\`\`\`bash\nng build\n\`\`\`\n\nOpen in VS Code with Angular Language Service extension.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n.angular/\n"); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join("\n"):"# add dependencies here\n"; zip.file(folder+"main.py",src||"# "+title+"\n# Generated by PantheraHive BOS\n\nprint(title+\" loaded\")\n"); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\n\`\`\`\n\n## Run\n\`\`\`bash\npython main.py\n\`\`\`\n"); zip.file(folder+".gitignore",".venv/\n__pycache__/\n*.pyc\n.env\n.DS_Store\n"); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+"\n"; zip.file(folder+"package.json",pkgJson); var fallback="const express=require(\"express\");\nconst app=express();\napp.use(express.json());\n\napp.get(\"/\",(req,res)=>{\n res.json({message:\""+title+" API\"});\n});\n\nconst PORT=process.env.PORT||3000;\napp.listen(PORT,()=>console.log(\"Server on port \"+PORT));\n"; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000\n"); zip.file(folder+".gitignore","node_modules/\n.env\n.DS_Store\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\n\`\`\`\n\n## Run\n\`\`\`bash\nnpm run dev\n\`\`\`\n"); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:"\n\n\n\n\n"+title+"\n\n\n\n"+code+"\n\n\n\n"; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e}\n"); zip.file(folder+"script.js","/* "+title+" — scripts */\n"); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Open\nDouble-click \`index.html\` in your browser.\n\nOr serve locally:\n\`\`\`bash\nnpx serve .\n# or\npython3 -m http.server 3000\n\`\`\`\n"); zip.file(folder+".gitignore",".DS_Store\nnode_modules/\n.env\n"); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/\.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/\*\*(.+?)\*\*/g,"$1"); hc=hc.replace(/\n{2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\nFiles:\n- "+app+".md (Markdown)\n- "+app+".html (styled HTML)\n"); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); } function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}