{"id":28976155,"url":"https://github.com/fadhelmurphy/dagsflow-go","last_synced_at":"2025-06-24T13:17:48.556Z","repository":{"id":300796007,"uuid":"1006906339","full_name":"fadhelmurphy/dagsflow-go","owner":"fadhelmurphy","description":"a workflow orchestrator inspired by Airflow #SoftwareXDataEngineering","archived":false,"fork":false,"pushed_at":"2025-06-23T16:22:35.000Z","size":17,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-23T17:29:47.876Z","etag":null,"topics":["framework","golang","golang-cli","golang-library","job-scheduler","workfloworchestrator","workfloworchestratorframework"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fadhelmurphy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-23T07:10:44.000Z","updated_at":"2025-06-23T16:22:38.000Z","dependencies_parsed_at":"2025-06-23T17:31:05.561Z","dependency_job_id":"4fb6d1ac-08e8-4506-b5de-cecd3d7d6d53","html_url":"https://github.com/fadhelmurphy/dagsflow-go","commit_stats":null,"previous_names":["fadhelmurphy/dagsflow-go"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fadhelmurphy/dagsflow-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fadhelmurphy%2Fdagsflow-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fadhelmurphy%2Fdagsflow-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fadhelmurphy%2Fdagsflow-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fadhelmurphy%2Fdagsflow-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fadhelmurphy","download_url":"https://codeload.github.com/fadhelmurphy/dagsflow-go/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fadhelmurphy%2Fdagsflow-go/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261683195,"owners_count":23193694,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["framework","golang","golang-cli","golang-library","job-scheduler","workfloworchestrator","workfloworchestratorframework"],"created_at":"2025-06-24T13:17:47.794Z","updated_at":"2025-06-24T13:17:48.519Z","avatar_url":"https://github.com/fadhelmurphy.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dagsflow-go\n\n**dagsflow-go** adalah tools CLI sederhana untuk membuat dan menjalankan DAG scheduler mirip seperti Airflow menggunakan Go.\n\n---\n\n## Fitur\n- Schedule berbasis cron (`robfig/cron`)\n- Support DAG dengan dependency dan branching\n- Detach process (background)\n- List status DAG (Is Running / Schedule)\n- Rerun DAG / job (dengan upstream / downstream)\n- Trigger DAG lain (blocking / non-blocking)\n- Configurable DAG (mirip Airflow)\n- Cross-platform tanpa HTTP server / REST API\n\n---\n\n## Instalasi\n\n```bash\ngit clone \u003crepo-url\u003e\ncd dagsflow-go\ngo build -o dagsflow-go\n```\n\n## Cara Pakai\n\n### Jalankan 1 DAG\n\n```bash\n./dagsflow-go run \u003cdagName\u003e\n```\n\n### Jalankan semua DAG\n\n```bash\n./dagsflow-go run-all\n```\n\n### Stop 1 DAG\n\n```bash\n./dagsflow-go stop \u003cdagName\u003e\n```\n\n### Stop semua DAG\n\n```bash\n./dagsflow-go stop-all\n```\n\n### Lihat status DAG\n\n```bash\n./dagsflow-go list\n```\n\n```bash\nDAG Name        | Is Running | Schedule\n----------------|------------|---------------------\ndag1            | true       | */1 * * * *\ndag2            | false      | */2 * * * *\n```\n\n### Lihat Graph DAG\n\n```bash\n./dagsflow-go graph \u003cdagName\u003e\n```\n\n## Struktur PID / Marker\n\n- PID file: dagsflow-pid/{dagName}.pid\n\n- Running marker: dagsflow-pid/{dagName}.running\n\n## Contoh DAG\n\n```golang\npackage dags\n\nimport (\n\t\"fmt\"\n\t\"dagsflow-go/dag\"\n)\n\nfunc init() {\n\td := dag.NewDAG(\"dag1\", \"*/1 * * * *\")\n\ta := d.NewJob(\"a\", func(ctx *dag.Context) {\n\t\tfmt.Println(\"[DAG1] Run A\")\n\t})\n\tb := d.NewJob(\"b\", func(ctx *dag.Context) {\n\t\tfmt.Println(\"[DAG1] Run B\")\n\t})\n\ta.Then(b)\n\tdag.Register(d)\n}\n```\n\n## Rerun DAG\n```bash\n./dagsflow-go rerun-dag \u003cdagName\u003e\n```\n## Rerun Job\n```bash\n./dagsflow-go rerun-job \u003cdagName\u003e \u003cjobID\u003e\n```\n### Rerun Job dengan upstream / downstream\n\n```bash\n./dagsflow-go rerun-job \u003cdagName\u003e \u003cjobID\u003e --upstream\n./dagsflow-go rerun-job \u003cdagName\u003e \u003cjobID\u003e --downstream\n./dagsflow-go rerun-job \u003cdagName\u003e \u003cjobID\u003e --upstream --downstream\n```\n\n## Config\n\n```golang\nd := dag.NewDAG(\"custom_dag\", \"*/1 * * * *\", map[string]interface{}{\n\t\"threshold\": 50,\n\t\"region\":    \"APAC\",\n})\n```\ndi dalam job confignya dapat diakses :\n\n```golang\nval := ctx.DAG.Config[\"threshold\"].(int)\nfmt.Println(\"Threshold is\", val)\n\n```\n\n## Trigger DAG lain sebagai job\n\n### Non-blocking trigger\n```golang\n\ttriggerJob := d.NewJob(\"trigger_dag_branch\", func(ctx *dag.Context) {\n\tconfig := map[string]interface{}{\n\t\t\"param1\": \"value1\",\n\t\t\"param2\": 42,\n\t}\n\n\t// ctx.DAG.TriggerDAG(\"dag_branch\") // tanpa config\n\tctx.DAG.TriggerDAGWithConfig(\"dag_branch\",config, false) // dengan config \n\t}) // Non Blocking example (tidak perlu nunggu dag nya kelar)\n\n```\n\n### Blocking trigger\n```golang\n\ttriggerBlockingJob := d.NewJob(\"trigger_dag1\", func(ctx *dag.Context) {\n\t\t\tconfig := map[string]any{\n\t\t\"param1\": \"value1\",\n\t\t\"param2\": 42,\n\t}\n\t// ctx.DAG.TriggerDAGBlocking(\"dag1\") // tanpa config\n\tctx.DAG.TriggerDAGWithConfig(\"dag1\", config, true) // dengan config \n\t}) // Blocking example (perlu nunggu dag nya kelar)\n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffadhelmurphy%2Fdagsflow-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffadhelmurphy%2Fdagsflow-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffadhelmurphy%2Fdagsflow-go/lists"}