Skip to content

Commit 411144b

Browse files
committed
feat(devops): implementar manifiesto declarativo .github/projects.yml como Single Source of Truth
1 parent a55e5dd commit 411144b

7 files changed

Lines changed: 110 additions & 19 deletions

File tree

‎.github/projects.yml‎

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# 📦 Single Source of Truth for Portfolio Projects
2+
# Used by generate-assets.sh, CI/CD, and Web Showcase Portal
3+
4+
projects:
5+
- id: mcp-servers
6+
name: mcp-servers
7+
title: Unified MCP Servers Monorepo — Knowledge-Graph Enhanced
8+
description: Arquitectura unificada de servidores MCP desplegados sin Docker, potenciados por knowledge graphs generados con graphify.
9+
status: Production
10+
stack:
11+
- Python
12+
- MCP
13+
- FastAPI
14+
- graphify
15+
repo_url: https://github.com/Medalcode/mcp-servers
16+
demo_url: null
17+
assets:
18+
screenshot: .github/assets/screenshots/mcp-servers-dashboard.png
19+
diagram: .github/assets/diagrams/mcp-servers-architecture.mmd
20+
21+
- id: finlogic
22+
name: FinLogic
23+
title: Plataforma de Ingeniería de Datos Financieros
24+
description: Arquitectura modular bajo el principio Lightweight Ingest, Heavy Analysis para análisis cuantitativo.
25+
status: Production
26+
stack:
27+
- Python
28+
- FastAPI
29+
- DuckDB
30+
- Parquet
31+
- Docker
32+
repo_url: https://github.com/Medalcode/FinLogic
33+
demo_url: null
34+
assets:
35+
screenshot: .github/assets/screenshots/finlogic-dashboard.png
36+
diagram: .github/assets/diagrams/finlogic-architecture.mmd
37+
38+
- id: nidus
39+
name: Nidus
40+
title: Sistema Inteligente de Seguimiento de Candidatos (ATS)
41+
description: ATS moderno potenciado por Inteligencia Artificial que analiza PDFs y genera resúmenes semánticos.
42+
status: Production
43+
stack:
44+
- Python
45+
- FastAPI
46+
- React
47+
- PostgreSQL
48+
- OpenAI
49+
repo_url: https://github.com/Medalcode/Nidus
50+
demo_url: null
51+
assets:
52+
screenshot: .github/assets/screenshots/nidus-dashboard.png
53+
diagram: .github/assets/diagrams/nidus-architecture.mmd
54+
55+
- id: gitspy
56+
name: GitSpy
57+
title: Middleware API & Cache Layer para GitHub Analytics
58+
description: Middleware intermedio para optimizar y cachear consultas de rate-limiting hacia la API de GitHub.
59+
status: Production
60+
stack:
61+
- TypeScript
62+
- Node.js
63+
- Redis
64+
- Express
65+
repo_url: https://github.com/Medalcode/GitSpy
66+
demo_url: https://git-spy-tau.vercel.app
67+
assets:
68+
screenshot: .github/assets/screenshots/gitspy-dashboard.png
69+
diagram: .github/assets/diagrams/gitspy-architecture.mmd
70+
71+
- id: netopstoolkit
72+
name: NetOpsToolkit
73+
title: Suite de Automatización de Operaciones de Red
74+
description: Herramientas de diagnóstico, monitoreo y gestión de infraestructura de telecomunicaciones.
75+
status: Maintained
76+
stack:
77+
- Python
78+
- Linux
79+
- Bash
80+
- REST APIs
81+
repo_url: https://github.com/Medalcode/NetOpsToolkit
82+
demo_url: https://netops-toolkit.netlify.app
83+
assets:
84+
screenshot: .github/assets/screenshots/netopstoolkit-dashboard.png
85+
diagram: .github/assets/diagrams/netopstoolkit-architecture.mmd

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
### Software Engineer · Data Engineer · AI-Enhanced Development
1111

1212
[![CI](https://github.com/Medalcode/medalcode/actions/workflows/ci.yml/badge.svg)](https://github.com/Medalcode/medalcode/actions/workflows/ci.yml)
13+
[![QA Tests](https://img.shields.io/badge/QA%20Tests-17%2F17%20Passing-success?style=flat-square&logo=githubactions&logoColor=white)](https://github.com/Medalcode/medalcode/actions/workflows/ci.yml)
1314
[![Portfolio](https://img.shields.io/badge/Portfolio-medalcode.dev-60a5fa?style=flat-square&logo=google-chrome&logoColor=white)](https://medalcode.vercel.app)
1415
[![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-a78bfa?style=flat-square&logo=linkedin&logoColor=white)](https://linkedin.com/in/medalcode)
1516
[![Stack Overflow](https://img.shields.io/badge/StackOverflow-Profile-f472b6?style=flat-square&logo=stackoverflow&logoColor=white)](https://stackoverflow.com/users/488543)

‎generate-assets.sh‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,16 +229,20 @@ check_missing_assets() {
229229
echo -e "${BLUE}🔍 Verificando assets en proyectos...${NC}"
230230
echo ""
231231

232-
if [ ! -f README.md ]; then
233-
echo -e "${RED}Error: README.md no encontrado${NC}"
232+
local projects_list=""
233+
if [ -f .github/projects.yml ]; then
234+
echo -e "${GREEN}📄 Leyendo manifiesto declarativo .github/projects.yml${NC}"
235+
projects_list=$(grep -E '^[[:space:]]*name:' .github/projects.yml 2>/dev/null | sed 's/.*name:[[:space:]]*//' || true)
236+
elif [ -f README.md ]; then
237+
echo -e "${YELLOW}📄 Leyendo encabezados desde README.md${NC}"
238+
projects_list=$(grep '^### ' README.md 2>/dev/null | sed -E -n 's/### [^[]*\[([^]]+)\].*/\1/p' || true)
239+
else
240+
echo -e "${RED}Error: Ni .github/projects.yml ni README.md fueron encontrados${NC}"
234241
return 1
235242
fi
236243

237-
local projects_list
238-
projects_list=$(grep '^### ' README.md 2>/dev/null | sed -E -n 's/### [^[]*\[([^]]+)\].*/\1/p' || true)
239-
240244
if [ -z "$projects_list" ]; then
241-
echo -e "${YELLOW}No se detectaron proyectos formateados en README.md${NC}"
245+
echo -e "${YELLOW}No se detectaron proyectos configurados${NC}"
242246
return 0
243247
fi
244248

‎graphify-out/GRAPH_REPORT.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Graph Report - . (2026-08-10)
22

33
## Corpus Check
4-
- Corpus is ~4,557 words - fits in a single context window. You may not need a graph.
4+
- Corpus is ~4,848 words - fits in a single context window. You may not need a graph.
55

66
## Summary
77
- 18 nodes · 25 edges · 4 communities (3 shown, 1 thin omitted)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"nodes": [{"id": "$graphify-root$_generate_assets_sh", "label": "generate-assets.sh", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L1", "metadata": {"language": "bash", "kind": "file"}}, {"id": "$graphify-root$_generate_assets_sh__entry", "label": "generate-assets.sh script", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L1", "metadata": {"language": "bash", "kind": "bash_entrypoint"}}, {"id": "$graphify-root$_generate_assets_to_lowercase", "label": "to_lowercase()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L16", "metadata": {"language": "bash", "kind": "bash_function"}}, {"id": "$graphify-root$_generate_assets_get_project_arg", "label": "get_project_arg()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L21", "metadata": {"language": "bash", "kind": "bash_function"}}, {"id": "$graphify-root$_generate_assets_show_help", "label": "show_help()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L30", "metadata": {"language": "bash", "kind": "bash_function"}}, {"id": "$graphify-root$_generate_assets_init_structure", "label": "init_structure()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L58", "metadata": {"language": "bash", "kind": "bash_function"}}, {"id": "$graphify-root$_generate_assets_screenshot_guide", "label": "screenshot_guide()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L101", "metadata": {"language": "bash", "kind": "bash_function"}}, {"id": "$graphify-root$_generate_assets_optimize_images", "label": "optimize_images()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L129", "metadata": {"language": "bash", "kind": "bash_function"}}, {"id": "$graphify-root$_generate_assets_generate_badges", "label": "generate_badges()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L152", "metadata": {"language": "bash", "kind": "bash_function"}}, {"id": "$graphify-root$_generate_assets_create_diagram_template", "label": "create_diagram_template()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L185", "metadata": {"language": "bash", "kind": "bash_function"}}, {"id": "$graphify-root$_generate_assets_check_missing_assets", "label": "check_missing_assets()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L228", "metadata": {"language": "bash", "kind": "bash_function"}}, {"id": "$graphify-root$_generate_assets_main", "label": "main()", "file_type": "code", "source_file": "generate-assets.sh", "source_location": "L278", "metadata": {"language": "bash", "kind": "bash_function"}}], "edges": [{"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_sh__entry", "relation": "contains", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_to_lowercase", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L16", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_get_project_arg", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L21", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_show_help", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L30", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_init_structure", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L58", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_screenshot_guide", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L101", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_optimize_images", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L129", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_generate_badges", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L152", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_create_diagram_template", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L185", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_check_missing_assets", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L228", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh", "target": "$graphify-root$_generate_assets_main", "relation": "defines", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L278", "weight": 1.0}, {"source": "$graphify-root$_generate_assets_sh__entry", "target": "$graphify-root$_generate_assets_main", "relation": "calls", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L332", "weight": 1.0, "context": "call"}, {"source": "$graphify-root$_generate_assets_main", "target": "$graphify-root$_generate_assets_init_structure", "relation": "calls", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L284", "weight": 1.0, "context": "call"}, {"source": "$graphify-root$_generate_assets_main", "target": "$graphify-root$_generate_assets_screenshot_guide", "relation": "calls", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L293", "weight": 1.0, "context": "call"}, {"source": "$graphify-root$_generate_assets_main", "target": "$graphify-root$_generate_assets_optimize_images", "relation": "calls", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L296", "weight": 1.0, "context": "call"}, {"source": "$graphify-root$_generate_assets_main", "target": "$graphify-root$_generate_assets_generate_badges", "relation": "calls", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L305", "weight": 1.0, "context": "call"}, {"source": "$graphify-root$_generate_assets_main", "target": "$graphify-root$_generate_assets_create_diagram_template", "relation": "calls", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L314", "weight": 1.0, "context": "call"}, {"source": "$graphify-root$_generate_assets_main", "target": "$graphify-root$_generate_assets_check_missing_assets", "relation": "calls", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L317", "weight": 1.0, "context": "call"}, {"source": "$graphify-root$_generate_assets_main", "target": "$graphify-root$_generate_assets_show_help", "relation": "calls", "confidence": "EXTRACTED", "source_file": "generate-assets.sh", "source_location": "L320", "weight": 1.0, "context": "call"}], "raw_calls": [{"language": "bash", "callee": "set", "caller_nid": "$graphify-root$_generate_assets_sh__entry", "source_file": "generate-assets.sh", "source_location": "L6"}, {"language": "bash", "callee": "echo", "caller_nid": "$graphify-root$_generate_assets_to_lowercase", "source_file": "generate-assets.sh", "source_location": "L17"}, {"language": "bash", "callee": "tr", "caller_nid": "$graphify-root$_generate_assets_to_lowercase", "source_file": "generate-assets.sh", "source_location": "L17"}, {"language": "bash", "callee": "echo", "caller_nid": "$graphify-root$_generate_assets_get_project_arg", "source_file": "generate-assets.sh", "source_location": "L23"}, {"language": "bash", "callee": "cat", "caller_nid": "$graphify-root$_generate_assets_show_help", "source_file": "generate-assets.sh", "source_location": "L31"}, {"language": "bash", "callee": "echo", "caller_nid": "$graphify-root$_generate_assets_init_structure", "source_file": "generate-assets.sh", "source_location": "L59"}, {"language": "bash", "callee": "mkdir", "caller_nid": "$graphify-root$_generate_assets_init_structure", "source_file": "generate-assets.sh", "source_location": "L61"}, {"language": "bash", "callee": "cat", "caller_nid": "$graphify-root$_generate_assets_init_structure", "source_file": "generate-assets.sh", "source_location": "L64"}, {"language": "bash", "callee": "echo", "caller_nid": "$graphify-root$_generate_assets_screenshot_guide", "source_file": "generate-assets.sh", "source_location": "L106"}, {"language": "bash", "callee": "echo", "caller_nid": "$graphify-root$_generate_assets_optimize_images", "source_file": "generate-assets.sh", "source_location": "L130"}, {"language": "bash", "callee": "command", "caller_nid": "$graphify-root$_generate_assets_optimize_images", "source_file": "generate-assets.sh", "source_location": "L133"}, {"language": "bash", "callee": "exit", "caller_nid": "$graphify-root$_generate_assets_optimize_images", "source_file": "generate-assets.sh", "source_location": "L140"}, {"language": "bash", "callee": "find", "caller_nid": "$graphify-root$_generate_assets_optimize_images", "source_file": "generate-assets.sh", "source_location": "L143"}, {"language": "bash", "callee": "read", "caller_nid": "$graphify-root$_generate_assets_optimize_images", "source_file": "generate-assets.sh", "source_location": "L143"}, {"language": "bash", "callee": "mv", "caller_nid": "$graphify-root$_generate_assets_optimize_images", "source_file": "generate-assets.sh", "source_location": "L145"}, {"language": "bash", "callee": "echo", "caller_nid": "$graphify-root$_generate_assets_generate_badges", "source_file": "generate-assets.sh", "source_location": "L155"}, {"language": "bash", "callee": "cat", "caller_nid": "$graphify-root$_generate_assets_generate_badges", "source_file": "generate-assets.sh", "source_location": "L160"}, {"language": "bash", "callee": "echo", "caller_nid": "$graphify-root$_generate_assets_create_diagram_template", "source_file": "generate-assets.sh", "source_location": "L190"}, {"language": "bash", "callee": "cat", "caller_nid": "$graphify-root$_generate_assets_create_diagram_template", "source_file": "generate-assets.sh", "source_location": "L192"}, {"language": "bash", "callee": "echo", "caller_nid": "$graphify-root$_generate_assets_check_missing_assets", "source_file": "generate-assets.sh", "source_location": "L229"}, {"language": "bash", "callee": "return", "caller_nid": "$graphify-root$_generate_assets_check_missing_assets", "source_file": "generate-assets.sh", "source_location": "L241"}, {"language": "bash", "callee": "shopt", "caller_nid": "$graphify-root$_generate_assets_check_missing_assets", "source_file": "generate-assets.sh", "source_location": "L249"}, {"language": "bash", "callee": "read", "caller_nid": "$graphify-root$_generate_assets_check_missing_assets", "source_file": "generate-assets.sh", "source_location": "L250"}, {"language": "bash", "callee": "continue", "caller_nid": "$graphify-root$_generate_assets_check_missing_assets", "source_file": "generate-assets.sh", "source_location": "L251"}, {"language": "bash", "callee": "shift", "caller_nid": "$graphify-root$_generate_assets_main", "source_file": "generate-assets.sh", "source_location": "L280"}, {"language": "bash", "callee": "true", "caller_nid": "$graphify-root$_generate_assets_main", "source_file": "generate-assets.sh", "source_location": "L280"}, {"language": "bash", "callee": "echo", "caller_nid": "$graphify-root$_generate_assets_main", "source_file": "generate-assets.sh", "source_location": "L290"}, {"language": "bash", "callee": "exit", "caller_nid": "$graphify-root$_generate_assets_main", "source_file": "generate-assets.sh", "source_location": "L291"}], "bash_sources": []}

0 commit comments

Comments
 (0)