Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
181 commits
Select commit Hold shift + click to select a range
6e4bf01
chore: (deps): bump jsdom from 27.4.0 to 28.0.0
dependabot[bot] Feb 3, 2026
e420bdc
docs: update release timestamp and changelog
github-actions[bot] Feb 3, 2026
9a5634b
chore: (deps): bump tldts from 7.0.21 to 7.0.22
dependabot[bot] Feb 4, 2026
ff53ef3
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/tldts-7.…
github-actions[bot] Feb 4, 2026
4302eb4
docs: update release timestamp and changelog
github-actions[bot] Feb 4, 2026
16c0ee3
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/tldts-co…
github-actions[bot] Feb 4, 2026
13adac7
docs: update release timestamp and changelog
github-actions[bot] Feb 4, 2026
4a4cb3a
feat: configurable news reader with 12 categories, preferences, email…
claude Feb 5, 2026
1a13d20
chore: add generated RSS feed XML files (global + per-category)
claude Feb 5, 2026
6c982ba
Update readme-viewer.html
EthanThePhoenix38 Feb 5, 2026
3102127
Potential fix for code scanning alert no. 19: DOM text reinterpreted …
EthanThePhoenix38 Feb 5, 2026
0ce0082
Potential fix for code scanning alert no. 20: DOM text reinterpreted …
EthanThePhoenix38 Feb 5, 2026
ff8193d
chore: (deps): bump @asamuzakjp/css-color from 4.1.1 to 4.1.2
dependabot[bot] Feb 6, 2026
3528e00
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/asamuzak…
github-actions[bot] Feb 6, 2026
2847e16
docs: update release timestamp and changelog
github-actions[bot] Feb 6, 2026
58ad1b3
chore: (deps): bump @asamuzakjp/dom-selector from 6.7.7 to 6.7.8
dependabot[bot] Feb 6, 2026
d73e7a8
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/asamuzak…
github-actions[bot] Feb 6, 2026
4671ccf
docs: update release timestamp and changelog
github-actions[bot] Feb 6, 2026
24ed182
docs: update release timestamp and changelog
github-actions[bot] Feb 6, 2026
8bbdf3b
Claude/main portfolio footer g1 gdx (#65)
EthanThePhoenix38 Feb 6, 2026
aeb90b2
Updated AI-Pulse: Fri Feb 06 11:08:40 UTC 2026
Feb 6, 2026
d246395
fix: add missing space in fetch-depth YAML syntax
EthanThePhoenix38 Feb 6, 2026
9ee5c2f
Updated AI-Pulse: Fri Feb 06 11:26:47 UTC 2026
Feb 6, 2026
ca3eba2
Fix indentation for fetch-depth in sync workflow
EthanThePhoenix38 Feb 6, 2026
5574f56
Change AI-Pulse aggregation schedule to every 2 hours
EthanThePhoenix38 Feb 6, 2026
8163d41
Updated AI-Pulse: Fri Feb 06 11:48:50 UTC 2026
Feb 6, 2026
37edf56
Updated AI-Pulse: Fri Feb 06 12:48:06 UTC 2026
Feb 6, 2026
17eed98
Updated AI-Pulse: Fri Feb 06 14:42:59 UTC 2026
Feb 6, 2026
40eb55c
Update release notification workflow for clarity
EthanThePhoenix38 Feb 6, 2026
441300b
Updated AI-Pulse: Fri Feb 06 16:27:33 UTC 2026
Feb 6, 2026
7136dba
Updated AI-Pulse: Fri Feb 06 16:42:02 UTC 2026
Feb 6, 2026
bf8de85
Updated AI-Pulse: Fri Feb 06 18:45:16 UTC 2026
Feb 6, 2026
9ad8341
Updated AI-Pulse: Fri Feb 06 20:32:12 UTC 2026
Feb 6, 2026
c5d49d6
Updated AI-Pulse: Fri Feb 06 22:23:12 UTC 2026
Feb 6, 2026
c112246
Updated AI-Pulse: Sat Feb 07 01:27:08 UTC 2026
Feb 7, 2026
9412d45
Updated AI-Pulse: Sat Feb 07 04:08:43 UTC 2026
Feb 7, 2026
1593e34
Updated AI-Pulse: Sat Feb 07 06:39:33 UTC 2026
Feb 7, 2026
508cb86
Updated AI-Pulse: Sat Feb 07 08:29:13 UTC 2026
Feb 7, 2026
861930d
Updated AI-Pulse: Sat Feb 07 10:24:33 UTC 2026
Feb 7, 2026
21dabc1
Updated AI-Pulse: Sat Feb 07 12:38:07 UTC 2026
Feb 7, 2026
41dd2c2
Updated AI-Pulse: Sat Feb 07 14:25:49 UTC 2026
Feb 7, 2026
d428a21
Updated AI-Pulse: Sat Feb 07 16:26:45 UTC 2026
Feb 7, 2026
e376caa
Updated AI-Pulse: Sat Feb 07 18:31:43 UTC 2026
Feb 7, 2026
7a8b414
feat: add quick navigation bar and improved section styling
claude Feb 7, 2026
f065484
refactor: remove unused quick-nav CSS, keep improved section styling
claude Feb 7, 2026
f256beb
feat: replace sidebar with top dropdown navigation
claude Feb 7, 2026
d438f50
feat: improve deduplication and read articles management
claude Feb 7, 2026
55b9641
fix: footer links overflow on small screens
claude Feb 7, 2026
5b41d39
fix: ThePhoenixAgency link now points to actual website
claude Feb 7, 2026
2c2164c
fix: 404 redirects to previous page or reader
claude Feb 7, 2026
c2b8f91
Updated AI-Pulse: Sat Feb 07 20:25:01 UTC 2026
Feb 7, 2026
1dbb16b
Updated AI-Pulse: Sat Feb 07 22:24:12 UTC 2026
Feb 7, 2026
dd2f970
Updated AI-Pulse: Sun Feb 08 02:03:32 UTC 2026
Feb 8, 2026
21e02d1
Updated AI-Pulse: Sun Feb 08 04:38:14 UTC 2026
Feb 8, 2026
919298c
Updated AI-Pulse: Sun Feb 08 06:47:32 UTC 2026
Feb 8, 2026
7054f8b
Updated AI-Pulse: Sun Feb 08 08:30:28 UTC 2026
Feb 8, 2026
63f5f15
Updated AI-Pulse: Sun Feb 08 10:25:13 UTC 2026
Feb 8, 2026
87c68e6
Updated AI-Pulse: Sun Feb 08 12:39:35 UTC 2026
Feb 8, 2026
caaa4f0
Updated AI-Pulse: Sun Feb 08 14:27:35 UTC 2026
Feb 8, 2026
0082b5f
Updated AI-Pulse: Sun Feb 08 16:27:58 UTC 2026
Feb 8, 2026
dc25077
Updated AI-Pulse: Sun Feb 08 18:33:11 UTC 2026
Feb 8, 2026
141e654
Updated AI-Pulse: Sun Feb 08 20:24:37 UTC 2026
Feb 8, 2026
7b0467d
Updated AI-Pulse: Sun Feb 08 22:26:05 UTC 2026
Feb 8, 2026
965ac3a
Updated AI-Pulse: Mon Feb 09 01:33:56 UTC 2026
Feb 9, 2026
0ffe1ee
Updated AI-Pulse: Mon Feb 09 04:26:50 UTC 2026
Feb 9, 2026
8f4248e
chore: (deps): bump @exodus/bytes from 1.11.0 to 1.12.0
dependabot[bot] Feb 9, 2026
4e4df3b
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/exodus/b…
github-actions[bot] Feb 9, 2026
8bbee25
chore: (deps): bump tldts-core from 7.0.22 to 7.0.23
dependabot[bot] Feb 9, 2026
3652e74
docs: update release timestamp and changelog
github-actions[bot] Feb 9, 2026
72d8dce
chore: (deps): bump axios from 1.13.4 to 1.13.5
dependabot[bot] Feb 9, 2026
e24e84e
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/tldts-co…
github-actions[bot] Feb 9, 2026
629adfb
docs: update release timestamp and changelog
github-actions[bot] Feb 9, 2026
b7bfee3
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/axios-1.…
github-actions[bot] Feb 9, 2026
1e3fa63
docs: update release timestamp and changelog
github-actions[bot] Feb 9, 2026
ddf2d7a
docs: update release timestamp and changelog
github-actions[bot] Feb 9, 2026
1e4f3d3
chore: (deps): bump undici from 7.20.0 to 7.21.0
dependabot[bot] Feb 9, 2026
d4e36cd
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/undici-7…
github-actions[bot] Feb 9, 2026
9869564
docs: update release timestamp and changelog
github-actions[bot] Feb 9, 2026
f46a429
Updated AI-Pulse: Mon Feb 09 07:03:51 UTC 2026
Feb 9, 2026
c927307
Initial plan
Copilot Feb 9, 2026
6d1d982
Securite (#72)
EthanThePhoenix38 Feb 9, 2026
735c661
No code changes required - workflow failure is GitHub infrastructure …
EthanThePhoenix38 Feb 9, 2026
744a043
Claude/main portfolio footer g1 gdx (#74)
EthanThePhoenix38 Feb 9, 2026
1cc09e7
Updated AI-Pulse: Mon Feb 09 12:59:22 UTC 2026
Feb 9, 2026
d7de774
Updated AI-Pulse: Mon Feb 09 14:52:26 UTC 2026
Feb 9, 2026
ad89e01
fix: replace iframe with link in portfolio
claude Feb 9, 2026
2a10380
chore: change workflow schedule from 3h to 2h
claude Feb 9, 2026
819b6c5
Updated AI-Pulse: Mon Feb 09 20:39:26 UTC 2026
Feb 9, 2026
717c36a
Updated AI-Pulse: Tue Feb 10 01:56:56 UTC 2026
Feb 10, 2026
1dbb716
Updated AI-Pulse: Tue Feb 10 04:33:12 UTC 2026
Feb 10, 2026
2ed9139
chore: (deps): bump openai from 6.17.0 to 6.19.0
dependabot[bot] Feb 10, 2026
51dc428
Merge 2ed91398cc0be6c3f021a1ba6da733137447ae58 into 1dbb716021492d4b6…
dependabot[bot] Feb 10, 2026
ec705b1
docs: update release timestamp and changelog
github-actions[bot] Feb 10, 2026
0d8e368
chore: (deps): bump @csstools/css-syntax-patches-for-csstree
dependabot[bot] Feb 10, 2026
a569a31
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/csstools…
github-actions[bot] Feb 10, 2026
661ca89
docs: update release timestamp and changelog
github-actions[bot] Feb 10, 2026
b461b4e
Updated AI-Pulse: Tue Feb 10 07:03:25 UTC 2026
Feb 10, 2026
2a83f6c
Updated AI-Pulse: Tue Feb 10 08:48:23 UTC 2026
Feb 10, 2026
2333504
Remove automation details from README for security
claude Feb 10, 2026
ecc9937
Security: remove source submission link, fix footer responsive
claude Feb 10, 2026
49f7f5e
Fix portfolio to use ThePhoenixAgency instead of EthanThePhoenix38
claude Feb 10, 2026
dab78fd
Revert "Fix portfolio to use ThePhoenixAgency instead of EthanThePhoe…
claude Feb 10, 2026
a9f9464
Updated AI-Pulse: Tue Feb 10 10:54:03 UTC 2026
Feb 10, 2026
7d033e2
Updated AI-Pulse: Tue Feb 10 13:03:28 UTC 2026
Feb 10, 2026
721f9fa
Updated AI-Pulse: Tue Feb 10 15:01:13 UTC 2026
Feb 10, 2026
3888ef1
Updated AI-Pulse: Tue Feb 10 17:14:40 UTC 2026
Feb 10, 2026
1fff7d8
Updated AI-Pulse: Tue Feb 10 19:03:55 UTC 2026
Feb 10, 2026
74c03f3
Updated AI-Pulse: Tue Feb 10 20:43:14 UTC 2026
Feb 10, 2026
23ca96d
Updated AI-Pulse: Tue Feb 10 22:39:16 UTC 2026
Feb 10, 2026
655c2c6
docs: Ajoute documentation complète en français
claude Feb 11, 2026
95bda56
docs: Documente CSS et workflow GitHub en français
claude Feb 11, 2026
2ad31a0
docs: Documente les scripts JavaScript frontend
claude Feb 11, 2026
6d82098
Updated AI-Pulse: Wed Feb 11 01:53:48 UTC 2026
Feb 11, 2026
90b6ea1
Updated AI-Pulse: Wed Feb 11 04:31:05 UTC 2026
Feb 11, 2026
127c532
chore: (deps): bump @csstools/css-calc from 3.0.0 to 3.0.1
dependabot[bot] Feb 11, 2026
2836144
docs: update release timestamp and changelog
github-actions[bot] Feb 11, 2026
caeb7f9
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/csstools…
github-actions[bot] Feb 11, 2026
1ae1aa3
docs: update release timestamp and changelog
github-actions[bot] Feb 11, 2026
dc8fd40
chore: (deps): bump lru-cache from 11.2.5 to 11.2.6
dependabot[bot] Feb 11, 2026
be0d1a3
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/lru-cach…
github-actions[bot] Feb 11, 2026
beac8ef
docs: update release timestamp and changelog
github-actions[bot] Feb 11, 2026
403473e
Updated AI-Pulse: Wed Feb 11 07:00:15 UTC 2026
Feb 11, 2026
d768d4e
Updated AI-Pulse: Wed Feb 11 08:46:01 UTC 2026
Feb 11, 2026
49faf9a
Updated AI-Pulse: Wed Feb 11 10:48:28 UTC 2026
Feb 11, 2026
4189c31
Updated AI-Pulse: Wed Feb 11 12:59:37 UTC 2026
Feb 11, 2026
79e7437
Updated AI-Pulse: Wed Feb 11 14:54:43 UTC 2026
Feb 11, 2026
9945a5c
Updated AI-Pulse: Wed Feb 11 17:04:03 UTC 2026
Feb 11, 2026
a0e0afa
Updated AI-Pulse: Wed Feb 11 19:00:28 UTC 2026
Feb 11, 2026
4468563
Updated AI-Pulse: Wed Feb 11 22:27:59 UTC 2026
Feb 11, 2026
93aaf9e
Updated AI-Pulse: Thu Feb 12 01:34:06 UTC 2026
Feb 12, 2026
16d4a29
Updated AI-Pulse: Thu Feb 12 04:23:55 UTC 2026
Feb 12, 2026
0031bd2
chore: (deps): bump @exodus/bytes from 1.12.0 to 1.14.0
dependabot[bot] Feb 12, 2026
904b6d3
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/exodus/b…
github-actions[bot] Feb 12, 2026
d6be80f
docs: update release timestamp and changelog
github-actions[bot] Feb 12, 2026
c2b3db0
chore: (deps): bump qs from 6.14.1 to 6.14.2
dependabot[bot] Feb 12, 2026
f2964a1
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/qs-6.14.…
github-actions[bot] Feb 12, 2026
41dbd9e
docs: update release timestamp and changelog
github-actions[bot] Feb 12, 2026
068ae2d
Updated AI-Pulse: Thu Feb 12 07:00:15 UTC 2026
Feb 12, 2026
b663437
Updated AI-Pulse: Thu Feb 12 08:44:07 UTC 2026
Feb 12, 2026
55ae494
Updated AI-Pulse: Thu Feb 12 10:44:12 UTC 2026
Feb 12, 2026
ed8018d
Updated AI-Pulse: Thu Feb 12 12:54:46 UTC 2026
Feb 12, 2026
b1a3428
Updated AI-Pulse: Thu Feb 12 14:48:54 UTC 2026
Feb 12, 2026
3ba19d3
Updated AI-Pulse: Thu Feb 12 16:56:34 UTC 2026
Feb 12, 2026
46cbc05
Updated AI-Pulse: Thu Feb 12 18:59:27 UTC 2026
Feb 12, 2026
cb7862d
Updated AI-Pulse: Thu Feb 12 20:33:50 UTC 2026
Feb 12, 2026
1daf495
Updated AI-Pulse: Thu Feb 12 22:30:52 UTC 2026
Feb 12, 2026
497be4c
Updated AI-Pulse: Fri Feb 13 01:36:22 UTC 2026
Feb 13, 2026
5d8be98
Updated AI-Pulse: Fri Feb 13 04:20:20 UTC 2026
Feb 13, 2026
9c4c51e
Merge main into feature branch - resolve conflicts
claude Feb 13, 2026
9fe95ff
docs: Documente pages secondaires HTML en français
claude Feb 13, 2026
618507d
docs: Documente portfolio.html avec API GitHub
claude Feb 13, 2026
aeb735b
docs: update release timestamp and changelog
github-actions[bot] Feb 13, 2026
1181c83
docs: update release timestamp and changelog
github-actions[bot] Feb 13, 2026
690d4e8
Updated AI-Pulse: Fri Feb 13 06:57:49 UTC 2026
Feb 13, 2026
340a643
Updated AI-Pulse: Fri Feb 13 08:40:56 UTC 2026
Feb 13, 2026
5d908ce
Updated AI-Pulse: Fri Feb 13 10:39:30 UTC 2026
Feb 13, 2026
668da9f
Updated AI-Pulse: Fri Feb 13 12:47:37 UTC 2026
Feb 13, 2026
41eef8f
Updated AI-Pulse: Fri Feb 13 14:43:21 UTC 2026
Feb 13, 2026
e28d598
Updated AI-Pulse: Fri Feb 13 16:43:08 UTC 2026
Feb 13, 2026
bd91b3c
Updated AI-Pulse: Fri Feb 13 18:43:12 UTC 2026
Feb 13, 2026
aa29bd0
Updated AI-Pulse: Fri Feb 13 20:35:50 UTC 2026
Feb 13, 2026
8f4b5cc
Updated AI-Pulse: Fri Feb 13 22:32:30 UTC 2026
Feb 13, 2026
26d7da6
Updated AI-Pulse: Sat Feb 14 01:28:14 UTC 2026
Feb 14, 2026
488262b
Updated AI-Pulse: Sat Feb 14 04:10:33 UTC 2026
Feb 14, 2026
6e6de87
Updated AI-Pulse: Sat Feb 14 06:42:20 UTC 2026
Feb 14, 2026
6e0ff31
Updated AI-Pulse: Sat Feb 14 08:29:29 UTC 2026
Feb 14, 2026
32e47b2
Updated AI-Pulse: Sat Feb 14 10:25:18 UTC 2026
Feb 14, 2026
dfb03b6
Claude/configurable news reader g1 gdx (#57)
EthanThePhoenix38 Feb 14, 2026
524c98a
chore: (deps): bump qs in the npm_and_yarn group across 1 directory
dependabot[bot] Feb 14, 2026
66ea648
Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_…
github-actions[bot] Feb 14, 2026
1ceefa4
docs: update release timestamp and changelog
github-actions[bot] Feb 14, 2026
e93a894
fix: Restaure reader.html et portfolio.html originaux
claude Feb 14, 2026
4907aca
Updated AI-Pulse: Sat Feb 14 11:36:52 UTC 2026
Feb 14, 2026
3d8fda4
fix: Corrige structure HTML reader.html et portfolio.html
claude Feb 14, 2026
e18bcda
Claude/configurable news reader g1 gdx (#85)
EthanThePhoenix38 Feb 14, 2026
4cb72bb
Updated AI-Pulse: Sat Feb 14 12:12:50 UTC 2026
Feb 14, 2026
a4af579
Updated AI-Pulse: Sat Feb 14 12:38:31 UTC 2026
Feb 14, 2026
f779fd6
Create SECURITY.md for security policy
EthanThePhoenix38 Feb 14, 2026
b97596b
Potential fix for code scanning alert no. 22: Client-side cross-site …
EthanThePhoenix38 Feb 14, 2026
c6f669a
Potential fix for code scanning alert no. 22: Client-side cross-site …
EthanThePhoenix38 Feb 14, 2026
597b27d
Securite (#87)
EthanThePhoenix38 Feb 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: AI-Pulse Reader
url: https://thephoenixagency.github.io/AI-Pulse/app.html
about: Accedez au reader en ligne
65 changes: 65 additions & 0 deletions .github/ISSUE_TEMPLATE/new-source.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Proposer une nouvelle source / Suggest a new source
description: Proposez une source RSS a ajouter a AI-Pulse
title: "[SOURCE] "
labels: ["new-source"]
body:
- type: input
id: source_name
attributes:
label: Nom de la source / Source Name
placeholder: "Ex: Korben, TechCrunch..."
validations:
required: true
- type: input
id: source_url
attributes:
label: URL du site / Website URL
placeholder: "https://example.com"
validations:
required: true
- type: input
id: rss_url
attributes:
label: URL du flux RSS / RSS Feed URL
placeholder: "https://example.com/feed/"
validations:
required: true
- type: dropdown
id: category
attributes:
label: Categorie / Category
options:
- AI / IA
- Cybersecurity / Cybersecurite
- IoT
- Windows
- Mac / Apple
- Linux
- Tech Generale
- Entrepreneuriat / Entrepreneurship
- Bourse & Finance
- Crypto & Blockchain
- Open Source & GitHub
- Produits & Innovation
validations:
required: true
- type: dropdown
id: language
attributes:
label: Langue / Language
options:
- Francais / French
- Anglais / English
- Autre / Other
validations:
required: true
- type: input
id: tags
attributes:
label: Tags / Mots-cles
placeholder: "Ex: tech, security, AI..."
- type: textarea
id: reason
attributes:
label: Pourquoi cette source? / Why this source?
placeholder: "Contenu original, source fiable..."
48 changes: 48 additions & 0 deletions .github/ISSUE_TEMPLATE/subscribe.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: S'abonner a AI-Pulse / Subscribe to AI-Pulse
description: Recevez votre digest personnalise par email
title: "[SUBSCRIBE] "
labels: ["subscription"]
body:
- type: input
id: email
attributes:
label: Votre email / Your email
placeholder: "you@example.com"
validations:
required: true
- type: checkboxes
id: categories
attributes:
label: Categories souhaitees / Desired categories
options:
- label: AI / IA
- label: Cybersecurity
- label: IoT
- label: Windows
- label: Mac / Apple
- label: Linux
- label: Tech Generale
- label: Entrepreneuriat
- label: Bourse & Finance
- label: Crypto & Blockchain
- label: Open Source & GitHub
- label: Produits & Innovation
- type: dropdown
id: language
attributes:
label: Langue preferee / Preferred language
options:
- Francais
- English
- Les deux / Both
validations:
required: true
- type: dropdown
id: frequency
attributes:
label: Frequence / Frequency
options:
- Chaque mise a jour (toutes les 3h) / Every update
- Quotidien / Daily digest
validations:
required: true
122 changes: 122 additions & 0 deletions .github/workflows/add-source.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
name: Auto-add approved source

on:
issues:
types: [labeled]

permissions:
contents: write
issues: write

jobs:
add-source:
if: github.event.label.name == 'source-approved'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Parse issue and add source
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const issue = context.payload.issue;
const body = issue.body;

// Parse form fields from issue body
function getField(label) {
const regex = new RegExp(`### ${label}\\s*\\n\\s*(.+)`, 'i');
const match = body.match(regex);
return match ? match[1].trim() : '';
}

const sourceName = getField('Nom de la source / Source Name');
const sourceUrl = getField('URL du site / Website URL');
const rssUrl = getField('URL du flux RSS / RSS Feed URL');
const categoryRaw = getField('Categorie / Category');
const languageRaw = getField('Langue / Language');
const tags = getField('Tags / Mots-cles');

if (!sourceName || !rssUrl) {
console.log('Missing required fields');
return;
}

// Map category
const catMap = {
'AI / IA': 'ai',
'Cybersecurity / Cybersecurite': 'cybersecurity',
'IoT': 'iot',
'Windows': 'windows',
'Mac / Apple': 'mac',
'Linux': 'linux',
'Tech Generale': 'tech',
'Entrepreneuriat / Entrepreneurship': 'entrepreneurship',
'Bourse & Finance': 'finance',
'Crypto & Blockchain': 'crypto',
'Open Source & GitHub': 'opensource',
'Produits & Innovation': 'products'
};
const category = catMap[categoryRaw] || 'tech';

// Map language
const lang = languageRaw.includes('Francais') ? 'fr' : 'en';

// Parse tags
const tagList = tags ? tags.split(',').map(t => t.trim()).filter(t => t) : [category];

// Read and update config.json
const config = JSON.parse(fs.readFileSync('config.json', 'utf-8'));
if (!config.categories[category]) {
console.log(`Category ${category} not found`);
return;
}

// Check for duplicates
const exists = config.categories[category].feeds.some(f => f.url === rssUrl);
if (exists) {
console.log('Source already exists');
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: `This source (${rssUrl}) already exists in the ${category} category.`
});
return;
}

// Add new feed
config.categories[category].feeds.push({
name: sourceName,
url: rssUrl,
tags: tagList,
lang: lang
});

fs.writeFileSync('config.json', JSON.stringify(config, null, 2));

// Comment on issue
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: `Source "${sourceName}" added to category "${category}" in config.json. It will be active at the next aggregation cycle.`
});

// Close issue
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed'
});

- name: Commit changes
run: |
git config --global user.name 'PhoenixProject-AutoSync'
git config --global user.email '${{ secrets.GIT_AUTHOR_EMAIL }}'
git add config.json
if ! git diff --cached --exit-code; then
git commit -m "Add new source from issue #${{ github.event.issue.number }}"
git push
fi
122 changes: 122 additions & 0 deletions .github/workflows/manage-subscriber.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
name: Manage subscriber

on:
issues:
types: [labeled]

permissions:
contents: write
issues: write

jobs:
add-subscriber:
if: github.event.label.name == 'subscription'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Parse and add subscriber
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const issue = context.payload.issue;
const body = issue.body;

function getField(label) {
const regex = new RegExp(`### ${label}\\s*\\n\\s*(.+)`, 'i');
const match = body.match(regex);
return match ? match[1].trim() : '';
}

function getCheckboxes(label) {
const regex = new RegExp(`### ${label}\\s*\\n([\\s\\S]*?)(?=###|$)`, 'i');
const match = body.match(regex);
if (!match) return [];
return [...match[1].matchAll(/- \[X\] (.+)/gi)].map(m => m[1].trim());
}

const email = getField('Votre email / Your email');
if (!email || !email.includes('@')) {
console.log('Invalid email');
return;
}

const selectedCats = getCheckboxes('Categories souhaitees / Desired categories');
const langRaw = getField('Langue preferee / Preferred language');
const freqRaw = getField('Frequence / Frequency');

const catMap = {
'AI / IA': 'ai',
'Cybersecurity': 'cybersecurity',
'IoT': 'iot',
'Windows': 'windows',
'Mac / Apple': 'mac',
'Linux': 'linux',
'Tech Generale': 'tech',
'Entrepreneuriat': 'entrepreneurship',
'Bourse & Finance': 'finance',
'Crypto & Blockchain': 'crypto',
'Open Source & GitHub': 'opensource',
'Produits & Innovation': 'products'
};

const categories = selectedCats.map(c => catMap[c]).filter(Boolean);
const lang = langRaw.includes('Francais') ? 'fr' : langRaw.includes('English') ? 'en' : 'all';
const frequency = freqRaw.includes('Quotidien') ? 'daily' : 'each_update';

// Read subscribers
const subsPath = 'data/subscribers.json';
let subscribers = [];
try {
subscribers = JSON.parse(fs.readFileSync(subsPath, 'utf-8'));
} catch (e) {
subscribers = [];
}

// Check duplicate
const exists = subscribers.some(s => s.email === email);
if (exists) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: `This email is already subscribed. To update preferences, please unsubscribe first and resubscribe.`
});
return;
}

// Add subscriber
subscribers.push({
email,
categories: categories.length > 0 ? categories : Object.values(catMap),
lang,
frequency,
subscribed_at: new Date().toISOString().split('T')[0]
});

fs.writeFileSync(subsPath, JSON.stringify(subscribers, null, 2));

await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: `Welcome! You've been subscribed to AI-Pulse digest.\n\nCategories: ${categories.join(', ') || 'All'}\nLanguage: ${lang}\nFrequency: ${frequency}\n\nYou will receive your personalized digest at your next update cycle.`
});

await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed'
});

- name: Commit changes
run: |
git config --global user.name 'PhoenixProject-AutoSync'
git config --global user.email '${{ secrets.GIT_AUTHOR_EMAIL }}'
git add data/subscribers.json
if ! git diff --cached --exit-code; then
git commit -m "Add subscriber from issue #${{ github.event.issue.number }}"
git push
fi
Loading
Loading