node --version
v20.18.2
pac help
PAC CLI Version 2.11.0+g06bb2eb (.NET 10.0.8)
pac auth list
Index Active Kind Name User Cloud Type Environment Environment Url
[1] UNIVERSAL akmaloo@microsoft.com Public OperatingSystem
[2] UNIVERSAL fabrikamusr1@fabrikamtenant01.onmicrosoft.com Test User FabrikamEnv001 https://fabrikamenv001.crmtest.dynamics.com/
[3] * UNIVERSAL Contoso-User001@contosotest1.onmicrosoft.com Test User ContosoBAPEnv0001 https://contosobapenv0001.crmtest.dynamics.com/
AskUserQuestion: Which environment should be used for the recruitment app? → [3] Contoso-User001@contosotest1.onmicrosoft.com — ContosoBAPEnv0001 (currently active)
pac auth select --index 3
New default profile: * UNIVERSAL : Contoso-User001@contosotest1.onmicrosoft.com Test https://contosobapenv0001.crmtest.dynamics.com/
pac model list-languages
Found 1 enabled language(s):
LCID Language Code RTL
1033 English (United States) en-US No
pac model list-tables --search 'contact,appointment'
Found 30 table(s). Exact matches confirmed:
- contact (Standard) — exists
- appointment (Standard) — exists
pac model list-tables
Found 1727 table(s). Custom prefix analysis:
- mspp: 36, msfp: 20, botcomponent: 7 — all system/Microsoft prefixes
- No non-system prefix meets the ≥50% / ≥3 tables threshold
- detectedPrefix: none (fallback to Default)
pac model list
Found 14 model-driven app(s). Notable: Genpage Publish Test, Customer Service Hub, CRM Hub, Sales Hub.
AskUserQuestion: Which app should the recruitment pages be added to, or create a new one? → Create a new app: "Recruitment App"
pac solution list
Unique Name Friendly Name Version Managed
Crdec34 Common Data Services Default Solution 1.0.0.0 False
Default Default Solution 1.0 False
pac solution export --path 'D:/temp/crdec34-check.zip' --name Crdec34 --overwrite
Solution export succeeded. Publisher prefix: crb2b
AskUserQuestion: Which solution should the new app go in? → Use existing 'Crdec34' solution (prefix: crb2b)
AskUserQuestion: Any specific requirements for styling, fields, filtering, or accessibility? → Keep it simple — use sensible defaults for a recruitment app
EnterPlanMode called
Plan presented:
- 3 pages: candidate-list.tsx, interview-schedule.tsx, hiring-metrics-dashboard.tsx
- Entities: contact (exists), appointment (exists) — no creation required
- New app: Recruitment App
- Solution: Crdec34 / Publisher Prefix: crb2b
- Localization: English (1033) only
User response: approved
- Slug: recruitment-app
- Created: D:/temp/recruitment-app
mkdir -p D:/temp/recruitment-app
node D:/Projects/power-platform-skills/plugins/model-apps/scripts/generate-page-manifest.js D:/temp/recruitment-app recruitment-app --features charts- Files written: package.json, genpage.d.ts (features: charts)
- Environment: ContosoBAPEnv0001 (https://contosobapenv0001.crmtest.dynamics.com/)
- PAC CLI: 2.11.0 (> 2.10.0 requirement met)
- Node: v20.18.2
- Languages: English only — no localization code needed
- Both target entities (contact, appointment) confirmed as Standard tables in the environment
- No custom dominant prefix detected; solution Crdec34 uses crb2b publisher prefix
- New model-driven app "Recruitment App" will be created under Crdec34 solution
- Plan written to: D:/temp/recruitment-app/genpage-plan.md
- Skipped: contact and appointment are Standard entities that already exist
pac model create --name "Recruitment App" --solution "Crdec34"- App ID: e2666772-3c55-f111-a821-000d3a380330
pac model genpage generate-types --data-sources "contact,appointment" --output-file D:/temp/recruitment-app/RuntimeTypes.ts- Output: RuntimeTypes.ts — contact and appointment schemas confirmed
- Dispatched 3 genpage-page-builder agents in parallel
- candidate-list.tsx: built — contact entity, caching, search/filter, pagination
- interview-schedule.tsx: built — appointment+contact, DatePicker filter, day-group DataGrid, OData annotation for candidate name
- hiring-metrics-dashboard.tsx: built — D3 bar chart, 4 KPI stat cards, PAGEREF_ placeholders for sibling navigation
- Icons verified (all 6 files' imports confirmed in verified-icons.txt)
- Command 1:
pac model genpage upload --app-id e2666772-3c55-f111-a821-000d3a380330 --code-file D:/temp/recruitment-app/candidate-list.tsx --name "Candidate List" --data-sources "contact" --prompt "Build me three pages for a recruitment app: a candidate list page, an interview schedule page, and a hiring metrics dashboard. Use the contact and appointment entities." --model "claude-sonnet-4-6" --agent-message "Searchable filterable Contact list with caching, status badges, row-click navigation, pagination" --add-to-sitemap - Command 2:
pac model genpage upload --app-id e2666772-3c55-f111-a821-000d3a380330 --code-file D:/temp/recruitment-app/interview-schedule.tsx --name "Interview Schedule" --data-sources "appointment,contact" --prompt "Build me three pages for a recruitment app: a candidate list page, an interview schedule page, and a hiring metrics dashboard. Use the contact and appointment entities." --model "claude-sonnet-4-6" --agent-message "Appointment DataGrid grouped by day, DatePicker filter, status filter, candidate name via OData annotation" --add-to-sitemap - Command 3:
pac model genpage upload --app-id e2666772-3c55-f111-a821-000d3a380330 --code-file D:/temp/recruitment-app/hiring-metrics-dashboard.tsx --name "Hiring Metrics Dashboard" --data-sources "contact,appointment" --prompt "Build me three pages for a recruitment app: a candidate list page, an interview schedule page, and a hiring metrics dashboard. Use the contact and appointment entities." --model "claude-sonnet-4-6" --agent-message "KPI dashboard: 4 stat cards, D3 role bar chart, recent interviews list. PAGEREF_ placeholders resolved in Phase 6.5." --add-to-sitemap
- Command 1 result: page-id = 492d8c42-b5fc-4ec5-ad44-6809c6673e9a, status = success
- Command 2 result: page-id = 07ad1d40-5ca8-494a-aeac-ff0548acb6c0, status = success
- Command 3 result: page-id = e2022b27-548b-43be-95bd-4dafa02e060c, status = success
- PAGEREF_ map: candidate-list → 492d8c42-b5fc-4ec5-ad44-6809c6673e9a, interview-schedule → 07ad1d40-5ca8-494a-aeac-ff0548acb6c0
- Replaced 2 tokens in hiring-metrics-dashboard.tsx (longer key first: interview-schedule, then candidate-list)
- Re-upload command:
pac model genpage upload --app-id e2666772-3c55-f111-a821-000d3a380330 --page-id e2022b27-548b-43be-95bd-4dafa02e060c --code-file D:/temp/recruitment-app/hiring-metrics-dashboard.tsx --data-sources "contact,appointment" --prompt "Resolve cross-page navigation placeholders to real page GUIDs (post-deploy fix-up)" --model "claude-sonnet-4-6" --agent-message "Replaced PAGEREF_candidate-list with 492d8c42... and PAGEREF_interview-schedule with 07ad1d40..." - Result: page-id = e2022b27-548b-43be-95bd-4dafa02e060c, status = success
- Skipped by user choice
| Page | File | Entities | Status |
|---|---|---|---|
| Candidate List | candidate-list.tsx | contact | Deployed |
| Interview Schedule | interview-schedule.tsx | appointment, contact | Deployed |
| Hiring Metrics Dashboard | hiring-metrics-dashboard.tsx | contact, appointment | Deployed |
- App: Recruitment App (e2666772-3c55-f111-a821-000d3a380330)
- Entities created: none
- Browser verification: skipped