{"_id":"@ameshkin/ticket-mate","_rev":"5-159d3c93958ba627ed9bdf5f41d7892a","name":"@ameshkin/ticket-mate","dist-tags":{"latest":"0.1.26"},"versions":{"0.1.20":{"name":"@ameshkin/ticket-mate","version":"0.1.20","keywords":["jira","jira-integration","project-management","ai-agents","cli","automation","development-workflow","backend","api"],"author":{"url":"https://github.com/ameshkin","name":"Amir Meshkin","email":"amir.meshkin@gmail.com"},"license":"MIT","_id":"@ameshkin/ticket-mate@0.1.20","maintainers":[{"name":"nevaro","email":"amir.meshkin@gmail.com"}],"homepage":"https://github.com/nevaroAI/ticket-mate-demo#readme","bugs":{"url":"https://github.com/nevaroAI/ticket-mate-demo/issues"},"bin":{"tm":"scripts/cli-wrapper.mjs","ticket-mate":"scripts/cli-wrapper.mjs","ticket-mate-projects":"public/cli/project-list.js"},"dist":{"shasum":"98ec164613b78c85c3ae608643a97cfdd3dca150","tarball":"https://registry.npmjs.org/@ameshkin/ticket-mate/-/ticket-mate-0.1.20.tgz","fileCount":1379,"integrity":"sha512-jaLth9fRErk4HbvZSw4SVNUBWuWKURCqljMKZ+uNxPPU1j1gKseENMDisgDALDUGHR+GNZJUZgucy0redPuhbQ==","signatures":[{"sig":"MEUCIBuP5re4fp3/tlZTEKHXOoZvgKWGWqHdvyA30lFBXfWBAiEAwZGFy3jNfIMPxkSE9M0X3Wq3+lO77m0IVfwItkQ8Tc0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3508298},"main":"./public/index.js","type":"module","types":"./public/index.d.ts","config":{"ignore-scripts":false},"module":"./public/index.js","engines":{"node":">=20.19 <223"},"exports":{".":{"types":"./public/index.d.ts","default":"./public/index.js"},"./cli":{"types":"./public/cli/index.d.ts","default":"./public/cli/index.js"}},"gitHead":"d1ad5e047223e3bc56fc23a2bbd21d23851472ba","private":false,"scripts":{"db":"rm -rf node_modules/.prisma && prisma generate && prisma validate","go":"npm test && npm run build && git add . && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","dev":"npx next dev -p 4000","lint":"eslint . --ext .js,.jsx,.ts,.tsx","seed":"tsx prisma/seed.ts","test":"vitest --config tests/vitest.config.ts","build":"npm run build:app","clean":"rm -rf .next public dist node_modules/.vite node_modules/.cache","ngrok":"ngrok start ticket-mate --config ngrok.yml","start":"npx next start -p 4000","deploy":"npm run typecheck && npm run build:app && npm publish","dev:ui":"npx next dev -p 4000","predev":"npm run build:lib && npm run db:bootstrap","analyze":"cross-env ANALYZE=true next build --webpack","db:seed":"tsx prisma/seed.ts","db:test":"bash scripts/test-db-connection.sh","dev:all":"concurrently \"npm run dev:server\" \"npm run dev:ui\"","lint:ui":"eslint src/app --ext ts,tsx --report-unused-disable-directives","prepare":"husky install","preview":"npx next start -p 4000","build:ui":"npm run build:app","db:reset":"prisma migrate reset --force && npm run db:seed","dev:full":"concurrently -n \"next,ngrok\" -c \"cyan,magenta\" \"npm run dev\" \"npm run ngrok\"","prebuild":"npm run prisma:generate && npm run prebuild:check","prestart":"npm run build:lib","sync:lib":"bash scripts/sync-lib-from-local.sh","test:all":"npm run test:run","test:e2e":"playwright test --config tests/playwright.config.ts","test:run":"vitest run --config tests/vitest.config.ts","audit:fix":"npm audit fix --omit=dev","build:app":"npm run prisma:generate && npm run build:package && npm run prebuild:check && next build","build:lib":"bash scripts/build-lib.sh","check:env":"tsx scripts/check-env.ts","db:tunnel":"ssh -L 15432:localhost:5432 root@72.61.71.227","test:jira":"npm run build && node scripts/test-jira-connection.mjs","test:unit":"vitest run --config tests/vitest.config.ts","typecheck":"bash scripts/typecheck-log.sh","dev:server":"tsx src/server/index.ts","test:login":"tsx scripts/test-login.ts","test:watch":"vitest watch --config tests/vitest.config.ts","build:check":"npm run prebuild:check && npm run typecheck && next build","clean-build":"bash ./scripts/orchestrator-clean-build.sh","clean-locks":"bash scripts/clean-locks.sh","cleanup:env":"node scripts/cleanup-env-files.mjs","prebuild:ui":"mkdir -p .orchestrator &&  .orchestrator/tickets/bugs/bugs.json || true","prisma:seed":"prisma db seed","publish:all":"npm run build && npm run test:run && npm version patch -m \"chore(release): %s\" && git push --follow-tags && npm publish","release:pre":"npm run typecheck && npm run test:run && npm run build:app","seed:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx prisma/seed.ts","test:e2e:ui":"playwright test --ui --config tests/playwright.config.ts","db:bootstrap":"tsx scripts/dev/bootstrap-db.ts","migrate:bugs":"tsx scripts/migrate-bugs-json.ts","test:gherkin":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts","typecheck:ui":"tsc --noEmit","vercel-build":"node scripts/vercel-migrate.mjs && npm run build:app","build:package":"mkdir -p public && npx tsc -p tsconfig.build.json --skipLibCheck || true","prisma:studio":"prisma studio","publish:patch":"npm run release:patch","release:patch":"npm run release:pre && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","security:scan":"tsx scripts/security-check.ts all","test:coverage":"vitest run --coverage --config tests/vitest.config.ts","test:e2e:cart":"tsx scripts/test-cart-e2e.ts","webhooks:list":"tsx scripts/list-jira-webhooks.ts","check:env-auth":"tsx scripts/check-env-auth.ts","check:env-keys":"tsx scripts/check-env-keys.ts","db:test:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx prisma db execute --stdin <<< \"SELECT 1;\"","prebuild:check":"node scripts/pre-build-checker.mjs","prepublishOnly":"npm run build","prisma:migrate":"prisma migrate dev","publish:github":"npm run release:patch","security:check":"tsx scripts/security-check.ts staged","test:e2e:debug":"playwright test --debug --config tests/playwright.config.ts","test:e2e:watch":"jasmine --config tests/jasmine/jasmine.json --watch","vercel:env:dev":"node scripts/vercel-sync-env.mjs --target development","migrate:jm-mate":"tsx scripts/migrate-jm-mate.ts","orchestrator:ci":"ts-node ./scripts/orchestrator-ci.ts","prisma:generate":"npx prisma generate","prisma:selftest":"node scripts/prisma-selftest.cjs","test:all:strict":"npm run typecheck && npm run test:run","test:automation":"tsx scripts/test-automation-api.ts","test:e2e:headed":"playwright test --headed --config tests/playwright.config.ts","test:unit:watch":"vitest watch --config tests/vitest.config.ts","vercel:env:prod":"node scripts/vercel-sync-env.mjs --target production","check:local-user":"tsx scripts/check-local-user.ts","db:tunnel:stable":"ssh -i /Users/amirmeshkin/.ssh/hostinger_ollama -N -L 5433:localhost:5432 root@72.61.71.227","validate:jm-data":"tsx scripts/validate-jm-data.ts","security:validate":"tsx scripts/security-check.ts config","test:login:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx scripts/test-login.ts","webhooks:register":"tsx scripts/register-jira-webhook.ts","migrate:users-core":"tsx scripts/migrate-users-to-customer-and-ai-tokens.ts","prisma:migrate:dev":"prisma migrate dev","test:gherkin:watch":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts --watch","vercel:env:preview":"node scripts/vercel-sync-env.mjs --target preview","prisma:studio:remote":"bash scripts/prisma-studio-remote.sh","prisma:studio:server":"bash scripts/prisma-studio-remote-server.sh","prisma:migrate:deploy":"prisma migrate deploy","test:automation:direct":"node --loader ts-node/esm scripts/test-automation-direct.ts","test:automation:simple":"node scripts/test-automation-simple.mjs","webhooks:delete-legacy":"tsx scripts/delete-legacy-webhooks.ts","prebuild:skip-typecheck":"echo '⏭️  Skipping typecheck (temporary)'","fix:notifications-userid":"bash scripts/fix-notifications-userid.sh","orchestrator:clean-build":"bash ./scripts/orchestrator-clean-build.sh","migrate:notification-userid":"node scripts/apply-notifications-userid-migration.mjs","orchestrator:clean-build-push":"bash .orchestrator/scripts/clean-build-test-push.sh"},"_npmUser":{"name":"nevaro","email":"amir.meshkin@gmail.com"},"repository":{"url":"git+https://github.com/nevaroAI/ticket-mate-demo.git","type":"git"},"_npmVersion":"11.7.0","description":"Jira integration and AI execution layer - bridges Jira tickets and AI-assisted development workflows (backend package)","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,md,css,scss}":["prettier --write"]},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"ai":"^5.0.115","zod":"^3.25.76","cors":"^2.8.5","next":"^16.0.0","konva":"^10.0.12","react":"^18.3.1","moment":"^2.30.1","openai":"^4.78.1","resend":"^6.6.0","stripe":"^17.7.0","express":"^4.18.0","js-yaml":"^4.1.1","lexical":"^0.39.0","bcryptjs":"^2.4.3","date-fns":"^3.3.1","commander":"^14.0.2","next-auth":"^4.24.13","react-dom":"^18.3.1","reactflow":"^11.11.4","@mui/system":"^7.0.0","react-konva":"^18.2.14","@dnd-kit/core":"^6.3.1","@lexical/code":"^0.39.0","@lexical/html":"^0.39.0","@lexical/link":"^0.39.0","@lexical/list":"^0.39.0","@mui/material":"^7.0.0","@octokit/rest":"^22.0.1","framer-motion":"^12.23.26","swagger-jsdoc":"^6.2.8","@emotion/cache":"^11.13.5","@emotion/react":"^11.13.5","@lexical/react":"^0.39.0","@lexical/table":"^0.39.0","@lexical/utils":"^0.39.0","@prisma/client":"^6.19.0","better-sqlite3":"^12.5.0","@emotion/styled":"^11.13.5","react-hot-toast":"^2.6.0","@lexical/history":"^0.39.0","@dnd-kit/sortable":"^10.0.0","@hello-pangea/dnd":"^18.0.1","@lexical/markdown":"^0.39.0","@octokit/auth-app":"^8.1.2","@aws-sdk/client-s3":"^3.956.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@lexical/clipboard":"^0.39.0","@lexical/rich-text":"^0.39.0","@lexical/selection":"^0.39.0","@replit/extensions":"^1.10.0","react-hotkeys-hook":"^5.2.1","swagger-ui-express":"^5.0.1","@hookform/resolvers":"^5.2.2","@mui/icons-material":"^7.0.0","@ameshkin/nextcrumbs":"^0.2.0","@mui/material-nextjs":"^7.3.5","@tanstack/react-query":"^5.90.12","@replit/extensions-react":"^0.6.0","@next-auth/prisma-adapter":"^1.0.7","react-international-phone":"^4.6.1","@ameshkin/markdown-handler":"^0.1.7","micromark-util-sanitize-uri":"^2.0.1","@tanstack/react-query-devtools":"^5.91.1"},"_hasShrinkwrap":false,"packageManager":"npm@10.5.0","devDependencies":{"tsx":"^4.20.6","husky":"^9.0.11","jsdom":"^23.0.1","ngrok":"^5.0.0-beta.2","dotenv":"^17.2.3","eslint":"^8.57.0","prisma":"^6.19.0","vitest":"^4.0.6","yamljs":"^0.3.0","jasmine":"^5.1.1","ts-node":"^10.9.2","zustand":"^4.5.0","recharts":"^2.15.4","cross-env":"^10.1.0","remark-gfm":"^4.0.0","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^20.19.25","lint-staged":"^16.2.7","@types/react":"^18.3.27","concurrently":"^8.2.2","@types/yamljs":"^0.2.34","@types/express":"^5.0.5","@types/jasmine":"^5.1.4","@types/js-yaml":"^4.0.9","react-markdown":"^9.0.1","@types/bcryptjs":"^2.4.6","react-hook-form":"^7.50.0","@eslint/eslintrc":"^3.3.3","@playwright/test":"^1.40.0","@types/react-dom":"^18.3.1","react-router-dom":"^6.22.0","reflect-metadata":"^0.2.2","@cucumber/gherkin":"^29.0.0","sort-package-json":"^2.10.0","@cucumber/cucumber":"^12.2.0","@cucumber/messages":"^24.0.0","eslint-config-next":"^15.0.0","@vitest/coverage-v8":"^4.0.6","@axe-core/playwright":"^4.8.0","@monaco-editor/react":"^4.6.0","@testing-library/dom":"^10.4.0","@types/swagger-jsdoc":"^6.0.4","@next/bundle-analyzer":"^16.1.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.0.0","@cucumber/gherkin-utils":"^9.0.0","baseline-browser-mapping":"^2.8.32","@cucumber/gherkin-streams":"^6.0.0","@testing-library/jest-dom":"^6.1.5","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.1","eslint-plugin-react-refresh":"^0.4.5","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ticket-mate_0.1.20_1767738976401_0.2585046742992074","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"@ameshkin/ticket-mate","version":"0.1.21","keywords":["jira","jira-integration","project-management","ai-agents","cli","automation","development-workflow","backend","api"],"author":{"url":"https://github.com/ameshkin","name":"Amir Meshkin","email":"amir.meshkin@gmail.com"},"license":"MIT","_id":"@ameshkin/ticket-mate@0.1.21","maintainers":[{"name":"nevaro","email":"amir.meshkin@gmail.com"}],"homepage":"https://github.com/nevaroAI/ticket-mate-demo#readme","bugs":{"url":"https://github.com/nevaroAI/ticket-mate-demo/issues"},"bin":{"tm":"scripts/cli-wrapper.mjs","ticket-mate":"scripts/cli-wrapper.mjs","ticket-mate-projects":"public/cli/project-list.js"},"dist":{"shasum":"3ae43b09630f93514d5c5d13112e707d22054e82","tarball":"https://registry.npmjs.org/@ameshkin/ticket-mate/-/ticket-mate-0.1.21.tgz","fileCount":1370,"integrity":"sha512-jhAai3XfxNuLmKdyFbGWXD7nAssrZqdMWFXgHWozC5u3WqJaNdCFnUPBFSyLFWdWgpvjNYXXyo7xjbPVH6NEZA==","signatures":[{"sig":"MEYCIQD+DSt4HzdnKlBXNe76/2gbblTT0BAh7WZcTYenamdxBgIhAMBZOb27OmpCU0DyfvV2MInmpxAmOJBuNtSmENOtxZJX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3412305},"main":"./public/index.js","type":"module","types":"./public/index.d.ts","config":{"ignore-scripts":false},"module":"./public/index.js","engines":{"node":">=20.19 <223"},"exports":{".":{"types":"./public/index.d.ts","default":"./public/index.js"},"./cli":{"types":"./public/cli/index.d.ts","default":"./public/cli/index.js"}},"gitHead":"1cab7a904e71d9c1ffecda061b11efc22d061ad4","private":false,"scripts":{"db":"rm -rf node_modules/.prisma && prisma generate && prisma validate","go":"npm test && npm run build && git add . && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","dev":"npx next dev -p 4000","lint":"eslint . --ext .js,.jsx,.ts,.tsx","seed":"tsx prisma/seed.ts","test":"vitest --config tests/vitest.config.ts","build":"npm run build:app","clean":"rm -rf .next public dist node_modules/.vite node_modules/.cache","ngrok":"ngrok start ticket-mate --config ngrok.yml","start":"npx next start -p 4000","deploy":"npm run typecheck && npm run build:app && npm publish","dev:ui":"npx next dev -p 4000","predev":"npm run build:lib && npm run db:bootstrap","analyze":"cross-env ANALYZE=true next build --webpack","db:seed":"tsx prisma/seed.ts","db:test":"bash scripts/test-db-connection.sh","dev:all":"concurrently \"npm run dev:server\" \"npm run dev:ui\"","lint:ui":"eslint src/app --ext ts,tsx --report-unused-disable-directives","prepare":"husky install","preview":"npx next start -p 4000","build:ui":"npm run build:app","db:reset":"prisma migrate reset --force && npm run db:seed","dev:full":"concurrently -n \"next,ngrok\" -c \"cyan,magenta\" \"npm run dev\" \"npm run ngrok\"","prebuild":"npm run prisma:generate && npm run prebuild:check","prestart":"npm run build:lib","sync:lib":"bash scripts/sync-lib-from-local.sh","test:all":"npm run test:run","test:e2e":"playwright test --config tests/playwright.config.ts","test:run":"vitest run --config tests/vitest.config.ts","audit:fix":"npm audit fix --omit=dev","build:app":"npm run prisma:generate && npm run build:package && npm run prebuild:check && next build","build:lib":"bash scripts/build-lib.sh","check:env":"tsx scripts/check-env.ts","db:tunnel":"ssh -L 15432:localhost:5432 root@72.61.71.227","test:jira":"npm run build && node scripts/test-jira-connection.mjs","test:unit":"vitest run --config tests/vitest.config.ts","typecheck":"bash scripts/typecheck-log.sh","dev:server":"tsx src/server/index.ts","test:login":"tsx scripts/test-login.ts","test:watch":"vitest watch --config tests/vitest.config.ts","build:check":"npm run prebuild:check && npm run typecheck && next build","clean-build":"bash ./scripts/orchestrator-clean-build.sh","clean-locks":"bash scripts/clean-locks.sh","cleanup:env":"node scripts/cleanup-env-files.mjs","prebuild:ui":"mkdir -p .orchestrator &&  .orchestrator/tickets/bugs/bugs.json || true","prisma:seed":"prisma db seed","publish:all":"npm run build && npm run test:run && npm version patch -m \"chore(release): %s\" && git push --follow-tags && npm publish","release:pre":"npm run typecheck && npm run test:run && npm run build:app","seed:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx prisma/seed.ts","test:e2e:ui":"playwright test --ui --config tests/playwright.config.ts","db:bootstrap":"tsx scripts/dev/bootstrap-db.ts","migrate:bugs":"tsx scripts/migrate-bugs-json.ts","test:gherkin":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts","typecheck:ui":"tsc --noEmit","vercel-build":"node scripts/vercel-migrate.mjs && npm run build:app","build:package":"mkdir -p public && npx tsc -p tsconfig.build.json --skipLibCheck || true","prisma:studio":"prisma studio","publish:patch":"npm run release:patch","release:patch":"npm run release:pre && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","security:scan":"tsx scripts/security-check.ts all","test:coverage":"vitest run --coverage --config tests/vitest.config.ts","test:e2e:cart":"tsx scripts/test-cart-e2e.ts","webhooks:list":"tsx scripts/list-jira-webhooks.ts","check:env-auth":"tsx scripts/check-env-auth.ts","check:env-keys":"tsx scripts/check-env-keys.ts","db:test:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx prisma db execute --stdin <<< \"SELECT 1;\"","prebuild:check":"node scripts/pre-build-checker.mjs","prepublishOnly":"npm run build","prisma:migrate":"prisma migrate dev","publish:github":"npm run release:patch","security:check":"tsx scripts/security-check.ts staged","test:e2e:debug":"playwright test --debug --config tests/playwright.config.ts","test:e2e:watch":"jasmine --config tests/jasmine/jasmine.json --watch","vercel:env:dev":"node scripts/vercel-sync-env.mjs --target development","migrate:jm-mate":"tsx scripts/migrate-jm-mate.ts","orchestrator:ci":"ts-node ./scripts/orchestrator-ci.ts","prisma:generate":"npx prisma generate","prisma:selftest":"node scripts/prisma-selftest.cjs","test:all:strict":"npm run typecheck && npm run test:run","test:automation":"tsx scripts/test-automation-api.ts","test:e2e:headed":"playwright test --headed --config tests/playwright.config.ts","test:unit:watch":"vitest watch --config tests/vitest.config.ts","vercel:env:prod":"node scripts/vercel-sync-env.mjs --target production","check:local-user":"tsx scripts/check-local-user.ts","db:tunnel:stable":"ssh -i /Users/amirmeshkin/.ssh/hostinger_ollama -N -L 5433:localhost:5432 root@72.61.71.227","validate:jm-data":"tsx scripts/validate-jm-data.ts","security:validate":"tsx scripts/security-check.ts config","test:login:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx scripts/test-login.ts","webhooks:register":"tsx scripts/register-jira-webhook.ts","migrate:users-core":"tsx scripts/migrate-users-to-customer-and-ai-tokens.ts","prisma:migrate:dev":"prisma migrate dev","test:gherkin:watch":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts --watch","vercel:env:preview":"node scripts/vercel-sync-env.mjs --target preview","prisma:studio:remote":"bash scripts/prisma-studio-remote.sh","prisma:studio:server":"bash scripts/prisma-studio-remote-server.sh","prisma:migrate:deploy":"prisma migrate deploy","test:automation:direct":"node --loader ts-node/esm scripts/test-automation-direct.ts","test:automation:simple":"node scripts/test-automation-simple.mjs","webhooks:delete-legacy":"tsx scripts/delete-legacy-webhooks.ts","prebuild:skip-typecheck":"echo '⏭️  Skipping typecheck (temporary)'","fix:notifications-userid":"bash scripts/fix-notifications-userid.sh","orchestrator:clean-build":"bash ./scripts/orchestrator-clean-build.sh","migrate:notification-userid":"node scripts/apply-notifications-userid-migration.mjs","orchestrator:clean-build-push":"bash .orchestrator/scripts/clean-build-test-push.sh"},"_npmUser":{"name":"nevaro","email":"amir.meshkin@gmail.com"},"repository":{"url":"git+https://github.com/nevaroAI/ticket-mate-demo.git","type":"git"},"_npmVersion":"11.7.0","description":"Jira integration and AI execution layer - bridges Jira tickets and AI-assisted development workflows (backend package)","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,md,css,scss}":["prettier --write"]},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"ai":"^5.0.115","zod":"^3.25.76","cors":"^2.8.5","next":"^16.0.0","konva":"^10.0.12","react":"^18.3.1","moment":"^2.30.1","openai":"^4.78.1","resend":"^6.6.0","stripe":"^17.7.0","express":"^4.18.0","js-yaml":"^4.1.1","lexical":"^0.39.0","bcryptjs":"^2.4.3","date-fns":"^3.3.1","commander":"^14.0.2","next-auth":"^4.24.13","react-dom":"^18.3.1","reactflow":"^11.11.4","@mui/system":"^7.0.0","react-konva":"^18.2.14","@dnd-kit/core":"^6.3.1","@lexical/code":"^0.39.0","@lexical/html":"^0.39.0","@lexical/link":"^0.39.0","@lexical/list":"^0.39.0","@mui/material":"^7.0.0","@octokit/rest":"^22.0.1","framer-motion":"^12.23.26","swagger-jsdoc":"^6.2.8","@emotion/cache":"^11.13.5","@emotion/react":"^11.13.5","@lexical/react":"^0.39.0","@lexical/table":"^0.39.0","@lexical/utils":"^0.39.0","@prisma/client":"^6.19.0","better-sqlite3":"^12.5.0","@emotion/styled":"^11.13.5","react-hot-toast":"^2.6.0","@lexical/history":"^0.39.0","@dnd-kit/sortable":"^10.0.0","@hello-pangea/dnd":"^18.0.1","@lexical/markdown":"^0.39.0","@octokit/auth-app":"^8.1.2","@aws-sdk/client-s3":"^3.956.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@lexical/clipboard":"^0.39.0","@lexical/rich-text":"^0.39.0","@lexical/selection":"^0.39.0","@replit/extensions":"^1.10.0","react-hotkeys-hook":"^5.2.1","swagger-ui-express":"^5.0.1","@hookform/resolvers":"^5.2.2","@mui/icons-material":"^7.0.0","@ameshkin/nextcrumbs":"^0.2.0","@mui/material-nextjs":"^7.3.5","@tanstack/react-query":"^5.90.12","@replit/extensions-react":"^0.6.0","@next-auth/prisma-adapter":"^1.0.7","react-international-phone":"^4.6.1","@ameshkin/markdown-handler":"^0.1.7","micromark-util-sanitize-uri":"^2.0.1","@tanstack/react-query-devtools":"^5.91.1"},"_hasShrinkwrap":false,"packageManager":"npm@10.5.0","devDependencies":{"tsx":"^4.20.6","husky":"^9.0.11","jsdom":"^23.0.1","ngrok":"^5.0.0-beta.2","dotenv":"^17.2.3","eslint":"^8.57.0","prisma":"^6.19.0","vitest":"^4.0.6","yamljs":"^0.3.0","jasmine":"^5.1.1","ts-node":"^10.9.2","zustand":"^4.5.0","recharts":"^2.15.4","cross-env":"^10.1.0","remark-gfm":"^4.0.0","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^20.19.25","lint-staged":"^16.2.7","@types/react":"^18.3.27","concurrently":"^8.2.2","@types/yamljs":"^0.2.34","@types/express":"^5.0.5","@types/jasmine":"^5.1.4","@types/js-yaml":"^4.0.9","react-markdown":"^9.0.1","@types/bcryptjs":"^2.4.6","react-hook-form":"^7.50.0","@eslint/eslintrc":"^3.3.3","@playwright/test":"^1.40.0","@types/react-dom":"^18.3.1","react-router-dom":"^6.22.0","reflect-metadata":"^0.2.2","@cucumber/gherkin":"^29.0.0","sort-package-json":"^2.10.0","@cucumber/cucumber":"^12.2.0","@cucumber/messages":"^24.0.0","eslint-config-next":"^15.0.0","@vitest/coverage-v8":"^4.0.6","@axe-core/playwright":"^4.8.0","@monaco-editor/react":"^4.6.0","@testing-library/dom":"^10.4.0","@types/swagger-jsdoc":"^6.0.4","@next/bundle-analyzer":"^16.1.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.0.0","@cucumber/gherkin-utils":"^9.0.0","baseline-browser-mapping":"^2.8.32","@cucumber/gherkin-streams":"^6.0.0","@testing-library/jest-dom":"^6.1.5","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.1","eslint-plugin-react-refresh":"^0.4.5","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ticket-mate_0.1.21_1767743792116_0.33855794296582054","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"@ameshkin/ticket-mate","version":"0.1.22","keywords":["jira","jira-integration","project-management","ai-agents","cli","automation","development-workflow","backend","api"],"author":{"url":"https://github.com/ameshkin","name":"Amir Meshkin","email":"amir.meshkin@gmail.com"},"license":"MIT","_id":"@ameshkin/ticket-mate@0.1.22","maintainers":[{"name":"nevaro","email":"amir.meshkin@gmail.com"}],"homepage":"https://github.com/nevaroAI/ticket-mate-demo#readme","bugs":{"url":"https://github.com/nevaroAI/ticket-mate-demo/issues"},"bin":{"tm":"scripts/cli-wrapper.mjs","ticket-mate":"scripts/cli-wrapper.mjs","ticket-mate-projects":"public/cli/project-list.js"},"dist":{"shasum":"0cf5e6e7f88c638ccdb7eb94247f4dbc889cda8d","tarball":"https://registry.npmjs.org/@ameshkin/ticket-mate/-/ticket-mate-0.1.22.tgz","fileCount":1370,"integrity":"sha512-/osXVoUMVjBNpzP5YYv3xby7t9u+z3gWAaGs8n2QfCJ3f0Q/ErmMaXEuKpR+y0rrv9sY52Y/GJvaE5bdnH7FJA==","signatures":[{"sig":"MEUCIHfWvHvJJs8V693ojkRofkwRBqt83AhnLh00RHmNhejJAiEAsEMJEXE29yzxfpvhwJzXpnFhoTX/9at1TaNj3E+cq38=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3412305},"main":"./public/index.js","type":"module","types":"./public/index.d.ts","config":{"ignore-scripts":false},"module":"./public/index.js","engines":{"node":">=20.19 <223"},"exports":{".":{"types":"./public/index.d.ts","default":"./public/index.js"},"./cli":{"types":"./public/cli/index.d.ts","default":"./public/cli/index.js"}},"gitHead":"449ed8c2013f2aa894409393ef879fd0da8f57d1","private":false,"scripts":{"db":"rm -rf node_modules/.prisma && prisma generate && prisma validate","go":"npm test && npm run build && git add . && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","dev":"npx next dev -p 4000","lint":"eslint . --ext .js,.jsx,.ts,.tsx","seed":"tsx prisma/seed.ts","test":"vitest --config tests/vitest.config.ts","build":"npm run build:app","clean":"rm -rf .next public dist node_modules/.vite node_modules/.cache","ngrok":"ngrok start ticket-mate --config ngrok.yml","start":"npx next start -p 4000","deploy":"npm run typecheck && npm run build:app && npm publish","dev:ui":"npx next dev -p 4000","predev":"npm run build:lib && npm run db:bootstrap","analyze":"cross-env ANALYZE=true next build --webpack","db:seed":"tsx prisma/seed.ts","db:test":"bash scripts/test-db-connection.sh","dev:all":"concurrently \"npm run dev:server\" \"npm run dev:ui\"","lint:ui":"eslint src/app --ext ts,tsx --report-unused-disable-directives","prepare":"husky install","preview":"npx next start -p 4000","build:ui":"npm run build:app","db:reset":"prisma migrate reset --force && npm run db:seed","dev:full":"concurrently -n \"next,ngrok\" -c \"cyan,magenta\" \"npm run dev\" \"npm run ngrok\"","prebuild":"npm run prisma:generate && npm run prebuild:check","prestart":"npm run build:lib","sync:lib":"bash scripts/sync-lib-from-local.sh","test:all":"npm run test:run","test:e2e":"playwright test --config tests/playwright.config.ts","test:run":"vitest run --config tests/vitest.config.ts","audit:fix":"npm audit fix --omit=dev","build:app":"npm run prisma:generate && npm run build:package && npm run prebuild:check && next build","build:lib":"bash scripts/build-lib.sh","check:env":"tsx scripts/check-env.ts","db:tunnel":"ssh -L 15432:localhost:5432 root@72.61.71.227","test:jira":"npm run build && node scripts/test-jira-connection.mjs","test:unit":"vitest run --config tests/vitest.config.ts","typecheck":"bash scripts/typecheck-log.sh","dev:server":"tsx src/server/index.ts","test:login":"tsx scripts/test-login.ts","test:watch":"vitest watch --config tests/vitest.config.ts","build:check":"npm run prebuild:check && npm run typecheck && next build","clean-build":"bash ./scripts/orchestrator-clean-build.sh","clean-locks":"bash scripts/clean-locks.sh","cleanup:env":"node scripts/cleanup-env-files.mjs","prebuild:ui":"mkdir -p .orchestrator &&  .orchestrator/tickets/bugs/bugs.json || true","prisma:seed":"prisma db seed","publish:all":"npm run build && npm run test:run && npm version patch -m \"chore(release): %s\" && git push --follow-tags && npm publish","release:pre":"npm run typecheck && npm run test:run && npm run build:app","seed:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx prisma/seed.ts","test:e2e:ui":"playwright test --ui --config tests/playwright.config.ts","db:bootstrap":"tsx scripts/dev/bootstrap-db.ts","migrate:bugs":"tsx scripts/migrate-bugs-json.ts","test:gherkin":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts","typecheck:ui":"tsc --noEmit","vercel-build":"node scripts/vercel-migrate.mjs && npm run build:app","build:package":"mkdir -p public && npx tsc -p tsconfig.build.json --skipLibCheck || true","prisma:studio":"prisma studio","publish:patch":"npm run release:patch","release:patch":"npm run release:pre && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","security:scan":"tsx scripts/security-check.ts all","test:coverage":"vitest run --coverage --config tests/vitest.config.ts","test:e2e:cart":"tsx scripts/test-cart-e2e.ts","webhooks:list":"tsx scripts/list-jira-webhooks.ts","check:env-auth":"tsx scripts/check-env-auth.ts","check:env-keys":"tsx scripts/check-env-keys.ts","db:test:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx prisma db execute --stdin <<< \"SELECT 1;\"","prebuild:check":"node scripts/pre-build-checker.mjs","prepublishOnly":"npm run build","prisma:migrate":"prisma migrate dev","publish:github":"npm run release:patch","security:check":"tsx scripts/security-check.ts staged","test:e2e:debug":"playwright test --debug --config tests/playwright.config.ts","test:e2e:watch":"jasmine --config tests/jasmine/jasmine.json --watch","vercel:env:dev":"node scripts/vercel-sync-env.mjs --target development","migrate:jm-mate":"tsx scripts/migrate-jm-mate.ts","orchestrator:ci":"ts-node ./scripts/orchestrator-ci.ts","prisma:generate":"npx prisma generate","prisma:selftest":"node scripts/prisma-selftest.cjs","test:all:strict":"npm run typecheck && npm run test:run","test:automation":"tsx scripts/test-automation-api.ts","test:e2e:headed":"playwright test --headed --config tests/playwright.config.ts","test:unit:watch":"vitest watch --config tests/vitest.config.ts","vercel:env:prod":"node scripts/vercel-sync-env.mjs --target production","check:local-user":"tsx scripts/check-local-user.ts","db:tunnel:stable":"ssh -i /Users/amirmeshkin/.ssh/hostinger_ollama -N -L 5433:localhost:5432 root@72.61.71.227","validate:jm-data":"tsx scripts/validate-jm-data.ts","security:validate":"tsx scripts/security-check.ts config","test:login:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx scripts/test-login.ts","webhooks:register":"tsx scripts/register-jira-webhook.ts","migrate:users-core":"tsx scripts/migrate-users-to-customer-and-ai-tokens.ts","prisma:migrate:dev":"prisma migrate dev","test:gherkin:watch":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts --watch","vercel:env:preview":"node scripts/vercel-sync-env.mjs --target preview","prisma:studio:remote":"bash scripts/prisma-studio-remote.sh","prisma:studio:server":"bash scripts/prisma-studio-remote-server.sh","prisma:migrate:deploy":"prisma migrate deploy","test:automation:direct":"node --loader ts-node/esm scripts/test-automation-direct.ts","test:automation:simple":"node scripts/test-automation-simple.mjs","webhooks:delete-legacy":"tsx scripts/delete-legacy-webhooks.ts","prebuild:skip-typecheck":"echo '⏭️  Skipping typecheck (temporary)'","fix:notifications-userid":"bash scripts/fix-notifications-userid.sh","orchestrator:clean-build":"bash ./scripts/orchestrator-clean-build.sh","migrate:notification-userid":"node scripts/apply-notifications-userid-migration.mjs","orchestrator:clean-build-push":"bash .orchestrator/scripts/clean-build-test-push.sh"},"_npmUser":{"name":"nevaro","email":"amir.meshkin@gmail.com"},"repository":{"url":"git+https://github.com/nevaroAI/ticket-mate-demo.git","type":"git"},"_npmVersion":"11.7.0","description":"Jira integration and AI execution layer - bridges Jira tickets and AI-assisted development workflows (backend package)","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,md,css,scss}":["prettier --write"]},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"ai":"^5.0.115","zod":"^3.25.76","cors":"^2.8.5","next":"^16.0.0","konva":"^10.0.12","react":"^18.3.1","moment":"^2.30.1","openai":"^4.78.1","resend":"^6.6.0","stripe":"^17.7.0","express":"^4.18.0","js-yaml":"^4.1.1","lexical":"^0.39.0","bcryptjs":"^2.4.3","date-fns":"^3.3.1","commander":"^14.0.2","next-auth":"^4.24.13","react-dom":"^18.3.1","reactflow":"^11.11.4","@mui/system":"^7.0.0","react-konva":"^18.2.14","@dnd-kit/core":"^6.3.1","@lexical/code":"^0.39.0","@lexical/html":"^0.39.0","@lexical/link":"^0.39.0","@lexical/list":"^0.39.0","@mui/material":"^7.0.0","@octokit/rest":"^22.0.1","framer-motion":"^12.23.26","swagger-jsdoc":"^6.2.8","@emotion/cache":"^11.13.5","@emotion/react":"^11.13.5","@lexical/react":"^0.39.0","@lexical/table":"^0.39.0","@lexical/utils":"^0.39.0","@prisma/client":"^6.19.0","better-sqlite3":"^12.5.0","@emotion/styled":"^11.13.5","react-hot-toast":"^2.6.0","@lexical/history":"^0.39.0","@dnd-kit/sortable":"^10.0.0","@hello-pangea/dnd":"^18.0.1","@lexical/markdown":"^0.39.0","@octokit/auth-app":"^8.1.2","@aws-sdk/client-s3":"^3.956.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@lexical/clipboard":"^0.39.0","@lexical/rich-text":"^0.39.0","@lexical/selection":"^0.39.0","@replit/extensions":"^1.10.0","react-hotkeys-hook":"^5.2.1","swagger-ui-express":"^5.0.1","@hookform/resolvers":"^5.2.2","@mui/icons-material":"^7.0.0","@ameshkin/nextcrumbs":"^0.2.0","@mui/material-nextjs":"^7.3.5","@tanstack/react-query":"^5.90.12","@replit/extensions-react":"^0.6.0","@next-auth/prisma-adapter":"^1.0.7","react-international-phone":"^4.6.1","@ameshkin/markdown-handler":"^0.1.7","micromark-util-sanitize-uri":"^2.0.1","@tanstack/react-query-devtools":"^5.91.1"},"_hasShrinkwrap":false,"packageManager":"npm@10.5.0","devDependencies":{"tsx":"^4.20.6","husky":"^9.0.11","jsdom":"^23.0.1","ngrok":"^5.0.0-beta.2","dotenv":"^17.2.3","eslint":"^8.57.0","prisma":"^6.19.0","vitest":"^4.0.6","yamljs":"^0.3.0","jasmine":"^5.1.1","ts-node":"^10.9.2","zustand":"^4.5.0","recharts":"^2.15.4","cross-env":"^10.1.0","remark-gfm":"^4.0.0","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^20.19.25","lint-staged":"^16.2.7","@types/react":"^18.3.27","concurrently":"^8.2.2","@types/yamljs":"^0.2.34","@types/express":"^5.0.5","@types/jasmine":"^5.1.4","@types/js-yaml":"^4.0.9","react-markdown":"^9.0.1","@types/bcryptjs":"^2.4.6","react-hook-form":"^7.50.0","@eslint/eslintrc":"^3.3.3","@playwright/test":"^1.40.0","@types/react-dom":"^18.3.1","react-router-dom":"^6.22.0","reflect-metadata":"^0.2.2","@cucumber/gherkin":"^29.0.0","sort-package-json":"^2.10.0","@cucumber/cucumber":"^12.2.0","@cucumber/messages":"^24.0.0","eslint-config-next":"^15.0.0","@vitest/coverage-v8":"^4.0.6","@axe-core/playwright":"^4.8.0","@monaco-editor/react":"^4.6.0","@testing-library/dom":"^10.4.0","@types/swagger-jsdoc":"^6.0.4","@next/bundle-analyzer":"^16.1.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.0.0","@cucumber/gherkin-utils":"^9.0.0","baseline-browser-mapping":"^2.8.32","@cucumber/gherkin-streams":"^6.0.0","@testing-library/jest-dom":"^6.1.5","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.1","eslint-plugin-react-refresh":"^0.4.5","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ticket-mate_0.1.22_1767744771167_0.07533806379682861","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"@ameshkin/ticket-mate","version":"0.1.23","keywords":["jira","jira-integration","project-management","ai-agents","cli","automation","development-workflow","backend","api"],"author":{"url":"https://github.com/ameshkin","name":"Amir Meshkin","email":"amir.meshkin@gmail.com"},"license":"MIT","_id":"@ameshkin/ticket-mate@0.1.23","maintainers":[{"name":"nevaro","email":"amir.meshkin@gmail.com"}],"homepage":"https://github.com/nevaroAI/ticket-mate-demo#readme","bugs":{"url":"https://github.com/nevaroAI/ticket-mate-demo/issues"},"bin":{"tm":"scripts/cli-wrapper.mjs","ticket-mate":"scripts/cli-wrapper.mjs","ticket-mate-projects":"public/cli/project-list.js"},"dist":{"shasum":"283aa96b0086f1eccb6c74490fe8e21230c0186a","tarball":"https://registry.npmjs.org/@ameshkin/ticket-mate/-/ticket-mate-0.1.23.tgz","fileCount":1382,"integrity":"sha512-WAwKRPU5JD3khoe4Al4i3nJ4vEUK8Uk1SBgoODmy+TAf88iH8QagGjj3ax00BR9POHsmdnT+SAgGit5PZwl2og==","signatures":[{"sig":"MEUCIF2a06O7cymUGFzbRd1fjQ244gMU0b7RUZcMlPpG8gj1AiEA2lHYVTc23GCsD+8uZIOLwYU9HC9tBjZHcl4OugI3e4g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3390297},"main":"./public/index.js","type":"module","types":"./public/index.d.ts","config":{"ignore-scripts":false},"module":"./public/index.js","engines":{"node":">=20.19 <223"},"exports":{".":{"types":"./public/index.d.ts","default":"./public/index.js"},"./cli":{"types":"./public/cli/index.d.ts","default":"./public/cli/index.js"}},"gitHead":"6f714ac1ed09be6ddcdc9f62c823107575df5ea2","private":false,"scripts":{"db":"rm -rf node_modules/.prisma && prisma generate && prisma validate","go":"npm test && npm run build && git add . && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","dev":"npx next dev -p 4000","lint":"eslint . --ext .js,.jsx,.ts,.tsx","seed":"tsx prisma/seed.ts","test":"vitest --config tests/vitest.config.ts","build":"npm run build:app","clean":"rm -rf .next public dist node_modules/.vite node_modules/.cache","ngrok":"ngrok start ticket-mate --config ngrok.yml","start":"npx next start -p 4000","deploy":"npm run typecheck && npm run build:app && npm publish","dev:ui":"npx next dev -p 4000","predev":"npm run build:lib && npm run db:bootstrap","analyze":"cross-env ANALYZE=true next build --webpack","db:seed":"tsx prisma/seed.ts","db:test":"bash scripts/test-db-connection.sh","dev:all":"concurrently \"npm run dev:server\" \"npm run dev:ui\"","lint:ui":"eslint src/app --ext ts,tsx --report-unused-disable-directives","prepare":"husky install","preview":"npx next start -p 4000","build:ui":"npm run build:app","db:reset":"prisma migrate reset --force && npm run db:seed","dev:full":"concurrently -n \"next,ngrok\" -c \"cyan,magenta\" \"npm run dev\" \"npm run ngrok\"","prebuild":"npm run prisma:generate && npm run prebuild:check","prestart":"npm run build:lib","sync:lib":"bash scripts/sync-lib-from-local.sh","test:all":"npm run test:run","test:e2e":"playwright test --config tests/playwright.config.ts","test:run":"vitest run --config tests/vitest.config.ts","audit:fix":"npm audit fix --omit=dev","build:app":"npm run prisma:generate && npm run build:package && npm run prebuild:check && next build","build:lib":"bash scripts/build-lib.sh","check:env":"tsx scripts/check-env.ts","db:studio":"npx prisma studio","db:tunnel":"ssh -L 15432:localhost:5432 root@72.61.71.227","test:jira":"npm run build && node scripts/test-jira-connection.mjs","test:unit":"vitest run --config tests/vitest.config.ts","typecheck":"bash scripts/typecheck-log.sh","dev:server":"tsx src/server/index.ts","test:login":"tsx scripts/test-login.ts","test:watch":"vitest watch --config tests/vitest.config.ts","build:check":"npm run prebuild:check && npm run typecheck && next build","clean-build":"bash ./scripts/orchestrator-clean-build.sh","clean-locks":"bash scripts/clean-locks.sh","cleanup:env":"node scripts/cleanup-env-files.mjs","prebuild:ui":"mkdir -p .orchestrator &&  .orchestrator/tickets/bugs/bugs.json || true","prisma:seed":"prisma db seed","publish:all":"npm run build && npm run test:run && npm version patch -m \"chore(release): %s\" && git push --follow-tags && npm publish","release:pre":"npm run typecheck && npm run test:run && npm run build:app","seed:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx prisma/seed.ts","test:e2e:ui":"playwright test --ui --config tests/playwright.config.ts","db:bootstrap":"tsx scripts/dev/bootstrap-db.ts","migrate:bugs":"tsx scripts/migrate-bugs-json.ts","test:gherkin":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts","typecheck:ui":"tsc --noEmit","vercel-build":"node scripts/vercel-migrate.mjs && npm run build:app","build:package":"mkdir -p public && npx tsc -p tsconfig.build.json --skipLibCheck || true","prisma:studio":"prisma studio","publish:patch":"npm run release:patch","release:patch":"npm run release:pre && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","security:scan":"tsx scripts/security-check.ts all","test:coverage":"vitest run --coverage --config tests/vitest.config.ts","test:e2e:cart":"tsx scripts/test-cart-e2e.ts","webhooks:list":"tsx scripts/list-jira-webhooks.ts","check:env-auth":"tsx scripts/check-env-auth.ts","check:env-keys":"tsx scripts/check-env-keys.ts","db:test:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx prisma db execute --stdin <<< \"SELECT 1;\"","prebuild:check":"node scripts/pre-build-checker.mjs","prepublishOnly":"npm run build","prisma:migrate":"prisma migrate dev","publish:github":"npm run release:patch","security:check":"tsx scripts/security-check.ts staged","test:e2e:debug":"playwright test --debug --config tests/playwright.config.ts","test:e2e:watch":"jasmine --config tests/jasmine/jasmine.json --watch","vercel:env:dev":"node scripts/vercel-sync-env.mjs --target development","migrate:jm-mate":"tsx scripts/migrate-jm-mate.ts","orchestrator:ci":"ts-node ./scripts/orchestrator-ci.ts","prisma:generate":"npx prisma generate","prisma:selftest":"node scripts/prisma-selftest.cjs","test:all:strict":"npm run typecheck && npm run test:run","test:automation":"tsx scripts/test-automation-api.ts","test:e2e:headed":"playwright test --headed --config tests/playwright.config.ts","test:unit:watch":"vitest watch --config tests/vitest.config.ts","vercel:env:prod":"node scripts/vercel-sync-env.mjs --target production","check:local-user":"tsx scripts/check-local-user.ts","db:tunnel:stable":"ssh -i /Users/amirmeshkin/.ssh/hostinger_ollama -N -L 5433:localhost:5432 root@72.61.71.227","validate:jm-data":"tsx scripts/validate-jm-data.ts","security:validate":"tsx scripts/security-check.ts config","test:login:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx scripts/test-login.ts","webhooks:register":"tsx scripts/register-jira-webhook.ts","migrate:users-core":"tsx scripts/migrate-users-to-customer-and-ai-tokens.ts","prisma:migrate:dev":"prisma migrate dev","test:gherkin:watch":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts --watch","vercel:env:preview":"node scripts/vercel-sync-env.mjs --target preview","prisma:studio:remote":"bash scripts/prisma-studio-remote.sh","prisma:studio:server":"bash scripts/prisma-studio-remote-server.sh","prisma:migrate:deploy":"prisma migrate deploy","test:automation:direct":"node --loader ts-node/esm scripts/test-automation-direct.ts","test:automation:simple":"node scripts/test-automation-simple.mjs","webhooks:delete-legacy":"tsx scripts/delete-legacy-webhooks.ts","prebuild:skip-typecheck":"echo '⏭️  Skipping typecheck (temporary)'","fix:notifications-userid":"bash scripts/fix-notifications-userid.sh","orchestrator:clean-build":"bash ./scripts/orchestrator-clean-build.sh","migrate:notification-userid":"node scripts/apply-notifications-userid-migration.mjs","orchestrator:clean-build-push":"bash .orchestrator/scripts/clean-build-test-push.sh"},"_npmUser":{"name":"nevaro","email":"amir.meshkin@gmail.com"},"repository":{"url":"git+https://github.com/nevaroAI/ticket-mate-demo.git","type":"git"},"_npmVersion":"11.6.2","description":"Jira integration and AI execution layer - bridges Jira tickets and AI-assisted development workflows (backend package)","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,md,css,scss}":["prettier --write"]},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ai":"^5.0.115","zod":"^3.25.76","cors":"^2.8.5","next":"^16.0.0","konva":"^10.0.12","react":"^18.3.1","moment":"^2.30.1","openai":"^4.78.1","resend":"^6.6.0","stripe":"^17.7.0","express":"^4.18.0","js-yaml":"^4.1.1","lexical":"^0.39.0","bcryptjs":"^2.4.3","date-fns":"^3.3.1","commander":"^14.0.2","next-auth":"^4.24.13","react-dom":"^18.3.1","reactflow":"^11.11.4","@mui/system":"^7.0.0","react-konva":"^18.2.14","@dnd-kit/core":"^6.3.1","@lexical/code":"^0.39.0","@lexical/html":"^0.39.0","@lexical/link":"^0.39.0","@lexical/list":"^0.39.0","@mui/material":"^7.0.0","@octokit/rest":"^22.0.1","framer-motion":"^12.23.26","swagger-jsdoc":"^6.2.8","@emotion/cache":"^11.13.5","@emotion/react":"^11.13.5","@lexical/react":"^0.39.0","@lexical/table":"^0.39.0","@lexical/utils":"^0.39.0","@prisma/client":"^6.19.0","better-sqlite3":"^12.5.0","@emotion/styled":"^11.13.5","react-hot-toast":"^2.6.0","@lexical/history":"^0.39.0","@dnd-kit/sortable":"^10.0.0","@hello-pangea/dnd":"^18.0.1","@lexical/markdown":"^0.39.0","@octokit/auth-app":"^8.1.2","@aws-sdk/client-s3":"^3.956.0","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/utilities":"^3.2.2","@lexical/clipboard":"^0.39.0","@lexical/rich-text":"^0.39.0","@lexical/selection":"^0.39.0","@replit/extensions":"^1.10.0","react-hotkeys-hook":"^5.2.1","swagger-ui-express":"^5.0.1","@hookform/resolvers":"^5.2.2","@mui/icons-material":"^7.0.0","@ameshkin/nextcrumbs":"^0.2.0","@mui/material-nextjs":"^7.3.5","@tanstack/react-query":"^5.90.12","@replit/extensions-react":"^0.6.0","@next-auth/prisma-adapter":"^1.0.7","react-international-phone":"^4.6.1","@ameshkin/markdown-handler":"^0.1.7","micromark-util-sanitize-uri":"^2.0.1","@tanstack/react-query-devtools":"^5.91.1"},"_hasShrinkwrap":false,"packageManager":"npm@10.5.0","devDependencies":{"tsx":"^4.20.6","husky":"^9.0.11","jsdom":"^23.0.1","ngrok":"^5.0.0-beta.2","dotenv":"^17.2.3","eslint":"^8.57.0","prisma":"^6.19.0","vitest":"^4.0.6","yamljs":"^0.3.0","jasmine":"^5.1.1","ts-node":"^10.9.2","zustand":"^4.5.0","recharts":"^2.15.4","cross-env":"^10.1.0","remark-gfm":"^4.0.0","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^20.19.25","lint-staged":"^16.2.7","@types/react":"^18.3.27","concurrently":"^8.2.2","@types/yamljs":"^0.2.34","@types/express":"^5.0.5","@types/jasmine":"^5.1.4","@types/js-yaml":"^4.0.9","react-markdown":"^9.0.1","@types/bcryptjs":"^2.4.6","react-hook-form":"^7.50.0","@eslint/eslintrc":"^3.3.3","@playwright/test":"^1.40.0","@types/react-dom":"^18.3.1","react-router-dom":"^6.22.0","reflect-metadata":"^0.2.2","@cucumber/gherkin":"^29.0.0","sort-package-json":"^2.10.0","@cucumber/cucumber":"^12.2.0","@cucumber/messages":"^24.0.0","eslint-config-next":"^15.0.0","@vitest/coverage-v8":"^4.0.6","@axe-core/playwright":"^4.8.0","@monaco-editor/react":"^4.6.0","@testing-library/dom":"^10.4.0","@types/swagger-jsdoc":"^6.0.4","@next/bundle-analyzer":"^16.1.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.0.0","@cucumber/gherkin-utils":"^9.0.0","baseline-browser-mapping":"^2.8.32","@cucumber/gherkin-streams":"^6.0.0","@testing-library/jest-dom":"^6.1.5","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.1","eslint-plugin-react-refresh":"^0.4.5","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ticket-mate_0.1.23_1768531140635_0.8857250861942465","host":"s3://npm-registry-packages-npm-production"}},"0.1.26":{"name":"@ameshkin/ticket-mate","version":"0.1.26","private":false,"description":"Jira integration and AI execution layer - bridges Jira tickets and AI-assisted development workflows (backend package)","keywords":["jira","jira-integration","project-management","ai-agents","cli","automation","development-workflow","backend","api"],"homepage":"https://github.com/nevaroAI/ticket-mate-demo#readme","bugs":{"url":"https://github.com/nevaroAI/ticket-mate-demo/issues"},"repository":{"type":"git","url":"git+https://github.com/nevaroAI/ticket-mate-demo.git"},"license":"MIT","author":{"name":"Amir Meshkin","email":"amir.meshkin@gmail.com","url":"https://github.com/ameshkin"},"sideEffects":false,"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","default":"./dist/cli/index.js"}},"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","bin":{"ticket-mate":"scripts/cli-wrapper.mjs","ticket-mate-projects":"dist/cli/project-list.js","tm":"scripts/cli-wrapper.mjs"},"scripts":{"analyze":"cross-env ANALYZE=true next build --webpack","audit:fix":"npm audit fix --omit=dev","prebuild":"npm run prisma:generate && npm run prebuild:check","build":"npm run build:app","build:app":"npm run prisma:generate && npm run build:package && npm run prebuild:check && next build","prebuild:check":"node scripts/pre-build-checker.mjs","build:check":"npm run prebuild:check && npm run typecheck && next build","build:lib":"bash scripts/build-lib.sh","build:package":"mkdir -p dist && npx tsc -p tsconfig.build.json --skipLibCheck || true","prebuild:ui":"mkdir -p .orchestrator &&  .orchestrator/tickets/bugs/bugs.json || true","build:ui":"npm run build:app","check:env":"tsx scripts/check-env.ts","check:env-auth":"tsx scripts/check-env-auth.ts","check:env-keys":"tsx scripts/check-env-keys.ts","check:local-user":"tsx scripts/check-local-user.ts","clean":"rm -rf .next dist node_modules/.vite node_modules/.cache","clean-build":"bash ./scripts/orchestrator-clean-build.sh","clean-locks":"bash scripts/clean-locks.sh","cleanup:env":"node scripts/cleanup-env-files.mjs","db":"rm -rf node_modules/.prisma && prisma generate && prisma validate","db:bootstrap":"tsx scripts/dev/bootstrap-db.ts","db:reset":"prisma migrate reset --force && npm run db:seed","db:seed":"tsx prisma/seed.ts","db:studio":"npx prisma studio","db:test":"bash scripts/test-db-connection.sh","db:test:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx prisma db execute --stdin <<< \"SELECT 1;\"","db:tunnel":"ssh -L 15432:localhost:5432 root@72.61.71.227","db:tunnel:stable":"ssh -i /Users/amirmeshkin/.ssh/hostinger_ollama -N -L 5433:localhost:5432 root@72.61.71.227","deploy":"npm run typecheck && npm run build:app && npm publish","predev":"mkdir -p public && cp src/assets/logo.jpg public/logo.jpg || true && npm run build:lib && npm run db:bootstrap","dev":"npx next dev -p 4000","dev:all":"concurrently \"npm run dev:server\" \"npm run dev:ui\"","dev:full":"concurrently -n \"next,ngrok\" -c \"cyan,magenta\" \"npm run dev\" \"npm run ngrok\"","dev:server":"tsx src/server/index.ts","dev:ui":"npx next dev -p 4000","fix:notifications-userid":"bash scripts/fix-notifications-userid.sh","go":"npm test && npm run build && git add . && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 2000","lint:ui":"eslint src/app --ext ts,tsx --report-unused-disable-directives","migrate:bugs":"tsx scripts/migrate-bugs-json.ts","migrate:jm-mate":"tsx scripts/migrate-jm-mate.ts","migrate:notification-userid":"node scripts/apply-notifications-userid-migration.mjs","migrate:users-core":"tsx scripts/migrate-users-to-customer-and-ai-tokens.ts","ngrok":"ngrok start ticket-mate --config ngrok.yml","orchestrator:ci":"ts-node ./scripts/orchestrator-ci.ts","orchestrator:clean-build":"bash ./scripts/orchestrator-clean-build.sh","orchestrator:clean-build-push":"bash .orchestrator/scripts/clean-build-test-push.sh","prebuild:skip-typecheck":"echo '⏭️  Skipping typecheck (temporary)'","prepare":"husky install","prepublishOnly":"npm run build","preview":"npx next start -p 4000","prisma:generate":"npx prisma generate","prisma:migrate":"prisma migrate dev","prisma:migrate:deploy":"prisma migrate deploy","prisma:migrate:dev":"prisma migrate dev","prisma:seed":"prisma db seed","prisma:selftest":"node scripts/prisma-selftest.cjs","prisma:studio":"prisma studio","prisma:studio:remote":"bash scripts/prisma-studio-remote.sh","prisma:studio:server":"bash scripts/prisma-studio-remote-server.sh","publish:all":"npm run build && npm run test:run && npm version patch -m \"chore(release): %s\" && git push --follow-tags && npm publish","publish:github":"npm run release:patch","publish:patch":"npm run release:patch","release:patch":"npm run release:pre && npm version patch -m \"chore(release): %s\" && git push && git push --tags && npm publish","release:pre":"npm run typecheck && npm run test:run && npm run build:app","security:check":"tsx scripts/security-check.ts staged","security:scan":"tsx scripts/security-check.ts all","security:validate":"tsx scripts/security-check.ts config","seed":"tsx prisma/seed.ts","seed:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx prisma/seed.ts","prestart":"npm run build:lib","start":"npx next start -p 4000","sync:lib":"bash scripts/sync-lib-from-local.sh","test":"vitest --config tests/vitest.config.ts","test:all":"npm run test:run","test:all:strict":"npm run typecheck && npm run test:run","test:automation":"tsx scripts/test-automation-api.ts","test:automation:direct":"node --loader ts-node/esm scripts/test-automation-direct.ts","test:automation:simple":"node scripts/test-automation-simple.mjs","test:coverage":"vitest run --coverage --config tests/vitest.config.ts","test:e2e":"playwright test --config tests/playwright.config.ts","test:e2e:cart":"tsx scripts/test-cart-e2e.ts","test:e2e:debug":"playwright test --debug --config tests/playwright.config.ts","test:e2e:headed":"playwright test --headed --config tests/playwright.config.ts","test:e2e:ui":"playwright test --ui --config tests/playwright.config.ts","test:e2e:watch":"jasmine --config tests/jasmine/jasmine.json --watch","test:gherkin":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts","test:gherkin:watch":"cucumber-js tests/cucumber/**/*.feature --require tests/cucumber/step-definitions/**/*.ts --require-module ts-node/register --config tests/cucumber.config.ts --watch","test:jira":"npm run build && node scripts/test-jira-connection.mjs","test:login":"tsx scripts/test-login.ts","test:login:tunnel":"DATABASE_URL=postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate npx tsx scripts/test-login.ts","test:run":"vitest run --config tests/vitest.config.ts","test:unit":"vitest run --config tests/vitest.config.ts","test:unit:watch":"vitest watch --config tests/vitest.config.ts","test:watch":"vitest watch --config tests/vitest.config.ts","typecheck":"bash scripts/typecheck-log.sh","typecheck:ui":"tsc --noEmit","validate:jm-data":"tsx scripts/validate-jm-data.ts","vercel-build":"node scripts/vercel-migrate.mjs && npm run build:app","vercel:env:dev":"node scripts/vercel-sync-env.mjs --target development","vercel:env:preview":"node scripts/vercel-sync-env.mjs --target preview","vercel:env:prod":"node scripts/vercel-sync-env.mjs --target production","webhooks:delete-legacy":"tsx scripts/delete-legacy-webhooks.ts","webhooks:list":"tsx scripts/list-jira-webhooks.ts","webhooks:register":"tsx scripts/register-jira-webhook.ts"},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,md,css,scss}":["prettier --write"]},"config":{"ignore-scripts":false},"dependencies":{"@ameshkin/markdown-handler":"^0.1.7","@ameshkin/nextcrumbs":"^0.2.0","@aws-sdk/client-s3":"^3.956.0","@dnd-kit/core":"^6.3.1","@dnd-kit/modifiers":"^9.0.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@emotion/cache":"^11.13.5","@emotion/react":"^11.13.5","@emotion/styled":"^11.13.5","@hello-pangea/dnd":"^18.0.1","@hookform/resolvers":"^5.2.2","@lexical/clipboard":"^0.39.0","@lexical/code":"^0.39.0","@lexical/history":"^0.39.0","@lexical/html":"^0.39.0","@lexical/link":"^0.39.0","@lexical/list":"^0.39.0","@lexical/markdown":"^0.39.0","@lexical/react":"^0.39.0","@lexical/rich-text":"^0.39.0","@lexical/selection":"^0.39.0","@lexical/table":"^0.39.0","@lexical/utils":"^0.39.0","@mui/icons-material":"^7.0.0","@mui/material":"^7.0.0","@mui/material-nextjs":"^7.3.5","@mui/system":"^7.0.0","@next-auth/prisma-adapter":"^1.0.7","@octokit/auth-app":"^8.1.2","@octokit/rest":"^22.0.1","@prisma/adapter-pg":"^7.4.0","@prisma/client":"7.0.1","@replit/extensions":"^1.10.0","@replit/extensions-react":"^0.6.0","@tanstack/react-query":"^5.90.12","@tanstack/react-query-devtools":"^5.91.1","ai":"^5.0.115","bcryptjs":"^2.4.3","better-sqlite3":"^12.5.0","commander":"^14.0.2","cors":"^2.8.5","date-fns":"^3.3.1","express":"^4.18.0","framer-motion":"^12.23.26","js-yaml":"^4.1.1","konva":"^10.0.12","lexical":"^0.39.0","micromark-util-sanitize-uri":"^2.0.1","moment":"^2.30.1","next":"^16.0.0","next-auth":"^4.24.13","openai":"^4.78.1","pg":"^8.18.0","react":"^18.3.1","react-dom":"^18.3.1","react-hot-toast":"^2.6.0","react-hotkeys-hook":"^5.2.1","react-international-phone":"^4.6.1","react-konva":"^18.2.14","reactflow":"^11.11.4","resend":"^6.6.0","stripe":"^17.7.0","swagger-jsdoc":"^6.2.8","swagger-ui-express":"^5.0.1","zod":"^3.25.76"},"devDependencies":{"@axe-core/playwright":"^4.8.0","@cucumber/cucumber":"^12.2.0","@cucumber/gherkin":"^29.0.0","@cucumber/gherkin-streams":"^6.0.0","@cucumber/gherkin-utils":"^9.0.0","@cucumber/messages":"^24.0.0","@eslint/eslintrc":"^3.3.3","@monaco-editor/react":"^4.6.0","@next/bundle-analyzer":"^16.1.1","@playwright/test":"^1.40.0","@testing-library/dom":"^10.4.0","@testing-library/jest-dom":"^6.1.5","@testing-library/react":"^16.0.0","@testing-library/user-event":"^14.5.1","@types/bcryptjs":"^2.4.6","@types/better-sqlite3":"^7.6.13","@types/cors":"^2.8.19","@types/express":"^5.0.5","@types/jasmine":"^5.1.4","@types/js-yaml":"^4.0.9","@types/node":"^20.19.25","@types/pg":"^8.16.0","@types/react":"^18.3.27","@types/react-dom":"^18.3.1","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@types/yamljs":"^0.2.34","@typescript-eslint/eslint-plugin":"^8.0.0","@typescript-eslint/parser":"^8.0.0","@vitest/coverage-v8":"^4.0.6","baseline-browser-mapping":"^2.8.32","concurrently":"^8.2.2","cross-env":"^10.1.0","dotenv":"^17.2.3","eslint":"^8.57.0","eslint-config-next":"^15.0.0","eslint-plugin-react-hooks":"^5.0.0","eslint-plugin-react-refresh":"^0.4.5","husky":"^9.0.11","jasmine":"^5.1.1","jsdom":"^23.0.1","lint-staged":"^16.2.7","ngrok":"^5.0.0-beta.2","prisma":"7.0.1","react-hook-form":"^7.50.0","react-markdown":"^9.0.1","react-router-dom":"^6.22.0","recharts":"^2.15.4","reflect-metadata":"^0.2.2","remark-gfm":"^4.0.0","sort-package-json":"^2.10.0","ts-node":"^10.9.2","tsx":"^4.20.6","typescript":"^5.9.3","vitest":"^4.0.6","yamljs":"^0.3.0","zustand":"^4.5.0"},"packageManager":"npm@10.5.0","engines":{"node":">=20.19 <23"},"overrides":{"prisma":"7.0.1","@prisma/client":"7.0.1","magicast":"0.5.2"},"gitHead":"85ce3871878c0a37d1a8ee706d072ac8a539c35e","_id":"@ameshkin/ticket-mate@0.1.26","_nodeVersion":"25.6.1","_npmVersion":"11.9.0","dist":{"integrity":"sha512-p2N4ujD3s0k7VoZaTRmaxXxayF3G45dCn81FTLczaWUVGM0MS5vB7TCADtpwlgDyxxO99E7xjsxfH0LzS9B+Gg==","shasum":"93d3f7fb1870d3f06a1363641caa43c4f689b85a","tarball":"https://registry.npmjs.org/@ameshkin/ticket-mate/-/ticket-mate-0.1.26.tgz","fileCount":1378,"unpackedSize":3441031,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID2Ucjumu4vwoOFHxjw/FfoUIFeSKYd0sClCn1ZcEi5YAiBqZ2wRMMoDOEkYnvC56/RcBkNlBfS16GvGFwqzop7iFg=="}]},"_npmUser":{"name":"nevaro","email":"amir.meshkin@gmail.com"},"directories":{},"maintainers":[{"name":"nevaro","email":"amir.meshkin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ticket-mate_0.1.26_1772865072503_0.38839524182440566"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-06T22:36:16.290Z","modified":"2026-03-07T06:31:12.899Z","0.1.20":"2026-01-06T22:36:16.608Z","0.1.21":"2026-01-06T23:56:32.331Z","0.1.22":"2026-01-07T00:12:51.393Z","0.1.23":"2026-01-16T02:39:00.810Z","0.1.26":"2026-03-07T06:31:12.749Z"},"bugs":{"url":"https://github.com/nevaroAI/ticket-mate-demo/issues"},"author":{"name":"Amir Meshkin","email":"amir.meshkin@gmail.com","url":"https://github.com/ameshkin"},"license":"MIT","homepage":"https://github.com/nevaroAI/ticket-mate-demo#readme","keywords":["jira","jira-integration","project-management","ai-agents","cli","automation","development-workflow","backend","api"],"repository":{"type":"git","url":"git+https://github.com/nevaroAI/ticket-mate-demo.git"},"description":"Jira integration and AI execution layer - bridges Jira tickets and AI-assisted development workflows (backend package)","maintainers":[{"name":"nevaro","email":"amir.meshkin@gmail.com"}],"readme":"# TICKET MATE\n\n### QUICK NOTES\n\n1. Test tickets with `ticket-mate sync --ticket NOVA-123`\n\n**Jira integration and AI execution layer** - Bridges Jira tickets and AI-assisted development workflows.\n\n### Jira AppSettings\n\nhttps://developer.atlassian.com/console/myapps/\n\n## Overview\n\n`@ameshkin/ticket-mate` is a production-ready npm package that provides comprehensive Jira integration capabilities. It includes a CLI interface, REST API server, Next.js dashboard, and automation features for managing Jira tickets, syncing progress files, generating AI prompts, building PR descriptions, and automating ticket creation from JSON files.\n\n## Database\n\nhttps://console.prisma.io/cmixzg6nk03vo2sflg2pzq64u/cmixzgvue03sd1efplmdnimkj/cmixzgvue03se1efpm49q18z0/studio#table=users&schema=public&view=table\n\n### Database Connectivity (SSH Tunnel)\n\nIf direct connection to the database is blocked (e.g. `P1001` error), use an SSH tunnel:\n\n1. **Start the tunnel**:\n\n   ```bash\n   npm run db:tunnel\n   ```\n\n   _Note: This requires the `hostinger_ollama` SSH key._\n\n2. **Run commands with overridden DATABASE_URL**:\n\n   ```bash\n   DATABASE_URL=\"postgresql://ticket-mate:ticketpassmate@localhost:15432/ticket_mate\" npm run vercel-build\n   ```\n\n3. **Verify Connection**:\n   ```bash\n   npm run db:test:tunnel\n   ```\n\n## Error Logs\n\n```bash\n\n\nvercel logs ticket-mate.app\n\n```\n\n## Vercel Environment Variables\n\n```bash\n# list env\nvercel env ls\n\n\n# pull all production vars into a test file .test-prod.env\nvercel env pull .test-prod.env --environment=production\n\n\n# Or if you want all environments in one file:\nvercel env pull .env.vercel.production --environment=production\n\n            \"code\": \"OLLAMA_MODEL_MISSING\",\n            \"message\": \"Model \\\"qwen2.5-coder:latest\\n\\\" is not installed on http://72.61.71.227:11434. Using fallback \\\"qwen2.5-coder:latest\\\".\",\n            \"requested\": \"qwen2.5-coder:latest\\n\",\n            \"fallbackUsed\": \"qwen2.5-coder:latest\"\n\n\nvercel env add GITHUB_CLIENT_ID development\n# paste the value when prompted\n\nvercel env add GITHUB_CLIENT_SECRET development\n\nvercel env add NEXTAUTH_URL development\n\n\n#remove if exists undefined\n#https://jira-mate.vercel.app\nvercel env ls production\nvercel env rm NEXTAUTH_URL production --yes\n\n\nvercel env add OLLAMA_DEMO_MODEL production\nvercel env add OLLAMA_DEMO_MODEL development\nvercel env add OLLAMA_DEMO_MODEL preview\n\nvercel env add OLLAMA_CODE_MODEL development\n\nOLLAMA_CODE_MODEL\n\nqwen2.5-coder:7b\n\nvercel env add NEXTAUTH_URL production\n=https://ticket-mate.app\n\n\n#https://ticket-mate.app\n\nOLLAMA_CODE_MODEL=\nOLLAMA_DEMO_MODEL=\n\n# AI Runtime Configuration\nAI_RUNTIME=auto\n\n\n# VERCEL LOGS\n\n\nvercel logs ticket-mate.app\n\nRESEND_API_KEY=re_36qa2oNt_HyHhz8N9AXjtmnCkcDUGa3Wh\n\n\n\nvercel env add DATABASE_URL production\n#postgres://3bc59484969a8f4dd008a6300b7c79daa72fc00ec9db1d3545013fe8e48afd0c:sk_IJnKo655RyEjZhfoDiGel@db.prisma.io:5432/postgres?sslmode=require\n#\n#\n#ATLASSIAN_WEBHOOK_PATH=\"/api/webhooks/jira\"\n#ATLASSIAN_PROJECT_KEY=JM\n\n\nhostinger ollama\nroot\n\nBrootgroot17+\n\nexport OLLAMA_BASE_URL=\"http://72.61.71.227:8080\"\nexport OLLAMA_DEMO_MODEL=\"qwen2.5-coder:latest\"\n\n\n\nvercel env add GITHUB_CLIENT_ID development\n\n\n\ncp /Users/amirmeshkin/_code/_work/proveoautomation/CHAT/Web/frontend/src/pages/admin/profile/ProfilePage.tsx\n\n\n\n\nOLLAMA_BASE_URL\n\n```\n\n### Ollama Server\n\n```bash\nssh root@72.61.71.227\n\n\nssh -i /Users/amirmeshkin/.ssh/hostinger_ollama root@72.61.71.227\n\n\n\nollama pull qwen2.5-coder:14b\n\nollama run qwen2.5-coder:14b\n\n\nollama pull deepseek-coder\n\n\n\n\n```\n\ncp -R \\\n\"/Users/amirmeshkin/\\_code/my-npm-packages/orchestrator-core\" \\\n\"/Users/amirmeshkin/\\_code/my-npm-packages/orchestrator/\\_packages/nevaroAI/\"\n\n```bash\n\n# copy CHAT from component examples to CHAT\n\n\ncp -R \\\n\"/Users/amirmeshkin/_code/_work/proveoautomation/component-examples/CHAT/\" \\\n\"/Users/amirmeshkin/_code/_work/proveoautomation/CHAT\"\n\n\n\n\n\n# copy CHAT from CHAT back to COMPONENT\n\n\ncp -R \\\n\"/Users/amirmeshkin/_code/_work/proveoautomation/CHAT/\" \\\n\"/Users/amirmeshkin/_code/_work/proveoautomation/component-examples/CHAT\"\n\n```\n\n### Demo Account and Page\n\nhttps://www.ticket-mate.app/demo\n\ndemo@gmail.com\nwelcome123\n\n## Ticket Mate v1.0 Roadmap\n\nTicket Mate v1.0 unifies four pillars into a single coherent flow:\n\n- ✅ **Ticket Mate CLI + `.orchestrator`** - Command-line tools that sync Jira tickets to local markdown files\n- ✅ **Next.js Admin UI + Webhook** - Web interface for viewing and managing tickets, bugs, and AI-assisted planning\n- ⏳ **Replit Extension** - In-editor tool tab for working with tickets and bugs directly in Replit\n- ✅ **Orchestrator-derived `bugs.json`** - Unified bug tracking that can be promoted to Jira Bug issues\n\nAll four pillars share the same data structures and read from the same `.orchestrator` directory, ensuring consistency across tools.\n\n**Progress:** 75% Complete (3 of 4 pillars fully implemented)\n\n**Completed Features:**\n\n- ✅ CLI with 20+ commands (`tm`, `ticket-mate`)\n- ✅ `.orchestrator` file-based integration\n- ✅ Next.js Admin UI with full dashboard\n- ✅ OAuth authentication (GitHub, Google, Atlassian, Apple, Credentials)\n- ✅ Jira REST API client\n- ✅ Ticket syncing to markdown files\n- ✅ AI prompt generation\n- ✅ Board management with AI columns\n- ✅ Bugs.json integration\n- ✅ Webhook handling\n- ✅ Git integration (branch/commit validation)\n\n**In Progress:**\n\n- ⏳ Replit Extension (planned - architecture defined, implementation pending)\n\n**Recent Completions (2025-01-12):**\n\n- ✅ Local email/password authentication\n- ✅ OAuth security enhancements (CSRF protection, token encryption)\n- ✅ Authentication-aware data fetching\n- ✅ Production deployment (ticket-mate.app)\n- ✅ Branding update (Ticket Mate → Ticket Mate)\n- ✅ Ticket organization restructured (`.orchestrator/tickets/`)\n\n**Tracking:**\n\n- Progress: [`.orchestrator/tickets/`](.orchestrator/tickets/)\n  - Epics: [`.orchestrator/tickets/epics/`](.orchestrator/tickets/epics/) (2 files)\n  - Stories: [`.orchestrator/tickets/stories/`](.orchestrator/tickets/stories/) (1 file)\n  - Bugs: [`.orchestrator/tickets/bugs/`](.orchestrator/tickets/bugs/) (5 files)\n  - Tasks: [`.orchestrator/tickets/tasks/`](.orchestrator/tickets/tasks/) (9 files)\n- Master Progress: [`.orchestrator/master-progress.md`](.orchestrator/master-progress.md)\n\n**Documentation:**\n\n- **[User Guide](docs/user-guide.md)** - Comprehensive guide for features and usage.\n- **[API Documentation](docs/api.md)** - Reference for API endpoints.\n\n## Features\n\n### Core Features\n\n- ✅ **[Jira Integration](docs-dev/JIRA-AUTH-ISSUE.md)** - Full REST API client for Jira operations (OAuth + PAT support)\n- ✅ **[Ticket Syncing](docs-dev/COMMANDS.md)** - Sync Jira tickets to markdown files for documentation\n- ✅ **[AI Prompts](docs-dev/AI-WORKFLOW.md)** - Generate AI-consumable prompts from ticket briefs\n- ✅ **[PR Builder](docs-dev/COMMANDS.md)** - Generate structured PR descriptions from tickets\n- ✅ **[CLI Interface](docs-dev/COMMANDS.md)** - 20+ command-line tools (`tm`, `ticket-mate`)\n- ✅ **[REST API Server](docs-dev/API-REPORT.md)** - Next.js API routes with authentication\n- ✅ **[Next.js Dashboard](docs-dev/NEW-PAGES-REFERENCE.md)** - Full web UI for projects, boards, tickets, and admin\n- ✅ **Board Management** - Create boards, add columns (including \"AI: In Progress\")\n- ✅ **[Automation](docs-dev/AUTOMATION-GUIDE.md)** - Process JSON files (bugs-wip.json) and create Jira tickets\n- ✅ **Git Integration** - Branch and commit message validation\n- ✅ **[Webhook Handling](docs-dev/WEBHOOK-TESTING.md)** - Process Jira webhook events with security validation\n- ✅ **Acceptance Criteria** - Extract and sync from test files\n- ✅ **[File-based Integration](docs-dev/AGENT-HANDLER-INTEGRATION.md)** - Repository-based ticket management for AI agents\n- ✅ **[Authentication](docs-dev/AUTH-MODES.md)** - Local email/password + OAuth (GitHub, Google, Atlassian, Apple)\n- ✅ **Token Management** - AI token usage tracking and limits\n\n### Phase 5 Features (Completed)\n\n- ✅ **Authority** - End-to-end provenance for audits with real GitHub/Jira cross-referencing.\n- ✅ **Reliability** - Quality gates with real data checks for Acceptance Criteria and PR ticket links.\n- ✅ **Contracts** - Team agreement management with digital signatures.\n- ✅ **Automation** - Workflow builder with support for Jira/GitHub triggers and custom actions.\n- ✅ **Events** - Real-time observability feed for system-wide transparency.\n- ✅ **Usage** - Per-user AI credit consumption and API limit tracking.\n\n## Key Components\n\nJira Mate is built with a modular architecture:\n\n| Component              | Responsibility                                                       | Location                                 |\n| :--------------------- | :------------------------------------------------------------------- | :--------------------------------------- |\n| **Jira Client**        | High-level wrapper for Jira REST API v3 with OAuth/PAT support.      | `src/server/jira/jiraClient.ts`          |\n| **GitHub Client**      | Octokit wrapper for repository management and PR oversight.          | `src/server/github/client.ts`            |\n| **QualityGateService** | Core engine for reliability checks and health scoring.               | `src/server/reliability/quality-gate.ts` |\n| **AuditService**       | Immutable event logger for compliance and security auditing.         | `src/server/audit/audit.service.ts`      |\n| **Sync Engine**        | Bidirectional synchronization between Jira and local markdown files. | `src/server/sync/`                       |\n| **Workflow Engine**    | Registry and execution handler for automated tasks.                  | `src/server/automation/`                 |\n\n### Advanced Features\n\n- ✅ **[AI Execution Integration](docs-dev/AI-WORKFLOW.md)** - Execute tickets with AI agents\n- ✅ **Queue Processing** - Process queues of AI-ready tickets\n- ✅ **Batch Operations** - Bulk sync and status updates\n- ✅ **Observability** - Metrics and logging\n- ✅ **Template System** - Customizable markdown templates\n- ✅ **[Multi-tenant Support](docs-dev/ACCOUNT-USER-MODEL.md)** - Account-based organization with seat management\n- ✅ **Subscription Management** - Plan tiers, billing, and usage limits\n\n## Feature Spotlight\n\n### 🤖 AI-Driven Workflow\n\nTicket Mate bridges the gap between Jira and AI agents. It converts tickets into context-rich prompts that agents can understand.\n\n```typescript\nimport { buildTicketPrompts } from \"@ameshkin/ticket-mate\";\n\n// Generate a comprehensive prompt for an AI agent\nconst prompts = await buildTicketPrompts({\n  ticketKey: \"NOVA-123\",\n  // Includes ticket details, acceptance criteria, and plan\n  markdownPath: \".orchestrator/tickets/tasks/NOVA-123.md\",\n  repoRoot: process.cwd(),\n});\n\nconsole.log(prompts.system); // \"You are an expert engineer...\"\nconsole.log(prompts.task); // \"Implement feature X following these criteria...\"\n```\n\n### ⚡ Automated Bug Filing\n\nTurn JSON reports or linter output into Jira tickets automatically, preventing issue drift.\n\n```bash\n# Process a bugs.json file and create/update Jira tickets\nticket-mate process-bugs --file ./reports/security-audit.json --sync-status\n```\n\n```typescript\n// Programmatic automation\nimport { processJsonInstructionsDirect } from \"@ameshkin/ticket-mate/api/automation\";\n\nawait processJsonInstructionsDirect(\n  {\n    bugs: [{ title: \"Memory Leak in Auth\", severity: \"critical\" }],\n  },\n  { projectKey: \"PROJ\" }\n);\n```\n\n### 🔐 Secure Multi-Mode Auth\n\nSwitch seamlessly between Personal Access Tokens for CLI usage and OAuth for SaaS deployment.\n\n```env\n# Mode 1: Personal Access Token (CLI / Local)\nATLASSIAN_AUTH_MODE=PAT\nATLASSIAN_EMAIL=me@example.com\nATLASSIAN_API_KEY=my-token\n\n# Mode 2: OAuth 2.0 (SaaS / Multi-user)\nATLASSIAN_AUTH_MODE=OAUTH\nATLASSIAN_CLIENT_ID=...\nATLASSIAN_CLIENT_SECRET=...\n```\n\nFor a deep dive into all features and architecture, see the **[Developer Documentation Index](docs-dev/README.md)**.\n\n## Installation\n\n### From GitHub Packages (Private)\n\nFirst, configure npm to use GitHub Packages for the `@ameshkin` scope:\n\n```bash\n# Create or edit .npmrc in your project root\necho \"@ameshkin:registry=https://npm.pkg.github.com\" >> .npmrc\necho \"//npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN\" >> .npmrc\n```\n\nThen install:\n\n```bash\nnpm install @ameshkin/ticket-mate\n```\n\n**Note**: You need a GitHub Personal Access Token (PAT) with `read:packages` permission to install private packages.\n\n## Configuration\n\n### Environment Variables\n\nCreate a `.env` file or set environment variables:\n\n#### Required Jira Configuration\n\n```env\nATLASSIAN_BASE_URL=https://pamcms.atlassian.net\nATLASSIAN_EMAIL=your-email@example.com\nATLASSIAN_API_KEY=your-api-token\n```\n\n**Optional:**\n\n```env\nATLASSIAN_PROJECT_KEY=YOUR_PROJECT  # Optional: CLI prefers --project flag or config file\n```\n\n- Generate your Jira API token at: https://id.atlassian.com/manage-profile/security/api-tokens\n- **Important**: Your Jira user must have \"Create Issues\" permission in the project\n- **[Setup Jira Keys Guide](docs/SETUP-JIRA-KEYS.md)** - Complete guide for getting and configuring all Jira keys\n- See [Permissions & Access Guide](docs/PERMISSIONS-AND-ACCESS.md) for complete setup\n- See [Quick Permission Fix](docs/QUICK-PERMISSION-FIX.md) if you get permission errors\n- See [Jira Setup Guide](docs/jira/JIRA-SETUP.md) for detailed instructions\n- See [ATLASSIAN_SCOPES.md](ATLASSIAN_SCOPES.md) for required OAuth scopes\n\n#### Authentication Modes\n\nticket-mate supports two authentication modes:\n\n1. **Personal Access Token (PAT)** - Default mode\n\n   - Uses `ATLASSIAN_EMAIL` + `ATLASSIAN_API_KEY` for Basic Auth\n   - Simple setup, good for local dev and single-user scenarios\n   - Optional: `ATLASSIAN_CLOUD_ID` for Cloud API calls (not required)\n   - Set `ATLASSIAN_AUTH_MODE=PAT` explicitly, or leave unset (defaults to PAT)\n\n2. **OAuth 2.0** - For production/SaaS\n   - Uses `ATLASSIAN_CLIENT_ID` + `ATLASSIAN_CLIENT_SECRET` in env\n   - Per-user tokens and `cloudId` stored in database (not in env)\n   - Multi-user support, per-user authentication\n   - Set `ATLASSIAN_AUTH_MODE=OAUTH` to enable\n   - **Atlassian Developer Console**: [View/Manage OAuth Apps](https://developer.atlassian.com/console/myapps/)\n   - **Required Callback URLs** (register both in Atlassian Developer Console, one per line):\n     - `http://localhost:4000/api/auth/callback/atlassian` (local dev)\n     - `https://ticket-mate.app/api/auth/callback/atlassian` (production)\n   - **Environment Variables**:\n     - Local: `NEXTAUTH_URL=\"http://localhost:4000\"`, `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET`\n     - Production: `NEXTAUTH_URL=\"https://ticket-mate.app\"`, `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET`\n   - See [OAuth Setup Guide](docs/OAUTH-SETUP.md) for details\n   - See [OAuth Callback URL Setup](docs/OAUTH-CALLBACK-URL-SETUP.md) for callback URL configuration\n\n**Important Notes:**\n\n- `ATLASSIAN_CLOUD_ID` is **not required** in env. In PAT mode it's optional for Cloud API. In OAuth mode it's stored per-connection in the database.\n- `ATLASSIAN_PROJECT_KEY` is **optional**. CLI prefers `--project` flag or config file. Use env only as fallback.\n- If you previously used `ATLASSIAN_API_TOKEN`, rename it to `ATLASSIAN_API_KEY`. The old variable is deprecated.\n\n#### Cloud API Configuration (for Scoped API Tokens)\n\nIf you're using Atlassian scoped API tokens and projects/keys don't appear, enable cloud API mode:\n\n```env\nATLASSIAN_USE_CLOUD_API=true\nATLASSIAN_CLOUD_ID=your-cloud-id\n```\n\n**How to find your Cloud ID:**\n\n1. Go to https://admin.atlassian.com\n2. Select your site\n3. Copy the Cloud ID from the URL or site settings\n\n**When to use Cloud API:**\n\n- Using scoped API tokens (long tokens starting with `ATATT3x...`)\n- Projects are not appearing with standard configuration\n- Getting 403/404 errors when listing projects\n\n**Cloud API URL format:**\n\n- Standard: `https://pamcms.atlassian.net/rest/api/3`\n- Cloud API: `https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3`\n\nAlternatively, add to your `jira.json`:\n\n```json\n{\n  \"baseUrl\": \"https://pamcms.atlassian.net\",\n  \"email\": \"your-email@example.com\",\n  \"apiToken\": \"your-token\",\n  \"cloudId\": \"your-cloud-id\",\n  \"useCloudApi\": true\n}\n```\n\n#### API Authentication (for Next.js API routes)\n\n```env\nTICKET_MATE_API_KEY=your-secure-api-key\nNEXT_PUBLIC_TICKET_MATE_API_KEY=your-secure-api-key\n```\n\n#### Dashboard Configuration (for Next.js dashboard)\n\n```env\nNEXT_PUBLIC_ATLASSIAN_BASE_URL=https://pamcms.atlassian.net\n```\n\n**Important**: Never commit `.env` files - they contain sensitive credentials.\n\n## Quick Start\n\n### CLI Usage\n\n```bash\n# Test configuration\nticket-mate config:test\n\n# Sync a single ticket\nticket-mate sync --ticket NOVA-123\n\n# Sync all tickets in project\nticket-mate sync --all\n\n# Generate AI prompt from ticket\nticket-mate prompt NOVA-123\n\n# List projects\nticket-mate ls-projects\n\n# List issues\nticket-mate ls-issues --status \"In Progress\"\n\n# Create a board with AI column\nticket-mate create-board --name \"Cursor Board\" --ai-column\n\n# Process bugs from JSON file\nticket-mate process-bugs --file public/bugs.json\n\n# Show project information\nticket-mate project-info\nticket-mate project-info --health  # Include health check\n\n# Run health check\nticket-mate health-check\nticket-mate health-check --fix  # Attempt to fix issues\n\n# Quick sync with progress indicators\nticket-mate quick-sync --ticket NOVA-123\nticket-mate quick-sync --all\n\n# Export tickets to various formats\nticket-mate export --format json --output tickets.json\nticket-mate export --format csv --status \"In Progress\"\nticket-mate export --format markdown --label \"AI-READY\"\n\n# Batch operations\nticket-mate batch --keys \"NOVA-123,NOVA-124\" --action transition --status \"Done\"\nticket-mate batch --file tickets.txt --action comment --comment \"Reviewed\"\nticket-mate batch --keys \"NOVA-123\" --action update --labels \"reviewed,tested\"\n\n# Export and batch operations\nticket-mate export --format json --output tickets.json\nticket-mate batch --keys \"NOVA-123,NOVA-124\" --action transition --status \"Done\"\n```\n\n### Programmatic Usage\n\n```typescript\nimport {\n  getJiraConfig,\n  syncSingleTicket,\n  buildTicketPrompts,\n  listProjects,\n} from \"@ameshkin/ticket-mate\";\n\n// Get configuration\nconst config = getJiraConfig();\n\n// Sync a ticket\nconst result = await syncSingleTicket(\"NOVA-123\", config);\n\n// Generate AI prompts\nconst prompts = await buildTicketPrompts({\n  ticketKey: \"NOVA-123\",\n  markdownPath: \".orchestrator/tickets/epics/NOVA-10/NOVA-123.md\",\n  repoRoot: process.cwd(),\n});\n\n// List projects\nconst projects = await listProjects();\n```\n\n### Next.js Dashboard\n\nThe package includes a Next.js dashboard. Start it with:\n\n```bash\nnpm run dev\n```\n\nThen visit `http://localhost:4000` to see the dashboard with projects and boards.\n\n## Usage\n\n### CLI Commands\n\n#### Sync Commands\n\n```bash\n# Sync specific ticket\nticket-mate sync --ticket NOVA-123\n\n# Sync epic and all tickets\nticket-mate sync --epic NOVA-10\n\n# Sync all tickets\nticket-mate sync --all\n\n# Custom output directory\nticket-mate sync --all --output .custom-progress\n```\n\n#### Issue Management\n\n```bash\n# List projects\nticket-mate ls-projects\n\n# List issues with filters\nticket-mate ls-issues --project NOVA --status \"In Progress\"\nticket-mate ls-issues --assignee me --label AI-READY\nticket-mate ls-issues --jql \"project = NOVA AND status = 'In Progress'\"\n\n# Show issue details\nticket-mate show-issue NOVA-123\n```\n\n#### Board Management\n\n```bash\n# Create board with AI column\nticket-mate create-board --name \"Cursor Board\" --ai-column\n\n# List boards for project\nticket-mate create-board --list\n\n# Create board without AI column\nticket-mate create-board --name \"Team Board\" --no-ai-column\n```\n\n#### Automation\n\n```bash\n# Process bugs from JSON file\nticket-mate process-bugs --file public/bugs.json\n\n# Watch for changes and auto-process\nticket-mate watch-bugs --file public/bugs.json --auto-process\n\n# Sync bug statuses from Jira\nticket-mate process-bugs --file public/bugs.json --sync-status\n```\n\n#### AI & Prompts\n\n```bash\n# Generate AI prompt from a ticket\nticket-mate prompt NOVA-123\n\n# Save prompt to file\nticket-mate prompt NOVA-123 --output nova-123.md\n\n# Execute AI-assisted work\nticket-mate execute NOVA-123\n\n# Process queue of AI-ready tickets\nticket-mate queue\n```\n\n#### Git Validation\n\n```bash\n# Validate branch name\nticket-mate validate-branch feature/NOVA-123-checkout\n\n# Validate commit message\nticket-mate validate-commit \"NOVA-123: Add checkout functionality\"\n```\n\n#### Other Commands\n\n```bash\n# Check sync status\nticket-mate status\n\n# Test configuration\nticket-mate config:test\n\n# Create task folder\nticket-mate create-task-folder NOVA-123\n\n# Sync acceptance criteria\nticket-mate sync-acceptance NOVA-123\n\n# Interactive menu\nticket-mate interactive\n```\n\n### File-based Integration: `.orchestrator`\n\nTicket Mate provides a file-based integration system that allows AI agents (Cursor, Replit, etc.) to work with Jira tickets directly in your repository. This integration uses a `.orchestrator` directory structure that is committed to Git and can be used by any AI agent.\n\n### Quick Start\n\n```bash\n# Initialize repository for Ticket Mate integration\ntm init-repo --jira-base-url https://pamcms.atlassian.net --jira-project-key YOUR_PROJECT\n\n# Sync tickets from Jira\ntm sync-tickets\n\n# Show status of local tickets\ntm status\n\n# Emit instructions for AI agents\ntm emit-agent-instructions --agent cursor\n```\n\n### Directory Structure\n\nThe `.orchestrator` directory structure:\n\n```\n.orchestrator/\n  config.json              # Repository configuration\n  tickets/\n    <ATLASSIAN_KEY>/\n      ticket.meta.json     # Ticket metadata (status, summary, etc.)\n      plan.md              # High-level plan and objectives\n      tasks.md             # Detailed task checklist\n      progress.log.md      # Append-only progress log\n      notes.md             # Free-form notes (user-editable)\n```\n\n### Configuration\n\nThe `.orchestrator/config.json` file contains:\n\n```json\n{\n  \"jiraBaseUrl\": \"https://pamcms.atlassian.net\",\n  \"jiraProjectKey\": \"YOUR_PROJECT\",\n  \"jiraCloudId\": \"optional-cloud-id\",\n  \"defaultBranch\": \"main\",\n  \"integrations\": {\n    \"cursor\": {\n      \"enabled\": true\n    },\n    \"replit\": {\n      \"enabled\": true,\n      \"webhookUrl\": \"https://your-replit-webhook-url\"\n    }\n  }\n}\n```\n\n### CLI Commands\n\n#### `tm init-repo`\n\nInitialize a repository for Ticket Mate integration:\n\n```bash\ntm init-repo --jira-base-url https://pamcms.atlassian.net --jira-project-key YOUR_PROJECT\ntm init-repo --enable-replit --replit-webhook-url https://your-webhook-url\n```\n\nOptions:\n\n- `--jira-base-url <url>` - Jira base URL\n- `--jira-project-key <key>` - Jira project key\n- `--jira-cloud-id <id>` - Optional cloud ID\n- `--default-branch <branch>` - Default Git branch (default: main)\n- `--enable-replit` - Enable Replit integration\n- `--replit-webhook-url <url>` - Replit webhook URL\n- `--enable-cursor` - Enable Cursor integration\n\n#### `tm sync-tickets`\n\nSync Jira issues into `.orchestrator/projects/<projectKey>/tickets/`:\n\n```bash\n# Sync all tickets with default statuses\ntm sync-tickets\n\n# Sync specific statuses\ntm sync-tickets --status \"Ready for Dev\" --status \"In Progress\"\n\n# Limit number of tickets\ntm sync-tickets --limit 10\n\n# Dry run (show what would be created)\ntm sync-tickets --dry-run\n\n# Skip webhook notification\ntm sync-tickets --no-webhook\n```\n\n#### `tm status`\n\nShow status of tickets in `.orchestrator/projects/<projectKey>/tickets/`:\n\n```bash\n# Show all tickets\ntm status\n\n# Filter by status\ntm status --filter-status \"In Progress\"\n\n# JSON output\ntm status --json\n```\n\n#### `tm emit-agent-instructions`\n\nEmit instructions for AI agents:\n\n```bash\n# Generic instructions\ntm emit-agent-instructions\n\n# Cursor-specific\ntm emit-agent-instructions --agent cursor\n\n# Replit-specific\njm emit-agent-instructions --agent replit\n```\n\n### Replit Integration\n\nTicket Mate can notify Replit automations when tickets are synced:\n\n1. **Create a Replit Automation** with a Custom Webhook Trigger\n2. **Copy the webhook URL** provided by Replit\n3. **Configure in `.orchestrator/config.json`**:\n\n```json\n{\n  \"integrations\": {\n    \"replit\": {\n      \"enabled\": true,\n      \"webhookUrl\": \"https://your-replit-webhook-url\"\n    }\n  }\n}\n```\n\n4. **Run `tm sync-tickets`** - Ticket Mate will POST a JSON payload to the webhook:\n\n```json\n{\n  \"event\": \"tickets_synced\",\n  \"projectKey\": \"YOUR_PROJECT\",\n  \"tickets\": [\n    {\n      \"key\": \"PROJ-123\",\n      \"status\": \"In Progress\",\n      \"summary\": \"Implement feature X\",\n      \"url\": \"https://pamcms.atlassian.net/browse/PROJ-123\"\n    }\n  ],\n  \"syncedAt\": \"2025-12-09T22:35:00.000Z\"\n}\n```\n\n### Directory Structure (Multi-Project)\n\nThe `.orchestrator` directory uses a project-based structure:\n\n```\n.orchestrator/\n  config.json              # Global configuration\n  projects/\n    <projectKey>/\n      project.meta.json    # Project metadata\n      tickets/\n        <ticketKey>/\n          ticket.meta.json # Ticket metadata\n          plan.md          # High-level plan\n          tasks.md         # Task checklist\n          progress.log.md  # Progress log\n          notes.md         # Free-form notes\n```\n\nEach project has its own folder, and tickets are organized within their project. This allows multiple Jira projects to coexist in the same repository.\n\n### Using with AI Agents\n\nAI agents (Cursor, Replit Agent, etc.) should:\n\n1. **Read ticket metadata** from `.orchestrator/projects/<projectKey>/tickets/<ticketKey>/ticket.meta.json`\n2. **Follow the plan** in `.orchestrator/projects/<projectKey>/tickets/<ticketKey>/plan.md`\n3. **Complete tasks** from `.orchestrator/projects/<projectKey>/tickets/<ticketKey>/tasks.md`\n4. **Log progress** in `.orchestrator/projects/<projectKey>/tickets/<ticketKey>/progress.log.md`\n5. **Commit changes** with the Jira key in the message (e.g., `feat(PROJ-123): ...`)\n\nUse `tm emit-agent-instructions --agent <agent>` to get specific instructions for your agent.\n\n### Admin UI\n\nTicket Mate includes admin UI pages for browsing `.orchestrator` content:\n\n- **`/admin/ticket-mate`** - Overview of all projects in `.orchestrator`\n- **`/admin/ticket-mate/[projectKey]`** - Ticket list for a specific project\n- **`/admin/ticket-mate/[projectKey]/[ticketKey]`** - Detailed ticket view with plan, tasks, progress, and notes\n\nThese pages read directly from the `.orchestrator` filesystem structure and provide a read-only view of your tickets. All data is sourced from `.orchestrator` on disk, not directly from Jira.\n\n### Best Practices\n\n- **Never delete** user-edited content in `plan.md`, `tasks.md`, or `notes.md`\n- **Always append** to `progress.log.md` (never overwrite)\n- **Check ticket status** before starting work (only work on \"Ready for Dev\" or \"In Progress\")\n- **Update task checklists** as you complete items\n- **Commit with Jira keys** in commit messages for traceability\n\n## API Integration\n\nThe package includes a REST API server. Start it with:\n\n```bash\nnpm run dev:server\n```\n\n#### Authentication\n\nAll API routes require authentication via API key. Include it in requests:\n\n```bash\n# Using X-API-Key header\ncurl -H \"X-API-Key: your-api-key\" http://localhost:3001/api/projects\n\n# Using Authorization header\ncurl -H \"Authorization: Bearer your-api-key\" http://localhost:3001/api/projects\n```\n\n#### API Endpoints\n\n**Projects**\n\n- `GET /api/projects` - List all accessible Jira projects\n\n**Boards**\n\n- `GET /api/boards?projectKey=NOVA` - List boards for a project\n\n**Automation**\n\n- `POST /api/automation/tickets/from-bugs` - Create tickets from bugs-wip.json\n- `POST /api/automation/tickets/from-json` - Create tickets from JSON instructions\n- `POST /api/automation/bugs/sync-status` - Sync bug statuses from Jira\n- `GET /api/automation/bugs/statistics` - Get bug statistics\n- `POST /api/automation/bugs/fix-now` - Process \"fix now\" bug\n\n**Example Request**\n\n```bash\ncurl -X POST http://localhost:3001/api/automation/tickets/from-bugs \\\n  -H \"X-API-Key: your-api-key\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"filePath\": \"public/bugs.json\"}'\n```\n\n### Next.js Dashboard\n\nThe package includes a Next.js dashboard that provides a web interface for:\n\n- Viewing all Jira projects\n- Expanding projects to see their boards\n- Direct links to Jira backlog for each board\n\nStart the dashboard:\n\n```bash\nnpm run dev\n```\n\nThe dashboard is available at `http://localhost:4000`.\n\n### Automation Features\n\n#### bugs-wip.json Format\n\nThe automation system can process JSON files containing bug information:\n\n```json\n{\n  \"bugs\": [\n    {\n      \"id\": \"bug-1\",\n      \"title\": \"Checkout button not working\",\n      \"category\": \"bug_report\",\n      \"status\": \"open\",\n      \"severity\": \"high\",\n      \"summary\": \"The checkout button does not respond when clicked\",\n      \"rootCause\": \"Event listener not attached\",\n      \"metadata\": {\n        \"jiraIssueKey\": \"NOVA-456\",\n        \"jiraIssueUrl\": \"https://.../browse/NOVA-456\"\n      }\n    }\n  ]\n}\n```\n\n#### Status Flow\n\nBugs go through these statuses:\n\n- `open` - New bug, needs ticket\n- `sending_to_jira` - Currently being sent to Jira\n- `sent_to_jira` - Ticket created in Jira\n- `fixed` - Bug is fixed\n- `resolved` - Bug is resolved\n- `closed` - Bug is closed\n- `unfixable` - Bug cannot be fixed\n- `fix now` - Priority bug, needs immediate attention\n\n#### Orchestrator Integration\n\nThe package can process instructions directly from an orchestrator:\n\n```json\n{\n  \"items\": [\n    {\n      \"id\": \"task-1\",\n      \"title\": \"Implement feature X\",\n      \"summary\": \"Add new feature\",\n      \"category\": \"feature_request\",\n      \"priority\": \"high\"\n    }\n  ]\n}\n```\n\n## API Reference\n\nFor detailed API documentation, see:\n\n- [API Reference](docs/api-reference.md)\n- [Automation Guide](docs/automation/AUTOMATION-GUIDE.md)\n- [Host Integration](docs/HOST-PROJECT-INTEGRATION.md)\n\n## Examples\n\n### Sync Tickets to Progress Files\n\n```typescript\nimport { syncAll, getJiraConfig } from \"@ameshkin/ticket-mate\";\n\nconst config = getJiraConfig();\nconst result = await syncAll(config, {\n  baseDir: \"./ticket-mate\",\n  generateReports: true,\n  generateIndex: true,\n});\n\nconsole.log(`Synced ${result.ticketsSynced} tickets`);\n```\n\n### Create Jira Tickets from JSON\n\n```typescript\nimport { processBugsJson } from \"@ameshkin/ticket-mate\";\n\nconst result = await processBugsJson(\"public/bugs.json\", {\n  projectKey: \"NOVA\",\n  issueType: \"Bug\",\n  epicKey: \"NOVA-10\",\n  labels: [\"automated\", \"from-json\"],\n});\n\nconsole.log(`Created ${result.created} tickets`);\n```\n\n### Generate AI Prompts\n\n```typescript\nimport { buildTicketPrompts } from \"@ameshkin/ticket-mate\";\n\nconst prompts = await buildTicketPrompts({\n  ticketKey: \"NOVA-123\",\n  markdownPath: \".orchestrator/epics/NOVA-10/NOVA-123.md\",\n  repoRoot: process.cwd(),\n});\n\nconsole.log(prompts.systemPrompt);\nconsole.log(prompts.userPrompt);\n```\n\n### Create Board with AI Column\n\n```typescript\nimport {\n  createCursorBoard,\n  ensureAiInProgressColumn,\n} from \"@ameshkin/ticket-mate\";\n\nconst board = await createCursorBoard(\"NOVA\", \"Cursor Board\");\nawait ensureAiInProgressColumn(board.id);\nconsole.log(`Board created: ${board.name} (ID: ${board.id})`);\n```\n\n## Development\n\n### Setup\n\n```bash\n# Install dependencies\nnpm install\n\n# Build the package\nnpm run build\n\n# Run tests\nnpm run test\n\n# Run type checking\nnpm run typecheck\n\n# Start development server\nnpm run dev\n\n# Start API server\nnpm run dev:server\n\n# Start both\nnpm run dev:all\n```\n\n### Project Structure\n\n```\nticket-mate/\n├── src/\n│   ├── cli/              # CLI commands\n│   ├── client/           # Jira REST API client\n│   ├── config/           # Configuration management\n│   ├── sync/             # Ticket syncing\n│   ├── prompts/          # AI prompt generation\n│   ├── automation/       # Automation features\n│   ├── jira-management/  # Board, label, epic management\n│   └── server/           # REST API server\n├── app/                  # Next.js dashboard\n│   ├── api/              # Next.js API routes\n│   └── page.tsx          # Dashboard UI\n└── dist/                 # Built output\n```\n\n### Testing\n\n```bash\n# Run all tests\nnpm run test\n\n# Run tests in watch mode\nnpm run test:watch\n\n# Run with coverage\nnpm run test:coverage\n\n# Run E2E tests\nnpm run test:e2e\n```\n\n## Database Access\n\n### Prisma Studio (Cloud)\n\nAccess the database via Prisma Studio Cloud:\n\n**Direct Link:**\n\n- [Prisma Studio Cloud](https://console.prisma.io/cmixzg6nk03vo2sflg2pzq64u/cmixzgvue03sd1efplmdnimkj/cmixzgvue03se1efpm49q18z0/studio#table=notifications&schema=public&view=table)\n\n**How to Access:**\n\n1. Click the link above or navigate to [Prisma Console](https://console.prisma.io)\n2. Log in with your Prisma account credentials\n3. Select the project: `ticket-mate`\n4. Navigate to the database you want to view\n5. Use the table browser to explore data\n\n**Note:** You must have access to the Prisma project to view the database. Contact the project owner if you need access.\n\n### Local Prisma Studio\n\nYou can also run Prisma Studio locally to view and edit the database:\n\n```bash\n# Make sure DATABASE_URL is set in your .env file\nnpx prisma studio\n```\n\nThis will open Prisma Studio at `http://localhost:5555` where you can:\n\n- Browse all tables\n- View and edit records\n- Run queries\n- Export data\n\n**Prerequisites:**\n\n- `DATABASE_URL` must be configured in `.env`\n- Database must be accessible from your local machine\n- Prisma client must be generated: `npm run prisma:generate`\n\n### Database Schema\n\nThe database schema is defined in `prisma/schema.prisma`. Key models include:\n\n- **User** - User accounts and authentication\n- **Account** - Tenant/organization accounts\n- **JiraCredential** - Per-user Jira OAuth credentials\n- **TokenUsage** - AI token usage tracking\n- **PlanTier** - Subscription plan tiers\n- **Project** - Jira project mappings\n- **IntegrationConnection** - Third-party integrations\n\nSee `prisma/schema.prisma` for the complete schema definition.\n\n## License\n\nMIT\n\n## Author\n\nAmir Meshkin <amir.meshkin@gmail.com>\n","readmeFilename":"README.md"}