{"locator":"npm:@piotrkarwatka/visits","path":"@piotrkarwatka/visits","npm":"@piotrkarwatka/visits","github":null,"repoPath":null,"kind":"module","type":"community","enterprise":false,"title":"Visits","summary":"Example module with one backend page that lists CRM interactions in a table with search and paging.","whenToUse":"Use when you want a small reference for a module page that reads CRM data, for example while learning modules.","whenNotToUse":"Not a feature module: it adds no tables and no API routes of its own.","category":"crm-sales","tags":["example","crm"],"providers":[],"moduleIds":["visits"],"requires":[],"replaces":[],"slotConflicts":[],"renamedFrom":[],"supersededBy":null,"alternatives":[],"status":"active","listed":true,"featured":false,"license":{"spdx":null,"kind":"proprietary","mismatch":false},"version":{"latest":"0.1.0","preview":null,"publishedAt":"2026-10-09","integrity":"sha512-TqJBZSugVSmqYNBvDJmEgk1WKgBIjqbvNR+MVhPj61aP6NSmRZs0RREekWzc02o8r29kMRzt2xG3YLux6qrsqg==","installableFrom":"2026-10-14","gitRef":null,"recommended":{"0.9":null,"0.8":null,"next":null}},"identity":{"builtFrom":"none","claimed":false,"source":"npm"},"compat":{"builtFor":{"range":"0.8.0","kind":"exact-pin","lines":["0.8"]},"lines":{},"verifiedOn":[]},"anatomy":{"version":"0.1.0","coverage":"partial","counts":{"entities":0,"tables":0,"migrations":0,"routes":0,"publicRoutes":0,"aclFeatures":0,"eventsEmitted":0,"eventsConsumed":0,"backendPages":1,"frontendPages":0,"widgets":0,"workers":0,"cli":0,"aiTools":0,"aiAgents":0,"extends":0},"lists":{"aclFeatures":[],"eventsEmitted":[],"eventsConsumed":[],"env":[],"hosts":[],"tables":[],"publicRoutes":[],"credentials":[],"backendPages":["/backend/visits"]},"callout":"FEW CONTRACTS","diff":null},"signals":{"receipt":{"0.9":"untested","0.8":"untested","next":"untested"},"fit":{"0.9":"ok","0.8":"drift","next":"ok"},"anatomy":"partial","supplyChain":{"status":"ok","reasons":[]},"hygiene":{"status":"warn","failing":["peer-exact-pin","host-dependency-duplication"]},"maintenance":{"status":"current","lastRelease":"2026-10-09","catchUpDays":null},"declaredVsObserved":{"status":"mismatch","notes":["Built for 0.8; verified on no line."]}},"tier":"listed","quality":null,"agentPolicy":{"0.9":{"decision":"ask","reasons":[{"code":"THIRD_PARTY","text":"Third-party code runs with access to all tenants' data."},{"code":"NOT_VERIFIED","text":"Not yet tested in a new app on 0.9."},{"code":"LICENSE","text":"License: proprietary (UNLICENSED)."}],"consentText":"Install @piotrkarwatka/visits@0.1.0"},"0.8":{"decision":"ask","reasons":[{"code":"THIRD_PARTY","text":"Third-party code runs with access to all tenants' data."},{"code":"NOT_VERIFIED","text":"Not yet tested in a new app on 0.8."},{"code":"LICENSE","text":"License: proprietary (UNLICENSED)."}],"consentText":"Install @piotrkarwatka/visits@0.1.0"},"next":{"decision":"ask","reasons":[{"code":"THIRD_PARTY","text":"Third-party code runs with access to all tenants' data."},{"code":"NOT_VERIFIED","text":"Not yet tested in a new app on next."},{"code":"LICENSE","text":"License: proprietary (UNLICENSED)."}],"consentText":"Install @piotrkarwatka/visits@0.1.0"}},"install":{"cli":"yarn mercato module add @piotrkarwatka/visits@0.1.0 --allow-third-party","cmm":"npx create-mercato-module install @piotrkarwatka/visits@0.1.0","needsAllowThirdParty":true,"moduleFlag":null},"stats":{"downloads30d":null,"stars":null},"sigil":{"glyph":"0010000","phase":45,"publicRoutes":false},"links":{"page":"https://modules.openmercato.com/m/@piotrkarwatka/visits","md":"https://modules.openmercato.com/m/@piotrkarwatka/visits.md","json":"https://modules.openmercato.com/m/@piotrkarwatka/visits.json","facts":"https://modules.openmercato.com/m/@piotrkarwatka/visits/v/0.1.0/facts.json","npm":"https://www.npmjs.com/package/@piotrkarwatka/visits","repo":null,"docs":null},"addedAt":"2026-10-23","updatedAt":"2026-10-25T08:18:49Z","_meta":{"com.openmercato.modules/installable":{"0.9":"0.1.0","0.8":"0.1.0","next":"0.1.0"}},"facts":{"factsVersion":1,"extractor":{"engine":"@open-mercato/cli@0.9.0 extractModuleFacts","factsContractVersion":2,"catalog":"om-modules rentgen 1","durationMs":15},"package":{"locator":"npm:@piotrkarwatka/visits","name":"@piotrkarwatka/visits","version":"0.1.0","integrity":"sha512-TqJBZSugVSmqYNBvDJmEgk1WKgBIjqbvNR+MVhPj61aP6NSmRZs0RREekWzc02o8r29kMRzt2xG3YLux6qrsqg==","source":"npm-tarball","gitRef":null},"gate":{"installable":true,"needsModuleFlag":false,"reason":null,"modules":[{"id":"visits","src":true,"dist":true}]},"kind":"module","license":{"value":"UNLICENSED","kind":"proprietary","mismatch":false,"sources":{"packageJson":"UNLICENSED","licenseFile":null,"moduleInfo":null,"integrationTs":null}},"omPeers":{"@open-mercato/core":"0.8.0","@open-mercato/shared":"0.8.0","@open-mercato/ui":"0.8.0"},"dependencies":{"@tanstack/react-query":"5.104.1","@tanstack/react-table":"9.2.5","lucide-react":"1.52.0","zod":"4.4.3"},"agentsMd":false,"readmeExcerpt":"# @piotrkarwatka/visits\n\nInstall in an Open Mercato app:\n\n```sh\nyarn mercato module add @piotrkarwatka/visits --allow-third-party\n```\n\nDevelop in your existing app and publish another version with create-mercato-module. To make this repository the source of your module while keeping the same app for development:\n\n```sh\nnpx create-mercato-module link visits\n```\n\nThe tool checks out this repo in the app's .mercato/module-repos/visits directory, backs up the original module, and links src/modules/visits to the checkout. Edits in the app are edits in this repository.\n\n## Trusted Publishing\n\nConfigure this package's trusted publisher on npmjs.com for the GitHub owner, repository, and workflow filename publish.yml. Then dispatch the included GitHub Actions workflow or push a v<version> tag matching package.json. For private dependencies, set a read-only NPM_READ_TOKEN repository secret.\n\nSee [create-mercato-module](https://github.com/open-mercato/create-mercato-module) for authentication, release tests, and development details.\n","modules":[{"id":"visits","title":"Visits","description":null,"requires":[],"ejectable":true,"data":{"entities":[],"migrations":{"count":0,"first":null,"last":null},"customEntities":0},"http":{"routes":[],"legacyRouteFiles":0,"authResolved":1},"security":{"aclFeatures":[],"setupDefaultRoleFeatures":false},"events":{"emits":[],"subscribes":[]},"ui":{"backendPages":[{"path":"/backend/visits","requireFeatures":["customers.interactions.view"]}],"frontendPages":[],"widgets":0,"extensionHosts":0},"background":{"workers":[],"cli":[]},"ai":{"tools":[],"agents":[]},"config":{"credentials":[],"env":[]},"network":{"hosts":[],"undeclared":[]},"extends":[],"omImports":{"@open-mercato/shared":{"lib/frontend/useOrganizationScope":["useOrganizationScopeVersion"],"lib/i18n/context":["useLocale","useT"],"lib/modules/registry":["getModules"],"modules/registry":["ModuleInfo","PageMetadata"]},"@open-mercato/ui":{"backend/DataTable":["DataTable"],"backend/Page":["Page","PageBody"],"backend/RowActions":["RowActions"],"backend/utils/apiCall":["apiCall"],"primitives/button":["Button"],"primitives/dialog":["Dialog","DialogContent","DialogDescription","DialogHeader","DialogTitle"],"primitives/status-badge":["StatusBadge"]}},"collisionKeys":{"moduleId":"visits","tables":[],"aclFeatures":[],"eventIds":[],"backendRoutes":["/backend/visits"]},"publicRoutes":0,"glyph":"0010000","lint":[{"code":"peer-exact-pin","severity":"warn","message":"Peer dependencies pin Open Mercato exactly (@open-mercato/core 0.8.0 and 2 more). Use a range.","anchor":"i2 §1.4","src":null},{"code":"likely-example","severity":"info","message":"Module has no api/ and no data/ folder. Consider the example tag if this is an exercise.","anchor":"spec 4.3","src":null},{"code":"no-agents-md","severity":"info","message":"No AGENTS.md in the package.","anchor":"g3 §3","src":null},{"code":"peer-range-behind","severity":"info","message":"Built for 0.8.0 does not include Open Mercato 0.9.0.","anchor":"w4 §4.2","src":null}]}],"coverage":{"routesAuthResolved":1,"integrationTs":"absent"},"diagnostics":[]},"receipts":[],"rules":[{"id":"LST-1","pass":true,"detail":"Descriptor is valid."},{"id":"LST-2","pass":true,"detail":"Stable version exists and is not deprecated."},{"id":"LST-3","pass":true,"detail":"src/modules and dist/modules pair found."},{"id":"LST-4","pass":true,"detail":"License: UNLICENSED."},{"id":"LST-5","pass":true,"detail":"No known malware or open critical advisory."},{"id":"LST-6","pass":true,"detail":"Name reviewed at merge."},{"id":"VER-1","pass":false,"detail":"Not yet tested in a new app on 0.9."},{"id":"VER-2","pass":true,"detail":"Fits statically on 0.9: ok."},{"id":"VER-3","pass":true,"detail":"Supply chain: ok."},{"id":"VER-4","pass":true,"detail":"No lint errors."},{"id":"VER-5","pass":true,"detail":"No repository in the descriptor to compare."}],"hostDuplicates":[{"name":"@tanstack/react-query","moduleRange":"5.104.1","appVersion":"5.104.5","lines":["0.8","0.9","next"],"om":["0.8.0","0.9.0","0.10.1-develop.7701.1.87b1ad4224"],"message":"Bundles @tanstack/react-query 5.104.1 while a new app on 0.8, 0.9 and next ships 5.104.5. Two copies break types. Move it to peerDependencies."},{"name":"@tanstack/react-table","moduleRange":"9.2.5","appVersion":"9.3.1","lines":["0.8","0.9","next"],"om":["0.8.0","0.9.0","0.10.1-develop.7701.1.87b1ad4224"],"message":"Bundles @tanstack/react-table 9.2.5 while a new app on 0.8, 0.9 and next ships 9.3.1. Two copies break types. Move it to peerDependencies."}],"maintainers":["piotrkarwatka"]}
