{"_id":"@ai-sdet/test-manager","_rev":"2-6b2fe291fc4189b1d02b5a8d88af8ea3","name":"@ai-sdet/test-manager","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.5":{"name":"@ai-sdet/test-manager","version":"0.1.5","keywords":["sdet","test-management","qa","testing","test-runner","cli"],"author":{"name":"ganeshgaxy"},"license":"MIT","_id":"@ai-sdet/test-manager@0.1.5","maintainers":[{"name":"ganeshgaxy","email":"ganeshgaxy@gmail.com"}],"homepage":"https://github.com/ganeshgaxy/noob-test-manager#readme","bugs":{"url":"https://github.com/ganeshgaxy/noob-test-manager/issues"},"bin":{"noob-sdet":"dist/cli.js"},"dist":{"shasum":"4208efe1c3052d82f485c7309fe2e252b0a1cebd","tarball":"https://registry.npmjs.org/@ai-sdet/test-manager/-/test-manager-0.1.5.tgz","fileCount":30,"integrity":"sha512-EybNpTz/PR4lk+mGg4vf0dQV2OsCG7g+pBzewFVCqldXQVaOuqbLHMY66Gk5dEAe6lI/CTgNWTYXyjHPXvQhpw==","signatures":[{"sig":"MEQCIGyN7x5mnsqMjmc31SBSABtbcq/XsQdTlfC6uOKuD5wJAiAenpl2iFnGfowdwvDgMXEAt7ac5CG6XrDGokT4nDO4xQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3815263},"main":"./dist/server/index.js","type":"module","gitHead":"d220c0223444997ef15b38911c014ea1997f1399","scripts":{"lint":"eslint .","test":"vitest","build":"npm run build:client && npm run build:server","reset":"node scripts/reset-app.mjs","start":"node dist/cli.js","format":"prettier --write .","prepare":"husky","test:ui":"vitest --ui","db:studio":"drizzle-kit studio","db:migrate":"drizzle-kit migrate","dev:client":"vite src/client","dev:server":"tsx watch src/server/index.ts","db:generate":"drizzle-kit generate","build:client":"vite build src/client --outDir ../../dist/client --emptyOutDir","build:server":"tsup","test:coverage":"vitest --coverage"},"_npmUser":{"name":"ganeshgaxy","email":"ganeshgaxy@gmail.com"},"repository":{"url":"git+https://github.com/ganeshgaxy/noob-test-manager.git","type":"git"},"_npmVersion":"10.9.8","description":"A dev tool for SDETs to manage and test web applications","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":"eslint --fix","*.{ts,tsx,js,jsx,json,css,md}":"prettier --write"},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.13.3","clsx":"^2.1.1","hono":"^4.6.0","open":"^10.1.0","ioredis":"^5.4.2","bcryptjs":"^2.4.3","commander":"^12.1.0","lru-cache":"^11.1.0","@tiptap/pm":"^3.26.1","remark-gfm":"^4.0.1","simple-git":"^3.36.0","drizzle-orm":"^0.44.1","tailwindcss":"^4.3.0","lucide-react":"^1.16.0","@tiptap/react":"^3.26.1","@libsql/client":"^0.14.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","@hono/node-server":"^1.13.7","@tailwindcss/vite":"^4.3.0","@tiptap/suggestion":"^3.26.1","@tiptap/starter-kit":"^3.26.1","@radix-ui/react-slot":"^1.2.4","@radix-ui/react-tabs":"^1.1.13","@phosphor-icons/react":"^2.1.10","@radix-ui/react-label":"^2.1.8","@radix-ui/react-avatar":"^1.1.11","@radix-ui/react-dialog":"^1.1.15","@radix-ui/react-select":"^2.2.6","@radix-ui/react-tooltip":"^1.2.8","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.8","@tiptap/extension-mention":"^3.26.1","@radix-ui/react-scroll-area":"^1.2.10","@tiptap/extension-task-item":"^3.26.1","@tiptap/extension-task-list":"^3.26.1","@tiptap/extension-underline":"^3.26.1","@tiptap/extension-placeholder":"^3.26.1","@aws-sdk/client-bedrock-runtime":"^3.1073.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vite":"^5.4.0","husky":"^9.1.7","react":"^18.3.0","eslint":"^10.3.0","vitest":"^4.1.6","prettier":"^3.8.3","@types/pg":"^8.11.10","happy-dom":"^20.9.0","react-dom":"^18.3.0","@eslint/js":"^10.0.1","@vitest/ui":"^4.1.6","typescript":"^5.6.0","@types/node":"^22.0.0","drizzle-kit":"^0.30.4","lint-staged":"^17.0.4","@types/react":"^18.3.0","@types/ioredis":"^4.28.10","@types/bcryptjs":"^2.4.6","@types/react-dom":"^18.3.0","typescript-eslint":"^8.59.3","@vitest/coverage-v8":"^4.1.6","@vitejs/plugin-react":"^4.3.0","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1","@testing-library/user-event":"^14.6.1"},"_npmOperationalInternal":{"tmp":"tmp/test-manager_0.1.5_1787516826033_0.4009682031893018","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@ai-sdet/test-manager","version":"0.1.6","description":"A dev tool for SDETs to manage and test web applications","keywords":["sdet","test-management","qa","testing","test-runner","cli"],"license":"MIT","author":{"name":"ganeshgaxy"},"repository":{"type":"git","url":"git+https://github.com/ganeshgaxy/noob-test-manager.git"},"homepage":"https://github.com/ganeshgaxy/noob-test-manager#readme","bugs":{"url":"https://github.com/ganeshgaxy/noob-test-manager/issues"},"type":"module","bin":{"noob-sdet":"dist/cli.js"},"main":"./dist/server/index.js","scripts":{"dev:client":"vite src/client","dev:server":"tsx watch src/server/index.ts","build:client":"vite build src/client --outDir ../../dist/client --emptyOutDir","build:server":"tsup","build":"npm run build:client && npm run build:server","start":"node dist/cli.js","lint":"eslint .","format":"prettier --write .","test":"vitest","test:ui":"vitest --ui","test:coverage":"vitest --coverage","db:generate":"drizzle-kit generate","db:migrate":"drizzle-kit migrate","db:studio":"drizzle-kit studio","reset":"node scripts/reset-app.mjs","prepare":"husky"},"lint-staged":{"*.{ts,tsx,js,jsx}":"eslint --fix","*.{ts,tsx,js,jsx,json,css,md}":"prettier --write"},"dependencies":{"@aws-sdk/client-bedrock-runtime":"^3.1073.0","@hono/node-server":"^1.13.7","@libsql/client":"^0.14.0","@phosphor-icons/react":"^2.1.10","@radix-ui/react-avatar":"^1.1.11","@radix-ui/react-dialog":"^1.1.15","@radix-ui/react-label":"^2.1.8","@radix-ui/react-scroll-area":"^1.2.10","@radix-ui/react-select":"^2.2.6","@radix-ui/react-separator":"^1.1.8","@radix-ui/react-slot":"^1.2.4","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-tooltip":"^1.2.8","@tailwindcss/vite":"^4.3.0","@tiptap/extension-mention":"^3.26.1","@tiptap/extension-placeholder":"^3.26.1","@tiptap/extension-task-item":"^3.26.1","@tiptap/extension-task-list":"^3.26.1","@tiptap/extension-underline":"^3.26.1","@tiptap/pm":"^3.26.1","@tiptap/react":"^3.26.1","@tiptap/starter-kit":"^3.26.1","@tiptap/suggestion":"^3.26.1","bcryptjs":"^2.4.3","class-variance-authority":"^0.7.1","clsx":"^2.1.1","commander":"^12.1.0","drizzle-orm":"^0.44.1","hono":"^4.6.0","ioredis":"^5.4.2","lru-cache":"^11.1.0","lucide-react":"^1.16.0","open":"^10.1.0","pg":"^8.13.3","react-markdown":"^10.1.0","remark-gfm":"^4.0.1","simple-git":"^3.36.0","tailwind-merge":"^3.6.0","tailwindcss":"^4.3.0"},"devDependencies":{"@eslint/js":"^10.0.1","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@types/bcryptjs":"^2.4.6","@types/ioredis":"^4.28.10","@types/node":"^22.0.0","@types/pg":"^8.11.10","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.3.0","@vitest/coverage-v8":"^4.1.6","@vitest/ui":"^4.1.6","drizzle-kit":"^0.30.4","eslint":"^10.3.0","happy-dom":"^20.9.0","husky":"^9.1.7","lint-staged":"^17.0.4","prettier":"^3.8.3","react":"^18.3.0","react-dom":"^18.3.0","tsup":"^8.3.0","tsx":"^4.19.0","typescript":"^5.6.0","typescript-eslint":"^8.59.3","vite":"^5.4.0","vitest":"^4.1.6"},"_id":"@ai-sdet/test-manager@0.1.6","gitHead":"d772bccce233d2eed569175021b88867d1a7b48a","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-bR74uCGSkVP8VOBSKZ+Gjc3Ka1QkzYPYS51hVGlCbg7esLWAxJ5ebdN+a0oWt94EWoP3ATqRfmt86UrhWVQWSQ==","shasum":"c97365e8241e12001310e22df21d5ede68bd36f0","tarball":"https://registry.npmjs.org/@ai-sdet/test-manager/-/test-manager-0.1.6.tgz","fileCount":30,"unpackedSize":3815254,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCTgCTQ/ivhtPBjLEkwJZPrGEeZ+zVypmg9k0caV6/ZWAIgR2n7JCnYUc4e12skZ6zA1bGXE5+vSvs18kdAhl+P/kE="}]},"_npmUser":{"name":"ganeshgaxy","email":"ganeshgaxy@gmail.com"},"directories":{},"maintainers":[{"name":"ganeshgaxy","email":"ganeshgaxy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/test-manager_0.1.6_1787517075196_0.7418233307084008"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-23T20:27:05.816Z","modified":"2026-08-23T20:31:15.586Z","0.1.5":"2026-08-23T20:27:06.209Z","0.1.6":"2026-08-23T20:31:15.427Z"},"bugs":{"url":"https://github.com/ganeshgaxy/noob-test-manager/issues"},"author":{"name":"ganeshgaxy"},"license":"MIT","homepage":"https://github.com/ganeshgaxy/noob-test-manager#readme","keywords":["sdet","test-management","qa","testing","test-runner","cli"],"repository":{"type":"git","url":"git+https://github.com/ganeshgaxy/noob-test-manager.git"},"description":"A dev tool for SDETs to manage and test web applications","maintainers":[{"name":"ganeshgaxy","email":"ganeshgaxy@gmail.com"}],"readme":"# noob-test-manager\n\n![License](https://img.shields.io/badge/license-MIT-blue) ![Version](https://img.shields.io/badge/version-0.1.5-green)\n\nA lightweight, self-hosted test case management tool for SDETs. Run it as a CLI — it spins up a local server and opens a browser UI. Data stays in local files by default (SQLite). No SaaS subscription required.\n\n---\n\n## Install\n\n```bash\nnpm install -g @ai-sdet/noob-test-manager\n```\n\nOr run without installing globally:\n\n```bash\nnpm install @ai-sdet/noob-test-manager\nnpx @ai-sdet/noob-test-manager start\n```\n\nThen open `http://localhost:3000`. To use a different port:\n\n```bash\nnoob-sdet start --port 4000\n```\n\n### First run\n\nOn first start with an empty database, a super admin account is created automatically:\n\n| Field    | Default                 |\n| -------- | ----------------------- |\n| Email    | `admin@noob-sdet.local` |\n| Password | `Admin1234!`            |\n\nOverride with env vars before starting: `DEFAULT_EMAIL`, `DEFAULT_PASSWORD`. Change the password after first login.\n\nA `noob-sdet.db` file is created in your current directory — that's the main database.\n\n---\n\n## How to Use\n\n### 1. Create an App\n\nFrom the home screen click **New App**. Apps are the top-level container — think \"product\" or \"project\".\n\n### 2. Create a Space\n\nInside an app, create a Space. A space maps to a feature area, squad or test suite. Each space has its own folder tree, tags and member access.\n\n### 3. Organise with Folders\n\nFolders nest infinitely. Use them to mirror your feature structure or test pyramid layers (Smoke / Regression / E2E).\n\n### 4. Write Tests\n\nClick **New Test** inside a folder. Choose between:\n\n- **Traditional** — numbered action + expected result steps\n- **BDD / Gherkin** — Given / When / Then scenarios with multiple scenarios per test\n\nFill in the right-hand metadata panel: category, priority, status, automation status, estimated time, Jira key, assignee, tags.\n\n### 5. Create a Run\n\nGo to **Runs** in the sidebar → **New Run**. Give it a name and an optional environment label (e.g. `staging`). Click **Add Tests** to pick spaces, folders or individual tests.\n\n### 6. Execute\n\nClick **Start** on the run. Tests are grouped by folder. Click a test to open the step-by-step panel on the right. Mark steps individually or use the quick **Pass / Fail / Skip / Block** buttons on each row. Use **bulk select** (checkbox on hover) to mark many tests at once.\n\n### 7. Filter & Sort\n\nUse the filter bar above the test list to narrow by **Status**, **Priority**, **Category** or **Tags**. Toggle the **Folders A→Z** sort to reorder accordion groups.\n\n### 8. Import from TestMu\n\nIn a Space, click **Import → Import from TestMu**. Enter your TestMu host URL, email and API token, then pick a project. The import runs server-side with a live progress stream and preserves the full folder hierarchy, test steps, BDD scenarios, priorities, statuses, tags and Jira links.\n\n### 9. AI workspace (optional)\n\nEach app has an **AI** tab for agent-assisted workflows:\n\n- Chat with orchestrator agents (test plans, notes, analysis, test case generation)\n- Connect Git repos for code-aware context (vector search over indexed source)\n- Per-app AI settings: orchestrator, test case writer profiles, format templates\n\nGlobal LLM and vector embedding providers are configured under **Admin Settings → AI Settings** (super admin). Supported vector providers: **OpenAI** (`text-embedding-3-small` recommended) and **Amazon Bedrock**.\n\n---\n\n## Features\n\n### 🗂 Test Organisation\n\n- **Apps** → **Spaces** → **Folders** → **Tests** hierarchy\n- Traditional step-by-step tests and BDD/Gherkin scenarios\n- Rich text editor for descriptions, preconditions, step actions and expected results\n- Full metadata per test: category, priority, status, automation status, estimated time, Jira issue key, assignee, tags\n\n### 🏃 Test Runs\n\n- Create named runs with optional environment label\n- Add tests by selecting whole spaces, folders or individual tests\n- Mark each test as **Pass / Fail / Skip / Blocked** — with per-step granularity\n- Bulk mark multiple tests at once\n- Filter results by status, priority, category and tags\n- Sort folder groups alphabetically\n- Live pass-rate progress bar and summary stats (total / pass / fail / skip / block / pending)\n- Reset individual tests, folders or the whole run\n- Remove tests from a run without deleting the test\n\n### 📋 Test Detail Panel\n\n- Step-by-step execution view slides in on the right when you click a test in a run\n- Mark individual BDD scenario steps or traditional steps independently\n- Notes field per result for recording observations\n\n### 🔖 Tagging\n\n- Global tags (shared across all apps) and space-scoped tags\n- Tag picker with search, creation and coloured pills\n- Tags displayed inline in test list rows and filterable in runs\n\n### 🔄 TestMu Import\n\n- Import entire projects from [TestMu](https://testmu.io) directly into a space\n- Preserves folder structure, test steps, BDD scenarios, priorities, statuses, tags, Jira links and test categories\n- Server-side streaming import with live progress feed\n\n### 🤖 AI & repo context\n\n- Multi-agent chat (plans, pre-dev analysis, test notes, test case writer)\n- Git repo registration and vector indexing for RAG-style code context\n- Per-app test case writer profiles with configurable knowledge blocks\n- Global AI config: LLM provider (Anthropic, OpenAI, Bedrock, Ollama Cloud, …) and vector provider (OpenAI, Bedrock)\n- Test connection buttons in Admin Settings before saving credentials\n\n### 👥 Users & Access Control\n\n- User accounts with email/password auth\n- Global roles: `super_admin` and `member`\n- Per-app and per-space roles: `admin`, `member`, `viewer`\n- User groups for bulk permission management\n- API tokens for programmatic access\n- SSO support (configurable)\n\n### 🎨 Themes & branding\n\n- Four built-in presets: **Dark** (default), **Purple Night**, **Light**, **Navy**\n- Full custom theme editor — every colour, font and radius is configurable\n- Custom app title and logos (Admin Settings → Branding)\n\n### ⚙️ Settings\n\n- Custom fields per app (text, number, dropdown, multi-select, date, checkbox, URL)\n- Integrations: Jira, GitHub, Slack (configurable webhooks)\n- Tag management at app and space level\n- Admin: database (SQLite / Turso / Postgres), cache, auth, global agents\n\n### 🗑 Trash\n\n- Soft-delete for tests and folders\n- Restore or permanently delete from the trash view\n\n---\n\n## CLI Reference\n\nThe CLI can manage everything headlessly — useful for scripting or CI pipelines. The server must be running (`noob-sdet start`) for these commands.\n\n### Apps\n\n```bash\nnoob-sdet app list\nnoob-sdet app create \"My App\" --description \"Optional description\"\nnoob-sdet app delete <appId>\n```\n\n### Spaces\n\n```bash\nnoob-sdet space list <appId>\nnoob-sdet space create <appId> \"My Space\" --description \"Optional\"\nnoob-sdet space delete <appId> <spaceId>\n```\n\n### Folders\n\n```bash\nnoob-sdet folder list <spaceId>\nnoob-sdet folder create <spaceId> \"My Folder\"\nnoob-sdet folder create <spaceId> \"Nested\" --parent <parentFolderId>\n```\n\n### Tests\n\n```bash\nnoob-sdet test list <folderId>\nnoob-sdet test create <folderId> \"Test title\" --priority High --status Ready\nnoob-sdet test show <folderId> <testId>\nnoob-sdet test delete <folderId> <testId>\n```\n\n### Runs\n\n```bash\nnoob-sdet run list <appId>\nnoob-sdet run create <appId> \"Sprint 42 Regression\"\n```\n\nAll commands accept `--port <port>` if the server is not on `3000`.\n\n---\n\n## Data Storage\n\nBy default everything lives under the directory where you start the server:\n\n| Path                    | Purpose                                        |\n| ----------------------- | ---------------------------------------------- |\n| `noob-sdet.db`          | Main app database (SQLite)                     |\n| `noob-sdet-vector.db`   | Vector index for AI repo search                |\n| `data/repos/`           | Cloned Git repos used for indexing             |\n| `noob-sdet.config.json` | Instance config (DB, cache, auth) — gitignored |\n| `noob-sdet.theme.json`  | Legacy theme export — gitignored               |\n\n**Backup:** copy `noob-sdet.db` (and `noob-sdet-vector.db` if you use AI repos). Restore by putting the files back and restarting.\n\n**Remote databases:** Turso and Postgres can be configured in Admin Settings. The reset script below only removes local SQLite files; remote DBs must be dropped manually.\n\n### Reset to a clean slate\n\nStop the server first, then from a **cloned repo** (development):\n\n```bash\nnpm run reset              # prompts for confirmation\nnpm run reset -- --yes     # skip prompt\nnpm run reset -- --yes --keep-config   # keep noob-sdet.config.json\n```\n\nThis deletes the SQLite database, vector database, `data/`, and instance config files. The next `npm start` bootstraps a fresh admin account.\n\nIf you installed globally (not from a clone), delete the files manually:\n\n```bash\nrm -f noob-sdet.db noob-sdet.db-wal noob-sdet.db-shm\nrm -f noob-sdet-vector.db noob-sdet-vector.db-wal noob-sdet-vector.db-shm\nrm -rf data/\nrm -f noob-sdet.config.json noob-sdet.theme.json\n```\n\n---\n\n## Development\n\n```bash\ngit clone https://github.com/ganeshgaxy/noob-test-manager.git\ncd noob-test-manager\nnpm install\nnpm run build          # build client + server once\nnpm start              # same as noob-sdet start — opens :3000\n\n# Or run client + server separately while developing\nnpm run dev:client     # Vite dev server at :5173\nnpm run dev:server     # Hono API server at :3000 (proxied by Vite)\n\n# Tests & lint\nnpm test\nnpm run test:coverage\nnpm run lint\nnpm run format\n\n# Database tooling (Drizzle)\nnpm run db:generate\nnpm run db:migrate\nnpm run db:studio\n\n# Wipe local data and start fresh (stop server first)\nnpm run reset -- --yes\n```\n\n### Tech Stack\n\n| Layer    | Tech                                                              |\n| -------- | ----------------------------------------------------------------- |\n| UI       | React 18, Vite, Tailwind CSS v4, Radix UI, Phosphor Icons, Tiptap |\n| Server   | Hono on Node.js                                                   |\n| Database | SQLite (default), Turso, or Postgres via Drizzle ORM              |\n| Vector   | libSQL + OpenAI or Amazon Bedrock embeddings                      |\n| Auth     | bcrypt password hashing, API tokens, optional SSO                 |\n| CLI      | Commander.js                                                      |\n| Testing  | Vitest, Testing Library                                           |\n\n---\n\n## Contributing\n\nContributions are welcome. Please open a pull request — direct pushes to `main` are restricted.\n\n1. Fork the repo\n2. Create a feature branch (`git checkout -b feat/my-feature`)\n3. Commit your changes\n4. Push and open a PR\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md"}