{"id":17432148,"url":"https://github.com/marekjm/issue","last_synced_at":"2025-06-13T14:11:15.388Z","repository":{"id":1910979,"uuid":"43828402","full_name":"marekjm/issue","owner":"marekjm","description":"Simple, distributed, command-line issue tracker","archived":false,"fork":false,"pushed_at":"2025-02-08T00:42:57.000Z","size":559,"stargazers_count":71,"open_issues_count":5,"forks_count":7,"subscribers_count":6,"default_branch":"devel","last_synced_at":"2025-05-20T13:08:52.468Z","etag":null,"topics":["bug-tracker","bug-tracking-system","cli","command-line","command-line-tools","distributed","issue","issue-management","issue-tracker","issue-tracking-system"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marekjm.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2015-10-07T16:12:36.000Z","updated_at":"2024-12-14T04:31:41.000Z","dependencies_parsed_at":"2025-04-09T21:15:49.147Z","dependency_job_id":"18984c32-1e4e-4ae5-8fdf-a08c46347990","html_url":"https://github.com/marekjm/issue","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/marekjm/issue","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marekjm%2Fissue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marekjm%2Fissue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marekjm%2Fissue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marekjm%2Fissue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marekjm","download_url":"https://codeload.github.com/marekjm/issue/tar.gz/refs/heads/devel","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marekjm%2Fissue/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259659667,"owners_count":22891672,"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":["bug-tracker","bug-tracking-system","cli","command-line","command-line-tools","distributed","issue","issue-management","issue-tracker","issue-tracking-system"],"created_at":"2024-10-17T08:24:18.673Z","updated_at":"2025-06-13T14:11:15.330Z","avatar_url":"https://github.com/marekjm.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dead-simple, no-bullshit, command line issue tracker\n\nIssue is a command line issue tracker with dead-simple interface, and *no-bullshit* philosophy.\n\n### Command-line issue tracker?\n\nIssue has only one interface - the cli `issue` tool written in Python 3.\n\n### Dead-simple interface?\n\nThe command line tool is built around simple actions, e.g. opening, closing or commenting issues.\nAll of basic concepts map to a command:\n\n- `issue open \"\u003cmessage\u003e\"` to open an issue,\n- `issue close \u003cunique-id\u003e` to close an issue,\n- `issue comment \u003cunique-id\u003e \"\u003ccomment\u003e\"` to comment on an issue,\n\n### No-bullshit philosophy?\n\nIssue provides machinery for those few things that are really neccessary:\n\n- opening issues,\n- listing issues,\n- closing issues,\n- commenting on issues,\n- sharing issues with other programmers,\n\nNotice the word *programmers*.\nIt is not a tool intended to be used by general audience.\n\nIt is created for those people who spend numerous hours a day\nin front of a black screen filled with code, shell commands and debugger output.\nThey don't need the distraction of switching to a web-based issue tracker\nbut still may need to note problems with the code.\nThis program is created for them - to not break their workflow,\nbut to be easily intergrated into it.\nWritten with the UNIX spirit in mind, it does one thing and (hopefully) does it well.\n\nAll the extra features are written while keeping in mind that the target group are programmers.\nFor example, there is a `issue slug` command that generates branch names based on issue messages.\n\n### Quick to start and almost configuration-free\n\nThese are the only commands you have to run before you can initialise a repository and\nstart creating issues:\n\n```\n# set your credentials...\n$ issue config --global set author.email \"john.doe@example.com\"\n$ issue config --global set author.name \"John Doe\"\n# initialise the repository\n$ issue init\n```\n\nAnd you are ready to run.\nFor more help, you can use:\n\n```\n$ issue help -vc | less -R\n```\n\nThis command will give you an exhaustive overview of the commands and\noptions.\n\n--------------------------------------------------------------------------------\n\n## It's really dead simple\n\nIssue is written with the intent to keep the workflow optimised, and\nreduce distractions to minimum.\n\nConsider these steps:\n\n- `issue open \"Crash on big numbers\"` - open an issue,\n- `git checkout -b $(issue slug --git deadbeef)` - create new branch using\n  branch name generation (or use `issue slug -BC deadbeef`)\n- `gdb ./a.out` - debug the program,\n- `vim ...` - create a patch,\n- `git commit -m 'Fix the crash on big numbers'` - commit the fix,\n- `issue close -g \u003cgit-commit\u003e deadbeef` - close the issue (you can use a Git\n  commit hash, or `HEAD` to specify commit)\n\nTwo additional commands to open and close an issue.\n\n--------------------------------------------------------------------------------\n\n## Features when needed\n\nIssue provides you with more than just `open` and `close` commands. This FAQ\nwill provide examples of common tasks that you can perform using the tool.\n\nThe `deadbeef` string will be used to provide a placeholder for an issue ID.\n\n#### How do I put a comment on an issue?\n\n```\n$ issue comment deadbeef 'A comment'\n```\n\nIf you do not supply the comment text directly on the command line, an `$EDITOR`\nwill be open for you, with a message reminding you what you wanted to do:\n\n```\n$ issue comment deadbeef\nA comment\n# Type a comment.\n# Lines beginning with '#' will be ignored.\n#\n# Issue deadbeefd2eece78dbf8f98e357ba0af65f7e180:\n#\n#  \u003e Dummy issue\n#  \u003e\n#  \u003e A dummy issue's description.\n#\n# vim:ft=gitcommit:\n#\n```\n\n#### How can I get a list of stored issues?\n\n```\n$ issue ls              # all issues\n$ issue ls --open       # only open issues\n$ issue ls --closed     # only closed issues\n```\n\nIssue also provides you with more sphisticated methods of listing issues.\n\n#### How do I filter the list of stored issues?\n\n```\n$ issue ls \"your\" \"filter\" \"terms\"\n```\n\nThe `--open` and `--closed` options also work:\n\n```\n$ issue ls -o \"memory\"  # List all open issues related to \"memory\".\n$ issue ls -c \"test\"    # List all closed issues related to testing.\n```\n\nYou can also filter by time.\n\n*List all open issues created during last two weeks, that contain the keyword\n\"deadlock\"*:\n\n```\n$ issue ls -o --since 2weeks \"deadlock\"\n```\n\n*List all issues closed today*:\n\n```\n$ issue ls -c --since 8hours\n```\n\n*List all open issues created in the previous week*:\n\n```\n$ issue ls -o --since 2weeks --until 1week\n```\n\n*List all issues with tag \"bug\" created more than 3 days ago*\n\n```\n$ issue ls --until 3days --tag bug\n```\n\n#### How do I put a tag on an issue?\n\n```\n$ issue tag 'bug' deadbeef\n```\n\nThis will put a tag `bug` on the issue `deadbeef`. The full example would be\nlike this:\n\n```\n$ issue show deadbeefd2eece78dbf8f98e357ba0af65f7e180\nissue deadbeefd2eece78dbf8f98e357ba0af65f7e180\nopened by:    John Doe (john.doe@example.com), on 1970-01-01 23:59:59.000000\n\n    Dummy issue\n$ issue tag bug deadbeef\nissue deadbeefd2eece78dbf8f98e357ba0af65f7e180\nopened by:    John Doe (john.doe@example.com), on 1970-01-01 23:59:59.000000\ntags:         bug\n\n    Dummy issue\n```\n\nA tag must be created before it can be assigned to issues. This prevents typos\nand frustration when looking for issues tagged with `docs` and not finding the\none accidentally tagged `doca`.\n\n#### How do I create a new tag?\n\n```\n$ issue tag new 'tagname'\n```\n\n#### How do I list all available tags?\n\n```\n$ issue tag ls\n```\n\n#### How do I display issue details?\n\n```\n$ issue show deadbeef\n```\n\n#### How do I link two issues together?\n\n```\n$ issue chain link deadbeef f1eece\n```\n\nThis command will \"chain\" the issue `f1eece` to `deadbeef`. This will be visible\nin the output of `issue show deadbeef`.\n\nAn issue cannot be closed until all issues that are chained to it are closed. In\nthe example above Issue will not allow closing `deadbeef` before `f1eece` is\nclosed.\n\n#### How do I get some statistics?\n\n```\n$ issue statistics\n```\n\nThis will give you an overview of the repository:\n\n- how many open and closed issues it has\n- the total, average, and median lifetime of open and closed issues\n- the total, average, and median lifetime of all issues without the division\n  into open and closed\n\n#### How do I track issue repository within a Git repository?\n\nIssue creates its repository inside a `.issue` directory. Since it is a hidden\nfile any reasonable `.gitignore` will opt out of tracking it. Here are the rules\nyou need to put inside your `.gitignore` file to enable tracking of the relevant\nbits of the issue repository:\n\n```\n!.issue\n.issue/*\n!.issue/objects\n.issue/objects/issues/*/*.json\n```\n\nPaste this rules after the `.*` rule and Git will track issue diffs and comments\nwithout tracking all the other files that can be crated locally (using less data\nwhen either cloning or pushing - \"yay!\" for efficiency).\n\nAfter that, you can just periodically use `git add .issue` and commit changed\nissues like any other file.\n\n#### How do I avoid typing all this?\n\nYeah, typing `issue statistics` can get old really quick. Lucky you, Issue\ncommands may be abbreviated (funny that the word meaning \"shortened\" is a long\none). So instead of typing `issue statistics` you can just type `issue st`. The\nshortest string that uniquely identifies a command will work.\n\nAs another example, instead of using `issue tag new foo` you can use\n`issue t n foo`.\n\n#### How do I create a branch name based on an issue?\n\n```\n$ issue slug deadbeef\nissue-deadbeef-dummy-issue\n```\n\nThen you can either create a command like this one:\n\n```\n$ git checkout -b $(issue sl deadbeef)\n```\n\n...or use the shortcuts built into Issue itself:\n\n```\n$ issue sl -BC deadbeef\n```\n\n#### How do I reming myself what I was doing?\n\n```\n$ issue log\n```\n\nThe log contains a list of events that happened inside you local repository.\nThis log is *not* exchanged between repositories as every developer has their\nown log (the fact that Alice checked the `deadbeef` issue does not mean that\nBob also did and would pollute his log).\n\n#### How do I get help?\n\n```\n$ issue help -vc | less -R\n```\n\nThis will give you a long, long wall of text that lists every option and command\nthat Issue provides. The `-v` (or `--verbose`) is there to enable recursive help\nscreen display, and `-c` enabled colours.\n\nAlternatively, you can get a help screen about just a single command:\n\n```\n$ issue help -c ls\n```\n\nor a even a single option:\n\n```\n$ issue help -c ls --open\n```\n\n--------------------------------------------------------------------------------\n\n### Arcane features: Issues distribution (HERE BE DRAGONS!)\n\n\u003e Note that using the built-in features for issue distribution is discouraged.\n\u003e They are slow, inefficient, and not really tested. It is much better to just\n\u003e track issue repository as a normal directory in your Git repository.\n\nIssue is designed as a distributed system, with a *pull* method for data distribution.\nA peer must explicitly pull the data and cannot push it.\nCurrently, Issue can use only SSH for issue distribution.\n\nRemote nodes are managed with `remote` command:\n\n- `issue remote set --url \u003cusername\u003e@\u003chostname\u003e:\u003cpath\u003e \u003cremote-name\u003e` - to set a remote,\n- `issue remote set --key \u003ckey-name\u003e --value \u003cdata\u003e \u003cremote-name\u003e` - to set additional info for a remote,\n- `issue remote ls [--verbose]` - to list available remote names (include `--verbose` to display SSH URLs in the report),\n- `issue remote rm \u003cremote-name\u003e` - to remove a remote,\n\nBefore peers can fetch data from a node, it must *pack* its repository to announce what is available from it.\nEach node should maintain an up-to-date pack of itself.\nPack is updated with `issue --pack` command.\n\nObtaining data from a node is simple:\n\n- `issue fetch --probe \u003cremote-name\u003e` - to probe a remote and display how much data it holds that is locally unavailable,\n- `issue fetch \u003cremote-name\u003e` - to fetch locally unavailable data,\n\nEvery node in the network operates as a peer to others, and there is no central one.\n\n--------------------------------------------------------------------------------\n\n## Configuration\n\nConfiguration file is located in `~/.issueconfig.json`.\nSee `sampleconfig.json` for a minimal configuration file.\n\n### Slug formats\n\n    {\n          \"slug.format.default\": \"@foo\"\n        , \"slug.format.foo\": \"foo-issue-{short_uid}-{slug}\"\n    }\n\nTo add format `foo` add a `slug.format.foo` key to your config.\nKeys available in the format string are:\n\n- `short_uid`: inserts short UID of the issue\n- `parent_short_uid`: inserts short UID of the parent issue\n- `slug`: inserts slug of the issue\n\n### Prevent branching from non-master branches\n\n    {\n        \"slug.allow_branching_from\": [ \"master\", \"devel\" ]\n    }\n\nUse the `slug.allow_branching_from` configuration value to set the branches from\nwhich creating new branches is allowed. Issue will complain if you try to create\na branch (using `issue sl -B`) from a branch not on this list.\n\n----\n\n## License\n\nIssue is published under the GNU GPL v3 license.\nMail me if you would like to use the software under a different license.\n\n--------------------------------------------------------------------------------\n\n## Dependencies\n\nIssue requires a recent version of Python 3 (any above 3.6 should be good).\n\nLibraries:\n\n- [`CLAP`](https://github.com/marekjm/clap): at least `0.15.0` (must be installed from Git)\n- `unidecode`: at least `1.0.23`\n- `colored`: at least `1.3.93` (optional; provides colorisation)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarekjm%2Fissue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarekjm%2Fissue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarekjm%2Fissue/lists"}