Starting a new enterprise engagement is more than scaffolding code — agents and humans need shared delivery rules from commit one. This week I wired a new delivery repo with ThreeWill Engineering Standards as a git submodule and product-specific agent context before the first feature branch landed.
Added threewill-engineering-standards as a git submodule at .cursor/rules/ so team non-negotiables, MCP docs, and SPFx patterns travel with the repo
The standards package is the result of a long partnership and rounds of planning with Cursor — so every developer, whether working locally or in the cloud, can trust that agents follow the same rules
The approach predates Cursor Cloud agents, but it remains a strong way to distribute consistent agentic behavior; it is still a work in progress, and the team is happy with how far it has come
Wrote product-specific AGENTS.md with submodule hygiene: detect missing standards, init/sync commands, and a light cadence for bumping the pinned SHA via PR
Documented delivery conventions in docs/delivery.md: branch + PR discipline, Azure DevOps Boards ↔ GitHub PR linkage (AB#<id>), GitHub Actions CI/CD posture, and Azure DevOps MCP setup for Cursor — without publishing client org or cutover details
Added Cursor Cloud-specific instructions so cloud agents follow the same submodule and delivery rules as local sessions
Adoption across the practice keeps improving — especially on SPFx web parts, where the standards enforce fewer rules but bring a consistent look-and-feel and reusable React components
Recent advancements clarify sophistication levels: Enterprise solutions carry a fuller requirements set than smaller/atomic solutions, so agents and humans get the right bar for the work
The same submodule pattern shows up across multiple active delivery repos (enterprise engagements and internal SPFx products), not only this kickoff
Measurable trends on the Human Services Scorecard work better as a dedicated overlay and picker flow than as charts crammed into every KPI tile. This is the strong opening chapter — more is coming, including a public release.
Advanced Page Properties started years ago as a PnP-style experiment and kept maturing. This week’s window finally pushed the SPFx 1.23 / Heft migration over the line and packaged the repo for an MIT public release.
Migrated the solution to SharePoint Framework 1.23 with the Heft toolchain and PnPjs v4
Synced lockfiles and CI for legacy-peer-deps realities of modern SPFx
Added LICENSE, CONTRIBUTING, SECURITY, and deployment validation docs
Promoted the public repo on the Homol Works Builds page — verified against the public GitHub release
Public write-up stays fork-agnostic: no client-specific or niche tenant branches called out
Demo screenshot of an Employee Spotlight page showing page properties in action (choice pills, links, currency, avatar, boolean, number, and long text)
Ruddr MCP Server left the internal toolbox and landed as a public ThreeWill release — a self-hosted stdio MCP that puts PSA data into Cursor and Claude Desktop.
As the PnP Weekly adage goes, "Sharing is Caring". So I posit the following: does this imply that "Better Sharing is Better Caring?" You be the judge. 😜
The state of sharing in the development world, particularly thanks to the gains of open source over the years, has never been stronger. We can push code to GitHub almost instantaneously. We have lots of ways of describing our code to others using markdown files, typically at the root of our solution. Maybe we've even gone the distance and built out a set of GitHub pages. In it we have real writeups on specific features with example snippets of code or showing how to use our product.
Have you ever felt like there's almost too much to learn and to unpack? Developers are expected to move faster than ever and know more than ever. How do you move quickly when you're jumping into a new technology or project without feeling overwhelmed? Is there more that we can add to our tool belt to assist with knowledge sharing, documentation or investigation? Allow me to throw at you 2 new technologies to assist in this endeavor: Jupyter Labs and CodeTour.
Jupyter Labs comes from the Python world of data science. But it has moved far beyond just that. Essentially, it leverages Python to allow for different languages to have a runnable kernel against a jupyter notebook. What this gives you is something quite powerful and cool. It's a web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text.
I once described it to my team as this: imagine having a wiki with runnable code snippets directly in the wiki. One of my teammates, upon seeing a demo for the first time, described it in a somewhat opposite way: it's like code with way better commenting. Either way you look at it, it's certainly more powerful that just code or just documentation.
Jupyter's site has instructions to install here. But just doing that isn't going to be as powerful, especially if you're a Microsoft developer. Jupyter's base install is a Python notebook that can run in the Kernel, We want to deal in things like C# and PowerShell. So lets add that to kernel using .Net Interactive. Personally, I think Scott Hanselman's instructions here may be your best bet, especially if you're on Windows. This means you'll need Anaconda installed first (remember all this is based on Python).
As you've probably already caught on, this is Python and cross-platform. This means we Microsoft folks need to stick with all things Core. .Net interactive's notebooks give us C#, F# and PowerShell Core though, so we have some fun things we can do. This does mean that the PnP PoSH folks are on the outside looking in, until it supports PowerShell Core. But hopefully that's coming very soon. So check out what we can do using PowerShell Core, in the examples below, and hopefully that will get your mind spinning about other things you could do, including when PnP gets added to PS Core.
So keeping in mind that we are sticking to PowerShell Core, I whipped up a few examples of utilizing other CLI's with PowerShell to do some computing. Let's start with Azure CLI. Below is something simple. I just copied the MS documentation for getting started with the CLI into a notebook.
It's a totally different way to imagine documentation. Allow readers to instantly see the results, in the context of their own data!
Let's look at another aspect of using these notebooks: helping your team get something done. In this example, I've crafted some instructions to give to someone to create a site with the same theme that I made inside my tenant. Check it out.
Let's end with a bang. I have absolutely fallen in love with this next one: CodeTour. It's pretty new extension for VS Code and allows for providing a tour of your solution. As someone who has a passion for learning and teaching, I can't think of a better way to handle the onboarding experience for coders than a guided tour. And there are many other applications too. Recently, the PnP team used Code Tour to assist with the SPFx Project Upgrade. I'm sure once you play around with it, you will also think of new applications for it.
Get the extension here. I'm assuming that you already have VS Code. 😜 Also, a shout out to Jonathan Carter, the brains behind this. He's very receptive to feedback too so hit him up.
Hopefully I've provided you some new thought-starters for better ways to share information. These technologies and others should become part of our best practices tool bag. They allow for easier explanation of code, faster results in collaboration, simpler paths to onboarding and so much more. Please take the time to consider how you might use these solutions on your next project.
Adventures in PnP PowerShell provisioning templates
Has this ever happened to you? I had built a custom list with a custom view. To be more precise, I had basically lifted Chris Kent's sample here for a custom FAQ and dropped this on the page and the client was thrilled with it just as it is. Thanks Chris! Here's what the FAQ page looked like on the template site:
Not a bad looking FAQ list, right?
But this is just the beginning! This was my template. I need lots of sites to have this same FAQ page as a starting point, and it needs to look this good too.
So, onto provisioning with Powershell and PnP! At first I was running this:
Looks familiar right? Well pretty much everything was working great except for this:
Not so good. Also don't focus on the color difference lol
What the heck was going on here? The view and the list were migrating just fine, but that view was not getting applied! Or, was it? I noticed this in the List part properties:
Something is amiss
See anything off? Nothing is selected in the view drop down, even though it is selected in the my template site.
So here was my hunch. Perhaps, the pages are getting deployed before the custom list and custom view, sooo when the page gets made, there's no view to select, which is why it looks like the above. I acted on this hunch, by doing the following:
I split out just the FAQ list portion from the full Get-PnPProvisioningTemplate - essentially doing 2 Gets: one for the list only and one for everything else. Here's what that looked like:
Now you have 2 files. But there's 1 trick to this, if you want it to work in your favor. You need to open up the XML file for everything, and delete just the ListInstance node for the list (in my case, FAQ) from the XML file. So you can't easily do this all in one full script. You'd have to keep your pulls separate from your applies because of this manual intervention.
Then I applied my 2 files separately as well, starting with the lists first:
And, viola! My FAQ list was displaying as expected on the page, because the view was already found for the web part property because it already existed.