Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
cfc58fb
Delete AppMap.ps1
TecharyAdam Feb 4, 2026
806f558
Delete Intune-Packager.ps1
TecharyAdam Feb 4, 2026
f8d2b4e
Delete TecharyGet.psd1
TecharyAdam Feb 4, 2026
987470a
Delete TecharyGet.psm1
TecharyAdam Feb 4, 2026
4004e23
Add files via upload
TecharyAdam Feb 4, 2026
a010d5e
Revise README.md for TecharyGet module details
TecharyAdam Feb 4, 2026
75da1dd
Revise README by removing outdated sections
TecharyAdam Feb 4, 2026
b28813c
Update README to streamline installation and usage
TecharyAdam Feb 4, 2026
b6503ab
Add Install-TecharyApp function for app installation
TecharyAdam Mar 9, 2026
a722e94
Rename Install-SmartApp.ps1 to Install-TecharyApp.ps1
TecharyAdam Mar 9, 2026
d59103c
Add Uninstall-TecharyApp function for app removal
TecharyAdam Mar 9, 2026
0592b69
Rename Install-SmartApp to Install-TecharyApp
TecharyAdam Mar 9, 2026
f094a98
Update Install-TecharyApp function for MSI fallback
TecharyAdam Mar 9, 2026
dfd243c
Refactor TecharyGet.psm1 for consistency
TecharyAdam Mar 9, 2026
ed4e88e
Update module manifest for TecharyGet
TecharyAdam Mar 9, 2026
4d9c0fe
Update TecharyGet module manifest with new functions
TecharyAdam Mar 9, 2026
315ba93
Update TecharyGet.psd1
TecharyAdam Mar 9, 2026
230a31d
Delete Public/Get-GitHubInstaller.ps1
TecharyAdam Mar 9, 2026
f2b0eb3
Delete Public/Install-AppPackage.ps1
TecharyAdam Mar 9, 2026
686b9b1
Delete Public/Install-NableAgent.ps1
TecharyAdam Mar 9, 2026
182e62e
Delete Public/Install-TecharyApp.ps1
TecharyAdam Mar 9, 2026
9958f1a
Delete Public/Invoke-PackagerCleanup.ps1
TecharyAdam Mar 9, 2026
28b91e2
Delete Public/New-IntunePackage.ps1
TecharyAdam Mar 9, 2026
c1c62bf
Delete Public/New-IntunePackageUI.ps1
TecharyAdam Mar 9, 2026
292bad8
Delete Public/Uninstall-TecharyApp.ps1
TecharyAdam Mar 9, 2026
d6f4a83
Delete Public/Write-PackagerLog.ps1
TecharyAdam Mar 9, 2026
ddf7ffe
Add aa.txt with initial content 'aa'
TecharyAdam Mar 9, 2026
533b85f
Add files via upload
TecharyAdam Mar 9, 2026
30ee674
Update TecharyGet.psd1
TecharyAdam Mar 9, 2026
f329355
Delete Public/aa.txt
TecharyAdam Mar 10, 2026
b58ab70
Update TecharyGet.psd1
TecharyAdam Mar 10, 2026
3f033ad
Update TecharyGet.psd1
TecharyAdam Mar 10, 2026
c53aa25
Refactor Install-NableAgent function
TecharyAdam Mar 10, 2026
ec8c178
Update TecharyGet.psd1
TecharyAdam Mar 10, 2026
f20dead
Update README with Nable Agent installation example
TecharyAdam Mar 10, 2026
fe90072
Update Get-GitHubInstaller.ps1
TecharyAdam Mar 11, 2026
cbac32d
Update Get-GitHubInstaller.ps1
TecharyAdam Mar 11, 2026
11db0ca
Update README with App ID details
TecharyAdam Mar 11, 2026
04ed3fb
Cut GitHub API dependency and fix silent-failure paths
TecharyJames Sep 19, 2026
62dd2d9
Publish a prebuilt manifest index to remove the API from the install …
TecharyJames Sep 19, 2026
4eb819c
Make MSIX removal work under SYSTEM and stop deprovisioned apps retur…
TecharyJames Sep 19, 2026
0f68186
Stop leaving Appx sideloading policy permanently enabled
TecharyJames Sep 19, 2026
0f0f720
Detect applications by ProductCode instead of substring matching
TecharyJames Sep 19, 2026
465d80e
Confirm MSIX removal instead of inferring it from the absence of an e…
TecharyJames Sep 19, 2026
d6a7aa6
Merge #2: cut GitHub API dependency and fix silent-failure paths
TecharyJames Sep 19, 2026
5050f24
Merge #3: publish a prebuilt manifest index
TecharyJames Sep 19, 2026
0c57262
Merge #6: detect applications by ProductCode
TecharyJames Sep 19, 2026
b5a1d4e
Merge #4: MSIX removal under SYSTEM
TecharyJames Sep 19, 2026
1f6e375
Merge #5: restore sideloading policy
TecharyJames Sep 19, 2026
930ef74
Index every winget package for detection, not just the curated catalogue
TecharyJames Sep 19, 2026
8c81eb2
Emit index pairs and group in jq, avoiding an illegal control character
TecharyJames Sep 19, 2026
b8d0977
Hash-look-up product codes instead of probing the registry per code
TecharyJames Sep 19, 2026
e96cf7c
Merge #7: index every winget package for detection
TecharyJames Sep 19, 2026
b312fe2
Index every package, not only those with a product code
TecharyJames Sep 19, 2026
e825e4e
Reject architecture and channel folders when picking the latest version
TecharyJames Sep 19, 2026
3459200
Use canonical names for exact matching only
TecharyJames Sep 19, 2026
d2d9ae5
Merge #8: index every package; canonical names exact-match only
TecharyJames Sep 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Workflow files must stay LF. A CRLF `run:` block reaches bash on the runner
# with a literal CR on every line, which breaks the script.
# Deliberately NOT declaring `* text=auto`: the existing blobs in this repo are
# committed CRLF, so that would queue a repo-wide renormalisation diff.
*.yml -text
*.yaml -text
127 changes: 127 additions & 0 deletions .github/workflows/build-manifest-index.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
name: Build manifest index

on:
schedule:
# Nightly. NOTE: GitHub only runs scheduled workflows from the repository's
# DEFAULT branch, so this fires once the workflow exists on that branch.
# Push and manual dispatch work from any branch.
- cron: '17 3 * * *'
workflow_dispatch:
push:
paths:
- 'Index/Catalog.json'
- 'Build/Build-ManifestIndex.ps1'
- 'Private/Resolve-GitHubManifest.ps1'
- '.github/workflows/build-manifest-index.yml'

permissions:
contents: write

concurrency:
group: manifest-index
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

# ---------------------------------------------------------------
# Detection index: EVERY package in the winget source, not just the
# curated catalogue. Built from Microsoft's own published source
# index, which already carries the ARP product codes and MSIX package
# family names that detection matches on. One 3.5 MB CDN download, no
# api.github.com calls, no clone of winget-pkgs.
# ---------------------------------------------------------------
- name: Build detection index from the winget source
run: |
set -euo pipefail
curl -sSL --retry 3 --max-time 300 \
-o source2.msix https://cdn.winget.microsoft.com/cache/source2.msix
ls -l source2.msix

unzip -o -q source2.msix -d wingetsrc
DB=wingetsrc/Public/index.db
test -f "$DB"

# One row per identifier rather than a delimited list. Any separator
# has to be a character that cannot appear inside a product code, and
# the obvious safe choice is a control character, which is not legal
# in a YAML workflow file. Emitting pairs and grouping in jq avoids
# the question entirely.
#
# Every package gets an entry, including those with neither a product
# code nor a package family name. Those cannot be matched by code,
# but the entry still carries the canonical display name, and that is
# what bridges an ID to its ARP entry: "Valve.Steam" never matches
# "Steam" on its own. A name-only row costs about 80 bytes.
sqlite3 "$DB" -json "
SELECT p.id AS Id, p.name AS Name, p.latest_version AS Version,
'P' AS Kind, c.productcode AS Value
FROM packages p JOIN productcodes2 c ON c.package = p.rowid
UNION ALL
SELECT p.id, p.name, p.latest_version,
'F', f.pfn
FROM packages p JOIN pfns2 f ON f.package = p.rowid
UNION ALL
SELECT p.id, p.name, p.latest_version,
'N', NULL
FROM packages p
WHERE NOT EXISTS (SELECT 1 FROM productcodes2 WHERE package = p.rowid)
AND NOT EXISTS (SELECT 1 FROM pfns2 WHERE package = p.rowid)
ORDER BY 1;" > pairs.json

NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
jq --arg now "$NOW" '
group_by(.Id)
| map({
key: .[0].Id,
value: {
Name: .[0].Name,
Version: .[0].Version,
ProductCodes: [ .[] | select(.Kind == "P") | .Value ],
Pfns: [ .[] | select(.Kind == "F") | .Value ]
}})
| from_entries
| { Generated: $now,
Source: "winget source2 index",
PackageCount: length,
Packages: . }
' pairs.json > Index/Detection.json

echo "detection index: $(jq -r .PackageCount Index/Detection.json) packages, $(du -h Index/Detection.json | cut -f1)"

# ---------------------------------------------------------------
# Curated index: full install metadata (installer URL, silent args) for
# the packages in Index/Catalog.json, so a common install needs no API
# call either. Anything not listed still installs, resolved live.
# ---------------------------------------------------------------
- name: Resolve curated manifests
shell: pwsh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./Build/Build-ManifestIndex.ps1 -CatalogPath Index/Catalog.json -OutputPath Index/Manifests.json

- name: Publish to the manifest-index branch
run: |
set -euo pipefail
cp Index/Manifests.json "$RUNNER_TEMP/Manifests.json"
cp Index/Detection.json "$RUNNER_TEMP/Detection.json"

git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

# Orphan + force-push keeps exactly one commit on the branch, so a
# nightly refresh never grows the repository or touches code history.
git checkout --orphan manifest-index
git rm -rf . -q
cp "$RUNNER_TEMP/Manifests.json" Manifests.json
cp "$RUNNER_TEMP/Detection.json" Detection.json
git add Manifests.json Detection.json
git commit -q -m "Refresh manifest index ($(date -u +%Y-%m-%dT%H:%M:%SZ))"
git push -f origin manifest-index

echo "Published to https://raw.githubusercontent.com/${GITHUB_REPOSITORY}/manifest-index/"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Built in CI and published to the manifest-index branch, never committed here.
Index/Manifests.json
Index/Detection.json
Loading
Loading