Skip to content

task-manager v0.11.0

Choose a tag to compare

@github-actions github-actions released this 09 Oct 15:05
· 18 commits to main since this release
070c416
  • taskmgr tree prints the open issues nested under their parents. Each
    line carries [ready] or [blocked by <ids>], read from the same views as
    taskmgr ready and taskmgr blocked. taskmgr tree <id> prints one issue
    and the open issues below it. --format mermaid prints the tree as Mermaid
    flowchart text, and --json prints nested objects with ready, blocked
    and children. No command showed the graph: to read an epic took one
    taskmgr show for each child.
  • taskmgr create --from <file> files a set of issues, all or nothing.
    The file is a YAML list of 1 to 256 entries, and - reads it from stdin.
    An entry takes ref, title, type, priority, assignee, labels,
    description, parent, blocked_by and related. An edge names the ref
    of another entry or the ID of an existing issue, in any order. A refused
    entry writes nothing and is named: entry 3 (ref "schema"): .... An unknown
    key, an empty list item and a second YAML document are errors.
  • taskmgr create --from <file> --json prints the map from each ref to
    the new ID.
    It is an array of {ref, id, store, hints, warnings} in file
    order. When a hook denies the set, the hook_denied object carries entry,
    the 1-based position in the file, and ref in place of issue_id. Beside
    --from, only --creator, --agent and --session are accepted.
  • A pre-create hook runs for each entry of a set before the first
    write.
    The payload can name a parent or a blocker of the same file that
    is not on disk yet. A hook that looks up such an ID gets issue not found,
    and a hook that denies on that denies the whole set.
  • taskmgr show takes several IDs. It prints one detail block for each
    ID, in argument order, with a blank line between two blocks. An ID that
    does not exist fails the whole command with issue not found: <id> and
    prints nothing on stdout. It took one ID.
  • Action required for a script that reads taskmgr show <id> --json: the
    command prints an array with one element for each ID, also for one ID. It
    printed a bare object. Read one issue as .[0]: .[0].title in place of
    .title.
  • taskmgr show --fields <name,...> prints only the named fields. A name
    is a top-level key of the --json output of show. JSON carries id and
    the named keys. Human output prints the header line and the lines of the
    named fields. --fields description prints the complete body, where human
    output cuts a body at 4096 bytes. store, creator and body_external
    have no human line and need --json.
  • taskmgr commands carries the shape of the --json output of each
    command.
    The key output gives type (object or array) and fields,
    each with its name, its type and optional: true when the field is
    omitted while empty. with_flag lists the shape under a flag that replaces
    it: create --from, import --batch and guide --list. The catalog listed
    flags only, so a caller without the spec guessed the key names.
  • taskmgr commands <name>... prints only the named entries. A subcommand
    is one quoted argument: taskmgr commands show "comment add". An unknown
    name is refused with the entries it is a part of, as
    unknown command "add": did you mean "comment add" or "dep add" .... The
    command took no arguments.
  • taskmgr list and taskmgr search answer a filter field given as a flag
    with the -q expression.
    taskmgr list --status open --type bug prints
    To filter by status and type: taskmgr list -q 'status == "open" && type == "bug"' under unknown flag: --status. The line is your own command, with
    every field flag folded into one -q. The command still fails, and no flag
    was added. It printed the error and the help block only.
  • Store.Watch signals a change to a store. It returns a channel that
    carries a value when the store changes, from this handle, another process
    or an edit by hand. A value means "read again" and carries nothing else.
    Changes within 100 ms give one signal, and a signal that is not received
    yet absorbs the next one. The channel closes when the context is done or
    the store directory is removed or renamed. A consumer had to poll. The SDK
    module now requires github.com/fsnotify/fsnotify.
  • Store.CreateBatch creates a set of issues that reference each other, all
    or nothing.
    A BatchEntry is a CreateInput with a Ref, and Parent,
    BlockedBy and Related accept the Ref of another entry. The engine
    validates every entry and runs every pre-create hook under one lock,
    before the first write. A refused entry returns a *BatchEntryError with
    the zero-based Index, Ref and Err. A set holds at most 256 entries.
  • Store.Graph returns every issue that is not closed with its ready and
    blocked marks, from one read.
    A GraphNode holds Issue, Ready,
    Blocked and BlockedBy. Store.Details returns the Detail of several
    IDs over one read. A caller of Ready and then Blocked made two reads,
    which can disagree when a write lands between them.
  • tasks.QueryFields() and tasks.QuoteQueryValue() are public. The
    first returns the comparison fields of the filter language, sorted. The
    second quotes a value as a string literal of that language, as
    Criteria.Build does.
  • Action required for a caller that passes a parent, blocked_by or
    related value that is not an issue ID:
    every write refuses it.
    taskmgr create --blocked-by ../at-0042ab says
    blocked_by: "../at-0042ab" is not a valid issue ID, and
    taskmgr update --parent says the same on parent. taskmgr dep add and
    taskmgr rel add say referenced issue "<value>" does not exist. The SDK
    returns a *ValidationError on the field of the edge. A value such as
    ../<open-id> was accepted when it named a file, and any other value got
    the does not exist message from every command. Pass the bare ID, and
    match the new message for a value that is not one.
  • Action required for a store that holds a blocker value that is not an
    issue ID:
    the issue is blocked. It was listed by taskmgr ready while its
    blocker was open. taskmgr blocked --json shows the value in blocked_by.
    Remove it with taskmgr dep rm <id> <value>.
  • Action required for a script that reads packages from
    taskmgr package repo rm --json:
    the key is still_used, and the output
    is {name, path, still_used}. It names the packages of the removed
    repository that the per-user config still uses, and is omitted when there
    are none. Read still_used in place of packages.
  • A write that makes a parent cycle is refused. taskmgr update <id> --parent <descendant> fails with
    parent: parent cycle: <id> -> <descendant> -> <id>. It was written, and
    the issues on the cycle had no root.
  • An issue with a dangling reference or a cycle already on disk can be
    edited.
    Only a write that changes parent, blocked_by or related is
    checked on that field, so the write that removes the bad edge is the
    repair. taskmgr update of such an issue was refused, also a title edit,
    with referenced issue "<id>" does not exist or dependency cycle: ....
  • A list no longer fails when another process closes or reopens an issue
    during the read.
    The issue is left out of that result. The read failed
    with the error of the file that moved.
  • taskmgr import --batch --json prints [] for an input with no
    records.
    It printed null.
  • taskmgr blocked --json prints "blocked_by_refs": [] for an issue whose
    only blocker does not exist.
    It printed null.