Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
937bdb7
Deploy Cassandra on Google Cloud C4A (Arm-based Axion VMs)
odidev Sep 30, 2025
ba8c9eb
Deploy CircleCI ARM Native Workflows on SUSE ARM (GCP VM)
odidev Oct 10, 2025
7699226
data type update
chrismoroney Oct 16, 2025
85d016d
Update robots.txt to allow additional AI crawlers and remove unnecess…
madeline-underwood Oct 19, 2025
b962a17
Merge pull request #2439 from madeline-underwood/ai_seo_ins_updates
pareenaverma Oct 20, 2025
bea94d7
revert bfloat, clarify cloud instance
chrismoroney Oct 20, 2025
8aa2626
solution to localhost not connecting
chrismoroney Oct 20, 2025
38b82ad
initial checking of EI AWS Greengrass workshop
DougAnsonAustinTX Oct 20, 2025
63a48c8
reverted
DougAnsonAustinTX Oct 20, 2025
fb6bafa
re-added EI AWS workshop in all lower case
DougAnsonAustinTX Oct 20, 2025
5e0ab55
minor update to OS type
DougAnsonAustinTX Oct 20, 2025
59c2c39
minor updates to index.md file
DougAnsonAustinTX Oct 20, 2025
130406e
minor update to index.md 2
DougAnsonAustinTX Oct 20, 2025
cd10ffc
fix for pipe fail test suite failure
DougAnsonAustinTX Oct 20, 2025
737ee15
fixes for test failures patch.py
DougAnsonAustinTX Oct 20, 2025
aa91f0f
more fixes for test suite failures
DougAnsonAustinTX Oct 20, 2025
00187c0
more fixes for test failures
DougAnsonAustinTX Oct 20, 2025
bc7c1d2
Update _index.md
madeline-underwood Oct 21, 2025
75a6ae6
Update background.md
madeline-underwood Oct 21, 2025
ef444aa
Update instance.md
madeline-underwood Oct 21, 2025
9129e13
Update installation.md
madeline-underwood Oct 21, 2025
d418595
Update installation.md
madeline-underwood Oct 21, 2025
3c6806a
Update PHP on GCP learning path
madeline-underwood Oct 21, 2025
c5fd889
Update title for PHP on Google Cloud Axion C4A Arm VMs
madeline-underwood Oct 21, 2025
5843e93
Updates
madeline-underwood Oct 21, 2025
80b9f8e
Merge pull request #2432 from chrismoroney/cmoroney-vllm-on-arm-last-…
jasonrandrews Oct 21, 2025
720022d
Refine PHP on GCP documentation for clarity and consistency
madeline-underwood Oct 21, 2025
47d4c00
Merge pull request #2443 from chrismoroney/cmoroney-run-llm-chatbot-w…
pareenaverma Oct 21, 2025
ab5ac76
Refactor PHP on GCP documentation for clarity and consistency
madeline-underwood Oct 21, 2025
ba705b1
reverted tools changes
DougAnsonAustinTX Oct 21, 2025
a012bb8
Merge pull request #2445 from DougAnsonAustinTX/main
jasonrandrews Oct 21, 2025
de25b24
Update _index.md
pareenaverma Oct 21, 2025
ef49759
Merge pull request #2426 from odidev/circle-ci-lp
pareenaverma Oct 21, 2025
bdf0423
Refactor PHP installation instructions for clarity and consistency
madeline-underwood Oct 21, 2025
e7f6cc4
Update PHP on GCP learning path content
madeline-underwood Oct 21, 2025
0d30e70
minor fixes to tools
DougAnsonAustinTX Oct 21, 2025
8cacc14
Merge pull request #2447 from madeline-underwood/phpgc
jasonrandrews Oct 22, 2025
9ad11d0
Update _index.md to refine title and learning objectives for resource…
madeline-underwood Oct 22, 2025
885b1ca
Updates
madeline-underwood Oct 22, 2025
76174ca
scripts to automate PR movement
chrismoroney Oct 22, 2025
33836f1
Merge pull request #2449 from chrismoroney/cmoroney-github-workflow-u…
pareenaverma Oct 22, 2025
beedcb7
Merge pull request #2448 from DougAnsonAustinTX/updated-tools
pareenaverma Oct 22, 2025
e540180
BOLT: mention Arm Toolchain for Linux
pawosm-arm Oct 22, 2025
32e49b3
Update bolt.md
pareenaverma Oct 22, 2025
27b4abf
Merge pull request #2450 from pawosm-arm/bolt-mention-atfl
pareenaverma Oct 22, 2025
5414f5f
datatype fix
chrismoroney Oct 22, 2025
f95d0b3
Merge branch 'ArmDeveloperEcosystem:main' into cmoroney-github-workfl…
chrismoroney Oct 22, 2025
8439af6
Merge pull request #2451 from chrismoroney/cmoroney-github-workflow-u…
pareenaverma Oct 22, 2025
20972a8
cron data type update
chrismoroney Oct 22, 2025
e7ae23c
Merge branch 'cmoroney-github-workflow-updates' of https://github.com…
chrismoroney Oct 22, 2025
7fe7b6d
Merge pull request #2452 from chrismoroney/cmoroney-github-workflow-u…
pareenaverma Oct 22, 2025
faf387a
Revert "Cmoroney GitHub workflow updates"
chrismoroney Oct 22, 2025
4e651d6
Update last-reviewed-cron.yml
chrismoroney Oct 22, 2025
9c2103e
Update last-reviewed-cron.yml
chrismoroney Oct 22, 2025
7d4e801
Update last-reviewed-cron.yml
chrismoroney Oct 22, 2025
372801e
Update last-reviewed-cron.yml
chrismoroney Oct 22, 2025
033b498
Update last-reviewed-cron.yml
chrismoroney Oct 22, 2025
93f4718
Update last-reviewed-cron.yml
chrismoroney Oct 22, 2025
d942275
Update last-reviewed-cron.yml
chrismoroney Oct 22, 2025
775f78c
Update last-reviewed-cron.yml
chrismoroney Oct 22, 2025
18e5a6d
Update last-reviewed-cron.yml
chrismoroney Oct 22, 2025
2b30581
Merge pull request #2453 from ArmDeveloperEcosystem/revert-2452-cmoro…
pareenaverma Oct 22, 2025
0862c6d
Refine titles and descriptions in resource usage documentation for cl…
madeline-underwood Oct 22, 2025
69ec63f
Merge branch 'tracking' of https://github.com/madeline-underwood/arm-…
madeline-underwood Oct 22, 2025
53dbe1a
Refine documentation for Node.js on Google Cloud C4A: update titles a…
madeline-underwood Oct 23, 2025
c11ba2d
Enhance documentation for Node.js on Google Cloud: improve clarity an…
madeline-underwood Oct 23, 2025
646ef61
Refine documentation for Node.js on Google Cloud C4A: update titles, …
madeline-underwood Oct 23, 2025
dc1e4ff
Merge pull request #2454 from madeline-underwood/tracking
jasonrandrews Oct 23, 2025
d6254fe
Merge pull request #2377 from odidev/cassendra_LP
jasonrandrews Oct 23, 2025
42ed762
Cassandra for Google Axion in draft mode for tech review
jasonrandrews Oct 23, 2025
8057517
Merge pull request #2457 from jasonrandrews/review
jasonrandrews Oct 23, 2025
2c5dfc4
Update Node.js GCP learning path content
madeline-underwood Oct 23, 2025
fc67080
Clarify instruction for starting the Node.js HTTP server in benchmark…
madeline-underwood Oct 23, 2025
7753d5b
Update vLLM to a newer version
jasonrandrews Oct 23, 2025
6cbe541
Merge pull request #2459 from jasonrandrews/review
jasonrandrews Oct 23, 2025
293f145
synced c4a vm setup page and images, also minor update to the baselin…
DougAnsonAustinTX Oct 23, 2025
76e494f
Merge pull request #2460 from DougAnsonAustinTX/cassendra-review
jasonrandrews Oct 23, 2025
58a7b04
Merge pull request #2458 from madeline-underwood/node.js
jasonrandrews Oct 23, 2025
cfea812
updated with choice of Ubuntu or SuSE linux
DougAnsonAustinTX Oct 23, 2025
efbe035
Merge pull request #2462 from DougAnsonAustinTX/c4a_sync_update
jasonrandrews Oct 23, 2025
36be7f7
Update benchmarking info for Node.js
jasonrandrews Oct 23, 2025
486ca34
Merge pull request #2463 from jasonrandrews/review
jasonrandrews Oct 23, 2025
7921b2c
Update getting started on GCP
jasonrandrews Oct 23, 2025
59070a7
Merge pull request #2464 from jasonrandrews/review
jasonrandrews Oct 23, 2025
ceb69ce
updates for ubuntu and cassandra
DougAnsonAustinTX Oct 23, 2025
61b1dd3
updated synced with cassandra install
DougAnsonAustinTX Oct 23, 2025
4037b4d
Merge pull request #2465 from DougAnsonAustinTX/add_ubuntu_and_suse_i…
jasonrandrews Oct 23, 2025
0e559e0
Merge branch 'main' into updates_for_ubuntu_c4a_install
jasonrandrews Oct 23, 2025
13caf4b
Merge pull request #2466 from DougAnsonAustinTX/updates_for_ubuntu_c4…
jasonrandrews Oct 23, 2025
57cc507
synced c4a instructions
DougAnsonAustinTX Oct 23, 2025
44cc20f
Merge pull request #2467 from DougAnsonAustinTX/sync_c4a_instructions
jasonrandrews Oct 23, 2025
87ab4f5
small edit of benchmark results
DougAnsonAustinTX Oct 23, 2025
193a662
Merge pull request #2468 from DougAnsonAustinTX/benchmark_updates
jasonrandrews Oct 23, 2025
02d9567
[Fix] Duplicate fields.
Arnaud-de-Grandmaison-ARM Oct 24, 2025
5cc146f
SME2 matrix multiplication: pin code example to a specific version
Arnaud-de-Grandmaison-ARM Oct 24, 2025
759f961
Merge pull request #2471 from Arnaud-de-Grandmaison-ARM/sme2-pin
pareenaverma Oct 24, 2025
62aff49
Merge pull request #2469 from Arnaud-de-Grandmaison-ARM/fix
pareenaverma Oct 24, 2025
774c82c
Update 1-get-started.md
pareenaverma Oct 24, 2025
5ae1ef1
Merge pull request #2472 from pareenaverma/content_review
pareenaverma Oct 24, 2025
aadad10
Updated SME2 devices
pareenaverma Oct 24, 2025
8253308
Merge pull request #2473 from pareenaverma/content_review
pareenaverma Oct 24, 2025
e28bc23
Update NSS for Unreal LP
annietllnd Sep 26, 2025
cda2830
Merge pull request #2474 from annietllnd/neural-graphics
pareenaverma Oct 24, 2025
39689fb
Update .wordlist.txt
pareenaverma Oct 24, 2025
63e06cf
Update _index.md
pareenaverma Oct 24, 2025
672b97c
Update benchmnarking.md
pareenaverma Oct 24, 2025
8bb3a94
Update installation.md
pareenaverma Oct 24, 2025
ae0802b
Merge pull request #2475 from pareenaverma/content_review
pareenaverma Oct 24, 2025
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
125 changes: 125 additions & 0 deletions .github/workflows/last-reviewed-backfill.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
name: Last Reviewed Date Backfill (One Time)

on:
workflow_dispatch:
inputs:
dry_run:
description: "Log actions only (no writes)"
type: boolean
default: true

permissions:
contents: read
pull-requests: read
repository-projects: write

jobs:
backfill:
runs-on: ubuntu-latest
steps:
- name: Backfill Last Reviewed Date
uses: actions/github-script@v6
with:
github-token: ${{ secrets.PROJECT_TOKEN }}
script: |
const dryRun = core.getInput('dry_run') === 'true';

const orgLogin = 'ArmDeveloperEcosystem';
const projectNumber = 4;

const ISO_CUTOFF = '2024-12-31';
const toDate = (iso) => new Date(iso + 'T00:00:00.000Z');

// 1) project
const proj = await github.graphql(
`query($org:String!,$num:Int!){ organization(login:$org){ projectV2(number:$num){ id } } }`,
{ org: orgLogin, num: projectNumber }
);
const projectId = proj.organization?.projectV2?.id;
if (!projectId) throw new Error('Project not found');

// 2) fields
const fields = (await github.graphql(
`query($id:ID!){ node(id:$id){ ... on ProjectV2 {
fields(first:50){ nodes{
__typename
... on ProjectV2Field{ id name dataType }
... on ProjectV2SingleSelectField{ id name options{ id name } }
} } } } }`, { id: projectId }
)).node.fields.nodes;

const dateFieldId = (n)=>fields.find(f=>f.__typename==='ProjectV2Field'&&f.name===n&&f.dataType==='DATE')?.id||null;
const statusField = fields.find(f=>f.__typename==='ProjectV2SingleSelectField' && f.name==='Status');
const statusFieldId = statusField?.id;
const publishId = dateFieldId('Publish Date');
const lrdId = dateFieldId('Last Reviewed Date');

if (!statusFieldId || !lrdId) throw new Error('Missing Status or Last Reviewed Date field');

// writers
const setDate = async (itemId, fieldId, iso) => {
if (dryRun) return console.log(`[DRY RUN] setDate item=${itemId} -> ${iso}`);
const m = `mutation($p:ID!,$i:ID!,$f:ID!,$d:Date!){
updateProjectV2ItemFieldValue(input:{projectId:$p,itemId:$i,fieldId:$f,value:{date:$d}}){
projectV2Item{ id }
}}`;
await github.graphql(m, { p: projectId, i: itemId, f: fieldId, d: iso });
};

// helpers
const getDate = (item,id)=>item.fieldValues.nodes.find(n=>n.__typename==='ProjectV2ItemFieldDateValue'&&n.field?.id===id)?.date||null;
const getStatus = (item)=>{ const n=item.fieldValues.nodes.find(n=>n.__typename==='ProjectV2ItemFieldSingleSelectValue'&&n.field?.id===statusFieldId); return n?.name||null; };

// iterate
async function* items(){ let cursor=null; for(;;){
const r=await github.graphql(
`query($org:String!,$num:Int!,$after:String){
organization(login:$org){ projectV2(number:$num){
items(first:100, after:$after){
nodes{
id
content{ __typename ... on PullRequest{ number repository{ name } } }
fieldValues(first:50){ nodes{
__typename
... on ProjectV2ItemFieldDateValue{ field{ ... on ProjectV2Field{ id name } } date }
... on ProjectV2ItemFieldSingleSelectValue{ field{ ... on ProjectV2SingleSelectField{ id name } } name optionId }
} }
}
pageInfo{ hasNextPage endCursor }
}
} } }`,
{ org: orgLogin, num: projectNumber, after: cursor }
);
const page=r.organization.projectV2.items;
for(const n of page.nodes) yield n;
if(!page.pageInfo.hasNextPage) break;
cursor=page.pageInfo.endCursor;
} }

let updates=0;
for await (const item of items()){
if (item.content?.__typename !== 'PullRequest') continue;

const status = getStatus(item);
if (status !== 'Done' && status !== 'Maintenance') continue;

const lrd = getDate(item, lrdId);
if (lrd) continue; // already has a value

if (status === 'Done') {
const publish = publishId ? getDate(item, publishId) : null;
if (publish) {
await setDate(item.id, lrdId, publish);
updates++; console.log(`[Backfill][Done] Set LRD=${publish}`);
} else {
console.log(`[Skip][Done] No Publish Date; not setting LRD`);
}
}

if (status === 'Maintenance') {
await setDate(item.id, lrdId, ISO_CUTOFF);
updates++; console.log(`[Backfill][Maintenance] Set LRD=${ISO_CUTOFF}`);
}
}

console.log(`Backfill complete. Items updated: ${updates}. Dry run: ${dryRun}`);
254 changes: 254 additions & 0 deletions .github/workflows/last-reviewed-cron.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
name: Last Reviewed Cron

on:
schedule:
- cron: "0 9 * * *" # daily at 09:00 UTC
workflow_dispatch:
inputs:
dry_run:
description: "Log actions only (no writes)"
type: boolean
default: false

permissions:
contents: read
pull-requests: read
repository-projects: write

jobs:
sweep:
runs-on: ubuntu-latest
steps:
- name: Move items based on Last Reviewed Date
uses: actions/github-script@v6
with:
github-token: ${{ secrets.PROJECT_TOKEN }}
script: |
// Inputs
const dryRun = core.getInput('dry_run') === 'true';

// ---- Config (edit if needed) ----
const orgLogin = 'ArmDeveloperEcosystem';
const projectNumber = 4;
const STATUS_FIELD_NAME = 'Status';
const STATUS_DONE = 'Done';
const STATUS_MAINT = 'Maintenance';
const LRD_FIELD_NAME = 'Last Reviewed Date';
const PUBLISHED_URL_FIELD_NAME = 'Published URL';
// ----------------------------------

// Dates
const TODAY = new Date();
const sixMonthsAgoISO = (() => {
const d = new Date(TODAY);
d.setUTCMonth(d.getUTCMonth() - 6);
return d.toISOString().split('T')[0];
})();
const toDate = (iso) => new Date(iso + 'T00:00:00.000Z');

// Project
const proj = await github.graphql(
`query($org:String!,$num:Int!){
organization(login:$org){
projectV2(number:$num){ id }
}
}`,
{ org: orgLogin, num: projectNumber }
);
const projectId = proj.organization?.projectV2?.id;
if (!projectId) throw new Error('Project not found');

// Fields
const fields = (await github.graphql(
`query($id:ID!){
node(id:$id){
... on ProjectV2 {
fields(first:50){
nodes{
__typename
... on ProjectV2Field { id name dataType }
... on ProjectV2SingleSelectField { id name options { id name } }
}
}
}
}
}`, { id: projectId }
)).node.fields.nodes;

const findDateFieldId = (name) =>
fields.find(f => f.__typename === 'ProjectV2Field' && f.name === name && f.dataType === 'DATE')?.id || null;

const findTextFieldId = (name) => {
const exact = fields.find(f => f.__typename === 'ProjectV2Field' && f.name === name && f.dataType === 'TEXT');
if (exact) return exact.id;
const ci = fields.find(f => f.__typename === 'ProjectV2Field' && (f.name?.toLowerCase?.() === name.toLowerCase()) && f.dataType === 'TEXT');
return ci?.id || null;
};

const statusField = fields.find(f => f.__typename === 'ProjectV2SingleSelectField' && f.name === STATUS_FIELD_NAME);
const statusFieldId = statusField?.id || null;
const doneId = statusField?.options?.find(o => o.name === STATUS_DONE)?.id || null;
const maintId = statusField?.options?.find(o => o.name === STATUS_MAINT)?.id || null;

const lrdId = findDateFieldId(LRD_FIELD_NAME);
const publishedUrlFieldId = findTextFieldId(PUBLISHED_URL_FIELD_NAME);

if (!statusFieldId || !doneId || !maintId || !lrdId) {
throw new Error('Missing required project fields/options: Status/Done/Maintenance or Last Reviewed Date.');
}

// Helpers
const getDate = (item, fieldId) =>
item.fieldValues.nodes.find(n =>
n.__typename === 'ProjectV2ItemFieldDateValue' && n.field?.id === fieldId
)?.date || null;

const getText = (item, fieldId) =>
item.fieldValues.nodes.find(n =>
n.__typename === 'ProjectV2ItemFieldTextValue' && n.field?.id === fieldId
)?.text || null;

const getStatusName = (item) => {
const n = item.fieldValues.nodes.find(n =>
n.__typename === 'ProjectV2ItemFieldSingleSelectValue' && n.field?.id === statusFieldId
);
return n?.name || null;
};

const setStatus = async (itemId, fieldId, optionId) => {
if (dryRun) {
console.log(`[DRY RUN] setStatus item=${itemId} -> option=${optionId}`);
return;
}
const m = `
mutation($p:ID!,$i:ID!,$f:ID!,$o:String!){
updateProjectV2ItemFieldValue(input:{
projectId:$p, itemId:$i, fieldId:$f, value:{ singleSelectOptionId:$o }
}){
projectV2Item { id }
}
}`;
await github.graphql(m, { p: projectId, i: itemId, f: fieldId, o: optionId });
};

async function* iterItems() {
let cursor = null;
for (;;) {
const r = await github.graphql(
`query($org:String!,$num:Int!,$after:String){
organization(login:$org){
projectV2(number:$num){
items(first:100, after:$after){
nodes{
id
content{
__typename
... on PullRequest {
number
repository { name }
}
}
fieldValues(first:100){
nodes{
__typename
... on ProjectV2ItemFieldDateValue {
field { ... on ProjectV2Field { id name } }
date
}
... on ProjectV2ItemFieldTextValue {
field { ... on ProjectV2Field { id name } }
text
}
... on ProjectV2ItemFieldSingleSelectValue {
field { ... on ProjectV2SingleSelectField { id name } }
name
optionId
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
}
}`,
{ org: orgLogin, num: projectNumber, after: cursor }
);

const page = r.organization.projectV2.items;
for (const n of page.nodes) yield n;
if (!page.pageInfo.hasNextPage) break;
cursor = page.pageInfo.endCursor;
}
}

const lastTwoFromUrl = (url) => {
if (!url) return '';
try {
const u = new URL(url);
const segs = u.pathname.split('/').filter(Boolean);
if (segs.length >= 2) return `${segs[segs.length - 2]}/${segs[segs.length - 1]}/`;
if (segs.length === 1) return `${segs[0]}/`;
return '';
} catch { return ''; }
};

// Movement counters & log
let movedDoneToMaint = 0;
let movedMaintToDone = 0;
const moveLog = [];

// Sweep
for await (const item of iterItems()) {
if (item.content?.__typename !== 'PullRequest') continue; // PRs only

const itemId = item.id;
const status = getStatusName(item);
const lrd = getDate(item, lrdId);
if (!status || !lrd) continue; // only move when LRD exists

const prNumber = item.content.number;
const repoName = item.content.repository.name;

const publishedUrl = publishedUrlFieldId ? getText(item, publishedUrlFieldId) : null;
const lastTwoSegments = lastTwoFromUrl(publishedUrl) || '(no-published-url)';

// Done -> Maintenance: LRD older/equal than 6 months ago
if (status === STATUS_DONE && toDate(lrd) <= toDate(sixMonthsAgoISO)) {
await setStatus(itemId, statusFieldId, maintId);
movedDoneToMaint++;
const line = `[Cron] Moved ${lastTwoSegments} → Maintenance (LRD ${lrd} ≤ ${sixMonthsAgoISO})`;
console.log(line);
moveLog.push(line);
continue; // skip second rule for same item
}

// Maintenance -> Done: LRD within last 6 months (strictly newer than threshold)
if (status === STATUS_MAINT && toDate(lrd) > toDate(sixMonthsAgoISO)) {
await setStatus(itemId, statusFieldId, doneId);
movedMaintToDone++;
const line = `[Cron] Moved ${lastTwoSegments} → Done (LRD ${lrd} > ${sixMonthsAgoISO})`;
console.log(line);
moveLog.push(line);
}
}

// Summary
const totalMoves = movedDoneToMaint + movedMaintToDone;
console.log(`Cron complete. Moved Done→Maintenance: ${movedDoneToMaint}, Maintenance→Done: ${movedMaintToDone}, Total: ${totalMoves}. Dry run: ${dryRun}`);

// Nice Job Summary in the Actions UI
await core.summary
.addHeading('Last Reviewed Cron Summary')
.addTable([
[{ data: 'Direction', header: true }, { data: 'Count', header: true }],
['Done → Maintenance', String(movedDoneToMaint)],
['Maintenance → Done', String(movedMaintToDone)],
['Total moves', String(totalMoves)],
])
.addHeading('Details', 2)
.addCodeBlock(moveLog.join('\n') || 'No moves', 'text')
.write();
Loading
Loading